summaryrefslogtreecommitdiff
path: root/sw/source
diff options
context:
space:
mode:
authorMichael Stahl <mstahl@redhat.com>2015-01-15 17:00:13 +0100
committerAndras Timar <andras.timar@collabora.com>2015-01-24 16:54:39 +0100
commitde3efc6f0940f753d3bdf36a493697df9f4b44e5 (patch)
tree74f628437d43eb776465866e80a8c5f59c426f4f /sw/source
parent7ddea51581b3c7551290ecb374ddc72298390156 (diff)
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 <caolanm@redhat.com> Tested-by: Caolán McNamara <caolanm@redhat.com>
Diffstat (limited to 'sw/source')
-rw-r--r--sw/source/core/uibase/dbui/dbmgr.cxx41
1 files changed, 27 insertions, 14 deletions
diff --git a/sw/source/core/uibase/dbui/dbmgr.cxx b/sw/source/core/uibase/dbui/dbmgr.cxx
index 79d417d7788d..e950854bf633 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);
}
}
}