diff options
author | Markus Mohrhard <markus.mohrhard@googlemail.com> | 2016-05-18 02:47:01 +0200 |
---|---|---|
committer | Markus Mohrhard <markus.mohrhard@googlemail.com> | 2016-05-18 20:45:04 +0000 |
commit | fc29ace3438eea09afe3ddbb5118458cbb531b06 (patch) | |
tree | 2b0fbfe02011edd3d1b236e1f52f6e15fa8a2719 /sc/source/ui/unoobj | |
parent | 6a0081642633eb406059295b90fd0c9b0cd1130f (diff) |
better fix for memory leak around calc header-footer UNO objects
Change-Id: I396a2c57b38623d82fe973ad8d53f08b1b480e2e
Reviewed-on: https://gerrit.libreoffice.org/25116
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Markus Mohrhard <markus.mohrhard@googlemail.com>
Diffstat (limited to 'sc/source/ui/unoobj')
-rw-r--r-- | sc/source/ui/unoobj/fielduno.cxx | 12 | ||||
-rw-r--r-- | sc/source/ui/unoobj/textuno.cxx | 38 |
2 files changed, 28 insertions, 22 deletions
diff --git a/sc/source/ui/unoobj/fielduno.cxx b/sc/source/ui/unoobj/fielduno.cxx index 74e351c0fd09..c71ac79c4064 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 d5c73d99d1c5..f52b030f9e45 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"); |