diff options
author | Markus Mohrhard <markus.mohrhard@googlemail.com> | 2016-10-05 21:10:12 +0100 |
---|---|---|
committer | Michael Meeks <michael.meeks@collabora.com> | 2016-10-06 13:16:41 +0100 |
commit | 052f98d0b1a6b0607069f0a50d4e03fcd4a1d52a (patch) | |
tree | 8190d798758cfbefd054a4bf79b7ea6c64fa3146 | |
parent | 91e0a73984f72e0f04e6087524332f6354f627d0 (diff) |
tdf#93967 - better fix for leak around calc header-footer UNO objects
Change-Id: I950479e8e1c634aa9ad13bf3e0e9d24485a1e6b2
-rw-r--r-- | sc/inc/textuno.hxx | 21 | ||||
-rw-r--r-- | sc/source/core/data/attrib.cxx | 9 | ||||
-rw-r--r-- | sc/source/ui/unoobj/fielduno.cxx | 12 | ||||
-rw-r--r-- | sc/source/ui/unoobj/textuno.cxx | 38 |
4 files changed, 49 insertions, 31 deletions
diff --git a/sc/inc/textuno.hxx b/sc/inc/textuno.hxx index 9a641572d4ff..fb51b01062d4 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" @@ -66,12 +67,8 @@ private: rtl::Reference<ScHeaderFooterTextObj> mxCenterText; rtl::Reference<ScHeaderFooterTextObj> mxRightText; - ScHeaderFooterContentObj(); // disabled - public: - ScHeaderFooterContentObj( const EditTextObject* pLeft, - const EditTextObject* pCenter, - const EditTextObject* pRight ); + ScHeaderFooterContentObj(); virtual ~ScHeaderFooterContentObj(); // for ScPageHFItem (using getImplementation) @@ -79,6 +76,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; @@ -110,15 +111,15 @@ class ScHeaderFooterTextData : boost::noncopyable { private: EditTextObject* mpTextObj; - rtl::Reference<ScHeaderFooterContentObj> rContentObj; - sal_uInt16 nPart; + css::uno::WeakReference<css::sheet::XHeaderFooterContent> xContentObj; + sal_uInt16 nPart; ScEditEngineDefaulter* pEditEngine; SvxEditEngineForwarder* pForwarder; bool bDataValid; public: ScHeaderFooterTextData( - rtl::Reference<ScHeaderFooterContentObj> const & rContent, sal_uInt16 nP, const EditTextObject* pTextObj); + css::uno::WeakReference<css::sheet::XHeaderFooterContent> xContent, sal_uInt16 nP, const EditTextObject* pTextObj); ~ScHeaderFooterTextData(); // helper functions @@ -128,7 +129,7 @@ public: ScEditEngineDefaulter* GetEditEngine() { GetTextForwarder(); return pEditEngine; } sal_uInt16 GetPart() const { return nPart; } - rtl::Reference<ScHeaderFooterContentObj> GetContentObj() const { return rContentObj; } + const css::uno::Reference<css::sheet::XHeaderFooterContent> GetContentObj() const { return xContentObj; } const EditTextObject* GetTextObject() const { return mpTextObj;} }; @@ -154,7 +155,7 @@ private: public: ScHeaderFooterTextObj( - rtl::Reference<ScHeaderFooterContentObj> const & rContent, sal_uInt16 nP, const EditTextObject* pTextObj); + css::uno::WeakReference<css::sheet::XHeaderFooterContent> xContent, sal_uInt16 nP, const EditTextObject* pTextObj); virtual ~ScHeaderFooterTextObj(); const EditTextObject* GetTextObject() const; diff --git a/sc/source/core/data/attrib.cxx b/sc/source/core/data/attrib.cxx index 9072410caece..2fa982c8f688 100644 --- a/sc/source/core/data/attrib.cxx +++ b/sc/source/core/data/attrib.cxx @@ -565,10 +565,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/ui/unoobj/fielduno.cxx b/sc/source/ui/unoobj/fielduno.cxx index a0fa9df6daf5..66c037111535 100644 --- a/sc/source/ui/unoobj/fielduno.cxx +++ b/sc/source/ui/unoobj/fielduno.cxx @@ -505,15 +505,19 @@ 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; sal_uInt16 nPart = mrData.GetPart(); if (nPart == SC_HDFT_LEFT) - xText = rContentObj->getLeftText(); + xText = pContentObj->getLeftText(); else if (nPart == SC_HDFT_CENTER) - xText = rContentObj->getCenterText(); + xText = pContentObj->getCenterText(); else - xText = rContentObj->getRightText(); + xText = pContentObj->getRightText(); uno::Reference<text::XTextRange> xTemp(xText, uno::UNO_QUERY); xTextRange = xTemp; diff --git a/sc/source/ui/unoobj/textuno.cxx b/sc/source/ui/unoobj/textuno.cxx index 736e96140b3f..8e0828eddca3 100644 --- a/sc/source/ui/unoobj/textuno.cxx +++ b/sc/source/ui/unoobj/textuno.cxx @@ -88,15 +88,20 @@ 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, SC_HDFT_LEFT, pLeft)), - mxCenterText(new ScHeaderFooterTextObj(this, SC_HDFT_CENTER, pCenter)), - mxRightText(new ScHeaderFooterTextObj(this, SC_HDFT_RIGHT, pRight)) +ScHeaderFooterContentObj::ScHeaderFooterContentObj() { } +void ScHeaderFooterContentObj::Init( const EditTextObject* pLeft, + const EditTextObject* pCenter, + const EditTextObject* pRight ) +{ + uno::Reference<css::sheet::XHeaderFooterContent> xThis(this); + mxLeftText = rtl::Reference<ScHeaderFooterTextObj>(new ScHeaderFooterTextObj(xThis, SC_HDFT_LEFT, pLeft)); + mxCenterText = rtl::Reference<ScHeaderFooterTextObj>(new ScHeaderFooterTextObj(xThis, SC_HDFT_CENTER, pCenter)); + mxRightText = rtl::Reference<ScHeaderFooterTextObj>(new ScHeaderFooterTextObj(xThis, SC_HDFT_RIGHT, pRight)); +} + ScHeaderFooterContentObj::~ScHeaderFooterContentObj() {} const EditTextObject* ScHeaderFooterContentObj::GetLeftEditObject() const @@ -175,9 +180,9 @@ rtl::Reference<ScHeaderFooterContentObj> ScHeaderFooterContentObj::getImplementa } ScHeaderFooterTextData::ScHeaderFooterTextData( - rtl::Reference<ScHeaderFooterContentObj> const & rContent, sal_uInt16 nP, const EditTextObject* pTextObj) : + uno::WeakReference<sheet::XHeaderFooterContent> xContent, sal_uInt16 nP, const EditTextObject* pTextObj) : mpTextObj(pTextObj ? pTextObj->Clone() : nullptr), - rContentObj( rContent ), + xContentObj( xContent ), nPart( nP ), pEditEngine( nullptr ), pForwarder( nullptr ), @@ -253,8 +258,8 @@ void ScHeaderFooterTextData::UpdateData(EditEngine& rEditEngine) } ScHeaderFooterTextObj::ScHeaderFooterTextObj( - rtl::Reference<ScHeaderFooterContentObj> const & rContent, sal_uInt16 nP, const EditTextObject* pTextObj) : - aTextData(rContent, nP, pTextObj) + uno::WeakReference<sheet::XHeaderFooterContent> xContent, sal_uInt16 nP, const EditTextObject* pTextObj) : + aTextData(xContent, nP, pTextObj) { // ScHeaderFooterTextData acquires rContent // pUnoText is created on demand (getString/setString work without it) @@ -321,15 +326,20 @@ OUString SAL_CALL ScHeaderFooterTextObj::getString() throw(uno::RuntimeException OUString aRet; const EditTextObject* pData; + uno::Reference<css::sheet::XHeaderFooterContent> xContentObj = aTextData.GetContentObj(); + if (!xContentObj.is()) + throw css::uno::RuntimeException(""); + + rtl::Reference<ScHeaderFooterContentObj> pContentObj = ScHeaderFooterContentObj::getImplementation(xContentObj); + sal_uInt16 nPart = aTextData.GetPart(); - rtl::Reference<ScHeaderFooterContentObj> rContentObj = aTextData.GetContentObj(); if (nPart == SC_HDFT_LEFT) - pData = rContentObj->GetLeftEditObject(); + pData = pContentObj->GetLeftEditObject(); else if (nPart == SC_HDFT_CENTER) - pData = rContentObj->GetCenterEditObject(); + pData = pContentObj->GetCenterEditObject(); else - pData = rContentObj->GetRightEditObject(); + pData = pContentObj->GetRightEditObject(); if (pData) { // for pure text, no font info is needed in pool defaults |