xref: /trunk/main/UnoControls/source/controls/OConnectionPointHelper.cxx (revision 1ecadb572e7010ff3b3382ad9bf179dbc6efadbb)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 //______________________________________________________________________________________________________________
29 //  my own include
30 //______________________________________________________________________________________________________________
31 
32 #include "OConnectionPointHelper.hxx"
33 
34 //______________________________________________________________________________________________________________
35 //  includes of other projects
36 //______________________________________________________________________________________________________________
37 
38 //______________________________________________________________________________________________________________
39 //  include of my own project
40 //______________________________________________________________________________________________________________
41 #include "OConnectionPointContainerHelper.hxx"
42 
43 //______________________________________________________________________________________________________________
44 //  namespaces
45 //______________________________________________________________________________________________________________
46 
47 using namespace ::rtl                   ;
48 using namespace ::osl                   ;
49 using namespace ::cppu                  ;
50 using namespace ::com::sun::star::uno   ;
51 using namespace ::com::sun::star::lang  ;
52 
53 namespace unocontrols{
54 
55 //______________________________________________________________________________________________________________
56 //  construct/destruct
57 //______________________________________________________________________________________________________________
58 
59 OConnectionPointHelper::OConnectionPointHelper( Mutex&                              aMutex                      ,
60                                                 OConnectionPointContainerHelper*    pContainerImplementation    ,
61                                                 UNO3_TYPE                           aType                       )
62     : m_aSharedMutex                ( aMutex                    )
63     , m_oContainerWeakReference     ( pContainerImplementation  )
64     , m_pContainerImplementation    ( pContainerImplementation  )
65     , m_aInterfaceType              ( aType                     )
66 {
67 }
68 
69 OConnectionPointHelper::~OConnectionPointHelper()
70 {
71 }
72 
73 //____________________________________________________________________________________________________________
74 //  XInterface
75 //____________________________________________________________________________________________________________
76 
77 Any SAL_CALL OConnectionPointHelper::queryInterface( const Type& aType ) throw( RuntimeException )
78 {
79     // Attention:
80     //  Don't use mutex or guard in this method!!! Is a method of XInterface.
81 
82     // Ask for my own supported interfaces ...
83     Any aReturn ( ::cppu::queryInterface(   aType                                       ,
84                                             static_cast< XConnectionPoint*  > ( this )
85                                         )
86                 );
87 
88     // If searched interface not supported by this class ...
89     if ( aReturn.hasValue() == sal_False )
90     {
91         // ... ask baseclasses.
92         aReturn = OWeakObject::queryInterface( aType );
93     }
94 
95     return aReturn ;
96 }
97 
98 //____________________________________________________________________________________________________________
99 //  XInterface
100 //____________________________________________________________________________________________________________
101 
102 void SAL_CALL OConnectionPointHelper::acquire() throw()
103 {
104     // Attention:
105     //  Don't use mutex or guard in this method!!! Is a method of XInterface.
106 
107     // Forward to baseclass
108     OWeakObject::acquire();
109 }
110 
111 //____________________________________________________________________________________________________________
112 //  XInterface
113 //____________________________________________________________________________________________________________
114 
115 void SAL_CALL OConnectionPointHelper::release() throw()
116 {
117     // Attention:
118     //  Don't use mutex or guard in this method!!! Is a method of XInterface.
119 
120     // Forward to baseclass
121     OWeakObject::release();
122 }
123 
124 //______________________________________________________________________________________________________________
125 //  XConnectionPoint
126 //______________________________________________________________________________________________________________
127 
128 Type SAL_CALL OConnectionPointHelper::getConnectionType() throw( RuntimeException )
129 {
130     // Ready for multithreading
131     MutexGuard aGuard( m_aSharedMutex );
132 
133     // Set default return value, if method failed.
134     if ( impl_LockContainer() == sal_False )
135     {
136         // Container not exist! Its an runtime error.
137         throw RuntimeException();
138     }
139 
140     // If container reference valid, return right type of supported interfaces of THIS connectionpoint.
141     Type aReturnType = m_aInterfaceType ;
142     // Don't forget this!
143     impl_UnlockContainer();
144 
145     return aReturnType;
146 }
147 
148 //______________________________________________________________________________________________________________
149 //  XConnectionPoint
150 //______________________________________________________________________________________________________________
151 
152 Reference< XConnectionPointContainer > SAL_CALL OConnectionPointHelper::getConnectionPointContainer() throw( RuntimeException )
153 {
154     // Ready for multithreading
155     MutexGuard aGuard( m_aSharedMutex );
156     // Convert weakreference to correct uno3-reference and return value. It can be NULL, if container destroyed!
157     return Reference< XConnectionPointContainer >( m_oContainerWeakReference.get(), UNO_QUERY );
158 }
159 
160 //______________________________________________________________________________________________________________
161 //  XConnectionPoint
162 //______________________________________________________________________________________________________________
163 
164 void SAL_CALL OConnectionPointHelper::advise( const Reference< XInterface >& xListener ) throw( ListenerExistException      ,
165                                                                                                 InvalidListenerException    ,
166                                                                                                 RuntimeException            )
167 {
168     // Ready for multithreading
169     MutexGuard aGuard( m_aSharedMutex );
170 
171     // If type of listener not the same for this special container ...
172     Any aCheckType = xListener->queryInterface( m_aInterfaceType );
173     if ( aCheckType.hasValue() )
174     {
175         // ... throw an exception.
176         throw InvalidListenerException();
177     }
178 
179     // ListenerExistException is obsolete!?
180     // Its the same container for XConnectionPointContainer and XConnectionPoint. But only here we must control, if a listener already exist!?
181     // You can add a listener more then one time at XConnectionPointContainer, but here only one ...
182 
183     // Operation is permitted only, if reference to container is valid!
184     if ( impl_LockContainer() == sal_False )
185     {
186         // Container not exist! Its an runtime error.
187         throw RuntimeException();
188     }
189     // Forward it to OConnectionPointHelperContainer!
190     m_pContainerImplementation->advise( m_aInterfaceType, xListener );
191     // Don't forget this!
192     impl_UnlockContainer();
193 }
194 
195 //______________________________________________________________________________________________________________
196 //  XConnectionPoint
197 //______________________________________________________________________________________________________________
198 
199 void SAL_CALL OConnectionPointHelper::unadvise( const Reference< XInterface >& xListener ) throw( RuntimeException )
200 {
201     // Ready for multithreading
202     MutexGuard aGuard( m_aSharedMutex );
203     // Operation is permitted only, if reference to container is valid!
204     if ( impl_LockContainer() == sal_False )
205     {
206         // Container not exist! Its an runtime error.
207         throw RuntimeException();
208 
209     }
210     // Forward it to OConnectionPointHelperContainer!
211     m_pContainerImplementation->unadvise( m_aInterfaceType, xListener );
212     // Don't forget this!
213     impl_UnlockContainer();
214 }
215 
216 //______________________________________________________________________________________________________________
217 //  XConnectionPoint
218 //______________________________________________________________________________________________________________
219 
220 Sequence< Reference< XInterface > > SAL_CALL OConnectionPointHelper::getConnections() throw( RuntimeException )
221 {
222     // Ready for multithreading
223     MutexGuard aGuard( m_aSharedMutex );
224     // Operation is permitted only, if reference to container is valid!
225     if ( impl_LockContainer() == sal_False )
226     {
227         // Container not exist! Its an runtime error.
228         throw RuntimeException();
229     }
230     // Set default return value, if method failed.
231     Sequence< Reference< XInterface > > seqReturnConnections = Sequence< Reference< XInterface > >();
232     // Get reference to private member of OConnectionPointHelperContainer!
233     OMultiTypeInterfaceContainerHelper& aSharedContainer = m_pContainerImplementation->impl_getMultiTypeContainer();
234     // Get pointer to specialized container which hold all interfaces of searched type.
235     OInterfaceContainerHelper* pSpecialContainer = aSharedContainer.getContainer( m_aInterfaceType );
236     // Get elements of searched type, if somelse exist.
237     if ( pSpecialContainer != NULL )
238     {
239         seqReturnConnections = pSpecialContainer->getElements();
240     }
241     // Don't forget this!
242     impl_UnlockContainer();
243 
244     return seqReturnConnections;
245 }
246 
247 //______________________________________________________________________________________________________________
248 //  private method
249 //______________________________________________________________________________________________________________
250 
251 sal_Bool OConnectionPointHelper::impl_LockContainer()
252 {
253     // Convert weakreference to hard uno3-reference and return state.
254     // If this reference different from NULL, there exist a hard reference to container. Container-instance can't be destroyed.
255     // Don't forget to "unlock" this reference!
256     m_xLock = m_oContainerWeakReference.get();
257     return m_xLock.is();
258 }
259 
260 //______________________________________________________________________________________________________________
261 //  private method
262 //______________________________________________________________________________________________________________
263 
264 void OConnectionPointHelper::impl_UnlockContainer()
265 {
266     // Free hard uno3-reference to container.
267     // see also "impl_LockContainer()"
268     m_xLock = Reference< XInterface >();
269 }
270 
271 }   // namespace unocontrols
272