1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 #ifndef CONSTR_HXX 24 #define CONSTR_HXX 25 26 #include "prim.hxx" 27 28 29 namespace cppu 30 { 31 32 //################################################################################################## 33 //#### construction ################################################################################ 34 //################################################################################################## 35 36 //-------------------------------------------------------------------------------------------------- 37 inline void _defaultConstructUnion( 38 void * pMem, 39 typelib_TypeDescription * pTypeDescr ) 40 SAL_THROW( () ) 41 { 42 ::uno_type_constructData( 43 (char *)pMem + ((typelib_UnionTypeDescription *)pTypeDescr)->nValueOffset, 44 ((typelib_UnionTypeDescription *)pTypeDescr)->pDefaultTypeRef ); 45 *(sal_Int64 *)pMem = ((typelib_UnionTypeDescription *)pTypeDescr)->nDefaultDiscriminant; 46 } 47 //================================================================================================== 48 void defaultConstructStruct( 49 void * pMem, 50 typelib_CompoundTypeDescription * pCompType ) 51 SAL_THROW( () ); 52 //-------------------------------------------------------------------------------------------------- 53 inline void _defaultConstructStruct( 54 void * pMem, 55 typelib_CompoundTypeDescription * pTypeDescr ) 56 SAL_THROW( () ) 57 { 58 if (pTypeDescr->pBaseTypeDescription) 59 { 60 defaultConstructStruct( pMem, pTypeDescr->pBaseTypeDescription ); 61 } 62 63 typelib_TypeDescriptionReference ** ppTypeRefs = (pTypeDescr)->ppTypeRefs; 64 sal_Int32 * pMemberOffsets = pTypeDescr->pMemberOffsets; 65 sal_Int32 nDescr = pTypeDescr->nMembers; 66 67 while (nDescr--) 68 { 69 ::uno_type_constructData( (char *)pMem + pMemberOffsets[nDescr], ppTypeRefs[nDescr] ); 70 } 71 } 72 73 //-------------------------------------------------------------------------------------------------- 74 inline void _defaultConstructArray( 75 void * pMem, 76 typelib_ArrayTypeDescription * pTypeDescr ) 77 { 78 typelib_TypeDescription * pElementType = NULL; 79 TYPELIB_DANGER_GET( &pElementType, ((typelib_IndirectTypeDescription *)pTypeDescr)->pType ); 80 sal_Int32 nTotalElements = pTypeDescr->nTotalElements; 81 sal_Int32 nElementSize = pElementType->nSize; 82 sal_Int32 i; 83 switch ( pElementType->eTypeClass ) 84 { 85 case typelib_TypeClass_CHAR: 86 case typelib_TypeClass_BOOLEAN: 87 case typelib_TypeClass_BYTE: 88 case typelib_TypeClass_SHORT: 89 case typelib_TypeClass_UNSIGNED_SHORT: 90 case typelib_TypeClass_LONG: 91 case typelib_TypeClass_UNSIGNED_LONG: 92 case typelib_TypeClass_HYPER: 93 case typelib_TypeClass_UNSIGNED_HYPER: 94 case typelib_TypeClass_FLOAT: 95 case typelib_TypeClass_DOUBLE: 96 case typelib_TypeClass_INTERFACE: 97 ::rtl_zeroMemory(pMem, nElementSize * nTotalElements); 98 break; 99 100 case typelib_TypeClass_STRING: 101 for (i=0; i < nTotalElements; i++) 102 { 103 rtl_uString** ppElement = (rtl_uString **)pMem + i; 104 *ppElement = 0; 105 rtl_uString_new( ppElement); 106 } 107 break; 108 case typelib_TypeClass_TYPE: 109 for (i=0; i < nTotalElements; i++) 110 { 111 typelib_TypeDescriptionReference** ppElement = (typelib_TypeDescriptionReference **)pMem + i; 112 *ppElement = _getVoidType(); 113 } 114 break; 115 case typelib_TypeClass_ANY: 116 for (i=0; i < nTotalElements; i++) 117 { 118 CONSTRUCT_EMPTY_ANY( (uno_Any *)pMem + i ); 119 } 120 break; 121 case typelib_TypeClass_ENUM: 122 for (i=0; i < nTotalElements; i++) 123 { 124 *((sal_Int32 *)pMem + i) = ((typelib_EnumTypeDescription *)pElementType)->nDefaultEnumValue; 125 } 126 break; 127 case typelib_TypeClass_STRUCT: 128 case typelib_TypeClass_EXCEPTION: 129 for (i=0; i < nTotalElements; i++) 130 { 131 _defaultConstructStruct( (sal_Char*)pMem + i * nElementSize, (typelib_CompoundTypeDescription *)pElementType ); 132 } 133 break; 134 case typelib_TypeClass_UNION: 135 for (i=0; i < nTotalElements; i++) 136 { 137 _defaultConstructUnion( (sal_Char*)pMem + i * nElementSize, pElementType ); 138 } 139 break; 140 case typelib_TypeClass_SEQUENCE: 141 for (i=0; i < nTotalElements; i++) 142 { 143 uno_Sequence** ppElement = (uno_Sequence **)pMem + i; 144 *ppElement = createEmptySequence(); 145 } 146 break; 147 default: 148 OSL_ASSERT(false); 149 break; 150 } 151 TYPELIB_DANGER_RELEASE( pElementType ); 152 } 153 154 //-------------------------------------------------------------------------------------------------- 155 inline void _defaultConstructData( 156 void * pMem, 157 typelib_TypeDescriptionReference * pType, 158 typelib_TypeDescription * pTypeDescr ) 159 SAL_THROW( () ) 160 { 161 switch (pType->eTypeClass) 162 { 163 case typelib_TypeClass_CHAR: 164 *(sal_Unicode *)pMem = '\0'; 165 break; 166 case typelib_TypeClass_BOOLEAN: 167 *(sal_Bool *)pMem = sal_False; 168 break; 169 case typelib_TypeClass_BYTE: 170 *(sal_Int8 *)pMem = 0; 171 break; 172 case typelib_TypeClass_SHORT: 173 case typelib_TypeClass_UNSIGNED_SHORT: 174 *(sal_Int16 *)pMem = 0; 175 break; 176 case typelib_TypeClass_LONG: 177 case typelib_TypeClass_UNSIGNED_LONG: 178 *(sal_Int32 *)pMem = 0; 179 break; 180 case typelib_TypeClass_HYPER: 181 case typelib_TypeClass_UNSIGNED_HYPER: 182 *(sal_Int64 *)pMem = 0; 183 break; 184 case typelib_TypeClass_FLOAT: 185 *(float *)pMem = 0.0; 186 break; 187 case typelib_TypeClass_DOUBLE: 188 *(double *)pMem = 0.0; 189 break; 190 case typelib_TypeClass_STRING: 191 *(rtl_uString **)pMem = 0; 192 ::rtl_uString_new( (rtl_uString **)pMem ); 193 break; 194 case typelib_TypeClass_TYPE: 195 *(typelib_TypeDescriptionReference **)pMem = _getVoidType(); 196 break; 197 case typelib_TypeClass_ANY: 198 CONSTRUCT_EMPTY_ANY( (uno_Any *)pMem ); 199 break; 200 case typelib_TypeClass_ENUM: 201 if (pTypeDescr) 202 { 203 *(sal_Int32 *)pMem = ((typelib_EnumTypeDescription *)pTypeDescr)->nDefaultEnumValue; 204 } 205 else 206 { 207 TYPELIB_DANGER_GET( &pTypeDescr, pType ); 208 *(sal_Int32 *)pMem = ((typelib_EnumTypeDescription *)pTypeDescr)->nDefaultEnumValue; 209 TYPELIB_DANGER_RELEASE( pTypeDescr ); 210 } 211 break; 212 case typelib_TypeClass_STRUCT: 213 case typelib_TypeClass_EXCEPTION: 214 if (pTypeDescr) 215 { 216 _defaultConstructStruct( pMem, (typelib_CompoundTypeDescription *)pTypeDescr ); 217 } 218 else 219 { 220 TYPELIB_DANGER_GET( &pTypeDescr, pType ); 221 _defaultConstructStruct( pMem, (typelib_CompoundTypeDescription *)pTypeDescr ); 222 TYPELIB_DANGER_RELEASE( pTypeDescr ); 223 } 224 break; 225 case typelib_TypeClass_ARRAY: 226 if (pTypeDescr) 227 { 228 _defaultConstructArray( pMem, (typelib_ArrayTypeDescription *)pTypeDescr ); 229 } 230 else 231 { 232 TYPELIB_DANGER_GET( &pTypeDescr, pType ); 233 _defaultConstructArray( pMem, (typelib_ArrayTypeDescription *)pTypeDescr ); 234 TYPELIB_DANGER_RELEASE( pTypeDescr ); 235 } 236 break; 237 case typelib_TypeClass_UNION: 238 if (pTypeDescr) 239 { 240 _defaultConstructUnion( pMem, pTypeDescr ); 241 } 242 else 243 { 244 TYPELIB_DANGER_GET( &pTypeDescr, pType ); 245 _defaultConstructUnion( pMem, pTypeDescr ); 246 TYPELIB_DANGER_RELEASE( pTypeDescr ); 247 } 248 break; 249 case typelib_TypeClass_SEQUENCE: 250 *(uno_Sequence **)pMem = createEmptySequence(); 251 break; 252 case typelib_TypeClass_INTERFACE: 253 *(void **)pMem = 0; // either cpp or c-uno interface 254 break; 255 default: 256 OSL_ASSERT(false); 257 break; 258 } 259 } 260 261 } 262 263 #endif 264