chart2/source/inc/ModifyListenerHelper.hxx | 43 +-------- chart2/source/tools/ModifyListenerHelper.cxx | 129 ++------------------------- 2 files changed, 21 insertions(+), 151 deletions(-)
New commits: commit b32e46fbc3b536c1f56fe5d3714772ad673542a3 Author: Noel Grandin <noelgran...@gmail.com> AuthorDate: Thu Jan 13 20:20:31 2022 +0200 Commit: Noel Grandin <noel.gran...@collabora.co.uk> CommitDate: Fri Jan 14 09:08:02 2022 +0100 improvements to ModifyEventForwarder (*) Firstly, the XWeak machinery in here was never useful. This class has always used hard references to its listeners. So just remove all that. (*) Convert from osl::Mutex to std::mutex and use the latest utility classes in comphelper with that. Change-Id: Id129527cf53da6d7a9f6e1c76b556c57fe1a0270 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/128393 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk> diff --git a/chart2/source/inc/ModifyListenerHelper.hxx b/chart2/source/inc/ModifyListenerHelper.hxx index 0e479395ffb3..b65530d9f229 100644 --- a/chart2/source/inc/ModifyListenerHelper.hxx +++ b/chart2/source/inc/ModifyListenerHelper.hxx @@ -20,42 +20,29 @@ #include <com/sun/star/util/XModifyListener.hpp> #include <com/sun/star/util/XModifyBroadcaster.hpp> -#include <cppuhelper/basemutex.hxx> -#include <cppuhelper/compbase.hxx> +#include <comphelper/interfacecontainer4.hxx> +#include <comphelper/compbase.hxx> #include <rtl/ref.hxx> -#include <vector> +#include <mutex> #include <algorithm> #include <utility> -namespace com::sun::star::uno { class XWeak; } -namespace com::sun::star::uno { template <class interface_type> class WeakReference; } - namespace chart { /** This helper class serves as forwarder of modify events. It can be used whenever an object has to send modify events after it gets a modify event of one of its children. - - <p>The listeners are held as WeakReferences if they support XWeak. Thus the - life time of the listeners is independent of the broadcaster's lifetime in - this case.</p> */ -class ModifyEventForwarder : - public cppu::BaseMutex, - public ::cppu::WeakComponentImplHelper< +class ModifyEventForwarder final : + public ::comphelper::WeakComponentImplHelper< css::util::XModifyBroadcaster, css::util::XModifyListener > { public: ModifyEventForwarder(); - void AddListener( - const css::uno::Reference< css::util::XModifyListener >& aListener ); - void RemoveListener( - const css::uno::Reference< css::util::XModifyListener >& aListener ); - // ____ XModifyBroadcaster ____ virtual void SAL_CALL addModifyListener( const css::uno::Reference< css::util::XModifyListener >& aListener ) override; @@ -66,29 +53,15 @@ public: virtual void SAL_CALL modified( const css::lang::EventObject& aEvent ) override; -protected: +private: // ____ XEventListener (base of XModifyListener) ____ virtual void SAL_CALL disposing( const css::lang::EventObject& Source ) override; // ____ WeakComponentImplHelperBase ____ - virtual void SAL_CALL disposing() override; - -private: - /// call disposing() at all listeners and remove all listeners - void DisposeAndClear( const css::uno::Reference< - css::uno::XWeak > & xSource ); - -// ::osl::Mutex & m_rMutex; - ::cppu::OBroadcastHelper m_aModifyListeners; - - typedef std::vector< - std::pair< - css::uno::WeakReference< css::util::XModifyListener >, - css::uno::Reference< css::util::XModifyListener > > > - tListenerMap; + virtual void disposing(std::unique_lock<std::mutex>& ) override; - tListenerMap m_aListenerMap; + comphelper::OInterfaceContainerHelper4<css::util::XModifyListener> m_aModifyListeners; }; } diff --git a/chart2/source/tools/ModifyListenerHelper.cxx b/chart2/source/tools/ModifyListenerHelper.cxx index 90330907faba..b05d6210aba7 100644 --- a/chart2/source/tools/ModifyListenerHelper.cxx +++ b/chart2/source/tools/ModifyListenerHelper.cxx @@ -26,138 +26,35 @@ using namespace ::com::sun::star; using ::com::sun::star::uno::Reference; -namespace -{ - -void lcl_fireModifyEvent( - ::cppu::OBroadcastHelper const & rBroadcastHelper, - const Reference< uno::XWeak > & xEventSource, - const lang::EventObject * pEvent ) -{ - ::cppu::OInterfaceContainerHelper * pCntHlp = rBroadcastHelper.getContainer( - cppu::UnoType<util::XModifyListener>::get()); - if( !pCntHlp ) - return; - - lang::EventObject aEventToSend; - if( pEvent ) - aEventToSend = *pEvent; - else - aEventToSend.Source.set( xEventSource ); - OSL_ENSURE( aEventToSend.Source.is(), "Sending event without source" ); - - ::cppu::OInterfaceIteratorHelper aIt( *pCntHlp ); - - while( aIt.hasMoreElements()) - { - Reference< util::XModifyListener > xModListener( aIt.next(), uno::UNO_QUERY ); - if( xModListener.is()) - xModListener->modified( aEventToSend ); - } -} - -struct lcl_weakReferenceToSame -{ - explicit lcl_weakReferenceToSame( const Reference< util::XModifyListener > & xModListener ) : - m_xHardRef( xModListener ) - {} - - // argument type is same as tListenerMap::value_type& - bool operator() ( const std::pair<css::uno::WeakReference< css::util::XModifyListener>, - css::uno::Reference< css::util::XModifyListener> > & xElem ) - { - Reference< util::XModifyListener > xWeakAsHard( xElem.first ); - if( xWeakAsHard.is()) - return (xWeakAsHard == m_xHardRef); - return false; - } - -private: - Reference< util::XModifyListener > m_xHardRef; -}; - -} // anonymous namespace - namespace chart { -ModifyEventForwarder::ModifyEventForwarder() : - ::cppu::WeakComponentImplHelper< - css::util::XModifyBroadcaster, - css::util::XModifyListener >( m_aMutex ), - m_aModifyListeners( m_aMutex ) -{ -} - -void ModifyEventForwarder::AddListener( const Reference< util::XModifyListener >& aListener ) -{ - try - { - Reference< util::XModifyListener > xListenerToAdd( aListener ); - - Reference< uno::XWeak > xWeak( aListener, uno::UNO_QUERY ); - if( xWeak.is()) - { - // remember the helper class for later remove - uno::WeakReference< util::XModifyListener > xWeakRef( aListener ); - xListenerToAdd.set( new WeakModifyListenerAdapter( xWeakRef )); - m_aListenerMap.emplace_back( xWeakRef, xListenerToAdd ); - } - - m_aModifyListeners.addListener( cppu::UnoType<decltype(xListenerToAdd)>::get(), xListenerToAdd ); - } - catch( const uno::Exception & ) - { - DBG_UNHANDLED_EXCEPTION("chart2"); - } -} - -void ModifyEventForwarder::RemoveListener( const Reference< util::XModifyListener >& aListener ) +ModifyEventForwarder::ModifyEventForwarder() { - try - { - // look up fitting helper class that has been added - Reference< util::XModifyListener > xListenerToRemove( aListener ); - tListenerMap::iterator aIt( - std::find_if( m_aListenerMap.begin(), m_aListenerMap.end(), lcl_weakReferenceToSame( aListener ))); - if( aIt != m_aListenerMap.end()) - { - xListenerToRemove.set( (*aIt).second ); - // map entry is no longer needed - m_aListenerMap.erase( aIt ); - } - - m_aModifyListeners.removeListener( cppu::UnoType<decltype(aListener)>::get(), xListenerToRemove ); - } - catch( const uno::Exception & ) - { - DBG_UNHANDLED_EXCEPTION("chart2"); - } -} - -void ModifyEventForwarder::DisposeAndClear( const Reference< uno::XWeak > & xSource ) -{ - ::cppu::OInterfaceContainerHelper * pCntHlp = m_aModifyListeners.getContainer( - cppu::UnoType<util::XModifyListener>::get()); - if( pCntHlp ) - pCntHlp->disposeAndClear( lang::EventObject( xSource ) ); } // ____ XModifyBroadcaster ____ void SAL_CALL ModifyEventForwarder::addModifyListener( const Reference< util::XModifyListener >& aListener ) { - AddListener( aListener ); + std::unique_lock aGuard(m_aMutex); + + m_aModifyListeners.addInterface( aListener ); } void SAL_CALL ModifyEventForwarder::removeModifyListener( const Reference< util::XModifyListener >& aListener ) { - RemoveListener( aListener ); + std::unique_lock aGuard(m_aMutex); + + m_aModifyListeners.removeInterface( aListener ); } // ____ XModifyListener ____ void SAL_CALL ModifyEventForwarder::modified( const lang::EventObject& aEvent ) { - lcl_fireModifyEvent( m_aModifyListeners, Reference< uno::XWeak >(), &aEvent ); + if( m_aModifyListeners.getLength() == 0 ) + return; + + m_aModifyListeners.notifyEach( &util::XModifyListener::modified, aEvent ); } // ____ XEventListener (base of XModifyListener) ____ @@ -167,10 +64,10 @@ void SAL_CALL ModifyEventForwarder::disposing( const lang::EventObject& /* Sourc } // ____ WeakComponentImplHelperBase ____ -void SAL_CALL ModifyEventForwarder::disposing() +void ModifyEventForwarder::disposing(std::unique_lock<std::mutex>& rGuard) { // dispose was called at this - DisposeAndClear( this ); + m_aModifyListeners.disposeAndClear( rGuard, lang::EventObject( static_cast<cppu::OWeakObject*>(this) ) ); } } // namespace chart::ModifyListenerHelper