1*6da5f311SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*6da5f311SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*6da5f311SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*6da5f311SAndrew Rist  * distributed with this work for additional information
6*6da5f311SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*6da5f311SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*6da5f311SAndrew Rist  * "License"); you may not use this file except in compliance
9*6da5f311SAndrew Rist  * with the License.  You may obtain a copy of the License at
10*6da5f311SAndrew Rist  *
11*6da5f311SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*6da5f311SAndrew Rist  *
13*6da5f311SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*6da5f311SAndrew Rist  * software distributed under the License is distributed on an
15*6da5f311SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*6da5f311SAndrew Rist  * KIND, either express or implied.  See the License for the
17*6da5f311SAndrew Rist  * specific language governing permissions and limitations
18*6da5f311SAndrew Rist  * under the License.
19*6da5f311SAndrew Rist  *
20*6da5f311SAndrew Rist  *************************************************************/
21*6da5f311SAndrew Rist 
22*6da5f311SAndrew Rist 
23cdf0e10cSrcweir #ifndef _CPPUHELPER_INTERFACECONTAINER_HXX_
24cdf0e10cSrcweir #define _CPPUHELPER_INTERFACECONTAINER_HXX_
25cdf0e10cSrcweir 
26cdf0e10cSrcweir #include <cppuhelper/interfacecontainer.h>
27cdf0e10cSrcweir 
28cdf0e10cSrcweir 
29cdf0e10cSrcweir namespace cppu
30cdf0e10cSrcweir {
31cdf0e10cSrcweir 
32cdf0e10cSrcweir template< class key , class hashImpl , class equalImpl >
OMultiTypeInterfaceContainerHelperVar(::osl::Mutex & rMutex_)33cdf0e10cSrcweir inline OMultiTypeInterfaceContainerHelperVar< key , hashImpl , equalImpl >::OMultiTypeInterfaceContainerHelperVar( ::osl::Mutex & rMutex_ )
34cdf0e10cSrcweir 	SAL_THROW( () )
35cdf0e10cSrcweir 	: rMutex( rMutex_ )
36cdf0e10cSrcweir {
37cdf0e10cSrcweir 	m_pMap = new InterfaceMap;
38cdf0e10cSrcweir }
39cdf0e10cSrcweir 
40cdf0e10cSrcweir //===================================================================
41cdf0e10cSrcweir template< class key , class hashImpl , class equalImpl >
~OMultiTypeInterfaceContainerHelperVar()42cdf0e10cSrcweir inline OMultiTypeInterfaceContainerHelperVar< key , hashImpl , equalImpl >::~OMultiTypeInterfaceContainerHelperVar()
43cdf0e10cSrcweir 	SAL_THROW( () )
44cdf0e10cSrcweir {
45cdf0e10cSrcweir 	typename InterfaceMap::iterator iter = m_pMap->begin();
46cdf0e10cSrcweir 	typename InterfaceMap::iterator end = m_pMap->end();
47cdf0e10cSrcweir 
48cdf0e10cSrcweir 	while( iter != end )
49cdf0e10cSrcweir 	{
50cdf0e10cSrcweir 		delete (OInterfaceContainerHelper*)(*iter).second;
51cdf0e10cSrcweir 		(*iter).second = 0;
52cdf0e10cSrcweir 		++iter;
53cdf0e10cSrcweir 	}
54cdf0e10cSrcweir 	delete m_pMap;
55cdf0e10cSrcweir }
56cdf0e10cSrcweir 
57cdf0e10cSrcweir //===================================================================
58cdf0e10cSrcweir template< class key , class hashImpl , class equalImpl >
getContainedTypes() const59cdf0e10cSrcweir inline ::com::sun::star::uno::Sequence< key > OMultiTypeInterfaceContainerHelperVar< key , hashImpl , equalImpl >::getContainedTypes() const
60cdf0e10cSrcweir 	SAL_THROW( () )
61cdf0e10cSrcweir {
62cdf0e10cSrcweir 	::osl::MutexGuard aGuard( rMutex );
63cdf0e10cSrcweir 	typename InterfaceMap::size_type nSize = m_pMap->size();
64cdf0e10cSrcweir 	if( nSize != 0 )
65cdf0e10cSrcweir 	{
66cdf0e10cSrcweir 		::com::sun::star::uno::Sequence< key > aInterfaceTypes( nSize );
67cdf0e10cSrcweir 		key * pArray = aInterfaceTypes.getArray();
68cdf0e10cSrcweir 
69cdf0e10cSrcweir 		typename InterfaceMap::iterator iter = m_pMap->begin();
70cdf0e10cSrcweir 		typename InterfaceMap::iterator end = m_pMap->end();
71cdf0e10cSrcweir 
72cdf0e10cSrcweir 		sal_uInt32 i = 0;
73cdf0e10cSrcweir 		while( iter != end )
74cdf0e10cSrcweir 		{
75cdf0e10cSrcweir 			// are interfaces added to this container?
76cdf0e10cSrcweir 			if( ((OInterfaceContainerHelper*)(*iter).second)->getLength() )
77cdf0e10cSrcweir 				// yes, put the type in the array
78cdf0e10cSrcweir 				pArray[i++] = (*iter).first;
79cdf0e10cSrcweir 			iter++;
80cdf0e10cSrcweir 		}
81cdf0e10cSrcweir 		if( i != nSize ) {
82cdf0e10cSrcweir 			// may be empty container, reduce the sequence to the right size
83cdf0e10cSrcweir 			aInterfaceTypes = ::com::sun::star::uno::Sequence<key>( pArray, i );
84cdf0e10cSrcweir 		}
85cdf0e10cSrcweir 		return aInterfaceTypes;
86cdf0e10cSrcweir 	}
87cdf0e10cSrcweir 	return ::com::sun::star::uno::Sequence<key>();
88cdf0e10cSrcweir }
89cdf0e10cSrcweir 
90cdf0e10cSrcweir //===================================================================
91cdf0e10cSrcweir template< class key , class hashImpl , class equalImpl >
getContainer(const key & rKey) const92cdf0e10cSrcweir OInterfaceContainerHelper * OMultiTypeInterfaceContainerHelperVar< key , hashImpl , equalImpl >::getContainer(
93cdf0e10cSrcweir 	const key & rKey ) const SAL_THROW( () )
94cdf0e10cSrcweir {
95cdf0e10cSrcweir 	::osl::MutexGuard aGuard( rMutex );
96cdf0e10cSrcweir 
97cdf0e10cSrcweir  	typename InterfaceMap::iterator iter = find( rKey );
98cdf0e10cSrcweir 	if( iter != m_pMap->end() )
99cdf0e10cSrcweir 			return (OInterfaceContainerHelper*) (*iter).second;
100cdf0e10cSrcweir 	return 0;
101cdf0e10cSrcweir }
102cdf0e10cSrcweir 
103cdf0e10cSrcweir //===================================================================
104cdf0e10cSrcweir template< class key , class hashImpl , class equalImpl >
addInterface(const key & rKey,const::com::sun::star::uno::Reference<::com::sun::star::uno::XInterface> & rListener)105cdf0e10cSrcweir sal_Int32 OMultiTypeInterfaceContainerHelperVar< key , hashImpl , equalImpl >::addInterface(
106cdf0e10cSrcweir 	const key & rKey,
107cdf0e10cSrcweir 	const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > & rListener )
108cdf0e10cSrcweir 	SAL_THROW( () )
109cdf0e10cSrcweir {
110cdf0e10cSrcweir 	::osl::MutexGuard aGuard( rMutex );
111cdf0e10cSrcweir 	typename InterfaceMap::iterator iter = find( rKey );
112cdf0e10cSrcweir 	if( iter == m_pMap->end() )
113cdf0e10cSrcweir 	{
114cdf0e10cSrcweir 		OInterfaceContainerHelper * pLC = new OInterfaceContainerHelper( rMutex );
115cdf0e10cSrcweir         m_pMap->push_back(std::pair<key, void*>(rKey, pLC));
116cdf0e10cSrcweir 		return pLC->addInterface( rListener );
117cdf0e10cSrcweir 	}
118cdf0e10cSrcweir 	else
119cdf0e10cSrcweir 		return ((OInterfaceContainerHelper*)(*iter).second)->addInterface( rListener );
120cdf0e10cSrcweir }
121cdf0e10cSrcweir 
122cdf0e10cSrcweir //===================================================================
123cdf0e10cSrcweir template< class key , class hashImpl , class equalImpl >
removeInterface(const key & rKey,const::com::sun::star::uno::Reference<::com::sun::star::uno::XInterface> & rListener)124cdf0e10cSrcweir inline sal_Int32 OMultiTypeInterfaceContainerHelperVar< key , hashImpl , equalImpl >::removeInterface(
125cdf0e10cSrcweir 	const key & rKey,
126cdf0e10cSrcweir 	const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > & rListener )
127cdf0e10cSrcweir 	SAL_THROW( () )
128cdf0e10cSrcweir {
129cdf0e10cSrcweir 	::osl::MutexGuard aGuard( rMutex );
130cdf0e10cSrcweir 
131cdf0e10cSrcweir 	// search container with id nUik
132cdf0e10cSrcweir 	typename InterfaceMap::iterator iter = find( rKey );
133cdf0e10cSrcweir     // container found?
134cdf0e10cSrcweir 	if( iter != m_pMap->end() )
135cdf0e10cSrcweir         return ((OInterfaceContainerHelper*)(*iter).second)->removeInterface( rListener );
136cdf0e10cSrcweir 
137cdf0e10cSrcweir 	// no container with this id. Always return 0
138cdf0e10cSrcweir 	return 0;
139cdf0e10cSrcweir }
140cdf0e10cSrcweir 
141cdf0e10cSrcweir //===================================================================
142cdf0e10cSrcweir template< class key , class hashImpl , class equalImpl >
disposeAndClear(const::com::sun::star::lang::EventObject & rEvt)143cdf0e10cSrcweir void OMultiTypeInterfaceContainerHelperVar< key , hashImpl , equalImpl >::disposeAndClear(
144cdf0e10cSrcweir 	const ::com::sun::star::lang::EventObject & rEvt )
145cdf0e10cSrcweir 	SAL_THROW( () )
146cdf0e10cSrcweir {
147cdf0e10cSrcweir 	typename InterfaceMap::size_type nSize = 0;
148cdf0e10cSrcweir 	OInterfaceContainerHelper ** ppListenerContainers = NULL;
149cdf0e10cSrcweir 	{
150cdf0e10cSrcweir 		::osl::MutexGuard aGuard( rMutex );
151cdf0e10cSrcweir         nSize = m_pMap->size();
152cdf0e10cSrcweir 		if( nSize )
153cdf0e10cSrcweir 		{
154cdf0e10cSrcweir 			typedef OInterfaceContainerHelper* ppp;
155cdf0e10cSrcweir 			ppListenerContainers = new ppp[nSize];
156cdf0e10cSrcweir 			//ppListenerContainers = new (ListenerContainer*)[nSize];
157cdf0e10cSrcweir 
158cdf0e10cSrcweir 			typename InterfaceMap::iterator iter = m_pMap->begin();
159cdf0e10cSrcweir 			typename InterfaceMap::iterator end = m_pMap->end();
160cdf0e10cSrcweir 
161cdf0e10cSrcweir 			typename InterfaceMap::size_type i = 0;
162cdf0e10cSrcweir 			while( iter != end )
163cdf0e10cSrcweir 			{
164cdf0e10cSrcweir 				ppListenerContainers[i++] = (OInterfaceContainerHelper*)(*iter).second;
165cdf0e10cSrcweir 				++iter;
166cdf0e10cSrcweir 			}
167cdf0e10cSrcweir 		}
168cdf0e10cSrcweir 	}
169cdf0e10cSrcweir 
170cdf0e10cSrcweir 	// create a copy, because do not fire event in a guarded section
171cdf0e10cSrcweir 	for( typename InterfaceMap::size_type i = 0; i < nSize; i++ )
172cdf0e10cSrcweir 	{
173cdf0e10cSrcweir 		if( ppListenerContainers[i] )
174cdf0e10cSrcweir 			ppListenerContainers[i]->disposeAndClear( rEvt );
175cdf0e10cSrcweir 	}
176cdf0e10cSrcweir 
177cdf0e10cSrcweir 	delete [] ppListenerContainers;
178cdf0e10cSrcweir }
179cdf0e10cSrcweir 
180cdf0e10cSrcweir //===================================================================
181cdf0e10cSrcweir template< class key , class hashImpl , class equalImpl >
clear()182cdf0e10cSrcweir void OMultiTypeInterfaceContainerHelperVar< key , hashImpl , equalImpl >::clear() SAL_THROW( () )
183cdf0e10cSrcweir {
184cdf0e10cSrcweir 	::osl::MutexGuard aGuard( rMutex );
185cdf0e10cSrcweir 	typename InterfaceMap::iterator iter = m_pMap->begin();
186cdf0e10cSrcweir 	typename InterfaceMap::iterator end = m_pMap->end();
187cdf0e10cSrcweir 
188cdf0e10cSrcweir 	while( iter != end )
189cdf0e10cSrcweir 	{
190cdf0e10cSrcweir 		((OInterfaceContainerHelper*)(*iter).second)->clear();
191cdf0e10cSrcweir 		++iter;
192cdf0e10cSrcweir 	}
193cdf0e10cSrcweir }
194cdf0e10cSrcweir 
195cdf0e10cSrcweir 
196cdf0e10cSrcweir }
197cdf0e10cSrcweir 
198cdf0e10cSrcweir #endif
199cdf0e10cSrcweir 
200