[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