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 <[email protected]> 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 <[email protected]> Reviewed-by: David Tardon <[email protected]> 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 _______________________________________________ Libreoffice-commits mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
