sw/source/core/uibase/dbui/dbmgr.cxx |   41 +++++++++++++++++++++++------------
 1 file changed, 27 insertions(+), 14 deletions(-)

New commits:
commit e56105cfe780905864b895d337a4a848afe1fa26
Author: Michael Stahl <mst...@redhat.com>
Date:   Thu Jan 15 17:00:13 2015 +0100

    rhbz#1175027: sw: fix life cycle of SwConnectionDisposedListener_Impl
    
    The SwDBManager is owned by SwDoc, so if the database thing is still
    alive when SwDoc dies (which may or may not indicate a leak), the
    listener will crash when the database stuff is eventually disposed
    during shutdown.
    
    (cherry picked from commit 4f747afae591f244164df25d96a83f417e6c0698)
    
    Conflicts:
        sw/source/core/uibase/dbui/dbmgr.cxx
    
    Change-Id: I2bb5eb35f0a403374bc8f123b85ba2d7244016b0
    Reviewed-on: https://gerrit.libreoffice.org/13935
    Reviewed-by: Caolán McNamara <caol...@redhat.com>
    Tested-by: Caolán McNamara <caol...@redhat.com>

diff --git a/sw/source/core/uibase/dbui/dbmgr.cxx 
b/sw/source/core/uibase/dbui/dbmgr.cxx
index 79d417d..e950854 100644
--- a/sw/source/core/uibase/dbui/dbmgr.cxx
+++ b/sw/source/core/uibase/dbui/dbmgr.cxx
@@ -206,26 +206,35 @@ void lcl_CopyCompatibilityOptions( SwWrtShell& 
rSourceShell, SwWrtShell& rTarget
 class SwConnectionDisposedListener_Impl : public cppu::WeakImplHelper1
 < lang::XEventListener >
 {
-    SwDBManager&     rDBManager;
+private:
+    SwDBManager * m_pDBManager;
 
     virtual void SAL_CALL disposing( const EventObject& Source ) throw 
(RuntimeException, std::exception) SAL_OVERRIDE;
+
 public:
     SwConnectionDisposedListener_Impl(SwDBManager& rMgr);
     virtual ~SwConnectionDisposedListener_Impl();
 
+    void Dispose() { m_pDBManager = 0; }
+
 };
 
 struct SwDBManager_Impl
 {
     SwDSParam*          pMergeData;
     AbstractMailMergeDlg*     pMergeDialog;
-    uno::Reference<lang::XEventListener> xDisposeListener;
+    ::rtl::Reference<SwConnectionDisposedListener_Impl> m_xDisposeListener;
 
     SwDBManager_Impl(SwDBManager& rDBManager)
        :pMergeData(0)
        ,pMergeDialog(0)
-       ,xDisposeListener(new SwConnectionDisposedListener_Impl(rDBManager))
+       , m_xDisposeListener(new SwConnectionDisposedListener_Impl(rDBManager))
         {}
+
+    ~SwDBManager_Impl()
+    {
+        m_xDisposeListener->Dispose();
+    }
 };
 
 static void lcl_InitNumberFormatter(SwDSParam& rParam, 
uno::Reference<XDataSource> xSource)
@@ -360,7 +369,7 @@ bool SwDBManager::MergeNew(const SwMergeDescriptor& 
rMergeDesc )
             {
                 uno::Reference<XComponent> xComponent(pInsert->xConnection, 
UNO_QUERY);
                 if(xComponent.is())
-                    xComponent->addEventListener(pImpl->xDisposeListener);
+                    
xComponent->addEventListener(pImpl->m_xDisposeListener.get());
             }
             catch(const Exception&)
             {
@@ -2017,7 +2026,7 @@ uno::Reference< XConnection> 
SwDBManager::RegisterConnection(OUString& rDataSour
         {
             uno::Reference<XComponent> xComponent(pFound->xConnection, 
UNO_QUERY);
             if(xComponent.is())
-                xComponent->addEventListener(pImpl->xDisposeListener);
+                xComponent->addEventListener(pImpl->m_xDisposeListener.get());
         }
         catch(const Exception&)
         {
@@ -2129,7 +2138,7 @@ SwDSParam* SwDBManager::FindDSData(const SwDBData& rData, 
bool bCreate)
             {
                 uno::Reference<XComponent> xComponent(pFound->xConnection, 
UNO_QUERY);
                 if(xComponent.is())
-                    xComponent->addEventListener(pImpl->xDisposeListener);
+                    
xComponent->addEventListener(pImpl->m_xDisposeListener.get());
             }
             catch(const Exception&)
             {
@@ -2166,7 +2175,7 @@ SwDSParam*  SwDBManager::FindDSConnection(const OUString& 
rDataSource, bool bCre
         {
             uno::Reference<XComponent> xComponent(pFound->xConnection, 
UNO_QUERY);
             if(xComponent.is())
-                xComponent->addEventListener(pImpl->xDisposeListener);
+                xComponent->addEventListener(pImpl->m_xDisposeListener.get());
         }
         catch(const Exception&)
         {
@@ -2933,27 +2942,31 @@ sal_Int32 SwDBManager::MergeDocuments( 
SwMailMergeConfigItem& rMMConfig,
     return nRet;
 }
 
-SwConnectionDisposedListener_Impl::SwConnectionDisposedListener_Impl(SwDBManager&
 rMgr) :
-    rDBManager(rMgr)
+SwConnectionDisposedListener_Impl::SwConnectionDisposedListener_Impl(SwDBManager&
 rManager)
+    : m_pDBManager(&rManager)
 {
-};
+}
 
 SwConnectionDisposedListener_Impl::~SwConnectionDisposedListener_Impl()
 {
-};
+}
 
 void SwConnectionDisposedListener_Impl::disposing( const EventObject& rSource )
         throw (RuntimeException, std::exception)
 {
     ::SolarMutexGuard aGuard;
+
+    if (!m_pDBManager) return; // we're disposed too!
+
     uno::Reference<XConnection> xSource(rSource.Source, UNO_QUERY);
-    for(sal_uInt16 nPos = rDBManager.aDataSourceParams.size(); nPos; nPos--)
+    for (size_t nPos = m_pDBManager->aDataSourceParams.size(); nPos; nPos--)
     {
-        SwDSParam* pParam = &rDBManager.aDataSourceParams[nPos - 1];
+        SwDSParam* pParam = &m_pDBManager->aDataSourceParams[nPos - 1];
         if(pParam->xConnection.is() &&
                 (xSource == pParam->xConnection))
         {
-            
rDBManager.aDataSourceParams.erase(rDBManager.aDataSourceParams.begin() + nPos 
- 1);
+            m_pDBManager->aDataSourceParams.erase(
+                    m_pDBManager->aDataSourceParams.begin() + nPos - 1);
         }
     }
 }
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to