|  | /************************************************************** | 
|  | * | 
|  | * Licensed to the Apache Software Foundation (ASF) under one | 
|  | * or more contributor license agreements.  See the NOTICE file | 
|  | * distributed with this work for additional information | 
|  | * regarding copyright ownership.  The ASF licenses this file | 
|  | * to you under the Apache License, Version 2.0 (the | 
|  | * "License"); you may not use this file except in compliance | 
|  | * with the License.  You may obtain a copy of the License at | 
|  | * | 
|  | *   http://www.apache.org/licenses/LICENSE-2.0 | 
|  | * | 
|  | * Unless required by applicable law or agreed to in writing, | 
|  | * software distributed under the License is distributed on an | 
|  | * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | 
|  | * KIND, either express or implied.  See the License for the | 
|  | * specific language governing permissions and limitations | 
|  | * under the License. | 
|  | * | 
|  | *************************************************************/ | 
|  |  | 
|  |  | 
|  | #ifndef CONSTR_HXX | 
|  | #define CONSTR_HXX | 
|  |  | 
|  | #include "prim.hxx" | 
|  |  | 
|  |  | 
|  | namespace cppu | 
|  | { | 
|  |  | 
|  | //################################################################################################## | 
|  | //#### construction ################################################################################ | 
|  | //################################################################################################## | 
|  |  | 
|  | //-------------------------------------------------------------------------------------------------- | 
|  | inline void _defaultConstructUnion( | 
|  | void * pMem, | 
|  | typelib_TypeDescription * pTypeDescr ) | 
|  | SAL_THROW( () ) | 
|  | { | 
|  | ::uno_type_constructData( | 
|  | (char *)pMem + ((typelib_UnionTypeDescription *)pTypeDescr)->nValueOffset, | 
|  | ((typelib_UnionTypeDescription *)pTypeDescr)->pDefaultTypeRef ); | 
|  | *(sal_Int64 *)pMem = ((typelib_UnionTypeDescription *)pTypeDescr)->nDefaultDiscriminant; | 
|  | } | 
|  | //================================================================================================== | 
|  | void defaultConstructStruct( | 
|  | void * pMem, | 
|  | typelib_CompoundTypeDescription * pCompType ) | 
|  | SAL_THROW( () ); | 
|  | //-------------------------------------------------------------------------------------------------- | 
|  | inline void _defaultConstructStruct( | 
|  | void * pMem, | 
|  | typelib_CompoundTypeDescription * pTypeDescr ) | 
|  | SAL_THROW( () ) | 
|  | { | 
|  | if (pTypeDescr->pBaseTypeDescription) | 
|  | { | 
|  | defaultConstructStruct( pMem, pTypeDescr->pBaseTypeDescription ); | 
|  | } | 
|  |  | 
|  | typelib_TypeDescriptionReference ** ppTypeRefs = (pTypeDescr)->ppTypeRefs; | 
|  | sal_Int32 * pMemberOffsets = pTypeDescr->pMemberOffsets; | 
|  | sal_Int32 nDescr = pTypeDescr->nMembers; | 
|  |  | 
|  | while (nDescr--) | 
|  | { | 
|  | ::uno_type_constructData( (char *)pMem + pMemberOffsets[nDescr], ppTypeRefs[nDescr] ); | 
|  | } | 
|  | } | 
|  |  | 
|  | //-------------------------------------------------------------------------------------------------- | 
|  | inline void _defaultConstructArray( | 
|  | void * pMem, | 
|  | typelib_ArrayTypeDescription * pTypeDescr ) | 
|  | { | 
|  | typelib_TypeDescription * pElementType = NULL; | 
|  | TYPELIB_DANGER_GET( &pElementType, ((typelib_IndirectTypeDescription *)pTypeDescr)->pType ); | 
|  | sal_Int32 nTotalElements = pTypeDescr->nTotalElements; | 
|  | sal_Int32 nElementSize = pElementType->nSize; | 
|  | sal_Int32 i; | 
|  | switch ( pElementType->eTypeClass ) | 
|  | { | 
|  | case typelib_TypeClass_CHAR: | 
|  | case typelib_TypeClass_BOOLEAN: | 
|  | case typelib_TypeClass_BYTE: | 
|  | case typelib_TypeClass_SHORT: | 
|  | case typelib_TypeClass_UNSIGNED_SHORT: | 
|  | case typelib_TypeClass_LONG: | 
|  | case typelib_TypeClass_UNSIGNED_LONG: | 
|  | case typelib_TypeClass_HYPER: | 
|  | case typelib_TypeClass_UNSIGNED_HYPER: | 
|  | case typelib_TypeClass_FLOAT: | 
|  | case typelib_TypeClass_DOUBLE: | 
|  | case typelib_TypeClass_INTERFACE: | 
|  | ::rtl_zeroMemory(pMem, nElementSize * nTotalElements); | 
|  | break; | 
|  |  | 
|  | case typelib_TypeClass_STRING: | 
|  | for (i=0; i < nTotalElements; i++) | 
|  | { | 
|  | rtl_uString** ppElement = (rtl_uString **)pMem + i; | 
|  | *ppElement = 0; | 
|  | rtl_uString_new( ppElement); | 
|  | } | 
|  | break; | 
|  | case typelib_TypeClass_TYPE: | 
|  | for (i=0; i < nTotalElements; i++) | 
|  | { | 
|  | typelib_TypeDescriptionReference** ppElement = (typelib_TypeDescriptionReference **)pMem + i; | 
|  | *ppElement = _getVoidType(); | 
|  | } | 
|  | break; | 
|  | case typelib_TypeClass_ANY: | 
|  | for (i=0; i < nTotalElements; i++) | 
|  | { | 
|  | CONSTRUCT_EMPTY_ANY( (uno_Any *)pMem + i ); | 
|  | } | 
|  | break; | 
|  | case typelib_TypeClass_ENUM: | 
|  | for (i=0; i < nTotalElements; i++) | 
|  | { | 
|  | *((sal_Int32 *)pMem + i) = ((typelib_EnumTypeDescription *)pElementType)->nDefaultEnumValue; | 
|  | } | 
|  | break; | 
|  | case typelib_TypeClass_STRUCT: | 
|  | case typelib_TypeClass_EXCEPTION: | 
|  | for (i=0; i < nTotalElements; i++) | 
|  | { | 
|  | _defaultConstructStruct( (sal_Char*)pMem + i * nElementSize, (typelib_CompoundTypeDescription *)pElementType ); | 
|  | } | 
|  | break; | 
|  | case typelib_TypeClass_UNION: | 
|  | for (i=0; i < nTotalElements; i++) | 
|  | { | 
|  | _defaultConstructUnion( (sal_Char*)pMem + i * nElementSize, pElementType ); | 
|  | } | 
|  | break; | 
|  | case typelib_TypeClass_SEQUENCE: | 
|  | for (i=0; i < nTotalElements; i++) | 
|  | { | 
|  | uno_Sequence** ppElement = (uno_Sequence **)pMem + i; | 
|  | *ppElement = createEmptySequence(); | 
|  | } | 
|  | break; | 
|  | default: | 
|  | OSL_ASSERT(false); | 
|  | break; | 
|  | } | 
|  | TYPELIB_DANGER_RELEASE( pElementType ); | 
|  | } | 
|  |  | 
|  | //-------------------------------------------------------------------------------------------------- | 
|  | inline void _defaultConstructData( | 
|  | void * pMem, | 
|  | typelib_TypeDescriptionReference * pType, | 
|  | typelib_TypeDescription * pTypeDescr ) | 
|  | SAL_THROW( () ) | 
|  | { | 
|  | switch (pType->eTypeClass) | 
|  | { | 
|  | case typelib_TypeClass_CHAR: | 
|  | *(sal_Unicode *)pMem = '\0'; | 
|  | break; | 
|  | case typelib_TypeClass_BOOLEAN: | 
|  | *(sal_Bool *)pMem = sal_False; | 
|  | break; | 
|  | case typelib_TypeClass_BYTE: | 
|  | *(sal_Int8 *)pMem = 0; | 
|  | break; | 
|  | case typelib_TypeClass_SHORT: | 
|  | case typelib_TypeClass_UNSIGNED_SHORT: | 
|  | *(sal_Int16 *)pMem = 0; | 
|  | break; | 
|  | case typelib_TypeClass_LONG: | 
|  | case typelib_TypeClass_UNSIGNED_LONG: | 
|  | *(sal_Int32 *)pMem = 0; | 
|  | break; | 
|  | case typelib_TypeClass_HYPER: | 
|  | case typelib_TypeClass_UNSIGNED_HYPER: | 
|  | *(sal_Int64 *)pMem = 0; | 
|  | break; | 
|  | case typelib_TypeClass_FLOAT: | 
|  | *(float *)pMem = 0.0; | 
|  | break; | 
|  | case typelib_TypeClass_DOUBLE: | 
|  | *(double *)pMem = 0.0; | 
|  | break; | 
|  | case typelib_TypeClass_STRING: | 
|  | *(rtl_uString **)pMem = 0; | 
|  | ::rtl_uString_new( (rtl_uString **)pMem ); | 
|  | break; | 
|  | case typelib_TypeClass_TYPE: | 
|  | *(typelib_TypeDescriptionReference **)pMem = _getVoidType(); | 
|  | break; | 
|  | case typelib_TypeClass_ANY: | 
|  | CONSTRUCT_EMPTY_ANY( (uno_Any *)pMem ); | 
|  | break; | 
|  | case typelib_TypeClass_ENUM: | 
|  | if (pTypeDescr) | 
|  | { | 
|  | *(sal_Int32 *)pMem = ((typelib_EnumTypeDescription *)pTypeDescr)->nDefaultEnumValue; | 
|  | } | 
|  | else | 
|  | { | 
|  | TYPELIB_DANGER_GET( &pTypeDescr, pType ); | 
|  | *(sal_Int32 *)pMem = ((typelib_EnumTypeDescription *)pTypeDescr)->nDefaultEnumValue; | 
|  | TYPELIB_DANGER_RELEASE( pTypeDescr ); | 
|  | } | 
|  | break; | 
|  | case typelib_TypeClass_STRUCT: | 
|  | case typelib_TypeClass_EXCEPTION: | 
|  | if (pTypeDescr) | 
|  | { | 
|  | _defaultConstructStruct( pMem, (typelib_CompoundTypeDescription *)pTypeDescr ); | 
|  | } | 
|  | else | 
|  | { | 
|  | TYPELIB_DANGER_GET( &pTypeDescr, pType ); | 
|  | _defaultConstructStruct( pMem, (typelib_CompoundTypeDescription *)pTypeDescr ); | 
|  | TYPELIB_DANGER_RELEASE( pTypeDescr ); | 
|  | } | 
|  | break; | 
|  | case typelib_TypeClass_ARRAY: | 
|  | if (pTypeDescr) | 
|  | { | 
|  | _defaultConstructArray( pMem, (typelib_ArrayTypeDescription *)pTypeDescr ); | 
|  | } | 
|  | else | 
|  | { | 
|  | TYPELIB_DANGER_GET( &pTypeDescr, pType ); | 
|  | _defaultConstructArray( pMem, (typelib_ArrayTypeDescription *)pTypeDescr ); | 
|  | TYPELIB_DANGER_RELEASE( pTypeDescr ); | 
|  | } | 
|  | break; | 
|  | case typelib_TypeClass_UNION: | 
|  | if (pTypeDescr) | 
|  | { | 
|  | _defaultConstructUnion( pMem, pTypeDescr ); | 
|  | } | 
|  | else | 
|  | { | 
|  | TYPELIB_DANGER_GET( &pTypeDescr, pType ); | 
|  | _defaultConstructUnion( pMem, pTypeDescr ); | 
|  | TYPELIB_DANGER_RELEASE( pTypeDescr ); | 
|  | } | 
|  | break; | 
|  | case typelib_TypeClass_SEQUENCE: | 
|  | *(uno_Sequence **)pMem = createEmptySequence(); | 
|  | break; | 
|  | case typelib_TypeClass_INTERFACE: | 
|  | *(void **)pMem = 0; // either cpp or c-uno interface | 
|  | break; | 
|  | default: | 
|  | OSL_ASSERT(false); | 
|  | break; | 
|  | } | 
|  | } | 
|  |  | 
|  | } | 
|  |  | 
|  | #endif |