Bug Summary

File:cppuhelper/source/tdmgr.cxx
Location:line 432, column 13
Description:Access to field 'eTypeClass' results in a dereference of a null pointer (loaded from variable 'p')

Annotated Source Code

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