[Libreoffice-commits] core.git: extensions/source

Michael Meeks michael.meeks at collabora.com
Thu Jul 9 10:16:04 PDT 2015


 extensions/source/bibliography/bibview.cxx |    6 ++++--
 extensions/source/bibliography/general.cxx |    7 ++++---
 extensions/source/bibliography/general.hxx |    4 ++--
 3 files changed, 10 insertions(+), 7 deletions(-)

New commits:
commit 6a2643b92d05a51ef241aeb1e4d5948647e646ef
Author: Michael Meeks <michael.meeks at collabora.com>
Date:   Thu Jul 9 12:58:11 2015 +0100

    tdf#92611 - unwind UNO lifecycle snafu.
    
    Introduced in commit 1c4025babd7037a3292aa530c7d45ab8d6ef6dcb.
    Was using UNO reference counting on a member allocated as part
    of another object.
    
    Change-Id: Ic86b2aa30359dc202c8bc2f1a0de476167a1e561
    Reviewed-on: https://gerrit.libreoffice.org/16889
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Michael Meeks <michael.meeks at collabora.com>
    Tested-by: Michael Meeks <michael.meeks at collabora.com>

diff --git a/extensions/source/bibliography/bibview.cxx b/extensions/source/bibliography/bibview.cxx
index d1a8b95..23d4186 100644
--- a/extensions/source/bibliography/bibview.cxx
+++ b/extensions/source/bibliography/bibview.cxx
@@ -66,7 +66,7 @@ namespace bib
 
     void BibView::dispose()
     {
-        BibGeneralPage* pGeneralPage = m_pGeneralPage;
+        VclPtr<BibGeneralPage> pGeneralPage = m_pGeneralPage;
         m_pGeneralPage.clear();
 
         pGeneralPage->CommitActiveControl();
@@ -102,6 +102,7 @@ namespace bib
             m_aFormControlContainer.disconnectForm();
 
         pGeneralPage->RemoveListeners();
+        pGeneralPage.disposeAndClear();
         m_xGeneralPage = NULL;
         BibWindow::dispose();
     }
@@ -116,11 +117,12 @@ namespace bib
         {
             m_pGeneralPage->Hide();
             m_pGeneralPage->RemoveListeners();
+            m_pGeneralPage.disposeAndClear();
             m_xGeneralPage = 0;
         }
 
         m_pGeneralPage = VclPtr<BibGeneralPage>::Create( this, m_pDatMan );
-        m_xGeneralPage = &m_pGeneralPage->GetFocusListener();
+        m_xGeneralPage = m_pGeneralPage->GetFocusListener().get();
         m_pGeneralPage->Show();
 
         if( HasFocus() )
diff --git a/extensions/source/bibliography/general.cxx b/extensions/source/bibliography/general.cxx
index f84ab58..19e8168 100644
--- a/extensions/source/bibliography/general.cxx
+++ b/extensions/source/bibliography/general.cxx
@@ -168,7 +168,7 @@ void BibPosListener::disposing(const lang::EventObject& /*Source*/) throw( uno::
 BibGeneralPage::BibGeneralPage(vcl::Window* pParent, BibDataManager* pMan):
     BibTabPage(pParent, "GeneralPage", "modules/sbibliography/ui/generalpage.ui"),
     sErrorPrefix(BIB_RESSTR(ST_ERROR_PREFIX)),
-    maBibGeneralPageFocusListener(this),
+    mxBibGeneralPageFocusListener(new BibGeneralPageFocusListener(this)),
     pDatMan(pMan)
 {
     get(pIdentifierFT, "shortname");
@@ -387,6 +387,7 @@ void BibGeneralPage::dispose()
     pCustom4FT.clear();
     pCustom5FT.clear();
     for (auto & a: aFixedTexts) a.clear();
+    mxBibGeneralPageFocusListener.clear();
     BibTabPage::dispose();
 }
 
@@ -397,7 +398,7 @@ void BibGeneralPage::RemoveListeners()
         if(aControls[i].is())
         {
             uno::Reference< awt::XWindow > xCtrWin(aControls[i], uno::UNO_QUERY );
-            xCtrWin->removeFocusListener( &maBibGeneralPageFocusListener );
+            xCtrWin->removeFocusListener( mxBibGeneralPageFocusListener.get() );
             aControls[i] = 0;
         }
     }
@@ -488,7 +489,7 @@ uno::Reference< awt::XControlModel >  BibGeneralPage::AddXControl(
                     // Peer as Child to the FrameWindow
                     xCtrlContnr->addControl(rName, xControl);
                     uno::Reference< awt::XWindow >  xCtrWin(xControl, UNO_QUERY );
-                    xCtrWin->addFocusListener( &maBibGeneralPageFocusListener );
+                    xCtrWin->addFocusListener( mxBibGeneralPageFocusListener.get() );
                     rIndex = -1;    // -> implies, that not found
                     for(sal_uInt16 i = 0; i < FIELD_COUNT; i++)
                         if(!aControls[i].is())
diff --git a/extensions/source/bibliography/general.hxx b/extensions/source/bibliography/general.hxx
index e566c9f..af34aa6 100644
--- a/extensions/source/bibliography/general.hxx
+++ b/extensions/source/bibliography/general.hxx
@@ -127,7 +127,7 @@ class BibGeneralPage: public BibTabPage
     ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XRowSetListener >
                         xPosListener;
 
-    BibGeneralPageFocusListener maBibGeneralPageFocusListener;
+    rtl::Reference<BibGeneralPageFocusListener> mxBibGeneralPageFocusListener;
 
     BibDataManager*     pDatMan;
 
@@ -164,7 +164,7 @@ public:
 
     virtual bool                HandleShortCutKey( const KeyEvent& rKeyEvent ) SAL_OVERRIDE; // returns true, if key was handled
 
-    inline BibGeneralPageFocusListener& GetFocusListener() { return maBibGeneralPageFocusListener; }
+    inline rtl::Reference<BibGeneralPageFocusListener> GetFocusListener() { return mxBibGeneralPageFocusListener; }
 
     void focusGained(const css::awt::FocusEvent& rEvent) throw( css::uno::RuntimeException, std::exception );
     void focusLost(const css::awt::FocusEvent& rEvent) throw( css::uno::RuntimeException, std::exception );


More information about the Libreoffice-commits mailing list