summaryrefslogtreecommitdiff
path: root/cppuhelper/inc/cppuhelper/interfacecontainer.h
diff options
context:
space:
mode:
Diffstat (limited to 'cppuhelper/inc/cppuhelper/interfacecontainer.h')
-rw-r--r--cppuhelper/inc/cppuhelper/interfacecontainer.h607
1 files changed, 0 insertions, 607 deletions
diff --git a/cppuhelper/inc/cppuhelper/interfacecontainer.h b/cppuhelper/inc/cppuhelper/interfacecontainer.h
deleted file mode 100644
index 774f900a8b26..000000000000
--- a/cppuhelper/inc/cppuhelper/interfacecontainer.h
+++ /dev/null
@@ -1,607 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*
- * This file is part of the LibreOffice project.
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- * This file incorporates work covered by the following license notice:
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed
- * with this work for additional information regarding copyright
- * ownership. The ASF licenses this file to you under the Apache
- * License, Version 2.0 (the "License"); you may not use this file
- * except in compliance with the License. You may obtain a copy of
- * the License at http://www.apache.org/licenses/LICENSE-2.0 .
- */
-#ifndef _CPPUHELPER_INTERFACECONTAINER_H_
-#define _CPPUHELPER_INTERFACECONTAINER_H_
-
-#include <vector>
-#include <osl/mutex.hxx>
-#include <rtl/alloc.h>
-#include <com/sun/star/uno/Sequence.hxx>
-#include <com/sun/star/uno/XInterface.hpp>
-#include <com/sun/star/lang/EventObject.hpp>
-
-#include "com/sun/star/lang/DisposedException.hpp"
-#include "cppuhelperdllapi.h"
-
-/** */ //for docpp
-namespace cppu
-{
-
-namespace detail {
-
- union element_alias
- {
- ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > > *pAsSequence;
- ::com::sun::star::uno::XInterface * pAsInterface;
- element_alias() : pAsInterface(0) {}
- };
-
-}
-
-//===================================================================
-class OInterfaceContainerHelper;
-/**
- This is the iterator of a InterfaceContainerHelper. Typically
- one constructs an instance on the stack for one firing session.
- It is not allowed to assign or copy an instance of this class.
-
- @see OInterfaceContainerHelper
- */
-class CPPUHELPER_DLLPUBLIC OInterfaceIteratorHelper
-{
-public:
- /**
- Create an iterator over the elements of the container. The iterator
- copies the elements of the conatainer. A change to the container
- during the lifetime of an iterator is allowed and does not
- affect the iterator-instance. The iterator and the container take cares
- themself for concurrent access, no additional guarding is necessary.
-
- Remark: The copy is on demand. The iterator copy the elements only if the container
- change the contents. It is not allowed to destroy the container as long
- as an iterator exist.
-
- @param rCont the container of the elements.
- */
- OInterfaceIteratorHelper( OInterfaceContainerHelper & rCont ) SAL_THROW(());
-
- /**
- Releases the connection to the container.
- */
- ~OInterfaceIteratorHelper() SAL_THROW(());
-
- /** Return sal_True, if there are more elements in the iterator. */
- sal_Bool SAL_CALL hasMoreElements() const SAL_THROW(())
- { return nRemain != 0; }
- /** Return the next element of the iterator. Calling this method if
- hasMoreElements() has returned sal_False, is an error. Cast the
- returned pointer to the
- */
- ::com::sun::star::uno::XInterface * SAL_CALL next() SAL_THROW(());
-
- /** Removes the current element (the last one returned by next())
- from the underlying container. Calling this method before
- next() has been called or calling it twice with no next()
- inbetween is an error.
- */
- void SAL_CALL remove() SAL_THROW(());
-
-private:
- OInterfaceContainerHelper & rCont;
- sal_Bool bIsList;
-
- detail::element_alias aData;
-
- sal_Int32 nRemain;
-
- OInterfaceIteratorHelper( const OInterfaceIteratorHelper & ) SAL_THROW(());
- OInterfaceIteratorHelper & operator = ( const OInterfaceIteratorHelper & ) SAL_THROW(());
-};
-
-//===================================================================
-/**
- A container of interfaces. To access the elements use an iterator.
- This implementation is thread save.
-
- @see OInterfaceIteratorHelper
- */
-class CPPUHELPER_DLLPUBLIC OInterfaceContainerHelper
-{
-public:
- // these are here to force memory de/allocation to sal lib.
- inline static void * SAL_CALL operator new( size_t nSize ) SAL_THROW(())
- { return ::rtl_allocateMemory( nSize ); }
- inline static void SAL_CALL operator delete( void * pMem ) SAL_THROW(())
- { ::rtl_freeMemory( pMem ); }
- inline static void * SAL_CALL operator new( size_t, void * pMem ) SAL_THROW(())
- { return pMem; }
- inline static void SAL_CALL operator delete( void *, void * ) SAL_THROW(())
- {}
-
- /**
- Create an interface container.
-
- @param rMutex the mutex to protect multi thread access.
- The lifetime must be longer than the lifetime
- of this object.
- */
- OInterfaceContainerHelper( ::osl::Mutex & rMutex ) SAL_THROW(());
- /**
- Release all interfaces. All iterators must be destroyed before
- the container is destructed.
- */
- ~OInterfaceContainerHelper() SAL_THROW(());
- /**
- Return the number of Elements in the container. Only useful if you have acquired
- the mutex.
- */
- sal_Int32 SAL_CALL getLength() const SAL_THROW(());
-
- /**
- Return all interfaces added to this container.
- **/
- ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > > SAL_CALL getElements() const SAL_THROW(());
-
- /** Inserts an element into the container. The position is not specified, thus it is not
- specified in which order events are fired.
-
- @attention
- If you add the same interface more than once, then it will be added to the elements list
- more than once and thus if you want to remove that interface from the list, you have to call
- removeInterface() the same number of times.
- In the latter case, you will also get events fired more than once (if the interface is a
- listener interface).
-
- @param rxIFace
- interface to be added; it is allowed to insert null or
- the same interface more than once
- @return
- the new count of elements in the container
- */
- sal_Int32 SAL_CALL addInterface( const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > & rxIFace ) SAL_THROW(());
- /** Removes an element from the container. It uses interface equality to remove the interface.
-
- @param rxIFace
- interface to be removed
- @return
- the new count of elements in the container
- */
- sal_Int32 SAL_CALL removeInterface( const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > & rxIFace ) SAL_THROW(());
- /**
- Call disposing on all object in the container that
- support XEventListener. Than clear the container.
- */
- void SAL_CALL disposeAndClear( const ::com::sun::star::lang::EventObject & rEvt ) SAL_THROW(());
- /**
- Clears the container without calling disposing().
- */
- void SAL_CALL clear() SAL_THROW(());
-
- /** Executes a functor for each contained listener of specified type, e.g.
- <code>forEach<awt::XPaintListener>(...</code>.
-
- If a com::sun::star::lang::DisposedException occurs which relates to
- the called listener, then that listener is removed from the container.
-
- @tparam ListenerT listener type
- @tparam FuncT unary functor type, let your compiler deduce this for you
- @param func unary functor object expecting an argument of type
- com::sun::star::uno::Reference<ListenerT>
- */
- template <typename ListenerT, typename FuncT>
- inline void forEach( FuncT const& func );
-
- /** Calls a UNO listener method for each contained listener.
-
- The listener method must take a single argument of type EventT,
- and return <code>void</code>.
-
- If a com::sun::star::lang::DisposedException occurs which relates to
- the called listener, then that listener is removed from the container.
-
- @tparam ListenerT UNO event listener type, let your compiler deduce this for you
- @tparam EventT event type, let your compiler deduce this for you
- @param NotificationMethod
- Pointer to a method of a ListenerT interface.
- @param Event
- Event to notify to all contained listeners
-
- Example:
-@code
- awt::PaintEvent aEvent( static_cast< cppu::OWeakObject* >( this ), ... );
- listeners.notifyEach( &XPaintListener::windowPaint, aEvent );
-@endcode
- */
- template< typename ListenerT, typename EventT >
- inline void notifyEach( void ( SAL_CALL ListenerT::*NotificationMethod )( const EventT& ), const EventT& Event );
-
-private:
-friend class OInterfaceIteratorHelper;
- /**
- bIsList == TRUE -> aData.pAsSequence of type Sequence< XInterfaceSequence >,
- otherwise aData.pAsInterface == of type (XEventListener *)
- */
- detail::element_alias aData;
- ::osl::Mutex & rMutex;
- /** TRUE -> used by an iterator. */
- sal_Bool bInUse;
- /** TRUE -> aData.pAsSequence is of type Sequence< XInterfaceSequence >. */
- sal_Bool bIsList;
-
- OInterfaceContainerHelper( const OInterfaceContainerHelper & ) SAL_THROW(());
- OInterfaceContainerHelper & operator = ( const OInterfaceContainerHelper & ) SAL_THROW(());
-
- /*
- Dulicate content of the conaitner and release the old one without destroying.
- The mutex must be locked and the memberbInUse must be true.
- */
- void copyAndResetInUse() SAL_THROW(());
-
-private:
- template< typename ListenerT, typename EventT >
- class NotifySingleListener
- {
- private:
- typedef void ( SAL_CALL ListenerT::*NotificationMethod )( const EventT& );
- NotificationMethod m_pMethod;
- const EventT& m_rEvent;
- public:
- NotifySingleListener( NotificationMethod method, const EventT& event ) : m_pMethod( method ), m_rEvent( event ) { }
-
- void operator()( const ::com::sun::star::uno::Reference<ListenerT>& listener ) const
- {
- (listener.get()->*m_pMethod)( m_rEvent );
- }
- };
-};
-
-template <typename ListenerT, typename FuncT>
-inline void OInterfaceContainerHelper::forEach( FuncT const& func )
-{
- OInterfaceIteratorHelper iter( *this );
- while (iter.hasMoreElements()) {
- ::com::sun::star::uno::Reference<ListenerT> const xListener(
- iter.next(), ::com::sun::star::uno::UNO_QUERY );
- if (xListener.is()) {
-#if defined(EXCEPTIONS_OFF)
- func( xListener );
-#else
- try {
- func( xListener );
- }
- catch (::com::sun::star::lang::DisposedException const& exc) {
- if (exc.Context == xListener)
- iter.remove();
- }
-#endif
- }
- }
-}
-
-template< typename ListenerT, typename EventT >
-inline void OInterfaceContainerHelper::notifyEach( void ( SAL_CALL ListenerT::*NotificationMethod )( const EventT& ), const EventT& Event )
-{
- forEach< ListenerT, NotifySingleListener< ListenerT, EventT > >( NotifySingleListener< ListenerT, EventT >( NotificationMethod, Event ) );
-}
-
-//===================================================================
-/**
- A helper class to store interface references of different types.
-
- @see OInterfaceIteratorHelper
- @see OInterfaceContainerHelper
- */
-template< class key , class hashImpl , class equalImpl >
-class OMultiTypeInterfaceContainerHelperVar
-{
-public:
- // these are here to force memory de/allocation to sal lib.
- inline static void * SAL_CALL operator new( size_t nSize ) SAL_THROW(())
- { return ::rtl_allocateMemory( nSize ); }
- inline static void SAL_CALL operator delete( void * pMem ) SAL_THROW(())
- { ::rtl_freeMemory( pMem ); }
- inline static void * SAL_CALL operator new( size_t, void * pMem ) SAL_THROW(())
- { return pMem; }
- inline static void SAL_CALL operator delete( void *, void * ) SAL_THROW(())
- {}
-
- /**
- Create a container of interface containers.
-
- @param rMutex the mutex to protect multi thread access.
- The lifetime must be longer than the lifetime
- of this object.
- */
- inline OMultiTypeInterfaceContainerHelperVar( ::osl::Mutex & rMutex ) SAL_THROW(());
- /**
- Deletes all containers.
- */
- inline ~OMultiTypeInterfaceContainerHelperVar() SAL_THROW(());
-
- /**
- Return all id's under which at least one interface is added.
- */
- inline ::com::sun::star::uno::Sequence< key > SAL_CALL getContainedTypes() const SAL_THROW(());
-
- /**
- Return the container created under this key.
- The InterfaceContainerHelper exists until the whole MultiTypeContainer is destroyed.
- @return the container created under this key. If the container
- was not created, null was returned.
- */
- inline OInterfaceContainerHelper * SAL_CALL getContainer( const key & ) const SAL_THROW(());
-
- /** Inserts an element into the container with the specified key.
- The position is not specified, thus it is not specified in which order events are fired.
-
- @attention
- If you add the same interface more than once, then it will be added to the elements list
- more than once and thus if you want to remove that interface from the list, you have to call
- removeInterface() the same number of times.
- In the latter case, you will also get events fired more than once (if the interface is a
- listener interface).
-
- @param rKey
- the id of the container
- @param r
- interface to be added; it is allowed, to insert null or
- the same interface more than once
- @return
- the new count of elements in the container
- */
- inline sal_Int32 SAL_CALL addInterface(
- const key & rKey,
- const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > & r )
- SAL_THROW(());
-
- /** Removes an element from the container with the specified key.
- It uses interface equality to remove the interface.
-
- @param rKey
- the id of the container
- @param rxIFace
- interface to be removed
- @return
- the new count of elements in the container
- */
- inline sal_Int32 SAL_CALL removeInterface(
- const key & rKey,
- const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > & rxIFace )
- SAL_THROW(());
-
- /**
- Call disposing on all references in the container, that
- support XEventListener. Then clears the container.
- @param rEvt the event object which is passed during disposing() call
- */
- inline void SAL_CALL disposeAndClear( const ::com::sun::star::lang::EventObject & rEvt ) SAL_THROW(());
- /**
- Remove all elements of all containers. Does not delete the container.
- */
- inline void SAL_CALL clear() SAL_THROW(());
-
- typedef key keyType;
-private:
- typedef ::std::vector< std::pair < key , void* > > InterfaceMap;
- InterfaceMap *m_pMap;
- ::osl::Mutex & rMutex;
-
- inline typename InterfaceMap::iterator find(const key &rKey) const
- {
- typename InterfaceMap::iterator iter = m_pMap->begin();
- typename InterfaceMap::iterator end = m_pMap->end();
-
- while( iter != end )
- {
- equalImpl equal;
- if( equal( iter->first, rKey ) )
- break;
- iter++;
- }
- return iter;
- }
-
- inline OMultiTypeInterfaceContainerHelperVar( const OMultiTypeInterfaceContainerHelperVar & ) SAL_THROW(());
- inline OMultiTypeInterfaceContainerHelperVar & operator = ( const OMultiTypeInterfaceContainerHelperVar & ) SAL_THROW(());
-};
-
-
-
-
-/**
- This struct contains the standard variables of a broadcaster. Helper
- classes only know a reference to this struct instead of references
- to the four members. The access to the members must be guarded with
- rMutex.
-
- The additional template parameter keyType has been added, because gcc
- can't compile addListener( const container::keyType &key ).
- */
-template < class container , class keyType >
-struct OBroadcastHelperVar
-{
- /** The shared mutex. */
- ::osl::Mutex & rMutex;
- /** ListenerContainer class is thread safe. */
- container aLC;
- /** Dispose call ready. */
- sal_Bool bDisposed;
- /** In dispose call. */
- sal_Bool bInDispose;
-
- /**
- Initialize the structur. bDispose and bInDispose are set to false.
- @param rMutex_ the mutex reference.
- */
- OBroadcastHelperVar( ::osl::Mutex & rMutex_ ) SAL_THROW(())
- : rMutex( rMutex_ )
- , aLC( rMutex_ )
- , bDisposed( sal_False )
- , bInDispose( sal_False )
- {}
-
- /**
- adds a listener threadsafe.
- **/
- inline void addListener(
- const keyType &key,
- const ::com::sun::star::uno::Reference < ::com::sun::star::uno::XInterface > &r )
- SAL_THROW(())
- {
- ::osl::MutexGuard guard( rMutex );
- OSL_ENSURE( !bInDispose, "do not add listeners in the dispose call" );
- OSL_ENSURE( !bDisposed, "object is disposed" );
- if( ! bInDispose && ! bDisposed )
- aLC.addInterface( key , r );
- }
-
- /**
- removes a listener threadsafe
- **/
- inline void removeListener(
- const keyType &key,
- const ::com::sun::star::uno::Reference < ::com::sun::star::uno::XInterface > & r )
- SAL_THROW(())
- {
- ::osl::MutexGuard guard( rMutex );
- OSL_ENSURE( !bDisposed, "object is disposed" );
- if( ! bInDispose && ! bDisposed )
- aLC.removeInterface( key , r );
- }
-
- /**
- Return the container created under this key.
- @return the container created under this key. If the container
- was not created, null was returned. This can be used to optimize
- performance ( construction of an event object can be avoided ).
- ***/
- inline OInterfaceContainerHelper * SAL_CALL getContainer( const keyType &key ) const SAL_THROW(())
- { return aLC.getContainer( key ); }
-};
-
-/*------------------------------------------
-*
-* In general, the above templates are used with a Type as key.
-* Therefore a default declaration is given ( OMultiTypeInterfaceContainerHelper and OBroadcastHelper )
-*
-*------------------------------------------*/
-
-// helper function call class
-struct hashType_Impl
-{
- size_t operator()(const ::com::sun::star::uno::Type & s) const SAL_THROW(())
- { return (size_t) s.getTypeName().hashCode(); }
-};
-
-
-/** Specialized class for key type com::sun::star::uno::Type,
- without explicit usage of STL symbols.
-*/
-class CPPUHELPER_DLLPUBLIC OMultiTypeInterfaceContainerHelper
-{
-public:
- // these are here to force memory de/allocation to sal lib.
- inline static void * SAL_CALL operator new( size_t nSize ) SAL_THROW(())
- { return ::rtl_allocateMemory( nSize ); }
- inline static void SAL_CALL operator delete( void * pMem ) SAL_THROW(())
- { ::rtl_freeMemory( pMem ); }
- inline static void * SAL_CALL operator new( size_t, void * pMem ) SAL_THROW(())
- { return pMem; }
- inline static void SAL_CALL operator delete( void *, void * ) SAL_THROW(())
- {}
-
- /**
- Create a container of interface containers.
-
- @param rMutex the mutex to protect multi thread access.
- The lifetime must be longer than the lifetime
- of this object.
- */
- OMultiTypeInterfaceContainerHelper( ::osl::Mutex & rMutex ) SAL_THROW(());
- /**
- Delete all containers.
- */
- ~OMultiTypeInterfaceContainerHelper() SAL_THROW(());
-
- /**
- Return all id's under which at least one interface is added.
- */
- ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > SAL_CALL getContainedTypes() const SAL_THROW(());
-
- /**
- Return the container created under this key.
- @return the container created under this key. If the container
- was not created, null was returned.
- */
- OInterfaceContainerHelper * SAL_CALL getContainer( const ::com::sun::star::uno::Type & rKey ) const SAL_THROW(());
-
- /** Inserts an element into the container with the specified key.
- The position is not specified, thus it is not specified in which order events are fired.
-
- @attention
- If you add the same interface more than once, then it will be added to the elements list
- more than once and thus if you want to remove that interface from the list, you have to call
- removeInterface() the same number of times.
- In the latter case, you will also get events fired more than once (if the interface is a
- listener interface).
-
- @param rKey
- the id of the container
- @param r
- interface to be added; it is allowed, to insert null or
- the same interface more than once
- @return
- the new count of elements in the container
- */
- sal_Int32 SAL_CALL addInterface(
- const ::com::sun::star::uno::Type & rKey,
- const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > & r )
- SAL_THROW(());
-
- /** Removes an element from the container with the specified key.
- It uses interface equality to remove the interface.
-
- @param rKey
- the id of the container
- @param rxIFace
- interface to be removed
- @return
- the new count of elements in the container
- */
- sal_Int32 SAL_CALL removeInterface(
- const ::com::sun::star::uno::Type & rKey,
- const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > & rxIFace )
- SAL_THROW(());
-
- /**
- Call disposing on all object in the container that
- support XEventListener. Than clear the container.
- */
- void SAL_CALL disposeAndClear( const ::com::sun::star::lang::EventObject & rEvt ) SAL_THROW(());
- /**
- Remove all elements of all containers. Does not delete the container.
- */
- void SAL_CALL clear() SAL_THROW(());
-
- typedef ::com::sun::star::uno::Type keyType;
-private:
- void *m_pMap;
- ::osl::Mutex & rMutex;
-
- inline OMultiTypeInterfaceContainerHelper( const OMultiTypeInterfaceContainerHelper & ) SAL_THROW(());
- inline OMultiTypeInterfaceContainerHelper & operator = ( const OMultiTypeInterfaceContainerHelper & ) SAL_THROW(());
-};
-
-typedef OBroadcastHelperVar< OMultiTypeInterfaceContainerHelper , OMultiTypeInterfaceContainerHelper::keyType > OBroadcastHelper;
-
-}
-
-#endif
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */