diff options
author | Markus Mohrhard <markus.mohrhard@googlemail.com> | 2017-01-09 05:58:00 +0100 |
---|---|---|
committer | Michael Stahl <mstahl@redhat.com> | 2017-01-11 19:36:58 +0000 |
commit | 2f0020ba056e2b523c487dc42b40f0e4b9f9a9b0 (patch) | |
tree | db5a88e31a3de5bbd454d99f720ea8992d7a4f8c /include/comphelper/unique_disposing_ptr.hxx | |
parent | 3defbf74b7fee3e3f9bada7e2721bf97405ac264 (diff) |
tdf#104830, need an own termination listener for lib objects
The destruction of the SwDLL object happens already through the normal
termination listener but the other termination listeners might still
depend on it. Also the outstanding events might need the SwDLL instance
to be still around.
This makes the destruction of the instance explicit and at a time when
it should be safe. We should use the same code for calc, impress, math
and base as well.
Change-Id: I50b8f30426f5a4a54e362e748fe962839abca73e
Reviewed-on: https://gerrit.libreoffice.org/32856
Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Markus Mohrhard <markus.mohrhard@googlemail.com>
(cherry picked from commit ad915fafd54f9115faea7147f82d80a942af2d68)
Reviewed-on: https://gerrit.libreoffice.org/32928
Reviewed-by: Michael Meeks <michael.meeks@collabora.com>
Reviewed-by: Michael Stahl <mstahl@redhat.com>
Diffstat (limited to 'include/comphelper/unique_disposing_ptr.hxx')
-rw-r--r-- | include/comphelper/unique_disposing_ptr.hxx | 40 |
1 files changed, 33 insertions, 7 deletions
diff --git a/include/comphelper/unique_disposing_ptr.hxx b/include/comphelper/unique_disposing_ptr.hxx index 0f120b179392..64ff5402b5b6 100644 --- a/include/comphelper/unique_disposing_ptr.hxx +++ b/include/comphelper/unique_disposing_ptr.hxx @@ -14,6 +14,7 @@ #include <com/sun/star/lang/XComponent.hpp> #include <com/sun/star/frame/XDesktop.hpp> +#include <com/sun/star/lang/XServiceInfo.hpp> #include <vcl/svapp.hxx> #include <osl/mutex.hxx> @@ -30,10 +31,10 @@ private: unique_disposing_ptr(const unique_disposing_ptr&) = delete; unique_disposing_ptr& operator=(const unique_disposing_ptr&) = delete; public: - unique_disposing_ptr( const css::uno::Reference< css::lang::XComponent > &rComponent, T * p = nullptr ) + unique_disposing_ptr( const css::uno::Reference< css::lang::XComponent > &rComponent, T * p = nullptr, bool bComponent = false) : m_xItem(p) { - m_xTerminateListener = new TerminateListener(rComponent, *this); + m_xTerminateListener = new TerminateListener(rComponent, *this, bComponent); } virtual void reset(T * p = nullptr) @@ -66,14 +67,19 @@ public: reset(); } private: - class TerminateListener : public ::cppu::WeakImplHelper< css::frame::XTerminateListener > + class TerminateListener : public ::cppu::WeakImplHelper< css::frame::XTerminateListener, + css::lang::XServiceInfo> { private: css::uno::Reference< css::lang::XComponent > m_xComponent; unique_disposing_ptr<T>& m_rItem; + bool mbComponentDLL; public: TerminateListener(const css::uno::Reference< css::lang::XComponent > &rComponent, - unique_disposing_ptr<T>& rItem) : m_xComponent(rComponent), m_rItem(rItem) + unique_disposing_ptr<T>& rItem, bool bComponentDLL) : + m_xComponent(rComponent), + m_rItem(rItem), + mbComponentDLL(bComponentDLL) { if (m_xComponent.is()) { @@ -97,7 +103,6 @@ private: } } - private: // XEventListener virtual void SAL_CALL disposing( const css::lang::EventObject& rEvt ) throw (css::uno::RuntimeException, std::exception) override @@ -130,6 +135,27 @@ private: { disposing(rEvt); } + + virtual OUString SAL_CALL getImplementationName() + throw (css::uno::RuntimeException, std::exception) override + { + if (mbComponentDLL) + return OUString("com.sun.star.comp.ComponentDLLListener"); + else + return OUString("com.sun.star.comp.DisposingTerminateListener"); + } + + virtual sal_Bool SAL_CALL supportsService(const OUString& /*rName*/) + throw (css::uno::RuntimeException, std::exception) override + { + return false; + } + + virtual css::uno::Sequence<OUString> SAL_CALL getSupportedServiceNames() + throw (css::uno::RuntimeException, std::exception) override + { + return css::uno::Sequence<OUString>(); + } }; }; @@ -141,8 +167,8 @@ template<class T> class unique_disposing_solar_mutex_reset_ptr : public unique_disposing_ptr<T> { public: - unique_disposing_solar_mutex_reset_ptr( const css::uno::Reference< css::lang::XComponent > &rComponent, T * p = nullptr ) - : unique_disposing_ptr<T>(rComponent, p) + unique_disposing_solar_mutex_reset_ptr( const css::uno::Reference< css::lang::XComponent > &rComponent, T * p = nullptr, bool bComponent = false) + : unique_disposing_ptr<T>(rComponent, p, bComponent) { } |