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