sc/inc/textuno.hxx | 23 +++++------ sc/source/core/data/attrib.cxx | 9 +++- sc/source/filter/xml/XMLTableHeaderFooterContext.cxx | 2 - sc/source/filter/xml/XMLTableMasterPageExport.cxx | 13 ------ sc/source/ui/unoobj/fielduno.cxx | 12 ++++-- sc/source/ui/unoobj/textuno.cxx | 38 ++++++++++--------- 6 files changed, 44 insertions(+), 53 deletions(-)
New commits: commit fc29ace3438eea09afe3ddbb5118458cbb531b06 Author: Markus Mohrhard <markus.mohrh...@googlemail.com> Date: Wed May 18 02:47:01 2016 +0200 better fix for memory leak around calc header-footer UNO objects Change-Id: I396a2c57b38623d82fe973ad8d53f08b1b480e2e Reviewed-on: https://gerrit.libreoffice.org/25116 Tested-by: Jenkins <c...@libreoffice.org> Reviewed-by: Markus Mohrhard <markus.mohrh...@googlemail.com> diff --git a/sc/inc/textuno.hxx b/sc/inc/textuno.hxx index 861a178..8182e54 100644 --- a/sc/inc/textuno.hxx +++ b/sc/inc/textuno.hxx @@ -29,6 +29,7 @@ #include <com/sun/star/lang/XServiceInfo.hpp> #include <com/sun/star/lang/XUnoTunnel.hpp> #include <cppuhelper/implbase.hxx> +#include <cppuhelper/weakref.hxx> #include <rtl/ref.hxx> #include "scdllapi.h" @@ -65,11 +66,7 @@ private: rtl::Reference<ScHeaderFooterTextObj> mxRightText; public: - ScHeaderFooterContentObj( const EditTextObject* pLeft, - const EditTextObject* pCenter, - const EditTextObject* pRight ); - - ScHeaderFooterContentObj() = delete; + ScHeaderFooterContentObj(); virtual ~ScHeaderFooterContentObj(); // for ScPageHFItem (using getImplementation) @@ -77,6 +74,10 @@ public: const EditTextObject* GetCenterEditObject() const; const EditTextObject* GetRightEditObject() const; + void Init( const EditTextObject* pLeft, + const EditTextObject* pCenter, + const EditTextObject* pRight); + // XHeaderFooterContent virtual css::uno::Reference< css::text::XText > SAL_CALL getLeftText() throw(css::uno::RuntimeException, std::exception) override; @@ -101,7 +102,6 @@ public: virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() throw(css::uno::RuntimeException, std::exception) override; - virtual void dispose(); }; // ScHeaderFooterTextData: shared data between sub objects of a ScHeaderFooterTextObj @@ -110,7 +110,7 @@ class ScHeaderFooterTextData { private: std::unique_ptr<EditTextObject> mpTextObj; - rtl::Reference<ScHeaderFooterContentObj> rContentObj; + css::uno::WeakReference<css::sheet::XHeaderFooterContent> xContentObj; ScHeaderFooterPart nPart; ScEditEngineDefaulter* pEditEngine; SvxEditEngineForwarder* pForwarder; @@ -120,7 +120,7 @@ public: ScHeaderFooterTextData(const ScHeaderFooterTextData&) = delete; const ScHeaderFooterTextData& operator=(const ScHeaderFooterTextData&) = delete; ScHeaderFooterTextData( - rtl::Reference<ScHeaderFooterContentObj> const & rContent, ScHeaderFooterPart nP, const EditTextObject* pTextObj); + css::uno::WeakReference<css::sheet::XHeaderFooterContent> xContent, ScHeaderFooterPart nP, const EditTextObject* pTextObj); ~ScHeaderFooterTextData(); // helper functions @@ -130,11 +130,9 @@ public: ScEditEngineDefaulter* GetEditEngine() { GetTextForwarder(); return pEditEngine; } ScHeaderFooterPart GetPart() const { return nPart; } - const rtl::Reference<ScHeaderFooterContentObj>& GetContentObj() const { return rContentObj; } + const css::uno::Reference<css::sheet::XHeaderFooterContent> GetContentObj() const { return xContentObj; } const EditTextObject* GetTextObject() const { return mpTextObj.get(); } - - void dispose() { rContentObj.clear(); } }; /** @@ -158,7 +156,7 @@ private: public: ScHeaderFooterTextObj( - rtl::Reference<ScHeaderFooterContentObj> const & rContent, ScHeaderFooterPart nP, const EditTextObject* pTextObj); + css::uno::WeakReference<css::sheet::XHeaderFooterContent> xContent, ScHeaderFooterPart nP, const EditTextObject* pTextObj); virtual ~ScHeaderFooterTextObj(); const EditTextObject* GetTextObject() const; @@ -229,7 +227,6 @@ public: virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() throw(css::uno::RuntimeException, std::exception) override; - virtual void dispose() { aTextData.dispose(); } }; // derived cursor objects for getImplementation and getText/getStart/getEnd diff --git a/sc/source/core/data/attrib.cxx b/sc/source/core/data/attrib.cxx index abf9c29..02afdd1 100644 --- a/sc/source/core/data/attrib.cxx +++ b/sc/source/core/data/attrib.cxx @@ -561,10 +561,13 @@ ScPageHFItem::~ScPageHFItem() bool ScPageHFItem::QueryValue( uno::Any& rVal, sal_uInt8 /* nMemberId */ ) const { - uno::Reference<sheet::XHeaderFooterContent> xContent = - new ScHeaderFooterContentObj( pLeftArea, pCenterArea, pRightArea ); + rtl::Reference<ScHeaderFooterContentObj> xContent = + new ScHeaderFooterContentObj(); + xContent->Init(pLeftArea, pCenterArea, pRightArea); - rVal <<= xContent; + uno::Reference<sheet::XHeaderFooterContent> xCont(xContent.get()); + + rVal <<= xCont; return true; } diff --git a/sc/source/filter/xml/XMLTableHeaderFooterContext.cxx b/sc/source/filter/xml/XMLTableHeaderFooterContext.cxx index e6aea5b..2c97450 100644 --- a/sc/source/filter/xml/XMLTableHeaderFooterContext.cxx +++ b/sc/source/filter/xml/XMLTableHeaderFooterContext.cxx @@ -100,8 +100,6 @@ XMLTableHeaderFooterContext::XMLTableHeaderFooterContext( SvXMLImport& rImport, XMLTableHeaderFooterContext::~XMLTableHeaderFooterContext() { - rtl::Reference<ScHeaderFooterContentObj> pImp = ScHeaderFooterContentObj::getImplementation( xHeaderFooterContent ); - pImp->dispose(); } SvXMLImportContext *XMLTableHeaderFooterContext::CreateChildContext( diff --git a/sc/source/filter/xml/XMLTableMasterPageExport.cxx b/sc/source/filter/xml/XMLTableMasterPageExport.cxx index 821bcf5..12c8c15 100644 --- a/sc/source/filter/xml/XMLTableMasterPageExport.cxx +++ b/sc/source/filter/xml/XMLTableMasterPageExport.cxx @@ -107,14 +107,6 @@ void XMLTableMasterPageExport::exportHeaderFooter(const css::uno::Reference < cs } } -void lcl_DisposeXHeaderFooterContent( const Reference < sheet::XHeaderFooterContent >& xHFContent ) -{ - if( !xHFContent.is() ) - return; - rtl::Reference<ScHeaderFooterContentObj> pImp = ScHeaderFooterContentObj::getImplementation( xHFContent ); - pImp->dispose(); -} - void XMLTableMasterPageExport::exportMasterPageContent( const Reference < XPropertySet > & rPropSet, bool bAutoStyles ) @@ -172,11 +164,6 @@ void XMLTableMasterPageExport::exportMasterPageContent( exportHeaderFooter( xFooterLeft, XML_FOOTER_LEFT, bLeftFooter ); } - - lcl_DisposeXHeaderFooterContent( xHeader ); - lcl_DisposeXHeaderFooterContent( xHeaderLeft ); - lcl_DisposeXHeaderFooterContent( xFooter ); - lcl_DisposeXHeaderFooterContent( xFooterLeft ); } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/source/ui/unoobj/fielduno.cxx b/sc/source/ui/unoobj/fielduno.cxx index 74e351c..c71ac79 100644 --- a/sc/source/ui/unoobj/fielduno.cxx +++ b/sc/source/ui/unoobj/fielduno.cxx @@ -479,19 +479,23 @@ uno::Reference<text::XTextField> ScHeaderFieldsObj::GetObjectByIndex_Impl(sal_In // Get the parent text range instance. uno::Reference<text::XTextRange> xTextRange; - rtl::Reference<ScHeaderFooterContentObj> rContentObj = mrData.GetContentObj(); + uno::Reference<sheet::XHeaderFooterContent> xContentObj = mrData.GetContentObj(); + if (!xContentObj.is()) + throw uno::RuntimeException(""); + + rtl::Reference<ScHeaderFooterContentObj> pContentObj = ScHeaderFooterContentObj::getImplementation(xContentObj); uno::Reference<text::XText> xText; switch ( mrData.GetPart() ) { case ScHeaderFooterPart::LEFT: - xText = rContentObj->getLeftText(); + xText = pContentObj->getLeftText(); break; case ScHeaderFooterPart::CENTER: - xText = rContentObj->getCenterText(); + xText = pContentObj->getCenterText(); break; case ScHeaderFooterPart::RIGHT: - xText = rContentObj->getRightText(); + xText = pContentObj->getRightText(); break; } diff --git a/sc/source/ui/unoobj/textuno.cxx b/sc/source/ui/unoobj/textuno.cxx index d5c73d9..f52b030 100644 --- a/sc/source/ui/unoobj/textuno.cxx +++ b/sc/source/ui/unoobj/textuno.cxx @@ -92,12 +92,7 @@ static const SvxItemPropertySet * lcl_GetHdFtPropertySet() SC_SIMPLE_SERVICE_INFO( ScHeaderFooterContentObj, "ScHeaderFooterContentObj", "com.sun.star.sheet.HeaderFooterContent" ) SC_SIMPLE_SERVICE_INFO( ScHeaderFooterTextObj, "ScHeaderFooterTextObj", "stardiv.one.Text.Text" ) -ScHeaderFooterContentObj::ScHeaderFooterContentObj( const EditTextObject* pLeft, - const EditTextObject* pCenter, - const EditTextObject* pRight ) : - mxLeftText(new ScHeaderFooterTextObj(this, ScHeaderFooterPart::LEFT, pLeft)), - mxCenterText(new ScHeaderFooterTextObj(this, ScHeaderFooterPart::CENTER, pCenter)), - mxRightText(new ScHeaderFooterTextObj(this, ScHeaderFooterPart::RIGHT, pRight)) +ScHeaderFooterContentObj::ScHeaderFooterContentObj() { } @@ -178,17 +173,20 @@ rtl::Reference<ScHeaderFooterContentObj> ScHeaderFooterContentObj::getImplementa return pRet; } -void ScHeaderFooterContentObj::dispose() +void ScHeaderFooterContentObj::Init( const EditTextObject* pLeft, + const EditTextObject* pCenter, + const EditTextObject* pRight ) { - mxLeftText->dispose(); - mxCenterText->dispose(); - mxRightText->dispose(); + uno::Reference<css::sheet::XHeaderFooterContent> xThis(this); + mxLeftText = rtl::Reference<ScHeaderFooterTextObj>(new ScHeaderFooterTextObj(xThis, ScHeaderFooterPart::LEFT, pLeft)); + mxCenterText = rtl::Reference<ScHeaderFooterTextObj>(new ScHeaderFooterTextObj(xThis, ScHeaderFooterPart::CENTER, pCenter)); + mxRightText = rtl::Reference<ScHeaderFooterTextObj>(new ScHeaderFooterTextObj(xThis, ScHeaderFooterPart::RIGHT, pRight)); } ScHeaderFooterTextData::ScHeaderFooterTextData( - rtl::Reference<ScHeaderFooterContentObj> const & rContent, ScHeaderFooterPart nP, const EditTextObject* pTextObj) : + uno::WeakReference<sheet::XHeaderFooterContent> xContent, ScHeaderFooterPart nP, const EditTextObject* pTextObj) : mpTextObj(pTextObj ? pTextObj->Clone() : nullptr), - rContentObj( rContent ), + xContentObj( xContent ), nPart( nP ), pEditEngine( nullptr ), pForwarder( nullptr ), @@ -261,8 +259,8 @@ void ScHeaderFooterTextData::UpdateData(EditEngine& rEditEngine) } ScHeaderFooterTextObj::ScHeaderFooterTextObj( - rtl::Reference<ScHeaderFooterContentObj> const & rContent, ScHeaderFooterPart nP, const EditTextObject* pTextObj) : - aTextData(rContent, nP, pTextObj) + uno::WeakReference<sheet::XHeaderFooterContent> xContent, ScHeaderFooterPart nP, const EditTextObject* pTextObj) : + aTextData(xContent, nP, pTextObj) { // ScHeaderFooterTextData acquires rContent // pUnoText is created on demand (getString/setString work without it) @@ -329,18 +327,22 @@ OUString SAL_CALL ScHeaderFooterTextObj::getString() throw(uno::RuntimeException OUString aRet; const EditTextObject* pData; - rtl::Reference<ScHeaderFooterContentObj> rContentObj = aTextData.GetContentObj(); + uno::Reference<css::sheet::XHeaderFooterContent> xContentObj = aTextData.GetContentObj(); + if (!xContentObj.is()) + throw css::uno::RuntimeException(""); + + rtl::Reference<ScHeaderFooterContentObj> pObj = ScHeaderFooterContentObj::getImplementation(xContentObj); switch ( aTextData.GetPart() ) { case ScHeaderFooterPart::LEFT: - pData = rContentObj->GetLeftEditObject(); + pData = pObj->GetLeftEditObject(); break; case ScHeaderFooterPart::CENTER: - pData = rContentObj->GetCenterEditObject(); + pData = pObj->GetCenterEditObject(); break; case ScHeaderFooterPart::RIGHT: - pData = rContentObj->GetRightEditObject(); + pData = pObj->GetRightEditObject(); break; default: SAL_WARN("sc.ui","unexpected enum value of ScHeaderFooterPart"); _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits