summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarkus Mohrhard <markus.mohrhard@googlemail.com>2016-10-05 21:10:12 +0100
committerMichael Meeks <michael.meeks@collabora.com>2016-10-06 13:16:41 +0100
commit052f98d0b1a6b0607069f0a50d4e03fcd4a1d52a (patch)
tree8190d798758cfbefd054a4bf79b7ea6c64fa3146
parent91e0a73984f72e0f04e6087524332f6354f627d0 (diff)
tdf#93967 - better fix for leak around calc header-footer UNO objects
Change-Id: I950479e8e1c634aa9ad13bf3e0e9d24485a1e6b2
-rw-r--r--sc/inc/textuno.hxx21
-rw-r--r--sc/source/core/data/attrib.cxx9
-rw-r--r--sc/source/ui/unoobj/fielduno.cxx12
-rw-r--r--sc/source/ui/unoobj/textuno.cxx38
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