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

Reply via email to