25#include <osl/mutex.hxx>
26#include <rtl/ustring.hxx>
28#include <typelib/typedescription.h>
36 Mutex& typelib_StaticInitMutex()
38 static Mutex SINGLETON;
72const sal_Int32
nMaxAlignment =
static_cast<sal_Int32
>(
reinterpret_cast<sal_Size
>(&
reinterpret_cast<AlignSize_Impl *
>(16)->dDouble) - 16);
78 return nRequestedAlignment;
85 sal_Int32 OldSize, sal_Int32 ElementSize, sal_Int32 NeededAlignment )
88 return (OldSize + NeededAlignment -1) / NeededAlignment * NeededAlignment + ElementSize;
93static typelib_TypeDescriptionReference *
igetTypeByName( rtl_uString
const * pTypeName )
95 typelib_TypeDescriptionReference * pRef =
nullptr;
97 if (pRef && pRef->pType && pRef->pType->pWeakRef)
108 typelib_TypeClass eTypeClass )
111 static typelib_TypeDescriptionReference * s_aTypes[] = {
112 nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
113 nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
114 nullptr,
nullptr,
nullptr };
116 if (! s_aTypes[eTypeClass])
118 MutexGuard aGuard( typelib_StaticInitMutex() );
119 if (! s_aTypes[eTypeClass])
121 static const char * s_aTypeNames[] = {
122 "void",
"char",
"boolean",
"byte",
123 "short",
"unsigned short",
"long",
"unsigned long",
124 "hyper",
"unsigned hyper",
"float",
"double",
125 "string",
"type",
"any" };
129 case typelib_TypeClass_EXCEPTION:
130 case typelib_TypeClass_INTERFACE:
133 if (! s_aTypes[typelib_TypeClass_TYPE])
135 OUString sTypeName(
"type");
137 &s_aTypes[typelib_TypeClass_TYPE], typelib_TypeClass_TYPE, sTypeName.pData );
139 ++s_aTypes[typelib_TypeClass_TYPE]->nStaticRefCount;
142 if (! s_aTypes[typelib_TypeClass_ANY])
144 OUString sTypeName(
"any");
146 &s_aTypes[typelib_TypeClass_ANY], typelib_TypeClass_ANY, sTypeName.pData );
148 ++s_aTypes[typelib_TypeClass_ANY]->nStaticRefCount;
151 if (! s_aTypes[typelib_TypeClass_STRING])
153 OUString sTypeName(
"string");
155 &s_aTypes[typelib_TypeClass_STRING], typelib_TypeClass_STRING, sTypeName.pData );
157 ++s_aTypes[typelib_TypeClass_STRING]->nStaticRefCount;
160 if (! s_aTypes[typelib_TypeClass_INTERFACE])
162 OUString sTypeName(
"com.sun.star.uno.XInterface");
164 typelib_InterfaceTypeDescription * pTD =
nullptr;
166 typelib_TypeDescriptionReference * pMembers[3] = {
nullptr,
nullptr,
nullptr };
167 OUString sMethodName0(
"com.sun.star.uno.XInterface::queryInterface");
169 &pMembers[0], typelib_TypeClass_INTERFACE_METHOD, sMethodName0.pData );
170 OUString sMethodName1(
"com.sun.star.uno.XInterface::acquire");
172 &pMembers[1], typelib_TypeClass_INTERFACE_METHOD, sMethodName1.pData );
173 OUString sMethodName2(
"com.sun.star.uno.XInterface::release");
175 &pMembers[2], typelib_TypeClass_INTERFACE_METHOD, sMethodName2.pData );
178 &pTD, sTypeName.pData, 0, 0, 0, 0, 0,
nullptr, 3, pMembers );
181 s_aTypes[typelib_TypeClass_INTERFACE] = pTD->aBase.pWeakRef;
183 s_aTypes[typelib_TypeClass_INTERFACE] );
185 ++s_aTypes[typelib_TypeClass_INTERFACE]->nStaticRefCount;
192 assert( ! s_aTypes[typelib_TypeClass_EXCEPTION] );
195 OUString sTypeName1(
"com.sun.star.uno.Exception");
197 typelib_CompoundMember_Init aMembers[2];
198 OUString sMemberType0(
"string");
199 OUString sMemberName0(
"Message");
200 aMembers[0].eTypeClass = typelib_TypeClass_STRING;
201 aMembers[0].pTypeName = sMemberType0.pData;
202 aMembers[0].pMemberName = sMemberName0.pData;
203 OUString sMemberType1(
"com.sun.star.uno.XInterface");
204 OUString sMemberName1(
"Context");
205 aMembers[1].eTypeClass = typelib_TypeClass_INTERFACE;
206 aMembers[1].pTypeName = sMemberType1.pData;
207 aMembers[1].pMemberName = sMemberName1.pData;
210 &pTD1, typelib_TypeClass_EXCEPTION, sTypeName1.pData,
nullptr, 2, aMembers );
212 s_aTypes[typelib_TypeClass_EXCEPTION] = pTD1->pWeakRef;
214 s_aTypes[typelib_TypeClass_EXCEPTION]);
216 ++s_aTypes[typelib_TypeClass_EXCEPTION]->nStaticRefCount;
218 OUString sTypeName2(
"com.sun.star.uno.RuntimeException");
220 &pTD1, typelib_TypeClass_EXCEPTION, sTypeName2.pData, s_aTypes[typelib_TypeClass_EXCEPTION], 0,
nullptr );
225 typelib_InterfaceMethodTypeDescription * pMethod =
nullptr;
226 typelib_Parameter_Init aParameters[1];
227 OUString sParamName0(
"aType");
228 OUString sParamType0(
"type");
229 aParameters[0].pParamName = sParamName0.pData;
230 aParameters[0].eTypeClass = typelib_TypeClass_TYPE;
231 aParameters[0].pTypeName = sParamType0.pData;
232 aParameters[0].bIn =
true;
233 aParameters[0].bOut =
false;
234 rtl_uString * pExceptions[1];
235 OUString sExceptionName0(
"com.sun.star.uno.RuntimeException");
236 pExceptions[0] = sExceptionName0.pData;
237 OUString sReturnType0(
"any");
239 &pMethod, 0,
false, sMethodName0.pData,
240 typelib_TypeClass_ANY, sReturnType0.pData,
241 1, aParameters, 1, pExceptions );
244 OUString sReturnType1(
"void");
246 &pMethod, 1,
true, sMethodName1.pData,
247 typelib_TypeClass_VOID, sReturnType1.pData, 0,
nullptr, 0,
nullptr );
251 &pMethod, 2,
true, sMethodName2.pData,
252 typelib_TypeClass_VOID, sReturnType1.pData,
253 0,
nullptr, 0,
nullptr );
261 OUString aTypeName( OUString::createFromAscii( s_aTypeNames[eTypeClass] ) );
264 ++s_aTypes[eTypeClass]->nStaticRefCount;
269 return &s_aTypes[eTypeClass];
273 typelib_TypeDescriptionReference ** ppRef,
274 typelib_TypeClass eTypeClass,
const char * pTypeName )
279 MutexGuard aGuard( typelib_StaticInitMutex() );
282 OUString aTypeName( OUString::createFromAscii( pTypeName ) );
285 assert(*ppRef &&
"coverity[var_deref_op] - shouldn't be possible");
286 ++((*ppRef)->nStaticRefCount);
292 typelib_TypeDescriptionReference ** ppRef,
293 typelib_TypeDescriptionReference * pElementType )
299 MutexGuard aGuard( typelib_StaticInitMutex() );
303 OUString aTypeName =
"[]" + OUString::unacquired(&pElementType->pTypeName);
305 static_assert( ! TYPELIB_TYPEDESCRIPTIONREFERENCE_ISREALLYWEAK(typelib_TypeClass_SEQUENCE) );
311 &pReg, typelib_TypeClass_SEQUENCE,
312 aTypeName.pData, pElementType, 0,
nullptr );
315 *ppRef =
reinterpret_cast<typelib_TypeDescriptionReference *
>(pReg);
316 assert( *ppRef == pReg->pWeakRef );
319 ++((*ppRef)->nStaticRefCount);
326 typelib_TypeDescriptionReference ** ppRef,
327 typelib_TypeClass eTypeClass,
const char * pTypeName,
328 typelib_TypeDescriptionReference * pBaseType,
329 sal_Int32 nMembers, typelib_TypeDescriptionReference ** ppMembers,
330 sal_Bool const * pParameterizedTypes)
332 assert( eTypeClass == typelib_TypeClass_STRUCT || eTypeClass == typelib_TypeClass_EXCEPTION );
337 MutexGuard aGuard( typelib_StaticInitMutex() );
341 assert( ! TYPELIB_TYPEDESCRIPTIONREFERENCE_ISREALLYWEAK(eTypeClass) );
342 OUString aTypeName( OUString::createFromAscii( pTypeName ) );
346 typelib_CompoundTypeDescription * pComp =
nullptr;
350 sal_Int32 nOffset = 0;
355 assert( pComp->pBaseTypeDescription );
356 nOffset = pComp->pBaseTypeDescription->aBase.nSize;
357 assert(
newAlignedSize( 0, pComp->pBaseTypeDescription->aBase.nSize, pComp->pBaseTypeDescription->aBase.nAlignment ) == pComp->pBaseTypeDescription->aBase.nSize );
362 pComp->nMembers = nMembers;
363 pComp->pMemberOffsets =
new sal_Int32[ nMembers ];
364 pComp->ppTypeRefs =
new typelib_TypeDescriptionReference *[ nMembers ];
365 if (pParameterizedTypes !=
nullptr) {
366 reinterpret_cast< typelib_StructTypeDescription *
>(
367 pComp)->pParameterizedTypes
370 for ( sal_Int32 i = 0 ;
i < nMembers; ++
i )
372 pComp->ppTypeRefs[
i] = ppMembers[
i];
374 pComp->ppTypeRefs[i] );
377 TYPELIB_DANGER_GET( &pTD, pComp->ppTypeRefs[i] );
378 assert( pTD->nSize );
380 pComp->pMemberOffsets[
i] = nOffset - pTD->nSize;
381 TYPELIB_DANGER_RELEASE( pTD );
383 if (pParameterizedTypes !=
nullptr) {
384 reinterpret_cast< typelib_StructTypeDescription *
>(
385 pComp)->pParameterizedTypes[i]
386 = pParameterizedTypes[i];
392 pReg->pWeakRef =
reinterpret_cast<typelib_TypeDescriptionReference *
>(pReg);
396 pReg->bComplete =
false;
399 *ppRef =
reinterpret_cast<typelib_TypeDescriptionReference *
>(pReg);
400 assert( *ppRef == pReg->pWeakRef );
403 ++((*ppRef)->nStaticRefCount);
409 typelib_TypeDescriptionReference ** ppRef,
410 typelib_TypeClass eTypeClass,
const char * pTypeName,
411 typelib_TypeDescriptionReference * pBaseType,
412 sal_Int32 nMembers, typelib_TypeDescriptionReference ** ppMembers )
415 init(ppRef, eTypeClass, pTypeName, pBaseType, nMembers, ppMembers,
nullptr);
419 typelib_TypeDescriptionReference ** ppRef,
const char * pTypeName,
420 typelib_TypeDescriptionReference * pBaseType,
421 sal_Int32 nMembers, typelib_TypeDescriptionReference ** ppMembers,
422 sal_Bool const * pParameterizedTypes )
426 ppRef, typelib_TypeClass_STRUCT, pTypeName, pBaseType, nMembers,
427 ppMembers, pParameterizedTypes);
431 typelib_TypeDescriptionReference ** ppRef,
432 const char * pTypeName,
433 typelib_TypeDescriptionReference * pBaseType )
438 ppRef, pTypeName, pBaseType ==
nullptr ? 0 : 1, &pBaseType);
442 typelib_TypeDescriptionReference ** ppRef,
443 const char * pTypeName,
444 sal_Int32 nBaseTypes,
445 typelib_TypeDescriptionReference ** ppBaseTypes )
451 MutexGuard aGuard( typelib_StaticInitMutex() );
455 static_assert( ! TYPELIB_TYPEDESCRIPTIONREFERENCE_ISREALLYWEAK(typelib_TypeClass_INTERFACE) );
456 OUString aTypeName( OUString::createFromAscii( pTypeName ) );
460 typelib_InterfaceTypeDescription * pIface =
nullptr;
464 pIface->nBaseTypes = std::max< sal_Int32 >(nBaseTypes, 1);
465 pIface->ppBaseTypes =
new typelib_InterfaceTypeDescription *[
469 for (sal_Int32
i = 0;
i < nBaseTypes; ++
i) {
470 pIface->ppBaseTypes[
i] =
nullptr;
473 assert( pIface->ppBaseTypes[
i] );
478 pIface->ppBaseTypes[0] =
nullptr;
482 assert( pIface->ppBaseTypes[0] );
484 pIface->pBaseTypeDescription = pIface->ppBaseTypes[0];
486 &pIface->pBaseTypeDescription->aBase);
489 pReg->pWeakRef =
reinterpret_cast<typelib_TypeDescriptionReference *
>(pReg);
494 pReg->bComplete =
false;
497 *ppRef =
reinterpret_cast<typelib_TypeDescriptionReference *
>(pReg);
498 assert( *ppRef == pReg->pWeakRef );
501 ++((*ppRef)->nStaticRefCount);
506 typelib_TypeDescriptionReference ** ppRef,
507 const char * pTypeName,
508 sal_Int32 nDefaultValue )
514 MutexGuard aGuard( typelib_StaticInitMutex() );
518 static_assert( ! TYPELIB_TYPEDESCRIPTIONREFERENCE_ISREALLYWEAK(typelib_TypeClass_ENUM) );
519 OUString aTypeName( OUString::createFromAscii( pTypeName ) );
525 &pReg, typelib_TypeClass_ENUM, aTypeName.pData );
526 typelib_EnumTypeDescription * pEnum =
reinterpret_cast<typelib_EnumTypeDescription *
>(pReg);
528 pEnum->nDefaultEnumValue = nDefaultValue;
530 pReg->pWeakRef =
reinterpret_cast<typelib_TypeDescriptionReference *
>(pReg);
534 pReg->bComplete =
false;
537 *ppRef =
reinterpret_cast<typelib_TypeDescriptionReference *
>(pReg);
538 assert( *ppRef == pReg->pWeakRef );
541 ++((*ppRef)->nStaticRefCount);
FILE * init(int, char **)
struct _typelib_TypeDescription typelib_TypeDescription
static typelib_TypeDescriptionReference * igetTypeByName(rtl_uString const *pTypeName)
void SAL_CALL typelib_static_enum_type_init(typelib_TypeDescriptionReference **ppRef, const char *pTypeName, sal_Int32 nDefaultValue) SAL_THROW_EXTERN_C()
void SAL_CALL typelib_static_type_init(typelib_TypeDescriptionReference **ppRef, typelib_TypeClass eTypeClass, const char *pTypeName) SAL_THROW_EXTERN_C()
const sal_Int32 nMaxAlignment
void SAL_CALL typelib_static_interface_type_init(typelib_TypeDescriptionReference **ppRef, const char *pTypeName, typelib_TypeDescriptionReference *pBaseType) SAL_THROW_EXTERN_C()
void SAL_CALL typelib_static_struct_type_init(typelib_TypeDescriptionReference **ppRef, const char *pTypeName, typelib_TypeDescriptionReference *pBaseType, sal_Int32 nMembers, typelib_TypeDescriptionReference **ppMembers, sal_Bool const *pParameterizedTypes) SAL_THROW_EXTERN_C()
void SAL_CALL typelib_static_compound_type_init(typelib_TypeDescriptionReference **ppRef, typelib_TypeClass eTypeClass, const char *pTypeName, typelib_TypeDescriptionReference *pBaseType, sal_Int32 nMembers, typelib_TypeDescriptionReference **ppMembers) SAL_THROW_EXTERN_C()
void SAL_CALL typelib_static_sequence_type_init(typelib_TypeDescriptionReference **ppRef, typelib_TypeDescriptionReference *pElementType) SAL_THROW_EXTERN_C()
static sal_Int32 adjustAlignment(sal_Int32 nRequestedAlignment)
static sal_Int32 newAlignedSize(sal_Int32 OldSize, sal_Int32 ElementSize, sal_Int32 NeededAlignment)
Calculate the new size of the struktur.
void SAL_CALL typelib_static_mi_interface_type_init(typelib_TypeDescriptionReference **ppRef, const char *pTypeName, sal_Int32 nBaseTypes, typelib_TypeDescriptionReference **ppBaseTypes) SAL_THROW_EXTERN_C()
typelib_TypeDescriptionReference **SAL_CALL typelib_static_type_getByTypeClass(typelib_TypeClass eTypeClass) SAL_THROW_EXTERN_C()
void SAL_CALL typelib_typedescriptionreference_new(typelib_TypeDescriptionReference **ppTDR, typelib_TypeClass eTypeClass, rtl_uString *pTypeName) SAL_THROW_EXTERN_C()
void SAL_CALL typelib_typedescription_register(typelib_TypeDescription **ppNewDescription) SAL_THROW_EXTERN_C()
void SAL_CALL typelib_typedescriptionreference_acquire(typelib_TypeDescriptionReference *pRef) SAL_THROW_EXTERN_C()
void SAL_CALL typelib_typedescription_newInterface(typelib_InterfaceTypeDescription **ppRet, rtl_uString *pTypeName, SAL_UNUSED_PARAMETER sal_uInt32, SAL_UNUSED_PARAMETER sal_uInt16, SAL_UNUSED_PARAMETER sal_uInt16, SAL_UNUSED_PARAMETER sal_uInt32, SAL_UNUSED_PARAMETER sal_uInt32, typelib_TypeDescriptionReference *pBaseInterface, sal_Int32 nMembers, typelib_TypeDescriptionReference **ppMembers) SAL_THROW_EXTERN_C()
void typelib_typedescription_newEmpty(typelib_TypeDescription **ppRet, typelib_TypeClass eTypeClass, rtl_uString *pTypeName) SAL_THROW_EXTERN_C()
void SAL_CALL typelib_typedescription_release(typelib_TypeDescription *pTD) SAL_THROW_EXTERN_C()
void SAL_CALL typelib_typedescriptionreference_getDescription(typelib_TypeDescription **ppRet, typelib_TypeDescriptionReference *pRef) SAL_THROW_EXTERN_C()
void SAL_CALL typelib_typedescription_acquire(typelib_TypeDescription *pTypeDescription) SAL_THROW_EXTERN_C()
void SAL_CALL typelib_typedescriptionreference_release(typelib_TypeDescriptionReference *pRef) SAL_THROW_EXTERN_C()
void SAL_CALL typelib_typedescription_new(typelib_TypeDescription **ppRet, typelib_TypeClass eTypeClass, rtl_uString *pTypeName, typelib_TypeDescriptionReference *pType, sal_Int32 nMembers, typelib_CompoundMember_Init *pMembers) SAL_THROW_EXTERN_C()
void typelib_typedescriptionreference_getByName(typelib_TypeDescriptionReference **ppRet, rtl_uString const *pName) SAL_THROW_EXTERN_C()
sal_Int32 typelib_typedescription_getAlignedUnoSize(const typelib_TypeDescription *pTypeDescription, sal_Int32 nOffset, sal_Int32 &rMaxIntegralTypeSize) SAL_THROW_EXTERN_C()
void SAL_CALL typelib_typedescription_newInterfaceMethod(typelib_InterfaceMethodTypeDescription **ppRet, sal_Int32 nAbsolutePosition, sal_Bool bOneWay, rtl_uString *pTypeName, typelib_TypeClass eReturnTypeClass, rtl_uString *pReturnTypeName, sal_Int32 nParams, typelib_Parameter_Init *pParams, sal_Int32 nExceptions, rtl_uString **ppExceptionNames) SAL_THROW_EXTERN_C()
#define SAL_THROW_EXTERN_C()