summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sd/source/ui/unoidl/unopage.cxx27
-rw-r--r--xmloff/source/draw/ximpbody.cxx24
2 files changed, 51 insertions, 0 deletions
diff --git a/sd/source/ui/unoidl/unopage.cxx b/sd/source/ui/unoidl/unopage.cxx
index 98a9aa34257a..8dbb921d1549 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 97814fc16a64..c574d4ef4101 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,