diff options
author | Armin Le Grand <alg@apache.org> | 2012-06-29 08:28:49 +0000 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2013-04-11 09:31:24 +0100 |
commit | 30704655570ea2b4c6943e18de02497284b2174c (patch) | |
tree | dbfdb7deb6646a2d16b6f174cc23d9a36fc9e187 | |
parent | 752d005d85cd269fddf061f5175b3fbab5354e12 (diff) |
Related: #i120077# Added local var for SfxItemPool for EditEngine
to avoid a memory leak.
Found by: Chao Huang
Patch by: Chao Huang, alg
Review by: Chao Huang, alg
(cherry picked from commit e7168710bfd30b5d682d21d81c116cd33cf22505)
Conflicts:
sc/source/filter/xml/xmlfonte.cxx
Change-Id: I75475bb59b3a7040938826d095dcd81e19d61b46
-rw-r--r-- | sc/source/filter/xml/xmlfonte.cxx | 85 |
1 files changed, 53 insertions, 32 deletions
diff --git a/sc/source/filter/xml/xmlfonte.cxx b/sc/source/filter/xml/xmlfonte.cxx index 9b0c263c7c3f..50296ba99bd8 100644 --- a/sc/source/filter/xml/xmlfonte.cxx +++ b/sc/source/filter/xml/xmlfonte.cxx @@ -32,11 +32,15 @@ class ScXMLFontAutoStylePool_Impl: public XMLFontAutoStylePool { +private: + // #i120077# remember owned pool + SfxItemPool* mpEditEnginePool; + void AddFontItems(sal_uInt16* pWhichIds, sal_uInt8 nIdCount, const SfxItemPool* pItemPool, const sal_Bool bExportDefaults); - public: +public: ScXMLFontAutoStylePool_Impl( ScXMLExport& rExport, bool bBlockFontEmbedding ); - + virtual ~ScXMLFontAutoStylePool_Impl(); }; void ScXMLFontAutoStylePool_Impl::AddFontItems(sal_uInt16* pWhichIds, sal_uInt8 nIdCount, const SfxItemPool* pItemPool, const sal_Bool bExportDefaults) @@ -66,9 +70,9 @@ void ScXMLFontAutoStylePool_Impl::AddFontItems(sal_uInt16* pWhichIds, sal_uInt8 } } -ScXMLFontAutoStylePool_Impl::ScXMLFontAutoStylePool_Impl( - ScXMLExport& rExportP, bool bBlockFontEmbedding ) : - XMLFontAutoStylePool( rExportP, bBlockFontEmbedding ) +ScXMLFontAutoStylePool_Impl::ScXMLFontAutoStylePool_Impl(ScXMLExport& rExportP, bool bBlockFontEmbedding) + : XMLFontAutoStylePool(rExportP, bBlockFontEmbedding) + , mpEditEnginePool(NULL) { sal_uInt16 aWhichIds[3] = { ATTR_FONT, ATTR_CJK_FONT, ATTR_CTL_FONT }; @@ -92,46 +96,63 @@ ScXMLFontAutoStylePool_Impl::ScXMLFontAutoStylePool_Impl( if(pItr) { SfxStyleSheetBase* pStyle(pItr->First()); - SfxItemPool* pPageEditPool(EditEngine::CreatePool()); - EditEngine aEditEngine(pPageEditPool); - while (pStyle) + + if(pStyle) { - const SfxItemPool& rPagePool(pStyle->GetPool().GetPool()); - for (sal_uInt8 j = 0; j < 4; ++j) + // #i120077# remember the SfxItemPool in member variable before usage. The + // local EditEngine will not take over ownership of the pool. + mpEditEnginePool = EditEngine::CreatePool(); + EditEngine aEditEngine(mpEditEnginePool); + + while (pStyle) { - sal_uInt16 nPageWhichId(aPageWhichIds[j]); - sal_uInt32 nPageHFItems(rPagePool.GetItemCount2(nPageWhichId)); - const ScPageHFItem* pPageItem; - for (sal_uInt32 k = 0; k < nPageHFItems; ++k) + const SfxItemPool& rPagePool(pStyle->GetPool().GetPool()); + + for (sal_uInt8 j = 0; j < 4; ++j) { - if (0 != (pPageItem = static_cast<const ScPageHFItem*>(rPagePool.GetItem2(nPageWhichId, k)))) + sal_uInt16 nPageWhichId(aPageWhichIds[j]); + sal_uInt32 nPageHFItems(rPagePool.GetItemCount2(nPageWhichId)); + const ScPageHFItem* pPageItem; + for (sal_uInt32 k = 0; k < nPageHFItems; ++k) { - const EditTextObject* pLeftArea(pPageItem->GetLeftArea()); - if (pLeftArea) - { - aEditEngine.SetText(*pLeftArea); - AddFontItems(aEditWhichIds, 3, pPageEditPool, false); - } - const EditTextObject* pCenterArea(pPageItem->GetCenterArea()); - if (pCenterArea) + if (0 != (pPageItem = static_cast<const ScPageHFItem*>(rPagePool.GetItem2(nPageWhichId, k)))) { - aEditEngine.SetText(*pCenterArea); - AddFontItems(aEditWhichIds, 3, pPageEditPool, false); - } - const EditTextObject* pRightArea(pPageItem->GetRightArea()); - if (pRightArea) - { - aEditEngine.SetText(*pRightArea); - AddFontItems(aEditWhichIds, 3, pPageEditPool, false); + const EditTextObject* pLeftArea(pPageItem->GetLeftArea()); + if (pLeftArea) + { + aEditEngine.SetText(*pLeftArea); + AddFontItems(aEditWhichIds, 3, mpEditEnginePool, false); + } + const EditTextObject* pCenterArea(pPageItem->GetCenterArea()); + if (pCenterArea) + { + aEditEngine.SetText(*pCenterArea); + AddFontItems(aEditWhichIds, 3, mpEditEnginePool, false); + } + const EditTextObject* pRightArea(pPageItem->GetRightArea()); + if (pRightArea) + { + aEditEngine.SetText(*pRightArea); + AddFontItems(aEditWhichIds, 3, mpEditEnginePool, false); + } } } } + + pStyle = pItr->Next(); } - pStyle = pItr->Next(); } } } +ScXMLFontAutoStylePool_Impl::~ScXMLFontAutoStylePool_Impl() +{ + if(mpEditEnginePool) + { + // memory leak #i120077# + SfxItemPool::Free(mpEditEnginePool); + } +} XMLFontAutoStylePool* ScXMLExport::CreateFontAutoStylePool() { |