[Libreoffice-commits] core.git: Branch 'distro/collabora/cp-4.2' - 3 commits - include/oox oox/source sc/source

Markus Mohrhard markus.mohrhard at collabora.co.uk
Fri Mar 13 01:18:36 PDT 2015


 include/oox/core/xmlfilterbase.hxx                |    3 +
 include/oox/drawingml/chart/chartspacemodel.hxx   |    2 -
 oox/source/core/xmlfilterbase.cxx                 |   42 ++++++++++++++++++++--
 oox/source/drawingml/chart/chartspacefragment.cxx |    7 +++
 oox/source/drawingml/chart/chartspacemodel.cxx    |    4 +-
 oox/source/drawingml/shape.cxx                    |    3 +
 sc/source/filter/oox/excelfilter.cxx              |   23 ++++++++----
 7 files changed, 70 insertions(+), 14 deletions(-)

New commits:
commit e4c6dcef807d24be29975d8fa1ad0ca435e914c5
Author: Markus Mohrhard <markus.mohrhard at collabora.co.uk>
Date:   Mon Feb 23 02:19:32 2015 +0100

    import the document properties before the document
    
    That allows us to potentially change the import depending on the
    producer of the document.
    
    This becomes necessary to handle MSO 2007 chart drawingml streams
    correctly.
    
    (cherry picked from commit a2fa9e2468aa5c4fd4b610c5d0ebc8959e87a072)
    
    Conflicts:
    	sc/source/filter/oox/excelfilter.cxx
    
    Change-Id: I9be8b019fae69cd206203591982a89648965692f

diff --git a/sc/source/filter/oox/excelfilter.cxx b/sc/source/filter/oox/excelfilter.cxx
index 6c2d6bd..8495767 100644
--- a/sc/source/filter/oox/excelfilter.cxx
+++ b/sc/source/filter/oox/excelfilter.cxx
@@ -105,11 +105,7 @@ bool ExcelFilter::importDocument() throw()
     if( aWorkbookPath.isEmpty() )
         return false;
 
-    /*  Construct the WorkbookGlobals object referred to by every instance of
-        the class WorkbookHelper, and execute the import filter by constructing
-        an instance of WorkbookFragment and loading the file. */
-    WorkbookGlobalsRef xBookGlob = WorkbookHelper::constructGlobals( *this );
-    if ( xBookGlob.get() && importFragment( new WorkbookFragment( *xBookGlob, aWorkbookPath ) ) )
+    try
     {
         try
         {
@@ -119,8 +115,23 @@ bool ExcelFilter::importDocument() throw()
         {
             SAL_WARN("sc", "exception when importing document properties " << e.Message);
         }
-        return true;
+        catch( ... )
+        {
+            SAL_WARN("sc", "exception when importing document properties");
+        }
+        /*  Construct the WorkbookGlobals object referred to by every instance of
+            the class WorkbookHelper, and execute the import filter by constructing
+            an instance of WorkbookFragment and loading the file. */
+        WorkbookGlobalsRef xBookGlob(WorkbookHelper::constructGlobals(*this));
+        if (xBookGlob.get() && importFragment(new WorkbookFragment(*xBookGlob, aWorkbookPath)))
+        {
+            return true;
+        }
+    }
+    catch (...)
+    {
     }
+
     return false;
 }
 
commit 648d3022bd77e66fdf3fe42132b6dc207c5a2804
Author: Markus Mohrhard <markus.mohrhard at collabora.co.uk>
Date:   Tue Mar 10 00:34:07 2015 +0100

    detect MSO 2007 OOXML documents
    
    (cherry picked from commit 15174177091367332b57cd79575e2f7dd27388b2)
    
    Conflicts:
    	oox/source/core/xmlfilterbase.cxx
    
    Change-Id: I4052c6f1e5dde71ce4cede1ec9a313f461861d71

diff --git a/include/oox/core/xmlfilterbase.hxx b/include/oox/core/xmlfilterbase.hxx
index 351910d..da0a400 100644
--- a/include/oox/core/xmlfilterbase.hxx
+++ b/include/oox/core/xmlfilterbase.hxx
@@ -237,6 +237,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;
@@ -256,6 +258,7 @@ private:
     ::std::auto_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 1608aed..70d01d5 100644
--- a/oox/source/core/xmlfilterbase.cxx
+++ b/oox/source/core/xmlfilterbase.cxx
@@ -20,6 +20,7 @@
 #include "oox/core/xmlfilterbase.hxx"
 
 #include <cstdio>
+#include <com/sun/star/beans/XPropertyAccess.hpp>
 #include <com/sun/star/container/XNameContainer.hpp>
 #include <com/sun/star/embed/XRelationshipAccess.hpp>
 #include <com/sun/star/xml/sax/InputSource.hpp>
@@ -188,7 +189,8 @@ XmlFilterBase::XmlFilterBase( const Reference< XComponentContext >& rxContext )
     FilterBase( rxContext ),
     mxImpl( new XmlFilterBaseImpl( rxContext ) ),
     mnRelId( 1 ),
-    mnMaxDocId( 0 )
+    mnMaxDocId( 0 ),
+    mbMSO2007(false)
 {
 }
 
@@ -204,6 +206,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()
@@ -222,7 +253,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
@@ -779,7 +812,10 @@ StorageRef XmlFilterBase::implCreateStorage( const Reference< XStream >& rxOutSt
     return StorageRef( new ZipStorage( getComponentContext(), rxOutStream ) );
 }
 
-// ============================================================================
+bool XmlFilterBase::isMSO2007Document() const
+{
+    return mbMSO2007;
+}
 
 } // namespace core
 } // namespace oox
commit ca698a076f017a73c8c6f27f57139b3e350f0f6b
Author: Markus Mohrhard <markus.mohrhard at collabora.co.uk>
Date:   Thu Mar 12 15:19:37 2015 +0100

    handle MSO 2007 vs OOXML in auto title chart import
    
    Change-Id: Ie143751d22404dac8f31c8ecef90a0e185e07973

diff --git a/include/oox/drawingml/chart/chartspacemodel.hxx b/include/oox/drawingml/chart/chartspacemodel.hxx
index f1a27d8..c2e3cab 100644
--- a/include/oox/drawingml/chart/chartspacemodel.hxx
+++ b/include/oox/drawingml/chart/chartspacemodel.hxx
@@ -57,7 +57,7 @@ struct ChartSpaceModel
     bool                mbShowLabelsOverMax;/// True = show labels over chart maximum.
     bool                mbPivotChart;       /// True = pivot chart.
 
-    explicit            ChartSpaceModel();
+    explicit            ChartSpaceModel(bool bMSO2007Doc);
                         ~ChartSpaceModel();
 };
 
diff --git a/oox/source/drawingml/chart/chartspacefragment.cxx b/oox/source/drawingml/chart/chartspacefragment.cxx
index 9917588..8df7f3b 100644
--- a/oox/source/drawingml/chart/chartspacefragment.cxx
+++ b/oox/source/drawingml/chart/chartspacefragment.cxx
@@ -81,8 +81,13 @@ ContextHandlerRef ChartSpaceFragment::onCreateContext( sal_Int32 nElement, const
             switch( nElement )
             {
                 case C_TOKEN( autoTitleDeleted ):
-                    mrModel.mbAutoTitleDel = rAttribs.getBool( XML_val, true ); // TODO: OOXML_spec
+                {
+                    bool bMSO2007Document = getFilter().isMSO2007Document();
+
+                    // default value is false for MSO 2007 and true in OOXML
+                    mrModel.mbAutoTitleDel = rAttribs.getBool( XML_val, !bMSO2007Document );
                     return 0;
+                }
                 case C_TOKEN( backWall ):
                     return new WallFloorContext( *this, mrModel.mxBackWall.create() );
                 case C_TOKEN( dispBlanksAs ):
diff --git a/oox/source/drawingml/chart/chartspacemodel.cxx b/oox/source/drawingml/chart/chartspacemodel.cxx
index d36a2f2..da86a4b 100644
--- a/oox/source/drawingml/chart/chartspacemodel.cxx
+++ b/oox/source/drawingml/chart/chartspacemodel.cxx
@@ -25,10 +25,10 @@ namespace chart {
 
 // ============================================================================
 
-ChartSpaceModel::ChartSpaceModel() :
+ChartSpaceModel::ChartSpaceModel(bool bMSO2007Doc) :
     mnDispBlanksAs( XML_gap ),  // not zero as specified, TODO: OOXML_spec
     mnStyle( 2 ),
-    mbAutoTitleDel( false ),
+    mbAutoTitleDel( !bMSO2007Doc ), // difference between OOXML spec and MSO 2007
     mbPlotVisOnly( false ),
     mbShowLabelsOverMax( false ),
     mbPivotChart( false )
diff --git a/oox/source/drawingml/shape.cxx b/oox/source/drawingml/shape.cxx
index 8710435..e3f324e 100644
--- a/oox/source/drawingml/shape.cxx
+++ b/oox/source/drawingml/shape.cxx
@@ -869,7 +869,8 @@ void Shape::finalizeXShape( XmlFilterBase& rFilter, const Reference< XShapes >&
                 Reference< chart2::XChartDocument > xChartDoc( xDocModel, UNO_QUERY_THROW );
 
                 // load the chart data from the XML fragment
-                chart::ChartSpaceModel aModel;
+                bool bMSO2007Doc = rFilter.isMSO2007Document();
+                chart::ChartSpaceModel aModel(bMSO2007Doc);
                 chart::ChartSpaceFragment *pChartSpaceFragment = new chart::ChartSpaceFragment(
                         rFilter, mxChartShapeInfo->maFragmentPath, aModel );
                 const OUString aThemeOverrideFragmentPath( pChartSpaceFragment->


More information about the Libreoffice-commits mailing list