diff options
-rw-r--r-- | sd/source/ui/unoidl/unopage.cxx | 27 | ||||
-rw-r--r-- | xmloff/source/draw/ximpbody.cxx | 24 |
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, |