Kaydet (Commit) 5bdfa8c1 authored tarafından Caolán McNamara's avatar Caolán McNamara

Resolves: fdo#62682 crash on second export of svg

because the first export has left "dangling" CalcFieldValueHdl Links in
Outliners that got created based on the Drawing Outliner while it had a
temporary CalcFieldValueHdl installed, and didn't get the old CalcFieldValueHdl
installed when the old Drawing Outliner one was re-installed.

Change-Id: I064a154ece488c9a4c3467b753451df7e73ae883
üst 0c1e9111
......@@ -602,7 +602,8 @@ bool SVGFilter::implExport( const Sequence< PropertyValue >& rDescriptor )
SdrOutliner& rOutl = mpSdrModel->GetDrawOutliner(NULL);
maOldFieldHdl = rOutl.GetCalcFieldValueHdl();
rOutl.SetCalcFieldValueHdl( LINK( this, SVGFilter, CalcFieldHdl) );
maNewFieldHdl = LINK(this, SVGFilter, CalcFieldHdl);
rOutl.SetCalcFieldValueHdl(maNewFieldHdl);
}
}
bRet = implExportDocument();
......@@ -615,7 +616,20 @@ bool SVGFilter::implExport( const Sequence< PropertyValue >& rDescriptor )
}
if( mpSdrModel )
mpSdrModel->GetDrawOutliner( NULL ).SetCalcFieldValueHdl( maOldFieldHdl );
{
//fdo#62682 The maNewFieldHdl can end up getting copied
//into various other outliners which live past this
//method, so get the full list of outliners and restore
//the maOldFieldHdl for all that have ended up using
//maNewFieldHdl
std::vector<SdrOutliner*> aOutliners(mpSdrModel->GetActiveOutliners());
for (auto aIter = aOutliners.begin(); aIter != aOutliners.end(); ++aIter)
{
SdrOutliner* pOutliner = *aIter;
if (maNewFieldHdl == pOutliner->GetCalcFieldValueHdl())
pOutliner->SetCalcFieldValueHdl(maOldFieldHdl);
}
}
delete mpSVGWriter, mpSVGWriter = NULL;
mpSVGExport = NULL; // pointed object is released by xSVGExport dtor at the end of this scope
......
......@@ -247,6 +247,7 @@ private:
XDrawPageSequence mMasterPageTargets;
Link maOldFieldHdl;
Link maNewFieldHdl;
bool implImport( const Sequence< PropertyValue >& rDescriptor ) throw (RuntimeException, std::exception);
......
......@@ -232,6 +232,8 @@ public:
sal_uIntPtr nSwapGraphicsMode;
SdrOutlinerCache* mpOutlinerCache;
//get a vector of all the SdrOutliner belonging to the model
std::vector<SdrOutliner*> GetActiveOutliners() const;
SdrModelImpl* mpImpl;
sal_uInt16 mnCharCompressType;
sal_uInt16 mnHandoutPageCount;
......
......@@ -21,6 +21,7 @@
#define INCLUDED_SVX_SOURCE_INC_SVDOUTLINERCACHE_HXX
#include <sal/types.h>
#include <vector>
class SdrModel;
class SdrOutliner;
......@@ -33,12 +34,18 @@ private:
SdrOutliner* mpModeOutline;
SdrOutliner* mpModeText;
std::vector<SdrOutliner*> maActiveOutliners;
public:
SdrOutlinerCache( SdrModel* pModel );
~SdrOutlinerCache();
SdrOutliner* createOutliner( sal_uInt16 nOutlinerMode );
void disposeOutliner( SdrOutliner* pOutliner );
std::vector<SdrOutliner*> GetActiveOutliners() const
{
return maActiveOutliners;
}
};
#endif
......
......@@ -1918,6 +1918,17 @@ SdrOutliner* SdrModel::createOutliner( sal_uInt16 nOutlinerMode )
return mpOutlinerCache->createOutliner( nOutlinerMode );
}
std::vector<SdrOutliner*> SdrModel::GetActiveOutliners() const
{
std::vector<SdrOutliner*> aRet(mpOutlinerCache ?
mpOutlinerCache->GetActiveOutliners() : std::vector<SdrOutliner*>());
aRet.push_back(pDrawOutliner);
aRet.push_back(pHitTestOutliner);
return aRet;
}
void SdrModel::disposeOutliner( SdrOutliner* pOutliner )
{
if( mpOutlinerCache )
......
......@@ -48,6 +48,7 @@ SdrOutliner* SdrOutlinerCache::createOutliner( sal_uInt16 nOutlinerMode )
pOutliner = SdrMakeOutliner( nOutlinerMode, mpModel );
Outliner& aDrawOutliner = mpModel->GetDrawOutliner();
pOutliner->SetCalcFieldValueHdl( aDrawOutliner.GetCalcFieldValueHdl() );
maActiveOutliners.push_back(pOutliner);
}
return pOutliner;
......@@ -94,6 +95,7 @@ void SdrOutlinerCache::disposeOutliner( SdrOutliner* pOutliner )
}
else
{
maActiveOutliners.erase(std::remove(maActiveOutliners.begin(), maActiveOutliners.end(), pOutliner), maActiveOutliners.end());
delete pOutliner;
}
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment