diff options
author | Caolán McNamara <caolanm@redhat.com> | 2011-01-21 12:50:42 +0000 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2011-01-21 14:21:35 +0000 |
commit | 97e0597854a7ffd1d55f8f5c31db709b6533b3e3 (patch) | |
tree | 5c9b9f75abd95fa63cb76ac7af8e49d20688440c /framework | |
parent | ef276ff33dff253c1ebdc5aec38329c959dffdc9 (diff) |
use a weakchangeslistener instead
Diffstat (limited to 'framework')
-rw-r--r-- | framework/inc/helper/mischelper.hxx | 39 | ||||
-rw-r--r-- | framework/inc/services/pathsettings.hxx | 11 | ||||
-rw-r--r-- | framework/source/services/pathsettings.cxx | 41 |
3 files changed, 50 insertions, 41 deletions
diff --git a/framework/inc/helper/mischelper.hxx b/framework/inc/helper/mischelper.hxx index 957164437cab..6d98e53b557f 100644 --- a/framework/inc/helper/mischelper.hxx +++ b/framework/inc/helper/mischelper.hxx @@ -31,6 +31,7 @@ #include <com/sun/star/linguistic2/XLanguageGuessing.hpp> #include <com/sun/star/container/XNameAccess.hpp> +#include <com/sun/star/util/XChangesListener.hpp> #include <com/sun/star/container/XContainerListener.hpp> #include <com/sun/star/frame/XFrame.hpp> @@ -190,6 +191,44 @@ class WeakContainerListener : public ::cppu::WeakImplHelper1<com::sun::star::con } }; +class WeakChangesListener : public ::cppu::WeakImplHelper1<com::sun::star::util::XChangesListener> +{ + private: + com::sun::star::uno::WeakReference<com::sun::star::util::XChangesListener> mxOwner; + + public: + WeakChangesListener(com::sun::star::uno::Reference<com::sun::star::util::XChangesListener> xOwner) + : mxOwner(xOwner) + { + } + + virtual ~WeakChangesListener() + { + } + + // util.XChangesListener + virtual void SAL_CALL changesOccurred(const com::sun::star::util::ChangesEvent& rEvent) + throw(com::sun::star::uno::RuntimeException) + { + com::sun::star::uno::Reference<com::sun::star::util::XChangesListener> xOwner(mxOwner.get(), + com::sun::star::uno::UNO_QUERY); + if (xOwner.is()) + xOwner->changesOccurred(rEvent); + } + + // lang.XEventListener + virtual void SAL_CALL disposing(const com::sun::star::lang::EventObject& rEvent) + throw(com::sun::star::uno::RuntimeException) + { + com::sun::star::uno::Reference<com::sun::star::util::XChangesListener> xOwner(mxOwner.get(), + com::sun::star::uno::UNO_QUERY); + if (xOwner.is()) + xOwner->disposing(rEvent); + + } +}; + + } // namespace framework #endif // __MISC_HELPER_HXX_ diff --git a/framework/inc/services/pathsettings.hxx b/framework/inc/services/pathsettings.hxx index 35bf79783dec..8e7d1de958d3 100644 --- a/framework/inc/services/pathsettings.hxx +++ b/framework/inc/services/pathsettings.hxx @@ -47,7 +47,6 @@ //_________________________________________________________________________________________________________________ #include <com/sun/star/lang/XServiceInfo.hpp> #include <com/sun/star/lang/XTypeProvider.hpp> -#include <com/sun/star/lang/XComponent.hpp> #include <com/sun/star/util/XStringSubstitution.hpp> #include <com/sun/star/util/XChangesListener.hpp> #include <com/sun/star/container/XNameAccess.hpp> @@ -71,7 +70,6 @@ namespace framework class PathSettings : public css::lang::XTypeProvider , public css::lang::XServiceInfo , - public css::lang::XComponent , public css::util::XChangesListener , // => XEventListener // base classes // Order is neccessary for right initialization! @@ -161,8 +159,8 @@ class PathSettings : public css::lang::XTypeProvider , /** provides access to the new configuration schema. */ css::uno::Reference< css::container::XNameAccess > m_xCfgNew; - /** container for ALL Listeners. */ - ::cppu::OMultiTypeInterfaceContainerHelper m_aListenerContainer; + /** helper to listen for configuration changes without ownership cycle problems */ + css::uno::Reference< css::util::XChangesListener > m_xCfgNewListener; ::cppu::OPropertyArrayHelper* m_pPropHelp; @@ -187,11 +185,6 @@ class PathSettings : public css::lang::XTypeProvider , FWK_DECLARE_XTYPEPROVIDER DECLARE_XSERVICEINFO - // css:lang::XComponent - void SAL_CALL dispose() throw ( ::com::sun::star::uno::RuntimeException ); - void SAL_CALL addEventListener( const com::sun::star::uno::Reference< XEventListener >& xListener ) throw( com::sun::star::uno::RuntimeException ); - void SAL_CALL removeEventListener( const com::sun::star::uno::Reference< XEventListener >& xListener ) throw( com::sun::star::uno::RuntimeException ); - // css::util::XChangesListener virtual void SAL_CALL changesOccurred(const css::util::ChangesEvent& aEvent) throw (css::uno::RuntimeException); diff --git a/framework/source/services/pathsettings.cxx b/framework/source/services/pathsettings.cxx index 6d9777a5ab04..ff7e725586af 100644 --- a/framework/source/services/pathsettings.cxx +++ b/framework/source/services/pathsettings.cxx @@ -40,6 +40,8 @@ #include <threadhelp/writeguard.hxx> #include <services.h> +#include "helper/mischelper.hxx" + // ______________________________________________ // interface includes #include <com/sun/star/beans/Property.hpp> @@ -48,7 +50,6 @@ #include <com/sun/star/container/XContainer.hpp> #include <com/sun/star/beans/XPropertySet.hpp> #include <com/sun/star/util/XChangesNotifier.hpp> -#include <com/sun/star/lang/XComponent.hpp> // ______________________________________________ // includes of other projects @@ -99,11 +100,10 @@ namespace framework //----------------------------------------------------------------------------- // XInterface, XTypeProvider, XServiceInfo -DEFINE_XINTERFACE_8 ( PathSettings , +DEFINE_XINTERFACE_7 ( PathSettings , OWeakObject , DIRECT_INTERFACE ( css::lang::XTypeProvider ), DIRECT_INTERFACE ( css::lang::XServiceInfo ), - DIRECT_INTERFACE ( css::lang::XComponent ), DERIVED_INTERFACE( css::lang::XEventListener, css::util::XChangesListener), DIRECT_INTERFACE ( css::util::XChangesListener ), DIRECT_INTERFACE ( css::beans::XPropertySet ), @@ -111,11 +111,10 @@ DEFINE_XINTERFACE_8 ( PathSettings DIRECT_INTERFACE ( css::beans::XMultiPropertySet ) ) -DEFINE_XTYPEPROVIDER_8 ( PathSettings , +DEFINE_XTYPEPROVIDER_7 ( PathSettings , css::lang::XTypeProvider , css::lang::XServiceInfo , css::lang::XEventListener , - css::lang::XComponent , css::util::XChangesListener , css::beans::XPropertySet , css::beans::XFastPropertySet , @@ -153,7 +152,6 @@ PathSettings::PathSettings( const css::uno::Reference< css::lang::XMultiServiceF , ::cppu::OWeakObject() // Init member , m_xSMGR (xSMGR) - , m_aListenerContainer(m_aLock.getShareableOslMutex()) , m_pPropHelp(0 ) , m_bIgnoreEvents(sal_False) { @@ -163,6 +161,9 @@ PathSettings::PathSettings( const css::uno::Reference< css::lang::XMultiServiceF //----------------------------------------------------------------------------- PathSettings::~PathSettings() { + css::uno::Reference< css::util::XChangesNotifier > xBroadcaster(m_xCfgNew, css::uno::UNO_QUERY); + if (xBroadcaster.is()) + xBroadcaster->removeChangesListener(m_xCfgNewListener); if (m_pPropHelp) delete m_pPropHelp; } @@ -209,37 +210,12 @@ void SAL_CALL PathSettings::disposing(const css::lang::EventObject& aSource) throw(css::uno::RuntimeException) { RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "PathSettings::disposing" ); - // SAFE -> WriteGuard aWriteLock(m_aLock); if (aSource.Source == m_xCfgNew) m_xCfgNew.clear(); aWriteLock.unlock(); - // <- SAFE -} - -void SAL_CALL PathSettings::dispose() throw (css::uno::RuntimeException) -{ - css::uno::Reference< css::util::XChangesNotifier > xBroadcaster(m_xCfgNew, css::uno::UNO_QUERY_THROW); - if (xBroadcaster.is()) - xBroadcaster->removeChangesListener(static_cast< css::util::XChangesListener* >(this)); - - css::uno::Reference< css::uno::XInterface > xThis ( static_cast< ::cppu::OWeakObject* >(this), css::uno::UNO_QUERY ); - css::lang::EventObject aEvent( xThis ); - m_aListenerContainer.disposeAndClear( aEvent ); -} - -void SAL_CALL PathSettings::addEventListener(const css::uno::Reference< css::lang::XEventListener >& xListener) - throw (css::uno::RuntimeException) -{ - m_aListenerContainer.addInterface( ::getCppuType( ( const css::uno::Reference< css::lang::XEventListener >*) NULL ), xListener ); -} - -void SAL_CALL PathSettings::removeEventListener( const css::uno::Reference< css::lang::XEventListener >& xListener) - throw (css::uno::RuntimeException) -{ - m_aListenerContainer.addInterface( ::getCppuType( ( const css::uno::Reference< css::lang::XEventListener >*) NULL ), xListener ); } //----------------------------------------------------------------------------- @@ -1196,10 +1172,11 @@ css::uno::Reference< css::container::XNameAccess > PathSettings::fa_getCfgNew() // SAFE -> WriteGuard aWriteLock(m_aLock); m_xCfgNew = xCfg; + m_xCfgNewListener = new WeakChangesListener(this); aWriteLock.unlock(); css::uno::Reference< css::util::XChangesNotifier > xBroadcaster(xCfg, css::uno::UNO_QUERY_THROW); - xBroadcaster->addChangesListener(static_cast< css::util::XChangesListener* >(this)); + xBroadcaster->addChangesListener(m_xCfgNewListener); } return xCfg; |