[Libreoffice-commits] core.git: Branch 'libreoffice-4-4' - include/oox oox/source
Markus Mohrhard
markus.mohrhard at collabora.co.uk
Tue Mar 17 06:20:39 PDT 2015
include/oox/core/xmlfilterbase.hxx | 3 ++
oox/source/core/xmlfilterbase.cxx | 41 +++++++++++++++++++++++++++++++++++--
2 files changed, 42 insertions(+), 2 deletions(-)
New commits:
commit 5c4cdeb021d6e4e80dc0833d9935320eda3e1261
Author: Markus Mohrhard <markus.mohrhard at collabora.co.uk>
Date: Tue Mar 10 00:34:07 2015 +0100
detect MSO 2007 OOXML documents
Change-Id: I4052c6f1e5dde71ce4cede1ec9a313f461861d71
Reviewed-on: https://gerrit.libreoffice.org/14877
Tested-by: David Tardon <dtardon at redhat.com>
Reviewed-by: David Tardon <dtardon at redhat.com>
diff --git a/include/oox/core/xmlfilterbase.hxx b/include/oox/core/xmlfilterbase.hxx
index a8c950e..8c97335 100644
--- a/include/oox/core/xmlfilterbase.hxx
+++ b/include/oox/core/xmlfilterbase.hxx
@@ -236,6 +236,8 @@ public:
FastParser* createParser() const;
+ bool isMSO2007Document() const;
+
protected:
virtual ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream >
implGetInputStream( utl::MediaDescriptor& rMediaDesc ) const SAL_OVERRIDE;
@@ -255,6 +257,7 @@ private:
::std::unique_ptr< XmlFilterBaseImpl > mxImpl;
sal_Int32 mnRelId;
sal_Int32 mnMaxDocId;
+ bool mbMSO2007;
};
typedef ::rtl::Reference< XmlFilterBase > XmlFilterRef;
diff --git a/oox/source/core/xmlfilterbase.cxx b/oox/source/core/xmlfilterbase.cxx
index 2eb85c7..24630b5 100644
--- a/oox/source/core/xmlfilterbase.cxx
+++ b/oox/source/core/xmlfilterbase.cxx
@@ -206,7 +206,8 @@ XmlFilterBase::XmlFilterBase( const Reference< XComponentContext >& rxContext )
FilterBase( rxContext ),
mxImpl( new XmlFilterBaseImpl( rxContext ) ),
mnRelId( 1 ),
- mnMaxDocId( 0 )
+ mnMaxDocId( 0 ),
+ mbMSO2007(false)
{
}
@@ -222,6 +223,35 @@ XmlFilterBase::~XmlFilterBase()
mxImpl->maFastParser.setDocumentHandler( 0 );
}
+namespace {
+
+bool is2007MSODocument(Reference<XDocumentProperties> xDocProps)
+{
+ if (!xDocProps->getGenerator().startsWithIgnoreAsciiCase("Microsoft"))
+ return false;
+
+ uno::Reference<beans::XPropertyAccess> xUserDefProps(xDocProps->getUserDefinedProperties(), uno::UNO_QUERY);
+ if (!xUserDefProps.is())
+ return false;
+
+ comphelper::SequenceAsHashMap aUserDefinedProperties(xUserDefProps->getPropertyValues());
+ comphelper::SequenceAsHashMap::iterator it = aUserDefinedProperties.find("AppVersion");
+ if (it == aUserDefinedProperties.end())
+ return false;
+
+ OUString aValue;
+ if (!(it->second >>= aValue))
+ return false;
+
+ if (!aValue.startsWithIgnoreAsciiCase("12."))
+ return false;
+
+ SAL_WARN("oox", "a MSO 2007 document");
+ return true;
+}
+
+}
+
void XmlFilterBase::importDocumentProperties()
{
Reference< XMultiServiceFactory > xFactory( getComponentContext()->getServiceManager(), UNO_QUERY );
@@ -238,7 +268,9 @@ void XmlFilterBase::importDocumentProperties()
xContext);
Reference< XOOXMLDocumentPropertiesImporter > xImporter( xTemp, UNO_QUERY );
Reference< XDocumentPropertiesSupplier > xPropSupplier( xModel, UNO_QUERY);
- xImporter->importProperties( xDocumentStorage, xPropSupplier->getDocumentProperties() );
+ Reference< XDocumentProperties > xDocProps = xPropSupplier->getDocumentProperties();
+ xImporter->importProperties( xDocumentStorage, xDocProps );
+ mbMSO2007 = is2007MSODocument(xDocProps);
}
FastParser* XmlFilterBase::createParser() const
@@ -883,6 +915,11 @@ StorageRef XmlFilterBase::implCreateStorage( const Reference< XStream >& rxOutSt
return StorageRef( new ZipStorage( getComponentContext(), rxOutStream ) );
}
+bool XmlFilterBase::isMSO2007Document() const
+{
+ return mbMSO2007;
+}
+
} // namespace core
} // namespace oox
More information about the Libreoffice-commits
mailing list