LCOV - code coverage report
Current view: top level - libreoffice/cppu/source/uno - copy.hxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 222 374 59.4 %
Date: 2012-12-17 Functions: 6 8 75.0 %
Legend: Lines: hit not hit

          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 COPY_HXX
      20             : #define COPY_HXX
      21             : 
      22             : #include "prim.hxx"
      23             : #include "constr.hxx"
      24             : 
      25             : 
      26             : namespace cppu
      27             : {
      28             : 
      29             : //##################################################################################################
      30             : //#### copy construction ###########################################################################
      31             : //##################################################################################################
      32             : 
      33             : //------------------------------------------------------------------------------
      34       96317 : inline uno_Sequence * allocSeq(
      35             :     sal_Int32 nElementSize, sal_Int32 nElements )
      36             : {
      37             :     OSL_ASSERT( nElements >= 0 && nElementSize >= 0 );
      38       96317 :     uno_Sequence * pSeq = 0;
      39       96317 :     sal_uInt32 nSize = calcSeqMemSize( nElementSize, nElements );
      40       96317 :     if (nSize > 0)
      41             :     {
      42       96317 :         pSeq = (uno_Sequence *) rtl_allocateMemory( nSize );
      43       96317 :         if (pSeq != 0)
      44             :         {
      45             :             // header init
      46       96317 :             pSeq->nRefCount = 1;
      47       96317 :             pSeq->nElements = nElements;
      48             :         }
      49             :     }
      50       96317 :     return pSeq;
      51             : }
      52             : 
      53             : //--------------------------------------------------------------------------------------------------
      54             : void copyConstructStruct(
      55             :     void * pDest, void * pSource,
      56             :     typelib_CompoundTypeDescription * pTypeDescr,
      57             :     uno_AcquireFunc acquire, uno_Mapping * mapping )
      58             :     SAL_THROW (());
      59             : //--------------------------------------------------------------------------------------------------
      60      605697 : inline void _copyConstructStruct(
      61             :     void * pDest, void * pSource,
      62             :     typelib_CompoundTypeDescription * pTypeDescr,
      63             :     uno_AcquireFunc acquire, uno_Mapping * mapping )
      64             :     SAL_THROW (())
      65             : {
      66      605697 :     if (pTypeDescr->pBaseTypeDescription)
      67             :     {
      68             :         // copy base value
      69      181441 :         copyConstructStruct( pDest, pSource, pTypeDescr->pBaseTypeDescription, acquire, mapping );
      70             :     }
      71             : 
      72             :     // then copy members
      73      605697 :     typelib_TypeDescriptionReference ** ppTypeRefs = pTypeDescr->ppTypeRefs;
      74      605697 :     sal_Int32 * pMemberOffsets = pTypeDescr->pMemberOffsets;
      75      605697 :     sal_Int32 nDescr = pTypeDescr->nMembers;
      76             : 
      77      605697 :     if (mapping)
      78             :     {
      79      319042 :         while (nDescr--)
      80             :         {
      81             :             ::uno_type_copyAndConvertData(
      82      332960 :                 (char *)pDest + pMemberOffsets[nDescr],
      83      332960 :                 (char *)pSource + pMemberOffsets[nDescr],
      84      665920 :                 ppTypeRefs[nDescr], mapping );
      85             :         }
      86             :     }
      87             :     else
      88             :     {
      89     2521575 :         while (nDescr--)
      90             :         {
      91             :             ::uno_type_copyData(
      92     2925486 :                 (char *)pDest + pMemberOffsets[nDescr],
      93     2925486 :                 (char *)pSource + pMemberOffsets[nDescr],
      94     5850972 :                 ppTypeRefs[nDescr], acquire );
      95             :         }
      96             :     }
      97      605697 : }
      98             : //--------------------------------------------------------------------------------------------------
      99           0 : inline void _copyConstructArray(
     100             :     void * pDest, void * pSource,
     101             :     typelib_ArrayTypeDescription * pTypeDescr,
     102             :     uno_AcquireFunc acquire, uno_Mapping * mapping )
     103             : {
     104           0 :     typelib_TypeDescriptionReference * pElementTypeRef = ((typelib_IndirectTypeDescription *)pTypeDescr)->pType;
     105           0 :     typelib_TypeDescription * pElementTypeDescr = NULL;
     106           0 :     TYPELIB_DANGER_GET( &pElementTypeDescr, pElementTypeRef );
     107           0 :     sal_Int32 nElementSize = ((typelib_TypeDescription*)pElementTypeDescr)->nSize;
     108           0 :     TYPELIB_DANGER_RELEASE( pElementTypeDescr );
     109           0 :     sal_Int32 nTotalElements = pTypeDescr->nTotalElements;
     110             : 
     111           0 :     if (mapping)
     112             :     {
     113           0 :         for(sal_Int32 i = 0; i < nTotalElements; i++)
     114             :         {
     115             :             ::uno_type_copyAndConvertData(
     116           0 :                 (sal_Char *)pDest + i * nElementSize,
     117           0 :                 (sal_Char *)pSource + i * nElementSize,
     118           0 :                 pElementTypeRef, mapping );
     119             :         }
     120             :     }
     121             :     else
     122             :     {
     123           0 :         for(sal_Int32 i = 0; i < nTotalElements; i++)
     124             :         {
     125             :             ::uno_type_copyData(
     126           0 :                 (sal_Char *)pDest + (i * nElementSize),
     127           0 :                 (sal_Char *)pSource + (i * nElementSize),
     128           0 :                 pElementTypeRef, acquire );
     129             :         }
     130             :     }
     131           0 : }
     132             : //--------------------------------------------------------------------------------------------------
     133           0 : inline void _copyConstructUnion(
     134             :     void * pDest, void * pSource,
     135             :     typelib_TypeDescription * pTypeDescr,
     136             :     uno_AcquireFunc acquire, uno_Mapping * mapping )
     137             :     SAL_THROW (())
     138             : {
     139           0 :     typelib_TypeDescriptionReference * pSetType = _unionGetSetType( pSource, pTypeDescr );
     140           0 :     if (mapping)
     141             :     {
     142             :         ::uno_type_copyAndConvertData(
     143           0 :             (char *)pDest + ((typelib_UnionTypeDescription *)pTypeDescr)->nValueOffset,
     144           0 :             (char *)pSource + ((typelib_UnionTypeDescription *)pTypeDescr)->nValueOffset,
     145           0 :             pSetType, mapping );
     146             :     }
     147             :     else
     148             :     {
     149             :         ::uno_type_copyData(
     150           0 :             (char *)pDest + ((typelib_UnionTypeDescription *)pTypeDescr)->nValueOffset,
     151           0 :             (char *)pSource + ((typelib_UnionTypeDescription *)pTypeDescr)->nValueOffset,
     152           0 :             pSetType, acquire );
     153             :     }
     154           0 :     *(sal_Int64 *)pDest = *(sal_Int64 *)pSource;
     155           0 :     typelib_typedescriptionreference_release( pSetType );
     156           0 : }
     157             : 
     158             : //------------------------------------------------------------------------------
     159             : uno_Sequence * copyConstructSequence(
     160             :     uno_Sequence * pSource,
     161             :     typelib_TypeDescriptionReference * pElementType,
     162             :     uno_AcquireFunc acquire, uno_Mapping * mapping );
     163             : 
     164             : //--------------------------------------------------------------------------------------------------
     165    21610487 : inline void _copyConstructAnyFromData(
     166             :     uno_Any * pDestAny, void * pSource,
     167             :     typelib_TypeDescriptionReference * pType, typelib_TypeDescription * pTypeDescr,
     168             :     uno_AcquireFunc acquire, uno_Mapping * mapping )
     169             :     SAL_THROW (())
     170             : {
     171    21610487 :     TYPE_ACQUIRE( pType );
     172    21610487 :     pDestAny->pType = pType;
     173             : 
     174    21610487 :     switch (pType->eTypeClass)
     175             :     {
     176             :     case typelib_TypeClass_CHAR:
     177          30 :         pDestAny->pData = &pDestAny->pReserved;
     178          30 :         *(sal_Unicode *)pDestAny->pData = *(sal_Unicode *)pSource;
     179          30 :         break;
     180             :     case typelib_TypeClass_BOOLEAN:
     181     3433252 :         pDestAny->pData = &pDestAny->pReserved;
     182     3433252 :         *(sal_Bool *)pDestAny->pData = (*(sal_Bool *)pSource != sal_False);
     183     3433252 :         break;
     184             :     case typelib_TypeClass_BYTE:
     185        9262 :         pDestAny->pData = &pDestAny->pReserved;
     186        9262 :         *(sal_Int8 *)pDestAny->pData = *(sal_Int8 *)pSource;
     187        9262 :         break;
     188             :     case typelib_TypeClass_SHORT:
     189             :     case typelib_TypeClass_UNSIGNED_SHORT:
     190      569154 :         pDestAny->pData = &pDestAny->pReserved;
     191      569154 :         *(sal_Int16 *)pDestAny->pData = *(sal_Int16 *)pSource;
     192      569154 :         break;
     193             :     case typelib_TypeClass_LONG:
     194             :     case typelib_TypeClass_UNSIGNED_LONG:
     195     1916373 :         pDestAny->pData = &pDestAny->pReserved;
     196     1916373 :         *(sal_Int32 *)pDestAny->pData = *(sal_Int32 *)pSource;
     197     1916373 :         break;
     198             :     case typelib_TypeClass_HYPER:
     199             :     case typelib_TypeClass_UNSIGNED_HYPER:
     200             :         if (sizeof(void *) >= sizeof(sal_Int64))
     201             :             pDestAny->pData = &pDestAny->pReserved;
     202             :         else
     203       51994 :             pDestAny->pData = ::rtl_allocateMemory( sizeof(sal_Int64) );
     204       51994 :         *(sal_Int64 *)pDestAny->pData = *(sal_Int64 *)pSource;
     205       51994 :         break;
     206             :     case typelib_TypeClass_FLOAT:
     207             :         if (sizeof(void *) >= sizeof(float))
     208       81735 :             pDestAny->pData = &pDestAny->pReserved;
     209             :         else
     210             :             pDestAny->pData = ::rtl_allocateMemory( sizeof(float) );
     211       81735 :         *(float *)pDestAny->pData = *(float *)pSource;
     212       81735 :         break;
     213             :     case typelib_TypeClass_DOUBLE:
     214             :         if (sizeof(void *) >= sizeof(double))
     215             :             pDestAny->pData = &pDestAny->pReserved;
     216             :         else
     217      103050 :             pDestAny->pData = ::rtl_allocateMemory( sizeof(double) );
     218      103050 :         *(double *)pDestAny->pData = *(double *)pSource;
     219      103050 :         break;
     220             :     case typelib_TypeClass_STRING:
     221     6494832 :         ::rtl_uString_acquire( *(rtl_uString **)pSource );
     222     6494832 :         pDestAny->pData = &pDestAny->pReserved;
     223     6494832 :         *(rtl_uString **)pDestAny->pData = *(rtl_uString **)pSource;
     224     6494832 :         break;
     225             :     case typelib_TypeClass_TYPE:
     226        1869 :         TYPE_ACQUIRE( *(typelib_TypeDescriptionReference **)pSource );
     227        1869 :         pDestAny->pData = &pDestAny->pReserved;
     228        1869 :         *(typelib_TypeDescriptionReference **)pDestAny->pData = *(typelib_TypeDescriptionReference **)pSource;
     229        1869 :         break;
     230             :     case typelib_TypeClass_ANY:
     231             :         OSL_FAIL( "### unexpected nested any!" );
     232           0 :         break;
     233             :     case typelib_TypeClass_ENUM:
     234      232285 :         pDestAny->pData = &pDestAny->pReserved;
     235             :         // enum is forced to 32bit long
     236      232285 :         *(sal_Int32 *)pDestAny->pData = *(sal_Int32 *)pSource;
     237      232285 :         break;
     238             :     case typelib_TypeClass_STRUCT:
     239             :     case typelib_TypeClass_EXCEPTION:
     240      377053 :         if (pTypeDescr)
     241             :         {
     242         431 :             pDestAny->pData = ::rtl_allocateMemory( pTypeDescr->nSize );
     243             :             _copyConstructStruct(
     244             :                 pDestAny->pData, pSource,
     245             :                 (typelib_CompoundTypeDescription *)pTypeDescr,
     246         431 :                 acquire, mapping );
     247             :         }
     248             :         else
     249             :         {
     250      376622 :             TYPELIB_DANGER_GET( &pTypeDescr, pType );
     251      376622 :             pDestAny->pData = ::rtl_allocateMemory( pTypeDescr->nSize );
     252             :             _copyConstructStruct(
     253             :                 pDestAny->pData, pSource,
     254             :                 (typelib_CompoundTypeDescription *)pTypeDescr,
     255      376622 :                 acquire, mapping );
     256      376622 :             TYPELIB_DANGER_RELEASE( pTypeDescr );
     257             :         }
     258      377053 :         break;
     259             :     case typelib_TypeClass_ARRAY:
     260           0 :         if (pTypeDescr)
     261             :         {
     262           0 :             pDestAny->pData = ::rtl_allocateMemory( pTypeDescr->nSize );
     263             :             _copyConstructArray(
     264             :                 pDestAny->pData, pSource,
     265             :                 (typelib_ArrayTypeDescription *)pTypeDescr,
     266           0 :                 acquire, mapping );
     267             :         }
     268             :         else
     269             :         {
     270           0 :             TYPELIB_DANGER_GET( &pTypeDescr, pType );
     271           0 :             pDestAny->pData = ::rtl_allocateMemory( pTypeDescr->nSize );
     272             :             _copyConstructArray(
     273             :                 pDestAny->pData, pSource,
     274             :                 (typelib_ArrayTypeDescription *)pTypeDescr,
     275           0 :                 acquire, mapping );
     276           0 :             TYPELIB_DANGER_RELEASE( pTypeDescr );
     277             :         }
     278           0 :         break;
     279             :     case typelib_TypeClass_UNION:
     280           0 :         if (pTypeDescr)
     281             :         {
     282           0 :             pDestAny->pData = ::rtl_allocateMemory( pTypeDescr->nSize );
     283           0 :             _copyConstructUnion( pDestAny->pData, pSource, pTypeDescr, acquire, mapping );
     284             :         }
     285             :         else
     286             :         {
     287           0 :             TYPELIB_DANGER_GET( &pTypeDescr, pType );
     288           0 :             pDestAny->pData = ::rtl_allocateMemory( pTypeDescr->nSize );
     289           0 :             _copyConstructUnion( pDestAny->pData, pSource, pTypeDescr, acquire, mapping );
     290           0 :             TYPELIB_DANGER_RELEASE( pTypeDescr );
     291             :         }
     292           0 :         break;
     293             :     case typelib_TypeClass_SEQUENCE:
     294      779956 :         pDestAny->pData = &pDestAny->pReserved;
     295      779956 :         if (pTypeDescr)
     296             :         {
     297             :             *(uno_Sequence **)pDestAny->pData = copyConstructSequence(
     298             :                 *(uno_Sequence **)pSource,
     299             :                 ((typelib_IndirectTypeDescription *)pTypeDescr)->pType,
     300         254 :                 acquire, mapping );
     301             :         }
     302             :         else
     303             :         {
     304      779702 :             TYPELIB_DANGER_GET( &pTypeDescr, pType );
     305             :             *(uno_Sequence **)pDestAny->pData = copyConstructSequence(
     306             :                 *(uno_Sequence **)pSource,
     307             :                 ((typelib_IndirectTypeDescription *)pTypeDescr)->pType,
     308      779702 :                 acquire, mapping );
     309      779702 :             TYPELIB_DANGER_RELEASE( pTypeDescr );
     310             :         }
     311      779956 :         break;
     312             :     case typelib_TypeClass_INTERFACE:
     313     7559642 :         pDestAny->pData = &pDestAny->pReserved;
     314     7559642 :         if (mapping)
     315             :         {
     316        1445 :             pDestAny->pReserved = _map( *(void **)pSource, pType, pTypeDescr, mapping );
     317             :         }
     318             :         else
     319             :         {
     320     7558197 :             _acquire( pDestAny->pReserved = *(void **)pSource, acquire );
     321             :         }
     322     7559642 :         break;
     323             :     default:
     324             :         OSL_ASSERT(false);
     325           0 :         break;
     326             :     }
     327    21610487 : }
     328             : //--------------------------------------------------------------------------------------------------
     329    25579452 : inline void _copyConstructAny(
     330             :     uno_Any * pDestAny, void * pSource,
     331             :     typelib_TypeDescriptionReference * pType, typelib_TypeDescription * pTypeDescr,
     332             :     uno_AcquireFunc acquire, uno_Mapping * mapping )
     333             :     SAL_THROW (())
     334             : {
     335    25579452 :     if (typelib_TypeClass_VOID == pType->eTypeClass)
     336             :     {
     337     3890518 :         CONSTRUCT_EMPTY_ANY( pDestAny );
     338             :     }
     339             :     else
     340             :     {
     341    21688934 :         if (typelib_TypeClass_ANY == pType->eTypeClass)
     342             :         {
     343      182464 :             if (pSource)
     344             :             {
     345      182464 :                 pType = ((uno_Any *)pSource)->pType;
     346      182464 :                 if (typelib_TypeClass_VOID == pType->eTypeClass)
     347             :                 {
     348      103626 :                     CONSTRUCT_EMPTY_ANY( pDestAny );
     349      103626 :                     return;
     350             :                 }
     351       78838 :                 pTypeDescr = 0;
     352       78838 :                 pSource = ((uno_Any *)pSource)->pData;
     353             :             }
     354             :             else
     355             :             {
     356           0 :                 CONSTRUCT_EMPTY_ANY( pDestAny );
     357           0 :                 return;
     358             :             }
     359             :         }
     360    21585308 :         if (pSource)
     361             :         {
     362    21584981 :             _copyConstructAnyFromData( pDestAny, pSource, pType, pTypeDescr, acquire, mapping );
     363             :         }
     364             :         else // default construct
     365             :         {
     366         327 :             TYPE_ACQUIRE( pType );
     367         327 :             pDestAny->pType = pType;
     368         327 :             switch (pType->eTypeClass)
     369             :             {
     370             :             case typelib_TypeClass_CHAR:
     371           0 :                 pDestAny->pData = &pDestAny->pReserved;
     372           0 :                 *(sal_Unicode *)pDestAny->pData = '\0';
     373           0 :                 break;
     374             :             case typelib_TypeClass_BOOLEAN:
     375           0 :                 pDestAny->pData = &pDestAny->pReserved;
     376           0 :                 *(sal_Bool *)pDestAny->pData = sal_False;
     377           0 :                 break;
     378             :             case typelib_TypeClass_BYTE:
     379           0 :                 pDestAny->pData = &pDestAny->pReserved;
     380           0 :                 *(sal_Int8 *)pDestAny->pData = 0;
     381           0 :                 break;
     382             :             case typelib_TypeClass_SHORT:
     383             :             case typelib_TypeClass_UNSIGNED_SHORT:
     384           2 :                 pDestAny->pData = &pDestAny->pReserved;
     385           2 :                 *(sal_Int16 *)pDestAny->pData = 0;
     386           2 :                 break;
     387             :             case typelib_TypeClass_LONG:
     388             :             case typelib_TypeClass_UNSIGNED_LONG:
     389           0 :                 pDestAny->pData = &pDestAny->pReserved;
     390           0 :                 *(sal_Int32 *)pDestAny->pData = 0;
     391           0 :                 break;
     392             :             case typelib_TypeClass_HYPER:
     393             :             case typelib_TypeClass_UNSIGNED_HYPER:
     394             :                 if (sizeof(void *) >= sizeof(sal_Int64))
     395             :                     pDestAny->pData = &pDestAny->pReserved;
     396             :                 else
     397           0 :                     pDestAny->pData = ::rtl_allocateMemory( sizeof(sal_Int64) );
     398           0 :                 *(sal_Int64 *)pDestAny->pData = 0;
     399           0 :                 break;
     400             :             case typelib_TypeClass_FLOAT:
     401             :                 if (sizeof(void *) >= sizeof(float))
     402           0 :                     pDestAny->pData = &pDestAny->pReserved;
     403             :                 else
     404             :                     pDestAny->pData = ::rtl_allocateMemory( sizeof(float) );
     405           0 :                 *(float *)pDestAny->pData = 0.0;
     406           0 :                 break;
     407             :             case typelib_TypeClass_DOUBLE:
     408             :                 if (sizeof(void *) >= sizeof(double))
     409             :                     pDestAny->pData = &pDestAny->pReserved;
     410             :                 else
     411           0 :                     pDestAny->pData = ::rtl_allocateMemory( sizeof(double) );
     412           0 :                 *(double *)pDestAny->pData = 0.0;
     413           0 :                 break;
     414             :             case typelib_TypeClass_STRING:
     415           0 :                 pDestAny->pData = &pDestAny->pReserved;
     416           0 :                 *(rtl_uString **)pDestAny->pData = 0;
     417           0 :                 ::rtl_uString_new( (rtl_uString **)pDestAny->pData );
     418           0 :                 break;
     419             :             case typelib_TypeClass_TYPE:
     420           0 :                 pDestAny->pData = &pDestAny->pReserved;
     421           0 :                 *(typelib_TypeDescriptionReference **)pDestAny->pData = _getVoidType();
     422           0 :                 break;
     423             :             case typelib_TypeClass_ENUM:
     424           0 :                 pDestAny->pData = &pDestAny->pReserved;
     425           0 :                 if (pTypeDescr)
     426             :                 {
     427           0 :                     *(sal_Int32 *)pDestAny->pData = ((typelib_EnumTypeDescription *)pTypeDescr)->nDefaultEnumValue;
     428             :                 }
     429             :                 else
     430             :                 {
     431           0 :                     TYPELIB_DANGER_GET( &pTypeDescr, pType );
     432           0 :                     *(sal_Int32 *)pDestAny->pData = ((typelib_EnumTypeDescription *)pTypeDescr)->nDefaultEnumValue;
     433           0 :                     TYPELIB_DANGER_RELEASE( pTypeDescr );
     434             :                 }
     435           0 :                 break;
     436             :             case typelib_TypeClass_STRUCT:
     437             :             case typelib_TypeClass_EXCEPTION:
     438          90 :                 if (pTypeDescr)
     439             :                 {
     440          90 :                     pDestAny->pData = ::rtl_allocateMemory( pTypeDescr->nSize );
     441             :                     _defaultConstructStruct(
     442          90 :                         pDestAny->pData, (typelib_CompoundTypeDescription *)pTypeDescr );
     443             :                 }
     444             :                 else
     445             :                 {
     446           0 :                     TYPELIB_DANGER_GET( &pTypeDescr, pType );
     447           0 :                     pDestAny->pData = ::rtl_allocateMemory( pTypeDescr->nSize );
     448             :                     _defaultConstructStruct(
     449           0 :                         pDestAny->pData, (typelib_CompoundTypeDescription *)pTypeDescr );
     450           0 :                     TYPELIB_DANGER_RELEASE( pTypeDescr );
     451             :                 }
     452          90 :                 break;
     453             :             case typelib_TypeClass_ARRAY:
     454           0 :                 if (pTypeDescr)
     455             :                 {
     456           0 :                     pDestAny->pData = ::rtl_allocateMemory( pTypeDescr->nSize );
     457             :                     _defaultConstructArray(
     458           0 :                         pDestAny->pData, (typelib_ArrayTypeDescription *)pTypeDescr );
     459             :                 }
     460             :                 else
     461             :                 {
     462           0 :                     TYPELIB_DANGER_GET( &pTypeDescr, pType );
     463           0 :                     pDestAny->pData = ::rtl_allocateMemory( pTypeDescr->nSize );
     464             :                     _defaultConstructArray(
     465           0 :                         pDestAny->pData, (typelib_ArrayTypeDescription *)pTypeDescr );
     466           0 :                     TYPELIB_DANGER_RELEASE( pTypeDescr );
     467             :                 }
     468           0 :                 break;
     469             :             case typelib_TypeClass_UNION:
     470           0 :                 if (pTypeDescr)
     471             :                 {
     472           0 :                     pDestAny->pData = ::rtl_allocateMemory( pTypeDescr->nSize );
     473           0 :                     _defaultConstructUnion( pDestAny->pData, pTypeDescr );
     474             :                 }
     475             :                 else
     476             :                 {
     477           0 :                     TYPELIB_DANGER_GET( &pTypeDescr, pType );
     478           0 :                     pDestAny->pData = ::rtl_allocateMemory( pTypeDescr->nSize );
     479           0 :                     _defaultConstructUnion( pDestAny->pData, pTypeDescr );
     480           0 :                     TYPELIB_DANGER_RELEASE( pTypeDescr );
     481             :                 }
     482           0 :                 break;
     483             :             case typelib_TypeClass_SEQUENCE:
     484         232 :                 pDestAny->pData = &pDestAny->pReserved;
     485         232 :                 *(uno_Sequence **)pDestAny->pData = createEmptySequence();
     486         232 :                 break;
     487             :             case typelib_TypeClass_INTERFACE:
     488           3 :                 pDestAny->pData = &pDestAny->pReserved;
     489           3 :                 pDestAny->pReserved = 0; // either cpp or c-uno interface
     490           3 :                 break;
     491             :             default:
     492             :                 OSL_ASSERT(false);
     493           0 :                 break;
     494             :             }
     495             :         }
     496             :     }
     497             : }
     498             : //------------------------------------------------------------------------------
     499      802727 : inline uno_Sequence * icopyConstructSequence(
     500             :     uno_Sequence * pSource,
     501             :     typelib_TypeDescriptionReference * pElementType,
     502             :     uno_AcquireFunc acquire, uno_Mapping * mapping )
     503             : {
     504      802727 :     typelib_TypeClass eTypeClass = pElementType->eTypeClass;
     505      802727 :     if (!mapping ||
     506             :         (eTypeClass <= typelib_TypeClass_ENUM &&
     507             :          eTypeClass != typelib_TypeClass_ANY))
     508             :     {
     509      789761 :         osl_atomic_increment( &pSource->nRefCount );
     510      789761 :         return pSource;
     511             :     }
     512             :     else // create new sequence
     513             :     {
     514             :         uno_Sequence * pDest;
     515       12966 :         sal_Int32 nElements = pSource->nElements;
     516       12966 :         if (nElements)
     517             :         {
     518       12732 :             switch (eTypeClass)
     519             :             {
     520             :             case typelib_TypeClass_ANY:
     521             :             {
     522       12424 :                 pDest = allocSeq( sizeof (uno_Any), nElements );
     523       12424 :                 if (pDest != 0)
     524             :                 {
     525       12424 :                     uno_Any * pDestElements = (uno_Any *)pDest->elements;
     526       12424 :                     uno_Any * pSourceElements = (uno_Any *)pSource->elements;
     527       50355 :                     for ( sal_Int32 nPos = nElements; nPos--; )
     528             :                     {
     529             :                         typelib_TypeDescriptionReference * pType =
     530       25507 :                             pSourceElements[nPos].pType;
     531       25507 :                         if (typelib_TypeClass_VOID == pType->eTypeClass)
     532             :                         {
     533           2 :                             CONSTRUCT_EMPTY_ANY( &pDestElements[nPos] );
     534             :                         }
     535             :                         else
     536             :                         {
     537             :                             _copyConstructAnyFromData(
     538             :                                 &pDestElements[nPos],
     539       25505 :                                 pSourceElements[nPos].pData,
     540             :                                 pType, 0,
     541       25505 :                                 acquire, mapping );
     542             :                         }
     543             :                     }
     544             :                 }
     545       12424 :                 break;
     546             :             }
     547             :             case typelib_TypeClass_STRUCT:
     548             :             case typelib_TypeClass_EXCEPTION:
     549             :             {
     550         212 :                 typelib_TypeDescription * pElementTypeDescr = 0;
     551         212 :                 TYPELIB_DANGER_GET( &pElementTypeDescr, pElementType );
     552         212 :                 sal_Int32 nElementSize = pElementTypeDescr->nSize;
     553         212 :                 char * pSourceElements = pSource->elements;
     554         212 :                 pDest = allocSeq( nElementSize, nElements );
     555         212 :                 if (pDest != 0)
     556             :                 {
     557         212 :                     char * pElements = pDest->elements;
     558         824 :                     for ( sal_Int32 nPos = nElements; nPos--; )
     559             :                     {
     560             :                         _copyConstructStruct(
     561         400 :                             pElements + (nPos * nElementSize),
     562         400 :                             pSourceElements + (nPos * nElementSize),
     563             :                             (typelib_CompoundTypeDescription *)
     564             :                             pElementTypeDescr,
     565        1200 :                             acquire, mapping );
     566             :                     }
     567             :                 }
     568         212 :                 TYPELIB_DANGER_RELEASE( pElementTypeDescr );
     569             :                 break;
     570             :             }
     571             :             case typelib_TypeClass_ARRAY:
     572             :             {
     573           0 :                 typelib_TypeDescription * pElementTypeDescr = 0;
     574           0 :                 TYPELIB_DANGER_GET( &pElementTypeDescr, pElementType );
     575           0 :                 sal_Int32 nElementSize = pElementTypeDescr->nSize;
     576           0 :                 char * pSourceElements = pSource->elements;
     577           0 :                 pDest = allocSeq( nElementSize, nElements );
     578           0 :                 if (pDest != 0)
     579             :                 {
     580           0 :                     char * pElements = pDest->elements;
     581           0 :                     for ( sal_Int32 nPos = nElements; nPos--; )
     582             :                     {
     583             :                         _copyConstructArray(
     584           0 :                             pElements + (nPos * nElementSize),
     585           0 :                             pSourceElements + (nPos * nElementSize),
     586             :                             (typelib_ArrayTypeDescription *)pElementTypeDescr,
     587           0 :                             acquire, mapping );
     588             :                     }
     589             :                 }
     590           0 :                 TYPELIB_DANGER_RELEASE( pElementTypeDescr );
     591             :                 break;
     592             :             }
     593             :             case typelib_TypeClass_UNION:
     594             :             {
     595           0 :                 typelib_TypeDescription * pElementTypeDescr = 0;
     596           0 :                 TYPELIB_DANGER_GET( &pElementTypeDescr, pElementType );
     597           0 :                 sal_Int32 nElementSize = pElementTypeDescr->nSize;
     598             :                 sal_Int32 nValueOffset =
     599             :                     ((typelib_UnionTypeDescription *)
     600           0 :                      pElementTypeDescr)->nValueOffset;
     601           0 :                 pDest = allocSeq( nElementSize, nElements );
     602           0 :                 if (pDest != 0)
     603             :                 {
     604           0 :                     char * pElements = pDest->elements;
     605           0 :                     char * pSourceElements = pSource->elements;
     606           0 :                     for ( sal_Int32 nPos = nElements; nPos--; )
     607             :                     {
     608             :                         char * pDest2 =
     609           0 :                             pElements + (nPos * nElementSize);
     610             :                         char * pSource2 =
     611           0 :                             pSourceElements + (nPos * nElementSize);
     612             : 
     613             :                         typelib_TypeDescriptionReference * pSetType =
     614           0 :                             _unionGetSetType( pSource2, pElementTypeDescr );
     615             :                         ::uno_type_copyAndConvertData(
     616           0 :                             pDest2 + nValueOffset, pSource2 + nValueOffset,
     617           0 :                             pSetType, mapping );
     618           0 :                         *(sal_Int64 *)pDest2 = *(sal_Int64 *)pSource2;
     619           0 :                         ::typelib_typedescriptionreference_release( pSetType );
     620             :                     }
     621             :                 }
     622           0 :                 TYPELIB_DANGER_RELEASE( pElementTypeDescr );
     623             :                 break;
     624             :             }
     625             :             case typelib_TypeClass_SEQUENCE: // sequence of sequence
     626             :             {
     627          60 :                 pDest = allocSeq( sizeof (uno_Sequence *), nElements );
     628          60 :                 if (pDest != 0)
     629             :                 {
     630          60 :                     typelib_TypeDescription * pElementTypeDescr = 0;
     631          60 :                     TYPELIB_DANGER_GET( &pElementTypeDescr, pElementType );
     632             :                     typelib_TypeDescriptionReference * pSeqElementType =
     633             :                         ((typelib_IndirectTypeDescription *)
     634          60 :                          pElementTypeDescr)->pType;
     635             : 
     636             :                     uno_Sequence ** pDestElements =
     637          60 :                         (uno_Sequence **) pDest->elements;
     638             :                     uno_Sequence ** pSourceElements =
     639          60 :                         (uno_Sequence **) pSource->elements;
     640         220 :                     for ( sal_Int32 nPos = nElements; nPos--; )
     641             :                     {
     642             :                         uno_Sequence * pNew = copyConstructSequence(
     643         100 :                             pSourceElements[nPos],
     644             :                             pSeqElementType,
     645         100 :                             acquire, mapping );
     646             :                         OSL_ASSERT( pNew != 0 );
     647             :                         // ought never be a memory allocation problem,
     648             :                         // because of reference counted sequence handles
     649         100 :                         pDestElements[ nPos ] = pNew;
     650             :                     }
     651             : 
     652          60 :                     TYPELIB_DANGER_RELEASE( pElementTypeDescr );
     653             :                 }
     654          60 :                 break;
     655             :             }
     656             :             case typelib_TypeClass_INTERFACE:
     657             :             {
     658          36 :                 pDest = allocSeq( sizeof (void *), nElements );
     659          36 :                 if (pDest != 0)
     660             :                 {
     661          36 :                     char * pElements = pDest->elements;
     662          36 :                     void ** pSourceElements = (void **)pSource->elements;
     663          36 :                     if (mapping)
     664             :                     {
     665          36 :                         typelib_TypeDescription * pElementTypeDescr = 0;
     666          36 :                         TYPELIB_DANGER_GET( &pElementTypeDescr, pElementType );
     667         148 :                         for ( sal_Int32 nPos = nElements; nPos--; )
     668             :                         {
     669          76 :                             ((void **)pElements)[nPos] = 0;
     670          76 :                             if (((void **)pSourceElements)[nPos])
     671             :                             {
     672             :                                 (*mapping->mapInterface)(
     673             :                                     mapping, (void **)pElements + nPos,
     674          68 :                                     pSourceElements[nPos],
     675             :                                     (typelib_InterfaceTypeDescription *)
     676         136 :                                     pElementTypeDescr );
     677             :                             }
     678             :                         }
     679          36 :                         TYPELIB_DANGER_RELEASE( pElementTypeDescr );
     680             :                     }
     681             :                     else
     682             :                     {
     683           0 :                         for ( sal_Int32 nPos = nElements; nPos--; )
     684             :                         {
     685           0 :                             ((void **)pElements)[nPos] = pSourceElements[nPos];
     686           0 :                             _acquire( ((void **)pElements)[nPos], acquire );
     687             :                         }
     688             :                     }
     689             :                 }
     690          36 :                 break;
     691             :             }
     692             :             default:
     693             :                 OSL_FAIL( "### unexepcted sequence element type!" );
     694           0 :                 pDest = 0;
     695           0 :                 break;
     696             :             }
     697             :         }
     698             :         else // empty sequence
     699             :         {
     700         234 :             pDest = allocSeq( 0, 0 );
     701             :         }
     702             : 
     703       12966 :         return pDest;
     704             :     }
     705             : }
     706             : 
     707             : //--------------------------------------------------------------------------------------------------
     708     9145988 : inline void _copyConstructData(
     709             :     void * pDest, void * pSource,
     710             :     typelib_TypeDescriptionReference * pType, typelib_TypeDescription * pTypeDescr,
     711             :     uno_AcquireFunc acquire, uno_Mapping * mapping )
     712             :     SAL_THROW (())
     713             : {
     714     9145988 :     switch (pType->eTypeClass)
     715             :     {
     716             :     case typelib_TypeClass_CHAR:
     717         378 :         *(sal_Unicode *)pDest = *(sal_Unicode *)pSource;
     718         378 :         break;
     719             :     case typelib_TypeClass_BOOLEAN:
     720       16921 :         *(sal_Bool *)pDest = (*(sal_Bool *)pSource != sal_False);
     721       16921 :         break;
     722             :     case typelib_TypeClass_BYTE:
     723         256 :         *(sal_Int8 *)pDest = *(sal_Int8 *)pSource;
     724         256 :         break;
     725             :     case typelib_TypeClass_SHORT:
     726             :     case typelib_TypeClass_UNSIGNED_SHORT:
     727      388820 :         *(sal_Int16 *)pDest = *(sal_Int16 *)pSource;
     728      388820 :         break;
     729             :     case typelib_TypeClass_LONG:
     730             :     case typelib_TypeClass_UNSIGNED_LONG:
     731     2202535 :         *(sal_Int32 *)pDest = *(sal_Int32 *)pSource;
     732     2202535 :         break;
     733             :     case typelib_TypeClass_HYPER:
     734             :     case typelib_TypeClass_UNSIGNED_HYPER:
     735         512 :         *(sal_Int64 *)pDest = *(sal_Int64 *)pSource;
     736         512 :         break;
     737             :     case typelib_TypeClass_FLOAT:
     738        2226 :         *(float *)pDest = *(float *)pSource;
     739        2226 :         break;
     740             :     case typelib_TypeClass_DOUBLE:
     741       44246 :         *(double *)pDest = *(double *)pSource;
     742       44246 :         break;
     743             :     case typelib_TypeClass_STRING:
     744     2360861 :         ::rtl_uString_acquire( *(rtl_uString **)pSource );
     745     2360861 :         *(rtl_uString **)pDest = *(rtl_uString **)pSource;
     746     2360861 :         break;
     747             :     case typelib_TypeClass_TYPE:
     748      143234 :         TYPE_ACQUIRE( *(typelib_TypeDescriptionReference **)pSource );
     749      143234 :         *(typelib_TypeDescriptionReference **)pDest = *(typelib_TypeDescriptionReference **)pSource;
     750      143234 :         break;
     751             :     case typelib_TypeClass_ANY:
     752             :         _copyConstructAny(
     753             :             (uno_Any *)pDest, ((uno_Any *)pSource)->pData,
     754             :             ((uno_Any *)pSource)->pType, 0,
     755     1876564 :             acquire, mapping );
     756     1876564 :         break;
     757             :     case typelib_TypeClass_ENUM:
     758     1905935 :         *(sal_Int32 *)pDest = *(sal_Int32 *)pSource;
     759     1905935 :         break;
     760             :     case typelib_TypeClass_STRUCT:
     761             :     case typelib_TypeClass_EXCEPTION:
     762       42557 :         if (pTypeDescr)
     763             :         {
     764             :             _copyConstructStruct(
     765             :                 pDest, pSource,
     766             :                 (typelib_CompoundTypeDescription *)pTypeDescr,
     767        6179 :                 acquire, mapping );
     768             :         }
     769             :         else
     770             :         {
     771       36378 :             TYPELIB_DANGER_GET( &pTypeDescr, pType );
     772             :             _copyConstructStruct(
     773             :                 pDest, pSource,
     774             :                 (typelib_CompoundTypeDescription *)pTypeDescr,
     775       36378 :                 acquire, mapping );
     776       36378 :             TYPELIB_DANGER_RELEASE( pTypeDescr );
     777             :         }
     778       42557 :         break;
     779             :     case typelib_TypeClass_ARRAY:
     780           0 :         if (pTypeDescr)
     781             :         {
     782             :             _copyConstructArray(
     783             :                 pDest, pSource,
     784             :                 (typelib_ArrayTypeDescription *)pTypeDescr,
     785           0 :                 acquire, mapping );
     786             :         }
     787             :         else
     788             :         {
     789           0 :             TYPELIB_DANGER_GET( &pTypeDescr, pType );
     790             :             _copyConstructArray(
     791             :                 pDest, pSource,
     792             :                 (typelib_ArrayTypeDescription *)pTypeDescr,
     793           0 :                 acquire, mapping );
     794           0 :             TYPELIB_DANGER_RELEASE( pTypeDescr );
     795             :         }
     796           0 :         break;
     797             :     case typelib_TypeClass_UNION:
     798           0 :         if (pTypeDescr)
     799             :         {
     800           0 :             _copyConstructUnion( pDest, pSource, pTypeDescr, acquire, mapping );
     801             :         }
     802             :         else
     803             :         {
     804           0 :             TYPELIB_DANGER_GET( &pTypeDescr, pType );
     805           0 :             _copyConstructUnion( pDest, pSource, pTypeDescr, acquire, mapping );
     806           0 :             TYPELIB_DANGER_RELEASE( pTypeDescr );
     807             :         }
     808           0 :         break;
     809             :     case typelib_TypeClass_SEQUENCE:
     810       84870 :         if (mapping)
     811             :         {
     812       12873 :             if (pTypeDescr)
     813             :             {
     814             :                 *(uno_Sequence **)pDest = icopyConstructSequence(
     815             :                     *(uno_Sequence **)pSource,
     816             :                     ((typelib_IndirectTypeDescription *)pTypeDescr)->pType,
     817         390 :                     acquire, mapping );
     818             :             }
     819             :             else
     820             :             {
     821       12483 :                 TYPELIB_DANGER_GET( &pTypeDescr, pType );
     822             :                 *(uno_Sequence **)pDest = icopyConstructSequence(
     823             :                     *(uno_Sequence **)pSource,
     824             :                     ((typelib_IndirectTypeDescription *)pTypeDescr)->pType,
     825       12483 :                     acquire, mapping );
     826       12483 :                 TYPELIB_DANGER_RELEASE( pTypeDescr );
     827             :             }
     828             :         }
     829             :         else
     830             :         {
     831       71997 :             osl_atomic_increment( &(*(uno_Sequence **)pSource)->nRefCount );
     832       71997 :             *(uno_Sequence **)pDest = *(uno_Sequence **)pSource;
     833             :         }
     834       84870 :         break;
     835             :     case typelib_TypeClass_INTERFACE:
     836       76073 :         if (mapping)
     837       13999 :             *(void **)pDest = _map( *(void **)pSource, pType, pTypeDescr, mapping );
     838             :         else
     839       62074 :             _acquire( *(void **)pDest = *(void **)pSource, acquire );
     840       76073 :         break;
     841             :     default:
     842           0 :         break;
     843             :     }
     844     9145988 : }
     845             : 
     846             : }
     847             : 
     848             : #endif
     849             : 
     850             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10