Branch data Line data Source code
1 : : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : : /*
3 : : * This file is part of the LibreOffice project.
4 : : *
5 : : * This Source Code Form is subject to the terms of the Mozilla Public
6 : : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : : *
9 : : * This file incorporates work covered by the following license notice:
10 : : *
11 : : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : : * contributor license agreements. See the NOTICE file distributed
13 : : * with this work for additional information regarding copyright
14 : : * ownership. The ASF licenses this file to you under the Apache
15 : : * License, Version 2.0 (the "License"); you may not use this file
16 : : * except in compliance with the License. You may obtain a copy of
17 : : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : : */
19 : : #ifndef ASSIGN_HXX
20 : : #define ASSIGN_HXX
21 : :
22 : : #include <string.h>
23 : :
24 : : #include "prim.hxx"
25 : : #include "destr.hxx"
26 : : #include "constr.hxx"
27 : : #include "copy.hxx"
28 : :
29 : :
30 : : namespace cppu
31 : : {
32 : :
33 : : //##################################################################################################
34 : : //#### assignment ##################################################################################
35 : : //##################################################################################################
36 : :
37 : :
38 : : //--------------------------------------------------------------------------------------------------
39 : 1047374 : inline void _assignInterface(
40 : : void ** ppDest, void * pSource,
41 : : uno_AcquireFunc acquire, uno_ReleaseFunc release )
42 : : SAL_THROW(())
43 : : {
44 : 1047374 : _acquire( pSource, acquire );
45 : 1047374 : void * const pToBeReleased = *ppDest;
46 : 1047374 : *ppDest = pSource;
47 : 1047374 : _release( pToBeReleased, release );
48 : 1047374 : }
49 : : //--------------------------------------------------------------------------------------------------
50 : 848285 : inline void * _queryInterface(
51 : : void * pSource,
52 : : typelib_TypeDescriptionReference * pDestType,
53 : : uno_QueryInterfaceFunc queryInterface )
54 : : SAL_THROW(())
55 : : {
56 [ + - ]: 848285 : if (pSource)
57 : : {
58 [ - + ]: 848285 : if (0 == queryInterface)
59 : 0 : queryInterface = binuno_queryInterface;
60 : 848285 : pSource = (*queryInterface)( pSource, pDestType );
61 : : }
62 : 848285 : return pSource;
63 : : }
64 : : //==================================================================================================
65 : : sal_Bool assignStruct(
66 : : void * pDest, void * pSource,
67 : : typelib_CompoundTypeDescription * pTypeDescr,
68 : : uno_QueryInterfaceFunc queryInterface, uno_AcquireFunc acquire, uno_ReleaseFunc release )
69 : : SAL_THROW(());
70 : : //--------------------------------------------------------------------------------------------------
71 : 1227371 : inline sal_Bool _assignStruct(
72 : : void * pDest, void * pSource,
73 : : typelib_CompoundTypeDescription * pTypeDescr,
74 : : uno_QueryInterfaceFunc queryInterface, uno_AcquireFunc acquire, uno_ReleaseFunc release )
75 : : SAL_THROW(())
76 : : {
77 [ + + ]: 1227371 : if (pTypeDescr->pBaseTypeDescription)
78 : : {
79 : : // copy base value
80 [ - + ]: 71722 : if (! assignStruct( pDest, pSource, pTypeDescr->pBaseTypeDescription,
81 : 71722 : queryInterface, acquire, release ))
82 : : {
83 : 0 : return sal_False;
84 : : }
85 : : }
86 : : // then copy members
87 : 1227371 : typelib_TypeDescriptionReference ** ppTypeRefs = pTypeDescr->ppTypeRefs;
88 : 1227371 : sal_Int32 * pMemberOffsets = pTypeDescr->pMemberOffsets;
89 : 1227371 : sal_Int32 nDescr = pTypeDescr->nMembers;
90 [ + + ]: 6108006 : while (nDescr--)
91 : : {
92 [ - + ]: 4880635 : if (! ::uno_type_assignData( (char *)pDest + pMemberOffsets[nDescr],
93 : 4880635 : ppTypeRefs[nDescr],
94 : 9761270 : (char *)pSource + pMemberOffsets[nDescr],
95 : 4880635 : ppTypeRefs[nDescr],
96 : 4880635 : queryInterface, acquire, release ))
97 : : {
98 : 0 : return sal_False;
99 : : }
100 : : }
101 : 1227371 : return sal_True;
102 : : }
103 : : //--------------------------------------------------------------------------------------------------
104 : 0 : inline sal_Bool _assignArray(
105 : : void * pDest, void * pSource,
106 : : typelib_ArrayTypeDescription * pTypeDescr,
107 : : uno_QueryInterfaceFunc queryInterface, uno_AcquireFunc acquire, uno_ReleaseFunc release )
108 : : {
109 : : typelib_TypeDescriptionReference * pElementTypeRef =
110 : 0 : ((typelib_IndirectTypeDescription *)pTypeDescr)->pType;
111 : 0 : typelib_TypeDescription * pElementTypeDescr = NULL;
112 [ # # ][ # # ]: 0 : TYPELIB_DANGER_GET( &pElementTypeDescr, pElementTypeRef );
[ # # ][ # # ]
[ # # ]
113 : 0 : sal_Int32 nTotalElements = pTypeDescr->nTotalElements;
114 : 0 : sal_Int32 nElementSize = pElementTypeDescr->nSize;
115 : : sal_Int32 i;
116 : 0 : sal_Bool bRet = sal_False;
117 : :
118 [ # # # # : 0 : switch ( pElementTypeRef->eTypeClass )
# # # # #
# ]
119 : : {
120 : : case typelib_TypeClass_CHAR:
121 : : case typelib_TypeClass_BOOLEAN:
122 : : case typelib_TypeClass_BYTE:
123 : : case typelib_TypeClass_SHORT:
124 : : case typelib_TypeClass_UNSIGNED_SHORT:
125 : : case typelib_TypeClass_LONG:
126 : : case typelib_TypeClass_UNSIGNED_LONG:
127 : : case typelib_TypeClass_HYPER:
128 : : case typelib_TypeClass_UNSIGNED_HYPER:
129 : : case typelib_TypeClass_FLOAT:
130 : : case typelib_TypeClass_DOUBLE:
131 [ # # ]: 0 : for (i=0; i < nTotalElements; i++)
132 : : {
133 : 0 : memcpy((sal_Char *)pDest + i * nElementSize,
134 : : (sal_Char *)pSource + i * nElementSize,
135 : 0 : nElementSize);
136 : : }
137 : 0 : bRet = sal_True;
138 : 0 : break;
139 : : case typelib_TypeClass_STRING:
140 [ # # ]: 0 : for (i=0; i < nTotalElements; i++)
141 : : {
142 : : ::rtl_uString_assign( (rtl_uString **)pDest + i,
143 : 0 : ((rtl_uString **)pSource)[i] );
144 : : }
145 : 0 : bRet = sal_True;
146 : 0 : break;
147 : : case typelib_TypeClass_TYPE:
148 [ # # ]: 0 : for (i=0; i < nTotalElements; i++)
149 : : {
150 : 0 : typelib_TypeDescriptionReference ** pp = (typelib_TypeDescriptionReference **)pDest + i;
151 : 0 : ::typelib_typedescriptionreference_release( *pp );
152 : 0 : *pp = *((typelib_TypeDescriptionReference **)pSource + i);
153 [ # # ]: 0 : TYPE_ACQUIRE( *pp );
154 : : }
155 : 0 : bRet = sal_True;
156 : 0 : break;
157 : : case typelib_TypeClass_ANY:
158 [ # # ]: 0 : for (i=0; i < nTotalElements; i++)
159 : : {
160 [ # # ]: 0 : _destructAny( (uno_Any *)pDest + i, release );
161 : 0 : _copyConstructAny( (uno_Any *)pDest + i, (uno_Any *)pSource + i,
162 [ # # ]: 0 : pElementTypeRef, pElementTypeDescr, acquire, 0 );
163 : : }
164 : 0 : bRet = sal_True;
165 : 0 : break;
166 : : case typelib_TypeClass_ENUM:
167 [ # # ]: 0 : for (i=0; i < nTotalElements; i++)
168 : : {
169 : 0 : *((sal_Int32 *)pDest + i) = *((sal_Int32 *)pSource + i);
170 : : }
171 : 0 : bRet = sal_True;
172 : 0 : break;
173 : : case typelib_TypeClass_STRUCT:
174 : : case typelib_TypeClass_EXCEPTION:
175 [ # # ]: 0 : for (i=0; i < nTotalElements; i++)
176 : : {
177 : 0 : bRet = _assignStruct( (sal_Char *)pDest + i * nElementSize,
178 : 0 : (sal_Char *)pSource + i * nElementSize,
179 : : (typelib_CompoundTypeDescription *)pElementTypeDescr,
180 [ # # ]: 0 : queryInterface, acquire, release );
181 [ # # ]: 0 : if (! bRet)
182 : 0 : break;
183 : : }
184 : 0 : bRet = sal_True;
185 : 0 : break;
186 : : case typelib_TypeClass_UNION:
187 [ # # ]: 0 : for (i=0; i < nTotalElements; i++)
188 : : {
189 : 0 : _destructUnion( (sal_Char*)pDest + i * nElementSize, pElementTypeDescr, release );
190 : 0 : _copyConstructUnion( (sal_Char*)pDest + i * nElementSize,
191 : 0 : (sal_Char*)pSource + i * nElementSize,
192 : 0 : pElementTypeDescr, acquire, 0 );
193 : : }
194 : 0 : bRet = sal_True;
195 : 0 : break;
196 : : case typelib_TypeClass_SEQUENCE:
197 [ # # ]: 0 : for (i=0; i < nTotalElements; i++)
198 : : {
199 : : ::osl_incrementInterlockedCount(
200 [ # # ]: 0 : &(*((uno_Sequence **)pSource + i))->nRefCount );
201 : : idestructSequence(
202 : 0 : *((uno_Sequence **)pDest + i),
203 [ # # ]: 0 : pElementTypeRef, pElementTypeDescr, release );
204 : 0 : *((uno_Sequence **)pDest + i) = *((uno_Sequence **)pSource + i);
205 : : }
206 : 0 : bRet = sal_True;
207 : 0 : break;
208 : : case typelib_TypeClass_INTERFACE:
209 [ # # ]: 0 : for (i=0; i < nTotalElements; i++)
210 : : {
211 : : _assignInterface(
212 : : (void **)((sal_Char*)pDest + i * nElementSize),
213 : : *(void **)((sal_Char*)pSource + i * nElementSize),
214 [ # # ]: 0 : acquire, release );
215 : : }
216 : 0 : bRet = sal_True;
217 : 0 : break;
218 : : default:
219 : : OSL_ASSERT(false);
220 : 0 : break;
221 : : }
222 : :
223 [ # # ][ # # ]: 0 : TYPELIB_DANGER_RELEASE( pElementTypeDescr );
224 : 0 : return bRet;
225 : : }
226 : : //--------------------------------------------------------------------------------------------------
227 : 11118304 : inline sal_Bool _assignData(
228 : : void * pDest,
229 : : typelib_TypeDescriptionReference * pDestType, typelib_TypeDescription * pDestTypeDescr,
230 : : void * pSource,
231 : : typelib_TypeDescriptionReference * pSourceType, typelib_TypeDescription * pSourceTypeDescr,
232 : : uno_QueryInterfaceFunc queryInterface, uno_AcquireFunc acquire, uno_ReleaseFunc release )
233 : : SAL_THROW(())
234 : : {
235 [ - + ]: 11118304 : if (pDest == pSource)
236 : 0 : return _type_equals( pDestType, pSourceType );
237 : :
238 [ - + ]: 11118304 : if (! pSource)
239 : : {
240 : 0 : _destructData( pDest, pDestType, pDestTypeDescr, release );
241 : 0 : _defaultConstructData( pDest, pDestType, pDestTypeDescr );
242 : 0 : return sal_True;
243 : : }
244 [ + + ]: 11780978 : while (typelib_TypeClass_ANY == pSourceType->eTypeClass)
245 : : {
246 : 662674 : pSourceTypeDescr = 0;
247 : 662674 : pSourceType = ((uno_Any *)pSource)->pType;
248 : 662674 : pSource = ((uno_Any *)pSource)->pData;
249 [ - + ]: 662674 : if (pDest == pSource)
250 : 0 : return sal_True;
251 : : }
252 : :
253 [ - + + + : 11118304 : switch (pDestType->eTypeClass)
+ + + + +
- + + + +
+ + + - -
+ + - ]
254 : : {
255 : : case typelib_TypeClass_VOID:
256 : 0 : return pSourceType->eTypeClass == typelib_TypeClass_VOID;
257 : : case typelib_TypeClass_CHAR:
258 [ + - ]: 30 : switch (pSourceType->eTypeClass)
259 : : {
260 : : case typelib_TypeClass_CHAR:
261 : 30 : *(sal_Unicode *)pDest = *(sal_Unicode *)pSource;
262 : 30 : return sal_True;
263 : : default:
264 : 0 : return sal_False;
265 : : }
266 : : case typelib_TypeClass_BOOLEAN:
267 [ + + ]: 196763 : switch (pSourceType->eTypeClass)
268 : : {
269 : : case typelib_TypeClass_BOOLEAN:
270 : 196621 : *(sal_Bool *)pDest = (*(sal_Bool *)pSource != sal_False);
271 : 196621 : return sal_True;
272 : : default:
273 : 142 : return sal_False;
274 : : }
275 : : case typelib_TypeClass_BYTE:
276 [ + - ]: 5 : switch (pSourceType->eTypeClass)
277 : : {
278 : : case typelib_TypeClass_BYTE:
279 : 5 : *(sal_Int8 *)pDest = *(sal_Int8 *)pSource;
280 : 5 : return sal_True;
281 : : default:
282 : 0 : return sal_False;
283 : : }
284 : : case typelib_TypeClass_SHORT:
285 [ - + + ]: 568347 : switch (pSourceType->eTypeClass)
286 : : {
287 : : case typelib_TypeClass_BYTE:
288 : 0 : *(sal_Int16 *)pDest = *(sal_Int8 *)pSource;
289 : 0 : return sal_True;
290 : : case typelib_TypeClass_SHORT:
291 : : case typelib_TypeClass_UNSIGNED_SHORT:
292 : 568332 : *(sal_Int16 *)pDest = *(sal_Int16 *)pSource;
293 : 568332 : return sal_True;
294 : : default:
295 : 15 : return sal_False;
296 : : }
297 : : case typelib_TypeClass_UNSIGNED_SHORT:
298 [ - + - ]: 4202 : switch (pSourceType->eTypeClass)
299 : : {
300 : : case typelib_TypeClass_BYTE:
301 : 0 : *(sal_uInt16 *)pDest = *(sal_Int8 *)pSource;
302 : 0 : return sal_True;
303 : : case typelib_TypeClass_SHORT:
304 : : case typelib_TypeClass_UNSIGNED_SHORT:
305 : 4202 : *(sal_uInt16 *)pDest = *(sal_uInt16 *)pSource;
306 : 4202 : return sal_True;
307 : : default:
308 : 0 : return sal_False;
309 : : }
310 : : case typelib_TypeClass_LONG:
311 [ + + - + : 922867 : switch (pSourceType->eTypeClass)
+ ]
312 : : {
313 : : case typelib_TypeClass_BYTE:
314 : 11566 : *(sal_Int32 *)pDest = *(sal_Int8 *)pSource;
315 : 11566 : return sal_True;
316 : : case typelib_TypeClass_SHORT:
317 : 5371 : *(sal_Int32 *)pDest = *(sal_Int16 *)pSource;
318 : 5371 : return sal_True;
319 : : case typelib_TypeClass_UNSIGNED_SHORT:
320 : 0 : *(sal_Int32 *)pDest = *(sal_uInt16 *)pSource;
321 : 0 : return sal_True;
322 : : case typelib_TypeClass_LONG:
323 : : case typelib_TypeClass_UNSIGNED_LONG:
324 : 900584 : *(sal_Int32 *)pDest = *(sal_Int32 *)pSource;
325 : 900584 : return sal_True;
326 : : default:
327 : 5346 : return sal_False;
328 : : }
329 : : case typelib_TypeClass_UNSIGNED_LONG:
330 [ - - - + : 7537 : switch (pSourceType->eTypeClass)
- ]
331 : : {
332 : : case typelib_TypeClass_BYTE:
333 : 0 : *(sal_uInt32 *)pDest = *(sal_Int8 *)pSource;
334 : 0 : return sal_True;
335 : : case typelib_TypeClass_SHORT:
336 : 0 : *(sal_uInt32 *)pDest = *(sal_Int16 *)pSource;
337 : 0 : return sal_True;
338 : : case typelib_TypeClass_UNSIGNED_SHORT:
339 : 0 : *(sal_uInt32 *)pDest = *(sal_uInt16 *)pSource;
340 : 0 : return sal_True;
341 : : case typelib_TypeClass_LONG:
342 : : case typelib_TypeClass_UNSIGNED_LONG:
343 : 7537 : *(sal_uInt32 *)pDest = *(sal_uInt32 *)pSource;
344 : 7537 : return sal_True;
345 : : default:
346 : 0 : return sal_False;
347 : : }
348 : : case typelib_TypeClass_HYPER:
349 [ - - - - : 5 : switch (pSourceType->eTypeClass)
- + - ]
350 : : {
351 : : case typelib_TypeClass_BYTE:
352 : 0 : *(sal_Int64 *)pDest = *(sal_Int8 *)pSource;
353 : 0 : return sal_True;
354 : : case typelib_TypeClass_SHORT:
355 : 0 : *(sal_Int64 *)pDest = *(sal_Int16 *)pSource;
356 : 0 : return sal_True;
357 : : case typelib_TypeClass_UNSIGNED_SHORT:
358 : 0 : *(sal_Int64 *)pDest = *(sal_uInt16 *)pSource;
359 : 0 : return sal_True;
360 : : case typelib_TypeClass_LONG:
361 : 0 : *(sal_Int64 *)pDest = *(sal_Int32 *)pSource;
362 : 0 : return sal_True;
363 : : case typelib_TypeClass_UNSIGNED_LONG:
364 : 0 : *(sal_Int64 *)pDest = *(sal_uInt32 *)pSource;
365 : 0 : return sal_True;
366 : : case typelib_TypeClass_HYPER:
367 : : case typelib_TypeClass_UNSIGNED_HYPER:
368 : 5 : *(sal_Int64 *)pDest = *(sal_Int64 *)pSource;
369 : 5 : return sal_True;
370 : : default:
371 : 0 : return sal_False;
372 : : }
373 : : case typelib_TypeClass_UNSIGNED_HYPER:
374 [ # # # # : 0 : switch (pSourceType->eTypeClass)
# # # ]
375 : : {
376 : : case typelib_TypeClass_BYTE:
377 : 0 : *(sal_uInt64 *)pDest = *(sal_Int8 *)pSource;
378 : 0 : return sal_True;
379 : : case typelib_TypeClass_SHORT:
380 : 0 : *(sal_uInt64 *)pDest = *(sal_Int16 *)pSource;
381 : 0 : return sal_True;
382 : : case typelib_TypeClass_UNSIGNED_SHORT:
383 : 0 : *(sal_uInt64 *)pDest = *(sal_uInt16 *)pSource;
384 : 0 : return sal_True;
385 : : case typelib_TypeClass_LONG:
386 : 0 : *(sal_uInt64 *)pDest = *(sal_Int32 *)pSource;
387 : 0 : return sal_True;
388 : : case typelib_TypeClass_UNSIGNED_LONG:
389 : 0 : *(sal_uInt64 *)pDest = *(sal_uInt32 *)pSource;
390 : 0 : return sal_True;
391 : : case typelib_TypeClass_HYPER:
392 : : case typelib_TypeClass_UNSIGNED_HYPER:
393 : 0 : *(sal_uInt64 *)pDest = *(sal_uInt64 *)pSource;
394 : 0 : return sal_True;
395 : : default:
396 : 0 : return sal_False;
397 : : }
398 : : case typelib_TypeClass_FLOAT:
399 [ - - - + : 195827 : switch (pSourceType->eTypeClass)
- ]
400 : : {
401 : : case typelib_TypeClass_BYTE:
402 : 0 : *(float *)pDest = *(sal_Int8 *)pSource;
403 : 0 : return sal_True;
404 : : case typelib_TypeClass_SHORT:
405 : 0 : *(float *)pDest = *(sal_Int16 *)pSource;
406 : 0 : return sal_True;
407 : : case typelib_TypeClass_UNSIGNED_SHORT:
408 : 0 : *(float *)pDest = *(sal_uInt16 *)pSource;
409 : 0 : return sal_True;
410 : : case typelib_TypeClass_FLOAT:
411 : 195827 : *(float *)pDest = *(float *)pSource;
412 : 195827 : return sal_True;
413 : : default:
414 : 0 : return sal_False;
415 : : }
416 : : case typelib_TypeClass_DOUBLE:
417 [ - - - - : 322946 : switch (pSourceType->eTypeClass)
- - + - ]
418 : : {
419 : : case typelib_TypeClass_BYTE:
420 : 0 : *(double *)pDest = *(sal_Int8 *)pSource;
421 : 0 : return sal_True;
422 : : case typelib_TypeClass_SHORT:
423 : 0 : *(double *)pDest = *(sal_Int16 *)pSource;
424 : 0 : return sal_True;
425 : : case typelib_TypeClass_UNSIGNED_SHORT:
426 : 0 : *(double *)pDest = *(sal_uInt16 *)pSource;
427 : 0 : return sal_True;
428 : : case typelib_TypeClass_LONG:
429 : 0 : *(double *)pDest = *(sal_Int32 *)pSource;
430 : 0 : return sal_True;
431 : : case typelib_TypeClass_UNSIGNED_LONG:
432 : 0 : *(double *)pDest = *(sal_uInt32 *)pSource;
433 : 0 : return sal_True;
434 : : case typelib_TypeClass_FLOAT:
435 : 0 : *(double *)pDest = *(float *)pSource;
436 : 0 : return sal_True;
437 : : case typelib_TypeClass_DOUBLE:
438 : 322946 : *(double *)pDest = *(double *)pSource;
439 : 322946 : return sal_True;
440 : : default:
441 : 0 : return sal_False;
442 : : }
443 : : case typelib_TypeClass_STRING:
444 [ + + ]: 1106328 : switch (pSourceType->eTypeClass)
445 : : {
446 : : case typelib_TypeClass_STRING:
447 : 1102998 : ::rtl_uString_assign( (rtl_uString **)pDest, *(rtl_uString **)pSource );
448 : 1102998 : return sal_True;
449 : : default:
450 : 3330 : return sal_False;
451 : : }
452 : : case typelib_TypeClass_TYPE:
453 [ + - ]: 1151 : switch (pSourceType->eTypeClass)
454 : : {
455 : : case typelib_TypeClass_TYPE:
456 : : {
457 : 1151 : typelib_TypeDescriptionReference ** pp = (typelib_TypeDescriptionReference **)pDest;
458 : 1151 : ::typelib_typedescriptionreference_release( *pp );
459 : 1151 : *pp = *(typelib_TypeDescriptionReference **)pSource;
460 : 1151 : TYPE_ACQUIRE( *pp );
461 : 1151 : return sal_True;
462 : : }
463 : : default:
464 : 0 : return sal_False;
465 : : }
466 : : case typelib_TypeClass_ANY:
467 : 662674 : _destructAny( (uno_Any *)pDest, release );
468 : 662674 : _copyConstructAny( (uno_Any *)pDest, pSource, pSourceType, pSourceTypeDescr, acquire, 0 );
469 : 662674 : return sal_True;
470 : : case typelib_TypeClass_ENUM:
471 [ + + ]: 954928 : if (_type_equals( pDestType, pSourceType ))
472 : : {
473 : 954327 : *(sal_Int32 *)pDest = *(sal_Int32 *)pSource;
474 : 954327 : return sal_True;
475 : : }
476 : 601 : return sal_False;
477 : : case typelib_TypeClass_STRUCT:
478 : : case typelib_TypeClass_EXCEPTION:
479 [ + + ][ + + ]: 1587802 : if (typelib_TypeClass_STRUCT == pSourceType->eTypeClass ||
480 : : typelib_TypeClass_EXCEPTION == pSourceType->eTypeClass)
481 : : {
482 : 1240627 : sal_Bool bRet = sal_False;
483 [ + + ]: 1240627 : if (pSourceTypeDescr)
484 : : {
485 : : typelib_CompoundTypeDescription * pTypeDescr =
486 : 2412 : (typelib_CompoundTypeDescription *)pSourceTypeDescr;
487 [ + - - + ]: 4824 : while (pTypeDescr &&
[ - + ]
488 : : !_type_equals(
489 : 2412 : ((typelib_TypeDescription *)pTypeDescr)->pWeakRef, pDestType ))
490 : : {
491 : 0 : pTypeDescr = pTypeDescr->pBaseTypeDescription;
492 : : }
493 [ + - ]: 2412 : if (pTypeDescr)
494 : : {
495 : : bRet = _assignStruct(
496 : 2412 : pDest, pSource, pTypeDescr, queryInterface, acquire, release );
497 : : }
498 : : }
499 : : else
500 : : {
501 [ + - ][ - + ]: 1238215 : TYPELIB_DANGER_GET( &pSourceTypeDescr, pSourceType );
[ + - ][ - + ]
[ # # ]
502 : : typelib_CompoundTypeDescription * pTypeDescr =
503 : 1238215 : (typelib_CompoundTypeDescription *)pSourceTypeDescr;
504 [ + + + + ]: 2564742 : while (pTypeDescr &&
[ + + ]
505 : : !_type_equals(
506 : 1239882 : ((typelib_TypeDescription *)pTypeDescr)->pWeakRef, pDestType ))
507 : : {
508 : 86645 : pTypeDescr = pTypeDescr->pBaseTypeDescription;
509 : : }
510 [ + + ]: 1238215 : if (pTypeDescr)
511 : : {
512 : : bRet = _assignStruct(
513 : 1153237 : pDest, pSource, pTypeDescr, queryInterface, acquire, release );
514 : : }
515 [ + - ][ - + ]: 1238215 : TYPELIB_DANGER_RELEASE( pSourceTypeDescr );
516 : : }
517 : 1240627 : return bRet;
518 : : }
519 : 347175 : return sal_False;
520 : : case typelib_TypeClass_ARRAY:
521 : : {
522 : 0 : sal_Bool bRet = sal_False;
523 [ # # ]: 0 : if (pSourceTypeDescr)
524 : : {
525 : : typelib_ArrayTypeDescription * pTypeDescr =
526 : 0 : (typelib_ArrayTypeDescription *)pSourceTypeDescr;
527 : 0 : bRet = _assignArray( pDest, pSource, pTypeDescr, queryInterface, acquire, release );
528 : : }
529 : : else
530 : : {
531 [ # # ][ # # ]: 0 : TYPELIB_DANGER_GET( &pSourceTypeDescr, pSourceType );
[ # # ][ # # ]
[ # # ]
532 : : typelib_ArrayTypeDescription * pTypeDescr =
533 : 0 : (typelib_ArrayTypeDescription *)pSourceTypeDescr;
534 [ # # ]: 0 : if ( pTypeDescr )
535 : : {
536 : : bRet = _assignArray(
537 : 0 : pDest, pSource, pTypeDescr, queryInterface, acquire, release );
538 : : }
539 [ # # ][ # # ]: 0 : TYPELIB_DANGER_RELEASE( pSourceTypeDescr );
540 : : }
541 : 0 : return bRet;
542 : : }
543 : : case typelib_TypeClass_UNION:
544 [ # # ]: 0 : if (_type_equals( pDestType, pSourceType ))
545 : : {
546 [ # # ]: 0 : if (pDestTypeDescr)
547 : : {
548 : 0 : _destructUnion( pDest, pDestTypeDescr, release );
549 : 0 : _copyConstructUnion( pDest, pSource, pDestTypeDescr, acquire, 0 );
550 : : }
551 : : else
552 : : {
553 [ # # ][ # # ]: 0 : TYPELIB_DANGER_GET( &pDestTypeDescr, pDestType );
[ # # ][ # # ]
[ # # ]
554 : 0 : _destructUnion( pDest, pDestTypeDescr, release );
555 : 0 : _copyConstructUnion( pDest, pSource, pDestTypeDescr, acquire, 0 );
556 [ # # ][ # # ]: 0 : TYPELIB_DANGER_RELEASE( pDestTypeDescr );
557 : : }
558 : 0 : return sal_True;
559 : : }
560 : 0 : return sal_False;
561 : : case typelib_TypeClass_SEQUENCE:
562 [ + + ]: 2264673 : if (typelib_TypeClass_SEQUENCE != pSourceType->eTypeClass)
563 : 29712 : return sal_False;
564 : : // self assignment:
565 [ + + ]: 2234961 : if (*(uno_Sequence **)pSource == *(uno_Sequence **)pDest)
566 : 129626 : return sal_True;
567 [ + + ]: 2105335 : if (_type_equals( pDestType, pSourceType ))
568 : : {
569 : : ::osl_incrementInterlockedCount(
570 : 2076225 : &(*(uno_Sequence **)pSource)->nRefCount );
571 : : idestructSequence(
572 : 2076225 : *(uno_Sequence **)pDest, pDestType, pDestTypeDescr, release );
573 : 2076225 : *(uno_Sequence **)pDest = *(uno_Sequence **)pSource;
574 : 2076225 : return sal_True;
575 : : }
576 : 29110 : return sal_False;
577 : : case typelib_TypeClass_INTERFACE:
578 [ + + ]: 2322219 : if (typelib_TypeClass_INTERFACE != pSourceType->eTypeClass)
579 : 129232 : return sal_False;
580 [ + + ]: 2192987 : if (_type_equals( pDestType, pSourceType ))
581 : : {
582 : 1047374 : _assignInterface( (void **)pDest, *(void **)pSource, acquire, release );
583 : 1047374 : return sal_True;
584 : : }
585 [ + + ]: 1145613 : else if (*static_cast< void ** >(pSource) == 0)
586 : : {
587 : : // A null reference of any interface type can be converted to a null
588 : : // reference of any other interface type:
589 : 297328 : void * const pToBeReleased = *static_cast< void ** >(pDest);
590 : 297328 : *static_cast< void ** >(pDest) = 0;
591 : 297328 : _release( pToBeReleased, release );
592 : 297328 : return true;
593 : : }
594 : : else
595 : : {
596 [ - + ]: 848285 : if (pSourceTypeDescr)
597 : : {
598 : 0 : typelib_TypeDescription * pTD = pSourceTypeDescr;
599 [ # # ][ # # ]: 0 : while (pTD && !_type_equals( pTD->pWeakRef, pDestType ))
[ # # ]
600 : : {
601 : : pTD = (typelib_TypeDescription *)
602 : 0 : ((typelib_InterfaceTypeDescription *)pTD)->pBaseTypeDescription;
603 : : }
604 [ # # ]: 0 : if (pTD) // is base of dest
605 : : {
606 : 0 : _assignInterface( (void **)pDest, *(void **)pSource, acquire, release );
607 : 0 : return true;
608 : : }
609 : : }
610 : :
611 : : // query for interface:
612 : : void * pQueried = _queryInterface( *static_cast<void **>(pSource),
613 : 848285 : pDestType, queryInterface );
614 [ + + ]: 848285 : if (pQueried != 0) {
615 : 797277 : void * const pToBeReleased = *static_cast<void **>(pDest);
616 : 797277 : *static_cast<void **>(pDest) = pQueried;
617 : 797277 : _release( pToBeReleased, release );
618 : : }
619 : 848285 : return (pQueried != 0);
620 : : }
621 : : default:
622 : : OSL_ASSERT(false);
623 : 11118304 : return sal_False;
624 : : }
625 : : }
626 : :
627 : : }
628 : :
629 : : #endif
630 : :
631 : : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|