sd/source/ui/unoidl/unopage.cxx |   27 +++++++++++++++++++++++++++
 xmloff/source/draw/ximpbody.cxx |   24 ++++++++++++++++++++++++
 2 files changed, 51 insertions(+)

New commits:
commit e67a834c5d1a14889ab97b79df5b579934f27c30
Author: Armin Le Grand <[email protected]>
Date:   Wed Nov 18 15:37:26 2015 +0100

    Resolves: tdf#93994 flush API objects at load time
    
    When importing SdrObjCustomShape for each an Outliner and a
    VirtualDevice as RefDevice are created and held. On 32bit systems this
    breaks the import with many such objects (in the bugdoc around 4300). On
    64bit it works, but more memory as necessary is used. To avoid this,
    flush the UNO API implementations at these objects after one page is
    imported.  Do not do this for each single object, that will break the
    connector import which does some processing later.
    
    Change-Id: I7296edd40f01c1a40258808d78bf39e6d4fe29bf
    Reviewed-on: https://gerrit.libreoffice.org/19990
    Reviewed-by: Thorsten Behrens <[email protected]>
    Tested-by: Thorsten Behrens <[email protected]>

diff --git a/sd/source/ui/unoidl/unopage.cxx b/sd/source/ui/unoidl/unopage.cxx
index 98a9aa3..8dbb921 100644
--- a/sd/source/ui/unoidl/unopage.cxx
+++ b/sd/source/ui/unoidl/unopage.cxx
@@ -73,6 +73,7 @@
 #include "unohelp.hxx"
 #include <vcl/dibtools.hxx>
 #include <svx/svdograf.hxx>
+#include <svx/svdoashp.hxx>
 
 using ::com::sun::star::animations::XAnimationNode;
 using ::com::sun::star::animations::XAnimationNodeSupplier;
@@ -605,6 +606,32 @@ void SAL_CALL SdGenericDrawPage::setPropertyValue( const 
OUString& aPropertyName
 
     throwIfDisposed();
 
+    // tdf#93994 Use a custom slot to have filter code flush the UNO
+    // API implementations of SdrObjCustomShape. Used e.g. by
+    // SdXMLDrawPageContext::EndElement(), see there for more
+    // information
+    if(SvxFmDrawPage::mpPage)
+    {
+        const OUString 
sFlushCustomShapeUnoApiObjects("FlushCustomShapeUnoApiObjects");
+
+        if(sFlushCustomShapeUnoApiObjects == aPropertyName)
+        {
+            SdrObjListIter aIter(static_cast< SdPage& 
>(*SvxFmDrawPage::mpPage), IM_DEEPWITHGROUPS);
+
+            while(aIter.IsMore())
+            {
+                SdrObjCustomShape* pCustomShape = dynamic_cast< 
SdrObjCustomShape* >(aIter.Next());
+
+                if(pCustomShape)
+                {
+                    pCustomShape->setUnoShape(nullptr);
+                }
+            }
+
+            return;
+        }
+    }
+
     const SfxItemPropertySimpleEntry* pEntry = 
mpPropSet->getPropertyMapEntry(aPropertyName);
 
     switch( pEntry ? pEntry->nWID : -1 )
diff --git a/xmloff/source/draw/ximpbody.cxx b/xmloff/source/draw/ximpbody.cxx
index 97814fc..c574d4e 100644
--- a/xmloff/source/draw/ximpbody.cxx
+++ b/xmloff/source/draw/ximpbody.cxx
@@ -37,6 +37,7 @@
 #include "PropertySetMerger.hxx"
 #include "animationimport.hxx"
 #include <tools/debug.hxx>
+#include <osl/diagnose.hxx>
 
 using namespace ::com::sun::star;
 
@@ -277,6 +278,29 @@ void SdXMLDrawPageContext::EndElement()
         if(xNodeSupplier.is())
             xmloff::AnimationNodeContext::postProcessRootNode( GetSdImport(), 
xNodeSupplier->getAnimationNode(), xPageProps );
     }
+
+    // tdf#93994 call a custom slot to be able to reset the UNO API
+    // implementations held on the SdrObjects of type
+    // SdrObjCustomShape - those tend to linger until the entire file
+    // is loaded. For large files with a lot of these 32bit systems
+    // may crash due to being out of ressources after ca. 4200
+    // Outliners and VirtualDevices used there as RefDevice
+    try
+    {
+        uno::Reference< beans::XPropertySet > 
xPropSet(GetLocalShapesContext(), uno::UNO_QUERY);
+
+        if(xPropSet.is())
+        {
+            const OUString 
sFlushCustomShapeUnoApiObjects("FlushCustomShapeUnoApiObjects");
+            uno::Any aAny;
+            aAny <<= sal_True;
+            xPropSet->setPropertyValue(sFlushCustomShapeUnoApiObjects, aAny);
+        }
+    }
+    catch(const uno::Exception&)
+    {
+        OSL_FAIL("could not flush after load");
+    }
 }
 
 SdXMLBodyContext::SdXMLBodyContext( SdXMLImport& rImport,
_______________________________________________
Libreoffice-commits mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to