summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--basic/source/inc/namecont.hxx11
-rw-r--r--basic/source/uno/namecont.cxx42
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 );
}