[Libreoffice-commits] core.git: Branch 'libreoffice-5-1' - sc/inc sc/source

Markus Mohrhard markus.mohrhard at googlemail.com
Thu Oct 6 12:25:12 UTC 2016


 sc/inc/textuno.hxx               |   21 +++++++++++----------
 sc/source/core/data/attrib.cxx   |    9 ++++++---
 sc/source/ui/unoobj/fielduno.cxx |   12 ++++++++----
 sc/source/ui/unoobj/textuno.cxx  |   38 ++++++++++++++++++++++++--------------
 4 files changed, 49 insertions(+), 31 deletions(-)

New commits:
commit 052f98d0b1a6b0607069f0a50d4e03fcd4a1d52a
Author: Markus Mohrhard <markus.mohrhard at googlemail.com>
Date:   Wed Oct 5 21:10:12 2016 +0100

    tdf#93967 - better fix for leak around calc header-footer UNO objects
    
    Change-Id: I950479e8e1c634aa9ad13bf3e0e9d24485a1e6b2

diff --git a/sc/inc/textuno.hxx b/sc/inc/textuno.hxx
index 9a64157..fb51b01 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 9072410..2fa982c 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 a0fa9df6..66c0371 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 736e961..8e0828e 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


More information about the Libreoffice-commits mailing list