File: | cppu/source/typelib/typelib.cxx |
Location: | line 492, column 11 |
Description: | Access to field 'bComplete' results in a dereference of a null pointer |
1 | /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ | |||
2 | /* | |||
3 | * This file is part of the LibreOffice project. | |||
4 | * | |||
5 | * This Source Code Form is subject to the terms of the Mozilla Public | |||
6 | * License, v. 2.0. If a copy of the MPL was not distributed with this | |||
7 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. | |||
8 | * | |||
9 | * This file incorporates work covered by the following license notice: | |||
10 | * | |||
11 | * Licensed to the Apache Software Foundation (ASF) under one or more | |||
12 | * contributor license agreements. See the NOTICE file distributed | |||
13 | * with this work for additional information regarding copyright | |||
14 | * ownership. The ASF licenses this file to you under the Apache | |||
15 | * License, Version 2.0 (the "License"); you may not use this file | |||
16 | * except in compliance with the License. You may obtain a copy of | |||
17 | * the License at http://www.apache.org/licenses/LICENSE-2.0 . | |||
18 | */ | |||
19 | ||||
20 | ||||
21 | #if OSL_DEBUG_LEVEL1 > 1 | |||
22 | #include <stdio.h> | |||
23 | #endif | |||
24 | ||||
25 | #include <boost/unordered_map.hpp> | |||
26 | #include <list> | |||
27 | #include <set> | |||
28 | #include <vector> | |||
29 | ||||
30 | #include <stdarg.h> | |||
31 | #include <stdlib.h> | |||
32 | #include <string.h> | |||
33 | #include <sal/alloca.h> | |||
34 | #include <new> | |||
35 | #include <osl/interlck.h> | |||
36 | #include <osl/mutex.hxx> | |||
37 | #include <rtl/ustring.hxx> | |||
38 | #include <rtl/ustrbuf.hxx> | |||
39 | #include <rtl/alloc.h> | |||
40 | #include <rtl/instance.hxx> | |||
41 | #include <osl/diagnose.h> | |||
42 | #include <typelib/typedescription.h> | |||
43 | #include <uno/any2.h> | |||
44 | ||||
45 | using namespace std; | |||
46 | using namespace osl; | |||
47 | ||||
48 | using ::rtl::OUString; | |||
49 | using ::rtl::OUStringBuffer; | |||
50 | using ::rtl::OString; | |||
51 | ||||
52 | #ifdef SAL_W32 | |||
53 | #pragma pack(push, 8) | |||
54 | #endif | |||
55 | ||||
56 | /** | |||
57 | * The double member determin the alignment. | |||
58 | * Under Os2 and MS-Windows the Alignment is min( 8, sizeof( type ) ). | |||
59 | * The aligment of a strukture is min( 8, sizeof( max basic type ) ), the greatest basic type | |||
60 | * determine the aligment. | |||
61 | */ | |||
62 | struct AlignSize_Impl | |||
63 | { | |||
64 | sal_Int16 nInt16; | |||
65 | #ifdef AIX | |||
66 | //double: doubleword aligned if -qalign=natural/-malign=natural | |||
67 | //which isn't the default ABI. Otherwise word aligned, While a long long int | |||
68 | //is always doubleword aligned, so use that instead. | |||
69 | sal_Int64 dDouble; | |||
70 | #else | |||
71 | double dDouble; | |||
72 | #endif | |||
73 | }; | |||
74 | ||||
75 | #ifdef SAL_W32 | |||
76 | #pragma pack(pop) | |||
77 | #endif | |||
78 | ||||
79 | // the value of the maximal alignment | |||
80 | static sal_Int32 nMaxAlignment = (sal_Int32)( (sal_Size)(&((AlignSize_Impl *) 16)->dDouble) - 16); | |||
81 | ||||
82 | static inline sal_Int32 adjustAlignment( sal_Int32 nRequestedAlignment ) | |||
83 | SAL_THROW(()) | |||
84 | { | |||
85 | if( nRequestedAlignment > nMaxAlignment ) | |||
86 | nRequestedAlignment = nMaxAlignment; | |||
87 | return nRequestedAlignment; | |||
88 | } | |||
89 | ||||
90 | /** | |||
91 | * Calculate the new size of the struktur. | |||
92 | */ | |||
93 | static inline sal_Int32 newAlignedSize( | |||
94 | sal_Int32 OldSize, sal_Int32 ElementSize, sal_Int32 NeededAlignment ) | |||
95 | SAL_THROW(()) | |||
96 | { | |||
97 | NeededAlignment = adjustAlignment( NeededAlignment ); | |||
98 | return (OldSize + NeededAlignment -1) / NeededAlignment * NeededAlignment + ElementSize; | |||
99 | } | |||
100 | ||||
101 | static inline sal_Bool reallyWeak( typelib_TypeClass eTypeClass ) | |||
102 | SAL_THROW(()) | |||
103 | { | |||
104 | return TYPELIB_TYPEDESCRIPTIONREFERENCE_ISREALLYWEAK( eTypeClass )((eTypeClass) == typelib_TypeClass_INTERFACE_METHOD || (eTypeClass ) == typelib_TypeClass_INTERFACE_ATTRIBUTE); | |||
105 | } | |||
106 | ||||
107 | static inline sal_Int32 getDescriptionSize( typelib_TypeClass eTypeClass ) | |||
108 | SAL_THROW(()) | |||
109 | { | |||
110 | OSL_ASSERT( typelib_TypeClass_TYPEDEF != eTypeClass )do { if (true && (!(typelib_TypeClass_TYPEDEF != eTypeClass ))) { sal_detail_logFormat((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl" ), ("/usr/local/src/libreoffice/cppu/source/typelib/typelib.cxx" ":" "110" ": "), "OSL_ASSERT: %s", "typelib_TypeClass_TYPEDEF != eTypeClass" ); } } while (false); | |||
111 | ||||
112 | sal_Int32 nSize; | |||
113 | // The reference is the description | |||
114 | // if the description is empty, than it must be filled with | |||
115 | // the new description | |||
116 | switch( eTypeClass ) | |||
117 | { | |||
118 | case typelib_TypeClass_ARRAY: | |||
119 | nSize = (sal_Int32)sizeof( typelib_ArrayTypeDescription ); | |||
120 | break; | |||
121 | ||||
122 | case typelib_TypeClass_SEQUENCE: | |||
123 | nSize = (sal_Int32)sizeof( typelib_IndirectTypeDescription ); | |||
124 | break; | |||
125 | ||||
126 | case typelib_TypeClass_UNION: | |||
127 | nSize = (sal_Int32)sizeof( typelib_UnionTypeDescription ); | |||
128 | break; | |||
129 | ||||
130 | case typelib_TypeClass_STRUCT: | |||
131 | nSize = (sal_Int32)sizeof( typelib_StructTypeDescription ); | |||
132 | break; | |||
133 | ||||
134 | case typelib_TypeClass_EXCEPTION: | |||
135 | nSize = (sal_Int32)sizeof( typelib_CompoundTypeDescription ); | |||
136 | break; | |||
137 | ||||
138 | case typelib_TypeClass_ENUM: | |||
139 | nSize = (sal_Int32)sizeof( typelib_EnumTypeDescription ); | |||
140 | break; | |||
141 | ||||
142 | case typelib_TypeClass_INTERFACE: | |||
143 | nSize = (sal_Int32)sizeof( typelib_InterfaceTypeDescription ); | |||
144 | break; | |||
145 | ||||
146 | case typelib_TypeClass_INTERFACE_METHOD: | |||
147 | nSize = (sal_Int32)sizeof( typelib_InterfaceMethodTypeDescription ); | |||
148 | break; | |||
149 | ||||
150 | case typelib_TypeClass_INTERFACE_ATTRIBUTE: | |||
151 | nSize = (sal_Int32)sizeof( typelib_InterfaceAttributeTypeDescription ); | |||
152 | break; | |||
153 | ||||
154 | default: | |||
155 | nSize = (sal_Int32)sizeof( typelib_TypeDescription ); | |||
156 | } | |||
157 | return nSize; | |||
158 | } | |||
159 | ||||
160 | ||||
161 | //----------------------------------------------------------------------------- | |||
162 | extern "C" void SAL_CALL typelib_typedescriptionreference_getByName( | |||
163 | typelib_TypeDescriptionReference ** ppRet, rtl_uString * pName ) | |||
164 | SAL_THROW_EXTERN_C()throw (); | |||
165 | ||||
166 | //----------------------------------------------------------------------------- | |||
167 | struct equalStr_Impl | |||
168 | { | |||
169 | sal_Bool operator()(const sal_Unicode * const & s1, const sal_Unicode * const & s2) const SAL_THROW(()) | |||
170 | { return 0 == rtl_ustr_compare( s1, s2 ); } | |||
171 | }; | |||
172 | ||||
173 | //----------------------------------------------------------------------------- | |||
174 | struct hashStr_Impl | |||
175 | { | |||
176 | size_t operator()(const sal_Unicode * const & s) const SAL_THROW(()) | |||
177 | { return rtl_ustr_hashCode( s ); } | |||
178 | }; | |||
179 | ||||
180 | ||||
181 | //----------------------------------------------------------------------------- | |||
182 | // Heavy hack, the const sal_Unicode * is hold by the typedescription reference | |||
183 | typedef boost::unordered_map< const sal_Unicode *, typelib_TypeDescriptionReference *, | |||
184 | hashStr_Impl, equalStr_Impl > WeakMap_Impl; | |||
185 | ||||
186 | typedef pair< void *, typelib_typedescription_Callback > CallbackEntry; | |||
187 | typedef list< CallbackEntry > CallbackSet_Impl; | |||
188 | typedef list< typelib_TypeDescription * > TypeDescriptionList_Impl; | |||
189 | ||||
190 | // # of cached elements | |||
191 | static sal_Int32 nCacheSize = 256; | |||
192 | ||||
193 | struct TypeDescriptor_Init_Impl | |||
194 | { | |||
195 | //sal_Bool bDesctructorCalled; | |||
196 | // all type description references | |||
197 | WeakMap_Impl * pWeakMap; | |||
198 | // all type description callbacks | |||
199 | CallbackSet_Impl * pCallbacks; | |||
200 | // A cache to hold descriptions | |||
201 | TypeDescriptionList_Impl * pCache; | |||
202 | // The mutex to guard all type library accesses | |||
203 | Mutex * pMutex; | |||
204 | ||||
205 | inline Mutex & getMutex() SAL_THROW(()); | |||
206 | ||||
207 | inline void callChain( typelib_TypeDescription ** ppRet, rtl_uString * pName ) SAL_THROW(()); | |||
208 | ||||
209 | #if OSL_DEBUG_LEVEL1 > 1 | |||
210 | // only for debugging | |||
211 | sal_Int32 nTypeDescriptionCount; | |||
212 | sal_Int32 nCompoundTypeDescriptionCount; | |||
213 | sal_Int32 nUnionTypeDescriptionCount; | |||
214 | sal_Int32 nIndirectTypeDescriptionCount; | |||
215 | sal_Int32 nArrayTypeDescriptionCount; | |||
216 | sal_Int32 nEnumTypeDescriptionCount; | |||
217 | sal_Int32 nInterfaceMethodTypeDescriptionCount; | |||
218 | sal_Int32 nInterfaceAttributeTypeDescriptionCount; | |||
219 | sal_Int32 nInterfaceTypeDescriptionCount; | |||
220 | sal_Int32 nTypeDescriptionReferenceCount; | |||
221 | #endif | |||
222 | ||||
223 | TypeDescriptor_Init_Impl(): | |||
224 | pWeakMap(0), pCallbacks(0), pCache(0), pMutex(0) | |||
225 | #if OSL_DEBUG_LEVEL1 > 1 | |||
226 | , nTypeDescriptionCount(0), nCompoundTypeDescriptionCount(0), | |||
227 | nUnionTypeDescriptionCount(0), nIndirectTypeDescriptionCount(0), | |||
228 | nArrayTypeDescriptionCount(0), nEnumTypeDescriptionCount(0), | |||
229 | nInterfaceMethodTypeDescriptionCount(0), | |||
230 | nInterfaceAttributeTypeDescriptionCount(0), | |||
231 | nInterfaceTypeDescriptionCount(0), nTypeDescriptionReferenceCount(0) | |||
232 | #endif | |||
233 | {} | |||
234 | ||||
235 | ~TypeDescriptor_Init_Impl() SAL_THROW(()); | |||
236 | }; | |||
237 | //__________________________________________________________________________________________________ | |||
238 | inline Mutex & TypeDescriptor_Init_Impl::getMutex() SAL_THROW(()) | |||
239 | { | |||
240 | if( !pMutex ) | |||
241 | { | |||
242 | MutexGuard aGuard( Mutex::getGlobalMutex() ); | |||
243 | if( !pMutex ) | |||
244 | pMutex = new Mutex(); | |||
245 | } | |||
246 | return * pMutex; | |||
247 | } | |||
248 | //__________________________________________________________________________________________________ | |||
249 | inline void TypeDescriptor_Init_Impl::callChain( | |||
250 | typelib_TypeDescription ** ppRet, rtl_uString * pName ) | |||
251 | SAL_THROW(()) | |||
252 | { | |||
253 | if (pCallbacks) | |||
254 | { | |||
255 | CallbackSet_Impl::const_iterator aIt = pCallbacks->begin(); | |||
256 | while( aIt != pCallbacks->end() ) | |||
257 | { | |||
258 | const CallbackEntry & rEntry = *aIt; | |||
259 | (*rEntry.second)( rEntry.first, ppRet, pName ); | |||
260 | if( *ppRet ) | |||
261 | return; | |||
262 | ++aIt; | |||
263 | } | |||
264 | } | |||
265 | if (*ppRet) | |||
266 | { | |||
267 | typelib_typedescription_release( *ppRet ); | |||
268 | *ppRet = 0; | |||
269 | } | |||
270 | } | |||
271 | ||||
272 | //__________________________________________________________________________________________________ | |||
273 | TypeDescriptor_Init_Impl::~TypeDescriptor_Init_Impl() SAL_THROW(()) | |||
274 | { | |||
275 | if( pCache ) | |||
276 | { | |||
277 | TypeDescriptionList_Impl::const_iterator aIt = pCache->begin(); | |||
278 | while( aIt != pCache->end() ) | |||
279 | { | |||
280 | typelib_typedescription_release( (*aIt) ); | |||
281 | ++aIt; | |||
282 | } | |||
283 | delete pCache; | |||
284 | pCache = 0; | |||
285 | } | |||
286 | ||||
287 | if( pWeakMap ) | |||
288 | { | |||
289 | std::vector< typelib_TypeDescriptionReference * > ppTDR; | |||
290 | // save al weak references | |||
291 | WeakMap_Impl::const_iterator aIt = pWeakMap->begin(); | |||
292 | while( aIt != pWeakMap->end() ) | |||
293 | { | |||
294 | ppTDR.push_back( (*aIt).second ); | |||
295 | typelib_typedescriptionreference_acquire( ppTDR.back() ); | |||
296 | ++aIt; | |||
297 | } | |||
298 | ||||
299 | for( std::vector< typelib_TypeDescriptionReference * >::iterator i( | |||
300 | ppTDR.begin() ); | |||
301 | i != ppTDR.end(); ++i ) | |||
302 | { | |||
303 | typelib_TypeDescriptionReference * pTDR = *i; | |||
304 | OSL_ASSERT( pTDR->nRefCount > pTDR->nStaticRefCount )do { if (true && (!(pTDR->nRefCount > pTDR-> nStaticRefCount))) { sal_detail_logFormat((SAL_DETAIL_LOG_LEVEL_WARN ), ("legacy.osl"), ("/usr/local/src/libreoffice/cppu/source/typelib/typelib.cxx" ":" "304" ": "), "OSL_ASSERT: %s", "pTDR->nRefCount > pTDR->nStaticRefCount" ); } } while (false); | |||
305 | pTDR->nRefCount -= pTDR->nStaticRefCount; | |||
306 | ||||
307 | if( pTDR->pType && !pTDR->pType->bOnDemand ) | |||
308 | { | |||
309 | pTDR->pType->bOnDemand = sal_True((sal_Bool)1); | |||
310 | typelib_typedescription_release( pTDR->pType ); | |||
311 | } | |||
312 | typelib_typedescriptionreference_release( pTDR ); | |||
313 | } | |||
314 | ||||
315 | #if OSL_DEBUG_LEVEL1 > 1 | |||
316 | aIt = pWeakMap->begin(); | |||
317 | while( aIt != pWeakMap->end() ) | |||
318 | { | |||
319 | typelib_TypeDescriptionReference * pTDR = (*aIt).second; | |||
320 | if (pTDR) | |||
321 | { | |||
322 | OString aTypeName( rtl::OUStringToOString( pTDR->pTypeName, RTL_TEXTENCODING_ASCII_US(((rtl_TextEncoding) 11)) ) ); | |||
323 | OSL_TRACE(do { if (true && (1 > 0)) { sal_detail_logFormat(( SAL_DETAIL_LOG_LEVEL_INFO), ("legacy.osl"), ("/usr/local/src/libreoffice/cppu/source/typelib/typelib.cxx" ":" "324" ": "), "### remaining type: %s; ref count = %d", aTypeName .getStr(), pTDR->nRefCount); } } while (false) | |||
324 | "### remaining type: %s; ref count = %d", aTypeName.getStr(), pTDR->nRefCount )do { if (true && (1 > 0)) { sal_detail_logFormat(( SAL_DETAIL_LOG_LEVEL_INFO), ("legacy.osl"), ("/usr/local/src/libreoffice/cppu/source/typelib/typelib.cxx" ":" "324" ": "), "### remaining type: %s; ref count = %d", aTypeName .getStr(), pTDR->nRefCount); } } while (false); | |||
325 | } | |||
326 | else | |||
327 | { | |||
328 | OSL_TRACE( "### remaining null type entry!?" )do { if (true && (1 > 0)) { sal_detail_logFormat(( SAL_DETAIL_LOG_LEVEL_INFO), ("legacy.osl"), ("/usr/local/src/libreoffice/cppu/source/typelib/typelib.cxx" ":" "328" ": "), "### remaining null type entry!?"); } } while (false); | |||
329 | } | |||
330 | ++aIt; | |||
331 | } | |||
332 | #endif | |||
333 | ||||
334 | delete pWeakMap; | |||
335 | pWeakMap = 0; | |||
336 | } | |||
337 | #if OSL_DEBUG_LEVEL1 > 1 | |||
338 | OSL_ENSURE( !nTypeDescriptionCount, "### nTypeDescriptionCount is not zero" )do { if (true && (!(!nTypeDescriptionCount))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/cppu/source/typelib/typelib.cxx" ":" "338" ": "), "%s", "### nTypeDescriptionCount is not zero" ); } } while (false); | |||
339 | OSL_ENSURE( !nCompoundTypeDescriptionCount, "### nCompoundTypeDescriptionCount is not zero" )do { if (true && (!(!nCompoundTypeDescriptionCount))) { sal_detail_logFormat((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl" ), ("/usr/local/src/libreoffice/cppu/source/typelib/typelib.cxx" ":" "339" ": "), "%s", "### nCompoundTypeDescriptionCount is not zero" ); } } while (false); | |||
340 | OSL_ENSURE( !nUnionTypeDescriptionCount, "### nUnionTypeDescriptionCount is not zero" )do { if (true && (!(!nUnionTypeDescriptionCount))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/cppu/source/typelib/typelib.cxx" ":" "340" ": "), "%s", "### nUnionTypeDescriptionCount is not zero" ); } } while (false); | |||
341 | OSL_ENSURE( !nIndirectTypeDescriptionCount, "### nIndirectTypeDescriptionCount is not zero" )do { if (true && (!(!nIndirectTypeDescriptionCount))) { sal_detail_logFormat((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl" ), ("/usr/local/src/libreoffice/cppu/source/typelib/typelib.cxx" ":" "341" ": "), "%s", "### nIndirectTypeDescriptionCount is not zero" ); } } while (false); | |||
342 | OSL_ENSURE( !nArrayTypeDescriptionCount, "### nArrayTypeDescriptionCount is not zero" )do { if (true && (!(!nArrayTypeDescriptionCount))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/cppu/source/typelib/typelib.cxx" ":" "342" ": "), "%s", "### nArrayTypeDescriptionCount is not zero" ); } } while (false); | |||
343 | OSL_ENSURE( !nEnumTypeDescriptionCount, "### nEnumTypeDescriptionCount is not zero" )do { if (true && (!(!nEnumTypeDescriptionCount))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/cppu/source/typelib/typelib.cxx" ":" "343" ": "), "%s", "### nEnumTypeDescriptionCount is not zero" ); } } while (false); | |||
344 | OSL_ENSURE( !nInterfaceMethodTypeDescriptionCount, "### nInterfaceMethodTypeDescriptionCount is not zero" )do { if (true && (!(!nInterfaceMethodTypeDescriptionCount ))) { sal_detail_logFormat((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl" ), ("/usr/local/src/libreoffice/cppu/source/typelib/typelib.cxx" ":" "344" ": "), "%s", "### nInterfaceMethodTypeDescriptionCount is not zero" ); } } while (false); | |||
345 | OSL_ENSURE( !nInterfaceAttributeTypeDescriptionCount, "### nInterfaceAttributeTypeDescriptionCount is not zero" )do { if (true && (!(!nInterfaceAttributeTypeDescriptionCount ))) { sal_detail_logFormat((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl" ), ("/usr/local/src/libreoffice/cppu/source/typelib/typelib.cxx" ":" "345" ": "), "%s", "### nInterfaceAttributeTypeDescriptionCount is not zero" ); } } while (false); | |||
346 | OSL_ENSURE( !nInterfaceTypeDescriptionCount, "### nInterfaceTypeDescriptionCount is not zero" )do { if (true && (!(!nInterfaceTypeDescriptionCount)) ) { sal_detail_logFormat((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl" ), ("/usr/local/src/libreoffice/cppu/source/typelib/typelib.cxx" ":" "346" ": "), "%s", "### nInterfaceTypeDescriptionCount is not zero" ); } } while (false); | |||
347 | OSL_ENSURE( !nTypeDescriptionReferenceCount, "### nTypeDescriptionReferenceCount is not zero" )do { if (true && (!(!nTypeDescriptionReferenceCount)) ) { sal_detail_logFormat((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl" ), ("/usr/local/src/libreoffice/cppu/source/typelib/typelib.cxx" ":" "347" ": "), "%s", "### nTypeDescriptionReferenceCount is not zero" ); } } while (false); | |||
348 | ||||
349 | OSL_ENSURE( !pCallbacks || pCallbacks->empty(), "### pCallbacks is not NULL or empty" )do { if (true && (!(!pCallbacks || pCallbacks->empty ()))) { sal_detail_logFormat((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl" ), ("/usr/local/src/libreoffice/cppu/source/typelib/typelib.cxx" ":" "349" ": "), "%s", "### pCallbacks is not NULL or empty" ); } } while (false); | |||
350 | #endif | |||
351 | ||||
352 | delete pCallbacks; | |||
353 | pCallbacks = 0; | |||
354 | ||||
355 | if( pMutex ) | |||
356 | { | |||
357 | delete pMutex; | |||
358 | pMutex = 0; | |||
359 | } | |||
360 | }; | |||
361 | ||||
362 | namespace { struct Init : public rtl::Static< TypeDescriptor_Init_Impl, Init > {}; } | |||
363 | ||||
364 | extern "C" CPPU_DLLPUBLIC__attribute__ ((visibility("default"))) void SAL_CALL typelib_typedescription_registerCallback( | |||
365 | void * pContext, typelib_typedescription_Callback pCallback ) | |||
366 | SAL_THROW_EXTERN_C()throw () | |||
367 | { | |||
368 | // todo mt safe: guard is no solution, can not acquire while calling callback! | |||
369 | TypeDescriptor_Init_Impl &rInit = Init::get(); | |||
370 | // OslGuard aGuard( rInit.getMutex() ); | |||
371 | if( !rInit.pCallbacks ) | |||
372 | rInit.pCallbacks = new CallbackSet_Impl; | |||
373 | rInit.pCallbacks->push_back( CallbackEntry( pContext, pCallback ) ); | |||
374 | } | |||
375 | ||||
376 | //------------------------------------------------------------------------ | |||
377 | extern "C" CPPU_DLLPUBLIC__attribute__ ((visibility("default"))) void SAL_CALL typelib_typedescription_revokeCallback( | |||
378 | void * pContext, typelib_typedescription_Callback pCallback ) | |||
379 | SAL_THROW_EXTERN_C()throw () | |||
380 | { | |||
381 | TypeDescriptor_Init_Impl &rInit = Init::get(); | |||
382 | if( rInit.pCallbacks ) | |||
383 | { | |||
384 | // todo mt safe: guard is no solution, can not acquire while calling callback! | |||
385 | // OslGuard aGuard( rInit.getMutex() ); | |||
386 | CallbackEntry aEntry( pContext, pCallback ); | |||
387 | CallbackSet_Impl::iterator iPos( rInit.pCallbacks->begin() ); | |||
388 | while (!(iPos == rInit.pCallbacks->end())) | |||
389 | { | |||
390 | if (*iPos == aEntry) | |||
391 | { | |||
392 | rInit.pCallbacks->erase( iPos ); | |||
393 | iPos = rInit.pCallbacks->begin(); | |||
394 | } | |||
395 | else | |||
396 | { | |||
397 | ++iPos; | |||
398 | } | |||
399 | } | |||
400 | } | |||
401 | } | |||
402 | ||||
403 | extern "C" sal_Int32 SAL_CALL typelib_typedescription_getAlignedUnoSize( | |||
404 | const typelib_TypeDescription * pTypeDescription, | |||
405 | sal_Int32 nOffset, sal_Int32 & rMaxIntegralTypeSize ) | |||
406 | SAL_THROW_EXTERN_C()throw (); | |||
407 | ||||
408 | //------------------------------------------------------------------------ | |||
409 | static inline void typelib_typedescription_initTables( | |||
410 | typelib_TypeDescription * pTD ) | |||
411 | SAL_THROW(()) | |||
412 | { | |||
413 | typelib_InterfaceTypeDescription * pITD = (typelib_InterfaceTypeDescription *)pTD; | |||
414 | ||||
415 | sal_Bool * pReadWriteAttributes = (sal_Bool *)alloca( pITD->nAllMembers )__builtin_alloca (pITD->nAllMembers); | |||
416 | for ( sal_Int32 i = pITD->nAllMembers; i--; ) | |||
417 | { | |||
418 | pReadWriteAttributes[i] = sal_False((sal_Bool)0); | |||
419 | if( typelib_TypeClass_INTERFACE_ATTRIBUTE == pITD->ppAllMembers[i]->eTypeClass ) | |||
420 | { | |||
421 | typelib_TypeDescription * pM = 0; | |||
422 | TYPELIB_DANGER_GET( &pM, pITD->ppAllMembers[i] ){ typelib_TypeDescriptionReference * pMacroTypeRef = (pITD-> ppAllMembers[i]); typelib_TypeDescription ** ppMacroTypeDescr = (&pM); if (((pMacroTypeRef->eTypeClass) == typelib_TypeClass_INTERFACE_METHOD || (pMacroTypeRef->eTypeClass) == typelib_TypeClass_INTERFACE_ATTRIBUTE )) { typelib_typedescriptionreference_getDescription( ppMacroTypeDescr , pMacroTypeRef ); } else if (!pMacroTypeRef->pType || !pMacroTypeRef ->pType->pWeakRef) { typelib_typedescriptionreference_getDescription ( ppMacroTypeDescr, pMacroTypeRef ); if (*ppMacroTypeDescr) typelib_typedescription_release ( *ppMacroTypeDescr ); } else { *ppMacroTypeDescr = pMacroTypeRef ->pType; } }; | |||
423 | OSL_ASSERT( pM )do { if (true && (!(pM))) { sal_detail_logFormat((SAL_DETAIL_LOG_LEVEL_WARN ), ("legacy.osl"), ("/usr/local/src/libreoffice/cppu/source/typelib/typelib.cxx" ":" "423" ": "), "OSL_ASSERT: %s", "pM"); } } while (false); | |||
424 | if (pM) | |||
425 | { | |||
426 | pReadWriteAttributes[i] = !((typelib_InterfaceAttributeTypeDescription *)pM)->bReadOnly; | |||
427 | TYPELIB_DANGER_RELEASE( pM ){ if ((((pM)->eTypeClass) == typelib_TypeClass_INTERFACE_METHOD || ((pM)->eTypeClass) == typelib_TypeClass_INTERFACE_ATTRIBUTE )) typelib_typedescription_release( pM ); }; | |||
428 | } | |||
429 | #if OSL_DEBUG_LEVEL1 > 1 | |||
430 | else | |||
431 | { | |||
432 | OString aStr( rtl::OUStringToOString( pITD->ppAllMembers[i]->pTypeName, RTL_TEXTENCODING_ASCII_US(((rtl_TextEncoding) 11)) ) ); | |||
433 | OSL_TRACE( "\n### cannot get attribute type description: %s", aStr.getStr() )do { if (true && (1 > 0)) { sal_detail_logFormat(( SAL_DETAIL_LOG_LEVEL_INFO), ("legacy.osl"), ("/usr/local/src/libreoffice/cppu/source/typelib/typelib.cxx" ":" "433" ": "), "\n### cannot get attribute type description: %s" , aStr.getStr()); } } while (false); | |||
434 | } | |||
435 | #endif | |||
436 | } | |||
437 | } | |||
438 | ||||
439 | MutexGuard aGuard( Init::get().getMutex() ); | |||
440 | if( !pTD->bComplete ) | |||
441 | { | |||
442 | // create the index table from member to function table | |||
443 | pITD->pMapMemberIndexToFunctionIndex = new sal_Int32[ pITD->nAllMembers ]; | |||
444 | sal_Int32 nAdditionalOffset = 0; // +1 for read/write attributes | |||
445 | sal_Int32 i; | |||
446 | for( i = 0; i < pITD->nAllMembers; i++ ) | |||
447 | { | |||
448 | // index to the get method of the attribute | |||
449 | pITD->pMapMemberIndexToFunctionIndex[i] = i + nAdditionalOffset; | |||
450 | // extra offset if it is a read/write attribute? | |||
451 | if( pReadWriteAttributes[i] ) | |||
452 | { | |||
453 | // a read/write attribute | |||
454 | nAdditionalOffset++; | |||
455 | } | |||
456 | } | |||
457 | ||||
458 | // create the index table from function to member table | |||
459 | pITD->pMapFunctionIndexToMemberIndex = new sal_Int32[ pITD->nAllMembers + nAdditionalOffset ]; | |||
460 | nAdditionalOffset = 0; // +1 for read/write attributes | |||
461 | for( i = 0; i < pITD->nAllMembers; i++ ) | |||
462 | { | |||
463 | // index to the get method of the attribute | |||
464 | pITD->pMapFunctionIndexToMemberIndex[i + nAdditionalOffset] = i; | |||
465 | // extra offset if it is a read/write attribute? | |||
466 | if( pReadWriteAttributes[i] ) | |||
467 | { | |||
468 | // a read/write attribute | |||
469 | pITD->pMapFunctionIndexToMemberIndex[i + ++nAdditionalOffset] = i; | |||
470 | } | |||
471 | } | |||
472 | // must be the last action after all initialization is done | |||
473 | pITD->nMapFunctionIndexToMemberIndex = pITD->nAllMembers + nAdditionalOffset; | |||
474 | pTD->bComplete = sal_True((sal_Bool)1); | |||
475 | } | |||
476 | } | |||
477 | ||||
478 | namespace { | |||
479 | ||||
480 | // In some situations (notably typelib_typedescription_newInterfaceMethod and | |||
481 | // typelib_typedescription_newInterfaceAttribute), only the members nMembers, | |||
482 | // ppMembers, nAllMembers, and ppAllMembers of an incomplete interface type | |||
483 | // description are necessary, but not the additional | |||
484 | // pMapMemberIndexToFunctionIndex, nMapFunctionIndexToMemberIndex, and | |||
485 | // pMapFunctionIndexToMemberIndex (which are computed by | |||
486 | // typelib_typedescription_initTables). Furthermore, in those situations, it | |||
487 | // might be illegal to compute those tables, as the creation of the interface | |||
488 | // member type descriptions would recursively require a complete interface type | |||
489 | // description. The parameter initTables controls whether or not to call | |||
490 | // typelib_typedescription_initTables in those situations. | |||
491 | bool complete(typelib_TypeDescription ** ppTypeDescr, bool initTables) { | |||
492 | if (! (*ppTypeDescr)->bComplete) | |||
| ||||
493 | { | |||
494 | OSL_ASSERT( (typelib_TypeClass_STRUCT == (*ppTypeDescr)->eTypeClass ||do { if (true && (!((typelib_TypeClass_STRUCT == (*ppTypeDescr )->eTypeClass || typelib_TypeClass_EXCEPTION == (*ppTypeDescr )->eTypeClass || typelib_TypeClass_UNION == (*ppTypeDescr) ->eTypeClass || typelib_TypeClass_ENUM == (*ppTypeDescr)-> eTypeClass || typelib_TypeClass_INTERFACE == (*ppTypeDescr)-> eTypeClass) && !reallyWeak( (*ppTypeDescr)->eTypeClass )))) { sal_detail_logFormat((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl" ), ("/usr/local/src/libreoffice/cppu/source/typelib/typelib.cxx" ":" "499" ": "), "OSL_ASSERT: %s", "(typelib_TypeClass_STRUCT == (*ppTypeDescr)->eTypeClass || typelib_TypeClass_EXCEPTION == (*ppTypeDescr)->eTypeClass || typelib_TypeClass_UNION == (*ppTypeDescr)->eTypeClass || typelib_TypeClass_ENUM == (*ppTypeDescr)->eTypeClass || typelib_TypeClass_INTERFACE == (*ppTypeDescr)->eTypeClass) && !reallyWeak( (*ppTypeDescr)->eTypeClass )" ); } } while (false) | |||
495 | typelib_TypeClass_EXCEPTION == (*ppTypeDescr)->eTypeClass ||do { if (true && (!((typelib_TypeClass_STRUCT == (*ppTypeDescr )->eTypeClass || typelib_TypeClass_EXCEPTION == (*ppTypeDescr )->eTypeClass || typelib_TypeClass_UNION == (*ppTypeDescr) ->eTypeClass || typelib_TypeClass_ENUM == (*ppTypeDescr)-> eTypeClass || typelib_TypeClass_INTERFACE == (*ppTypeDescr)-> eTypeClass) && !reallyWeak( (*ppTypeDescr)->eTypeClass )))) { sal_detail_logFormat((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl" ), ("/usr/local/src/libreoffice/cppu/source/typelib/typelib.cxx" ":" "499" ": "), "OSL_ASSERT: %s", "(typelib_TypeClass_STRUCT == (*ppTypeDescr)->eTypeClass || typelib_TypeClass_EXCEPTION == (*ppTypeDescr)->eTypeClass || typelib_TypeClass_UNION == (*ppTypeDescr)->eTypeClass || typelib_TypeClass_ENUM == (*ppTypeDescr)->eTypeClass || typelib_TypeClass_INTERFACE == (*ppTypeDescr)->eTypeClass) && !reallyWeak( (*ppTypeDescr)->eTypeClass )" ); } } while (false) | |||
496 | typelib_TypeClass_UNION == (*ppTypeDescr)->eTypeClass ||do { if (true && (!((typelib_TypeClass_STRUCT == (*ppTypeDescr )->eTypeClass || typelib_TypeClass_EXCEPTION == (*ppTypeDescr )->eTypeClass || typelib_TypeClass_UNION == (*ppTypeDescr) ->eTypeClass || typelib_TypeClass_ENUM == (*ppTypeDescr)-> eTypeClass || typelib_TypeClass_INTERFACE == (*ppTypeDescr)-> eTypeClass) && !reallyWeak( (*ppTypeDescr)->eTypeClass )))) { sal_detail_logFormat((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl" ), ("/usr/local/src/libreoffice/cppu/source/typelib/typelib.cxx" ":" "499" ": "), "OSL_ASSERT: %s", "(typelib_TypeClass_STRUCT == (*ppTypeDescr)->eTypeClass || typelib_TypeClass_EXCEPTION == (*ppTypeDescr)->eTypeClass || typelib_TypeClass_UNION == (*ppTypeDescr)->eTypeClass || typelib_TypeClass_ENUM == (*ppTypeDescr)->eTypeClass || typelib_TypeClass_INTERFACE == (*ppTypeDescr)->eTypeClass) && !reallyWeak( (*ppTypeDescr)->eTypeClass )" ); } } while (false) | |||
497 | typelib_TypeClass_ENUM == (*ppTypeDescr)->eTypeClass ||do { if (true && (!((typelib_TypeClass_STRUCT == (*ppTypeDescr )->eTypeClass || typelib_TypeClass_EXCEPTION == (*ppTypeDescr )->eTypeClass || typelib_TypeClass_UNION == (*ppTypeDescr) ->eTypeClass || typelib_TypeClass_ENUM == (*ppTypeDescr)-> eTypeClass || typelib_TypeClass_INTERFACE == (*ppTypeDescr)-> eTypeClass) && !reallyWeak( (*ppTypeDescr)->eTypeClass )))) { sal_detail_logFormat((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl" ), ("/usr/local/src/libreoffice/cppu/source/typelib/typelib.cxx" ":" "499" ": "), "OSL_ASSERT: %s", "(typelib_TypeClass_STRUCT == (*ppTypeDescr)->eTypeClass || typelib_TypeClass_EXCEPTION == (*ppTypeDescr)->eTypeClass || typelib_TypeClass_UNION == (*ppTypeDescr)->eTypeClass || typelib_TypeClass_ENUM == (*ppTypeDescr)->eTypeClass || typelib_TypeClass_INTERFACE == (*ppTypeDescr)->eTypeClass) && !reallyWeak( (*ppTypeDescr)->eTypeClass )" ); } } while (false) | |||
498 | typelib_TypeClass_INTERFACE == (*ppTypeDescr)->eTypeClass) &&do { if (true && (!((typelib_TypeClass_STRUCT == (*ppTypeDescr )->eTypeClass || typelib_TypeClass_EXCEPTION == (*ppTypeDescr )->eTypeClass || typelib_TypeClass_UNION == (*ppTypeDescr) ->eTypeClass || typelib_TypeClass_ENUM == (*ppTypeDescr)-> eTypeClass || typelib_TypeClass_INTERFACE == (*ppTypeDescr)-> eTypeClass) && !reallyWeak( (*ppTypeDescr)->eTypeClass )))) { sal_detail_logFormat((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl" ), ("/usr/local/src/libreoffice/cppu/source/typelib/typelib.cxx" ":" "499" ": "), "OSL_ASSERT: %s", "(typelib_TypeClass_STRUCT == (*ppTypeDescr)->eTypeClass || typelib_TypeClass_EXCEPTION == (*ppTypeDescr)->eTypeClass || typelib_TypeClass_UNION == (*ppTypeDescr)->eTypeClass || typelib_TypeClass_ENUM == (*ppTypeDescr)->eTypeClass || typelib_TypeClass_INTERFACE == (*ppTypeDescr)->eTypeClass) && !reallyWeak( (*ppTypeDescr)->eTypeClass )" ); } } while (false) | |||
499 | !reallyWeak( (*ppTypeDescr)->eTypeClass ) )do { if (true && (!((typelib_TypeClass_STRUCT == (*ppTypeDescr )->eTypeClass || typelib_TypeClass_EXCEPTION == (*ppTypeDescr )->eTypeClass || typelib_TypeClass_UNION == (*ppTypeDescr) ->eTypeClass || typelib_TypeClass_ENUM == (*ppTypeDescr)-> eTypeClass || typelib_TypeClass_INTERFACE == (*ppTypeDescr)-> eTypeClass) && !reallyWeak( (*ppTypeDescr)->eTypeClass )))) { sal_detail_logFormat((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl" ), ("/usr/local/src/libreoffice/cppu/source/typelib/typelib.cxx" ":" "499" ": "), "OSL_ASSERT: %s", "(typelib_TypeClass_STRUCT == (*ppTypeDescr)->eTypeClass || typelib_TypeClass_EXCEPTION == (*ppTypeDescr)->eTypeClass || typelib_TypeClass_UNION == (*ppTypeDescr)->eTypeClass || typelib_TypeClass_ENUM == (*ppTypeDescr)->eTypeClass || typelib_TypeClass_INTERFACE == (*ppTypeDescr)->eTypeClass) && !reallyWeak( (*ppTypeDescr)->eTypeClass )" ); } } while (false); | |||
500 | ||||
501 | if (typelib_TypeClass_INTERFACE == (*ppTypeDescr)->eTypeClass && | |||
502 | ((typelib_InterfaceTypeDescription *)*ppTypeDescr)->ppAllMembers) | |||
503 | { | |||
504 | if (initTables) { | |||
505 | typelib_typedescription_initTables( *ppTypeDescr ); | |||
506 | } | |||
507 | return true; | |||
508 | } | |||
509 | ||||
510 | typelib_TypeDescription * pTD = 0; | |||
511 | // on demand access of complete td | |||
512 | TypeDescriptor_Init_Impl &rInit = Init::get(); | |||
513 | rInit.callChain( &pTD, (*ppTypeDescr)->pTypeName ); | |||
514 | if (pTD) | |||
515 | { | |||
516 | if (typelib_TypeClass_TYPEDEF == pTD->eTypeClass) | |||
517 | { | |||
518 | typelib_typedescriptionreference_getDescription( | |||
519 | &pTD, ((typelib_IndirectTypeDescription *)pTD)->pType ); | |||
520 | OSL_ASSERT( pTD )do { if (true && (!(pTD))) { sal_detail_logFormat((SAL_DETAIL_LOG_LEVEL_WARN ), ("legacy.osl"), ("/usr/local/src/libreoffice/cppu/source/typelib/typelib.cxx" ":" "520" ": "), "OSL_ASSERT: %s", "pTD"); } } while (false); | |||
521 | if (! pTD) | |||
522 | return false; | |||
523 | } | |||
524 | ||||
525 | OSL_ASSERT( typelib_TypeClass_TYPEDEF != pTD->eTypeClass )do { if (true && (!(typelib_TypeClass_TYPEDEF != pTD-> eTypeClass))) { sal_detail_logFormat((SAL_DETAIL_LOG_LEVEL_WARN ), ("legacy.osl"), ("/usr/local/src/libreoffice/cppu/source/typelib/typelib.cxx" ":" "525" ": "), "OSL_ASSERT: %s", "typelib_TypeClass_TYPEDEF != pTD->eTypeClass" ); } } while (false); | |||
526 | // typedescription found | |||
527 | // set to on demand | |||
528 | pTD->bOnDemand = sal_True((sal_Bool)1); | |||
529 | ||||
530 | if (pTD->eTypeClass == typelib_TypeClass_INTERFACE | |||
531 | && !pTD->bComplete && initTables) | |||
532 | { | |||
533 | // mandatory info from callback chain | |||
534 | OSL_ASSERT( ((typelib_InterfaceTypeDescription *)pTD)->ppAllMembers )do { if (true && (!(((typelib_InterfaceTypeDescription *)pTD)->ppAllMembers))) { sal_detail_logFormat((SAL_DETAIL_LOG_LEVEL_WARN ), ("legacy.osl"), ("/usr/local/src/libreoffice/cppu/source/typelib/typelib.cxx" ":" "534" ": "), "OSL_ASSERT: %s", "((typelib_InterfaceTypeDescription *)pTD)->ppAllMembers" ); } } while (false); | |||
535 | // complete except of tables init | |||
536 | typelib_typedescription_initTables( pTD ); | |||
537 | pTD->bComplete = sal_True((sal_Bool)1); | |||
538 | } | |||
539 | ||||
540 | // The type description is hold by the reference until | |||
541 | // on demand is activated. | |||
542 | ::typelib_typedescription_register( &pTD ); // replaces incomplete one | |||
543 | OSL_ASSERT( pTD == *ppTypeDescr )do { if (true && (!(pTD == *ppTypeDescr))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/cppu/source/typelib/typelib.cxx" ":" "543" ": "), "OSL_ASSERT: %s", "pTD == *ppTypeDescr"); } } while (false); // has to merge into existing one | |||
544 | ||||
545 | // insert into the chache | |||
546 | MutexGuard aGuard( rInit.getMutex() ); | |||
547 | if( !rInit.pCache ) | |||
548 | rInit.pCache = new TypeDescriptionList_Impl; | |||
549 | if( (sal_Int32)rInit.pCache->size() >= nCacheSize ) | |||
550 | { | |||
551 | typelib_typedescription_release( rInit.pCache->front() ); | |||
552 | rInit.pCache->pop_front(); | |||
553 | } | |||
554 | // descriptions in the cache must be acquired! | |||
555 | typelib_typedescription_acquire( pTD ); | |||
556 | rInit.pCache->push_back( pTD ); | |||
557 | ||||
558 | OSL_ASSERT(do { if (true && (!(pTD->bComplete || (pTD->eTypeClass == typelib_TypeClass_INTERFACE && !initTables)))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/cppu/source/typelib/typelib.cxx" ":" "561" ": "), "OSL_ASSERT: %s", "pTD->bComplete || (pTD->eTypeClass == typelib_TypeClass_INTERFACE && !initTables)" ); } } while (false) | |||
559 | pTD->bCompletedo { if (true && (!(pTD->bComplete || (pTD->eTypeClass == typelib_TypeClass_INTERFACE && !initTables)))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/cppu/source/typelib/typelib.cxx" ":" "561" ": "), "OSL_ASSERT: %s", "pTD->bComplete || (pTD->eTypeClass == typelib_TypeClass_INTERFACE && !initTables)" ); } } while (false) | |||
560 | || (pTD->eTypeClass == typelib_TypeClass_INTERFACEdo { if (true && (!(pTD->bComplete || (pTD->eTypeClass == typelib_TypeClass_INTERFACE && !initTables)))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/cppu/source/typelib/typelib.cxx" ":" "561" ": "), "OSL_ASSERT: %s", "pTD->bComplete || (pTD->eTypeClass == typelib_TypeClass_INTERFACE && !initTables)" ); } } while (false) | |||
561 | && !initTables))do { if (true && (!(pTD->bComplete || (pTD->eTypeClass == typelib_TypeClass_INTERFACE && !initTables)))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/cppu/source/typelib/typelib.cxx" ":" "561" ": "), "OSL_ASSERT: %s", "pTD->bComplete || (pTD->eTypeClass == typelib_TypeClass_INTERFACE && !initTables)" ); } } while (false); | |||
562 | ||||
563 | ::typelib_typedescription_release( *ppTypeDescr ); | |||
564 | *ppTypeDescr = pTD; | |||
565 | } | |||
566 | else | |||
567 | { | |||
568 | #if OSL_DEBUG_LEVEL1 > 1 | |||
569 | OString aStr( | |||
570 | rtl::OUStringToOString( (*ppTypeDescr)->pTypeName, RTL_TEXTENCODING_ASCII_US(((rtl_TextEncoding) 11)) ) ); | |||
571 | OSL_TRACE( "\n### type cannot be completed: %s", aStr.getStr() )do { if (true && (1 > 0)) { sal_detail_logFormat(( SAL_DETAIL_LOG_LEVEL_INFO), ("legacy.osl"), ("/usr/local/src/libreoffice/cppu/source/typelib/typelib.cxx" ":" "571" ": "), "\n### type cannot be completed: %s", aStr. getStr()); } } while (false); | |||
572 | #endif | |||
573 | return false; | |||
574 | } | |||
575 | } | |||
576 | return true; | |||
577 | } | |||
578 | ||||
579 | } | |||
580 | ||||
581 | //------------------------------------------------------------------------ | |||
582 | extern "C" void SAL_CALL typelib_typedescription_newEmpty( | |||
583 | typelib_TypeDescription ** ppRet, | |||
584 | typelib_TypeClass eTypeClass, rtl_uString * pTypeName ) | |||
585 | SAL_THROW_EXTERN_C()throw () | |||
586 | { | |||
587 | if( *ppRet ) | |||
588 | { | |||
589 | typelib_typedescription_release( *ppRet ); | |||
590 | *ppRet = 0; | |||
591 | } | |||
592 | ||||
593 | OSL_ASSERT( typelib_TypeClass_TYPEDEF != eTypeClass )do { if (true && (!(typelib_TypeClass_TYPEDEF != eTypeClass ))) { sal_detail_logFormat((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl" ), ("/usr/local/src/libreoffice/cppu/source/typelib/typelib.cxx" ":" "593" ": "), "OSL_ASSERT: %s", "typelib_TypeClass_TYPEDEF != eTypeClass" ); } } while (false); | |||
594 | ||||
595 | typelib_TypeDescription * pRet; | |||
596 | switch( eTypeClass ) | |||
597 | { | |||
598 | case typelib_TypeClass_ARRAY: | |||
599 | { | |||
600 | typelib_ArrayTypeDescription * pTmp = new typelib_ArrayTypeDescription(); | |||
601 | typelib_IndirectTypeDescription * pIndirect = (typelib_IndirectTypeDescription *)pTmp; | |||
602 | pRet = (typelib_TypeDescription *)pTmp; | |||
603 | #if OSL_DEBUG_LEVEL1 > 1 | |||
604 | osl_incrementInterlockedCount( | |||
605 | &Init::get().nArrayTypeDescriptionCount ); | |||
606 | #endif | |||
607 | pIndirect->pType = 0; | |||
608 | pTmp->nDimensions = 0; | |||
609 | pTmp->nTotalElements = 0; | |||
610 | pTmp->pDimensions = 0; | |||
611 | } | |||
612 | break; | |||
613 | ||||
614 | case typelib_TypeClass_SEQUENCE: | |||
615 | { | |||
616 | typelib_IndirectTypeDescription * pTmp = new typelib_IndirectTypeDescription(); | |||
617 | pRet = (typelib_TypeDescription *)pTmp; | |||
618 | #if OSL_DEBUG_LEVEL1 > 1 | |||
619 | osl_incrementInterlockedCount( | |||
620 | &Init::get().nIndirectTypeDescriptionCount ); | |||
621 | #endif | |||
622 | pTmp->pType = 0; | |||
623 | } | |||
624 | break; | |||
625 | ||||
626 | case typelib_TypeClass_UNION: | |||
627 | { | |||
628 | typelib_UnionTypeDescription * pTmp; | |||
629 | pTmp = new typelib_UnionTypeDescription(); | |||
630 | pRet = (typelib_TypeDescription *)pTmp; | |||
631 | #if OSL_DEBUG_LEVEL1 > 1 | |||
632 | osl_incrementInterlockedCount( | |||
633 | &Init::get().nUnionTypeDescriptionCount ); | |||
634 | #endif | |||
635 | pTmp->nMembers = 0; | |||
636 | pTmp->pDiscriminantTypeRef = 0; | |||
637 | pTmp->pDiscriminants = 0; | |||
638 | pTmp->ppTypeRefs = 0; | |||
639 | pTmp->ppMemberNames = 0; | |||
640 | pTmp->pDefaultTypeRef = 0; | |||
641 | } | |||
642 | break; | |||
643 | ||||
644 | case typelib_TypeClass_STRUCT: | |||
645 | { | |||
646 | // FEATURE_EMPTYCLASS | |||
647 | typelib_StructTypeDescription * pTmp; | |||
648 | pTmp = new typelib_StructTypeDescription(); | |||
649 | pRet = (typelib_TypeDescription *)pTmp; | |||
650 | #if OSL_DEBUG_LEVEL1 > 1 | |||
651 | osl_incrementInterlockedCount( | |||
652 | &Init::get().nCompoundTypeDescriptionCount ); | |||
653 | #endif | |||
654 | pTmp->aBase.pBaseTypeDescription = 0; | |||
655 | pTmp->aBase.nMembers = 0; | |||
656 | pTmp->aBase.pMemberOffsets = 0; | |||
657 | pTmp->aBase.ppTypeRefs = 0; | |||
658 | pTmp->aBase.ppMemberNames = 0; | |||
659 | pTmp->pParameterizedTypes = 0; | |||
660 | } | |||
661 | break; | |||
662 | ||||
663 | case typelib_TypeClass_EXCEPTION: | |||
664 | { | |||
665 | // FEATURE_EMPTYCLASS | |||
666 | typelib_CompoundTypeDescription * pTmp; | |||
667 | pTmp = new typelib_CompoundTypeDescription(); | |||
668 | pRet = (typelib_TypeDescription *)pTmp; | |||
669 | #if OSL_DEBUG_LEVEL1 > 1 | |||
670 | osl_incrementInterlockedCount( | |||
671 | &Init::get().nCompoundTypeDescriptionCount ); | |||
672 | #endif | |||
673 | pTmp->pBaseTypeDescription = 0; | |||
674 | pTmp->nMembers = 0; | |||
675 | pTmp->pMemberOffsets = 0; | |||
676 | pTmp->ppTypeRefs = 0; | |||
677 | pTmp->ppMemberNames = 0; | |||
678 | } | |||
679 | break; | |||
680 | ||||
681 | case typelib_TypeClass_ENUM: | |||
682 | { | |||
683 | typelib_EnumTypeDescription * pTmp = new typelib_EnumTypeDescription(); | |||
684 | pRet = (typelib_TypeDescription *)pTmp; | |||
685 | #if OSL_DEBUG_LEVEL1 > 1 | |||
686 | osl_incrementInterlockedCount( | |||
687 | &Init::get().nEnumTypeDescriptionCount ); | |||
688 | #endif | |||
689 | pTmp->nDefaultEnumValue = 0; | |||
690 | pTmp->nEnumValues = 0; | |||
691 | pTmp->ppEnumNames = 0; | |||
692 | pTmp->pEnumValues = 0; | |||
693 | } | |||
694 | break; | |||
695 | ||||
696 | case typelib_TypeClass_INTERFACE: | |||
697 | { | |||
698 | typelib_InterfaceTypeDescription * pTmp = new typelib_InterfaceTypeDescription(); | |||
699 | pRet = (typelib_TypeDescription *)pTmp; | |||
700 | #if OSL_DEBUG_LEVEL1 > 1 | |||
701 | osl_incrementInterlockedCount( | |||
702 | &Init::get().nInterfaceTypeDescriptionCount ); | |||
703 | #endif | |||
704 | pTmp->pBaseTypeDescription = 0; | |||
705 | pTmp->nMembers = 0; | |||
706 | pTmp->ppMembers = 0; | |||
707 | pTmp->nAllMembers = 0; | |||
708 | pTmp->ppAllMembers = 0; | |||
709 | pTmp->nMapFunctionIndexToMemberIndex = 0; | |||
710 | pTmp->pMapFunctionIndexToMemberIndex = 0; | |||
711 | pTmp->pMapMemberIndexToFunctionIndex= 0; | |||
712 | pTmp->nBaseTypes = 0; | |||
713 | pTmp->ppBaseTypes = 0; | |||
714 | } | |||
715 | break; | |||
716 | ||||
717 | case typelib_TypeClass_INTERFACE_METHOD: | |||
718 | { | |||
719 | typelib_InterfaceMethodTypeDescription * pTmp = new typelib_InterfaceMethodTypeDescription(); | |||
720 | pRet = (typelib_TypeDescription *)pTmp; | |||
721 | #if OSL_DEBUG_LEVEL1 > 1 | |||
722 | osl_incrementInterlockedCount( | |||
723 | &Init::get().nInterfaceMethodTypeDescriptionCount ); | |||
724 | #endif | |||
725 | pTmp->aBase.pMemberName = 0; | |||
726 | pTmp->pReturnTypeRef = 0; | |||
727 | pTmp->nParams = 0; | |||
728 | pTmp->pParams = 0; | |||
729 | pTmp->nExceptions = 0; | |||
730 | pTmp->ppExceptions = 0; | |||
731 | pTmp->pInterface = 0; | |||
732 | pTmp->pBaseRef = 0; | |||
733 | pTmp->nIndex = 0; | |||
734 | } | |||
735 | break; | |||
736 | ||||
737 | case typelib_TypeClass_INTERFACE_ATTRIBUTE: | |||
738 | { | |||
739 | typelib_InterfaceAttributeTypeDescription * pTmp = new typelib_InterfaceAttributeTypeDescription(); | |||
740 | pRet = (typelib_TypeDescription *)pTmp; | |||
741 | #if OSL_DEBUG_LEVEL1 > 1 | |||
742 | osl_incrementInterlockedCount( | |||
743 | &Init::get().nInterfaceAttributeTypeDescriptionCount ); | |||
744 | #endif | |||
745 | pTmp->aBase.pMemberName = 0; | |||
746 | pTmp->pAttributeTypeRef = 0; | |||
747 | pTmp->pInterface = 0; | |||
748 | pTmp->pBaseRef = 0; | |||
749 | pTmp->nIndex = 0; | |||
750 | pTmp->nGetExceptions = 0; | |||
751 | pTmp->ppGetExceptions = 0; | |||
752 | pTmp->nSetExceptions = 0; | |||
753 | pTmp->ppSetExceptions = 0; | |||
754 | } | |||
755 | break; | |||
756 | ||||
757 | default: | |||
758 | { | |||
759 | pRet = new typelib_TypeDescription(); | |||
760 | #if OSL_DEBUG_LEVEL1 > 1 | |||
761 | osl_incrementInterlockedCount( &Init::get().nTypeDescriptionCount ); | |||
762 | #endif | |||
763 | } | |||
764 | } | |||
765 | ||||
766 | pRet->nRefCount = 1; // reference count is initially 1 | |||
767 | pRet->nStaticRefCount = 0; | |||
768 | pRet->eTypeClass = eTypeClass; | |||
769 | pRet->pTypeName = 0; | |||
770 | pRet->pUniqueIdentifier = 0; | |||
771 | pRet->pReserved = 0; | |||
772 | rtl_uString_acquire( pRet->pTypeName = pTypeName ); | |||
773 | pRet->pSelf = pRet; | |||
774 | pRet->bComplete = sal_True((sal_Bool)1); | |||
775 | pRet->nSize = 0; | |||
776 | pRet->nAlignment = 0; | |||
777 | pRet->pWeakRef = 0; | |||
778 | pRet->bOnDemand = sal_False((sal_Bool)0); | |||
779 | *ppRet = pRet; | |||
780 | } | |||
781 | ||||
782 | //------------------------------------------------------------------------ | |||
783 | namespace { | |||
784 | ||||
785 | void newTypeDescription( | |||
786 | typelib_TypeDescription ** ppRet, typelib_TypeClass eTypeClass, | |||
787 | rtl_uString * pTypeName, typelib_TypeDescriptionReference * pType, | |||
788 | sal_Int32 nMembers, typelib_CompoundMember_Init * pCompoundMembers, | |||
789 | typelib_StructMember_Init * pStructMembers) | |||
790 | { | |||
791 | OSL_ASSERT(do { if (true && (!((pCompoundMembers == 0 || pStructMembers == 0) && (pStructMembers == 0 || eTypeClass == typelib_TypeClass_STRUCT )))) { sal_detail_logFormat((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl" ), ("/usr/local/src/libreoffice/cppu/source/typelib/typelib.cxx" ":" "793" ": "), "OSL_ASSERT: %s", "(pCompoundMembers == 0 || pStructMembers == 0) && (pStructMembers == 0 || eTypeClass == typelib_TypeClass_STRUCT)" ); } } while (false) | |||
792 | (pCompoundMembers == 0 || pStructMembers == 0)do { if (true && (!((pCompoundMembers == 0 || pStructMembers == 0) && (pStructMembers == 0 || eTypeClass == typelib_TypeClass_STRUCT )))) { sal_detail_logFormat((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl" ), ("/usr/local/src/libreoffice/cppu/source/typelib/typelib.cxx" ":" "793" ": "), "OSL_ASSERT: %s", "(pCompoundMembers == 0 || pStructMembers == 0) && (pStructMembers == 0 || eTypeClass == typelib_TypeClass_STRUCT)" ); } } while (false) | |||
793 | && (pStructMembers == 0 || eTypeClass == typelib_TypeClass_STRUCT))do { if (true && (!((pCompoundMembers == 0 || pStructMembers == 0) && (pStructMembers == 0 || eTypeClass == typelib_TypeClass_STRUCT )))) { sal_detail_logFormat((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl" ), ("/usr/local/src/libreoffice/cppu/source/typelib/typelib.cxx" ":" "793" ": "), "OSL_ASSERT: %s", "(pCompoundMembers == 0 || pStructMembers == 0) && (pStructMembers == 0 || eTypeClass == typelib_TypeClass_STRUCT)" ); } } while (false); | |||
794 | if (typelib_TypeClass_TYPEDEF == eTypeClass) | |||
795 | { | |||
796 | OSL_TRACE( "### unexpected typedef!" )do { if (true && (1 > 0)) { sal_detail_logFormat(( SAL_DETAIL_LOG_LEVEL_INFO), ("legacy.osl"), ("/usr/local/src/libreoffice/cppu/source/typelib/typelib.cxx" ":" "796" ": "), "### unexpected typedef!"); } } while (false ); | |||
797 | typelib_typedescriptionreference_getDescription( ppRet, pType ); | |||
798 | return; | |||
799 | } | |||
800 | ||||
801 | typelib_typedescription_newEmpty( ppRet, eTypeClass, pTypeName ); | |||
802 | ||||
803 | switch( eTypeClass ) | |||
804 | { | |||
805 | case typelib_TypeClass_SEQUENCE: | |||
806 | { | |||
807 | OSL_ASSERT( nMembers == 0 )do { if (true && (!(nMembers == 0))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/cppu/source/typelib/typelib.cxx" ":" "807" ": "), "OSL_ASSERT: %s", "nMembers == 0"); } } while (false); | |||
808 | typelib_typedescriptionreference_acquire( pType ); | |||
809 | ((typelib_IndirectTypeDescription *)*ppRet)->pType = pType; | |||
810 | } | |||
811 | break; | |||
812 | ||||
813 | case typelib_TypeClass_EXCEPTION: | |||
814 | case typelib_TypeClass_STRUCT: | |||
815 | { | |||
816 | // FEATURE_EMPTYCLASS | |||
817 | typelib_CompoundTypeDescription * pTmp = (typelib_CompoundTypeDescription*)*ppRet; | |||
818 | ||||
819 | sal_Int32 nOffset = 0; | |||
820 | if( pType ) | |||
821 | { | |||
822 | typelib_typedescriptionreference_getDescription( | |||
823 | (typelib_TypeDescription **)&pTmp->pBaseTypeDescription, pType ); | |||
824 | nOffset = ((typelib_TypeDescription *)pTmp->pBaseTypeDescription)->nSize; | |||
825 | OSL_ENSURE( newAlignedSize( 0, ((typelib_TypeDescription *)pTmp->pBaseTypeDescription)->nSize, ((typelib_TypeDescription *)pTmp->pBaseTypeDescription)->nAlignment ) == ((typelib_TypeDescription *)pTmp->pBaseTypeDescription)->nSize, "### unexpected offset!" )do { if (true && (!(newAlignedSize( 0, ((typelib_TypeDescription *)pTmp->pBaseTypeDescription)->nSize, ((typelib_TypeDescription *)pTmp->pBaseTypeDescription)->nAlignment ) == ((typelib_TypeDescription *)pTmp->pBaseTypeDescription)->nSize))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/cppu/source/typelib/typelib.cxx" ":" "825" ": "), "%s", "### unexpected offset!"); } } while ( false); | |||
826 | } | |||
827 | if( nMembers ) | |||
828 | { | |||
829 | pTmp->nMembers = nMembers; | |||
830 | pTmp->pMemberOffsets = new sal_Int32[ nMembers ]; | |||
831 | pTmp->ppTypeRefs = new typelib_TypeDescriptionReference *[ nMembers ]; | |||
832 | pTmp->ppMemberNames = new rtl_uString *[ nMembers ]; | |||
833 | bool polymorphic = eTypeClass == typelib_TypeClass_STRUCT | |||
834 | && rtl::OUString::unacquired(&pTypeName).indexOf('<') >= 0; | |||
835 | OSL_ASSERT(!polymorphic || pStructMembers != 0)do { if (true && (!(!polymorphic || pStructMembers != 0))) { sal_detail_logFormat((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl" ), ("/usr/local/src/libreoffice/cppu/source/typelib/typelib.cxx" ":" "835" ": "), "OSL_ASSERT: %s", "!polymorphic || pStructMembers != 0" ); } } while (false); | |||
836 | if (polymorphic) { | |||
837 | reinterpret_cast< typelib_StructTypeDescription * >(pTmp)-> | |||
838 | pParameterizedTypes = new sal_Bool[nMembers]; | |||
839 | } | |||
840 | for( sal_Int32 i = 0 ; i < nMembers; i++ ) | |||
841 | { | |||
842 | // read the type and member names | |||
843 | pTmp->ppTypeRefs[i] = 0; | |||
844 | if (pCompoundMembers != 0) { | |||
845 | typelib_typedescriptionreference_new( | |||
846 | pTmp->ppTypeRefs +i, pCompoundMembers[i].eTypeClass, | |||
847 | pCompoundMembers[i].pTypeName ); | |||
848 | rtl_uString_acquire( | |||
849 | pTmp->ppMemberNames[i] | |||
850 | = pCompoundMembers[i].pMemberName ); | |||
851 | } else { | |||
852 | typelib_typedescriptionreference_new( | |||
853 | pTmp->ppTypeRefs +i, | |||
854 | pStructMembers[i].aBase.eTypeClass, | |||
855 | pStructMembers[i].aBase.pTypeName ); | |||
856 | rtl_uString_acquire( | |||
857 | pTmp->ppMemberNames[i] | |||
858 | = pStructMembers[i].aBase.pMemberName ); | |||
859 | } | |||
860 | // write offset | |||
861 | sal_Int32 size; | |||
862 | sal_Int32 alignment; | |||
863 | if (pTmp->ppTypeRefs[i]->eTypeClass == | |||
864 | typelib_TypeClass_SEQUENCE) | |||
865 | { | |||
866 | // Take care of recursion like | |||
867 | // struct S { sequence<S> x; }; | |||
868 | size = sizeof(void *); | |||
869 | alignment = adjustAlignment(size); | |||
870 | } else { | |||
871 | typelib_TypeDescription * pTD = 0; | |||
872 | TYPELIB_DANGER_GET( &pTD, pTmp->ppTypeRefs[i] ){ typelib_TypeDescriptionReference * pMacroTypeRef = (pTmp-> ppTypeRefs[i]); typelib_TypeDescription ** ppMacroTypeDescr = (&pTD); if (((pMacroTypeRef->eTypeClass) == typelib_TypeClass_INTERFACE_METHOD || (pMacroTypeRef->eTypeClass) == typelib_TypeClass_INTERFACE_ATTRIBUTE )) { typelib_typedescriptionreference_getDescription( ppMacroTypeDescr , pMacroTypeRef ); } else if (!pMacroTypeRef->pType || !pMacroTypeRef ->pType->pWeakRef) { typelib_typedescriptionreference_getDescription ( ppMacroTypeDescr, pMacroTypeRef ); if (*ppMacroTypeDescr) typelib_typedescription_release ( *ppMacroTypeDescr ); } else { *ppMacroTypeDescr = pMacroTypeRef ->pType; } }; | |||
873 | OSL_ENSURE( pTD->nSize, "### void member?" )do { if (true && (!(pTD->nSize))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/cppu/source/typelib/typelib.cxx" ":" "873" ": "), "%s", "### void member?"); } } while (false ); | |||
874 | size = pTD->nSize; | |||
875 | alignment = pTD->nAlignment; | |||
876 | TYPELIB_DANGER_RELEASE( pTD ){ if ((((pTD)->eTypeClass) == typelib_TypeClass_INTERFACE_METHOD || ((pTD)->eTypeClass) == typelib_TypeClass_INTERFACE_ATTRIBUTE )) typelib_typedescription_release( pTD ); }; | |||
877 | } | |||
878 | nOffset = newAlignedSize( nOffset, size, alignment ); | |||
879 | pTmp->pMemberOffsets[i] = nOffset - size; | |||
880 | ||||
881 | if (polymorphic) { | |||
882 | reinterpret_cast< typelib_StructTypeDescription * >( | |||
883 | pTmp)->pParameterizedTypes[i] | |||
884 | = pStructMembers[i].bParameterizedType; | |||
885 | } | |||
886 | } | |||
887 | } | |||
888 | } | |||
889 | break; | |||
890 | ||||
891 | default: | |||
892 | break; | |||
893 | } | |||
894 | ||||
895 | if( !reallyWeak( eTypeClass ) ) | |||
896 | (*ppRet)->pWeakRef = (typelib_TypeDescriptionReference *)*ppRet; | |||
897 | if( eTypeClass != typelib_TypeClass_VOID ) | |||
898 | { | |||
899 | // sizeof( void ) not allowed | |||
900 | (*ppRet)->nSize = typelib_typedescription_getAlignedUnoSize( (*ppRet), 0, (*ppRet)->nAlignment ); | |||
901 | (*ppRet)->nAlignment = adjustAlignment( (*ppRet)->nAlignment ); | |||
902 | } | |||
903 | } | |||
904 | ||||
905 | } | |||
906 | ||||
907 | extern "C" CPPU_DLLPUBLIC__attribute__ ((visibility("default"))) void SAL_CALL typelib_typedescription_new( | |||
908 | typelib_TypeDescription ** ppRet, | |||
909 | typelib_TypeClass eTypeClass, | |||
910 | rtl_uString * pTypeName, | |||
911 | typelib_TypeDescriptionReference * pType, | |||
912 | sal_Int32 nMembers, | |||
913 | typelib_CompoundMember_Init * pMembers ) | |||
914 | SAL_THROW_EXTERN_C()throw () | |||
915 | { | |||
916 | newTypeDescription( | |||
917 | ppRet, eTypeClass, pTypeName, pType, nMembers, pMembers, 0); | |||
918 | } | |||
919 | ||||
920 | extern "C" CPPU_DLLPUBLIC__attribute__ ((visibility("default"))) void SAL_CALL typelib_typedescription_newStruct( | |||
921 | typelib_TypeDescription ** ppRet, | |||
922 | rtl_uString * pTypeName, | |||
923 | typelib_TypeDescriptionReference * pType, | |||
924 | sal_Int32 nMembers, | |||
925 | typelib_StructMember_Init * pMembers ) | |||
926 | SAL_THROW_EXTERN_C()throw () | |||
927 | { | |||
928 | newTypeDescription( | |||
929 | ppRet, typelib_TypeClass_STRUCT, pTypeName, pType, nMembers, 0, | |||
930 | pMembers); | |||
931 | } | |||
932 | ||||
933 | //------------------------------------------------------------------------ | |||
934 | extern "C" CPPU_DLLPUBLIC__attribute__ ((visibility("default"))) void SAL_CALL typelib_typedescription_newUnion( | |||
935 | typelib_TypeDescription ** ppRet, | |||
936 | rtl_uString * pTypeName, | |||
937 | typelib_TypeDescriptionReference * pDiscriminantTypeRef, | |||
938 | sal_Int64 nDefaultDiscriminant, | |||
939 | typelib_TypeDescriptionReference * pDefaultTypeRef, | |||
940 | sal_Int32 nMembers, | |||
941 | typelib_Union_Init * pMembers ) | |||
942 | SAL_THROW_EXTERN_C()throw () | |||
943 | { | |||
944 | typelib_typedescription_newEmpty( ppRet, typelib_TypeClass_UNION, pTypeName ); | |||
945 | // discriminant type | |||
946 | typelib_UnionTypeDescription * pTmp = (typelib_UnionTypeDescription *)*ppRet; | |||
947 | typelib_typedescriptionreference_acquire( pTmp->pDiscriminantTypeRef = pDiscriminantTypeRef ); | |||
948 | ||||
949 | sal_Int32 nPos; | |||
950 | ||||
951 | pTmp->nMembers = nMembers; | |||
952 | // default discriminant | |||
953 | if (nMembers) | |||
954 | { | |||
955 | pTmp->pDiscriminants = new sal_Int64[ nMembers ]; | |||
956 | for ( nPos = nMembers; nPos--; ) | |||
957 | { | |||
958 | pTmp->pDiscriminants[nPos] = pMembers[nPos].nDiscriminant; | |||
959 | } | |||
960 | } | |||
961 | // default default discriminant | |||
962 | pTmp->nDefaultDiscriminant = nDefaultDiscriminant; | |||
963 | ||||
964 | // union member types | |||
965 | pTmp->ppTypeRefs = new typelib_TypeDescriptionReference *[ nMembers ]; | |||
966 | for ( nPos = nMembers; nPos--; ) | |||
967 | { | |||
968 | typelib_typedescriptionreference_acquire( pTmp->ppTypeRefs[nPos] = pMembers[nPos].pTypeRef ); | |||
969 | } | |||
970 | // union member names | |||
971 | pTmp->ppMemberNames = new rtl_uString *[ nMembers ]; | |||
972 | for ( nPos = nMembers; nPos--; ) | |||
973 | { | |||
974 | rtl_uString_acquire( pTmp->ppMemberNames[nPos] = pMembers[nPos].pMemberName ); | |||
975 | } | |||
976 | ||||
977 | // default union type | |||
978 | typelib_typedescriptionreference_acquire( pTmp->pDefaultTypeRef = pDefaultTypeRef ); | |||
979 | ||||
980 | if (! reallyWeak( typelib_TypeClass_UNION )) | |||
981 | (*ppRet)->pWeakRef = (typelib_TypeDescriptionReference *)*ppRet; | |||
982 | (*ppRet)->nSize = typelib_typedescription_getAlignedUnoSize( (*ppRet), 0, (*ppRet)->nAlignment ); | |||
983 | (*ppRet)->nAlignment = adjustAlignment( (*ppRet)->nAlignment ); | |||
984 | } | |||
985 | ||||
986 | //------------------------------------------------------------------------ | |||
987 | extern "C" CPPU_DLLPUBLIC__attribute__ ((visibility("default"))) void SAL_CALL typelib_typedescription_newEnum( | |||
988 | typelib_TypeDescription ** ppRet, | |||
989 | rtl_uString * pTypeName, | |||
990 | sal_Int32 nDefaultValue, | |||
991 | sal_Int32 nEnumValues, | |||
992 | rtl_uString ** ppEnumNames, | |||
993 | sal_Int32 * pEnumValues ) | |||
994 | SAL_THROW_EXTERN_C()throw () | |||
995 | { | |||
996 | typelib_typedescription_newEmpty( ppRet, typelib_TypeClass_ENUM, pTypeName ); | |||
997 | typelib_EnumTypeDescription * pEnum = (typelib_EnumTypeDescription *)*ppRet; | |||
998 | ||||
999 | pEnum->nDefaultEnumValue = nDefaultValue; | |||
1000 | pEnum->nEnumValues = nEnumValues; | |||
1001 | pEnum->ppEnumNames = new rtl_uString * [ nEnumValues ]; | |||
1002 | for ( sal_Int32 nPos = nEnumValues; nPos--; ) | |||
1003 | { | |||
1004 | rtl_uString_acquire( pEnum->ppEnumNames[nPos] = ppEnumNames[nPos] ); | |||
1005 | } | |||
1006 | pEnum->pEnumValues = new sal_Int32[ nEnumValues ]; | |||
1007 | ::memcpy( pEnum->pEnumValues, pEnumValues, nEnumValues * sizeof(sal_Int32) ); | |||
1008 | ||||
1009 | (*ppRet)->pWeakRef = (typelib_TypeDescriptionReference *)*ppRet; | |||
1010 | // sizeof( void ) not allowed | |||
1011 | (*ppRet)->nSize = typelib_typedescription_getAlignedUnoSize( (*ppRet), 0, (*ppRet)->nAlignment ); | |||
1012 | (*ppRet)->nAlignment = adjustAlignment( (*ppRet)->nAlignment ); | |||
1013 | } | |||
1014 | ||||
1015 | //------------------------------------------------------------------------ | |||
1016 | extern "C" CPPU_DLLPUBLIC__attribute__ ((visibility("default"))) void SAL_CALL typelib_typedescription_newArray( | |||
1017 | typelib_TypeDescription ** ppRet, | |||
1018 | typelib_TypeDescriptionReference * pElementTypeRef, | |||
1019 | sal_Int32 nDimensions, | |||
1020 | sal_Int32 * pDimensions ) | |||
1021 | SAL_THROW_EXTERN_C ()throw () | |||
1022 | { | |||
1023 | OUStringBuffer aBuf( 32 ); | |||
1024 | aBuf.append( pElementTypeRef->pTypeName ); | |||
1025 | sal_Int32 nElements = 1; | |||
1026 | for (sal_Int32 i=0; i < nDimensions; i++) | |||
1027 | { | |||
1028 | aBuf.appendAscii("["); | |||
1029 | aBuf.append(pDimensions[i]); | |||
1030 | aBuf.appendAscii("]"); | |||
1031 | nElements *= pDimensions[i]; | |||
1032 | } | |||
1033 | OUString aTypeName( aBuf.makeStringAndClear() ); | |||
1034 | ||||
1035 | ||||
1036 | typelib_typedescription_newEmpty( ppRet, typelib_TypeClass_ARRAY, aTypeName.pData ); | |||
1037 | typelib_ArrayTypeDescription * pArray = (typelib_ArrayTypeDescription *)*ppRet; | |||
1038 | ||||
1039 | pArray->nDimensions = nDimensions; | |||
1040 | pArray->nTotalElements = nElements; | |||
1041 | pArray->pDimensions = new sal_Int32[ nDimensions ]; | |||
1042 | ::memcpy( pArray->pDimensions, pDimensions, nDimensions * sizeof(sal_Int32) ); | |||
1043 | ||||
1044 | typelib_typedescriptionreference_acquire(pElementTypeRef); | |||
1045 | ((typelib_IndirectTypeDescription*)pArray)->pType = pElementTypeRef; | |||
1046 | ||||
1047 | (*ppRet)->pWeakRef = (typelib_TypeDescriptionReference *)*ppRet; | |||
1048 | // sizeof( void ) not allowed | |||
1049 | (*ppRet)->nSize = typelib_typedescription_getAlignedUnoSize( *ppRet, 0, (*ppRet)->nAlignment ); | |||
1050 | (*ppRet)->nAlignment = adjustAlignment( (*ppRet)->nAlignment ); | |||
1051 | } | |||
1052 | ||||
1053 | //------------------------------------------------------------------------ | |||
1054 | extern "C" CPPU_DLLPUBLIC__attribute__ ((visibility("default"))) void SAL_CALL typelib_typedescription_newInterface( | |||
1055 | typelib_InterfaceTypeDescription ** ppRet, | |||
1056 | rtl_uString * pTypeName, | |||
1057 | sal_uInt32 nUik1, sal_uInt16 nUik2, sal_uInt16 nUik3, sal_uInt32 nUik4, sal_uInt32 nUik5, | |||
1058 | typelib_TypeDescriptionReference * pBaseInterface, | |||
1059 | sal_Int32 nMembers, | |||
1060 | typelib_TypeDescriptionReference ** ppMembers ) | |||
1061 | SAL_THROW_EXTERN_C()throw () | |||
1062 | { | |||
1063 | typelib_typedescription_newMIInterface( | |||
1064 | ppRet, pTypeName, nUik1, nUik2, nUik3, nUik4, nUik5, | |||
1065 | pBaseInterface == 0 ? 0 : 1, &pBaseInterface, nMembers, ppMembers); | |||
| ||||
1066 | } | |||
1067 | ||||
1068 | //------------------------------------------------------------------------ | |||
1069 | ||||
1070 | namespace { | |||
1071 | ||||
1072 | class BaseList { | |||
1073 | public: | |||
1074 | struct Entry { | |||
1075 | sal_Int32 memberOffset; | |||
1076 | sal_Int32 directBaseIndex; | |||
1077 | sal_Int32 directBaseMemberOffset; | |||
1078 | typelib_InterfaceTypeDescription const * base; | |||
1079 | }; | |||
1080 | ||||
1081 | typedef std::vector< Entry > List; | |||
1082 | ||||
1083 | BaseList(typelib_InterfaceTypeDescription const * desc); | |||
1084 | ||||
1085 | List const & getList() const { return list; } | |||
1086 | ||||
1087 | sal_Int32 getBaseMembers() const { return members; } | |||
1088 | ||||
1089 | private: | |||
1090 | typedef std::set< rtl::OUString > Set; | |||
1091 | ||||
1092 | void calculate( | |||
1093 | sal_Int32 directBaseIndex, Set & directBaseSet, | |||
1094 | sal_Int32 * directBaseMembers, | |||
1095 | typelib_InterfaceTypeDescription const * desc); | |||
1096 | ||||
1097 | Set set; | |||
1098 | List list; | |||
1099 | sal_Int32 members; | |||
1100 | }; | |||
1101 | ||||
1102 | BaseList::BaseList(typelib_InterfaceTypeDescription const * desc) { | |||
1103 | members = 0; | |||
1104 | for (sal_Int32 i = 0; i < desc->nBaseTypes; ++i) { | |||
1105 | Set directBaseSet; | |||
1106 | sal_Int32 directBaseMembers = 0; | |||
1107 | calculate(i, directBaseSet, &directBaseMembers, desc->ppBaseTypes[i]); | |||
1108 | } | |||
1109 | } | |||
1110 | ||||
1111 | void BaseList::calculate( | |||
1112 | sal_Int32 directBaseIndex, Set & directBaseSet, | |||
1113 | sal_Int32 * directBaseMembers, | |||
1114 | typelib_InterfaceTypeDescription const * desc) | |||
1115 | { | |||
1116 | for (sal_Int32 i = 0; i < desc->nBaseTypes; ++i) { | |||
1117 | calculate( | |||
1118 | directBaseIndex, directBaseSet, directBaseMembers, | |||
1119 | desc->ppBaseTypes[i]); | |||
1120 | } | |||
1121 | if (set.insert(desc->aBase.pTypeName).second) { | |||
1122 | Entry e; | |||
1123 | e.memberOffset = members; | |||
1124 | e.directBaseIndex = directBaseIndex; | |||
1125 | e.directBaseMemberOffset = *directBaseMembers; | |||
1126 | e.base = desc; | |||
1127 | list.push_back(e); | |||
1128 | OSL_ASSERT(desc->ppAllMembers != 0)do { if (true && (!(desc->ppAllMembers != 0))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/cppu/source/typelib/typelib.cxx" ":" "1128" ": "), "OSL_ASSERT: %s", "desc->ppAllMembers != 0" ); } } while (false); | |||
1129 | members += desc->nMembers; | |||
1130 | } | |||
1131 | if (directBaseSet.insert(desc->aBase.pTypeName).second) { | |||
1132 | OSL_ASSERT(desc->ppAllMembers != 0)do { if (true && (!(desc->ppAllMembers != 0))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/cppu/source/typelib/typelib.cxx" ":" "1132" ": "), "OSL_ASSERT: %s", "desc->ppAllMembers != 0" ); } } while (false); | |||
1133 | *directBaseMembers += desc->nMembers; | |||
1134 | } | |||
1135 | } | |||
1136 | ||||
1137 | } | |||
1138 | ||||
1139 | extern "C" CPPU_DLLPUBLIC__attribute__ ((visibility("default"))) void SAL_CALL typelib_typedescription_newMIInterface( | |||
1140 | typelib_InterfaceTypeDescription ** ppRet, | |||
1141 | rtl_uString * pTypeName, | |||
1142 | sal_uInt32 nUik1, sal_uInt16 nUik2, sal_uInt16 nUik3, sal_uInt32 nUik4, sal_uInt32 nUik5, | |||
1143 | sal_Int32 nBaseInterfaces, | |||
1144 | typelib_TypeDescriptionReference ** ppBaseInterfaces, | |||
1145 | sal_Int32 nMembers, | |||
1146 | typelib_TypeDescriptionReference ** ppMembers ) | |||
1147 | SAL_THROW_EXTERN_C()throw () | |||
1148 | { | |||
1149 | if (*ppRet != 0) { | |||
1150 | typelib_typedescription_release(&(*ppRet)->aBase); | |||
1151 | *ppRet = 0; | |||
1152 | } | |||
1153 | ||||
1154 | typelib_InterfaceTypeDescription * pITD = 0; | |||
1155 | typelib_typedescription_newEmpty( | |||
1156 | (typelib_TypeDescription **)&pITD, typelib_TypeClass_INTERFACE, pTypeName ); | |||
1157 | ||||
1158 | pITD->nBaseTypes = nBaseInterfaces; | |||
1159 | pITD->ppBaseTypes = new typelib_InterfaceTypeDescription *[nBaseInterfaces]; | |||
1160 | for (sal_Int32 i = 0; i < nBaseInterfaces; ++i) { | |||
1161 | pITD->ppBaseTypes[i] = 0; | |||
1162 | typelib_typedescriptionreference_getDescription( | |||
1163 | reinterpret_cast< typelib_TypeDescription ** >( | |||
1164 | &pITD->ppBaseTypes[i]), | |||
1165 | ppBaseInterfaces[i]); | |||
1166 | if (pITD->ppBaseTypes[i] == 0 | |||
1167 | || !complete( | |||
1168 | reinterpret_cast< typelib_TypeDescription ** >( | |||
1169 | &pITD->ppBaseTypes[i]), | |||
1170 | false)) | |||
1171 | { | |||
1172 | OSL_ASSERT(false)do { if (true && (!(false))) { sal_detail_logFormat(( SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/cppu/source/typelib/typelib.cxx" ":" "1172" ": "), "OSL_ASSERT: %s", "false"); } } while (false ); | |||
1173 | return; | |||
1174 | } | |||
1175 | OSL_ASSERT(pITD->ppBaseTypes[i] != 0)do { if (true && (!(pITD->ppBaseTypes[i] != 0))) { sal_detail_logFormat((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl" ), ("/usr/local/src/libreoffice/cppu/source/typelib/typelib.cxx" ":" "1175" ": "), "OSL_ASSERT: %s", "pITD->ppBaseTypes[i] != 0" ); } } while (false); | |||
1176 | } | |||
1177 | if (nBaseInterfaces > 0) { | |||
1178 | pITD->pBaseTypeDescription = pITD->ppBaseTypes[0]; | |||
1179 | } | |||
1180 | // set the | |||
1181 | pITD->aUik.m_Data1 = nUik1; | |||
1182 | pITD->aUik.m_Data2 = nUik2; | |||
1183 | pITD->aUik.m_Data3 = nUik3; | |||
1184 | pITD->aUik.m_Data4 = nUik4; | |||
1185 | pITD->aUik.m_Data5 = nUik5; | |||
1186 | ||||
1187 | BaseList aBaseList(pITD); | |||
1188 | pITD->nAllMembers = nMembers + aBaseList.getBaseMembers(); | |||
1189 | pITD->nMembers = nMembers; | |||
1190 | ||||
1191 | if( pITD->nAllMembers ) | |||
1192 | { | |||
1193 | // at minimum one member exist, allocate the memory | |||
1194 | pITD->ppAllMembers = new typelib_TypeDescriptionReference *[ pITD->nAllMembers ]; | |||
1195 | sal_Int32 n = 0; | |||
1196 | ||||
1197 | BaseList::List const & rList = aBaseList.getList(); | |||
1198 | {for (BaseList::List::const_iterator i(rList.begin()); i != rList.end(); | |||
1199 | ++i) | |||
1200 | { | |||
1201 | typelib_InterfaceTypeDescription const * pBase = i->base; | |||
1202 | typelib_InterfaceTypeDescription const * pDirectBase | |||
1203 | = pITD->ppBaseTypes[i->directBaseIndex]; | |||
1204 | OSL_ASSERT(pBase->ppAllMembers != 0)do { if (true && (!(pBase->ppAllMembers != 0))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/cppu/source/typelib/typelib.cxx" ":" "1204" ": "), "OSL_ASSERT: %s", "pBase->ppAllMembers != 0" ); } } while (false); | |||
1205 | for (sal_Int32 j = 0; j < pBase->nMembers; ++j) { | |||
1206 | typelib_TypeDescriptionReference const * pDirectBaseMember | |||
1207 | = pDirectBase->ppAllMembers[i->directBaseMemberOffset + j]; | |||
1208 | rtl::OUStringBuffer aBuf(pDirectBaseMember->pTypeName); | |||
1209 | aBuf.appendAscii(RTL_CONSTASCII_STRINGPARAM(":@")(&(":@")[0]), ((sal_Int32)(sizeof (":@") / sizeof ((":@") [0]))-1)); | |||
1210 | aBuf.append(i->directBaseIndex); | |||
1211 | aBuf.append(static_cast< sal_Unicode >(',')); | |||
1212 | aBuf.append(i->memberOffset + j); | |||
1213 | aBuf.append(static_cast< sal_Unicode >(':')); | |||
1214 | aBuf.append(pITD->aBase.pTypeName); | |||
1215 | rtl::OUString aName(aBuf.makeStringAndClear()); | |||
1216 | typelib_TypeDescriptionReference * pDerivedMember = 0; | |||
1217 | typelib_typedescriptionreference_new( | |||
1218 | &pDerivedMember, pDirectBaseMember->eTypeClass, | |||
1219 | aName.pData); | |||
1220 | pITD->ppAllMembers[n++] = pDerivedMember; | |||
1221 | } | |||
1222 | }} | |||
1223 | ||||
1224 | if( nMembers ) | |||
1225 | { | |||
1226 | pITD->ppMembers = pITD->ppAllMembers + aBaseList.getBaseMembers(); | |||
1227 | } | |||
1228 | ||||
1229 | // add own members | |||
1230 | {for( sal_Int32 i = 0; i < nMembers; i++ ) | |||
1231 | { | |||
1232 | typelib_typedescriptionreference_acquire( ppMembers[i] ); | |||
1233 | pITD->ppAllMembers[n++] = ppMembers[i]; | |||
1234 | }} | |||
1235 | } | |||
1236 | ||||
1237 | typelib_TypeDescription * pTmp = (typelib_TypeDescription *)pITD; | |||
1238 | if( !reallyWeak( typelib_TypeClass_INTERFACE ) ) | |||
1239 | pTmp->pWeakRef = (typelib_TypeDescriptionReference *)pTmp; | |||
1240 | pTmp->nSize = typelib_typedescription_getAlignedUnoSize( pTmp, 0, pTmp->nAlignment ); | |||
1241 | pTmp->nAlignment = adjustAlignment( pTmp->nAlignment ); | |||
1242 | pTmp->bComplete = sal_False((sal_Bool)0); | |||
1243 | ||||
1244 | *ppRet = pITD; | |||
1245 | } | |||
1246 | ||||
1247 | //------------------------------------------------------------------------ | |||
1248 | ||||
1249 | namespace { | |||
1250 | ||||
1251 | typelib_TypeDescriptionReference ** copyExceptions( | |||
1252 | sal_Int32 count, rtl_uString ** typeNames) | |||
1253 | { | |||
1254 | OSL_ASSERT(count >= 0)do { if (true && (!(count >= 0))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/cppu/source/typelib/typelib.cxx" ":" "1254" ": "), "OSL_ASSERT: %s", "count >= 0"); } } while (false); | |||
1255 | if (count == 0) { | |||
1256 | return 0; | |||
1257 | } | |||
1258 | typelib_TypeDescriptionReference ** p | |||
1259 | = new typelib_TypeDescriptionReference *[count]; | |||
1260 | for (sal_Int32 i = 0; i < count; ++i) { | |||
1261 | p[i] = 0; | |||
1262 | typelib_typedescriptionreference_new( | |||
1263 | p + i, typelib_TypeClass_EXCEPTION, typeNames[i]); | |||
1264 | } | |||
1265 | return p; | |||
1266 | } | |||
1267 | ||||
1268 | } | |||
1269 | ||||
1270 | extern "C" CPPU_DLLPUBLIC__attribute__ ((visibility("default"))) void SAL_CALL typelib_typedescription_newInterfaceMethod( | |||
1271 | typelib_InterfaceMethodTypeDescription ** ppRet, | |||
1272 | sal_Int32 nAbsolutePosition, | |||
1273 | sal_Bool bOneWay, | |||
1274 | rtl_uString * pTypeName, | |||
1275 | typelib_TypeClass eReturnTypeClass, | |||
1276 | rtl_uString * pReturnTypeName, | |||
1277 | sal_Int32 nParams, | |||
1278 | typelib_Parameter_Init * pParams, | |||
1279 | sal_Int32 nExceptions, | |||
1280 | rtl_uString ** ppExceptionNames ) | |||
1281 | SAL_THROW_EXTERN_C()throw () | |||
1282 | { | |||
1283 | if (*ppRet != 0) { | |||
1284 | typelib_typedescription_release(&(*ppRet)->aBase.aBase); | |||
1285 | *ppRet = 0; | |||
1286 | } | |||
1287 | sal_Int32 nOffset = rtl_ustr_lastIndexOfChar_WithLength( | |||
1288 | pTypeName->buffer, pTypeName->length, ':'); | |||
1289 | if (nOffset <= 0 || pTypeName->buffer[nOffset - 1] != ':') { | |||
1290 | OSL_FAIL("Bad interface method type name")do { if (true && (((sal_Bool)1))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/cppu/source/typelib/typelib.cxx" ":" "1290" ": "), "%s", "Bad interface method type name"); } } while (false); | |||
1291 | return; | |||
1292 | } | |||
1293 | rtl::OUString aInterfaceTypeName(pTypeName->buffer, nOffset - 1); | |||
1294 | typelib_InterfaceTypeDescription * pInterface = 0; | |||
1295 | typelib_typedescription_getByName( | |||
1296 | reinterpret_cast< typelib_TypeDescription ** >(&pInterface), | |||
1297 | aInterfaceTypeName.pData); | |||
1298 | if (pInterface == 0 | |||
1299 | || pInterface->aBase.eTypeClass != typelib_TypeClass_INTERFACE | |||
1300 | || !complete( | |||
1301 | reinterpret_cast< typelib_TypeDescription ** >(&pInterface), false)) | |||
1302 | { | |||
1303 | OSL_FAIL("No interface corresponding to interface method")do { if (true && (((sal_Bool)1))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/cppu/source/typelib/typelib.cxx" ":" "1303" ": "), "%s", "No interface corresponding to interface method" ); } } while (false); | |||
1304 | return; | |||
1305 | } | |||
1306 | ||||
1307 | typelib_typedescription_newEmpty( | |||
1308 | (typelib_TypeDescription **)ppRet, typelib_TypeClass_INTERFACE_METHOD, pTypeName ); | |||
1309 | typelib_TypeDescription * pTmp = (typelib_TypeDescription *)*ppRet; | |||
1310 | ||||
1311 | rtl_uString_newFromStr_WithLength( &(*ppRet)->aBase.pMemberName, | |||
1312 | pTypeName->buffer + nOffset +1, | |||
1313 | pTypeName->length - nOffset -1 ); | |||
1314 | (*ppRet)->aBase.nPosition = nAbsolutePosition; | |||
1315 | (*ppRet)->bOneWay = bOneWay; | |||
1316 | typelib_typedescriptionreference_new( &(*ppRet)->pReturnTypeRef, eReturnTypeClass, pReturnTypeName ); | |||
1317 | (*ppRet)->nParams = nParams; | |||
1318 | if( nParams ) | |||
1319 | { | |||
1320 | (*ppRet)->pParams = new typelib_MethodParameter[ nParams ]; | |||
1321 | ||||
1322 | for( sal_Int32 i = 0; i < nParams; i++ ) | |||
1323 | { | |||
1324 | // get the name of the parameter | |||
1325 | (*ppRet)->pParams[ i ].pName = 0; | |||
1326 | rtl_uString_acquire( (*ppRet)->pParams[ i ].pName = pParams[i].pParamName ); | |||
1327 | (*ppRet)->pParams[ i ].pTypeRef = 0; | |||
1328 | // get the type name of the parameter and create the weak reference | |||
1329 | typelib_typedescriptionreference_new( | |||
1330 | &(*ppRet)->pParams[ i ].pTypeRef, pParams[i].eTypeClass, pParams[i].pTypeName ); | |||
1331 | (*ppRet)->pParams[ i ].bIn = pParams[i].bIn; | |||
1332 | (*ppRet)->pParams[ i ].bOut = pParams[i].bOut; | |||
1333 | } | |||
1334 | } | |||
1335 | (*ppRet)->nExceptions = nExceptions; | |||
1336 | (*ppRet)->ppExceptions = copyExceptions(nExceptions, ppExceptionNames); | |||
1337 | (*ppRet)->pInterface = pInterface; | |||
1338 | (*ppRet)->pBaseRef = 0; | |||
1339 | OSL_ASSERT(do { if (true && (!((nAbsolutePosition >= pInterface ->nAllMembers - pInterface->nMembers) && nAbsolutePosition < pInterface->nAllMembers))) { sal_detail_logFormat((SAL_DETAIL_LOG_LEVEL_WARN ), ("legacy.osl"), ("/usr/local/src/libreoffice/cppu/source/typelib/typelib.cxx" ":" "1341" ": "), "OSL_ASSERT: %s", "(nAbsolutePosition >= pInterface->nAllMembers - pInterface->nMembers) && nAbsolutePosition < pInterface->nAllMembers" ); } } while (false) | |||
1340 | (nAbsolutePosition >= pInterface->nAllMembers - pInterface->nMembers)do { if (true && (!((nAbsolutePosition >= pInterface ->nAllMembers - pInterface->nMembers) && nAbsolutePosition < pInterface->nAllMembers))) { sal_detail_logFormat((SAL_DETAIL_LOG_LEVEL_WARN ), ("legacy.osl"), ("/usr/local/src/libreoffice/cppu/source/typelib/typelib.cxx" ":" "1341" ": "), "OSL_ASSERT: %s", "(nAbsolutePosition >= pInterface->nAllMembers - pInterface->nMembers) && nAbsolutePosition < pInterface->nAllMembers" ); } } while (false) | |||
1341 | && nAbsolutePosition < pInterface->nAllMembers)do { if (true && (!((nAbsolutePosition >= pInterface ->nAllMembers - pInterface->nMembers) && nAbsolutePosition < pInterface->nAllMembers))) { sal_detail_logFormat((SAL_DETAIL_LOG_LEVEL_WARN ), ("legacy.osl"), ("/usr/local/src/libreoffice/cppu/source/typelib/typelib.cxx" ":" "1341" ": "), "OSL_ASSERT: %s", "(nAbsolutePosition >= pInterface->nAllMembers - pInterface->nMembers) && nAbsolutePosition < pInterface->nAllMembers" ); } } while (false); | |||
1342 | (*ppRet)->nIndex = nAbsolutePosition | |||
1343 | - (pInterface->nAllMembers - pInterface->nMembers); | |||
1344 | if( !reallyWeak( typelib_TypeClass_INTERFACE_METHOD ) ) | |||
1345 | pTmp->pWeakRef = (typelib_TypeDescriptionReference *)pTmp; | |||
1346 | } | |||
1347 | ||||
1348 | ||||
1349 | //------------------------------------------------------------------------ | |||
1350 | extern "C" CPPU_DLLPUBLIC__attribute__ ((visibility("default"))) void SAL_CALL typelib_typedescription_newInterfaceAttribute( | |||
1351 | typelib_InterfaceAttributeTypeDescription ** ppRet, | |||
1352 | sal_Int32 nAbsolutePosition, | |||
1353 | rtl_uString * pTypeName, | |||
1354 | typelib_TypeClass eAttributeTypeClass, | |||
1355 | rtl_uString * pAttributeTypeName, | |||
1356 | sal_Bool bReadOnly ) | |||
1357 | SAL_THROW_EXTERN_C()throw () | |||
1358 | { | |||
1359 | typelib_typedescription_newExtendedInterfaceAttribute( | |||
1360 | ppRet, nAbsolutePosition, pTypeName, eAttributeTypeClass, | |||
1361 | pAttributeTypeName, bReadOnly, 0, 0, 0, 0); | |||
1362 | } | |||
1363 | ||||
1364 | //------------------------------------------------------------------------ | |||
1365 | extern "C" CPPU_DLLPUBLIC__attribute__ ((visibility("default"))) void SAL_CALL typelib_typedescription_newExtendedInterfaceAttribute( | |||
1366 | typelib_InterfaceAttributeTypeDescription ** ppRet, | |||
1367 | sal_Int32 nAbsolutePosition, | |||
1368 | rtl_uString * pTypeName, | |||
1369 | typelib_TypeClass eAttributeTypeClass, | |||
1370 | rtl_uString * pAttributeTypeName, | |||
1371 | sal_Bool bReadOnly, | |||
1372 | sal_Int32 nGetExceptions, rtl_uString ** ppGetExceptionNames, | |||
1373 | sal_Int32 nSetExceptions, rtl_uString ** ppSetExceptionNames ) | |||
1374 | SAL_THROW_EXTERN_C()throw () | |||
1375 | { | |||
1376 | if (*ppRet != 0) { | |||
1377 | typelib_typedescription_release(&(*ppRet)->aBase.aBase); | |||
1378 | *ppRet = 0; | |||
1379 | } | |||
1380 | sal_Int32 nOffset = rtl_ustr_lastIndexOfChar_WithLength( | |||
1381 | pTypeName->buffer, pTypeName->length, ':'); | |||
1382 | if (nOffset <= 0 || pTypeName->buffer[nOffset - 1] != ':') { | |||
1383 | OSL_FAIL("Bad interface attribute type name")do { if (true && (((sal_Bool)1))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/cppu/source/typelib/typelib.cxx" ":" "1383" ": "), "%s", "Bad interface attribute type name") ; } } while (false); | |||
1384 | return; | |||
1385 | } | |||
1386 | rtl::OUString aInterfaceTypeName(pTypeName->buffer, nOffset - 1); | |||
1387 | typelib_InterfaceTypeDescription * pInterface = 0; | |||
1388 | typelib_typedescription_getByName( | |||
1389 | reinterpret_cast< typelib_TypeDescription ** >(&pInterface), | |||
1390 | aInterfaceTypeName.pData); | |||
1391 | if (pInterface == 0 | |||
1392 | || pInterface->aBase.eTypeClass != typelib_TypeClass_INTERFACE | |||
1393 | || !complete( | |||
1394 | reinterpret_cast< typelib_TypeDescription ** >(&pInterface), false)) | |||
1395 | { | |||
1396 | OSL_FAIL("No interface corresponding to interface attribute")do { if (true && (((sal_Bool)1))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/cppu/source/typelib/typelib.cxx" ":" "1396" ": "), "%s", "No interface corresponding to interface attribute" ); } } while (false); | |||
1397 | return; | |||
1398 | } | |||
1399 | ||||
1400 | typelib_typedescription_newEmpty( | |||
1401 | (typelib_TypeDescription **)ppRet, typelib_TypeClass_INTERFACE_ATTRIBUTE, pTypeName ); | |||
1402 | typelib_TypeDescription * pTmp = (typelib_TypeDescription *)*ppRet; | |||
1403 | ||||
1404 | rtl_uString_newFromStr_WithLength( &(*ppRet)->aBase.pMemberName, | |||
1405 | pTypeName->buffer + nOffset +1, | |||
1406 | pTypeName->length - nOffset -1 ); | |||
1407 | (*ppRet)->aBase.nPosition = nAbsolutePosition; | |||
1408 | typelib_typedescriptionreference_new( &(*ppRet)->pAttributeTypeRef, eAttributeTypeClass, pAttributeTypeName ); | |||
1409 | (*ppRet)->bReadOnly = bReadOnly; | |||
1410 | (*ppRet)->pInterface = pInterface; | |||
1411 | (*ppRet)->pBaseRef = 0; | |||
1412 | OSL_ASSERT(do { if (true && (!((nAbsolutePosition >= pInterface ->nAllMembers - pInterface->nMembers) && nAbsolutePosition < pInterface->nAllMembers))) { sal_detail_logFormat((SAL_DETAIL_LOG_LEVEL_WARN ), ("legacy.osl"), ("/usr/local/src/libreoffice/cppu/source/typelib/typelib.cxx" ":" "1414" ": "), "OSL_ASSERT: %s", "(nAbsolutePosition >= pInterface->nAllMembers - pInterface->nMembers) && nAbsolutePosition < pInterface->nAllMembers" ); } } while (false) | |||
1413 | (nAbsolutePosition >= pInterface->nAllMembers - pInterface->nMembers)do { if (true && (!((nAbsolutePosition >= pInterface ->nAllMembers - pInterface->nMembers) && nAbsolutePosition < pInterface->nAllMembers))) { sal_detail_logFormat((SAL_DETAIL_LOG_LEVEL_WARN ), ("legacy.osl"), ("/usr/local/src/libreoffice/cppu/source/typelib/typelib.cxx" ":" "1414" ": "), "OSL_ASSERT: %s", "(nAbsolutePosition >= pInterface->nAllMembers - pInterface->nMembers) && nAbsolutePosition < pInterface->nAllMembers" ); } } while (false) | |||
1414 | && nAbsolutePosition < pInterface->nAllMembers)do { if (true && (!((nAbsolutePosition >= pInterface ->nAllMembers - pInterface->nMembers) && nAbsolutePosition < pInterface->nAllMembers))) { sal_detail_logFormat((SAL_DETAIL_LOG_LEVEL_WARN ), ("legacy.osl"), ("/usr/local/src/libreoffice/cppu/source/typelib/typelib.cxx" ":" "1414" ": "), "OSL_ASSERT: %s", "(nAbsolutePosition >= pInterface->nAllMembers - pInterface->nMembers) && nAbsolutePosition < pInterface->nAllMembers" ); } } while (false); | |||
1415 | (*ppRet)->nIndex = nAbsolutePosition | |||
1416 | - (pInterface->nAllMembers - pInterface->nMembers); | |||
1417 | (*ppRet)->nGetExceptions = nGetExceptions; | |||
1418 | (*ppRet)->ppGetExceptions = copyExceptions( | |||
1419 | nGetExceptions, ppGetExceptionNames); | |||
1420 | (*ppRet)->nSetExceptions = nSetExceptions; | |||
1421 | (*ppRet)->ppSetExceptions = copyExceptions( | |||
1422 | nSetExceptions, ppSetExceptionNames); | |||
1423 | if( !reallyWeak( typelib_TypeClass_INTERFACE_ATTRIBUTE ) ) | |||
1424 | pTmp->pWeakRef = (typelib_TypeDescriptionReference *)pTmp; | |||
1425 | } | |||
1426 | ||||
1427 | //------------------------------------------------------------------------ | |||
1428 | extern "C" CPPU_DLLPUBLIC__attribute__ ((visibility("default"))) void SAL_CALL typelib_typedescription_acquire( | |||
1429 | typelib_TypeDescription * pTypeDescription ) | |||
1430 | SAL_THROW_EXTERN_C()throw () | |||
1431 | { | |||
1432 | ::osl_incrementInterlockedCount( &pTypeDescription->nRefCount ); | |||
1433 | } | |||
1434 | ||||
1435 | //------------------------------------------------------------------------ | |||
1436 | ||||
1437 | namespace { | |||
1438 | ||||
1439 | void deleteExceptions( | |||
1440 | sal_Int32 count, typelib_TypeDescriptionReference ** exceptions) | |||
1441 | { | |||
1442 | for (sal_Int32 i = 0; i < count; ++i) { | |||
1443 | typelib_typedescriptionreference_release(exceptions[i]); | |||
1444 | } | |||
1445 | delete[] exceptions; | |||
1446 | } | |||
1447 | ||||
1448 | } | |||
1449 | ||||
1450 | // frees anything except typelib_TypeDescription base! | |||
1451 | static inline void typelib_typedescription_destructExtendedMembers( | |||
1452 | typelib_TypeDescription * pTD ) | |||
1453 | SAL_THROW(()) | |||
1454 | { | |||
1455 | OSL_ASSERT( typelib_TypeClass_TYPEDEF != pTD->eTypeClass )do { if (true && (!(typelib_TypeClass_TYPEDEF != pTD-> eTypeClass))) { sal_detail_logFormat((SAL_DETAIL_LOG_LEVEL_WARN ), ("legacy.osl"), ("/usr/local/src/libreoffice/cppu/source/typelib/typelib.cxx" ":" "1455" ": "), "OSL_ASSERT: %s", "typelib_TypeClass_TYPEDEF != pTD->eTypeClass" ); } } while (false); | |||
1456 | ||||
1457 | switch( pTD->eTypeClass ) | |||
1458 | { | |||
1459 | case typelib_TypeClass_ARRAY: | |||
1460 | if( ((typelib_IndirectTypeDescription*)pTD)->pType ) | |||
1461 | typelib_typedescriptionreference_release( ((typelib_IndirectTypeDescription*)pTD)->pType ); | |||
1462 | delete [] ((typelib_ArrayTypeDescription *)pTD)->pDimensions; | |||
1463 | break; | |||
1464 | case typelib_TypeClass_SEQUENCE: | |||
1465 | if( ((typelib_IndirectTypeDescription*)pTD)->pType ) | |||
1466 | typelib_typedescriptionreference_release( ((typelib_IndirectTypeDescription*)pTD)->pType ); | |||
1467 | break; | |||
1468 | case typelib_TypeClass_UNION: | |||
1469 | { | |||
1470 | typelib_UnionTypeDescription * pUnionTD = (typelib_UnionTypeDescription *)pTD; | |||
1471 | typelib_typedescriptionreference_release( pUnionTD->pDiscriminantTypeRef ); | |||
1472 | typelib_typedescriptionreference_release( pUnionTD->pDefaultTypeRef ); | |||
1473 | ||||
1474 | sal_Int32 nPos; | |||
1475 | typelib_TypeDescriptionReference ** ppTypeRefs = pUnionTD->ppTypeRefs; | |||
1476 | for ( nPos = pUnionTD->nMembers; nPos--; ) | |||
1477 | { | |||
1478 | typelib_typedescriptionreference_release( ppTypeRefs[nPos] ); | |||
1479 | } | |||
1480 | ||||
1481 | rtl_uString ** ppMemberNames = pUnionTD->ppMemberNames; | |||
1482 | for ( nPos = pUnionTD->nMembers; nPos--; ) | |||
1483 | { | |||
1484 | rtl_uString_release( ppMemberNames[nPos] ); | |||
1485 | } | |||
1486 | delete [] pUnionTD->ppMemberNames; | |||
1487 | delete [] pUnionTD->pDiscriminants; | |||
1488 | delete [] pUnionTD->ppTypeRefs; | |||
1489 | } | |||
1490 | break; | |||
1491 | case typelib_TypeClass_STRUCT: | |||
1492 | delete[] reinterpret_cast< typelib_StructTypeDescription * >(pTD)-> | |||
1493 | pParameterizedTypes; | |||
1494 | case typelib_TypeClass_EXCEPTION: | |||
1495 | { | |||
1496 | typelib_CompoundTypeDescription * pCTD = (typelib_CompoundTypeDescription*)pTD; | |||
1497 | if( pCTD->pBaseTypeDescription ) | |||
1498 | typelib_typedescription_release( (typelib_TypeDescription *)pCTD->pBaseTypeDescription ); | |||
1499 | sal_Int32 i; | |||
1500 | for( i = 0; i < pCTD->nMembers; i++ ) | |||
1501 | { | |||
1502 | typelib_typedescriptionreference_release( pCTD->ppTypeRefs[i] ); | |||
1503 | } | |||
1504 | if (pCTD->ppMemberNames) | |||
1505 | { | |||
1506 | for ( i = 0; i < pCTD->nMembers; i++ ) | |||
1507 | { | |||
1508 | rtl_uString_release( pCTD->ppMemberNames[i] ); | |||
1509 | } | |||
1510 | delete [] pCTD->ppMemberNames; | |||
1511 | } | |||
1512 | delete [] pCTD->ppTypeRefs; | |||
1513 | delete [] pCTD->pMemberOffsets; | |||
1514 | } | |||
1515 | break; | |||
1516 | case typelib_TypeClass_INTERFACE: | |||
1517 | { | |||
1518 | typelib_InterfaceTypeDescription * pITD = (typelib_InterfaceTypeDescription*)pTD; | |||
1519 | {for( sal_Int32 i = 0; i < pITD->nAllMembers; i++ ) | |||
1520 | { | |||
1521 | typelib_typedescriptionreference_release( pITD->ppAllMembers[i] ); | |||
1522 | }} | |||
1523 | delete [] pITD->ppAllMembers; | |||
1524 | delete [] pITD->pMapMemberIndexToFunctionIndex; | |||
1525 | delete [] pITD->pMapFunctionIndexToMemberIndex; | |||
1526 | {for (sal_Int32 i = 0; i < pITD->nBaseTypes; ++i) { | |||
1527 | typelib_typedescription_release( | |||
1528 | reinterpret_cast< typelib_TypeDescription * >( | |||
1529 | pITD->ppBaseTypes[i])); | |||
1530 | }} | |||
1531 | delete[] pITD->ppBaseTypes; | |||
1532 | break; | |||
1533 | } | |||
1534 | case typelib_TypeClass_INTERFACE_METHOD: | |||
1535 | { | |||
1536 | typelib_InterfaceMethodTypeDescription * pIMTD = (typelib_InterfaceMethodTypeDescription*)pTD; | |||
1537 | if( pIMTD->pReturnTypeRef ) | |||
1538 | typelib_typedescriptionreference_release( pIMTD->pReturnTypeRef ); | |||
1539 | for( sal_Int32 i = 0; i < pIMTD->nParams; i++ ) | |||
1540 | { | |||
1541 | rtl_uString_release( pIMTD->pParams[ i ].pName ); | |||
1542 | typelib_typedescriptionreference_release( pIMTD->pParams[ i ].pTypeRef ); | |||
1543 | } | |||
1544 | delete [] pIMTD->pParams; | |||
1545 | deleteExceptions(pIMTD->nExceptions, pIMTD->ppExceptions); | |||
1546 | rtl_uString_release( pIMTD->aBase.pMemberName ); | |||
1547 | typelib_typedescription_release(&pIMTD->pInterface->aBase); | |||
1548 | if (pIMTD->pBaseRef != 0) { | |||
1549 | typelib_typedescriptionreference_release(pIMTD->pBaseRef); | |||
1550 | } | |||
1551 | } | |||
1552 | break; | |||
1553 | case typelib_TypeClass_INTERFACE_ATTRIBUTE: | |||
1554 | { | |||
1555 | typelib_InterfaceAttributeTypeDescription * pIATD = (typelib_InterfaceAttributeTypeDescription*)pTD; | |||
1556 | deleteExceptions(pIATD->nGetExceptions, pIATD->ppGetExceptions); | |||
1557 | deleteExceptions(pIATD->nSetExceptions, pIATD->ppSetExceptions); | |||
1558 | if( pIATD->pAttributeTypeRef ) | |||
1559 | typelib_typedescriptionreference_release( pIATD->pAttributeTypeRef ); | |||
1560 | if( pIATD->aBase.pMemberName ) | |||
1561 | rtl_uString_release( pIATD->aBase.pMemberName ); | |||
1562 | typelib_typedescription_release(&pIATD->pInterface->aBase); | |||
1563 | if (pIATD->pBaseRef != 0) { | |||
1564 | typelib_typedescriptionreference_release(pIATD->pBaseRef); | |||
1565 | } | |||
1566 | } | |||
1567 | break; | |||
1568 | case typelib_TypeClass_ENUM: | |||
1569 | { | |||
1570 | typelib_EnumTypeDescription * pEnum = (typelib_EnumTypeDescription *)pTD; | |||
1571 | for ( sal_Int32 nPos = pEnum->nEnumValues; nPos--; ) | |||
1572 | { | |||
1573 | rtl_uString_release( pEnum->ppEnumNames[nPos] ); | |||
1574 | } | |||
1575 | delete [] pEnum->ppEnumNames; | |||
1576 | delete [] pEnum->pEnumValues; | |||
1577 | } | |||
1578 | break; | |||
1579 | default: | |||
1580 | break; | |||
1581 | } | |||
1582 | } | |||
1583 | ||||
1584 | //------------------------------------------------------------------------ | |||
1585 | extern "C" CPPU_DLLPUBLIC__attribute__ ((visibility("default"))) void SAL_CALL typelib_typedescription_release( | |||
1586 | typelib_TypeDescription * pTD ) | |||
1587 | SAL_THROW_EXTERN_C()throw () | |||
1588 | { | |||
1589 | sal_Int32 ref = ::osl_decrementInterlockedCount( &pTD->nRefCount ); | |||
1590 | OSL_ASSERT(ref >= 0)do { if (true && (!(ref >= 0))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/cppu/source/typelib/typelib.cxx" ":" "1590" ": "), "OSL_ASSERT: %s", "ref >= 0"); } } while (false); | |||
1591 | if (0 == ref) | |||
1592 | { | |||
1593 | TypeDescriptor_Init_Impl &rInit = Init::get(); | |||
1594 | if( reallyWeak( pTD->eTypeClass ) ) | |||
1595 | { | |||
1596 | if( pTD->pWeakRef ) | |||
1597 | { | |||
1598 | { | |||
1599 | MutexGuard aGuard( rInit.getMutex() ); | |||
1600 | // remove this description from the weak reference | |||
1601 | pTD->pWeakRef->pType = 0; | |||
1602 | } | |||
1603 | typelib_typedescriptionreference_release( pTD->pWeakRef ); | |||
1604 | } | |||
1605 | } | |||
1606 | else | |||
1607 | { | |||
1608 | // this description is a reference too, so remove it from the hash table | |||
1609 | if( rInit.pWeakMap ) | |||
1610 | { | |||
1611 | MutexGuard aGuard( rInit.getMutex() ); | |||
1612 | WeakMap_Impl::iterator aIt = rInit.pWeakMap->find( (sal_Unicode*)pTD->pTypeName->buffer ); | |||
1613 | if( aIt != rInit.pWeakMap->end() && (void *)(*aIt).second == (void *)pTD ) | |||
1614 | { | |||
1615 | // remove only if it contains the same object | |||
1616 | rInit.pWeakMap->erase( aIt ); | |||
1617 | } | |||
1618 | } | |||
1619 | } | |||
1620 | ||||
1621 | typelib_typedescription_destructExtendedMembers( pTD ); | |||
1622 | rtl_uString_release( pTD->pTypeName ); | |||
1623 | ||||
1624 | #if OSL_DEBUG_LEVEL1 > 1 | |||
1625 | switch( pTD->eTypeClass ) | |||
1626 | { | |||
1627 | case typelib_TypeClass_ARRAY: | |||
1628 | osl_decrementInterlockedCount( &rInit.nArrayTypeDescriptionCount ); | |||
1629 | break; | |||
1630 | case typelib_TypeClass_SEQUENCE: | |||
1631 | osl_decrementInterlockedCount( &rInit.nIndirectTypeDescriptionCount ); | |||
1632 | break; | |||
1633 | case typelib_TypeClass_UNION: | |||
1634 | osl_decrementInterlockedCount( &rInit.nUnionTypeDescriptionCount ); | |||
1635 | break; | |||
1636 | case typelib_TypeClass_STRUCT: | |||
1637 | case typelib_TypeClass_EXCEPTION: | |||
1638 | osl_decrementInterlockedCount( &rInit.nCompoundTypeDescriptionCount ); | |||
1639 | break; | |||
1640 | case typelib_TypeClass_INTERFACE: | |||
1641 | osl_decrementInterlockedCount( &rInit.nInterfaceTypeDescriptionCount ); | |||
1642 | break; | |||
1643 | case typelib_TypeClass_INTERFACE_METHOD: | |||
1644 | osl_decrementInterlockedCount( &rInit.nInterfaceMethodTypeDescriptionCount ); | |||
1645 | break; | |||
1646 | case typelib_TypeClass_INTERFACE_ATTRIBUTE: | |||
1647 | osl_decrementInterlockedCount( &rInit.nInterfaceAttributeTypeDescriptionCount ); | |||
1648 | break; | |||
1649 | case typelib_TypeClass_ENUM: | |||
1650 | osl_decrementInterlockedCount( &rInit.nEnumTypeDescriptionCount ); | |||
1651 | break; | |||
1652 | default: | |||
1653 | osl_decrementInterlockedCount( &rInit.nTypeDescriptionCount ); | |||
1654 | } | |||
1655 | #endif | |||
1656 | ||||
1657 | delete pTD; | |||
1658 | } | |||
1659 | } | |||
1660 | ||||
1661 | //------------------------------------------------------------------------ | |||
1662 | extern "C" CPPU_DLLPUBLIC__attribute__ ((visibility("default"))) void SAL_CALL typelib_typedescription_register( | |||
1663 | typelib_TypeDescription ** ppNewDescription ) | |||
1664 | SAL_THROW_EXTERN_C()throw () | |||
1665 | { | |||
1666 | // connect the description with the weak reference | |||
1667 | TypeDescriptor_Init_Impl &rInit = Init::get(); | |||
1668 | ClearableMutexGuard aGuard( rInit.getMutex() ); | |||
1669 | ||||
1670 | typelib_TypeDescriptionReference * pTDR = 0; | |||
1671 | typelib_typedescriptionreference_getByName( &pTDR, (*ppNewDescription)->pTypeName ); | |||
1672 | ||||
1673 | OSL_ASSERT( (*ppNewDescription)->pWeakRef || reallyWeak( (*ppNewDescription)->eTypeClass ) )do { if (true && (!((*ppNewDescription)->pWeakRef || reallyWeak( (*ppNewDescription)->eTypeClass )))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/cppu/source/typelib/typelib.cxx" ":" "1673" ": "), "OSL_ASSERT: %s", "(*ppNewDescription)->pWeakRef || reallyWeak( (*ppNewDescription)->eTypeClass )" ); } } while (false); | |||
1674 | if( pTDR ) | |||
1675 | { | |||
1676 | OSL_ASSERT( (*ppNewDescription)->eTypeClass == pTDR->eTypeClass )do { if (true && (!((*ppNewDescription)->eTypeClass == pTDR->eTypeClass))) { sal_detail_logFormat((SAL_DETAIL_LOG_LEVEL_WARN ), ("legacy.osl"), ("/usr/local/src/libreoffice/cppu/source/typelib/typelib.cxx" ":" "1676" ": "), "OSL_ASSERT: %s", "(*ppNewDescription)->eTypeClass == pTDR->eTypeClass" ); } } while (false); | |||
1677 | if( pTDR->pType ) | |||
1678 | { | |||
1679 | if (reallyWeak( pTDR->eTypeClass )) | |||
1680 | { | |||
1681 | // pRef->pType->pWeakRef == 0 means that the description is empty | |||
1682 | if (pTDR->pType->pWeakRef) | |||
1683 | { | |||
1684 | if (osl_incrementInterlockedCount( &pTDR->pType->nRefCount ) > 1) | |||
1685 | { | |||
1686 | // The refence is incremented. The object cannot be destroyed. | |||
1687 | // Release the guard at the earliest point. | |||
1688 | aGuard.clear(); | |||
1689 | ::typelib_typedescription_release( *ppNewDescription ); | |||
1690 | *ppNewDescription = pTDR->pType; | |||
1691 | ::typelib_typedescriptionreference_release( pTDR ); | |||
1692 | return; | |||
1693 | } | |||
1694 | else | |||
1695 | { | |||
1696 | // destruction of this type in progress (another thread!) | |||
1697 | osl_decrementInterlockedCount( &pTDR->pType->nRefCount ); | |||
1698 | } | |||
1699 | } | |||
1700 | // take new descr | |||
1701 | pTDR->pType = *ppNewDescription; | |||
1702 | OSL_ASSERT( ! (*ppNewDescription)->pWeakRef )do { if (true && (!(! (*ppNewDescription)->pWeakRef ))) { sal_detail_logFormat((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl" ), ("/usr/local/src/libreoffice/cppu/source/typelib/typelib.cxx" ":" "1702" ": "), "OSL_ASSERT: %s", "! (*ppNewDescription)->pWeakRef" ); } } while (false); | |||
1703 | (*ppNewDescription)->pWeakRef = pTDR; | |||
1704 | return; | |||
1705 | } | |||
1706 | // !reallyWeak | |||
1707 | ||||
1708 | if (((void *)pTDR != (void *)*ppNewDescription) && // if different | |||
1709 | (!pTDR->pType->pWeakRef || // uninit: ref data only set | |||
1710 | // new one is complete: | |||
1711 | (!pTDR->pType->bComplete && (*ppNewDescription)->bComplete) || | |||
1712 | // new one may be partly initialized interface (except of tables): | |||
1713 | (typelib_TypeClass_INTERFACE == pTDR->pType->eTypeClass && | |||
1714 | !((typelib_InterfaceTypeDescription *)pTDR->pType)->ppAllMembers && | |||
1715 | (*(typelib_InterfaceTypeDescription **)ppNewDescription)->ppAllMembers))) | |||
1716 | { | |||
1717 | // uninitialized or incomplete | |||
1718 | ||||
1719 | if (pTDR->pType->pWeakRef) // if init | |||
1720 | { | |||
1721 | typelib_typedescription_destructExtendedMembers( pTDR->pType ); | |||
1722 | } | |||
1723 | ||||
1724 | // pTDR->pType->pWeakRef == 0 means that the description is empty | |||
1725 | // description is not weak and the not the same | |||
1726 | sal_Int32 nSize = getDescriptionSize( (*ppNewDescription)->eTypeClass ); | |||
1727 | ||||
1728 | // copy all specific data for the descriptions | |||
1729 | memcpy( | |||
1730 | pTDR->pType +1, | |||
1731 | *ppNewDescription +1, | |||
1732 | nSize - sizeof(typelib_TypeDescription) ); | |||
1733 | ||||
1734 | pTDR->pType->bComplete = (*ppNewDescription)->bComplete; | |||
1735 | pTDR->pType->nSize = (*ppNewDescription)->nSize; | |||
1736 | pTDR->pType->nAlignment = (*ppNewDescription)->nAlignment; | |||
1737 | ||||
1738 | memset( | |||
1739 | *ppNewDescription +1, | |||
1740 | 0, | |||
1741 | nSize - sizeof( typelib_TypeDescription ) ); | |||
1742 | ||||
1743 | if( pTDR->pType->bOnDemand && !(*ppNewDescription)->bOnDemand ) | |||
1744 | { | |||
1745 | // switch from OnDemand to !OnDemand, so the description must be acquired | |||
1746 | typelib_typedescription_acquire( pTDR->pType ); | |||
1747 | } | |||
1748 | else if( !pTDR->pType->bOnDemand && (*ppNewDescription)->bOnDemand ) | |||
1749 | { | |||
1750 | // switch from !OnDemand to OnDemand, so the description must be relesed | |||
1751 | typelib_typedescription_release( pTDR->pType ); | |||
1752 | } | |||
1753 | ||||
1754 | pTDR->pType->bOnDemand = (*ppNewDescription)->bOnDemand; | |||
1755 | // initialized | |||
1756 | pTDR->pType->pWeakRef = pTDR; | |||
1757 | } | |||
1758 | ||||
1759 | typelib_typedescription_release( *ppNewDescription ); | |||
1760 | // pTDR was acquired by getByName(), so it must not be acquired again | |||
1761 | *ppNewDescription = pTDR->pType; | |||
1762 | return; | |||
1763 | } | |||
1764 | } | |||
1765 | else if( reallyWeak( (*ppNewDescription)->eTypeClass) ) | |||
1766 | { | |||
1767 | typelib_typedescriptionreference_new( | |||
1768 | &pTDR, (*ppNewDescription)->eTypeClass, (*ppNewDescription)->pTypeName ); | |||
1769 | } | |||
1770 | else | |||
1771 | { | |||
1772 | pTDR = (typelib_TypeDescriptionReference *)*ppNewDescription; | |||
1773 | if( !rInit.pWeakMap ) | |||
1774 | rInit.pWeakMap = new WeakMap_Impl; | |||
1775 | ||||
1776 | // description is the weak itself, so register it | |||
1777 | (*rInit.pWeakMap)[pTDR->pTypeName->buffer] = pTDR; | |||
1778 | OSL_ASSERT( (void *)*ppNewDescription == (void *)pTDR )do { if (true && (!((void *)*ppNewDescription == (void *)pTDR))) { sal_detail_logFormat((SAL_DETAIL_LOG_LEVEL_WARN) , ("legacy.osl"), ("/usr/local/src/libreoffice/cppu/source/typelib/typelib.cxx" ":" "1778" ": "), "OSL_ASSERT: %s", "(void *)*ppNewDescription == (void *)pTDR" ); } } while (false); | |||
1779 | } | |||
1780 | ||||
1781 | // By default this reference is not really weak. The reference hold the description | |||
1782 | // and the description hold the reference. | |||
1783 | if( !(*ppNewDescription)->bOnDemand ) | |||
1784 | { | |||
1785 | // nor OnDemand so the description must be acquired if registered | |||
1786 | typelib_typedescription_acquire( *ppNewDescription ); | |||
1787 | } | |||
1788 | ||||
1789 | pTDR->pType = *ppNewDescription; | |||
1790 | (*ppNewDescription)->pWeakRef = pTDR; | |||
1791 | OSL_ASSERT( rtl_ustr_compare( pTDR->pTypeName->buffer, (*ppNewDescription)->pTypeName->buffer ) == 0 )do { if (true && (!(rtl_ustr_compare( pTDR->pTypeName ->buffer, (*ppNewDescription)->pTypeName->buffer ) == 0))) { sal_detail_logFormat((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl" ), ("/usr/local/src/libreoffice/cppu/source/typelib/typelib.cxx" ":" "1791" ": "), "OSL_ASSERT: %s", "rtl_ustr_compare( pTDR->pTypeName->buffer, (*ppNewDescription)->pTypeName->buffer ) == 0" ); } } while (false); | |||
1792 | OSL_ASSERT( pTDR->eTypeClass == (*ppNewDescription)->eTypeClass )do { if (true && (!(pTDR->eTypeClass == (*ppNewDescription )->eTypeClass))) { sal_detail_logFormat((SAL_DETAIL_LOG_LEVEL_WARN ), ("legacy.osl"), ("/usr/local/src/libreoffice/cppu/source/typelib/typelib.cxx" ":" "1792" ": "), "OSL_ASSERT: %s", "pTDR->eTypeClass == (*ppNewDescription)->eTypeClass" ); } } while (false); | |||
1793 | } | |||
1794 | ||||
1795 | //------------------------------------------------------------------------ | |||
1796 | static inline sal_Bool type_equals( | |||
1797 | typelib_TypeDescriptionReference * p1, typelib_TypeDescriptionReference * p2 ) | |||
1798 | SAL_THROW(()) | |||
1799 | { | |||
1800 | return (p1 == p2 || | |||
1801 | (p1->eTypeClass == p2->eTypeClass && | |||
1802 | p1->pTypeName->length == p2->pTypeName->length && | |||
1803 | rtl_ustr_compare( p1->pTypeName->buffer, p2->pTypeName->buffer ) == 0)); | |||
1804 | } | |||
1805 | extern "C" CPPU_DLLPUBLIC__attribute__ ((visibility("default"))) sal_Bool SAL_CALL typelib_typedescription_equals( | |||
1806 | const typelib_TypeDescription * p1, const typelib_TypeDescription * p2 ) | |||
1807 | SAL_THROW_EXTERN_C()throw () | |||
1808 | { | |||
1809 | return type_equals( | |||
1810 | (typelib_TypeDescriptionReference *)p1, (typelib_TypeDescriptionReference *)p2 ); | |||
1811 | } | |||
1812 | ||||
1813 | //------------------------------------------------------------------------ | |||
1814 | extern "C" sal_Int32 SAL_CALL typelib_typedescription_getAlignedUnoSize( | |||
1815 | const typelib_TypeDescription * pTypeDescription, | |||
1816 | sal_Int32 nOffset, sal_Int32 & rMaxIntegralTypeSize ) | |||
1817 | SAL_THROW_EXTERN_C()throw () | |||
1818 | { | |||
1819 | sal_Int32 nSize; | |||
1820 | if( pTypeDescription->nSize ) | |||
1821 | { | |||
1822 | // size and alignment are set | |||
1823 | rMaxIntegralTypeSize = pTypeDescription->nAlignment; | |||
1824 | nSize = pTypeDescription->nSize; | |||
1825 | } | |||
1826 | else | |||
1827 | { | |||
1828 | nSize = 0; | |||
1829 | rMaxIntegralTypeSize = 1; | |||
1830 | ||||
1831 | OSL_ASSERT( typelib_TypeClass_TYPEDEF != pTypeDescription->eTypeClass )do { if (true && (!(typelib_TypeClass_TYPEDEF != pTypeDescription ->eTypeClass))) { sal_detail_logFormat((SAL_DETAIL_LOG_LEVEL_WARN ), ("legacy.osl"), ("/usr/local/src/libreoffice/cppu/source/typelib/typelib.cxx" ":" "1831" ": "), "OSL_ASSERT: %s", "typelib_TypeClass_TYPEDEF != pTypeDescription->eTypeClass" ); } } while (false); | |||
1832 | ||||
1833 | switch( pTypeDescription->eTypeClass ) | |||
1834 | { | |||
1835 | case typelib_TypeClass_INTERFACE: | |||
1836 | // FEATURE_INTERFACE | |||
1837 | nSize = rMaxIntegralTypeSize = (sal_Int32)(sizeof( void * )); | |||
1838 | break; | |||
1839 | case typelib_TypeClass_UNION: | |||
1840 | { | |||
1841 | nSize = rMaxIntegralTypeSize = (sal_Int32)(sizeof(sal_Int64)); | |||
1842 | for ( sal_Int32 nPos = ((typelib_UnionTypeDescription *)pTypeDescription)->nMembers; nPos--; ) | |||
1843 | { | |||
1844 | typelib_TypeDescription * pTD = 0; | |||
1845 | TYPELIB_DANGER_GET( &pTD, ((typelib_UnionTypeDescription *)pTypeDescription)->ppTypeRefs[nPos] ){ typelib_TypeDescriptionReference * pMacroTypeRef = (((typelib_UnionTypeDescription *)pTypeDescription)->ppTypeRefs[nPos]); typelib_TypeDescription ** ppMacroTypeDescr = (&pTD); if (((pMacroTypeRef->eTypeClass ) == typelib_TypeClass_INTERFACE_METHOD || (pMacroTypeRef-> eTypeClass) == typelib_TypeClass_INTERFACE_ATTRIBUTE)) { typelib_typedescriptionreference_getDescription ( ppMacroTypeDescr, pMacroTypeRef ); } else if (!pMacroTypeRef ->pType || !pMacroTypeRef->pType->pWeakRef) { typelib_typedescriptionreference_getDescription ( ppMacroTypeDescr, pMacroTypeRef ); if (*ppMacroTypeDescr) typelib_typedescription_release ( *ppMacroTypeDescr ); } else { *ppMacroTypeDescr = pMacroTypeRef ->pType; } }; | |||
1846 | sal_Int32 nMaxIntegralTypeSize; | |||
1847 | sal_Int32 nMemberSize = typelib_typedescription_getAlignedUnoSize( pTD, (sal_Int32)(sizeof(sal_Int64)), nMaxIntegralTypeSize ); | |||
1848 | TYPELIB_DANGER_RELEASE( pTD ){ if ((((pTD)->eTypeClass) == typelib_TypeClass_INTERFACE_METHOD || ((pTD)->eTypeClass) == typelib_TypeClass_INTERFACE_ATTRIBUTE )) typelib_typedescription_release( pTD ); }; | |||
1849 | if (nSize < nMemberSize) | |||
1850 | nSize = nMemberSize; | |||
1851 | if (rMaxIntegralTypeSize < nMaxIntegralTypeSize) | |||
1852 | rMaxIntegralTypeSize = nMaxIntegralTypeSize; | |||
1853 | } | |||
1854 | ((typelib_UnionTypeDescription *)pTypeDescription)->nValueOffset = rMaxIntegralTypeSize; | |||
1855 | } | |||
1856 | break; | |||
1857 | case typelib_TypeClass_ENUM: | |||
1858 | nSize = rMaxIntegralTypeSize = (sal_Int32)(sizeof( typelib_TypeClass )); | |||
1859 | break; | |||
1860 | case typelib_TypeClass_STRUCT: | |||
1861 | case typelib_TypeClass_EXCEPTION: | |||
1862 | // FEATURE_EMPTYCLASS | |||
1863 | { | |||
1864 | typelib_CompoundTypeDescription * pTmp = (typelib_CompoundTypeDescription *)pTypeDescription; | |||
1865 | sal_Int32 nStructSize = 0; | |||
1866 | if( pTmp->pBaseTypeDescription ) | |||
1867 | { | |||
1868 | // inherit structs extends the base struct. | |||
1869 | nStructSize = pTmp->pBaseTypeDescription->aBase.nSize; | |||
1870 | rMaxIntegralTypeSize = pTmp->pBaseTypeDescription->aBase.nAlignment; | |||
1871 | } | |||
1872 | for( sal_Int32 i = 0; i < pTmp->nMembers; i++ ) | |||
1873 | { | |||
1874 | typelib_TypeDescription * pMemberType = 0; | |||
1875 | typelib_TypeDescriptionReference * pMemberRef = pTmp->ppTypeRefs[i]; | |||
1876 | ||||
1877 | sal_Int32 nMaxIntegral; | |||
1878 | if (pMemberRef->eTypeClass == typelib_TypeClass_INTERFACE | |||
1879 | || pMemberRef->eTypeClass == typelib_TypeClass_SEQUENCE) | |||
1880 | { | |||
1881 | nMaxIntegral = (sal_Int32)(sizeof(void *)); | |||
1882 | nStructSize = newAlignedSize( nStructSize, nMaxIntegral, nMaxIntegral ); | |||
1883 | } | |||
1884 | else | |||
1885 | { | |||
1886 | TYPELIB_DANGER_GET( &pMemberType, pMemberRef ){ typelib_TypeDescriptionReference * pMacroTypeRef = (pMemberRef ); typelib_TypeDescription ** ppMacroTypeDescr = (&pMemberType ); if (((pMacroTypeRef->eTypeClass) == typelib_TypeClass_INTERFACE_METHOD || (pMacroTypeRef->eTypeClass) == typelib_TypeClass_INTERFACE_ATTRIBUTE )) { typelib_typedescriptionreference_getDescription( ppMacroTypeDescr , pMacroTypeRef ); } else if (!pMacroTypeRef->pType || !pMacroTypeRef ->pType->pWeakRef) { typelib_typedescriptionreference_getDescription ( ppMacroTypeDescr, pMacroTypeRef ); if (*ppMacroTypeDescr) typelib_typedescription_release ( *ppMacroTypeDescr ); } else { *ppMacroTypeDescr = pMacroTypeRef ->pType; } }; | |||
1887 | nStructSize = typelib_typedescription_getAlignedUnoSize( | |||
1888 | pMemberType, nStructSize, nMaxIntegral ); | |||
1889 | TYPELIB_DANGER_RELEASE( pMemberType ){ if ((((pMemberType)->eTypeClass) == typelib_TypeClass_INTERFACE_METHOD || ((pMemberType)->eTypeClass) == typelib_TypeClass_INTERFACE_ATTRIBUTE )) typelib_typedescription_release( pMemberType ); }; | |||
1890 | } | |||
1891 | if( nMaxIntegral > rMaxIntegralTypeSize ) | |||
1892 | rMaxIntegralTypeSize = nMaxIntegral; | |||
1893 | } | |||
1894 | #ifdef __m68k__ | |||
1895 | // Anything that is at least 16 bits wide is aligned on a 16-bit | |||
1896 | // boundary on the m68k default abi | |||
1897 | sal_Int32 nMaxAlign = (rMaxIntegralTypeSize > 2) ? 2 : rMaxIntegralTypeSize; | |||
1898 | nStructSize = (nStructSize + nMaxAlign -1) / nMaxAlign * nMaxAlign; | |||
1899 | #else | |||
1900 | // Example: A { double; int; } structure has a size of 16 instead of 10. The | |||
1901 | // compiler must follow this rule if it is possible to access members in arrays through: | |||
1902 | // (Element *)((char *)pArray + sizeof( Element ) * ElementPos) | |||
1903 | nStructSize = (nStructSize + rMaxIntegralTypeSize -1) | |||
1904 | / rMaxIntegralTypeSize * rMaxIntegralTypeSize; | |||
1905 | #endif | |||
1906 | nSize += nStructSize; | |||
1907 | } | |||
1908 | break; | |||
1909 | case typelib_TypeClass_ARRAY: | |||
1910 | { | |||
1911 | typelib_TypeDescription * pTD = 0; | |||
1912 | TYPELIB_DANGER_GET( &pTD, ((typelib_IndirectTypeDescription *)pTypeDescription)->pType ){ typelib_TypeDescriptionReference * pMacroTypeRef = (((typelib_IndirectTypeDescription *)pTypeDescription)->pType); typelib_TypeDescription ** ppMacroTypeDescr = (&pTD); if (((pMacroTypeRef->eTypeClass) == typelib_TypeClass_INTERFACE_METHOD || (pMacroTypeRef->eTypeClass) == typelib_TypeClass_INTERFACE_ATTRIBUTE )) { typelib_typedescriptionreference_getDescription( ppMacroTypeDescr , pMacroTypeRef ); } else if (!pMacroTypeRef->pType || !pMacroTypeRef ->pType->pWeakRef) { typelib_typedescriptionreference_getDescription ( ppMacroTypeDescr, pMacroTypeRef ); if (*ppMacroTypeDescr) typelib_typedescription_release ( *ppMacroTypeDescr ); } else { *ppMacroTypeDescr = pMacroTypeRef ->pType; } }; | |||
1913 | rMaxIntegralTypeSize = pTD->nSize; | |||
1914 | TYPELIB_DANGER_RELEASE( pTD ){ if ((((pTD)->eTypeClass) == typelib_TypeClass_INTERFACE_METHOD || ((pTD)->eTypeClass) == typelib_TypeClass_INTERFACE_ATTRIBUTE )) typelib_typedescription_release( pTD ); }; | |||
1915 | nSize = ((typelib_ArrayTypeDescription *)pTypeDescription)->nTotalElements * rMaxIntegralTypeSize; | |||
1916 | } | |||
1917 | break; | |||
1918 | case typelib_TypeClass_SEQUENCE: | |||
1919 | nSize = rMaxIntegralTypeSize = (sal_Int32)(sizeof( void * )); | |||
1920 | break; | |||
1921 | case typelib_TypeClass_ANY: | |||
1922 | // FEATURE_ANY | |||
1923 | nSize = (sal_Int32)(sizeof( uno_Any )); | |||
1924 | rMaxIntegralTypeSize = (sal_Int32)(sizeof( void * )); | |||
1925 | break; | |||
1926 | case typelib_TypeClass_TYPE: | |||
1927 | nSize = rMaxIntegralTypeSize = (sal_Int32)(sizeof( typelib_TypeDescriptionReference * )); | |||
1928 | break; | |||
1929 | case typelib_TypeClass_BOOLEAN: | |||
1930 | nSize = rMaxIntegralTypeSize = (sal_Int32)(sizeof( sal_Bool )); | |||
1931 | break; | |||
1932 | case typelib_TypeClass_CHAR: | |||
1933 | nSize = rMaxIntegralTypeSize = (sal_Int32)(sizeof( sal_Unicode )); | |||
1934 | break; | |||
1935 | case typelib_TypeClass_STRING: | |||
1936 | // FEATURE_STRING | |||
1937 | nSize = rMaxIntegralTypeSize = (sal_Int32)(sizeof( rtl_uString * )); | |||
1938 | break; | |||
1939 | case typelib_TypeClass_FLOAT: | |||
1940 | nSize = rMaxIntegralTypeSize = (sal_Int32)(sizeof( float )); | |||
1941 | break; | |||
1942 | case typelib_TypeClass_DOUBLE: | |||
1943 | #ifdef AIX | |||
1944 | //See previous AIX ifdef comment for an explanation | |||
1945 | nSize = (sal_Int32)(sizeof(double)); | |||
1946 | rMaxIntegralTypeSize = (sal_Int32)(sizeof(void*)); | |||
1947 | #else | |||
1948 | nSize = rMaxIntegralTypeSize = (sal_Int32)(sizeof( double )); | |||
1949 | #endif | |||
1950 | break; | |||
1951 | case typelib_TypeClass_BYTE: | |||
1952 | nSize = rMaxIntegralTypeSize = (sal_Int32)(sizeof( sal_Int8 )); | |||
1953 | break; | |||
1954 | case typelib_TypeClass_SHORT: | |||
1955 | case typelib_TypeClass_UNSIGNED_SHORT: | |||
1956 | nSize = rMaxIntegralTypeSize = (sal_Int32)(sizeof( sal_Int16 )); | |||
1957 | break; | |||
1958 | case typelib_TypeClass_LONG: | |||
1959 | case typelib_TypeClass_UNSIGNED_LONG: | |||
1960 | nSize = rMaxIntegralTypeSize = (sal_Int32)(sizeof( sal_Int32 )); | |||
1961 | break; | |||
1962 | case typelib_TypeClass_HYPER: | |||
1963 | case typelib_TypeClass_UNSIGNED_HYPER: | |||
1964 | nSize = rMaxIntegralTypeSize = (sal_Int32)(sizeof( sal_Int64 )); | |||
1965 | break; | |||
1966 | case typelib_TypeClass_UNKNOWN: | |||
1967 | case typelib_TypeClass_SERVICE: | |||
1968 | case typelib_TypeClass_MODULE: | |||
1969 | default: | |||
1970 | OSL_FAIL( "not convertable type" )do { if (true && (((sal_Bool)1))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/cppu/source/typelib/typelib.cxx" ":" "1970" ": "), "%s", "not convertable type"); } } while ( false); | |||
1971 | }; | |||
1972 | } | |||
1973 | ||||
1974 | return newAlignedSize( nOffset, nSize, rMaxIntegralTypeSize ); | |||
1975 | } | |||
1976 | ||||
1977 | //------------------------------------------------------------------------ | |||
1978 | ||||
1979 | namespace { | |||
1980 | ||||
1981 | typelib_TypeDescriptionReference ** copyExceptions( | |||
1982 | sal_Int32 count, typelib_TypeDescriptionReference ** source) | |||
1983 | { | |||
1984 | typelib_TypeDescriptionReference ** p | |||
1985 | = new typelib_TypeDescriptionReference *[count]; | |||
1986 | for (sal_Int32 i = 0; i < count; ++i) { | |||
1987 | typelib_typedescriptionreference_acquire(p[i] = source[i]); | |||
1988 | } | |||
1989 | return p; | |||
1990 | } | |||
1991 | ||||
1992 | bool createDerivedInterfaceMemberDescription( | |||
1993 | typelib_TypeDescription ** result, rtl::OUString const & name, | |||
1994 | typelib_TypeDescriptionReference * baseRef, | |||
1995 | typelib_TypeDescription const * base, typelib_TypeDescription * interface, | |||
1996 | sal_Int32 index, sal_Int32 position) | |||
1997 | { | |||
1998 | if (baseRef != 0 && base != 0 && interface != 0) { | |||
1999 | switch (base->eTypeClass) { | |||
2000 | case typelib_TypeClass_INTERFACE_METHOD: | |||
2001 | { | |||
2002 | typelib_typedescription_newEmpty( | |||
2003 | result, typelib_TypeClass_INTERFACE_METHOD, name.pData); | |||
2004 | typelib_InterfaceMethodTypeDescription const * baseMethod | |||
2005 | = reinterpret_cast< | |||
2006 | typelib_InterfaceMethodTypeDescription const * >(base); | |||
2007 | typelib_InterfaceMethodTypeDescription * newMethod | |||
2008 | = reinterpret_cast< | |||
2009 | typelib_InterfaceMethodTypeDescription * >(*result); | |||
2010 | newMethod->aBase.nPosition = position; | |||
2011 | rtl_uString_acquire( | |||
2012 | newMethod->aBase.pMemberName | |||
2013 | = baseMethod->aBase.pMemberName); | |||
2014 | typelib_typedescriptionreference_acquire( | |||
2015 | newMethod->pReturnTypeRef = baseMethod->pReturnTypeRef); | |||
2016 | newMethod->nParams = baseMethod->nParams; | |||
2017 | newMethod->pParams = new typelib_MethodParameter[ | |||
2018 | newMethod->nParams]; | |||
2019 | for (sal_Int32 i = 0; i < newMethod->nParams; ++i) { | |||
2020 | rtl_uString_acquire( | |||
2021 | newMethod->pParams[i].pName | |||
2022 | = baseMethod->pParams[i].pName); | |||
2023 | typelib_typedescriptionreference_acquire( | |||
2024 | newMethod->pParams[i].pTypeRef | |||
2025 | = baseMethod->pParams[i].pTypeRef); | |||
2026 | newMethod->pParams[i].bIn = baseMethod->pParams[i].bIn; | |||
2027 | newMethod->pParams[i].bOut = baseMethod->pParams[i].bOut; | |||
2028 | } | |||
2029 | newMethod->nExceptions = baseMethod->nExceptions; | |||
2030 | newMethod->ppExceptions = copyExceptions( | |||
2031 | baseMethod->nExceptions, baseMethod->ppExceptions); | |||
2032 | newMethod->bOneWay = baseMethod->bOneWay; | |||
2033 | newMethod->pInterface | |||
2034 | = reinterpret_cast< typelib_InterfaceTypeDescription * >( | |||
2035 | interface); | |||
2036 | newMethod->pBaseRef = baseRef; | |||
2037 | newMethod->nIndex = index; | |||
2038 | return true; | |||
2039 | } | |||
2040 | ||||
2041 | case typelib_TypeClass_INTERFACE_ATTRIBUTE: | |||
2042 | { | |||
2043 | typelib_typedescription_newEmpty( | |||
2044 | result, typelib_TypeClass_INTERFACE_ATTRIBUTE, name.pData); | |||
2045 | typelib_InterfaceAttributeTypeDescription const * baseAttribute | |||
2046 | = reinterpret_cast< | |||
2047 | typelib_InterfaceAttributeTypeDescription const * >(base); | |||
2048 | typelib_InterfaceAttributeTypeDescription * newAttribute | |||
2049 | = reinterpret_cast< | |||
2050 | typelib_InterfaceAttributeTypeDescription * >(*result); | |||
2051 | newAttribute->aBase.nPosition = position; | |||
2052 | rtl_uString_acquire( | |||
2053 | newAttribute->aBase.pMemberName | |||
2054 | = baseAttribute->aBase.pMemberName); | |||
2055 | newAttribute->bReadOnly = baseAttribute->bReadOnly; | |||
2056 | typelib_typedescriptionreference_acquire( | |||
2057 | newAttribute->pAttributeTypeRef | |||
2058 | = baseAttribute->pAttributeTypeRef); | |||
2059 | newAttribute->pInterface | |||
2060 | = reinterpret_cast< typelib_InterfaceTypeDescription * >( | |||
2061 | interface); | |||
2062 | newAttribute->pBaseRef = baseRef; | |||
2063 | newAttribute->nIndex = index; | |||
2064 | newAttribute->nGetExceptions = baseAttribute->nGetExceptions; | |||
2065 | newAttribute->ppGetExceptions = copyExceptions( | |||
2066 | baseAttribute->nGetExceptions, | |||
2067 | baseAttribute->ppGetExceptions); | |||
2068 | newAttribute->nSetExceptions = baseAttribute->nSetExceptions; | |||
2069 | newAttribute->ppSetExceptions = copyExceptions( | |||
2070 | baseAttribute->nSetExceptions, | |||
2071 | baseAttribute->ppSetExceptions); | |||
2072 | return true; | |||
2073 | } | |||
2074 | ||||
2075 | default: | |||
2076 | break; | |||
2077 | } | |||
2078 | } | |||
2079 | return false; | |||
2080 | } | |||
2081 | ||||
2082 | } | |||
2083 | ||||
2084 | extern "C" CPPU_DLLPUBLIC__attribute__ ((visibility("default"))) void SAL_CALL typelib_typedescription_getByName( | |||
2085 | typelib_TypeDescription ** ppRet, rtl_uString * pName ) | |||
2086 | SAL_THROW_EXTERN_C()throw () | |||
2087 | { | |||
2088 | if( *ppRet ) | |||
2089 | { | |||
2090 | typelib_typedescription_release( (*ppRet) ); | |||
2091 | *ppRet = 0; | |||
2092 | } | |||
2093 | ||||
2094 | static sal_Bool bInited = sal_False((sal_Bool)0); | |||
2095 | TypeDescriptor_Init_Impl &rInit = Init::get(); | |||
2096 | ||||
2097 | if( !bInited ) | |||
2098 | { | |||
2099 | // guard against multi thread access | |||
2100 | MutexGuard aGuard( rInit.getMutex() ); | |||
2101 | if( !bInited ) | |||
2102 | { | |||
2103 | // avoid recursion during the next ...new calls | |||
2104 | bInited = sal_True((sal_Bool)1); | |||
2105 | ||||
2106 | rtl_uString * pTypeName = 0; | |||
2107 | typelib_TypeDescription * pType = 0; | |||
2108 | rtl_uString_newFromAscii( &pTypeName, "type" ); | |||
2109 | typelib_typedescription_new( &pType, typelib_TypeClass_TYPE, pTypeName, 0, 0, 0 ); | |||
2110 | typelib_typedescription_register( &pType ); | |||
2111 | rtl_uString_newFromAscii( &pTypeName, "void" ); | |||
2112 | typelib_typedescription_new( &pType, typelib_TypeClass_VOID, pTypeName, 0, 0, 0 ); | |||
2113 | typelib_typedescription_register( &pType ); | |||
2114 | rtl_uString_newFromAscii( &pTypeName, "boolean" ); | |||
2115 | typelib_typedescription_new( &pType, typelib_TypeClass_BOOLEAN, pTypeName, 0, 0, 0 ); | |||
2116 | typelib_typedescription_register( &pType ); | |||
2117 | rtl_uString_newFromAscii( &pTypeName, "char" ); | |||
2118 | typelib_typedescription_new( &pType, typelib_TypeClass_CHAR, pTypeName, 0, 0, 0 ); | |||
2119 | typelib_typedescription_register( &pType ); | |||
2120 | rtl_uString_newFromAscii( &pTypeName, "byte" ); | |||
2121 | typelib_typedescription_new( &pType, typelib_TypeClass_BYTE, pTypeName, 0, 0, 0 ); | |||
2122 | typelib_typedescription_register( &pType ); | |||
2123 | rtl_uString_newFromAscii( &pTypeName, "string" ); | |||
2124 | typelib_typedescription_new( &pType, typelib_TypeClass_STRING, pTypeName, 0, 0, 0 ); | |||
2125 | typelib_typedescription_register( &pType ); | |||
2126 | rtl_uString_newFromAscii( &pTypeName, "short" ); | |||
2127 | typelib_typedescription_new( &pType, typelib_TypeClass_SHORT, pTypeName, 0, 0, 0 ); | |||
2128 | typelib_typedescription_register( &pType ); | |||
2129 | rtl_uString_newFromAscii( &pTypeName, "unsigned short" ); | |||
2130 | typelib_typedescription_new( &pType, typelib_TypeClass_UNSIGNED_SHORT, pTypeName, 0, 0, 0 ); | |||
2131 | typelib_typedescription_register( &pType ); | |||
2132 | rtl_uString_newFromAscii( &pTypeName, "long" ); | |||
2133 | typelib_typedescription_new( &pType, typelib_TypeClass_LONG, pTypeName, 0, 0, 0 ); | |||
2134 | typelib_typedescription_register( &pType ); | |||
2135 | rtl_uString_newFromAscii( &pTypeName, "unsigned long" ); | |||
2136 | typelib_typedescription_new( &pType, typelib_TypeClass_UNSIGNED_LONG, pTypeName, 0, 0, 0 ); | |||
2137 | typelib_typedescription_register( &pType ); | |||
2138 | rtl_uString_newFromAscii( &pTypeName, "hyper" ); | |||
2139 | typelib_typedescription_new( &pType, typelib_TypeClass_HYPER, pTypeName, 0, 0, 0 ); | |||
2140 | typelib_typedescription_register( &pType ); | |||
2141 | rtl_uString_newFromAscii( &pTypeName, "unsigned hyper" ); | |||
2142 | typelib_typedescription_new( &pType, typelib_TypeClass_UNSIGNED_HYPER, pTypeName, 0, 0, 0 ); | |||
2143 | typelib_typedescription_register( &pType ); | |||
2144 | rtl_uString_newFromAscii( &pTypeName, "float" ); | |||
2145 | typelib_typedescription_new( &pType, typelib_TypeClass_FLOAT, pTypeName, 0, 0, 0 ); | |||
2146 | typelib_typedescription_register( &pType ); | |||
2147 | rtl_uString_newFromAscii( &pTypeName, "double" ); | |||
2148 | typelib_typedescription_new( &pType, typelib_TypeClass_DOUBLE, pTypeName, 0, 0, 0 ); | |||
2149 | typelib_typedescription_register( &pType ); | |||
2150 | rtl_uString_newFromAscii( &pTypeName, "any" ); | |||
2151 | typelib_typedescription_new( &pType, typelib_TypeClass_ANY, pTypeName, 0, 0, 0 ); | |||
2152 | typelib_typedescription_register( &pType ); | |||
2153 | typelib_typedescription_release( pType ); | |||
2154 | rtl_uString_release( pTypeName ); | |||
2155 | } | |||
2156 | } | |||
2157 | ||||
2158 | typelib_TypeDescriptionReference * pTDR = 0; | |||
2159 | typelib_typedescriptionreference_getByName( &pTDR, pName ); | |||
2160 | if( pTDR ) | |||
2161 | { | |||
2162 | { | |||
2163 | // guard against multi thread access | |||
2164 | MutexGuard aGuard( rInit.getMutex() ); | |||
2165 | // pTDR->pType->pWeakRef == 0 means that the description is empty | |||
2166 | if( pTDR->pType && pTDR->pType->pWeakRef ) | |||
2167 | { | |||
2168 | typelib_typedescription_acquire( pTDR->pType ); | |||
2169 | *ppRet = pTDR->pType; | |||
2170 | } | |||
2171 | } | |||
2172 | typelib_typedescriptionreference_release( pTDR ); | |||
2173 | } | |||
2174 | ||||
2175 | if (0 == *ppRet) | |||
2176 | { | |||
2177 | // check for sequence | |||
2178 | OUString const & name = *reinterpret_cast< OUString const * >( &pName ); | |||
2179 | if (2 < name.getLength() && '[' == name[ 0 ]) | |||
2180 | { | |||
2181 | OUString element_name( name.copy( 2 ) ); | |||
2182 | typelib_TypeDescription * element_td = 0; | |||
2183 | typelib_typedescription_getByName( &element_td, element_name.pData ); | |||
2184 | if (0 != element_td) | |||
2185 | { | |||
2186 | typelib_typedescription_new( | |||
2187 | ppRet, typelib_TypeClass_SEQUENCE, pName, element_td->pWeakRef, 0, 0 ); | |||
2188 | // register? | |||
2189 | typelib_typedescription_release( element_td ); | |||
2190 | } | |||
2191 | } | |||
2192 | if (0 == *ppRet) | |||
2193 | { | |||
2194 | // Check for derived interface member type: | |||
2195 | sal_Int32 i1 = name.lastIndexOf( | |||
2196 | rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(":@")(&(":@")[0]), ((sal_Int32)((sizeof (":@") / sizeof ((":@" )[0]))-1)), (((rtl_TextEncoding) 11)))); | |||
2197 | if (i1 >= 0) { | |||
2198 | sal_Int32 i2 = i1 + RTL_CONSTASCII_LENGTH(":@")((sal_Int32)((sizeof (":@") / sizeof ((":@")[0]))-1)); | |||
2199 | sal_Int32 i3 = name.indexOf(',', i2); | |||
2200 | if (i3 >= 0) { | |||
2201 | sal_Int32 i4 = name.indexOf(':', i3); | |||
2202 | if (i4 >= 0) { | |||
2203 | typelib_TypeDescriptionReference * pBaseRef = 0; | |||
2204 | typelib_TypeDescription * pBase = 0; | |||
2205 | typelib_TypeDescription * pInterface = 0; | |||
2206 | typelib_typedescriptionreference_getByName( | |||
2207 | &pBaseRef, name.copy(0, i1).pData); | |||
2208 | if (pBaseRef != 0) { | |||
2209 | typelib_typedescriptionreference_getDescription( | |||
2210 | &pBase, pBaseRef); | |||
2211 | } | |||
2212 | typelib_typedescription_getByName( | |||
2213 | &pInterface, name.copy(i4 + 1).pData); | |||
2214 | if (!createDerivedInterfaceMemberDescription( | |||
2215 | ppRet, name, pBaseRef, pBase, pInterface, | |||
2216 | name.copy(i2, i3 - i2).toInt32(), | |||
2217 | name.copy(i3 + 1, i4 - i3 - 1).toInt32())) | |||
2218 | { | |||
2219 | if (pInterface != 0) { | |||
2220 | typelib_typedescription_release(pInterface); | |||
2221 | } | |||
2222 | if (pBase != 0) { | |||
2223 | typelib_typedescription_release(pBase); | |||
2224 | } | |||
2225 | if (pBaseRef != 0) { | |||
2226 | typelib_typedescriptionreference_release( | |||
2227 | pBaseRef); | |||
2228 | } | |||
2229 | } | |||
2230 | } | |||
2231 | } | |||
2232 | } | |||
2233 | } | |||
2234 | if (0 == *ppRet) | |||
2235 | { | |||
2236 | // on demand access | |||
2237 | rInit.callChain( ppRet, pName ); | |||
2238 | } | |||
2239 | ||||
2240 | if( *ppRet ) | |||
2241 | { | |||
2242 | // typedescription found | |||
2243 | if (typelib_TypeClass_TYPEDEF == (*ppRet)->eTypeClass) | |||
2244 | { | |||
2245 | typelib_TypeDescription * pTD = 0; | |||
2246 | typelib_typedescriptionreference_getDescription( | |||
2247 | &pTD, ((typelib_IndirectTypeDescription *)*ppRet)->pType ); | |||
2248 | typelib_typedescription_release( *ppRet ); | |||
2249 | *ppRet = pTD; | |||
2250 | } | |||
2251 | else | |||
2252 | { | |||
2253 | // set to on demand | |||
2254 | (*ppRet)->bOnDemand = sal_True((sal_Bool)1); | |||
2255 | // The type description is hold by the reference until | |||
2256 | // on demand is activated. | |||
2257 | typelib_typedescription_register( ppRet ); | |||
2258 | ||||
2259 | // insert into the chache | |||
2260 | MutexGuard aGuard( rInit.getMutex() ); | |||
2261 | if( !rInit.pCache ) | |||
2262 | rInit.pCache = new TypeDescriptionList_Impl; | |||
2263 | if( (sal_Int32)rInit.pCache->size() >= nCacheSize ) | |||
2264 | { | |||
2265 | typelib_typedescription_release( rInit.pCache->front() ); | |||
2266 | rInit.pCache->pop_front(); | |||
2267 | } | |||
2268 | // descriptions in the cache must be acquired! | |||
2269 | typelib_typedescription_acquire( *ppRet ); | |||
2270 | rInit.pCache->push_back( *ppRet ); | |||
2271 | } | |||
2272 | } | |||
2273 | } | |||
2274 | } | |||
2275 | ||||
2276 | extern "C" CPPU_DLLPUBLIC__attribute__ ((visibility("default"))) void SAL_CALL typelib_typedescriptionreference_newByAsciiName( | |||
2277 | typelib_TypeDescriptionReference ** ppTDR, | |||
2278 | typelib_TypeClass eTypeClass, | |||
2279 | const sal_Char * pTypeName ) | |||
2280 | SAL_THROW_EXTERN_C()throw () | |||
2281 | { | |||
2282 | OUString aTypeName( OUString::createFromAscii( pTypeName ) ); | |||
2283 | typelib_typedescriptionreference_new( ppTDR, eTypeClass, aTypeName.pData ); | |||
2284 | } | |||
2285 | //------------------------------------------------------------------------ | |||
2286 | extern "C" CPPU_DLLPUBLIC__attribute__ ((visibility("default"))) void SAL_CALL typelib_typedescriptionreference_new( | |||
2287 | typelib_TypeDescriptionReference ** ppTDR, | |||
2288 | typelib_TypeClass eTypeClass, rtl_uString * pTypeName ) | |||
2289 | SAL_THROW_EXTERN_C()throw () | |||
2290 | { | |||
2291 | TypeDescriptor_Init_Impl &rInit = Init::get(); | |||
2292 | if( eTypeClass == typelib_TypeClass_TYPEDEF ) | |||
2293 | { | |||
2294 | // on demand access | |||
2295 | typelib_TypeDescription * pRet = 0; | |||
2296 | rInit.callChain( &pRet, pTypeName ); | |||
2297 | if( pRet ) | |||
2298 | { | |||
2299 | // typedescription found | |||
2300 | if (typelib_TypeClass_TYPEDEF == pRet->eTypeClass) | |||
2301 | { | |||
2302 | typelib_typedescriptionreference_acquire( | |||
2303 | ((typelib_IndirectTypeDescription *)pRet)->pType ); | |||
2304 | if (*ppTDR) | |||
2305 | typelib_typedescriptionreference_release( *ppTDR ); | |||
2306 | *ppTDR = ((typelib_IndirectTypeDescription *)pRet)->pType; | |||
2307 | typelib_typedescription_release( pRet ); | |||
2308 | } | |||
2309 | else | |||
2310 | { | |||
2311 | // set to on demand | |||
2312 | pRet->bOnDemand = sal_True((sal_Bool)1); | |||
2313 | // The type description is hold by the reference until | |||
2314 | // on demand is activated. | |||
2315 | typelib_typedescription_register( &pRet ); | |||
2316 | ||||
2317 | // insert into the chache | |||
2318 | MutexGuard aGuard( rInit.getMutex() ); | |||
2319 | if( !rInit.pCache ) | |||
2320 | rInit.pCache = new TypeDescriptionList_Impl; | |||
2321 | if( (sal_Int32)rInit.pCache->size() >= nCacheSize ) | |||
2322 | { | |||
2323 | typelib_typedescription_release( rInit.pCache->front() ); | |||
2324 | rInit.pCache->pop_front(); | |||
2325 | } | |||
2326 | rInit.pCache->push_back( pRet ); | |||
2327 | // pRet kept acquired for cache | |||
2328 | ||||
2329 | typelib_typedescriptionreference_acquire( pRet->pWeakRef ); | |||
2330 | if (*ppTDR) | |||
2331 | typelib_typedescriptionreference_release( *ppTDR ); | |||
2332 | *ppTDR = pRet->pWeakRef; | |||
2333 | } | |||
2334 | } | |||
2335 | else if (*ppTDR) | |||
2336 | { | |||
2337 | #if OSL_DEBUG_LEVEL1 > 1 | |||
2338 | OString aStr( rtl::OUStringToOString( pTypeName, RTL_TEXTENCODING_ASCII_US(((rtl_TextEncoding) 11)) ) ); | |||
2339 | OSL_ENSURE( !"### typedef not found: ", aStr.getStr() )do { if (true && (!(!"### typedef not found: "))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/cppu/source/typelib/typelib.cxx" ":" "2339" ": "), "%s", aStr.getStr()); } } while (false); | |||
2340 | #endif | |||
2341 | typelib_typedescriptionreference_release( *ppTDR ); | |||
2342 | *ppTDR = 0; | |||
2343 | } | |||
2344 | return; | |||
2345 | } | |||
2346 | ||||
2347 | MutexGuard aGuard( rInit.getMutex() ); | |||
2348 | typelib_typedescriptionreference_getByName( ppTDR, pTypeName ); | |||
2349 | if( *ppTDR ) | |||
2350 | return; | |||
2351 | ||||
2352 | if( reallyWeak( eTypeClass ) ) | |||
2353 | { | |||
2354 | typelib_TypeDescriptionReference * pTDR = new typelib_TypeDescriptionReference(); | |||
2355 | #if OSL_DEBUG_LEVEL1 > 1 | |||
2356 | osl_incrementInterlockedCount( &rInit.nTypeDescriptionReferenceCount ); | |||
2357 | #endif | |||
2358 | pTDR->nRefCount = 1; | |||
2359 | pTDR->nStaticRefCount = 0; | |||
2360 | pTDR->eTypeClass = eTypeClass; | |||
2361 | pTDR->pUniqueIdentifier = 0; | |||
2362 | pTDR->pReserved = 0; | |||
2363 | rtl_uString_acquire( pTDR->pTypeName = pTypeName ); | |||
2364 | pTDR->pType = 0; | |||
2365 | *ppTDR = pTDR; | |||
2366 | } | |||
2367 | else | |||
2368 | { | |||
2369 | typelib_typedescription_newEmpty( (typelib_TypeDescription ** )ppTDR, eTypeClass, pTypeName ); | |||
2370 | // description will be registered but not acquired | |||
2371 | (*(typelib_TypeDescription ** )ppTDR)->bOnDemand = sal_True((sal_Bool)1); | |||
2372 | (*(typelib_TypeDescription ** )ppTDR)->bComplete = sal_False((sal_Bool)0); | |||
2373 | } | |||
2374 | ||||
2375 | if( !rInit.pWeakMap ) | |||
2376 | rInit.pWeakMap = new WeakMap_Impl; | |||
2377 | // Heavy hack, the const sal_Unicode * is hold by the typedescription reference | |||
2378 | // not registered | |||
2379 | rInit.pWeakMap->operator[]( (*ppTDR)->pTypeName->buffer ) = *ppTDR; | |||
2380 | } | |||
2381 | ||||
2382 | //------------------------------------------------------------------------ | |||
2383 | extern "C" CPPU_DLLPUBLIC__attribute__ ((visibility("default"))) void SAL_CALL typelib_typedescriptionreference_acquire( | |||
2384 | typelib_TypeDescriptionReference * pRef ) | |||
2385 | SAL_THROW_EXTERN_C()throw () | |||
2386 | { | |||
2387 | ::osl_incrementInterlockedCount( &pRef->nRefCount ); | |||
2388 | } | |||
2389 | ||||
2390 | //------------------------------------------------------------------------ | |||
2391 | extern "C" CPPU_DLLPUBLIC__attribute__ ((visibility("default"))) void SAL_CALL typelib_typedescriptionreference_release( | |||
2392 | typelib_TypeDescriptionReference * pRef ) | |||
2393 | SAL_THROW_EXTERN_C()throw () | |||
2394 | { | |||
2395 | // Is it a type description? | |||
2396 | if( reallyWeak( pRef->eTypeClass ) ) | |||
2397 | { | |||
2398 | if( ! ::osl_decrementInterlockedCount( &pRef->nRefCount ) ) | |||
2399 | { | |||
2400 | TypeDescriptor_Init_Impl &rInit = Init::get(); | |||
2401 | if( rInit.pWeakMap ) | |||
2402 | { | |||
2403 | MutexGuard aGuard( rInit.getMutex() ); | |||
2404 | WeakMap_Impl::iterator aIt = rInit.pWeakMap->find( (sal_Unicode*)pRef->pTypeName->buffer ); | |||
2405 | if( !(aIt == rInit.pWeakMap->end()) && (*aIt).second == pRef ) | |||
2406 | { | |||
2407 | // remove only if it contains the same object | |||
2408 | rInit.pWeakMap->erase( aIt ); | |||
2409 | } | |||
2410 | } | |||
2411 | ||||
2412 | rtl_uString_release( pRef->pTypeName ); | |||
2413 | OSL_ASSERT( pRef->pType == 0 )do { if (true && (!(pRef->pType == 0))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/cppu/source/typelib/typelib.cxx" ":" "2413" ": "), "OSL_ASSERT: %s", "pRef->pType == 0"); } } while (false); | |||
2414 | #if OSL_DEBUG_LEVEL1 > 1 | |||
2415 | osl_decrementInterlockedCount( &rInit.nTypeDescriptionReferenceCount ); | |||
2416 | #endif | |||
2417 | delete pRef; | |||
2418 | } | |||
2419 | } | |||
2420 | else | |||
2421 | { | |||
2422 | typelib_typedescription_release( (typelib_TypeDescription *)pRef ); | |||
2423 | } | |||
2424 | } | |||
2425 | ||||
2426 | //------------------------------------------------------------------------ | |||
2427 | extern "C" CPPU_DLLPUBLIC__attribute__ ((visibility("default"))) void SAL_CALL typelib_typedescriptionreference_getDescription( | |||
2428 | typelib_TypeDescription ** ppRet, typelib_TypeDescriptionReference * pRef ) | |||
2429 | SAL_THROW_EXTERN_C()throw () | |||
2430 | { | |||
2431 | if( *ppRet ) | |||
2432 | { | |||
2433 | typelib_typedescription_release( *ppRet ); | |||
2434 | *ppRet = 0; | |||
2435 | } | |||
2436 | ||||
2437 | if( !reallyWeak( pRef->eTypeClass ) && pRef->pType && pRef->pType->pWeakRef ) | |||
2438 | { | |||
2439 | // reference is a description and initialized | |||
2440 | osl_incrementInterlockedCount( &((typelib_TypeDescription *)pRef)->nRefCount ); | |||
2441 | *ppRet = (typelib_TypeDescription *)pRef; | |||
2442 | return; | |||
2443 | } | |||
2444 | ||||
2445 | { | |||
2446 | MutexGuard aGuard( Init::get().getMutex() ); | |||
2447 | // pRef->pType->pWeakRef == 0 means that the description is empty | |||
2448 | if( pRef->pType && pRef->pType->pWeakRef ) | |||
2449 | { | |||
2450 | sal_Int32 n = ::osl_incrementInterlockedCount( &pRef->pType->nRefCount ); | |||
2451 | if( n > 1 ) | |||
2452 | { | |||
2453 | // The refence is incremented. The object cannot be destroyed. | |||
2454 | // Release the guard at the earliest point. | |||
2455 | *ppRet = pRef->pType; | |||
2456 | return; | |||
2457 | } | |||
2458 | else | |||
2459 | { | |||
2460 | ::osl_decrementInterlockedCount( &pRef->pType->nRefCount ); | |||
2461 | // detruction of this type in progress (another thread!) | |||
2462 | // no acces through this weak reference | |||
2463 | pRef->pType = 0; | |||
2464 | } | |||
2465 | } | |||
2466 | } | |||
2467 | ||||
2468 | typelib_typedescription_getByName( ppRet, pRef->pTypeName ); | |||
2469 | OSL_ASSERT( !*ppRet || rtl_ustr_compare( pRef->pTypeName->buffer, (*ppRet)->pTypeName->buffer ) == 0 )do { if (true && (!(!*ppRet || rtl_ustr_compare( pRef ->pTypeName->buffer, (*ppRet)->pTypeName->buffer ) == 0))) { sal_detail_logFormat((SAL_DETAIL_LOG_LEVEL_WARN), ( "legacy.osl"), ("/usr/local/src/libreoffice/cppu/source/typelib/typelib.cxx" ":" "2469" ": "), "OSL_ASSERT: %s", "!*ppRet || rtl_ustr_compare( pRef->pTypeName->buffer, (*ppRet)->pTypeName->buffer ) == 0" ); } } while (false); | |||
2470 | OSL_ASSERT( !*ppRet || pRef->eTypeClass == (*ppRet)->eTypeClass )do { if (true && (!(!*ppRet || pRef->eTypeClass == (*ppRet)->eTypeClass))) { sal_detail_logFormat((SAL_DETAIL_LOG_LEVEL_WARN ), ("legacy.osl"), ("/usr/local/src/libreoffice/cppu/source/typelib/typelib.cxx" ":" "2470" ": "), "OSL_ASSERT: %s", "!*ppRet || pRef->eTypeClass == (*ppRet)->eTypeClass" ); } } while (false); | |||
2471 | OSL_ASSERT( !*ppRet || pRef == (*ppRet)->pWeakRef )do { if (true && (!(!*ppRet || pRef == (*ppRet)->pWeakRef ))) { sal_detail_logFormat((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl" ), ("/usr/local/src/libreoffice/cppu/source/typelib/typelib.cxx" ":" "2471" ": "), "OSL_ASSERT: %s", "!*ppRet || pRef == (*ppRet)->pWeakRef" ); } } while (false); | |||
2472 | pRef->pType = *ppRet; | |||
2473 | } | |||
2474 | ||||
2475 | //------------------------------------------------------------------------ | |||
2476 | extern "C" void SAL_CALL typelib_typedescriptionreference_getByName( | |||
2477 | typelib_TypeDescriptionReference ** ppRet, rtl_uString * pName ) | |||
2478 | SAL_THROW_EXTERN_C()throw () | |||
2479 | { | |||
2480 | if( *ppRet ) | |||
2481 | { | |||
2482 | typelib_typedescriptionreference_release( *ppRet ); | |||
2483 | *ppRet = 0; | |||
2484 | } | |||
2485 | TypeDescriptor_Init_Impl &rInit = Init::get(); | |||
2486 | if( rInit.pWeakMap ) | |||
2487 | { | |||
2488 | MutexGuard aGuard( rInit.getMutex() ); | |||
2489 | WeakMap_Impl::const_iterator aIt = rInit.pWeakMap->find( (sal_Unicode*)pName->buffer ); | |||
2490 | if( !(aIt == rInit.pWeakMap->end()) ) // != failed on msc4.2 | |||
2491 | { | |||
2492 | sal_Int32 n = ::osl_incrementInterlockedCount( &(*aIt).second->nRefCount ); | |||
2493 | if( n > 1 ) | |||
2494 | { | |||
2495 | // The refence is incremented. The object cannot be destroyed. | |||
2496 | // Release the guard at the earliest point. | |||
2497 | *ppRet = (*aIt).second; | |||
2498 | } | |||
2499 | else | |||
2500 | { | |||
2501 | // detruction of this type in progress (another thread!) | |||
2502 | // no acces through this weak reference | |||
2503 | ::osl_decrementInterlockedCount( &(*aIt).second->nRefCount ); | |||
2504 | } | |||
2505 | } | |||
2506 | } | |||
2507 | } | |||
2508 | ||||
2509 | //------------------------------------------------------------------------ | |||
2510 | extern "C" CPPU_DLLPUBLIC__attribute__ ((visibility("default"))) sal_Bool SAL_CALL typelib_typedescriptionreference_equals( | |||
2511 | const typelib_TypeDescriptionReference * p1, | |||
2512 | const typelib_TypeDescriptionReference * p2 ) | |||
2513 | SAL_THROW_EXTERN_C()throw () | |||
2514 | { | |||
2515 | return (p1 == p2 || | |||
2516 | (p1->eTypeClass == p2->eTypeClass && | |||
2517 | p1->pTypeName->length == p2->pTypeName->length && | |||
2518 | rtl_ustr_compare( p1->pTypeName->buffer, p2->pTypeName->buffer ) == 0)); | |||
2519 | } | |||
2520 | ||||
2521 | //################################################################################################## | |||
2522 | extern "C" CPPU_DLLPUBLIC__attribute__ ((visibility("default"))) void SAL_CALL typelib_typedescriptionreference_assign( | |||
2523 | typelib_TypeDescriptionReference ** ppDest, | |||
2524 | typelib_TypeDescriptionReference * pSource ) | |||
2525 | SAL_THROW_EXTERN_C()throw () | |||
2526 | { | |||
2527 | if (*ppDest != pSource) | |||
2528 | { | |||
2529 | ::typelib_typedescriptionreference_acquire( pSource ); | |||
2530 | ::typelib_typedescriptionreference_release( *ppDest ); | |||
2531 | *ppDest = pSource; | |||
2532 | } | |||
2533 | } | |||
2534 | ||||
2535 | //################################################################################################## | |||
2536 | extern "C" CPPU_DLLPUBLIC__attribute__ ((visibility("default"))) void SAL_CALL typelib_setCacheSize( sal_Int32 nNewSize ) | |||
2537 | SAL_THROW_EXTERN_C()throw () | |||
2538 | { | |||
2539 | OSL_ENSURE( nNewSize >= 0, "### illegal cache size given!" )do { if (true && (!(nNewSize >= 0))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/cppu/source/typelib/typelib.cxx" ":" "2539" ": "), "%s", "### illegal cache size given!"); } } while (false); | |||
2540 | if (nNewSize >= 0) | |||
2541 | { | |||
2542 | TypeDescriptor_Init_Impl &rInit = Init::get(); | |||
2543 | MutexGuard aGuard( rInit.getMutex() ); | |||
2544 | if ((nNewSize < nCacheSize) && rInit.pCache) | |||
2545 | { | |||
2546 | while ((sal_Int32)rInit.pCache->size() != nNewSize) | |||
2547 | { | |||
2548 | typelib_typedescription_release( rInit.pCache->front() ); | |||
2549 | rInit.pCache->pop_front(); | |||
2550 | } | |||
2551 | } | |||
2552 | nCacheSize = nNewSize; | |||
2553 | } | |||
2554 | } | |||
2555 | ||||
2556 | ||||
2557 | static sal_Bool s_aAssignableFromTab[11][11] = | |||
2558 | { | |||
2559 | /* from CH,BO,BY,SH,US,LO,UL,HY,UH,FL,DO */ | |||
2560 | /* TypeClass_CHAR */ { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, | |||
2561 | /* TypeClass_BOOLEAN */ { 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, | |||
2562 | /* TypeClass_BYTE */ { 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0 }, | |||
2563 | /* TypeClass_SHORT */ { 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0 }, | |||
2564 | /* TypeClass_UNSIGNED_SHORT */ { 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0 }, | |||
2565 | /* TypeClass_LONG */ { 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0 }, | |||
2566 | /* TypeClass_UNSIGNED_LONG */ { 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0 }, | |||
2567 | /* TypeClass_HYPER */ { 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0 }, | |||
2568 | /* TypeClass_UNSIGNED_HYPER */ { 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0 }, | |||
2569 | /* TypeClass_FLOAT */ { 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0 }, | |||
2570 | /* TypeClass_DOUBLE */ { 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1 } | |||
2571 | }; | |||
2572 | ||||
2573 | //################################################################################################## | |||
2574 | extern "C" CPPU_DLLPUBLIC__attribute__ ((visibility("default"))) sal_Bool SAL_CALL typelib_typedescriptionreference_isAssignableFrom( | |||
2575 | typelib_TypeDescriptionReference * pAssignable, | |||
2576 | typelib_TypeDescriptionReference * pFrom ) | |||
2577 | SAL_THROW_EXTERN_C()throw () | |||
2578 | { | |||
2579 | if (pAssignable && pFrom) | |||
2580 | { | |||
2581 | typelib_TypeClass eAssignable = pAssignable->eTypeClass; | |||
2582 | typelib_TypeClass eFrom = pFrom->eTypeClass; | |||
2583 | ||||
2584 | if (eAssignable == typelib_TypeClass_ANY) // anything can be assigned to an any .) | |||
2585 | return sal_True((sal_Bool)1); | |||
2586 | if (eAssignable == eFrom) | |||
2587 | { | |||
2588 | if (type_equals( pAssignable, pFrom )) // first shot | |||
2589 | { | |||
2590 | return sal_True((sal_Bool)1); | |||
2591 | } | |||
2592 | else | |||
2593 | { | |||
2594 | switch (eAssignable) | |||
2595 | { | |||
2596 | case typelib_TypeClass_STRUCT: | |||
2597 | case typelib_TypeClass_EXCEPTION: | |||
2598 | { | |||
2599 | typelib_TypeDescription * pFromDescr = 0; | |||
2600 | TYPELIB_DANGER_GET( &pFromDescr, pFrom ){ typelib_TypeDescriptionReference * pMacroTypeRef = (pFrom); typelib_TypeDescription ** ppMacroTypeDescr = (&pFromDescr ); if (((pMacroTypeRef->eTypeClass) == typelib_TypeClass_INTERFACE_METHOD || (pMacroTypeRef->eTypeClass) == typelib_TypeClass_INTERFACE_ATTRIBUTE )) { typelib_typedescriptionreference_getDescription( ppMacroTypeDescr , pMacroTypeRef ); } else if (!pMacroTypeRef->pType || !pMacroTypeRef ->pType->pWeakRef) { typelib_typedescriptionreference_getDescription ( ppMacroTypeDescr, pMacroTypeRef ); if (*ppMacroTypeDescr) typelib_typedescription_release ( *ppMacroTypeDescr ); } else { *ppMacroTypeDescr = pMacroTypeRef ->pType; } }; | |||
2601 | if (! ((typelib_CompoundTypeDescription *)pFromDescr)->pBaseTypeDescription) | |||
2602 | { | |||
2603 | TYPELIB_DANGER_RELEASE( pFromDescr ){ if ((((pFromDescr)->eTypeClass) == typelib_TypeClass_INTERFACE_METHOD || ((pFromDescr)->eTypeClass) == typelib_TypeClass_INTERFACE_ATTRIBUTE )) typelib_typedescription_release( pFromDescr ); }; | |||
2604 | return sal_False((sal_Bool)0); | |||
2605 | } | |||
2606 | sal_Bool bRet = typelib_typedescriptionreference_isAssignableFrom( | |||
2607 | pAssignable, | |||
2608 | ((typelib_TypeDescription *)((typelib_CompoundTypeDescription *)pFromDescr)->pBaseTypeDescription)->pWeakRef ); | |||
2609 | TYPELIB_DANGER_RELEASE( pFromDescr ){ if ((((pFromDescr)->eTypeClass) == typelib_TypeClass_INTERFACE_METHOD || ((pFromDescr)->eTypeClass) == typelib_TypeClass_INTERFACE_ATTRIBUTE )) typelib_typedescription_release( pFromDescr ); }; | |||
2610 | return bRet; | |||
2611 | } | |||
2612 | case typelib_TypeClass_INTERFACE: | |||
2613 | { | |||
2614 | typelib_TypeDescription * pFromDescr = 0; | |||
2615 | TYPELIB_DANGER_GET( &pFromDescr, pFrom ){ typelib_TypeDescriptionReference * pMacroTypeRef = (pFrom); typelib_TypeDescription ** ppMacroTypeDescr = (&pFromDescr ); if (((pMacroTypeRef->eTypeClass) == typelib_TypeClass_INTERFACE_METHOD || (pMacroTypeRef->eTypeClass) == typelib_TypeClass_INTERFACE_ATTRIBUTE )) { typelib_typedescriptionreference_getDescription( ppMacroTypeDescr , pMacroTypeRef ); } else if (!pMacroTypeRef->pType || !pMacroTypeRef ->pType->pWeakRef) { typelib_typedescriptionreference_getDescription ( ppMacroTypeDescr, pMacroTypeRef ); if (*ppMacroTypeDescr) typelib_typedescription_release ( *ppMacroTypeDescr ); } else { *ppMacroTypeDescr = pMacroTypeRef ->pType; } }; | |||
2616 | typelib_InterfaceTypeDescription * pFromIfc | |||
2617 | = reinterpret_cast< | |||
2618 | typelib_InterfaceTypeDescription * >(pFromDescr); | |||
2619 | bool bRet = false; | |||
2620 | for (sal_Int32 i = 0; i < pFromIfc->nBaseTypes; ++i) { | |||
2621 | if (typelib_typedescriptionreference_isAssignableFrom( | |||
2622 | pAssignable, | |||
2623 | pFromIfc->ppBaseTypes[i]->aBase.pWeakRef)) | |||
2624 | { | |||
2625 | bRet = true; | |||
2626 | break; | |||
2627 | } | |||
2628 | } | |||
2629 | TYPELIB_DANGER_RELEASE( pFromDescr ){ if ((((pFromDescr)->eTypeClass) == typelib_TypeClass_INTERFACE_METHOD || ((pFromDescr)->eTypeClass) == typelib_TypeClass_INTERFACE_ATTRIBUTE )) typelib_typedescription_release( pFromDescr ); }; | |||
2630 | return bRet; | |||
2631 | } | |||
2632 | default: | |||
2633 | { | |||
2634 | return sal_False((sal_Bool)0); | |||
2635 | } | |||
2636 | } | |||
2637 | } | |||
2638 | } | |||
2639 | return (eAssignable >= typelib_TypeClass_CHAR && eAssignable <= typelib_TypeClass_DOUBLE && | |||
2640 | eFrom >= typelib_TypeClass_CHAR && eFrom <= typelib_TypeClass_DOUBLE && | |||
2641 | s_aAssignableFromTab[eAssignable-1][eFrom-1]); | |||
2642 | } | |||
2643 | return sal_False((sal_Bool)0); | |||
2644 | } | |||
2645 | //################################################################################################## | |||
2646 | extern "C" CPPU_DLLPUBLIC__attribute__ ((visibility("default"))) sal_Bool SAL_CALL typelib_typedescription_isAssignableFrom( | |||
2647 | typelib_TypeDescription * pAssignable, | |||
2648 | typelib_TypeDescription * pFrom ) | |||
2649 | SAL_THROW_EXTERN_C()throw () | |||
2650 | { | |||
2651 | return typelib_typedescriptionreference_isAssignableFrom( | |||
2652 | pAssignable->pWeakRef, pFrom->pWeakRef ); | |||
2653 | } | |||
2654 | ||||
2655 | //################################################################################################## | |||
2656 | extern "C" CPPU_DLLPUBLIC__attribute__ ((visibility("default"))) sal_Bool SAL_CALL typelib_typedescription_complete( | |||
2657 | typelib_TypeDescription ** ppTypeDescr ) | |||
2658 | SAL_THROW_EXTERN_C()throw () | |||
2659 | { | |||
2660 | return complete(ppTypeDescr, true); | |||
2661 | } | |||
2662 | ||||
2663 | /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |