1 /**************************************************************
2 *
3 * Licensed to the Apache Software Foundation (ASF) under one
4 * or more contributor license agreements. See the NOTICE file
5 * distributed with this work for additional information
6 * regarding copyright ownership. The ASF licenses this file
7 * to you under the Apache License, Version 2.0 (the
8 * "License"); you may not use this file except in compliance
9 * with the License. You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing,
14 * software distributed under the License is distributed on an
15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16 * KIND, either express or implied. See the License for the
17 * specific language governing permissions and limitations
18 * under the License.
19 *
20 *************************************************************/
21
22
23 #ifndef _COM_SUN_STAR_UNO_REFERENCE_HXX_
24 #define _COM_SUN_STAR_UNO_REFERENCE_HXX_
25
26 #include <com/sun/star/uno/Reference.h>
27 #include <com/sun/star/uno/RuntimeException.hpp>
28 #ifndef _COM_SUN_STAR_UNO_XINTERFACE_HDL_
29 #include <com/sun/star/uno/XInterface.hdl>
30 #endif
31 #include <com/sun/star/uno/genfunc.hxx>
32
33 namespace com
34 {
35 namespace sun
36 {
37 namespace star
38 {
39 namespace uno
40 {
41
42 //__________________________________________________________________________________________________
iquery(XInterface * pInterface,const Type & rType)43 inline XInterface * BaseReference::iquery(
44 XInterface * pInterface, const Type & rType )
45 {
46 if (pInterface)
47 {
48 Any aRet( pInterface->queryInterface( rType ) );
49 if (typelib_TypeClass_INTERFACE == aRet.pType->eTypeClass)
50 {
51 XInterface * pRet = static_cast< XInterface * >( aRet.pReserved );
52 aRet.pReserved = 0;
53 return pRet;
54 }
55 }
56 return 0;
57 }
58 //__________________________________________________________________________________________________
59 template< class interface_type >
iquery(XInterface * pInterface)60 inline XInterface * Reference< interface_type >::iquery(
61 XInterface * pInterface )
62 {
63 return BaseReference::iquery(pInterface, interface_type::static_type());
64 }
65 #ifndef EXCEPTIONS_OFF
66 extern "C" rtl_uString * SAL_CALL cppu_unsatisfied_iquery_msg(
67 typelib_TypeDescriptionReference * pType )
68 SAL_THROW_EXTERN_C();
69 extern "C" rtl_uString * SAL_CALL cppu_unsatisfied_iset_msg(
70 typelib_TypeDescriptionReference * pType )
71 SAL_THROW_EXTERN_C();
72 //__________________________________________________________________________________________________
iquery_throw(XInterface * pInterface,const Type & rType)73 inline XInterface * BaseReference::iquery_throw(
74 XInterface * pInterface, const Type & rType )
75 {
76 XInterface * pQueried = iquery( pInterface, rType );
77 if (pQueried)
78 return pQueried;
79 throw RuntimeException(
80 ::rtl::OUString( cppu_unsatisfied_iquery_msg( rType.getTypeLibType() ), SAL_NO_ACQUIRE ),
81 Reference< XInterface >( pInterface ) );
82 }
83 //__________________________________________________________________________________________________
84 template< class interface_type >
iquery_throw(XInterface * pInterface)85 inline XInterface * Reference< interface_type >::iquery_throw(
86 XInterface * pInterface )
87 {
88 return BaseReference::iquery_throw(
89 pInterface, interface_type::static_type());
90 }
91 //__________________________________________________________________________________________________
92 template< class interface_type >
iset_throw(interface_type * pInterface)93 inline interface_type * Reference< interface_type >::iset_throw(
94 interface_type * pInterface )
95 {
96 if (pInterface)
97 {
98 pInterface->acquire();
99 return pInterface;
100 }
101 throw RuntimeException(
102 ::rtl::OUString( cppu_unsatisfied_iset_msg( interface_type::static_type().getTypeLibType() ), SAL_NO_ACQUIRE ),
103 NULL );
104 }
105 #endif
106
107 //__________________________________________________________________________________________________
108 template< class interface_type >
~Reference()109 inline Reference< interface_type >::~Reference() SAL_THROW( () )
110 {
111 if (_pInterface)
112 _pInterface->release();
113 }
114 //__________________________________________________________________________________________________
115 template< class interface_type >
Reference()116 inline Reference< interface_type >::Reference() SAL_THROW( () )
117 {
118 _pInterface = 0;
119 }
120 //__________________________________________________________________________________________________
121 template< class interface_type >
Reference(const Reference<interface_type> & rRef)122 inline Reference< interface_type >::Reference( const Reference< interface_type > & rRef ) SAL_THROW( () )
123 {
124 _pInterface = rRef._pInterface;
125 if (_pInterface)
126 _pInterface->acquire();
127 }
128 //__________________________________________________________________________________________________
129 template< class interface_type >
Reference(interface_type * pInterface)130 inline Reference< interface_type >::Reference( interface_type * pInterface ) SAL_THROW( () )
131 {
132 _pInterface = castToXInterface(pInterface);
133 if (_pInterface)
134 _pInterface->acquire();
135 }
136 //__________________________________________________________________________________________________
137 template< class interface_type >
Reference(interface_type * pInterface,__sal_NoAcquire)138 inline Reference< interface_type >::Reference( interface_type * pInterface, __sal_NoAcquire ) SAL_THROW( () )
139 {
140 _pInterface = castToXInterface(pInterface);
141 }
142 //__________________________________________________________________________________________________
143 template< class interface_type >
Reference(interface_type * pInterface,UnoReference_NoAcquire)144 inline Reference< interface_type >::Reference( interface_type * pInterface, UnoReference_NoAcquire ) SAL_THROW( () )
145 {
146 _pInterface = castToXInterface(pInterface);
147 }
148 //__________________________________________________________________________________________________
149 template< class interface_type >
Reference(const BaseReference & rRef,UnoReference_Query)150 inline Reference< interface_type >::Reference( const BaseReference & rRef, UnoReference_Query )
151 {
152 _pInterface = iquery( rRef.get() );
153 }
154 //__________________________________________________________________________________________________
155 template< class interface_type >
Reference(XInterface * pInterface,UnoReference_Query)156 inline Reference< interface_type >::Reference( XInterface * pInterface, UnoReference_Query )
157 {
158 _pInterface = iquery( pInterface );
159 }
160 //__________________________________________________________________________________________________
161 template< class interface_type >
Reference(const Any & rAny,UnoReference_Query)162 inline Reference< interface_type >::Reference( const Any & rAny, UnoReference_Query )
163 {
164 _pInterface = (typelib_TypeClass_INTERFACE == rAny.pType->eTypeClass
165 ? iquery( static_cast< XInterface * >( rAny.pReserved ) ) : 0);
166 }
167 #ifndef EXCEPTIONS_OFF
168 //__________________________________________________________________________________________________
169 template< class interface_type >
Reference(const BaseReference & rRef,UnoReference_QueryThrow)170 inline Reference< interface_type >::Reference( const BaseReference & rRef, UnoReference_QueryThrow )
171 {
172 _pInterface = NULL;
173 _pInterface = iquery_throw( rRef.get() );
174 }
175 //__________________________________________________________________________________________________
176 template< class interface_type >
Reference(XInterface * pInterface,UnoReference_QueryThrow)177 inline Reference< interface_type >::Reference( XInterface * pInterface, UnoReference_QueryThrow )
178 {
179 _pInterface = NULL;
180 _pInterface = iquery_throw( pInterface );
181 }
182 //__________________________________________________________________________________________________
183 template< class interface_type >
Reference(const Any & rAny,UnoReference_QueryThrow)184 inline Reference< interface_type >::Reference( const Any & rAny, UnoReference_QueryThrow )
185 {
186 _pInterface = NULL;
187 _pInterface = iquery_throw( typelib_TypeClass_INTERFACE == rAny.pType->eTypeClass
188 ? static_cast< XInterface * >( rAny.pReserved ) : 0 );
189 }
190 //__________________________________________________________________________________________________
191 template< class interface_type >
Reference(const Reference<interface_type> & rRef,UnoReference_SetThrow)192 inline Reference< interface_type >::Reference( const Reference< interface_type > & rRef, UnoReference_SetThrow )
193 {
194 _pInterface = NULL;
195 _pInterface = iset_throw( rRef.get() );
196 }
197 //__________________________________________________________________________________________________
198 template< class interface_type >
Reference(interface_type * pInterface,UnoReference_SetThrow)199 inline Reference< interface_type >::Reference( interface_type * pInterface, UnoReference_SetThrow )
200 {
201 _pInterface = NULL;
202 _pInterface = iset_throw( pInterface );
203 }
204 #endif
205
206 //__________________________________________________________________________________________________
207 template< class interface_type >
clear()208 inline void Reference< interface_type >::clear() SAL_THROW( () )
209 {
210 if (_pInterface)
211 {
212 XInterface * const pOld = _pInterface;
213 _pInterface = 0;
214 pOld->release();
215 }
216 }
217 //__________________________________________________________________________________________________
218 template< class interface_type >
set(interface_type * pInterface)219 inline sal_Bool Reference< interface_type >::set(
220 interface_type * pInterface ) SAL_THROW( () )
221 {
222 if (pInterface)
223 castToXInterface(pInterface)->acquire();
224 XInterface * const pOld = _pInterface;
225 _pInterface = castToXInterface(pInterface);
226 if (pOld)
227 pOld->release();
228 return (0 != pInterface);
229 }
230 //__________________________________________________________________________________________________
231 template< class interface_type >
set(interface_type * pInterface,__sal_NoAcquire)232 inline sal_Bool Reference< interface_type >::set(
233 interface_type * pInterface, __sal_NoAcquire ) SAL_THROW( () )
234 {
235 XInterface * const pOld = _pInterface;
236 _pInterface = castToXInterface(pInterface);
237 if (pOld)
238 pOld->release();
239 return (0 != pInterface);
240 }
241 //__________________________________________________________________________________________________
242 template< class interface_type >
set(interface_type * pInterface,UnoReference_NoAcquire)243 inline sal_Bool Reference< interface_type >::set(
244 interface_type * pInterface, UnoReference_NoAcquire ) SAL_THROW( () )
245 {
246 return set( pInterface, SAL_NO_ACQUIRE );
247 }
248
249 //__________________________________________________________________________________________________
250 template< class interface_type >
set(const Reference<interface_type> & rRef)251 inline sal_Bool Reference< interface_type >::set(
252 const Reference< interface_type > & rRef ) SAL_THROW( () )
253 {
254 return set( castFromXInterface( rRef._pInterface ) );
255 }
256 //__________________________________________________________________________________________________
257 template< class interface_type >
set(XInterface * pInterface,UnoReference_Query)258 inline sal_Bool Reference< interface_type >::set(
259 XInterface * pInterface, UnoReference_Query )
260 {
261 return set( castFromXInterface(iquery( pInterface )), SAL_NO_ACQUIRE );
262 }
263 //__________________________________________________________________________________________________
264 template< class interface_type >
set(const BaseReference & rRef,UnoReference_Query)265 inline sal_Bool Reference< interface_type >::set(
266 const BaseReference & rRef, UnoReference_Query )
267 {
268 return set( castFromXInterface(iquery( rRef.get() )), SAL_NO_ACQUIRE );
269 }
270
271 //______________________________________________________________________________
272 template< class interface_type >
set(Any const & rAny,UnoReference_Query)273 inline bool Reference< interface_type >::set(
274 Any const & rAny, UnoReference_Query )
275 {
276 return set(
277 castFromXInterface(
278 iquery(
279 rAny.pType->eTypeClass == typelib_TypeClass_INTERFACE
280 ? static_cast< XInterface * >( rAny.pReserved ) : 0 )),
281 SAL_NO_ACQUIRE );
282 }
283
284 #ifndef EXCEPTIONS_OFF
285 //__________________________________________________________________________________________________
286 template< class interface_type >
set(XInterface * pInterface,UnoReference_QueryThrow)287 inline void Reference< interface_type >::set(
288 XInterface * pInterface, UnoReference_QueryThrow )
289 {
290 set( castFromXInterface(iquery_throw( pInterface )), SAL_NO_ACQUIRE );
291 }
292 //__________________________________________________________________________________________________
293 template< class interface_type >
set(const BaseReference & rRef,UnoReference_QueryThrow)294 inline void Reference< interface_type >::set(
295 const BaseReference & rRef, UnoReference_QueryThrow )
296 {
297 set( castFromXInterface(iquery_throw( rRef.get() )), SAL_NO_ACQUIRE );
298 }
299
300 //______________________________________________________________________________
301 template< class interface_type >
set(Any const & rAny,UnoReference_QueryThrow)302 inline void Reference< interface_type >::set(
303 Any const & rAny, UnoReference_QueryThrow )
304 {
305 set( castFromXInterface(
306 iquery_throw(
307 rAny.pType->eTypeClass == typelib_TypeClass_INTERFACE
308 ? static_cast< XInterface * >( rAny.pReserved ) : 0 )),
309 SAL_NO_ACQUIRE );
310 }
311 //__________________________________________________________________________________________________
312 template< class interface_type >
set(interface_type * pInterface,UnoReference_SetThrow)313 inline void Reference< interface_type >::set(
314 interface_type * pInterface, UnoReference_SetThrow )
315 {
316 set( iset_throw( pInterface ), SAL_NO_ACQUIRE );
317 }
318 //__________________________________________________________________________________________________
319 template< class interface_type >
set(const Reference<interface_type> & rRef,UnoReference_SetThrow)320 inline void Reference< interface_type >::set(
321 const Reference< interface_type > & rRef, UnoReference_SetThrow )
322 {
323 set( rRef.get(), UNO_SET_THROW );
324 }
325
326 #endif
327
328 //__________________________________________________________________________________________________
329 template< class interface_type >
operator =(interface_type * pInterface)330 inline Reference< interface_type > & Reference< interface_type >::operator = (
331 interface_type * pInterface ) SAL_THROW( () )
332 {
333 set( pInterface );
334 return *this;
335 }
336 //__________________________________________________________________________________________________
337 template< class interface_type >
operator =(const Reference<interface_type> & rRef)338 inline Reference< interface_type > & Reference< interface_type >::operator = (
339 const Reference< interface_type > & rRef ) SAL_THROW( () )
340 {
341 set( castFromXInterface( rRef._pInterface ) );
342 return *this;
343 }
344
345 //__________________________________________________________________________________________________
346 template< class interface_type >
query(const BaseReference & rRef)347 inline Reference< interface_type > Reference< interface_type >::query(
348 const BaseReference & rRef )
349 {
350 return Reference< interface_type >(
351 castFromXInterface(iquery( rRef.get() )), SAL_NO_ACQUIRE );
352 }
353 //__________________________________________________________________________________________________
354 template< class interface_type >
query(XInterface * pInterface)355 inline Reference< interface_type > Reference< interface_type >::query(
356 XInterface * pInterface )
357 {
358 return Reference< interface_type >(
359 castFromXInterface(iquery( pInterface )), SAL_NO_ACQUIRE );
360 }
361
362 //##################################################################################################
363
364 //__________________________________________________________________________________________________
operator ==(XInterface * pInterface) const365 inline sal_Bool BaseReference::operator == ( XInterface * pInterface ) const SAL_THROW( () )
366 {
367 if (_pInterface == pInterface)
368 return sal_True;
369 #ifndef EXCEPTIONS_OFF
370 try
371 {
372 #endif
373 // only the query to XInterface must return the same pointer if they belong to same objects
374 Reference< XInterface > x1( _pInterface, UNO_QUERY );
375 Reference< XInterface > x2( pInterface, UNO_QUERY );
376 return (x1._pInterface == x2._pInterface);
377 #ifndef EXCEPTIONS_OFF
378 }
379 catch (RuntimeException &)
380 {
381 return sal_False;
382 }
383 #endif
384 }
385
386 //______________________________________________________________________________
operator <(const BaseReference & rRef) const387 inline sal_Bool BaseReference::operator < (
388 const BaseReference & rRef ) const SAL_THROW( () )
389 {
390 if (_pInterface == rRef._pInterface)
391 return sal_False;
392 #if ! defined EXCEPTIONS_OFF
393 try
394 {
395 #endif
396 // only the query to XInterface must return the same pointer:
397 Reference< XInterface > x1( _pInterface, UNO_QUERY );
398 Reference< XInterface > x2( rRef, UNO_QUERY );
399 return (x1._pInterface < x2._pInterface);
400 #if ! defined EXCEPTIONS_OFF
401 }
402 catch (RuntimeException &)
403 {
404 return sal_False;
405 }
406 #endif
407 }
408
409 //__________________________________________________________________________________________________
operator !=(XInterface * pInterface) const410 inline sal_Bool BaseReference::operator != ( XInterface * pInterface ) const SAL_THROW( () )
411 {
412 return (! operator == ( pInterface ));
413 }
414 //__________________________________________________________________________________________________
operator ==(const BaseReference & rRef) const415 inline sal_Bool BaseReference::operator == ( const BaseReference & rRef ) const SAL_THROW( () )
416 {
417 return operator == ( rRef._pInterface );
418 }
419 //__________________________________________________________________________________________________
operator !=(const BaseReference & rRef) const420 inline sal_Bool BaseReference::operator != ( const BaseReference & rRef ) const SAL_THROW( () )
421 {
422 return (! operator == ( rRef._pInterface ));
423 }
424
425 }
426 }
427 }
428 }
429
430 #endif
431