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