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 28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 29*cdf0e10cSrcweir #include "precompiled_cppu.hxx" 30*cdf0e10cSrcweir #include <rtl/memory.h> 31*cdf0e10cSrcweir #include <rtl/alloc.h> 32*cdf0e10cSrcweir #include <osl/diagnose.h> 33*cdf0e10cSrcweir #include <osl/interlck.h> 34*cdf0e10cSrcweir #include <typelib/typedescription.h> 35*cdf0e10cSrcweir #include <uno/data.h> 36*cdf0e10cSrcweir #include <uno/dispatcher.h> 37*cdf0e10cSrcweir #include <uno/sequence2.h> 38*cdf0e10cSrcweir 39*cdf0e10cSrcweir #include "constr.hxx" 40*cdf0e10cSrcweir #include "copy.hxx" 41*cdf0e10cSrcweir #include "destr.hxx" 42*cdf0e10cSrcweir 43*cdf0e10cSrcweir 44*cdf0e10cSrcweir using namespace cppu; 45*cdf0e10cSrcweir 46*cdf0e10cSrcweir namespace cppu 47*cdf0e10cSrcweir { 48*cdf0e10cSrcweir 49*cdf0e10cSrcweir //------------------------------------------------------------------------------ 50*cdf0e10cSrcweir static inline uno_Sequence * reallocSeq( 51*cdf0e10cSrcweir uno_Sequence * pReallocate, sal_Size nElementSize, sal_Int32 nElements ) 52*cdf0e10cSrcweir { 53*cdf0e10cSrcweir OSL_ASSERT( nElements >= 0 ); 54*cdf0e10cSrcweir uno_Sequence * pNew = 0; 55*cdf0e10cSrcweir sal_uInt32 nSize = calcSeqMemSize( nElementSize, nElements ); 56*cdf0e10cSrcweir if (nSize > 0) 57*cdf0e10cSrcweir { 58*cdf0e10cSrcweir if (pReallocate == 0) 59*cdf0e10cSrcweir { 60*cdf0e10cSrcweir pNew = (uno_Sequence *) rtl_allocateMemory( nSize ); 61*cdf0e10cSrcweir } 62*cdf0e10cSrcweir else 63*cdf0e10cSrcweir { 64*cdf0e10cSrcweir pNew = (uno_Sequence *) rtl_reallocateMemory( pReallocate, nSize ); 65*cdf0e10cSrcweir } 66*cdf0e10cSrcweir if (pNew != 0) 67*cdf0e10cSrcweir { 68*cdf0e10cSrcweir // header init 69*cdf0e10cSrcweir pNew->nRefCount = 1; 70*cdf0e10cSrcweir pNew->nElements = nElements; 71*cdf0e10cSrcweir } 72*cdf0e10cSrcweir } 73*cdf0e10cSrcweir return pNew; 74*cdf0e10cSrcweir } 75*cdf0e10cSrcweir 76*cdf0e10cSrcweir //------------------------------------------------------------------------------ 77*cdf0e10cSrcweir static inline bool idefaultConstructElements( 78*cdf0e10cSrcweir uno_Sequence ** ppSeq, 79*cdf0e10cSrcweir typelib_TypeDescriptionReference * pElementType, 80*cdf0e10cSrcweir sal_Int32 nStartIndex, sal_Int32 nStopIndex, 81*cdf0e10cSrcweir sal_Int32 nAlloc = -1 ) // >= 0 means (re)alloc memory for nAlloc elements 82*cdf0e10cSrcweir { 83*cdf0e10cSrcweir uno_Sequence * pSeq = *ppSeq; 84*cdf0e10cSrcweir switch (pElementType->eTypeClass) 85*cdf0e10cSrcweir { 86*cdf0e10cSrcweir case typelib_TypeClass_CHAR: 87*cdf0e10cSrcweir if (nAlloc >= 0) 88*cdf0e10cSrcweir pSeq = reallocSeq( pSeq, sizeof(sal_Unicode), nAlloc ); 89*cdf0e10cSrcweir if (pSeq != 0) 90*cdf0e10cSrcweir { 91*cdf0e10cSrcweir ::rtl_zeroMemory( 92*cdf0e10cSrcweir pSeq->elements + (sizeof(sal_Unicode) * nStartIndex), 93*cdf0e10cSrcweir sizeof(sal_Unicode) * (nStopIndex - nStartIndex) ); 94*cdf0e10cSrcweir } 95*cdf0e10cSrcweir break; 96*cdf0e10cSrcweir case typelib_TypeClass_BOOLEAN: 97*cdf0e10cSrcweir if (nAlloc >= 0) 98*cdf0e10cSrcweir pSeq = reallocSeq( pSeq, sizeof(sal_Bool), nAlloc ); 99*cdf0e10cSrcweir if (pSeq != 0) 100*cdf0e10cSrcweir { 101*cdf0e10cSrcweir ::rtl_zeroMemory( 102*cdf0e10cSrcweir pSeq->elements + (sizeof(sal_Bool) * nStartIndex), 103*cdf0e10cSrcweir sizeof(sal_Bool) * (nStopIndex - nStartIndex) ); 104*cdf0e10cSrcweir } 105*cdf0e10cSrcweir break; 106*cdf0e10cSrcweir case typelib_TypeClass_BYTE: 107*cdf0e10cSrcweir if (nAlloc >= 0) 108*cdf0e10cSrcweir pSeq = reallocSeq( pSeq, sizeof(sal_Int8), nAlloc ); 109*cdf0e10cSrcweir if (pSeq != 0) 110*cdf0e10cSrcweir { 111*cdf0e10cSrcweir ::rtl_zeroMemory( 112*cdf0e10cSrcweir pSeq->elements + (sizeof(sal_Int8) * nStartIndex), 113*cdf0e10cSrcweir sizeof(sal_Int8) * (nStopIndex - nStartIndex) ); 114*cdf0e10cSrcweir } 115*cdf0e10cSrcweir break; 116*cdf0e10cSrcweir case typelib_TypeClass_SHORT: 117*cdf0e10cSrcweir case typelib_TypeClass_UNSIGNED_SHORT: 118*cdf0e10cSrcweir if (nAlloc >= 0) 119*cdf0e10cSrcweir pSeq = reallocSeq( pSeq, sizeof(sal_Int16), nAlloc ); 120*cdf0e10cSrcweir if (pSeq != 0) 121*cdf0e10cSrcweir { 122*cdf0e10cSrcweir ::rtl_zeroMemory( 123*cdf0e10cSrcweir pSeq->elements + (sizeof(sal_Int16) * nStartIndex), 124*cdf0e10cSrcweir sizeof(sal_Int16) * (nStopIndex - nStartIndex) ); 125*cdf0e10cSrcweir } 126*cdf0e10cSrcweir break; 127*cdf0e10cSrcweir case typelib_TypeClass_LONG: 128*cdf0e10cSrcweir case typelib_TypeClass_UNSIGNED_LONG: 129*cdf0e10cSrcweir if (nAlloc >= 0) 130*cdf0e10cSrcweir pSeq = reallocSeq( pSeq, sizeof(sal_Int32), nAlloc ); 131*cdf0e10cSrcweir if (pSeq != 0) 132*cdf0e10cSrcweir { 133*cdf0e10cSrcweir ::rtl_zeroMemory( 134*cdf0e10cSrcweir pSeq->elements + (sizeof(sal_Int32) * nStartIndex), 135*cdf0e10cSrcweir sizeof(sal_Int32) * (nStopIndex - nStartIndex) ); 136*cdf0e10cSrcweir } 137*cdf0e10cSrcweir break; 138*cdf0e10cSrcweir case typelib_TypeClass_HYPER: 139*cdf0e10cSrcweir case typelib_TypeClass_UNSIGNED_HYPER: 140*cdf0e10cSrcweir if (nAlloc >= 0) 141*cdf0e10cSrcweir pSeq = reallocSeq( pSeq, sizeof(sal_Int64), nAlloc ); 142*cdf0e10cSrcweir if (pSeq != 0) 143*cdf0e10cSrcweir { 144*cdf0e10cSrcweir ::rtl_zeroMemory( 145*cdf0e10cSrcweir pSeq->elements + (sizeof(sal_Int64) * nStartIndex), 146*cdf0e10cSrcweir sizeof(sal_Int64) * (nStopIndex - nStartIndex) ); 147*cdf0e10cSrcweir } 148*cdf0e10cSrcweir break; 149*cdf0e10cSrcweir case typelib_TypeClass_FLOAT: 150*cdf0e10cSrcweir { 151*cdf0e10cSrcweir if (nAlloc >= 0) 152*cdf0e10cSrcweir pSeq = reallocSeq( pSeq, sizeof(float), nAlloc ); 153*cdf0e10cSrcweir if (pSeq != 0) 154*cdf0e10cSrcweir { 155*cdf0e10cSrcweir float * pElements = (float *) pSeq->elements; 156*cdf0e10cSrcweir for ( sal_Int32 nPos = nStartIndex; nPos < nStopIndex; ++nPos ) 157*cdf0e10cSrcweir { 158*cdf0e10cSrcweir pElements[nPos] = 0.0; 159*cdf0e10cSrcweir } 160*cdf0e10cSrcweir } 161*cdf0e10cSrcweir break; 162*cdf0e10cSrcweir } 163*cdf0e10cSrcweir case typelib_TypeClass_DOUBLE: 164*cdf0e10cSrcweir { 165*cdf0e10cSrcweir if (nAlloc >= 0) 166*cdf0e10cSrcweir pSeq = reallocSeq( pSeq, sizeof(double), nAlloc ); 167*cdf0e10cSrcweir if (pSeq != 0) 168*cdf0e10cSrcweir { 169*cdf0e10cSrcweir double * pElements = (double *) pSeq->elements; 170*cdf0e10cSrcweir for ( sal_Int32 nPos = nStartIndex; nPos < nStopIndex; ++nPos ) 171*cdf0e10cSrcweir { 172*cdf0e10cSrcweir pElements[nPos] = 0.0; 173*cdf0e10cSrcweir } 174*cdf0e10cSrcweir } 175*cdf0e10cSrcweir break; 176*cdf0e10cSrcweir } 177*cdf0e10cSrcweir case typelib_TypeClass_STRING: 178*cdf0e10cSrcweir { 179*cdf0e10cSrcweir if (nAlloc >= 0) 180*cdf0e10cSrcweir pSeq = reallocSeq( pSeq, sizeof(rtl_uString *), nAlloc ); 181*cdf0e10cSrcweir if (pSeq != 0) 182*cdf0e10cSrcweir { 183*cdf0e10cSrcweir rtl_uString ** pElements = (rtl_uString **) pSeq->elements; 184*cdf0e10cSrcweir for ( sal_Int32 nPos = nStartIndex; nPos < nStopIndex; ++nPos ) 185*cdf0e10cSrcweir { 186*cdf0e10cSrcweir pElements[nPos] = 0; 187*cdf0e10cSrcweir rtl_uString_new( &pElements[nPos] ); 188*cdf0e10cSrcweir } 189*cdf0e10cSrcweir } 190*cdf0e10cSrcweir break; 191*cdf0e10cSrcweir } 192*cdf0e10cSrcweir case typelib_TypeClass_TYPE: 193*cdf0e10cSrcweir { 194*cdf0e10cSrcweir if (nAlloc >= 0) 195*cdf0e10cSrcweir { 196*cdf0e10cSrcweir pSeq = reallocSeq( 197*cdf0e10cSrcweir pSeq, sizeof(typelib_TypeDescriptionReference *), nAlloc ); 198*cdf0e10cSrcweir } 199*cdf0e10cSrcweir if (pSeq != 0) 200*cdf0e10cSrcweir { 201*cdf0e10cSrcweir typelib_TypeDescriptionReference ** pElements = 202*cdf0e10cSrcweir (typelib_TypeDescriptionReference **) pSeq->elements; 203*cdf0e10cSrcweir for ( sal_Int32 nPos = nStartIndex; nPos < nStopIndex; ++nPos ) 204*cdf0e10cSrcweir { 205*cdf0e10cSrcweir pElements[nPos] = _getVoidType(); 206*cdf0e10cSrcweir } 207*cdf0e10cSrcweir } 208*cdf0e10cSrcweir break; 209*cdf0e10cSrcweir } 210*cdf0e10cSrcweir case typelib_TypeClass_ANY: 211*cdf0e10cSrcweir { 212*cdf0e10cSrcweir if (nAlloc >= 0) 213*cdf0e10cSrcweir pSeq = reallocSeq( pSeq, sizeof(uno_Any), nAlloc ); 214*cdf0e10cSrcweir if (pSeq != 0) 215*cdf0e10cSrcweir { 216*cdf0e10cSrcweir uno_Any * pElements = (uno_Any *) pSeq->elements; 217*cdf0e10cSrcweir for ( sal_Int32 nPos = nStartIndex; nPos < nStopIndex; ++nPos ) 218*cdf0e10cSrcweir { 219*cdf0e10cSrcweir CONSTRUCT_EMPTY_ANY( &pElements[nPos] ); 220*cdf0e10cSrcweir } 221*cdf0e10cSrcweir } 222*cdf0e10cSrcweir break; 223*cdf0e10cSrcweir } 224*cdf0e10cSrcweir case typelib_TypeClass_ENUM: 225*cdf0e10cSrcweir { 226*cdf0e10cSrcweir if (nAlloc >= 0) 227*cdf0e10cSrcweir pSeq = reallocSeq( pSeq, sizeof(sal_Int32), nAlloc ); 228*cdf0e10cSrcweir if (pSeq != 0) 229*cdf0e10cSrcweir { 230*cdf0e10cSrcweir typelib_TypeDescription * pElementTypeDescr = 0; 231*cdf0e10cSrcweir TYPELIB_DANGER_GET( &pElementTypeDescr, pElementType ); 232*cdf0e10cSrcweir sal_Int32 eEnum = 233*cdf0e10cSrcweir ((typelib_EnumTypeDescription *) 234*cdf0e10cSrcweir pElementTypeDescr)->nDefaultEnumValue; 235*cdf0e10cSrcweir TYPELIB_DANGER_RELEASE( pElementTypeDescr ); 236*cdf0e10cSrcweir 237*cdf0e10cSrcweir sal_Int32 * pElements = (sal_Int32 *) pSeq->elements; 238*cdf0e10cSrcweir for ( sal_Int32 nPos = nStartIndex; nPos < nStopIndex; ++nPos ) 239*cdf0e10cSrcweir { 240*cdf0e10cSrcweir pElements[nPos] = eEnum; 241*cdf0e10cSrcweir } 242*cdf0e10cSrcweir } 243*cdf0e10cSrcweir break; 244*cdf0e10cSrcweir } 245*cdf0e10cSrcweir case typelib_TypeClass_STRUCT: 246*cdf0e10cSrcweir case typelib_TypeClass_EXCEPTION: 247*cdf0e10cSrcweir { 248*cdf0e10cSrcweir typelib_TypeDescription * pElementTypeDescr = 0; 249*cdf0e10cSrcweir TYPELIB_DANGER_GET( &pElementTypeDescr, pElementType ); 250*cdf0e10cSrcweir sal_Int32 nElementSize = pElementTypeDescr->nSize; 251*cdf0e10cSrcweir 252*cdf0e10cSrcweir if (nAlloc >= 0) 253*cdf0e10cSrcweir pSeq = reallocSeq( pSeq, nElementSize, nAlloc ); 254*cdf0e10cSrcweir if (pSeq != 0) 255*cdf0e10cSrcweir { 256*cdf0e10cSrcweir char * pElements = pSeq->elements; 257*cdf0e10cSrcweir for ( sal_Int32 nPos = nStartIndex; nPos < nStopIndex; ++nPos ) 258*cdf0e10cSrcweir { 259*cdf0e10cSrcweir _defaultConstructStruct( 260*cdf0e10cSrcweir pElements + (nElementSize * nPos), 261*cdf0e10cSrcweir (typelib_CompoundTypeDescription *)pElementTypeDescr ); 262*cdf0e10cSrcweir } 263*cdf0e10cSrcweir } 264*cdf0e10cSrcweir 265*cdf0e10cSrcweir TYPELIB_DANGER_RELEASE( pElementTypeDescr ); 266*cdf0e10cSrcweir break; 267*cdf0e10cSrcweir } 268*cdf0e10cSrcweir case typelib_TypeClass_ARRAY: 269*cdf0e10cSrcweir { 270*cdf0e10cSrcweir typelib_TypeDescription * pElementTypeDescr = 0; 271*cdf0e10cSrcweir TYPELIB_DANGER_GET( &pElementTypeDescr, pElementType ); 272*cdf0e10cSrcweir sal_Int32 nElementSize = pElementTypeDescr->nSize; 273*cdf0e10cSrcweir 274*cdf0e10cSrcweir if (nAlloc >= 0) 275*cdf0e10cSrcweir pSeq = reallocSeq( pSeq, nElementSize, nAlloc ); 276*cdf0e10cSrcweir if (pSeq != 0) 277*cdf0e10cSrcweir { 278*cdf0e10cSrcweir char * pElements = pSeq->elements; 279*cdf0e10cSrcweir for ( sal_Int32 nPos = nStartIndex; nPos < nStopIndex; ++nPos ) 280*cdf0e10cSrcweir { 281*cdf0e10cSrcweir _defaultConstructArray( 282*cdf0e10cSrcweir pElements + (nElementSize * nPos), 283*cdf0e10cSrcweir (typelib_ArrayTypeDescription *)pElementTypeDescr ); 284*cdf0e10cSrcweir } 285*cdf0e10cSrcweir } 286*cdf0e10cSrcweir 287*cdf0e10cSrcweir TYPELIB_DANGER_RELEASE( pElementTypeDescr ); 288*cdf0e10cSrcweir break; 289*cdf0e10cSrcweir } 290*cdf0e10cSrcweir case typelib_TypeClass_UNION: 291*cdf0e10cSrcweir { 292*cdf0e10cSrcweir typelib_TypeDescription * pElementTypeDescr = 0; 293*cdf0e10cSrcweir TYPELIB_DANGER_GET( &pElementTypeDescr, pElementType ); 294*cdf0e10cSrcweir sal_Int32 nElementSize = pElementTypeDescr->nSize; 295*cdf0e10cSrcweir 296*cdf0e10cSrcweir if (nAlloc >= 0) 297*cdf0e10cSrcweir pSeq = reallocSeq( pSeq, nElementSize, nAlloc ); 298*cdf0e10cSrcweir if (pSeq != 0) 299*cdf0e10cSrcweir { 300*cdf0e10cSrcweir sal_Int32 nValueOffset = 301*cdf0e10cSrcweir ((typelib_UnionTypeDescription *) 302*cdf0e10cSrcweir pElementTypeDescr)->nValueOffset; 303*cdf0e10cSrcweir sal_Int64 nDefaultDiscr = 304*cdf0e10cSrcweir ((typelib_UnionTypeDescription *) 305*cdf0e10cSrcweir pElementTypeDescr)->nDefaultDiscriminant; 306*cdf0e10cSrcweir 307*cdf0e10cSrcweir typelib_TypeDescription * pDefaultTypeDescr = 0; 308*cdf0e10cSrcweir TYPELIB_DANGER_GET( 309*cdf0e10cSrcweir &pDefaultTypeDescr, 310*cdf0e10cSrcweir ((typelib_UnionTypeDescription *) 311*cdf0e10cSrcweir pElementTypeDescr)->pDefaultTypeRef ); 312*cdf0e10cSrcweir 313*cdf0e10cSrcweir char * pElements = pSeq->elements; 314*cdf0e10cSrcweir for ( sal_Int32 nPos = nStartIndex; nPos < nStopIndex; ++nPos ) 315*cdf0e10cSrcweir { 316*cdf0e10cSrcweir char * pMem = pElements + (nElementSize * nPos); 317*cdf0e10cSrcweir ::uno_constructData( 318*cdf0e10cSrcweir (char *)pMem + nValueOffset, pDefaultTypeDescr ); 319*cdf0e10cSrcweir *(sal_Int64 *)pMem = nDefaultDiscr; 320*cdf0e10cSrcweir } 321*cdf0e10cSrcweir TYPELIB_DANGER_RELEASE( pDefaultTypeDescr ); 322*cdf0e10cSrcweir } 323*cdf0e10cSrcweir 324*cdf0e10cSrcweir TYPELIB_DANGER_RELEASE( pElementTypeDescr ); 325*cdf0e10cSrcweir break; 326*cdf0e10cSrcweir } 327*cdf0e10cSrcweir case typelib_TypeClass_SEQUENCE: 328*cdf0e10cSrcweir { 329*cdf0e10cSrcweir if (nAlloc >= 0) 330*cdf0e10cSrcweir pSeq = reallocSeq( pSeq, sizeof(uno_Sequence *), nAlloc ); 331*cdf0e10cSrcweir if (pSeq != 0) 332*cdf0e10cSrcweir { 333*cdf0e10cSrcweir uno_Sequence ** pElements = 334*cdf0e10cSrcweir (uno_Sequence **) pSeq->elements; 335*cdf0e10cSrcweir for ( sal_Int32 nPos = nStartIndex; nPos < nStopIndex; ++nPos ) 336*cdf0e10cSrcweir { 337*cdf0e10cSrcweir pElements[nPos] = createEmptySequence(); 338*cdf0e10cSrcweir } 339*cdf0e10cSrcweir } 340*cdf0e10cSrcweir break; 341*cdf0e10cSrcweir } 342*cdf0e10cSrcweir case typelib_TypeClass_INTERFACE: // either C++ or C-UNO interface 343*cdf0e10cSrcweir if (nAlloc >= 0) 344*cdf0e10cSrcweir pSeq = reallocSeq( pSeq, sizeof(void *), nAlloc ); 345*cdf0e10cSrcweir if (pSeq != 0) 346*cdf0e10cSrcweir { 347*cdf0e10cSrcweir ::rtl_zeroMemory( 348*cdf0e10cSrcweir pSeq->elements + (sizeof(void *) * nStartIndex), 349*cdf0e10cSrcweir sizeof(void *) * (nStopIndex - nStartIndex) ); 350*cdf0e10cSrcweir } 351*cdf0e10cSrcweir break; 352*cdf0e10cSrcweir default: 353*cdf0e10cSrcweir OSL_ENSURE( 0, "### unexpected element type!" ); 354*cdf0e10cSrcweir pSeq = 0; 355*cdf0e10cSrcweir break; 356*cdf0e10cSrcweir } 357*cdf0e10cSrcweir 358*cdf0e10cSrcweir if (pSeq == 0) 359*cdf0e10cSrcweir { 360*cdf0e10cSrcweir OSL_ASSERT( nAlloc >= 0 ); // must have been an allocation failure 361*cdf0e10cSrcweir return false; 362*cdf0e10cSrcweir } 363*cdf0e10cSrcweir else 364*cdf0e10cSrcweir { 365*cdf0e10cSrcweir *ppSeq = pSeq; 366*cdf0e10cSrcweir return true; 367*cdf0e10cSrcweir } 368*cdf0e10cSrcweir } 369*cdf0e10cSrcweir 370*cdf0e10cSrcweir //------------------------------------------------------------------------------ 371*cdf0e10cSrcweir static inline bool icopyConstructFromElements( 372*cdf0e10cSrcweir uno_Sequence ** ppSeq, void * pSourceElements, 373*cdf0e10cSrcweir typelib_TypeDescriptionReference * pElementType, 374*cdf0e10cSrcweir sal_Int32 nStartIndex, sal_Int32 nStopIndex, 375*cdf0e10cSrcweir uno_AcquireFunc acquire, 376*cdf0e10cSrcweir sal_Int32 nAlloc = -1 ) // >= 0 means (re)alloc memory for nAlloc elements 377*cdf0e10cSrcweir { 378*cdf0e10cSrcweir uno_Sequence * pSeq = *ppSeq; 379*cdf0e10cSrcweir switch (pElementType->eTypeClass) 380*cdf0e10cSrcweir { 381*cdf0e10cSrcweir case typelib_TypeClass_CHAR: 382*cdf0e10cSrcweir if (nAlloc >= 0) 383*cdf0e10cSrcweir pSeq = reallocSeq( pSeq, sizeof(sal_Unicode), nAlloc ); 384*cdf0e10cSrcweir if (pSeq != 0) 385*cdf0e10cSrcweir { 386*cdf0e10cSrcweir ::rtl_copyMemory( 387*cdf0e10cSrcweir pSeq->elements + (sizeof(sal_Unicode) * nStartIndex), 388*cdf0e10cSrcweir (char *)pSourceElements + (sizeof(sal_Unicode) * nStartIndex), 389*cdf0e10cSrcweir sizeof(sal_Unicode) * (nStopIndex - nStartIndex) ); 390*cdf0e10cSrcweir } 391*cdf0e10cSrcweir break; 392*cdf0e10cSrcweir case typelib_TypeClass_BOOLEAN: 393*cdf0e10cSrcweir if (nAlloc >= 0) 394*cdf0e10cSrcweir pSeq = reallocSeq( pSeq, sizeof(sal_Bool), nAlloc ); 395*cdf0e10cSrcweir if (pSeq != 0) 396*cdf0e10cSrcweir { 397*cdf0e10cSrcweir ::rtl_copyMemory( 398*cdf0e10cSrcweir pSeq->elements + (sizeof(sal_Bool) * nStartIndex), 399*cdf0e10cSrcweir (char *)pSourceElements + (sizeof(sal_Bool) * nStartIndex), 400*cdf0e10cSrcweir sizeof(sal_Bool) * (nStopIndex - nStartIndex) ); 401*cdf0e10cSrcweir } 402*cdf0e10cSrcweir break; 403*cdf0e10cSrcweir case typelib_TypeClass_BYTE: 404*cdf0e10cSrcweir if (nAlloc >= 0) 405*cdf0e10cSrcweir pSeq = reallocSeq( pSeq, sizeof(sal_Int8), nAlloc ); 406*cdf0e10cSrcweir if (pSeq != 0) 407*cdf0e10cSrcweir { 408*cdf0e10cSrcweir ::rtl_copyMemory( 409*cdf0e10cSrcweir pSeq->elements + (sizeof(sal_Int8) * nStartIndex), 410*cdf0e10cSrcweir (char *)pSourceElements + (sizeof(sal_Int8) * nStartIndex), 411*cdf0e10cSrcweir sizeof(sal_Int8) * (nStopIndex - nStartIndex) ); 412*cdf0e10cSrcweir } 413*cdf0e10cSrcweir break; 414*cdf0e10cSrcweir case typelib_TypeClass_SHORT: 415*cdf0e10cSrcweir case typelib_TypeClass_UNSIGNED_SHORT: 416*cdf0e10cSrcweir if (nAlloc >= 0) 417*cdf0e10cSrcweir pSeq = reallocSeq( pSeq, sizeof(sal_Int16), nAlloc ); 418*cdf0e10cSrcweir if (pSeq != 0) 419*cdf0e10cSrcweir { 420*cdf0e10cSrcweir ::rtl_copyMemory( 421*cdf0e10cSrcweir pSeq->elements + (sizeof(sal_Int16) * nStartIndex), 422*cdf0e10cSrcweir (char *)pSourceElements + (sizeof(sal_Int16) * nStartIndex), 423*cdf0e10cSrcweir sizeof(sal_Int16) * (nStopIndex - nStartIndex) ); 424*cdf0e10cSrcweir } 425*cdf0e10cSrcweir break; 426*cdf0e10cSrcweir case typelib_TypeClass_LONG: 427*cdf0e10cSrcweir case typelib_TypeClass_UNSIGNED_LONG: 428*cdf0e10cSrcweir if (nAlloc >= 0) 429*cdf0e10cSrcweir pSeq = reallocSeq( pSeq, sizeof(sal_Int32), nAlloc ); 430*cdf0e10cSrcweir if (pSeq != 0) 431*cdf0e10cSrcweir { 432*cdf0e10cSrcweir ::rtl_copyMemory( 433*cdf0e10cSrcweir pSeq->elements + (sizeof(sal_Int32) * nStartIndex), 434*cdf0e10cSrcweir (char *)pSourceElements + (sizeof(sal_Int32) * nStartIndex), 435*cdf0e10cSrcweir sizeof(sal_Int32) * (nStopIndex - nStartIndex) ); 436*cdf0e10cSrcweir } 437*cdf0e10cSrcweir break; 438*cdf0e10cSrcweir case typelib_TypeClass_HYPER: 439*cdf0e10cSrcweir case typelib_TypeClass_UNSIGNED_HYPER: 440*cdf0e10cSrcweir if (nAlloc >= 0) 441*cdf0e10cSrcweir pSeq = reallocSeq( pSeq, sizeof(sal_Int64), nAlloc ); 442*cdf0e10cSrcweir if (pSeq != 0) 443*cdf0e10cSrcweir { 444*cdf0e10cSrcweir ::rtl_copyMemory( 445*cdf0e10cSrcweir pSeq->elements + (sizeof(sal_Int64) * nStartIndex), 446*cdf0e10cSrcweir (char *)pSourceElements + (sizeof(sal_Int64) * nStartIndex), 447*cdf0e10cSrcweir sizeof(sal_Int64) * (nStopIndex - nStartIndex) ); 448*cdf0e10cSrcweir } 449*cdf0e10cSrcweir break; 450*cdf0e10cSrcweir case typelib_TypeClass_FLOAT: 451*cdf0e10cSrcweir if (nAlloc >= 0) 452*cdf0e10cSrcweir pSeq = reallocSeq( pSeq, sizeof(float), nAlloc ); 453*cdf0e10cSrcweir if (pSeq != 0) 454*cdf0e10cSrcweir { 455*cdf0e10cSrcweir ::rtl_copyMemory( 456*cdf0e10cSrcweir pSeq->elements + (sizeof(float) * nStartIndex), 457*cdf0e10cSrcweir (char *)pSourceElements + (sizeof(float) * nStartIndex), 458*cdf0e10cSrcweir sizeof(float) * (nStopIndex - nStartIndex) ); 459*cdf0e10cSrcweir } 460*cdf0e10cSrcweir break; 461*cdf0e10cSrcweir case typelib_TypeClass_DOUBLE: 462*cdf0e10cSrcweir if (nAlloc >= 0) 463*cdf0e10cSrcweir pSeq = reallocSeq( pSeq, sizeof(double), nAlloc ); 464*cdf0e10cSrcweir if (pSeq != 0) 465*cdf0e10cSrcweir { 466*cdf0e10cSrcweir ::rtl_copyMemory( 467*cdf0e10cSrcweir pSeq->elements + (sizeof(double) * nStartIndex), 468*cdf0e10cSrcweir (char *)pSourceElements + (sizeof(double) * nStartIndex), 469*cdf0e10cSrcweir sizeof(double) * (nStopIndex - nStartIndex) ); 470*cdf0e10cSrcweir } 471*cdf0e10cSrcweir break; 472*cdf0e10cSrcweir case typelib_TypeClass_ENUM: 473*cdf0e10cSrcweir if (nAlloc >= 0) 474*cdf0e10cSrcweir pSeq = reallocSeq( pSeq, sizeof(sal_Int32), nAlloc ); 475*cdf0e10cSrcweir if (pSeq != 0) 476*cdf0e10cSrcweir { 477*cdf0e10cSrcweir ::rtl_copyMemory( 478*cdf0e10cSrcweir pSeq->elements + (sizeof(sal_Int32) * nStartIndex), 479*cdf0e10cSrcweir (char *)pSourceElements + (sizeof(sal_Int32) * nStartIndex), 480*cdf0e10cSrcweir sizeof(sal_Int32) * (nStopIndex - nStartIndex) ); 481*cdf0e10cSrcweir } 482*cdf0e10cSrcweir break; 483*cdf0e10cSrcweir case typelib_TypeClass_STRING: 484*cdf0e10cSrcweir { 485*cdf0e10cSrcweir if (nAlloc >= 0) 486*cdf0e10cSrcweir pSeq = reallocSeq( pSeq, sizeof(rtl_uString *), nAlloc ); 487*cdf0e10cSrcweir if (pSeq != 0) 488*cdf0e10cSrcweir { 489*cdf0e10cSrcweir rtl_uString ** pDestElements = (rtl_uString **) pSeq->elements; 490*cdf0e10cSrcweir for ( sal_Int32 nPos = nStartIndex; nPos < nStopIndex; ++nPos ) 491*cdf0e10cSrcweir { 492*cdf0e10cSrcweir ::rtl_uString_acquire( 493*cdf0e10cSrcweir ((rtl_uString **)pSourceElements)[nPos] ); 494*cdf0e10cSrcweir pDestElements[nPos] = ((rtl_uString **)pSourceElements)[nPos]; 495*cdf0e10cSrcweir } 496*cdf0e10cSrcweir } 497*cdf0e10cSrcweir break; 498*cdf0e10cSrcweir } 499*cdf0e10cSrcweir case typelib_TypeClass_TYPE: 500*cdf0e10cSrcweir { 501*cdf0e10cSrcweir if (nAlloc >= 0) 502*cdf0e10cSrcweir { 503*cdf0e10cSrcweir pSeq = reallocSeq( 504*cdf0e10cSrcweir pSeq, sizeof(typelib_TypeDescriptionReference *), nAlloc ); 505*cdf0e10cSrcweir } 506*cdf0e10cSrcweir if (pSeq != 0) 507*cdf0e10cSrcweir { 508*cdf0e10cSrcweir typelib_TypeDescriptionReference ** pDestElements = 509*cdf0e10cSrcweir (typelib_TypeDescriptionReference **) pSeq->elements; 510*cdf0e10cSrcweir for ( sal_Int32 nPos = nStartIndex; nPos < nStopIndex; ++nPos ) 511*cdf0e10cSrcweir { 512*cdf0e10cSrcweir TYPE_ACQUIRE( 513*cdf0e10cSrcweir ((typelib_TypeDescriptionReference **) 514*cdf0e10cSrcweir pSourceElements)[nPos] ); 515*cdf0e10cSrcweir pDestElements[nPos] = 516*cdf0e10cSrcweir ((typelib_TypeDescriptionReference **) 517*cdf0e10cSrcweir pSourceElements)[nPos]; 518*cdf0e10cSrcweir } 519*cdf0e10cSrcweir } 520*cdf0e10cSrcweir break; 521*cdf0e10cSrcweir } 522*cdf0e10cSrcweir case typelib_TypeClass_ANY: 523*cdf0e10cSrcweir { 524*cdf0e10cSrcweir if (nAlloc >= 0) 525*cdf0e10cSrcweir pSeq = reallocSeq( pSeq, sizeof(uno_Any), nAlloc ); 526*cdf0e10cSrcweir if (pSeq != 0) 527*cdf0e10cSrcweir { 528*cdf0e10cSrcweir uno_Any * pDestElements = (uno_Any *) pSeq->elements; 529*cdf0e10cSrcweir for ( sal_Int32 nPos = nStartIndex; nPos < nStopIndex; ++nPos ) 530*cdf0e10cSrcweir { 531*cdf0e10cSrcweir uno_Any * pSource = (uno_Any *)pSourceElements + nPos; 532*cdf0e10cSrcweir _copyConstructAny( 533*cdf0e10cSrcweir &pDestElements[nPos], 534*cdf0e10cSrcweir pSource->pData, 535*cdf0e10cSrcweir pSource->pType, 0, 536*cdf0e10cSrcweir acquire, 0 ); 537*cdf0e10cSrcweir } 538*cdf0e10cSrcweir } 539*cdf0e10cSrcweir break; 540*cdf0e10cSrcweir } 541*cdf0e10cSrcweir case typelib_TypeClass_STRUCT: 542*cdf0e10cSrcweir case typelib_TypeClass_EXCEPTION: 543*cdf0e10cSrcweir { 544*cdf0e10cSrcweir typelib_TypeDescription * pElementTypeDescr = 0; 545*cdf0e10cSrcweir TYPELIB_DANGER_GET( &pElementTypeDescr, pElementType ); 546*cdf0e10cSrcweir sal_Int32 nElementSize = pElementTypeDescr->nSize; 547*cdf0e10cSrcweir 548*cdf0e10cSrcweir if (nAlloc >= 0) 549*cdf0e10cSrcweir pSeq = reallocSeq( pSeq, nElementSize, nAlloc ); 550*cdf0e10cSrcweir if (pSeq != 0) 551*cdf0e10cSrcweir { 552*cdf0e10cSrcweir char * pDestElements = pSeq->elements; 553*cdf0e10cSrcweir 554*cdf0e10cSrcweir typelib_CompoundTypeDescription * pTypeDescr = 555*cdf0e10cSrcweir (typelib_CompoundTypeDescription *)pElementTypeDescr; 556*cdf0e10cSrcweir for ( sal_Int32 nPos = nStartIndex; nPos < nStopIndex; ++nPos ) 557*cdf0e10cSrcweir { 558*cdf0e10cSrcweir char * pDest = 559*cdf0e10cSrcweir pDestElements + (nElementSize * nPos); 560*cdf0e10cSrcweir char * pSource = 561*cdf0e10cSrcweir (char *)pSourceElements + (nElementSize * nPos); 562*cdf0e10cSrcweir 563*cdf0e10cSrcweir if (pTypeDescr->pBaseTypeDescription) 564*cdf0e10cSrcweir { 565*cdf0e10cSrcweir // copy base value 566*cdf0e10cSrcweir _copyConstructStruct( 567*cdf0e10cSrcweir pDest, pSource, 568*cdf0e10cSrcweir pTypeDescr->pBaseTypeDescription, acquire, 0 ); 569*cdf0e10cSrcweir } 570*cdf0e10cSrcweir 571*cdf0e10cSrcweir // then copy members 572*cdf0e10cSrcweir typelib_TypeDescriptionReference ** ppTypeRefs = 573*cdf0e10cSrcweir pTypeDescr->ppTypeRefs; 574*cdf0e10cSrcweir sal_Int32 * pMemberOffsets = pTypeDescr->pMemberOffsets; 575*cdf0e10cSrcweir sal_Int32 nDescr = pTypeDescr->nMembers; 576*cdf0e10cSrcweir 577*cdf0e10cSrcweir while (nDescr--) 578*cdf0e10cSrcweir { 579*cdf0e10cSrcweir ::uno_type_copyData( 580*cdf0e10cSrcweir pDest + pMemberOffsets[nDescr], 581*cdf0e10cSrcweir pSource + pMemberOffsets[nDescr], 582*cdf0e10cSrcweir ppTypeRefs[nDescr], acquire ); 583*cdf0e10cSrcweir } 584*cdf0e10cSrcweir } 585*cdf0e10cSrcweir } 586*cdf0e10cSrcweir 587*cdf0e10cSrcweir TYPELIB_DANGER_RELEASE( pElementTypeDescr ); 588*cdf0e10cSrcweir break; 589*cdf0e10cSrcweir } 590*cdf0e10cSrcweir case typelib_TypeClass_UNION: 591*cdf0e10cSrcweir { 592*cdf0e10cSrcweir typelib_TypeDescription * pElementTypeDescr = 0; 593*cdf0e10cSrcweir TYPELIB_DANGER_GET( &pElementTypeDescr, pElementType ); 594*cdf0e10cSrcweir sal_Int32 nElementSize = pElementTypeDescr->nSize; 595*cdf0e10cSrcweir 596*cdf0e10cSrcweir if (nAlloc >= 0) 597*cdf0e10cSrcweir pSeq = reallocSeq( pSeq, nElementSize, nAlloc ); 598*cdf0e10cSrcweir if (pSeq != 0) 599*cdf0e10cSrcweir { 600*cdf0e10cSrcweir char * pDestElements = pSeq->elements; 601*cdf0e10cSrcweir 602*cdf0e10cSrcweir sal_Int32 nValueOffset = 603*cdf0e10cSrcweir ((typelib_UnionTypeDescription *) 604*cdf0e10cSrcweir pElementTypeDescr)->nValueOffset; 605*cdf0e10cSrcweir for ( sal_Int32 nPos = nStartIndex; nPos < nStopIndex; ++nPos ) 606*cdf0e10cSrcweir { 607*cdf0e10cSrcweir char * pDest = 608*cdf0e10cSrcweir pDestElements + (nElementSize * nPos); 609*cdf0e10cSrcweir char * pSource = 610*cdf0e10cSrcweir (char *)pSourceElements + (nElementSize * nPos); 611*cdf0e10cSrcweir 612*cdf0e10cSrcweir typelib_TypeDescriptionReference * pSetType = _unionGetSetType( 613*cdf0e10cSrcweir pSource, pElementTypeDescr ); 614*cdf0e10cSrcweir ::uno_type_copyData( 615*cdf0e10cSrcweir pDest + nValueOffset, 616*cdf0e10cSrcweir pSource + nValueOffset, 617*cdf0e10cSrcweir pSetType, acquire ); 618*cdf0e10cSrcweir *(sal_Int64 *)pDest = *(sal_Int64 *)pSource; 619*cdf0e10cSrcweir typelib_typedescriptionreference_release( pSetType ); 620*cdf0e10cSrcweir } 621*cdf0e10cSrcweir } 622*cdf0e10cSrcweir 623*cdf0e10cSrcweir TYPELIB_DANGER_RELEASE( pElementTypeDescr ); 624*cdf0e10cSrcweir break; 625*cdf0e10cSrcweir } 626*cdf0e10cSrcweir case typelib_TypeClass_SEQUENCE: // sequence of sequence 627*cdf0e10cSrcweir { 628*cdf0e10cSrcweir if (nAlloc >= 0) 629*cdf0e10cSrcweir pSeq = reallocSeq( pSeq, sizeof(uno_Sequence *), nAlloc ); 630*cdf0e10cSrcweir if (pSeq != 0) 631*cdf0e10cSrcweir { 632*cdf0e10cSrcweir typelib_TypeDescription * pElementTypeDescr = 0; 633*cdf0e10cSrcweir TYPELIB_DANGER_GET( &pElementTypeDescr, pElementType ); 634*cdf0e10cSrcweir typelib_TypeDescriptionReference * pSeqElementType = 635*cdf0e10cSrcweir ((typelib_IndirectTypeDescription *) pElementTypeDescr)->pType; 636*cdf0e10cSrcweir uno_Sequence ** pDestElements = (uno_Sequence **) pSeq->elements; 637*cdf0e10cSrcweir for ( sal_Int32 nPos = nStartIndex; nPos < nStopIndex; ++nPos ) 638*cdf0e10cSrcweir { 639*cdf0e10cSrcweir uno_Sequence * pNew = icopyConstructSequence( 640*cdf0e10cSrcweir ((uno_Sequence **) pSourceElements)[nPos], 641*cdf0e10cSrcweir pSeqElementType, acquire, 0 ); 642*cdf0e10cSrcweir OSL_ASSERT( pNew != 0 ); 643*cdf0e10cSrcweir // ought never be a memory allocation problem, 644*cdf0e10cSrcweir // because of reference counted sequence handles 645*cdf0e10cSrcweir pDestElements[ nPos ] = pNew; 646*cdf0e10cSrcweir } 647*cdf0e10cSrcweir TYPELIB_DANGER_RELEASE( pElementTypeDescr ); 648*cdf0e10cSrcweir } 649*cdf0e10cSrcweir break; 650*cdf0e10cSrcweir } 651*cdf0e10cSrcweir case typelib_TypeClass_INTERFACE: 652*cdf0e10cSrcweir { 653*cdf0e10cSrcweir if (nAlloc >= 0) 654*cdf0e10cSrcweir pSeq = reallocSeq( pSeq, sizeof(void *), nAlloc ); 655*cdf0e10cSrcweir if (pSeq != 0) 656*cdf0e10cSrcweir { 657*cdf0e10cSrcweir void ** pDestElements = (void **) pSeq->elements; 658*cdf0e10cSrcweir for ( sal_Int32 nPos = nStartIndex; nPos < nStopIndex; ++nPos ) 659*cdf0e10cSrcweir { 660*cdf0e10cSrcweir _acquire( pDestElements[nPos] = 661*cdf0e10cSrcweir ((void **)pSourceElements)[nPos], acquire ); 662*cdf0e10cSrcweir } 663*cdf0e10cSrcweir } 664*cdf0e10cSrcweir break; 665*cdf0e10cSrcweir } 666*cdf0e10cSrcweir default: 667*cdf0e10cSrcweir OSL_ENSURE( 0, "### unexpected element type!" ); 668*cdf0e10cSrcweir pSeq = 0; 669*cdf0e10cSrcweir break; 670*cdf0e10cSrcweir } 671*cdf0e10cSrcweir 672*cdf0e10cSrcweir if (pSeq == 0) 673*cdf0e10cSrcweir { 674*cdf0e10cSrcweir OSL_ASSERT( nAlloc >= 0 ); // must have been an allocation failure 675*cdf0e10cSrcweir return false; 676*cdf0e10cSrcweir } 677*cdf0e10cSrcweir else 678*cdf0e10cSrcweir { 679*cdf0e10cSrcweir *ppSeq = pSeq; 680*cdf0e10cSrcweir return true; 681*cdf0e10cSrcweir } 682*cdf0e10cSrcweir } 683*cdf0e10cSrcweir 684*cdf0e10cSrcweir //------------------------------------------------------------------------------ 685*cdf0e10cSrcweir static inline bool ireallocSequence( 686*cdf0e10cSrcweir uno_Sequence ** ppSequence, 687*cdf0e10cSrcweir typelib_TypeDescriptionReference * pElementType, 688*cdf0e10cSrcweir sal_Int32 nSize, 689*cdf0e10cSrcweir uno_AcquireFunc acquire, uno_ReleaseFunc release ) 690*cdf0e10cSrcweir { 691*cdf0e10cSrcweir bool ret = true; 692*cdf0e10cSrcweir uno_Sequence * pSeq = *ppSequence; 693*cdf0e10cSrcweir sal_Int32 nElements = pSeq->nElements; 694*cdf0e10cSrcweir 695*cdf0e10cSrcweir if (pSeq->nRefCount > 1 || 696*cdf0e10cSrcweir // not mem-copyable elements? 697*cdf0e10cSrcweir typelib_TypeClass_ANY == pElementType->eTypeClass || 698*cdf0e10cSrcweir typelib_TypeClass_STRUCT == pElementType->eTypeClass || 699*cdf0e10cSrcweir typelib_TypeClass_EXCEPTION == pElementType->eTypeClass) 700*cdf0e10cSrcweir { 701*cdf0e10cSrcweir // split sequence and construct new one from scratch 702*cdf0e10cSrcweir uno_Sequence * pNew = 0; 703*cdf0e10cSrcweir 704*cdf0e10cSrcweir sal_Int32 nRest = nSize - nElements; 705*cdf0e10cSrcweir sal_Int32 nCopy = (nRest > 0 ? nElements : nSize); 706*cdf0e10cSrcweir 707*cdf0e10cSrcweir if (nCopy >= 0) 708*cdf0e10cSrcweir { 709*cdf0e10cSrcweir ret = icopyConstructFromElements( 710*cdf0e10cSrcweir &pNew, pSeq->elements, pElementType, 711*cdf0e10cSrcweir 0, nCopy, acquire, 712*cdf0e10cSrcweir nSize ); // alloc to nSize 713*cdf0e10cSrcweir } 714*cdf0e10cSrcweir if (ret && nRest > 0) 715*cdf0e10cSrcweir { 716*cdf0e10cSrcweir ret = idefaultConstructElements( 717*cdf0e10cSrcweir &pNew, pElementType, 718*cdf0e10cSrcweir nCopy, nSize, 719*cdf0e10cSrcweir nCopy >= 0 ? -1 /* no mem allocation */ : nSize ); 720*cdf0e10cSrcweir } 721*cdf0e10cSrcweir 722*cdf0e10cSrcweir if (ret) 723*cdf0e10cSrcweir { 724*cdf0e10cSrcweir // destruct sequence 725*cdf0e10cSrcweir if (osl_decrementInterlockedCount( &pSeq->nRefCount ) == 0) 726*cdf0e10cSrcweir { 727*cdf0e10cSrcweir if (nElements > 0) 728*cdf0e10cSrcweir { 729*cdf0e10cSrcweir idestructElements( 730*cdf0e10cSrcweir pSeq->elements, pElementType, 731*cdf0e10cSrcweir 0, nElements, release ); 732*cdf0e10cSrcweir } 733*cdf0e10cSrcweir rtl_freeMemory( pSeq ); 734*cdf0e10cSrcweir } 735*cdf0e10cSrcweir *ppSequence = pNew; 736*cdf0e10cSrcweir } 737*cdf0e10cSrcweir } 738*cdf0e10cSrcweir else 739*cdf0e10cSrcweir { 740*cdf0e10cSrcweir OSL_ASSERT( pSeq->nRefCount == 1 ); 741*cdf0e10cSrcweir if (nSize > nElements) // default construct the rest 742*cdf0e10cSrcweir { 743*cdf0e10cSrcweir ret = idefaultConstructElements( 744*cdf0e10cSrcweir ppSequence, pElementType, 745*cdf0e10cSrcweir nElements, nSize, 746*cdf0e10cSrcweir nSize ); // realloc to nSize 747*cdf0e10cSrcweir } 748*cdf0e10cSrcweir else // or destruct the rest and realloc mem 749*cdf0e10cSrcweir { 750*cdf0e10cSrcweir sal_Int32 nElementSize = idestructElements( 751*cdf0e10cSrcweir pSeq->elements, pElementType, 752*cdf0e10cSrcweir nSize, nElements, release ); 753*cdf0e10cSrcweir // warning: it is assumed that the following will never fail, 754*cdf0e10cSrcweir // else this leads to a sequence null handle 755*cdf0e10cSrcweir *ppSequence = reallocSeq( pSeq, nElementSize, nSize ); 756*cdf0e10cSrcweir OSL_ASSERT( *ppSequence != 0 ); 757*cdf0e10cSrcweir ret = (*ppSequence != 0); 758*cdf0e10cSrcweir } 759*cdf0e10cSrcweir } 760*cdf0e10cSrcweir 761*cdf0e10cSrcweir return ret; 762*cdf0e10cSrcweir } 763*cdf0e10cSrcweir 764*cdf0e10cSrcweir } 765*cdf0e10cSrcweir 766*cdf0e10cSrcweir extern "C" 767*cdf0e10cSrcweir { 768*cdf0e10cSrcweir 769*cdf0e10cSrcweir //############################################################################## 770*cdf0e10cSrcweir sal_Bool SAL_CALL uno_type_sequence_construct( 771*cdf0e10cSrcweir uno_Sequence ** ppSequence, typelib_TypeDescriptionReference * pType, 772*cdf0e10cSrcweir void * pElements, sal_Int32 len, 773*cdf0e10cSrcweir uno_AcquireFunc acquire ) 774*cdf0e10cSrcweir SAL_THROW_EXTERN_C() 775*cdf0e10cSrcweir { 776*cdf0e10cSrcweir bool ret; 777*cdf0e10cSrcweir if (len) 778*cdf0e10cSrcweir { 779*cdf0e10cSrcweir typelib_TypeDescription * pTypeDescr = 0; 780*cdf0e10cSrcweir TYPELIB_DANGER_GET( &pTypeDescr, pType ); 781*cdf0e10cSrcweir 782*cdf0e10cSrcweir typelib_TypeDescriptionReference * pElementType = 783*cdf0e10cSrcweir ((typelib_IndirectTypeDescription *)pTypeDescr)->pType; 784*cdf0e10cSrcweir 785*cdf0e10cSrcweir *ppSequence = 0; 786*cdf0e10cSrcweir if (pElements == 0) 787*cdf0e10cSrcweir { 788*cdf0e10cSrcweir ret = idefaultConstructElements( 789*cdf0e10cSrcweir ppSequence, pElementType, 790*cdf0e10cSrcweir 0, len, 791*cdf0e10cSrcweir len ); // alloc to len 792*cdf0e10cSrcweir } 793*cdf0e10cSrcweir else 794*cdf0e10cSrcweir { 795*cdf0e10cSrcweir ret = icopyConstructFromElements( 796*cdf0e10cSrcweir ppSequence, pElements, pElementType, 797*cdf0e10cSrcweir 0, len, acquire, 798*cdf0e10cSrcweir len ); // alloc to len 799*cdf0e10cSrcweir } 800*cdf0e10cSrcweir 801*cdf0e10cSrcweir TYPELIB_DANGER_RELEASE( pTypeDescr ); 802*cdf0e10cSrcweir } 803*cdf0e10cSrcweir else 804*cdf0e10cSrcweir { 805*cdf0e10cSrcweir *ppSequence = createEmptySequence(); 806*cdf0e10cSrcweir ret = true; 807*cdf0e10cSrcweir } 808*cdf0e10cSrcweir 809*cdf0e10cSrcweir OSL_ASSERT( (*ppSequence != 0) == ret ); 810*cdf0e10cSrcweir return ret; 811*cdf0e10cSrcweir } 812*cdf0e10cSrcweir 813*cdf0e10cSrcweir //############################################################################## 814*cdf0e10cSrcweir sal_Bool SAL_CALL uno_sequence_construct( 815*cdf0e10cSrcweir uno_Sequence ** ppSequence, typelib_TypeDescription * pTypeDescr, 816*cdf0e10cSrcweir void * pElements, sal_Int32 len, 817*cdf0e10cSrcweir uno_AcquireFunc acquire ) 818*cdf0e10cSrcweir SAL_THROW_EXTERN_C() 819*cdf0e10cSrcweir { 820*cdf0e10cSrcweir bool ret; 821*cdf0e10cSrcweir if (len > 0) 822*cdf0e10cSrcweir { 823*cdf0e10cSrcweir typelib_TypeDescriptionReference * pElementType = 824*cdf0e10cSrcweir ((typelib_IndirectTypeDescription *)pTypeDescr)->pType; 825*cdf0e10cSrcweir 826*cdf0e10cSrcweir *ppSequence = 0; 827*cdf0e10cSrcweir if (pElements == 0) 828*cdf0e10cSrcweir { 829*cdf0e10cSrcweir ret = idefaultConstructElements( 830*cdf0e10cSrcweir ppSequence, pElementType, 831*cdf0e10cSrcweir 0, len, 832*cdf0e10cSrcweir len ); // alloc to len 833*cdf0e10cSrcweir } 834*cdf0e10cSrcweir else 835*cdf0e10cSrcweir { 836*cdf0e10cSrcweir ret = icopyConstructFromElements( 837*cdf0e10cSrcweir ppSequence, pElements, pElementType, 838*cdf0e10cSrcweir 0, len, acquire, 839*cdf0e10cSrcweir len ); // alloc to len 840*cdf0e10cSrcweir } 841*cdf0e10cSrcweir } 842*cdf0e10cSrcweir else 843*cdf0e10cSrcweir { 844*cdf0e10cSrcweir *ppSequence = createEmptySequence(); 845*cdf0e10cSrcweir ret = true; 846*cdf0e10cSrcweir } 847*cdf0e10cSrcweir 848*cdf0e10cSrcweir OSL_ASSERT( (*ppSequence != 0) == ret ); 849*cdf0e10cSrcweir return ret; 850*cdf0e10cSrcweir } 851*cdf0e10cSrcweir 852*cdf0e10cSrcweir //############################################################################## 853*cdf0e10cSrcweir sal_Bool SAL_CALL uno_type_sequence_realloc( 854*cdf0e10cSrcweir uno_Sequence ** ppSequence, typelib_TypeDescriptionReference * pType, 855*cdf0e10cSrcweir sal_Int32 nSize, uno_AcquireFunc acquire, uno_ReleaseFunc release ) 856*cdf0e10cSrcweir SAL_THROW_EXTERN_C() 857*cdf0e10cSrcweir { 858*cdf0e10cSrcweir OSL_ENSURE( ppSequence, "### null ptr!" ); 859*cdf0e10cSrcweir OSL_ENSURE( nSize >= 0, "### new size must be at least 0!" ); 860*cdf0e10cSrcweir 861*cdf0e10cSrcweir bool ret = true; 862*cdf0e10cSrcweir if (nSize != (*ppSequence)->nElements) 863*cdf0e10cSrcweir { 864*cdf0e10cSrcweir typelib_TypeDescription * pTypeDescr = 0; 865*cdf0e10cSrcweir TYPELIB_DANGER_GET( &pTypeDescr, pType ); 866*cdf0e10cSrcweir ret = ireallocSequence( 867*cdf0e10cSrcweir ppSequence, ((typelib_IndirectTypeDescription *)pTypeDescr)->pType, 868*cdf0e10cSrcweir nSize, acquire, release ); 869*cdf0e10cSrcweir TYPELIB_DANGER_RELEASE( pTypeDescr ); 870*cdf0e10cSrcweir } 871*cdf0e10cSrcweir return ret; 872*cdf0e10cSrcweir } 873*cdf0e10cSrcweir 874*cdf0e10cSrcweir //############################################################################## 875*cdf0e10cSrcweir sal_Bool SAL_CALL uno_sequence_realloc( 876*cdf0e10cSrcweir uno_Sequence ** ppSequence, typelib_TypeDescription * pTypeDescr, 877*cdf0e10cSrcweir sal_Int32 nSize, uno_AcquireFunc acquire, uno_ReleaseFunc release ) 878*cdf0e10cSrcweir SAL_THROW_EXTERN_C() 879*cdf0e10cSrcweir { 880*cdf0e10cSrcweir OSL_ENSURE( ppSequence, "### null ptr!" ); 881*cdf0e10cSrcweir OSL_ENSURE( nSize >= 0, "### new size must be at least 0!" ); 882*cdf0e10cSrcweir 883*cdf0e10cSrcweir bool ret = true; 884*cdf0e10cSrcweir if (nSize != (*ppSequence)->nElements) 885*cdf0e10cSrcweir { 886*cdf0e10cSrcweir ret = ireallocSequence( 887*cdf0e10cSrcweir ppSequence, ((typelib_IndirectTypeDescription *)pTypeDescr)->pType, 888*cdf0e10cSrcweir nSize, acquire, release ); 889*cdf0e10cSrcweir } 890*cdf0e10cSrcweir return ret; 891*cdf0e10cSrcweir } 892*cdf0e10cSrcweir 893*cdf0e10cSrcweir //############################################################################## 894*cdf0e10cSrcweir sal_Bool SAL_CALL uno_type_sequence_reference2One( 895*cdf0e10cSrcweir uno_Sequence ** ppSequence, 896*cdf0e10cSrcweir typelib_TypeDescriptionReference * pType, 897*cdf0e10cSrcweir uno_AcquireFunc acquire, uno_ReleaseFunc release ) 898*cdf0e10cSrcweir SAL_THROW_EXTERN_C() 899*cdf0e10cSrcweir { 900*cdf0e10cSrcweir OSL_ENSURE( ppSequence, "### null ptr!" ); 901*cdf0e10cSrcweir bool ret = true; 902*cdf0e10cSrcweir uno_Sequence * pSequence = *ppSequence; 903*cdf0e10cSrcweir if (pSequence->nRefCount > 1) 904*cdf0e10cSrcweir { 905*cdf0e10cSrcweir uno_Sequence * pNew = 0; 906*cdf0e10cSrcweir if (pSequence->nElements > 0) 907*cdf0e10cSrcweir { 908*cdf0e10cSrcweir typelib_TypeDescription * pTypeDescr = 0; 909*cdf0e10cSrcweir TYPELIB_DANGER_GET( &pTypeDescr, pType ); 910*cdf0e10cSrcweir 911*cdf0e10cSrcweir ret = icopyConstructFromElements( 912*cdf0e10cSrcweir &pNew, pSequence->elements, 913*cdf0e10cSrcweir ((typelib_IndirectTypeDescription *)pTypeDescr)->pType, 914*cdf0e10cSrcweir 0, pSequence->nElements, acquire, 915*cdf0e10cSrcweir pSequence->nElements ); // alloc nElements 916*cdf0e10cSrcweir if (ret) 917*cdf0e10cSrcweir { 918*cdf0e10cSrcweir idestructSequence( *ppSequence, pType, pTypeDescr, release ); 919*cdf0e10cSrcweir *ppSequence = pNew; 920*cdf0e10cSrcweir } 921*cdf0e10cSrcweir 922*cdf0e10cSrcweir TYPELIB_DANGER_RELEASE( pTypeDescr ); 923*cdf0e10cSrcweir } 924*cdf0e10cSrcweir else 925*cdf0e10cSrcweir { 926*cdf0e10cSrcweir pNew = allocSeq( 0, 0 ); 927*cdf0e10cSrcweir ret = (pNew != 0); 928*cdf0e10cSrcweir if (ret) 929*cdf0e10cSrcweir { 930*cdf0e10cSrcweir // easy destruction of empty sequence: 931*cdf0e10cSrcweir if (osl_decrementInterlockedCount( &pSequence->nRefCount ) == 0) 932*cdf0e10cSrcweir rtl_freeMemory( pSequence ); 933*cdf0e10cSrcweir *ppSequence = pNew; 934*cdf0e10cSrcweir } 935*cdf0e10cSrcweir } 936*cdf0e10cSrcweir } 937*cdf0e10cSrcweir return ret; 938*cdf0e10cSrcweir } 939*cdf0e10cSrcweir 940*cdf0e10cSrcweir //############################################################################## 941*cdf0e10cSrcweir sal_Bool SAL_CALL uno_sequence_reference2One( 942*cdf0e10cSrcweir uno_Sequence ** ppSequence, 943*cdf0e10cSrcweir typelib_TypeDescription * pTypeDescr, 944*cdf0e10cSrcweir uno_AcquireFunc acquire, uno_ReleaseFunc release ) 945*cdf0e10cSrcweir SAL_THROW_EXTERN_C() 946*cdf0e10cSrcweir { 947*cdf0e10cSrcweir OSL_ENSURE( ppSequence, "### null ptr!" ); 948*cdf0e10cSrcweir bool ret = true; 949*cdf0e10cSrcweir uno_Sequence * pSequence = *ppSequence; 950*cdf0e10cSrcweir if (pSequence->nRefCount > 1) 951*cdf0e10cSrcweir { 952*cdf0e10cSrcweir uno_Sequence * pNew = 0; 953*cdf0e10cSrcweir if (pSequence->nElements > 0) 954*cdf0e10cSrcweir { 955*cdf0e10cSrcweir ret = icopyConstructFromElements( 956*cdf0e10cSrcweir &pNew, pSequence->elements, 957*cdf0e10cSrcweir ((typelib_IndirectTypeDescription *)pTypeDescr)->pType, 958*cdf0e10cSrcweir 0, pSequence->nElements, acquire, 959*cdf0e10cSrcweir pSequence->nElements ); // alloc nElements 960*cdf0e10cSrcweir if (ret) 961*cdf0e10cSrcweir { 962*cdf0e10cSrcweir idestructSequence( 963*cdf0e10cSrcweir pSequence, pTypeDescr->pWeakRef, pTypeDescr, release ); 964*cdf0e10cSrcweir *ppSequence = pNew; 965*cdf0e10cSrcweir } 966*cdf0e10cSrcweir } 967*cdf0e10cSrcweir else 968*cdf0e10cSrcweir { 969*cdf0e10cSrcweir pNew = allocSeq( 0, 0 ); 970*cdf0e10cSrcweir ret = (pNew != 0); 971*cdf0e10cSrcweir if (ret) 972*cdf0e10cSrcweir { 973*cdf0e10cSrcweir // easy destruction of empty sequence: 974*cdf0e10cSrcweir if (osl_decrementInterlockedCount( &pSequence->nRefCount ) == 0) 975*cdf0e10cSrcweir rtl_freeMemory( pSequence ); 976*cdf0e10cSrcweir *ppSequence = pNew; 977*cdf0e10cSrcweir } 978*cdf0e10cSrcweir } 979*cdf0e10cSrcweir 980*cdf0e10cSrcweir } 981*cdf0e10cSrcweir return ret; 982*cdf0e10cSrcweir } 983*cdf0e10cSrcweir 984*cdf0e10cSrcweir //############################################################################## 985*cdf0e10cSrcweir void SAL_CALL uno_sequence_assign( 986*cdf0e10cSrcweir uno_Sequence ** ppDest, 987*cdf0e10cSrcweir uno_Sequence * pSource, 988*cdf0e10cSrcweir typelib_TypeDescription * pTypeDescr, 989*cdf0e10cSrcweir uno_ReleaseFunc release ) 990*cdf0e10cSrcweir SAL_THROW_EXTERN_C() 991*cdf0e10cSrcweir { 992*cdf0e10cSrcweir if (*ppDest != pSource) 993*cdf0e10cSrcweir { 994*cdf0e10cSrcweir ::osl_incrementInterlockedCount( &pSource->nRefCount ); 995*cdf0e10cSrcweir idestructSequence( *ppDest, pTypeDescr->pWeakRef, pTypeDescr, release ); 996*cdf0e10cSrcweir *ppDest = pSource; 997*cdf0e10cSrcweir } 998*cdf0e10cSrcweir } 999*cdf0e10cSrcweir 1000*cdf0e10cSrcweir //############################################################################## 1001*cdf0e10cSrcweir void SAL_CALL uno_type_sequence_assign( 1002*cdf0e10cSrcweir uno_Sequence ** ppDest, 1003*cdf0e10cSrcweir uno_Sequence * pSource, 1004*cdf0e10cSrcweir typelib_TypeDescriptionReference * pType, 1005*cdf0e10cSrcweir uno_ReleaseFunc release ) 1006*cdf0e10cSrcweir SAL_THROW_EXTERN_C() 1007*cdf0e10cSrcweir { 1008*cdf0e10cSrcweir if (*ppDest != pSource) 1009*cdf0e10cSrcweir { 1010*cdf0e10cSrcweir ::osl_incrementInterlockedCount( &pSource->nRefCount ); 1011*cdf0e10cSrcweir idestructSequence( *ppDest, pType, 0, release ); 1012*cdf0e10cSrcweir *ppDest = pSource; 1013*cdf0e10cSrcweir } 1014*cdf0e10cSrcweir } 1015*cdf0e10cSrcweir 1016*cdf0e10cSrcweir } 1017