summaryrefslogtreecommitdiff
path: root/configmgr/source/api2/listenercontainer.hxx
diff options
context:
space:
mode:
Diffstat (limited to 'configmgr/source/api2/listenercontainer.hxx')
-rw-r--r--configmgr/source/api2/listenercontainer.hxx584
1 files changed, 0 insertions, 584 deletions
diff --git a/configmgr/source/api2/listenercontainer.hxx b/configmgr/source/api2/listenercontainer.hxx
deleted file mode 100644
index ecc0ebfaa705..000000000000
--- a/configmgr/source/api2/listenercontainer.hxx
+++ /dev/null
@@ -1,584 +0,0 @@
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2008 by Sun Microsystems, Inc.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * $RCSfile: listenercontainer.hxx,v $
- * $Revision: 1.19 $
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-#ifndef CONFIGMGR_API_LISTENERCONTAINER_HXX_
-#define CONFIGMGR_API_LISTENERCONTAINER_HXX_
-
-#include <com/sun/star/lang/XEventListener.hpp>
-#include <com/sun/star/lang/DisposedException.hpp>
-#include <cppuhelper/interfacecontainer.hxx>
-#include "datalock.hxx"
-#include "utility.hxx"
-
-#include <osl/diagnose.h>
-
-namespace configmgr
-{
- namespace configapi
- {
-/////////////////////////////////////////////////////////////////////////////////////////////
-
- namespace css = ::com::sun::star;
- namespace uno = css::uno;
- namespace lang = css::lang;
-//-----------------------------------------------------------------------------
- template <class Listener>
- class ListenerContainerIterator
- {
- public:
- /**
- * Create an iterator over the elements of the container. The iterator
- * copies the elements of the conatainer. A change to the container does not
- * affect the iterator.<BR>
- * Remark: The copy is on demand. The iterator copy the elements only if the container
- * change the contens. It is not allowed to destroy the container if a iterator exist.
- *
- * @param rCont the container of the elements.
- */
- ListenerContainerIterator( cppu::OInterfaceContainerHelper& rCont )
- : m_aIter(rCont)
- , m_xNext()
- { advance(); }
-
- /**
- * Release the connection to the container.
- */
- ~ListenerContainerIterator() {}
-
- /** Return true, if there are more elements in the iterator. */
- sal_Bool hasMoreElements() const { return m_xNext.is() != 0; }
-
- /** Return the next element of the iterator. Call this method if
- * hasMoreElements return false, is an error.
- */
- uno::Reference<Listener> next();
-
- private:
- void advance();
-
- cppu::OInterfaceIteratorHelper m_aIter;
- uno::Reference<Listener> m_xNext;
- };
-//-----------------------------------------------------------------------------
- class DisposeNotifier
- {
- lang::EventObject aEvent;
- std::vector< uno::Reference< lang::XEventListener > > aListeners;
- public:
- explicit
- DisposeNotifier(uno::Reference<uno::XInterface> const& aInterface) : aEvent(aInterface) {}
-
- void appendAndClearContainer(cppu::OInterfaceContainerHelper* pContainer);
- void notify();
- };
-//-----------------------------------------------------------------------------
- struct BasicContainerInfo
- {
- uno::XInterface* pInterface;
- cppu::OMultiTypeInterfaceContainerHelper* pContainer;
- BasicContainerInfo() : pInterface(0), pContainer(0) {}
- };
-
- template <class Key_, class KeyHash_, class KeyEq_, class KeyToIndex_>
- class SpecialListenerContainer
- {
- public:
- /**
- * Create a container of interface containers.
- */
- SpecialListenerContainer(std::vector<BasicContainerInfo>::size_type nCount, KeyToIndex_ aMapper)
- : m_aSpecialHelper(UnoApiLock::getLock())
- , m_aContainers(nCount)
- , m_aMapper(aMapper)
- , m_bDisposeLock(false)
- {}
-
- ~SpecialListenerContainer()
- {
- OSL_ENSURE(isDisposed(), "ERROR: Object was not disposed properly");
- }
- public:
- /**
- * check whether this is disposed or still alive
- * @param pObject
- * an interface on the object on which's behalf the operation was started
- * @return <FALSE/>
- * if the object is being disposed
- * @throw com::sun::star::lang::DisposedException
- * if the object was disposed completely
- */
- bool checkAlive(uno::XInterface* pObject = 0) volatile const throw(lang::DisposedException);
-
- /// return whether the object is completely alive
- bool isAlive() volatile const throw();
- /// return whether the object is currently being disposed
- bool isDisposing()volatile const throw();
- /// return whether the object is completely disposed
- bool isDisposed()volatile const throw();
-
- /// return whether the object is present in this container
- bool isAvailable(std::vector<BasicContainerInfo>::size_type nIndex) const throw()
- {
- return nIndex < m_aContainers.size() && m_aContainers[nIndex].pInterface;
- }
-
- std::vector<BasicContainerInfo>::size_type getSize() const
- {
- return m_aContainers.size();
- }
-
- /// return the interface associated with an index
- void setObjectAt(std::vector<BasicContainerInfo>::size_type nIndex, uno::XInterface* pInterface)
- {
- OSL_ENSURE( !isDisposed(), "object is disposed" );
-
- if (isAlive())
- {
- OSL_ENSURE( nIndex < m_aContainers.size(), " Invalid Index into Notifier");
- OSL_ENSURE( pInterface, "Invalid NULL Interface passed into Notifier");
-
- if ( nIndex < m_aContainers.size() && pInterface != NULL)
- {
- OSL_ENSURE( m_aContainers[nIndex].pInterface == NULL, "Interface already set");
- if (m_aContainers[nIndex].pInterface == NULL)
- m_aContainers[nIndex].pInterface = pInterface;
- }
- }
- }
-
-
- /// return the interface associated with an index
- uno::Reference<uno::XInterface> getObjectAt(std::vector<BasicContainerInfo>::size_type nIndex) const
- {
- uno::Reference<uno::XInterface> xRet( nIndex < m_aContainers.size() ? m_aContainers[nIndex].pInterface : 0 );
- return xRet;
- }
-
- /// return the interface associated with an index
- uno::Reference<uno::XInterface> getObjectForKey(Key_ const& aKey ) const
- {
- std::vector<BasicContainerInfo>::size_type nIndex = m_aMapper.findIndexForKey(aKey);
- uno::Reference<uno::XInterface> xRet( nIndex < m_aContainers.size() ? m_aContainers[nIndex].pInterface : 0 );
- return xRet;
- }
-
- /**
- * Call disposing on all object in all the container for anIndex
- * and in the containers for the associated indices
- * support XEventListener. Then clear the container.
- */
- bool disposeOne( std::vector<BasicContainerInfo>::size_type anIndex ) throw();
-
- /**
- * Start disposing this object
- * @return <TRUE/>
- * if disposing has been started
- * @return <FALSE/>
- * if disposing had already been started before
- */
- bool beginDisposing() throw();
- /**
- * Continue disposing this object
- * <p> Call disposing on all object in all the containers that
- * support XEventListener. Then clear the container.
- * </p>
- * @return <TRUE/>
- * if disposing has been started
- * @return <FALSE/>
- * if disposing had already been started before
- */
- void notifyDisposing() throw();
-
- /// mark the end of the dispose processing
- void endDisposing() throw();
-
- public:
- /**
- * Return the specuial container created under this key.
- * @return the container created under this key. If the container
- * was not created, null was returned.
- */
- cppu::OInterfaceContainerHelper * getSpecialContainer( const Key_ & aKey) const
- { return m_aSpecialHelper.aLC.getContainer(aKey); }
-
- /**
- * Return the containerhelper created under this index.
- * @return the container helper created under this key. If the container helper
- * was not created, null was returned.
- */
- cppu::OMultiTypeInterfaceContainerHelper * getContainerHelper( std::vector<BasicContainerInfo>::size_type nIndex) const
- {
- return ((nIndex < m_aContainers.size()) ? m_aContainers[nIndex].pContainer : 0 );
- }
- /**
- * Return the container for the given type created under this index.
- * @return the container created under this key. If the container
- * was not created, null was returned.
- */
- cppu::OInterfaceContainerHelper * getContainer( std::vector<BasicContainerInfo>::size_type nIndex, const uno::Type & aType) const
- {
- cppu::OMultiTypeInterfaceContainerHelper* pContainer = (nIndex < m_aContainers.size()) ? m_aContainers[nIndex].pContainer : 0 ;
-
- return pContainer ? pContainer->getContainer(aType) : 0;
- }
-
- /**
- * Insert an element in the container specified with the index and type. The position is not specified.
- * The interface at the given index must be set already.
- * @param aKey the id of the container.
- * @param xListener the added interface. It is allowed to insert null or
- * the same pointer more than once.
- * @return the new count of elements in the container (or 0 if the object is ready being disposed).
- */
- sal_Int32 addListener( std::vector<BasicContainerInfo>::size_type nIndex, const uno::Type& aType, uno::Reference< lang::XEventListener > const& xListener) throw();
-
- /**
- * Remove an element from the container specified with the index and type.
- * It uses the equal definition of uno objects to remove the interfaces.
- * @param aKey the id of the container.
- * @param xListener the removed interface.
- * @return the new count of elements in the container (or 0 if the object is ready being disposed).
- */
- sal_Int32 removeListener( std::vector<BasicContainerInfo>::size_type nIndex, const uno::Type& aType, uno::Reference< lang::XEventListener > const& xListener) throw();
-
-
- /**
- * Insert an element in the special container specified with the key. The position is not specified.
- * The interface at the given index must be set already.
- * @param aKey the id of the container.
- * @param xListener the added interface. It is allowed to insert null or
- * the same pointer more than once.
- * @return the new count of elements in the container (or 0 if the object is ready being disposed).
- */
- sal_Int32 addSpecialListener( const Key_& aKey, uno::Reference< lang::XEventListener > const& xListener) throw();
-
- /**
- * Remove an element from the container specified with the key.
- * It uses the equal definition of uno objects to remove the interfaces.
- * @param aKey the id of the container.
- * @param xListener the removed interface.
- * @return the new count of elements in the container (or 0 if the object is ready being disposed).
- */
- sal_Int32 removeSpecialListener( const Key_& aKey, uno::Reference< lang::XEventListener > const& xListener) throw();
-
- private:
- void implFillDisposer(DisposeNotifier& aNotifier, std::vector<BasicContainerInfo>::size_type nIndex);
-
- cppu::OBroadcastHelperVar< cppu::OMultiTypeInterfaceContainerHelperVar< Key_,KeyHash_,KeyEq_ >, Key_ > m_aSpecialHelper;
- std::vector<BasicContainerInfo> m_aContainers;
- KeyToIndex_ m_aMapper;
- bool m_bDisposeLock;
- };
-//-----------------------------------------------------------------------------
-
-/////////////////////////////////////////////////////////////////////////////////////////////
- template <class Key_, class KeyHash_, class KeyEq_, class KeyToIndex_>
- bool SpecialListenerContainer<Key_,KeyHash_,KeyEq_, KeyToIndex_>::checkAlive(uno::XInterface* pObject) volatile const throw(lang::DisposedException)
- {
- bool bAlive = !m_aSpecialHelper.bInDispose;
- if (m_aSpecialHelper.bDisposed)
- {
- throw lang::DisposedException(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("The object has already been disposed")),pObject);
- }
- return bAlive;
- }
-//-----------------------------------------------------------------------------
- template <class Key_, class KeyHash_, class KeyEq_, class KeyToIndex_>
- inline
- bool SpecialListenerContainer<Key_,KeyHash_,KeyEq_, KeyToIndex_>::isAlive() volatile const throw()
- {
- return !m_aSpecialHelper.bInDispose && !m_aSpecialHelper.bDisposed;
- }
-//-----------------------------------------------------------------------------
- template <class Key_, class KeyHash_, class KeyEq_, class KeyToIndex_>
- inline
- bool SpecialListenerContainer<Key_,KeyHash_,KeyEq_, KeyToIndex_>::isDisposing() volatile const throw()
- {
- return !!m_aSpecialHelper.bInDispose;
- }
-//-----------------------------------------------------------------------------
- template <class Key_, class KeyHash_, class KeyEq_, class KeyToIndex_>
- inline
- bool SpecialListenerContainer<Key_,KeyHash_,KeyEq_, KeyToIndex_>::isDisposed() volatile const throw()
- {
- return !!m_aSpecialHelper.bDisposed;
- }
-//-----------------------------------------------------------------------------
- template <class Key_, class KeyHash_, class KeyEq_, class KeyToIndex_>
- bool SpecialListenerContainer<Key_,KeyHash_,KeyEq_, KeyToIndex_>::disposeOne(std::vector<BasicContainerInfo>::size_type nIndex) throw()
- {
- // OSL_ENSURE(!isDisposed(),"Object is already disposed in toto");
- if (isAlive())
- {
- if (nIndex < m_aContainers.size())
- {
- if (uno::XInterface* pObject = m_aContainers[nIndex].pInterface)
- {
- DisposeNotifier aNotifier(pObject);
-
- implFillDisposer(aNotifier, nIndex);
- m_aContainers[nIndex].pInterface = 0;
- delete m_aContainers[nIndex].pContainer;
-
- aNotifier.notify();
- }
- }
- return true;
- }
- else
- return false;
- }
-//-----------------------------------------------------------------------------
- template <class Key_, class KeyHash_, class KeyEq_, class KeyToIndex_>
- bool SpecialListenerContainer<Key_,KeyHash_,KeyEq_, KeyToIndex_>::beginDisposing() throw()
- {
- if (isAlive())
- {
- m_aSpecialHelper.bInDispose = sal_True;
- m_bDisposeLock = true;
-
- return true;
- }
- return false;
- }
-//-----------------------------------------------------------------------------
- template <class Key_, class KeyHash_, class KeyEq_, class KeyToIndex_>
- void SpecialListenerContainer<Key_,KeyHash_,KeyEq_, KeyToIndex_>::notifyDisposing() throw()
- {
- OSL_ENSURE(isDisposing(),"Disposing isn't in progress on this object");
- OSL_ENSURE(m_bDisposeLock,"Duplicate call for dispose notification or disposing is not taking place");
-
- if (m_bDisposeLock)
- {
- OSL_ASSERT(m_aSpecialHelper.bInDispose);
-
- lang::EventObject aBaseEvt;
- std::vector<DisposeNotifier> aNotifiers;
-
- if (std::vector<BasicContainerInfo>::size_type size = m_aContainers.size())
- {
- aNotifiers.reserve(m_aContainers.size());
-
- aBaseEvt.Source = m_aContainers[0].pInterface;
- for(std::vector<BasicContainerInfo>::size_type ix = 0; ix < size; ++ix)
- {
- if (m_aContainers[ix].pInterface)
- {
- aNotifiers.push_back(DisposeNotifier(m_aContainers[ix].pInterface));
- implFillDisposer(aNotifiers.back(), ix);
- m_aContainers[ix].pInterface = 0;
- delete m_aContainers[ix].pContainer;
- }
- }
- }
-
- m_bDisposeLock = false;
-
- for(std::vector<BasicContainerInfo>::size_type jx = 0, count = aNotifiers.size(); jx < count; ++jx)
- {
- aNotifiers[jx].notify();
- }
- // in case we missed something
- m_aSpecialHelper.aLC.disposeAndClear( aBaseEvt );
- }
- }
-//-----------------------------------------------------------------------------
- template <class Key_, class KeyHash_, class KeyEq_, class KeyToIndex_>
- void SpecialListenerContainer<Key_,KeyHash_,KeyEq_, KeyToIndex_>::endDisposing() throw()
- {
- OSL_ENSURE(isDisposing(),"Disposing isn't in progress on this object");
-
- if (!isAlive())
- {
- OSL_ENSURE(!m_bDisposeLock,"Did you forget to notify ?");
-
- m_aSpecialHelper.bDisposed = sal_True;
- m_aSpecialHelper.bInDispose = sal_False;
-
- if (m_bDisposeLock)
- {
- m_bDisposeLock = false;
- }
- }
- }
-//-----------------------------------------------------------------------------
- template <class Key_, class KeyHash_, class KeyEq_, class KeyToIndex_>
- sal_Int32 SpecialListenerContainer<Key_,KeyHash_,KeyEq_, KeyToIndex_>::addListener( std::vector<BasicContainerInfo>::size_type nIndex, const uno::Type& aType, const uno::Reference< lang::XEventListener > & xListener ) throw()
- {
- if ( nIndex < m_aContainers.size() && m_aContainers[nIndex].pInterface )
- {
- if ( isAlive() )
- {
- if (m_aContainers[nIndex].pContainer == 0)
- m_aContainers[nIndex].pContainer = new cppu::OMultiTypeInterfaceContainerHelper(UnoApiLock::getLock());
-
- return m_aContainers[nIndex].pContainer->addInterface(aType,xListener);
- }
-
- else if (xListener.is())
- {
- lang::EventObject aEvent(m_aContainers[nIndex].pInterface);
- try { xListener->disposing(aEvent); } catch (uno::Exception & ) {}
- }
-
- }
- else
- OSL_ENSURE(false, "Invalid index or interface not set");
-
- return 0;
- }
-//-----------------------------------------------------------------------------
- template <class Key_, class KeyHash_, class KeyEq_, class KeyToIndex_>
- sal_Int32 SpecialListenerContainer<Key_,KeyHash_,KeyEq_, KeyToIndex_>::addSpecialListener( const Key_& aKey, const uno::Reference< lang::XEventListener > & xListener ) throw()
- {
- std::vector<BasicContainerInfo>::size_type nIndex = m_aMapper.findIndexForKey(aKey);
- if ( nIndex < m_aContainers.size() && m_aContainers[nIndex].pInterface )
- {
- if ( isAlive() )
- {
- return m_aSpecialHelper.aLC.addInterface(aKey,xListener);
- }
-
- else if (xListener.is())
- {
- lang::EventObject aEvent(m_aContainers[nIndex].pInterface);
- try { xListener->disposing(aEvent); } catch (uno::Exception & ) {}
- }
- }
- else
- OSL_ENSURE(false, "Invalid index or interface not set");
-
- return 0;
- }
-//-----------------------------------------------------------------------------
-
- template <class Key_, class KeyHash_, class KeyEq_, class KeyToIndex_>
- sal_Int32 SpecialListenerContainer<Key_,KeyHash_,KeyEq_, KeyToIndex_>::removeListener( std::vector<BasicContainerInfo>::size_type nIndex, const uno::Type& aType, const uno::Reference< lang::XEventListener > & xListener ) throw()
- {
- OSL_ENSURE( !isDisposed(), "object is disposed" );
-
- if ( isAlive() )
- {
- if ( nIndex < m_aContainers.size() && m_aContainers[nIndex].pContainer )
- {
- return m_aContainers[nIndex].pContainer->removeInterface(aType,xListener);
- }
- }
- return 0;
- }
-//-----------------------------------------------------------------------------
-
- template <class Key_, class KeyHash_, class KeyEq_, class KeyToIndex_>
- sal_Int32 SpecialListenerContainer<Key_,KeyHash_,KeyEq_, KeyToIndex_>::removeSpecialListener( const Key_& aKey, const uno::Reference< lang::XEventListener > & xListener ) throw()
- {
- OSL_ENSURE( !isDisposed(), "object is disposed" );
-
- if ( isAlive() )
- return m_aSpecialHelper.aLC.removeInterface(aKey, xListener );
-
- else
- return 0;
- }
-//-----------------------------------------------------------------------------
- // relation function. Uses KeyToIndex
-/* template <class Key_, class KeyHash_, class KeyEq_, class KeyToIndex_>
- SpecialListenerContainer<Key_,KeyHash_,KeyEq_, KeyToIndex_>::Index
- SpecialListenerContainer<Key_,KeyHash_,KeyEq_, KeyToIndex_>::findIndexForKey(Key const& aKey)
- {
- m_aMapper.findIndexForKey(aKey);
- }
-//-----------------------------------------------------------------------------
- // relation function. Uses KeyToIndex
- template <class Key_, class KeyHash_, class KeyEq_, class KeyToIndex_>
- bool SpecialListenerContainer<Key_,KeyHash_,KeyEq_, KeyToIndex_>::findKeysForIndex(std::vector<BasicContainerInfo>::size_type nIndex, std::vector<Key_> & aKeys)
- {
- aKeys.clear();
- m_aMapper.findKeysForIndex(nIndex,aKeys);
- return !aKeys.empty();
- }
-*///-----------------------------------------------------------------------------
- // relation function. Uses KeyToIndex
- template <class Key_, class KeyHash_, class KeyEq_, class KeyToIndex_>
- void SpecialListenerContainer<Key_,KeyHash_,KeyEq_, KeyToIndex_>::implFillDisposer(DisposeNotifier& aNotifier, std::vector<BasicContainerInfo>::size_type nIndex)
- {
- if (cppu::OMultiTypeInterfaceContainerHelper* pMultiContainer = m_aContainers[nIndex].pContainer)
- {
- uno::Sequence< uno::Type > aTypes(pMultiContainer->getContainedTypes());
- for (sal_Int32 ix = 0; ix < aTypes.getLength(); ++ix)
- {
- cppu::OInterfaceContainerHelper* pContainer = pMultiContainer->getContainer(aTypes[ix]);
- OSL_ENSURE(pContainer,"No container, but the type ?");
- if (pContainer)
- aNotifier.appendAndClearContainer(pContainer);
- }
- }
- std::vector<Key_> aKeys;
- if (m_aMapper.findKeysForIndex(nIndex,aKeys))
- {
- for(typename std::vector<Key_>::iterator it = aKeys.begin(); it != aKeys.end(); ++it)
- {
- if (cppu::OInterfaceContainerHelper* pContainer = m_aSpecialHelper.aLC.getContainer(*it))
- {
- aNotifier.appendAndClearContainer(pContainer);
- }
- }
- }
- }
-//-----------------------------------------------------------------------------
-
-/////////////////////////////////////////////////////////////////////////////////////////////
-
- template <class Listener>
- inline
- void ListenerContainerIterator<Listener>::advance()
- {
- while (!m_xNext.is() && m_aIter.hasMoreElements())
- {
- m_xNext = m_xNext.query( m_aIter.next() );
- }
- }
-//-----------------------------------------------------------------------------
-
- template <class Listener>
- uno::Reference<Listener> ListenerContainerIterator<Listener>::next()
- {
- uno::Reference<Listener> xRet(m_xNext);
- m_xNext.clear();
- advance();
- return xRet;
- }
-//-----------------------------------------------------------------------------
-
-/////////////////////////////////////////////////////////////////////////////////////////////
- }
-}
-#endif // CONFIGMGR_API_LISTENERCONTAINER_HXX_
-
-