xref: /aoo4110/main/cppuhelper/source/tdmgr.cxx (revision b1cdbd2c)
1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_cppuhelper.hxx"
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski #include "sal/config.h"
28*b1cdbd2cSJim Jagielski 
29*b1cdbd2cSJim Jagielski #include <vector>
30*b1cdbd2cSJim Jagielski 
31*b1cdbd2cSJim Jagielski #include <sal/alloca.h>
32*b1cdbd2cSJim Jagielski 
33*b1cdbd2cSJim Jagielski #include <osl/diagnose.h>
34*b1cdbd2cSJim Jagielski #include <rtl/alloc.h>
35*b1cdbd2cSJim Jagielski #include <rtl/ustring.hxx>
36*b1cdbd2cSJim Jagielski 
37*b1cdbd2cSJim Jagielski #include <uno/mapping.hxx>
38*b1cdbd2cSJim Jagielski 
39*b1cdbd2cSJim Jagielski #include <cppuhelper/bootstrap.hxx>
40*b1cdbd2cSJim Jagielski #include <cppuhelper/implbase1.hxx>
41*b1cdbd2cSJim Jagielski #include <typelib/typedescription.h>
42*b1cdbd2cSJim Jagielski 
43*b1cdbd2cSJim Jagielski #include <com/sun/star/lang/XComponent.hpp>
44*b1cdbd2cSJim Jagielski #include <com/sun/star/container/XHierarchicalNameAccess.hpp>
45*b1cdbd2cSJim Jagielski #include <com/sun/star/reflection/XTypeDescription.hpp>
46*b1cdbd2cSJim Jagielski #include <com/sun/star/reflection/XEnumTypeDescription.hpp>
47*b1cdbd2cSJim Jagielski #include <com/sun/star/reflection/XIndirectTypeDescription.hpp>
48*b1cdbd2cSJim Jagielski #include <com/sun/star/reflection/XInterfaceMemberTypeDescription.hpp>
49*b1cdbd2cSJim Jagielski #include <com/sun/star/reflection/XInterfaceAttributeTypeDescription2.hpp>
50*b1cdbd2cSJim Jagielski #include <com/sun/star/reflection/XMethodParameter.hpp>
51*b1cdbd2cSJim Jagielski #include <com/sun/star/reflection/XInterfaceMethodTypeDescription.hpp>
52*b1cdbd2cSJim Jagielski #include <com/sun/star/reflection/XInterfaceTypeDescription2.hpp>
53*b1cdbd2cSJim Jagielski #include <com/sun/star/reflection/XCompoundTypeDescription.hpp>
54*b1cdbd2cSJim Jagielski #include <com/sun/star/reflection/XStructTypeDescription.hpp>
55*b1cdbd2cSJim Jagielski #include <com/sun/star/reflection/XUnionTypeDescription.hpp>
56*b1cdbd2cSJim Jagielski #include "com/sun/star/uno/RuntimeException.hpp"
57*b1cdbd2cSJim Jagielski 
58*b1cdbd2cSJim Jagielski #include "boost/scoped_array.hpp"
59*b1cdbd2cSJim Jagielski 
60*b1cdbd2cSJim Jagielski using namespace ::rtl;
61*b1cdbd2cSJim Jagielski using namespace ::com::sun::star;
62*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::uno;
63*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::reflection;
64*b1cdbd2cSJim Jagielski 
65*b1cdbd2cSJim Jagielski 
66*b1cdbd2cSJim Jagielski namespace cppu
67*b1cdbd2cSJim Jagielski {
68*b1cdbd2cSJim Jagielski 
69*b1cdbd2cSJim Jagielski static typelib_TypeDescription * createCTD(
70*b1cdbd2cSJim Jagielski     Reference< container::XHierarchicalNameAccess > const & access,
71*b1cdbd2cSJim Jagielski     const Reference< XTypeDescription > & xType );
72*b1cdbd2cSJim Jagielski 
73*b1cdbd2cSJim Jagielski //==================================================================================================
coerceToInt64(const Any & rVal)74*b1cdbd2cSJim Jagielski inline static sal_Int64 coerceToInt64( const Any & rVal )
75*b1cdbd2cSJim Jagielski {
76*b1cdbd2cSJim Jagielski 	switch (rVal.getValueTypeClass())
77*b1cdbd2cSJim Jagielski 	{
78*b1cdbd2cSJim Jagielski 	case TypeClass_CHAR:
79*b1cdbd2cSJim Jagielski 		return *(sal_Unicode *)rVal.getValue();
80*b1cdbd2cSJim Jagielski 	case TypeClass_BOOLEAN:
81*b1cdbd2cSJim Jagielski 		return (*(sal_Bool *)rVal.getValue() ? 1 : 0);
82*b1cdbd2cSJim Jagielski 	case TypeClass_BYTE:
83*b1cdbd2cSJim Jagielski 		return *(sal_Int8 *)rVal.getValue();
84*b1cdbd2cSJim Jagielski 	case TypeClass_SHORT:
85*b1cdbd2cSJim Jagielski 		return *(sal_Int16 *)rVal.getValue();
86*b1cdbd2cSJim Jagielski 	case TypeClass_UNSIGNED_SHORT:
87*b1cdbd2cSJim Jagielski 		return *(sal_uInt16 *)rVal.getValue();
88*b1cdbd2cSJim Jagielski 	case TypeClass_LONG:
89*b1cdbd2cSJim Jagielski 		return *(sal_Int32 *)rVal.getValue();
90*b1cdbd2cSJim Jagielski 	case TypeClass_UNSIGNED_LONG:
91*b1cdbd2cSJim Jagielski 		return *(sal_uInt32 *)rVal.getValue();
92*b1cdbd2cSJim Jagielski 	case TypeClass_HYPER:
93*b1cdbd2cSJim Jagielski 		return *(sal_Int64 *)rVal.getValue();
94*b1cdbd2cSJim Jagielski 	case TypeClass_UNSIGNED_HYPER:
95*b1cdbd2cSJim Jagielski 		return *(sal_uInt64 *)rVal.getValue();
96*b1cdbd2cSJim Jagielski 	case TypeClass_ENUM:
97*b1cdbd2cSJim Jagielski 		return *(int *)rVal.getValue();
98*b1cdbd2cSJim Jagielski     default:
99*b1cdbd2cSJim Jagielski         OSL_ASSERT(false);
100*b1cdbd2cSJim Jagielski         return 0;
101*b1cdbd2cSJim Jagielski 	}
102*b1cdbd2cSJim Jagielski }
103*b1cdbd2cSJim Jagielski //==================================================================================================
createCTD(const Reference<XUnionTypeDescription> & xType)104*b1cdbd2cSJim Jagielski inline static typelib_TypeDescription * createCTD(
105*b1cdbd2cSJim Jagielski 	const Reference< XUnionTypeDescription > & xType )
106*b1cdbd2cSJim Jagielski {
107*b1cdbd2cSJim Jagielski 	typelib_TypeDescription * pRet = 0;
108*b1cdbd2cSJim Jagielski 	if (xType.is())
109*b1cdbd2cSJim Jagielski 	{
110*b1cdbd2cSJim Jagielski 		OUString aTypeName( xType->getName() );
111*b1cdbd2cSJim Jagielski 
112*b1cdbd2cSJim Jagielski 		// discriminant type
113*b1cdbd2cSJim Jagielski 		Reference< XTypeDescription > xDiscrTD( xType->getDiscriminantType() );
114*b1cdbd2cSJim Jagielski 		OUString aDiscrTypeName( xDiscrTD->getName() );
115*b1cdbd2cSJim Jagielski 		typelib_TypeDescriptionReference * pDiscrTypeRef = 0;
116*b1cdbd2cSJim Jagielski 		typelib_typedescriptionreference_new( &pDiscrTypeRef,
117*b1cdbd2cSJim Jagielski 											  (typelib_TypeClass)xDiscrTD->getTypeClass(),
118*b1cdbd2cSJim Jagielski 											  aDiscrTypeName.pData );
119*b1cdbd2cSJim Jagielski 		// default member type
120*b1cdbd2cSJim Jagielski 		Reference< XTypeDescription > xDefaultMemberTD( xType->getDefaultMemberType() );
121*b1cdbd2cSJim Jagielski 		OUString aDefMemberTypeName( xDefaultMemberTD->getName() );
122*b1cdbd2cSJim Jagielski 		typelib_TypeDescriptionReference * pDefMemberTypeRef = 0;
123*b1cdbd2cSJim Jagielski 		typelib_typedescriptionreference_new( &pDefMemberTypeRef,
124*b1cdbd2cSJim Jagielski 											  (typelib_TypeClass)xDefaultMemberTD->getTypeClass(),
125*b1cdbd2cSJim Jagielski 											  aDefMemberTypeName.pData );
126*b1cdbd2cSJim Jagielski 		// init array
127*b1cdbd2cSJim Jagielski 		Sequence< Any > aDiscriminants( xType->getDiscriminants() );
128*b1cdbd2cSJim Jagielski 		Sequence< Reference< XTypeDescription > > aMemberTypes( xType->getMemberTypes() );
129*b1cdbd2cSJim Jagielski 		Sequence< OUString > aMemberNames( xType->getMemberNames() );
130*b1cdbd2cSJim Jagielski 		sal_Int32 nMembers = aDiscriminants.getLength();
131*b1cdbd2cSJim Jagielski 		OSL_ASSERT( nMembers == aMemberNames.getLength() && nMembers == aMemberTypes.getLength() );
132*b1cdbd2cSJim Jagielski 
133*b1cdbd2cSJim Jagielski 		const Any * pDiscriminants							= aDiscriminants.getConstArray();
134*b1cdbd2cSJim Jagielski 		const Reference< XTypeDescription > * pMemberTypes	= aMemberTypes.getConstArray();
135*b1cdbd2cSJim Jagielski 		const OUString * pMemberNames						= aMemberNames.getConstArray();
136*b1cdbd2cSJim Jagielski 
137*b1cdbd2cSJim Jagielski 		typelib_Union_Init * pMembers = (typelib_Union_Init *)alloca( nMembers * sizeof(typelib_Union_Init) );
138*b1cdbd2cSJim Jagielski 
139*b1cdbd2cSJim Jagielski 		sal_Int32 nPos;
140*b1cdbd2cSJim Jagielski 		for ( nPos = nMembers; nPos--; )
141*b1cdbd2cSJim Jagielski 		{
142*b1cdbd2cSJim Jagielski 			typelib_Union_Init & rEntry = pMembers[nPos];
143*b1cdbd2cSJim Jagielski 			// member discriminant
144*b1cdbd2cSJim Jagielski 			rEntry.nDiscriminant = coerceToInt64( pDiscriminants[nPos] );
145*b1cdbd2cSJim Jagielski 			// member type
146*b1cdbd2cSJim Jagielski 			OUString aMemberTypeName( pMemberTypes[nPos]->getName() );
147*b1cdbd2cSJim Jagielski 			rEntry.pTypeRef = 0;
148*b1cdbd2cSJim Jagielski 			typelib_typedescriptionreference_new( &rEntry.pTypeRef,
149*b1cdbd2cSJim Jagielski 												  (typelib_TypeClass)pMemberTypes[nPos]->getTypeClass(),
150*b1cdbd2cSJim Jagielski 												  aMemberTypeName.pData );
151*b1cdbd2cSJim Jagielski 			// member name
152*b1cdbd2cSJim Jagielski 			rEntry.pMemberName = pMemberNames[nPos].pData;
153*b1cdbd2cSJim Jagielski 		}
154*b1cdbd2cSJim Jagielski 
155*b1cdbd2cSJim Jagielski 		typelib_typedescription_newUnion( &pRet, aTypeName.pData,
156*b1cdbd2cSJim Jagielski 										  pDiscrTypeRef,
157*b1cdbd2cSJim Jagielski 										  coerceToInt64( xType->getDefaultDiscriminant() ),
158*b1cdbd2cSJim Jagielski 										  pDefMemberTypeRef,
159*b1cdbd2cSJim Jagielski 										  nMembers, pMembers );
160*b1cdbd2cSJim Jagielski 
161*b1cdbd2cSJim Jagielski 		for ( nPos = nMembers; nPos--; )
162*b1cdbd2cSJim Jagielski 		{
163*b1cdbd2cSJim Jagielski 			typelib_typedescriptionreference_release( pMembers[nPos].pTypeRef );
164*b1cdbd2cSJim Jagielski 		}
165*b1cdbd2cSJim Jagielski 
166*b1cdbd2cSJim Jagielski 		typelib_typedescriptionreference_release( pDiscrTypeRef );
167*b1cdbd2cSJim Jagielski 		typelib_typedescriptionreference_release( pDefMemberTypeRef );
168*b1cdbd2cSJim Jagielski 	}
169*b1cdbd2cSJim Jagielski 	return pRet;
170*b1cdbd2cSJim Jagielski }
171*b1cdbd2cSJim Jagielski //==================================================================================================
createCTD(const Reference<XCompoundTypeDescription> & xType)172*b1cdbd2cSJim Jagielski inline static typelib_TypeDescription * createCTD(
173*b1cdbd2cSJim Jagielski 	const Reference< XCompoundTypeDescription > & xType )
174*b1cdbd2cSJim Jagielski {
175*b1cdbd2cSJim Jagielski 	typelib_TypeDescription * pRet = 0;
176*b1cdbd2cSJim Jagielski 	if (xType.is())
177*b1cdbd2cSJim Jagielski 	{
178*b1cdbd2cSJim Jagielski 		typelib_TypeDescription * pBaseType = createCTD(
179*b1cdbd2cSJim Jagielski 			Reference< XCompoundTypeDescription >::query( xType->getBaseType() ) );
180*b1cdbd2cSJim Jagielski 		if (pBaseType)
181*b1cdbd2cSJim Jagielski 			typelib_typedescription_register( &pBaseType );
182*b1cdbd2cSJim Jagielski 
183*b1cdbd2cSJim Jagielski 		// construct member init array
184*b1cdbd2cSJim Jagielski 		const Sequence<Reference< XTypeDescription > > & rMemberTypes = xType->getMemberTypes();
185*b1cdbd2cSJim Jagielski 		const Sequence< OUString > & rMemberNames					  = xType->getMemberNames();
186*b1cdbd2cSJim Jagielski 
187*b1cdbd2cSJim Jagielski 		const Reference< XTypeDescription > * pMemberTypes = rMemberTypes.getConstArray();
188*b1cdbd2cSJim Jagielski 		const OUString * pMemberNames					   = rMemberNames.getConstArray();
189*b1cdbd2cSJim Jagielski 
190*b1cdbd2cSJim Jagielski 		sal_Int32 nMembers = rMemberTypes.getLength();
191*b1cdbd2cSJim Jagielski 		OSL_ENSURE( nMembers == rMemberNames.getLength(), "### lens differ!" );
192*b1cdbd2cSJim Jagielski 
193*b1cdbd2cSJim Jagielski 		OUString aTypeName( xType->getName() );
194*b1cdbd2cSJim Jagielski 
195*b1cdbd2cSJim Jagielski 		typelib_CompoundMember_Init * pMemberInits = (typelib_CompoundMember_Init *)alloca(
196*b1cdbd2cSJim Jagielski 			sizeof(typelib_CompoundMember_Init) * nMembers );
197*b1cdbd2cSJim Jagielski 
198*b1cdbd2cSJim Jagielski 		sal_Int32 nPos;
199*b1cdbd2cSJim Jagielski 		for ( nPos = nMembers; nPos--; )
200*b1cdbd2cSJim Jagielski 		{
201*b1cdbd2cSJim Jagielski 			typelib_CompoundMember_Init & rInit = pMemberInits[nPos];
202*b1cdbd2cSJim Jagielski 			rInit.eTypeClass = (typelib_TypeClass)pMemberTypes[nPos]->getTypeClass();
203*b1cdbd2cSJim Jagielski 
204*b1cdbd2cSJim Jagielski 			OUString aMemberTypeName( pMemberTypes[nPos]->getName() );
205*b1cdbd2cSJim Jagielski 			rtl_uString_acquire( rInit.pTypeName = aMemberTypeName.pData );
206*b1cdbd2cSJim Jagielski 
207*b1cdbd2cSJim Jagielski 			// string is held by rMemberNames
208*b1cdbd2cSJim Jagielski 			rInit.pMemberName = pMemberNames[nPos].pData;
209*b1cdbd2cSJim Jagielski 		}
210*b1cdbd2cSJim Jagielski 
211*b1cdbd2cSJim Jagielski 		typelib_typedescription_new(
212*b1cdbd2cSJim Jagielski 			&pRet,
213*b1cdbd2cSJim Jagielski 			(typelib_TypeClass)xType->getTypeClass(),
214*b1cdbd2cSJim Jagielski 			aTypeName.pData,
215*b1cdbd2cSJim Jagielski 			(pBaseType ? pBaseType->pWeakRef : 0),
216*b1cdbd2cSJim Jagielski 			nMembers, pMemberInits );
217*b1cdbd2cSJim Jagielski 
218*b1cdbd2cSJim Jagielski 		// cleanup
219*b1cdbd2cSJim Jagielski 		for ( nPos = nMembers; nPos--; )
220*b1cdbd2cSJim Jagielski 		{
221*b1cdbd2cSJim Jagielski 			rtl_uString_release( pMemberInits[nPos].pTypeName );
222*b1cdbd2cSJim Jagielski 		}
223*b1cdbd2cSJim Jagielski 		if (pBaseType)
224*b1cdbd2cSJim Jagielski 			typelib_typedescription_release( pBaseType );
225*b1cdbd2cSJim Jagielski 	}
226*b1cdbd2cSJim Jagielski 	return pRet;
227*b1cdbd2cSJim Jagielski }
228*b1cdbd2cSJim Jagielski //==================================================================================================
createCTD(Reference<container::XHierarchicalNameAccess> const & access,const Reference<XStructTypeDescription> & xType)229*b1cdbd2cSJim Jagielski inline static typelib_TypeDescription * createCTD(
230*b1cdbd2cSJim Jagielski     Reference< container::XHierarchicalNameAccess > const & access,
231*b1cdbd2cSJim Jagielski 	const Reference< XStructTypeDescription > & xType )
232*b1cdbd2cSJim Jagielski {
233*b1cdbd2cSJim Jagielski 	typelib_TypeDescription * pRet = 0;
234*b1cdbd2cSJim Jagielski 	if (xType.is() && xType->getTypeParameters().getLength() == 0)
235*b1cdbd2cSJim Jagielski 	{
236*b1cdbd2cSJim Jagielski 		typelib_TypeDescription * pBaseType = createCTD(
237*b1cdbd2cSJim Jagielski             access, xType->getBaseType() );
238*b1cdbd2cSJim Jagielski 		if (pBaseType)
239*b1cdbd2cSJim Jagielski 			typelib_typedescription_register( &pBaseType );
240*b1cdbd2cSJim Jagielski 
241*b1cdbd2cSJim Jagielski 		// construct member init array
242*b1cdbd2cSJim Jagielski 		const Sequence<Reference< XTypeDescription > > & rMemberTypes = xType->getMemberTypes();
243*b1cdbd2cSJim Jagielski 		const Sequence< OUString > & rMemberNames					  = xType->getMemberNames();
244*b1cdbd2cSJim Jagielski 
245*b1cdbd2cSJim Jagielski 		const Reference< XTypeDescription > * pMemberTypes = rMemberTypes.getConstArray();
246*b1cdbd2cSJim Jagielski 		const OUString * pMemberNames					   = rMemberNames.getConstArray();
247*b1cdbd2cSJim Jagielski 
248*b1cdbd2cSJim Jagielski 		sal_Int32 nMembers = rMemberTypes.getLength();
249*b1cdbd2cSJim Jagielski 		OSL_ENSURE( nMembers == rMemberNames.getLength(), "### lens differ!" );
250*b1cdbd2cSJim Jagielski 
251*b1cdbd2cSJim Jagielski 		OUString aTypeName( xType->getName() );
252*b1cdbd2cSJim Jagielski 
253*b1cdbd2cSJim Jagielski 		typelib_StructMember_Init * pMemberInits = (typelib_StructMember_Init *)alloca(
254*b1cdbd2cSJim Jagielski 			sizeof(typelib_StructMember_Init) * nMembers );
255*b1cdbd2cSJim Jagielski 
256*b1cdbd2cSJim Jagielski         Sequence< Reference< XTypeDescription > > templateMemberTypes;
257*b1cdbd2cSJim Jagielski         sal_Int32 i = aTypeName.indexOf('<');
258*b1cdbd2cSJim Jagielski         if (i >= 0) {
259*b1cdbd2cSJim Jagielski             Reference< XStructTypeDescription > templateDesc(
260*b1cdbd2cSJim Jagielski                 access->getByHierarchicalName(aTypeName.copy(0, i)),
261*b1cdbd2cSJim Jagielski                 UNO_QUERY_THROW);
262*b1cdbd2cSJim Jagielski             OSL_ASSERT(
263*b1cdbd2cSJim Jagielski                 templateDesc->getTypeParameters().getLength()
264*b1cdbd2cSJim Jagielski                 == xType->getTypeArguments().getLength());
265*b1cdbd2cSJim Jagielski             templateMemberTypes = templateDesc->getMemberTypes();
266*b1cdbd2cSJim Jagielski             OSL_ASSERT(templateMemberTypes.getLength() == nMembers);
267*b1cdbd2cSJim Jagielski         }
268*b1cdbd2cSJim Jagielski 
269*b1cdbd2cSJim Jagielski 		sal_Int32 nPos;
270*b1cdbd2cSJim Jagielski 		for ( nPos = nMembers; nPos--; )
271*b1cdbd2cSJim Jagielski 		{
272*b1cdbd2cSJim Jagielski 			typelib_StructMember_Init & rInit = pMemberInits[nPos];
273*b1cdbd2cSJim Jagielski 			rInit.aBase.eTypeClass
274*b1cdbd2cSJim Jagielski                 = (typelib_TypeClass)pMemberTypes[nPos]->getTypeClass();
275*b1cdbd2cSJim Jagielski 
276*b1cdbd2cSJim Jagielski 			OUString aMemberTypeName( pMemberTypes[nPos]->getName() );
277*b1cdbd2cSJim Jagielski 			rtl_uString_acquire(
278*b1cdbd2cSJim Jagielski                 rInit.aBase.pTypeName = aMemberTypeName.pData );
279*b1cdbd2cSJim Jagielski 
280*b1cdbd2cSJim Jagielski 			// string is held by rMemberNames
281*b1cdbd2cSJim Jagielski 			rInit.aBase.pMemberName = pMemberNames[nPos].pData;
282*b1cdbd2cSJim Jagielski 
283*b1cdbd2cSJim Jagielski             rInit.bParameterizedType = templateMemberTypes.getLength() != 0
284*b1cdbd2cSJim Jagielski                 && (templateMemberTypes[nPos]->getTypeClass()
285*b1cdbd2cSJim Jagielski                     == TypeClass_UNKNOWN);
286*b1cdbd2cSJim Jagielski 		}
287*b1cdbd2cSJim Jagielski 
288*b1cdbd2cSJim Jagielski 		typelib_typedescription_newStruct(
289*b1cdbd2cSJim Jagielski 			&pRet,
290*b1cdbd2cSJim Jagielski 			aTypeName.pData,
291*b1cdbd2cSJim Jagielski 			(pBaseType ? pBaseType->pWeakRef : 0),
292*b1cdbd2cSJim Jagielski 			nMembers, pMemberInits );
293*b1cdbd2cSJim Jagielski 
294*b1cdbd2cSJim Jagielski 		// cleanup
295*b1cdbd2cSJim Jagielski 		for ( nPos = nMembers; nPos--; )
296*b1cdbd2cSJim Jagielski 		{
297*b1cdbd2cSJim Jagielski 			rtl_uString_release( pMemberInits[nPos].aBase.pTypeName );
298*b1cdbd2cSJim Jagielski 		}
299*b1cdbd2cSJim Jagielski 		if (pBaseType)
300*b1cdbd2cSJim Jagielski 			typelib_typedescription_release( pBaseType );
301*b1cdbd2cSJim Jagielski 	}
302*b1cdbd2cSJim Jagielski 	return pRet;
303*b1cdbd2cSJim Jagielski }
304*b1cdbd2cSJim Jagielski //==================================================================================================
createCTD(const Reference<XInterfaceAttributeTypeDescription2> & xAttribute)305*b1cdbd2cSJim Jagielski inline static typelib_TypeDescription * createCTD(
306*b1cdbd2cSJim Jagielski 	const Reference< XInterfaceAttributeTypeDescription2 > & xAttribute )
307*b1cdbd2cSJim Jagielski {
308*b1cdbd2cSJim Jagielski 	typelib_TypeDescription * pRet = 0;
309*b1cdbd2cSJim Jagielski 	if (xAttribute.is())
310*b1cdbd2cSJim Jagielski 	{
311*b1cdbd2cSJim Jagielski 		OUString aMemberName( xAttribute->getName() );
312*b1cdbd2cSJim Jagielski 		Reference< XTypeDescription > xType( xAttribute->getType() );
313*b1cdbd2cSJim Jagielski 		OUString aMemberTypeName( xType->getName() );
314*b1cdbd2cSJim Jagielski         std::vector< rtl_uString * > getExc;
315*b1cdbd2cSJim Jagielski         Sequence< Reference< XCompoundTypeDescription > > getExcs(
316*b1cdbd2cSJim Jagielski             xAttribute->getGetExceptions() );
317*b1cdbd2cSJim Jagielski         for (sal_Int32 i = 0; i != getExcs.getLength(); ++i)
318*b1cdbd2cSJim Jagielski         {
319*b1cdbd2cSJim Jagielski             OSL_ASSERT( getExcs[i].is() );
320*b1cdbd2cSJim Jagielski             getExc.push_back( getExcs[i]->getName().pData );
321*b1cdbd2cSJim Jagielski         }
322*b1cdbd2cSJim Jagielski         std::vector< rtl_uString * > setExc;
323*b1cdbd2cSJim Jagielski         Sequence< Reference< XCompoundTypeDescription > > setExcs(
324*b1cdbd2cSJim Jagielski             xAttribute->getSetExceptions() );
325*b1cdbd2cSJim Jagielski         for (sal_Int32 i = 0; i != setExcs.getLength(); ++i)
326*b1cdbd2cSJim Jagielski         {
327*b1cdbd2cSJim Jagielski             OSL_ASSERT( setExcs[i].is() );
328*b1cdbd2cSJim Jagielski             setExc.push_back( setExcs[i]->getName().pData );
329*b1cdbd2cSJim Jagielski         }
330*b1cdbd2cSJim Jagielski 		typelib_typedescription_newExtendedInterfaceAttribute(
331*b1cdbd2cSJim Jagielski 			(typelib_InterfaceAttributeTypeDescription **)&pRet,
332*b1cdbd2cSJim Jagielski 			xAttribute->getPosition(),
333*b1cdbd2cSJim Jagielski 			aMemberName.pData, // name
334*b1cdbd2cSJim Jagielski 			(typelib_TypeClass)xType->getTypeClass(),
335*b1cdbd2cSJim Jagielski 			aMemberTypeName.pData, // type name
336*b1cdbd2cSJim Jagielski 			xAttribute->isReadOnly(),
337*b1cdbd2cSJim Jagielski             getExc.size(), getExc.empty() ? 0 : &getExc[0],
338*b1cdbd2cSJim Jagielski             setExc.size(), setExc.empty() ? 0 : &setExc[0] );
339*b1cdbd2cSJim Jagielski 	}
340*b1cdbd2cSJim Jagielski 	return pRet;
341*b1cdbd2cSJim Jagielski }
342*b1cdbd2cSJim Jagielski //==================================================================================================
createCTD(const Reference<XInterfaceMethodTypeDescription> & xMethod)343*b1cdbd2cSJim Jagielski static typelib_TypeDescription * createCTD(
344*b1cdbd2cSJim Jagielski 	const Reference< XInterfaceMethodTypeDescription > & xMethod )
345*b1cdbd2cSJim Jagielski {
346*b1cdbd2cSJim Jagielski 	typelib_TypeDescription * pRet = 0;
347*b1cdbd2cSJim Jagielski 	if (xMethod.is())
348*b1cdbd2cSJim Jagielski 	{
349*b1cdbd2cSJim Jagielski 		Reference< XTypeDescription > xReturnType( xMethod->getReturnType() );
350*b1cdbd2cSJim Jagielski 
351*b1cdbd2cSJim Jagielski 		// init all params
352*b1cdbd2cSJim Jagielski 		const Sequence<Reference< XMethodParameter > > & rParams = xMethod->getParameters();
353*b1cdbd2cSJim Jagielski 		const Reference< XMethodParameter > * pParams			 = rParams.getConstArray();
354*b1cdbd2cSJim Jagielski 		sal_Int32 nParams = rParams.getLength();
355*b1cdbd2cSJim Jagielski 
356*b1cdbd2cSJim Jagielski 		typelib_Parameter_Init * pParamInit = (typelib_Parameter_Init *)alloca(
357*b1cdbd2cSJim Jagielski 			sizeof(typelib_Parameter_Init) * nParams );
358*b1cdbd2cSJim Jagielski 
359*b1cdbd2cSJim Jagielski 		sal_Int32 nPos;
360*b1cdbd2cSJim Jagielski 		for ( nPos = nParams; nPos--; )
361*b1cdbd2cSJim Jagielski 		{
362*b1cdbd2cSJim Jagielski 			const Reference< XMethodParameter > & xParam = pParams[nPos];
363*b1cdbd2cSJim Jagielski 			const Reference< XTypeDescription > & xType	 = xParam->getType();
364*b1cdbd2cSJim Jagielski 			typelib_Parameter_Init & rInit = pParamInit[xParam->getPosition()];
365*b1cdbd2cSJim Jagielski 
366*b1cdbd2cSJim Jagielski 			rInit.eTypeClass = (typelib_TypeClass)xType->getTypeClass();
367*b1cdbd2cSJim Jagielski 			OUString aParamTypeName( xType->getName() );
368*b1cdbd2cSJim Jagielski 			rtl_uString_acquire( rInit.pTypeName = aParamTypeName.pData );
369*b1cdbd2cSJim Jagielski 			OUString aParamName( xParam->getName() );
370*b1cdbd2cSJim Jagielski 			rtl_uString_acquire( rInit.pParamName = aParamName.pData );
371*b1cdbd2cSJim Jagielski 			rInit.bIn  = xParam->isIn();
372*b1cdbd2cSJim Jagielski 			rInit.bOut = xParam->isOut();
373*b1cdbd2cSJim Jagielski 		}
374*b1cdbd2cSJim Jagielski 
375*b1cdbd2cSJim Jagielski 		// init all exception strings
376*b1cdbd2cSJim Jagielski 		const Sequence<Reference< XTypeDescription > > & rExceptions = xMethod->getExceptions();
377*b1cdbd2cSJim Jagielski 		const Reference< XTypeDescription > * pExceptions = rExceptions.getConstArray();
378*b1cdbd2cSJim Jagielski 		sal_Int32 nExceptions = rExceptions.getLength();
379*b1cdbd2cSJim Jagielski 		rtl_uString ** ppExceptionNames = (rtl_uString **)alloca(
380*b1cdbd2cSJim Jagielski 			sizeof(rtl_uString *) * nExceptions );
381*b1cdbd2cSJim Jagielski 
382*b1cdbd2cSJim Jagielski 		for ( nPos = nExceptions; nPos--; )
383*b1cdbd2cSJim Jagielski 		{
384*b1cdbd2cSJim Jagielski 			OUString aExceptionTypeName( pExceptions[nPos]->getName() );
385*b1cdbd2cSJim Jagielski 			rtl_uString_acquire( ppExceptionNames[nPos] = aExceptionTypeName.pData );
386*b1cdbd2cSJim Jagielski 		}
387*b1cdbd2cSJim Jagielski 
388*b1cdbd2cSJim Jagielski 		OUString aTypeName( xMethod->getName() );
389*b1cdbd2cSJim Jagielski 		OUString aReturnTypeName( xReturnType->getName() );
390*b1cdbd2cSJim Jagielski 
391*b1cdbd2cSJim Jagielski 		typelib_typedescription_newInterfaceMethod(
392*b1cdbd2cSJim Jagielski 			(typelib_InterfaceMethodTypeDescription **)&pRet,
393*b1cdbd2cSJim Jagielski 			xMethod->getPosition(),
394*b1cdbd2cSJim Jagielski 			xMethod->isOneway(),
395*b1cdbd2cSJim Jagielski 			aTypeName.pData,
396*b1cdbd2cSJim Jagielski 			(typelib_TypeClass)xReturnType->getTypeClass(),
397*b1cdbd2cSJim Jagielski 			aReturnTypeName.pData,
398*b1cdbd2cSJim Jagielski 			nParams, pParamInit,
399*b1cdbd2cSJim Jagielski 			nExceptions, ppExceptionNames );
400*b1cdbd2cSJim Jagielski 
401*b1cdbd2cSJim Jagielski 		for ( nPos = nParams; nPos--; )
402*b1cdbd2cSJim Jagielski 		{
403*b1cdbd2cSJim Jagielski 			rtl_uString_release( pParamInit[nPos].pTypeName );
404*b1cdbd2cSJim Jagielski 			rtl_uString_release( pParamInit[nPos].pParamName );
405*b1cdbd2cSJim Jagielski 		}
406*b1cdbd2cSJim Jagielski 		for ( nPos = nExceptions; nPos--; )
407*b1cdbd2cSJim Jagielski 		{
408*b1cdbd2cSJim Jagielski 			rtl_uString_release( ppExceptionNames[nPos] );
409*b1cdbd2cSJim Jagielski 		}
410*b1cdbd2cSJim Jagielski 	}
411*b1cdbd2cSJim Jagielski 	return pRet;
412*b1cdbd2cSJim Jagielski }
413*b1cdbd2cSJim Jagielski //==================================================================================================
createCTD(Reference<container::XHierarchicalNameAccess> const & access,const Reference<XInterfaceTypeDescription2> & xType)414*b1cdbd2cSJim Jagielski inline static typelib_TypeDescription * createCTD(
415*b1cdbd2cSJim Jagielski     Reference< container::XHierarchicalNameAccess > const & access,
416*b1cdbd2cSJim Jagielski 	const Reference< XInterfaceTypeDescription2 > & xType )
417*b1cdbd2cSJim Jagielski {
418*b1cdbd2cSJim Jagielski 	typelib_TypeDescription * pRet = 0;
419*b1cdbd2cSJim Jagielski 	if (xType.is())
420*b1cdbd2cSJim Jagielski 	{
421*b1cdbd2cSJim Jagielski         Sequence< Reference< XTypeDescription > > aBases(xType->getBaseTypes());
422*b1cdbd2cSJim Jagielski         sal_Int32 nBases = aBases.getLength();
423*b1cdbd2cSJim Jagielski         // Exploit the fact that a typelib_TypeDescription for an interface type
424*b1cdbd2cSJim Jagielski         // is also the typelib_TypeDescriptionReference for that type:
425*b1cdbd2cSJim Jagielski         boost::scoped_array< typelib_TypeDescription * > aBaseTypes(
426*b1cdbd2cSJim Jagielski             new typelib_TypeDescription *[nBases]);
427*b1cdbd2cSJim Jagielski         {for (sal_Int32 i = 0; i < nBases; ++i) {
428*b1cdbd2cSJim Jagielski             typelib_TypeDescription * p = createCTD(access, aBases[i]);
429*b1cdbd2cSJim Jagielski             OSL_ASSERT(
430*b1cdbd2cSJim Jagielski                 !TYPELIB_TYPEDESCRIPTIONREFERENCE_ISREALLYWEAK(p->eTypeClass));
431*b1cdbd2cSJim Jagielski             typelib_typedescription_register(&p);
432*b1cdbd2cSJim Jagielski             aBaseTypes[i] = p;
433*b1cdbd2cSJim Jagielski         }}
434*b1cdbd2cSJim Jagielski         typelib_TypeDescriptionReference ** pBaseTypeRefs
435*b1cdbd2cSJim Jagielski             = reinterpret_cast< typelib_TypeDescriptionReference ** >(
436*b1cdbd2cSJim Jagielski                 aBaseTypes.get());
437*b1cdbd2cSJim Jagielski 
438*b1cdbd2cSJim Jagielski 		// construct all member refs
439*b1cdbd2cSJim Jagielski 		const Sequence<Reference< XInterfaceMemberTypeDescription > > & rMembers = xType->getMembers();
440*b1cdbd2cSJim Jagielski 		sal_Int32 nMembers = rMembers.getLength();
441*b1cdbd2cSJim Jagielski 
442*b1cdbd2cSJim Jagielski 		typelib_TypeDescriptionReference ** ppMemberRefs = (typelib_TypeDescriptionReference **)alloca(
443*b1cdbd2cSJim Jagielski 			sizeof(typelib_TypeDescriptionReference *) * nMembers );
444*b1cdbd2cSJim Jagielski 
445*b1cdbd2cSJim Jagielski 		const Reference< XInterfaceMemberTypeDescription > * pMembers = rMembers.getConstArray();
446*b1cdbd2cSJim Jagielski 
447*b1cdbd2cSJim Jagielski 		OUString aTypeName( xType->getName() );
448*b1cdbd2cSJim Jagielski 
449*b1cdbd2cSJim Jagielski 		sal_Int32 nPos;
450*b1cdbd2cSJim Jagielski 		for ( nPos = nMembers; nPos--; )
451*b1cdbd2cSJim Jagielski 		{
452*b1cdbd2cSJim Jagielski 			OUString aMemberTypeName( pMembers[nPos]->getName() );
453*b1cdbd2cSJim Jagielski 			ppMemberRefs[nPos] = 0;
454*b1cdbd2cSJim Jagielski 			typelib_typedescriptionreference_new(
455*b1cdbd2cSJim Jagielski 				ppMemberRefs + nPos,
456*b1cdbd2cSJim Jagielski 				(typelib_TypeClass)pMembers[nPos]->getTypeClass(),
457*b1cdbd2cSJim Jagielski 				aMemberTypeName.pData );
458*b1cdbd2cSJim Jagielski 		}
459*b1cdbd2cSJim Jagielski 
460*b1cdbd2cSJim Jagielski 		Uik uik = xType->getUik();
461*b1cdbd2cSJim Jagielski 
462*b1cdbd2cSJim Jagielski 		typelib_typedescription_newMIInterface(
463*b1cdbd2cSJim Jagielski 			(typelib_InterfaceTypeDescription **)&pRet,
464*b1cdbd2cSJim Jagielski 			aTypeName.pData,
465*b1cdbd2cSJim Jagielski 			uik.m_Data1, uik.m_Data2, uik.m_Data3, uik.m_Data4, uik.m_Data5,
466*b1cdbd2cSJim Jagielski             nBases, pBaseTypeRefs,
467*b1cdbd2cSJim Jagielski 			nMembers, ppMemberRefs );
468*b1cdbd2cSJim Jagielski 
469*b1cdbd2cSJim Jagielski 		// cleanup refs and base type
470*b1cdbd2cSJim Jagielski         {for (int i = 0; i < nBases; ++i) {
471*b1cdbd2cSJim Jagielski             typelib_typedescription_release(aBaseTypes[i]);
472*b1cdbd2cSJim Jagielski         }}
473*b1cdbd2cSJim Jagielski 
474*b1cdbd2cSJim Jagielski 		for ( nPos = nMembers; nPos--; )
475*b1cdbd2cSJim Jagielski 		{
476*b1cdbd2cSJim Jagielski 			typelib_typedescriptionreference_release( ppMemberRefs[nPos] );
477*b1cdbd2cSJim Jagielski 		}
478*b1cdbd2cSJim Jagielski 	}
479*b1cdbd2cSJim Jagielski 	return pRet;
480*b1cdbd2cSJim Jagielski }
481*b1cdbd2cSJim Jagielski //==================================================================================================
createCTD(const Reference<XEnumTypeDescription> & xType)482*b1cdbd2cSJim Jagielski inline static typelib_TypeDescription * createCTD( const Reference< XEnumTypeDescription > & xType )
483*b1cdbd2cSJim Jagielski {
484*b1cdbd2cSJim Jagielski 	typelib_TypeDescription * pRet = 0;
485*b1cdbd2cSJim Jagielski 	if (xType.is())
486*b1cdbd2cSJim Jagielski 	{
487*b1cdbd2cSJim Jagielski 		OUString aTypeName( xType->getName() );
488*b1cdbd2cSJim Jagielski 		Sequence< OUString > aNames( xType->getEnumNames() );
489*b1cdbd2cSJim Jagielski 		OSL_ASSERT( sizeof(OUString) == sizeof(rtl_uString *) ); // !!!
490*b1cdbd2cSJim Jagielski 		Sequence< sal_Int32 > aValues( xType->getEnumValues() );
491*b1cdbd2cSJim Jagielski 
492*b1cdbd2cSJim Jagielski 		typelib_typedescription_newEnum(
493*b1cdbd2cSJim Jagielski 			&pRet, aTypeName.pData, xType->getDefaultEnumValue(),
494*b1cdbd2cSJim Jagielski 			aNames.getLength(),
495*b1cdbd2cSJim Jagielski 			(rtl_uString **)aNames.getConstArray(),
496*b1cdbd2cSJim Jagielski 			const_cast< sal_Int32 * >( aValues.getConstArray() ) );
497*b1cdbd2cSJim Jagielski 	}
498*b1cdbd2cSJim Jagielski 	return pRet;
499*b1cdbd2cSJim Jagielski }
500*b1cdbd2cSJim Jagielski //==================================================================================================
createCTD(Reference<container::XHierarchicalNameAccess> const & access,const Reference<XIndirectTypeDescription> & xType)501*b1cdbd2cSJim Jagielski inline static typelib_TypeDescription * createCTD(
502*b1cdbd2cSJim Jagielski     Reference< container::XHierarchicalNameAccess > const & access,
503*b1cdbd2cSJim Jagielski 	const Reference< XIndirectTypeDescription > & xType )
504*b1cdbd2cSJim Jagielski {
505*b1cdbd2cSJim Jagielski 	typelib_TypeDescription * pRet = 0;
506*b1cdbd2cSJim Jagielski 	if (xType.is())
507*b1cdbd2cSJim Jagielski 	{
508*b1cdbd2cSJim Jagielski 		typelib_TypeDescription * pRefType = createCTD(
509*b1cdbd2cSJim Jagielski             access, xType->getReferencedType() );
510*b1cdbd2cSJim Jagielski 		typelib_typedescription_register( &pRefType );
511*b1cdbd2cSJim Jagielski 
512*b1cdbd2cSJim Jagielski 		OUString aTypeName( xType->getName() );
513*b1cdbd2cSJim Jagielski 
514*b1cdbd2cSJim Jagielski 		typelib_typedescription_new(
515*b1cdbd2cSJim Jagielski 			&pRet,
516*b1cdbd2cSJim Jagielski 			(typelib_TypeClass)xType->getTypeClass(),
517*b1cdbd2cSJim Jagielski 			aTypeName.pData,
518*b1cdbd2cSJim Jagielski 			pRefType->pWeakRef,
519*b1cdbd2cSJim Jagielski 			0, 0 );
520*b1cdbd2cSJim Jagielski 
521*b1cdbd2cSJim Jagielski 		// cleanup
522*b1cdbd2cSJim Jagielski 		if (pRefType)
523*b1cdbd2cSJim Jagielski 			typelib_typedescription_release( pRefType );
524*b1cdbd2cSJim Jagielski 	}
525*b1cdbd2cSJim Jagielski 	return pRet;
526*b1cdbd2cSJim Jagielski }
527*b1cdbd2cSJim Jagielski 
528*b1cdbd2cSJim Jagielski //==================================================================================================
createCTD(Reference<container::XHierarchicalNameAccess> const & access,const Reference<XTypeDescription> & xType)529*b1cdbd2cSJim Jagielski static typelib_TypeDescription * createCTD(
530*b1cdbd2cSJim Jagielski     Reference< container::XHierarchicalNameAccess > const & access,
531*b1cdbd2cSJim Jagielski     const Reference< XTypeDescription > & xType )
532*b1cdbd2cSJim Jagielski {
533*b1cdbd2cSJim Jagielski 	typelib_TypeDescription * pRet = 0;
534*b1cdbd2cSJim Jagielski 
535*b1cdbd2cSJim Jagielski 	if (xType.is())
536*b1cdbd2cSJim Jagielski 	{
537*b1cdbd2cSJim Jagielski 		switch (xType->getTypeClass())
538*b1cdbd2cSJim Jagielski 		{
539*b1cdbd2cSJim Jagielski 			// built in types
540*b1cdbd2cSJim Jagielski 		case TypeClass_VOID:
541*b1cdbd2cSJim Jagielski 		{
542*b1cdbd2cSJim Jagielski 			OUString aTypeName( RTL_CONSTASCII_USTRINGPARAM("void") );
543*b1cdbd2cSJim Jagielski 			typelib_typedescription_new( &pRet, typelib_TypeClass_VOID, aTypeName.pData, 0, 0, 0 );
544*b1cdbd2cSJim Jagielski 			break;
545*b1cdbd2cSJim Jagielski 		}
546*b1cdbd2cSJim Jagielski 		case TypeClass_CHAR:
547*b1cdbd2cSJim Jagielski 		{
548*b1cdbd2cSJim Jagielski 			OUString aTypeName( RTL_CONSTASCII_USTRINGPARAM("char") );
549*b1cdbd2cSJim Jagielski 			typelib_typedescription_new( &pRet, typelib_TypeClass_CHAR, aTypeName.pData, 0, 0, 0 );
550*b1cdbd2cSJim Jagielski 			break;
551*b1cdbd2cSJim Jagielski 		}
552*b1cdbd2cSJim Jagielski 		case TypeClass_BOOLEAN:
553*b1cdbd2cSJim Jagielski 		{
554*b1cdbd2cSJim Jagielski 			OUString aTypeName( RTL_CONSTASCII_USTRINGPARAM("boolean") );
555*b1cdbd2cSJim Jagielski 			typelib_typedescription_new( &pRet, typelib_TypeClass_BOOLEAN, aTypeName.pData, 0, 0, 0 );
556*b1cdbd2cSJim Jagielski 			break;
557*b1cdbd2cSJim Jagielski 		}
558*b1cdbd2cSJim Jagielski 		case TypeClass_BYTE:
559*b1cdbd2cSJim Jagielski 		{
560*b1cdbd2cSJim Jagielski 			OUString aTypeName( RTL_CONSTASCII_USTRINGPARAM("byte") );
561*b1cdbd2cSJim Jagielski 			typelib_typedescription_new( &pRet, typelib_TypeClass_BYTE, aTypeName.pData, 0, 0, 0 );
562*b1cdbd2cSJim Jagielski 			break;
563*b1cdbd2cSJim Jagielski 		}
564*b1cdbd2cSJim Jagielski 		case TypeClass_SHORT:
565*b1cdbd2cSJim Jagielski 		{
566*b1cdbd2cSJim Jagielski 			OUString aTypeName( RTL_CONSTASCII_USTRINGPARAM("short") );
567*b1cdbd2cSJim Jagielski 			typelib_typedescription_new( &pRet, typelib_TypeClass_SHORT, aTypeName.pData, 0, 0, 0 );
568*b1cdbd2cSJim Jagielski 			break;
569*b1cdbd2cSJim Jagielski 		}
570*b1cdbd2cSJim Jagielski 		case TypeClass_UNSIGNED_SHORT:
571*b1cdbd2cSJim Jagielski 		{
572*b1cdbd2cSJim Jagielski 			OUString aTypeName( RTL_CONSTASCII_USTRINGPARAM("unsigned short") );
573*b1cdbd2cSJim Jagielski 			typelib_typedescription_new( &pRet, typelib_TypeClass_UNSIGNED_SHORT, aTypeName.pData, 0, 0, 0 );
574*b1cdbd2cSJim Jagielski 			break;
575*b1cdbd2cSJim Jagielski 		}
576*b1cdbd2cSJim Jagielski 		case TypeClass_LONG:
577*b1cdbd2cSJim Jagielski 		{
578*b1cdbd2cSJim Jagielski 			OUString aTypeName( RTL_CONSTASCII_USTRINGPARAM("long") );
579*b1cdbd2cSJim Jagielski 			typelib_typedescription_new( &pRet, typelib_TypeClass_LONG, aTypeName.pData, 0, 0, 0 );
580*b1cdbd2cSJim Jagielski 			break;
581*b1cdbd2cSJim Jagielski 		}
582*b1cdbd2cSJim Jagielski 		case TypeClass_UNSIGNED_LONG:
583*b1cdbd2cSJim Jagielski 		{
584*b1cdbd2cSJim Jagielski 			OUString aTypeName( RTL_CONSTASCII_USTRINGPARAM("unsigned long") );
585*b1cdbd2cSJim Jagielski 			typelib_typedescription_new( &pRet, typelib_TypeClass_UNSIGNED_LONG, aTypeName.pData, 0, 0, 0 );
586*b1cdbd2cSJim Jagielski 			break;
587*b1cdbd2cSJim Jagielski 		}
588*b1cdbd2cSJim Jagielski 		case TypeClass_HYPER:
589*b1cdbd2cSJim Jagielski 		{
590*b1cdbd2cSJim Jagielski 			OUString aTypeName( RTL_CONSTASCII_USTRINGPARAM("hyper") );
591*b1cdbd2cSJim Jagielski 			typelib_typedescription_new( &pRet, typelib_TypeClass_HYPER, aTypeName.pData, 0, 0, 0 );
592*b1cdbd2cSJim Jagielski 			break;
593*b1cdbd2cSJim Jagielski 		}
594*b1cdbd2cSJim Jagielski 		case TypeClass_UNSIGNED_HYPER:
595*b1cdbd2cSJim Jagielski 		{
596*b1cdbd2cSJim Jagielski 			OUString aTypeName( RTL_CONSTASCII_USTRINGPARAM("unsigned hyper") );
597*b1cdbd2cSJim Jagielski 			typelib_typedescription_new( &pRet, typelib_TypeClass_UNSIGNED_HYPER, aTypeName.pData, 0, 0, 0 );
598*b1cdbd2cSJim Jagielski 			break;
599*b1cdbd2cSJim Jagielski 		}
600*b1cdbd2cSJim Jagielski 		case TypeClass_FLOAT:
601*b1cdbd2cSJim Jagielski 		{
602*b1cdbd2cSJim Jagielski 			OUString aTypeName( RTL_CONSTASCII_USTRINGPARAM("float") );
603*b1cdbd2cSJim Jagielski 			typelib_typedescription_new( &pRet, typelib_TypeClass_FLOAT, aTypeName.pData, 0, 0, 0 );
604*b1cdbd2cSJim Jagielski 			break;
605*b1cdbd2cSJim Jagielski 		}
606*b1cdbd2cSJim Jagielski 		case TypeClass_DOUBLE:
607*b1cdbd2cSJim Jagielski 		{
608*b1cdbd2cSJim Jagielski 			OUString aTypeName( RTL_CONSTASCII_USTRINGPARAM("double") );
609*b1cdbd2cSJim Jagielski 			typelib_typedescription_new( &pRet, typelib_TypeClass_DOUBLE, aTypeName.pData, 0, 0, 0 );
610*b1cdbd2cSJim Jagielski 			break;
611*b1cdbd2cSJim Jagielski 		}
612*b1cdbd2cSJim Jagielski 		case TypeClass_STRING:
613*b1cdbd2cSJim Jagielski 		{
614*b1cdbd2cSJim Jagielski 			OUString aTypeName( RTL_CONSTASCII_USTRINGPARAM("string") );
615*b1cdbd2cSJim Jagielski 			typelib_typedescription_new( &pRet, typelib_TypeClass_STRING, aTypeName.pData, 0, 0, 0 );
616*b1cdbd2cSJim Jagielski 			break;
617*b1cdbd2cSJim Jagielski 		}
618*b1cdbd2cSJim Jagielski 		case TypeClass_TYPE:
619*b1cdbd2cSJim Jagielski 		{
620*b1cdbd2cSJim Jagielski 			OUString aTypeName( RTL_CONSTASCII_USTRINGPARAM("type") );
621*b1cdbd2cSJim Jagielski 			typelib_typedescription_new( &pRet, typelib_TypeClass_TYPE, aTypeName.pData, 0, 0, 0 );
622*b1cdbd2cSJim Jagielski 			break;
623*b1cdbd2cSJim Jagielski 		}
624*b1cdbd2cSJim Jagielski 		case TypeClass_ANY:
625*b1cdbd2cSJim Jagielski 		{
626*b1cdbd2cSJim Jagielski 			OUString aTypeName( RTL_CONSTASCII_USTRINGPARAM("any") );
627*b1cdbd2cSJim Jagielski 			typelib_typedescription_new( &pRet, typelib_TypeClass_ANY, aTypeName.pData, 0, 0, 0 );
628*b1cdbd2cSJim Jagielski 			break;
629*b1cdbd2cSJim Jagielski 		}
630*b1cdbd2cSJim Jagielski 
631*b1cdbd2cSJim Jagielski 		case TypeClass_UNION:
632*b1cdbd2cSJim Jagielski 			pRet = createCTD( Reference< XUnionTypeDescription >::query( xType ) );
633*b1cdbd2cSJim Jagielski 			break;
634*b1cdbd2cSJim Jagielski 		case TypeClass_EXCEPTION:
635*b1cdbd2cSJim Jagielski 			pRet = createCTD( Reference< XCompoundTypeDescription >::query( xType ) );
636*b1cdbd2cSJim Jagielski 			break;
637*b1cdbd2cSJim Jagielski 		case TypeClass_STRUCT:
638*b1cdbd2cSJim Jagielski 			pRet = createCTD(
639*b1cdbd2cSJim Jagielski                 access, Reference< XStructTypeDescription >::query( xType ) );
640*b1cdbd2cSJim Jagielski 			break;
641*b1cdbd2cSJim Jagielski 		case TypeClass_ENUM:
642*b1cdbd2cSJim Jagielski 			pRet = createCTD( Reference< XEnumTypeDescription >::query( xType ) );
643*b1cdbd2cSJim Jagielski 			break;
644*b1cdbd2cSJim Jagielski 		case TypeClass_TYPEDEF:
645*b1cdbd2cSJim Jagielski 		{
646*b1cdbd2cSJim Jagielski 			Reference< XIndirectTypeDescription > xTypedef( xType, UNO_QUERY );
647*b1cdbd2cSJim Jagielski 			if (xTypedef.is())
648*b1cdbd2cSJim Jagielski 				pRet = createCTD( access, xTypedef->getReferencedType() );
649*b1cdbd2cSJim Jagielski 			break;
650*b1cdbd2cSJim Jagielski 		}
651*b1cdbd2cSJim Jagielski 		case TypeClass_SEQUENCE:
652*b1cdbd2cSJim Jagielski 			pRet = createCTD(
653*b1cdbd2cSJim Jagielski                 access, Reference< XIndirectTypeDescription >::query( xType ) );
654*b1cdbd2cSJim Jagielski 			break;
655*b1cdbd2cSJim Jagielski 		case TypeClass_INTERFACE:
656*b1cdbd2cSJim Jagielski 			pRet = createCTD(
657*b1cdbd2cSJim Jagielski                 access,
658*b1cdbd2cSJim Jagielski                 Reference< XInterfaceTypeDescription2 >::query( xType ) );
659*b1cdbd2cSJim Jagielski 			break;
660*b1cdbd2cSJim Jagielski 		case TypeClass_INTERFACE_METHOD:
661*b1cdbd2cSJim Jagielski 			pRet = createCTD( Reference< XInterfaceMethodTypeDescription >::query( xType ) );
662*b1cdbd2cSJim Jagielski 			break;
663*b1cdbd2cSJim Jagielski 		case TypeClass_INTERFACE_ATTRIBUTE:
664*b1cdbd2cSJim Jagielski 			pRet = createCTD( Reference< XInterfaceAttributeTypeDescription2 >::query( xType ) );
665*b1cdbd2cSJim Jagielski 			break;
666*b1cdbd2cSJim Jagielski         default:
667*b1cdbd2cSJim Jagielski             break;
668*b1cdbd2cSJim Jagielski 		}
669*b1cdbd2cSJim Jagielski 	}
670*b1cdbd2cSJim Jagielski 
671*b1cdbd2cSJim Jagielski 	return pRet;
672*b1cdbd2cSJim Jagielski }
673*b1cdbd2cSJim Jagielski 
674*b1cdbd2cSJim Jagielski 
675*b1cdbd2cSJim Jagielski //==================================================================================================
676*b1cdbd2cSJim Jagielski extern "C"
677*b1cdbd2cSJim Jagielski {
typelib_callback(void * pContext,typelib_TypeDescription ** ppRet,rtl_uString * pTypeName)678*b1cdbd2cSJim Jagielski static void SAL_CALL typelib_callback(
679*b1cdbd2cSJim Jagielski     void * pContext, typelib_TypeDescription ** ppRet, rtl_uString * pTypeName )
680*b1cdbd2cSJim Jagielski {
681*b1cdbd2cSJim Jagielski 	OSL_ENSURE( pContext && ppRet && pTypeName, "### null ptr!" );
682*b1cdbd2cSJim Jagielski 	if (ppRet)
683*b1cdbd2cSJim Jagielski 	{
684*b1cdbd2cSJim Jagielski 		if (*ppRet)
685*b1cdbd2cSJim Jagielski 		{
686*b1cdbd2cSJim Jagielski 			::typelib_typedescription_release( *ppRet );
687*b1cdbd2cSJim Jagielski 			*ppRet = 0;
688*b1cdbd2cSJim Jagielski 		}
689*b1cdbd2cSJim Jagielski 		if (pContext && pTypeName)
690*b1cdbd2cSJim Jagielski 		{
691*b1cdbd2cSJim Jagielski             Reference< container::XHierarchicalNameAccess > access(
692*b1cdbd2cSJim Jagielski                 reinterpret_cast< container::XHierarchicalNameAccess * >(
693*b1cdbd2cSJim Jagielski                     pContext));
694*b1cdbd2cSJim Jagielski 			try
695*b1cdbd2cSJim Jagielski 			{
696*b1cdbd2cSJim Jagielski                 OUString const & rTypeName = OUString::unacquired( &pTypeName );
697*b1cdbd2cSJim Jagielski 				Reference< XTypeDescription > xTD;
698*b1cdbd2cSJim Jagielski 				if (access->getByHierarchicalName(rTypeName ) >>= xTD)
699*b1cdbd2cSJim Jagielski 				{
700*b1cdbd2cSJim Jagielski 					*ppRet = createCTD( access, xTD );
701*b1cdbd2cSJim Jagielski 				}
702*b1cdbd2cSJim Jagielski 			}
703*b1cdbd2cSJim Jagielski             catch (container::NoSuchElementException & exc)
704*b1cdbd2cSJim Jagielski             {
705*b1cdbd2cSJim Jagielski                 (void) exc; // avoid warning about unused variable
706*b1cdbd2cSJim Jagielski                 OSL_TRACE(
707*b1cdbd2cSJim Jagielski                     "typelibrary type not available: %s",
708*b1cdbd2cSJim Jagielski                     OUStringToOString(
709*b1cdbd2cSJim Jagielski                         exc.Message, RTL_TEXTENCODING_UTF8 ).getStr() );
710*b1cdbd2cSJim Jagielski             }
711*b1cdbd2cSJim Jagielski 			catch (Exception & exc)
712*b1cdbd2cSJim Jagielski 			{
713*b1cdbd2cSJim Jagielski                 (void) exc; // avoid warning about unused variable
714*b1cdbd2cSJim Jagielski                 OSL_TRACE(
715*b1cdbd2cSJim Jagielski                     "%s",
716*b1cdbd2cSJim Jagielski                     OUStringToOString(
717*b1cdbd2cSJim Jagielski                         exc.Message, RTL_TEXTENCODING_UTF8 ).getStr() );
718*b1cdbd2cSJim Jagielski 			}
719*b1cdbd2cSJim Jagielski 		}
720*b1cdbd2cSJim Jagielski 	}
721*b1cdbd2cSJim Jagielski }
722*b1cdbd2cSJim Jagielski }
723*b1cdbd2cSJim Jagielski 
724*b1cdbd2cSJim Jagielski //==================================================================================================
725*b1cdbd2cSJim Jagielski class EventListenerImpl
726*b1cdbd2cSJim Jagielski     : public WeakImplHelper1< lang::XEventListener >
727*b1cdbd2cSJim Jagielski {
728*b1cdbd2cSJim Jagielski     Reference< container::XHierarchicalNameAccess > m_xTDMgr;
729*b1cdbd2cSJim Jagielski 
730*b1cdbd2cSJim Jagielski public:
731*b1cdbd2cSJim Jagielski 	inline EventListenerImpl(
732*b1cdbd2cSJim Jagielski         Reference< container::XHierarchicalNameAccess > const & xTDMgr )
733*b1cdbd2cSJim Jagielski         SAL_THROW( () )
734*b1cdbd2cSJim Jagielski         : m_xTDMgr( xTDMgr )
735*b1cdbd2cSJim Jagielski 		{}
736*b1cdbd2cSJim Jagielski 
737*b1cdbd2cSJim Jagielski 	// XEventListener
738*b1cdbd2cSJim Jagielski 	virtual void SAL_CALL disposing( lang::EventObject const & rEvt )
739*b1cdbd2cSJim Jagielski         throw (RuntimeException);
740*b1cdbd2cSJim Jagielski };
741*b1cdbd2cSJim Jagielski //__________________________________________________________________________________________________
disposing(lang::EventObject const & rEvt)742*b1cdbd2cSJim Jagielski void EventListenerImpl::disposing( lang::EventObject const & rEvt )
743*b1cdbd2cSJim Jagielski     throw (RuntimeException)
744*b1cdbd2cSJim Jagielski {
745*b1cdbd2cSJim Jagielski     if (rEvt.Source != m_xTDMgr) {
746*b1cdbd2cSJim Jagielski         OSL_ASSERT(false);
747*b1cdbd2cSJim Jagielski     }
748*b1cdbd2cSJim Jagielski 	// deregister of c typelib callback
749*b1cdbd2cSJim Jagielski 	::typelib_typedescription_revokeCallback( m_xTDMgr.get(), typelib_callback );
750*b1cdbd2cSJim Jagielski }
751*b1cdbd2cSJim Jagielski 
752*b1cdbd2cSJim Jagielski //==================================================================================================
installTypeDescriptionManager(Reference<container::XHierarchicalNameAccess> const & xTDMgr_c)753*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL installTypeDescriptionManager(
754*b1cdbd2cSJim Jagielski     Reference< container::XHierarchicalNameAccess > const & xTDMgr_c )
755*b1cdbd2cSJim Jagielski     SAL_THROW( () )
756*b1cdbd2cSJim Jagielski {
757*b1cdbd2cSJim Jagielski 	uno::Environment curr_env(Environment::getCurrent());
758*b1cdbd2cSJim Jagielski 	uno::Environment target_env(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(CPPU_STRINGIFY(CPPU_ENV))));
759*b1cdbd2cSJim Jagielski 
760*b1cdbd2cSJim Jagielski 	uno::Mapping curr2target(curr_env, target_env);
761*b1cdbd2cSJim Jagielski 
762*b1cdbd2cSJim Jagielski 
763*b1cdbd2cSJim Jagielski 	Reference<container::XHierarchicalNameAccess> xTDMgr(
764*b1cdbd2cSJim Jagielski 		reinterpret_cast<container::XHierarchicalNameAccess *>(
765*b1cdbd2cSJim Jagielski 			curr2target.mapInterface(xTDMgr_c.get(), ::getCppuType(&xTDMgr_c))),
766*b1cdbd2cSJim Jagielski 		SAL_NO_ACQUIRE);
767*b1cdbd2cSJim Jagielski 
768*b1cdbd2cSJim Jagielski     Reference< lang::XComponent > xComp( xTDMgr, UNO_QUERY );
769*b1cdbd2cSJim Jagielski     if (xComp.is())
770*b1cdbd2cSJim Jagielski     {
771*b1cdbd2cSJim Jagielski         xComp->addEventListener( new EventListenerImpl( xTDMgr ) );
772*b1cdbd2cSJim Jagielski         // register c typelib callback
773*b1cdbd2cSJim Jagielski         ::typelib_typedescription_registerCallback( xTDMgr.get(), typelib_callback );
774*b1cdbd2cSJim Jagielski         return sal_True;
775*b1cdbd2cSJim Jagielski     }
776*b1cdbd2cSJim Jagielski     return sal_False;
777*b1cdbd2cSJim Jagielski }
778*b1cdbd2cSJim Jagielski 
779*b1cdbd2cSJim Jagielski } // end namespace cppu
780*b1cdbd2cSJim Jagielski 
781