diff options
-rw-r--r-- | basic/source/inc/namecont.hxx | 11 | ||||
-rw-r--r-- | basic/source/uno/namecont.cxx | 42 |
2 files changed, 31 insertions, 22 deletions
diff --git a/basic/source/inc/namecont.hxx b/basic/source/inc/namecont.hxx index 9973ab94e815..4db38ac881a4 100644 --- a/basic/source/inc/namecont.hxx +++ b/basic/source/inc/namecont.hxx @@ -51,19 +51,20 @@ #include <cppuhelper/basemutex.hxx> #include <rtl/ref.hxx> #include <comphelper/interfacecontainer3.hxx> +#include <comphelper/interfacecontainer4.hxx> #include <xmlscript/xmllib_imexp.hxx> class BasicManager; namespace basic { -typedef ::cppu::WeakImplHelper< +typedef ::comphelper::WeakImplHelper< css::container::XNameContainer, css::container::XContainer, css::util::XChangesNotifier > NameContainer_BASE; -class NameContainer final : public ::cppu::BaseMutex, public NameContainer_BASE +class NameContainer final : public NameContainer_BASE { typedef std::unordered_map < OUString, sal_Int32 > NameContainerNameMap; @@ -75,16 +76,14 @@ class NameContainer final : public ::cppu::BaseMutex, public NameContainer_BASE css::uno::Type mType; css::uno::XInterface* mpxEventSource; - ::comphelper::OInterfaceContainerHelper3<css::container::XContainerListener> maContainerListeners; - ::comphelper::OInterfaceContainerHelper3<css::util::XChangesListener> maChangesListeners; + ::comphelper::OInterfaceContainerHelper4<css::container::XContainerListener> maContainerListeners; + ::comphelper::OInterfaceContainerHelper4<css::util::XChangesListener> maChangesListeners; public: NameContainer( const css::uno::Type& rType ) : mnElementCount( 0 ) , mType( rType ) , mpxEventSource( nullptr ) - , maContainerListeners( m_aMutex ) - , maChangesListeners( m_aMutex ) {} void setEventSource( css::uno::XInterface* pxEventSource ) diff --git a/basic/source/uno/namecont.cxx b/basic/source/uno/namecont.cxx index 430cab8b3264..2d1dea85fc67 100644 --- a/basic/source/uno/namecont.cxx +++ b/basic/source/uno/namecont.cxx @@ -156,27 +156,29 @@ void NameContainer::replaceByName( const OUString& aName, const Any& aElement ) mValues[ iHashResult ] = aElement; + std::unique_lock aGuard(m_aMutex); + // Fire event - if( maContainerListeners.getLength() > 0 ) + if( maContainerListeners.getLength(aGuard) > 0 ) { ContainerEvent aEvent; aEvent.Source = mpxEventSource; aEvent.Accessor <<= aName; aEvent.Element = aElement; aEvent.ReplacedElement = aOldElement; - maContainerListeners.notifyEach( &XContainerListener::elementReplaced, aEvent ); + maContainerListeners.notifyEach( aGuard, &XContainerListener::elementReplaced, aEvent ); } /* After the container event has been fired (one listener will update the core Basic manager), fire change event. Listeners can rely on that the Basic source code of the core Basic manager is up-to-date. */ - if( maChangesListeners.getLength() > 0 ) + if( maChangesListeners.getLength(aGuard) > 0 ) { ChangesEvent aEvent; aEvent.Source = mpxEventSource; aEvent.Base <<= aEvent.Source; aEvent.Changes = { { Any(aName), aElement, aOldElement } }; - maChangesListeners.notifyEach( &XChangesListener::changesOccurred, aEvent ); + maChangesListeners.notifyEach( aGuard, &XChangesListener::changesOccurred, aEvent ); } } @@ -205,26 +207,28 @@ void NameContainer::insertNoCheck(const OUString& aName, const Any& aElement) mHashMap[ aName ] = nCount; mnElementCount++; + std::unique_lock aGuard(m_aMutex); + // Fire event - if( maContainerListeners.getLength() > 0 ) + if( maContainerListeners.getLength(aGuard) > 0 ) { ContainerEvent aEvent; aEvent.Source = mpxEventSource; aEvent.Accessor <<= aName; aEvent.Element = aElement; - maContainerListeners.notifyEach( &XContainerListener::elementInserted, aEvent ); + maContainerListeners.notifyEach( aGuard, &XContainerListener::elementInserted, aEvent ); } /* After the container event has been fired (one listener will update the core Basic manager), fire change event. Listeners can rely on that the Basic source code of the core Basic manager is up-to-date. */ - if( maChangesListeners.getLength() > 0 ) + if( maChangesListeners.getLength(aGuard) > 0 ) { ChangesEvent aEvent; aEvent.Source = mpxEventSource; aEvent.Base <<= aEvent.Source; aEvent.Changes = { { Any(aName), aElement, {} } }; - maChangesListeners.notifyEach( &XChangesListener::changesOccurred, aEvent ); + maChangesListeners.notifyEach( aGuard, &XChangesListener::changesOccurred, aEvent ); } } @@ -257,20 +261,22 @@ void NameContainer::removeByName( const OUString& aName ) mValues.resize( iLast ); mnElementCount--; + std::unique_lock aGuard(m_aMutex); + // Fire event - if( maContainerListeners.getLength() > 0 ) + if( maContainerListeners.getLength(aGuard) > 0 ) { ContainerEvent aEvent; aEvent.Source = mpxEventSource; aEvent.Accessor <<= aName; aEvent.Element = aOldElement; - maContainerListeners.notifyEach( &XContainerListener::elementRemoved, aEvent ); + maContainerListeners.notifyEach( aGuard, &XContainerListener::elementRemoved, aEvent ); } /* After the container event has been fired (one listener will update the core Basic manager), fire change event. Listeners can rely on that the Basic source code of the core Basic manager is up-to-date. */ - if( maChangesListeners.getLength() > 0 ) + if( maChangesListeners.getLength(aGuard) > 0 ) { ChangesEvent aEvent; aEvent.Source = mpxEventSource; @@ -278,7 +284,7 @@ void NameContainer::removeByName( const OUString& aName ) aEvent.Changes = { { Any(aName), {}, // Element remains empty (meaning "replaced with nothing") aOldElement } }; - maChangesListeners.notifyEach( &XChangesListener::changesOccurred, aEvent ); + maChangesListeners.notifyEach( aGuard, &XChangesListener::changesOccurred, aEvent ); } } @@ -290,7 +296,8 @@ void SAL_CALL NameContainer::addContainerListener( const Reference< XContainerLi { throw RuntimeException("addContainerListener called with null xListener",getXWeak()); } - maContainerListeners.addInterface( xListener ); + std::unique_lock aGuard(m_aMutex); + maContainerListeners.addInterface( aGuard, xListener ); } void SAL_CALL NameContainer::removeContainerListener( const Reference< XContainerListener >& xListener ) @@ -299,7 +306,8 @@ void SAL_CALL NameContainer::removeContainerListener( const Reference< XContaine { throw RuntimeException("removeContainerListener called with null xListener",getXWeak()); } - maContainerListeners.removeInterface( xListener ); + std::unique_lock aGuard(m_aMutex); + maContainerListeners.removeInterface( aGuard, xListener ); } // Methods XChangesNotifier @@ -309,7 +317,8 @@ void SAL_CALL NameContainer::addChangesListener( const Reference< XChangesListen { throw RuntimeException("addChangesListener called with null xListener",getXWeak()); } - maChangesListeners.addInterface( xListener ); + std::unique_lock aGuard(m_aMutex); + maChangesListeners.addInterface( aGuard, xListener ); } void SAL_CALL NameContainer::removeChangesListener( const Reference< XChangesListener >& xListener ) @@ -318,7 +327,8 @@ void SAL_CALL NameContainer::removeChangesListener( const Reference< XChangesLis { throw RuntimeException("removeChangesListener called with null xListener",getXWeak()); } - maChangesListeners.removeInterface( xListener ); + std::unique_lock aGuard(m_aMutex); + maChangesListeners.removeInterface( aGuard, xListener ); } |