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