File: | stoc/source/corereflection/criface.cxx |
Location: | line 685, column 36 |
Description: | Access to field 'nSize' results in a dereference of a null pointer (loaded from variable 'pValueTD') |
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 | #include <sal/config.h> | |||||
22 | #ifdef SAL_UNX | |||||
23 | #include <sal/alloca.h> | |||||
24 | #endif | |||||
25 | #if !(defined(MACOSX) || defined(IOS) || defined(FREEBSD)) | |||||
26 | #include <malloc.h> | |||||
27 | #endif | |||||
28 | #include <rtl/alloc.h> | |||||
29 | #include <typelib/typedescription.hxx> | |||||
30 | #include <uno/data.h> | |||||
31 | ||||||
32 | #include "base.hxx" | |||||
33 | ||||||
34 | #include "com/sun/star/lang/WrappedTargetRuntimeException.hpp" | |||||
35 | #include "com/sun/star/uno/RuntimeException.hpp" | |||||
36 | #include "cppuhelper/exc_hlp.hxx" | |||||
37 | ||||||
38 | namespace stoc_corefl | |||||
39 | { | |||||
40 | ||||||
41 | //================================================================================================== | |||||
42 | class IdlAttributeFieldImpl | |||||
43 | : public IdlMemberImpl | |||||
44 | , public XIdlField | |||||
45 | , public XIdlField2 | |||||
46 | { | |||||
47 | public: | |||||
48 | typelib_InterfaceAttributeTypeDescription * getAttributeTypeDescr() | |||||
49 | { return (typelib_InterfaceAttributeTypeDescription *)getTypeDescr(); } | |||||
50 | ||||||
51 | IdlAttributeFieldImpl( IdlReflectionServiceImpl * pReflection, const OUString & rName, | |||||
52 | typelib_TypeDescription * pTypeDescr, typelib_TypeDescription * pDeclTypeDescr ) | |||||
53 | : IdlMemberImpl( pReflection, rName, pTypeDescr, pDeclTypeDescr ) | |||||
54 | {} | |||||
55 | ||||||
56 | // XInterface | |||||
57 | virtual Any SAL_CALL queryInterface( const Type & rType ) throw(::com::sun::star::uno::RuntimeException); | |||||
58 | virtual void SAL_CALL acquire() throw(); | |||||
59 | virtual void SAL_CALL release() throw(); | |||||
60 | ||||||
61 | // XTypeProvider | |||||
62 | virtual Sequence< Type > SAL_CALL getTypes() throw (::com::sun::star::uno::RuntimeException); | |||||
63 | virtual Sequence< sal_Int8 > SAL_CALL getImplementationId() throw (::com::sun::star::uno::RuntimeException); | |||||
64 | ||||||
65 | // XIdlMember | |||||
66 | virtual Reference< XIdlClass > SAL_CALL getDeclaringClass() throw(::com::sun::star::uno::RuntimeException); | |||||
67 | virtual OUString SAL_CALL getName() throw(::com::sun::star::uno::RuntimeException); | |||||
68 | // XIdlField | |||||
69 | virtual Reference< XIdlClass > SAL_CALL getType() throw(::com::sun::star::uno::RuntimeException); | |||||
70 | virtual FieldAccessMode SAL_CALL getAccessMode() throw(::com::sun::star::uno::RuntimeException); | |||||
71 | virtual Any SAL_CALL get( const Any & rObj ) throw(::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException); | |||||
72 | virtual void SAL_CALL set( const Any & rObj, const Any & rValue ) throw(::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::IllegalAccessException, ::com::sun::star::uno::RuntimeException); | |||||
73 | // XIdlField2: getType, getAccessMode and get are equal to XIdlField | |||||
74 | virtual void SAL_CALL set( Any & rObj, const Any & rValue ) throw(::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::IllegalAccessException, ::com::sun::star::uno::RuntimeException); | |||||
75 | ||||||
76 | private: | |||||
77 | void checkException( | |||||
78 | uno_Any * exception, Reference< XInterface > const & context); | |||||
79 | }; | |||||
80 | ||||||
81 | // XInterface | |||||
82 | //__________________________________________________________________________________________________ | |||||
83 | Any IdlAttributeFieldImpl::queryInterface( const Type & rType ) | |||||
84 | throw(::com::sun::star::uno::RuntimeException) | |||||
85 | { | |||||
86 | Any aRet( ::cppu::queryInterface( rType, | |||||
87 | static_cast< XIdlField * >( this ), | |||||
88 | static_cast< XIdlField2 * >( this ) ) ); | |||||
89 | return (aRet.hasValue() ? aRet : IdlMemberImpl::queryInterface( rType )); | |||||
90 | } | |||||
91 | //__________________________________________________________________________________________________ | |||||
92 | void IdlAttributeFieldImpl::acquire() throw() | |||||
93 | { | |||||
94 | IdlMemberImpl::acquire(); | |||||
95 | } | |||||
96 | //__________________________________________________________________________________________________ | |||||
97 | void IdlAttributeFieldImpl::release() throw() | |||||
98 | { | |||||
99 | IdlMemberImpl::release(); | |||||
100 | } | |||||
101 | ||||||
102 | // XTypeProvider | |||||
103 | //__________________________________________________________________________________________________ | |||||
104 | Sequence< Type > IdlAttributeFieldImpl::getTypes() | |||||
105 | throw (::com::sun::star::uno::RuntimeException) | |||||
106 | { | |||||
107 | static OTypeCollection * s_pTypes = 0; | |||||
108 | if (! s_pTypes) | |||||
109 | { | |||||
110 | MutexGuard aGuard( getMutexAccess() ); | |||||
111 | if (! s_pTypes) | |||||
112 | { | |||||
113 | static OTypeCollection s_aTypes( | |||||
114 | ::getCppuType( (const Reference< XIdlField2 > *)0 ), | |||||
115 | ::getCppuType( (const Reference< XIdlField > *)0 ), | |||||
116 | IdlMemberImpl::getTypes() ); | |||||
117 | s_pTypes = &s_aTypes; | |||||
118 | } | |||||
119 | } | |||||
120 | return s_pTypes->getTypes(); | |||||
121 | } | |||||
122 | //__________________________________________________________________________________________________ | |||||
123 | Sequence< sal_Int8 > IdlAttributeFieldImpl::getImplementationId() | |||||
124 | throw (::com::sun::star::uno::RuntimeException) | |||||
125 | { | |||||
126 | static OImplementationId * s_pId = 0; | |||||
127 | if (! s_pId) | |||||
128 | { | |||||
129 | MutexGuard aGuard( getMutexAccess() ); | |||||
130 | if (! s_pId) | |||||
131 | { | |||||
132 | static OImplementationId s_aId; | |||||
133 | s_pId = &s_aId; | |||||
134 | } | |||||
135 | } | |||||
136 | return s_pId->getImplementationId(); | |||||
137 | } | |||||
138 | ||||||
139 | // XIdlMember | |||||
140 | //__________________________________________________________________________________________________ | |||||
141 | Reference< XIdlClass > IdlAttributeFieldImpl::getDeclaringClass() | |||||
142 | throw(::com::sun::star::uno::RuntimeException) | |||||
143 | { | |||||
144 | if (! _xDeclClass.is()) | |||||
145 | { | |||||
146 | MutexGuard aGuard( getMutexAccess() ); | |||||
147 | if (! _xDeclClass.is()) | |||||
148 | { | |||||
149 | rtl::OUString aName(getAttributeTypeDescr()->aBase.aBase.pTypeName); | |||||
150 | sal_Int32 i = aName.indexOf(':'); | |||||
151 | OSL_ASSERT(i >= 0)do { if (true && (!(i >= 0))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/stoc/source/corereflection/criface.cxx" ":" "151" ": "), "OSL_ASSERT: %s", "i >= 0"); } } while ( false); | |||||
152 | _xDeclClass = getReflection()->forName(aName.copy(0, i)); | |||||
153 | } | |||||
154 | } | |||||
155 | return _xDeclClass; | |||||
156 | } | |||||
157 | //__________________________________________________________________________________________________ | |||||
158 | OUString IdlAttributeFieldImpl::getName() | |||||
159 | throw(::com::sun::star::uno::RuntimeException) | |||||
160 | { | |||||
161 | return IdlMemberImpl::getName(); | |||||
162 | } | |||||
163 | ||||||
164 | // XIdlField | |||||
165 | //__________________________________________________________________________________________________ | |||||
166 | Reference< XIdlClass > IdlAttributeFieldImpl::getType() | |||||
167 | throw(::com::sun::star::uno::RuntimeException) | |||||
168 | { | |||||
169 | return getReflection()->forType( | |||||
170 | getAttributeTypeDescr()->pAttributeTypeRef ); | |||||
171 | } | |||||
172 | //__________________________________________________________________________________________________ | |||||
173 | FieldAccessMode IdlAttributeFieldImpl::getAccessMode() | |||||
174 | throw(::com::sun::star::uno::RuntimeException) | |||||
175 | { | |||||
176 | return (((typelib_InterfaceAttributeTypeDescription *)getAttributeTypeDescr())->bReadOnly | |||||
177 | ? FieldAccessMode_READONLY : FieldAccessMode_READWRITE); | |||||
178 | } | |||||
179 | //__________________________________________________________________________________________________ | |||||
180 | Any IdlAttributeFieldImpl::get( const Any & rObj ) | |||||
181 | throw(::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException) | |||||
182 | { | |||||
183 | uno_Interface * pUnoI = getReflection()->mapToUno( | |||||
184 | rObj, (typelib_InterfaceTypeDescription *)getDeclTypeDescr() ); | |||||
185 | OSL_ENSURE( pUnoI, "### illegal destination object given!" )do { if (true && (!(pUnoI))) { sal_detail_logFormat(( SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/stoc/source/corereflection/criface.cxx" ":" "185" ": "), "%s", "### illegal destination object given!" ); } } while (false); | |||||
186 | if (pUnoI) | |||||
187 | { | |||||
188 | TypeDescription aTD( getAttributeTypeDescr()->pAttributeTypeRef ); | |||||
189 | typelib_TypeDescription * pTD = aTD.get(); | |||||
190 | ||||||
191 | uno_Any aExc; | |||||
192 | uno_Any * pExc = &aExc; | |||||
193 | void * pReturn = alloca( pTD->nSize )__builtin_alloca (pTD->nSize); | |||||
194 | ||||||
195 | (*pUnoI->pDispatcher)( pUnoI, getTypeDescr(), pReturn, 0, &pExc ); | |||||
196 | (*pUnoI->release)( pUnoI ); | |||||
197 | ||||||
198 | checkException( | |||||
199 | pExc, | |||||
200 | *static_cast< Reference< XInterface > const * >(rObj.getValue())); | |||||
201 | Any aRet; | |||||
202 | uno_any_destruct( | |||||
203 | &aRet, reinterpret_cast< uno_ReleaseFunc >(cpp_release) ); | |||||
204 | uno_any_constructAndConvert( &aRet, pReturn, pTD, getReflection()->getUno2Cpp().get() ); | |||||
205 | uno_destructData( pReturn, pTD, 0 ); | |||||
206 | return aRet; | |||||
207 | } | |||||
208 | throw IllegalArgumentException( | |||||
209 | OUString( RTL_CONSTASCII_USTRINGPARAM("illegal object given!")(&("illegal object given!")[0]), ((sal_Int32)((sizeof ("illegal object given!" ) / sizeof (("illegal object given!")[0]))-1)), (((rtl_TextEncoding ) 11)) ), | |||||
210 | (XWeak *)(OWeakObject *)this, 0 ); | |||||
211 | } | |||||
212 | //__________________________________________________________________________________________________ | |||||
213 | void IdlAttributeFieldImpl::set( Any & rObj, const Any & rValue ) | |||||
214 | throw(::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::IllegalAccessException, ::com::sun::star::uno::RuntimeException) | |||||
215 | { | |||||
216 | if (getAttributeTypeDescr()->bReadOnly) | |||||
217 | { | |||||
218 | throw IllegalAccessException( | |||||
219 | OUString( RTL_CONSTASCII_USTRINGPARAM("cannot set readonly attribute!")(&("cannot set readonly attribute!")[0]), ((sal_Int32)((sizeof ("cannot set readonly attribute!") / sizeof (("cannot set readonly attribute!" )[0]))-1)), (((rtl_TextEncoding) 11)) ), | |||||
220 | (XWeak *)(OWeakObject *)this ); | |||||
221 | } | |||||
222 | ||||||
223 | uno_Interface * pUnoI = getReflection()->mapToUno( | |||||
224 | rObj, (typelib_InterfaceTypeDescription *)getDeclTypeDescr() ); | |||||
225 | OSL_ENSURE( pUnoI, "### illegal destination object given!" )do { if (true && (!(pUnoI))) { sal_detail_logFormat(( SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/stoc/source/corereflection/criface.cxx" ":" "225" ": "), "%s", "### illegal destination object given!" ); } } while (false); | |||||
226 | if (pUnoI) | |||||
227 | { | |||||
228 | TypeDescription aTD( getAttributeTypeDescr()->pAttributeTypeRef ); | |||||
229 | typelib_TypeDescription * pTD = aTD.get(); | |||||
230 | ||||||
231 | // construct uno value to be set | |||||
232 | void * pArgs[1]; | |||||
233 | void * pArg = pArgs[0] = alloca( pTD->nSize )__builtin_alloca (pTD->nSize); | |||||
234 | ||||||
235 | sal_Bool bAssign; | |||||
236 | if (pTD->eTypeClass == typelib_TypeClass_ANY) | |||||
237 | { | |||||
238 | uno_copyAndConvertData( pArg, (const_cast< Any * >(&rValue)), | |||||
239 | pTD, getReflection()->getCpp2Uno().get() ); | |||||
240 | bAssign = sal_True((sal_Bool)1); | |||||
241 | } | |||||
242 | else if (typelib_typedescriptionreference_equals( rValue.getValueTypeRef(), pTD->pWeakRef )) | |||||
243 | { | |||||
244 | uno_copyAndConvertData( pArg, (const_cast< void * >(rValue.getValue()) ), | |||||
245 | pTD, getReflection()->getCpp2Uno().get() ); | |||||
246 | bAssign = sal_True((sal_Bool)1); | |||||
247 | } | |||||
248 | else if (pTD->eTypeClass == typelib_TypeClass_INTERFACE) | |||||
249 | { | |||||
250 | Reference< XInterface > xObj; | |||||
251 | bAssign = extract( | |||||
252 | rValue, (typelib_InterfaceTypeDescription *)pTD, xObj, | |||||
253 | getReflection() ); | |||||
254 | if (bAssign) | |||||
255 | { | |||||
256 | *(void **)pArg = getReflection()->getCpp2Uno().mapInterface( | |||||
257 | xObj.get(), (typelib_InterfaceTypeDescription *)pTD ); | |||||
258 | } | |||||
259 | } | |||||
260 | else | |||||
261 | { | |||||
262 | typelib_TypeDescription * pValueTD = 0; | |||||
263 | TYPELIB_DANGER_GET( &pValueTD, rValue.getValueTypeRef() ){ typelib_TypeDescriptionReference * pMacroTypeRef = (rValue. getValueTypeRef()); typelib_TypeDescription ** ppMacroTypeDescr = (&pValueTD); 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; } }; | |||||
264 | // construct temp uno val to do proper assignment: todo opt | |||||
265 | void * pTemp = alloca( pValueTD->nSize )__builtin_alloca (pValueTD->nSize); | |||||
266 | uno_copyAndConvertData( | |||||
267 | pTemp, (void *)rValue.getValue(), pValueTD, getReflection()->getCpp2Uno().get() ); | |||||
268 | uno_constructData( | |||||
269 | pArg, pTD ); | |||||
270 | // assignment does simple conversion | |||||
271 | bAssign = uno_assignData( | |||||
272 | pArg, pTD, pTemp, pValueTD, 0, 0, 0 ); | |||||
273 | uno_destructData( | |||||
274 | pTemp, pValueTD, 0 ); | |||||
275 | TYPELIB_DANGER_RELEASE( pValueTD ){ if ((((pValueTD)->eTypeClass) == typelib_TypeClass_INTERFACE_METHOD || ((pValueTD)->eTypeClass) == typelib_TypeClass_INTERFACE_ATTRIBUTE )) typelib_typedescription_release( pValueTD ); }; | |||||
276 | } | |||||
277 | ||||||
278 | if (bAssign) | |||||
279 | { | |||||
280 | uno_Any aExc; | |||||
281 | uno_Any * pExc = &aExc; | |||||
282 | (*pUnoI->pDispatcher)( pUnoI, getTypeDescr(), 0, pArgs, &pExc ); | |||||
283 | (*pUnoI->release)( pUnoI ); | |||||
284 | ||||||
285 | uno_destructData( pArg, pTD, 0 ); | |||||
286 | checkException( | |||||
287 | pExc, | |||||
288 | *static_cast< Reference< XInterface > const * >( | |||||
289 | rObj.getValue())); | |||||
290 | return; | |||||
291 | } | |||||
292 | (*pUnoI->release)( pUnoI ); | |||||
293 | ||||||
294 | throw IllegalArgumentException( | |||||
295 | OUString( RTL_CONSTASCII_USTRINGPARAM("illegal value given!")(&("illegal value given!")[0]), ((sal_Int32)((sizeof ("illegal value given!" ) / sizeof (("illegal value given!")[0]))-1)), (((rtl_TextEncoding ) 11)) ), | |||||
296 | *(const Reference< XInterface > *)rObj.getValue(), 1 ); | |||||
297 | } | |||||
298 | throw IllegalArgumentException( | |||||
299 | OUString( RTL_CONSTASCII_USTRINGPARAM("illegal destination object given!")(&("illegal destination object given!")[0]), ((sal_Int32) ((sizeof ("illegal destination object given!") / sizeof (("illegal destination object given!" )[0]))-1)), (((rtl_TextEncoding) 11)) ), | |||||
300 | (XWeak *)(OWeakObject *)this, 0 ); | |||||
301 | } | |||||
302 | //__________________________________________________________________________________________________ | |||||
303 | void IdlAttributeFieldImpl::set( const Any & rObj, const Any & rValue ) | |||||
304 | throw(::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::IllegalAccessException, ::com::sun::star::uno::RuntimeException) | |||||
305 | { | |||||
306 | IdlAttributeFieldImpl::set( const_cast< Any & >( rObj ), rValue ); | |||||
307 | } | |||||
308 | ||||||
309 | void IdlAttributeFieldImpl::checkException( | |||||
310 | uno_Any * exception, Reference< XInterface > const & context) | |||||
311 | { | |||||
312 | if (exception != 0) { | |||||
313 | Any e; | |||||
314 | uno_any_destruct(&e, reinterpret_cast< uno_ReleaseFunc >(cpp_release)); | |||||
315 | uno_type_any_constructAndConvert( | |||||
316 | &e, exception->pData, exception->pType, | |||||
317 | getReflection()->getUno2Cpp().get()); | |||||
318 | uno_any_destruct(exception, 0); | |||||
319 | if (e.isExtractableTo( | |||||
320 | getCppuType(static_cast< RuntimeException const * >(0)))) | |||||
321 | { | |||||
322 | cppu::throwException(e); | |||||
323 | } else { | |||||
324 | throw WrappedTargetRuntimeException( | |||||
325 | OUString( | |||||
326 | RTL_CONSTASCII_USTRINGPARAM((&("non-RuntimeException occurred when accessing an" " interface type attribute" )[0]), ((sal_Int32)((sizeof ("non-RuntimeException occurred when accessing an" " interface type attribute") / sizeof (("non-RuntimeException occurred when accessing an" " interface type attribute")[0]))-1)), (((rtl_TextEncoding) 11 )) | |||||
327 | "non-RuntimeException occurred when accessing an"(&("non-RuntimeException occurred when accessing an" " interface type attribute" )[0]), ((sal_Int32)((sizeof ("non-RuntimeException occurred when accessing an" " interface type attribute") / sizeof (("non-RuntimeException occurred when accessing an" " interface type attribute")[0]))-1)), (((rtl_TextEncoding) 11 )) | |||||
328 | " interface type attribute")(&("non-RuntimeException occurred when accessing an" " interface type attribute" )[0]), ((sal_Int32)((sizeof ("non-RuntimeException occurred when accessing an" " interface type attribute") / sizeof (("non-RuntimeException occurred when accessing an" " interface type attribute")[0]))-1)), (((rtl_TextEncoding) 11 ))), | |||||
329 | context, e); | |||||
330 | } | |||||
331 | } | |||||
332 | } | |||||
333 | ||||||
334 | //################################################################################################## | |||||
335 | //################################################################################################## | |||||
336 | //################################################################################################## | |||||
337 | ||||||
338 | ||||||
339 | //================================================================================================== | |||||
340 | class IdlInterfaceMethodImpl | |||||
341 | : public IdlMemberImpl | |||||
342 | , public XIdlMethod | |||||
343 | { | |||||
344 | Sequence< Reference< XIdlClass > > * _pExceptionTypes; | |||||
345 | Sequence< Reference< XIdlClass > > * _pParamTypes; | |||||
346 | Sequence< ParamInfo > * _pParamInfos; | |||||
347 | ||||||
348 | public: | |||||
349 | typelib_InterfaceMethodTypeDescription * getMethodTypeDescr() | |||||
350 | { return (typelib_InterfaceMethodTypeDescription *)getTypeDescr(); } | |||||
351 | ||||||
352 | IdlInterfaceMethodImpl( IdlReflectionServiceImpl * pReflection, const OUString & rName, | |||||
353 | typelib_TypeDescription * pTypeDescr, typelib_TypeDescription * pDeclTypeDescr ) | |||||
354 | : IdlMemberImpl( pReflection, rName, pTypeDescr, pDeclTypeDescr ) | |||||
355 | , _pExceptionTypes( 0 ) | |||||
356 | , _pParamTypes( 0 ) | |||||
357 | , _pParamInfos( 0 ) | |||||
358 | {} | |||||
359 | virtual ~IdlInterfaceMethodImpl(); | |||||
360 | ||||||
361 | // XInterface | |||||
362 | virtual Any SAL_CALL queryInterface( const Type & rType ) throw(::com::sun::star::uno::RuntimeException); | |||||
363 | virtual void SAL_CALL acquire() throw(); | |||||
364 | virtual void SAL_CALL release() throw(); | |||||
365 | ||||||
366 | // XTypeProvider | |||||
367 | virtual Sequence< Type > SAL_CALL getTypes() throw (::com::sun::star::uno::RuntimeException); | |||||
368 | virtual Sequence< sal_Int8 > SAL_CALL getImplementationId() throw (::com::sun::star::uno::RuntimeException); | |||||
369 | ||||||
370 | // XIdlMember | |||||
371 | virtual Reference< XIdlClass > SAL_CALL getDeclaringClass() throw(::com::sun::star::uno::RuntimeException); | |||||
372 | virtual OUString SAL_CALL getName() throw(::com::sun::star::uno::RuntimeException); | |||||
373 | // XIdlMethod | |||||
374 | virtual Reference< XIdlClass > SAL_CALL getReturnType() throw(::com::sun::star::uno::RuntimeException); | |||||
375 | virtual Sequence< Reference< XIdlClass > > SAL_CALL getParameterTypes() throw(::com::sun::star::uno::RuntimeException); | |||||
376 | virtual Sequence< ParamInfo > SAL_CALL getParameterInfos() throw(::com::sun::star::uno::RuntimeException); | |||||
377 | virtual Sequence< Reference< XIdlClass > > SAL_CALL getExceptionTypes() throw(::com::sun::star::uno::RuntimeException); | |||||
378 | virtual MethodMode SAL_CALL getMode() throw(::com::sun::star::uno::RuntimeException); | |||||
379 | virtual Any SAL_CALL invoke( const Any & rObj, Sequence< Any > & rArgs ) throw(::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::reflection::InvocationTargetException, ::com::sun::star::uno::RuntimeException); | |||||
380 | }; | |||||
381 | //__________________________________________________________________________________________________ | |||||
382 | IdlInterfaceMethodImpl::~IdlInterfaceMethodImpl() | |||||
383 | { | |||||
384 | delete _pParamInfos; | |||||
385 | delete _pParamTypes; | |||||
386 | delete _pExceptionTypes; | |||||
387 | } | |||||
388 | ||||||
389 | // XInterface | |||||
390 | //__________________________________________________________________________________________________ | |||||
391 | Any IdlInterfaceMethodImpl::queryInterface( const Type & rType ) | |||||
392 | throw(::com::sun::star::uno::RuntimeException) | |||||
393 | { | |||||
394 | Any aRet( ::cppu::queryInterface( rType, static_cast< XIdlMethod * >( this ) ) ); | |||||
395 | return (aRet.hasValue() ? aRet : IdlMemberImpl::queryInterface( rType )); | |||||
396 | } | |||||
397 | //__________________________________________________________________________________________________ | |||||
398 | void IdlInterfaceMethodImpl::acquire() throw() | |||||
399 | { | |||||
400 | IdlMemberImpl::acquire(); | |||||
401 | } | |||||
402 | //__________________________________________________________________________________________________ | |||||
403 | void IdlInterfaceMethodImpl::release() throw() | |||||
404 | { | |||||
405 | IdlMemberImpl::release(); | |||||
406 | } | |||||
407 | ||||||
408 | // XTypeProvider | |||||
409 | //__________________________________________________________________________________________________ | |||||
410 | Sequence< Type > IdlInterfaceMethodImpl::getTypes() | |||||
411 | throw (::com::sun::star::uno::RuntimeException) | |||||
412 | { | |||||
413 | static OTypeCollection * s_pTypes = 0; | |||||
414 | if (! s_pTypes) | |||||
415 | { | |||||
416 | MutexGuard aGuard( getMutexAccess() ); | |||||
417 | if (! s_pTypes) | |||||
418 | { | |||||
419 | static OTypeCollection s_aTypes( | |||||
420 | ::getCppuType( (const Reference< XIdlMethod > *)0 ), | |||||
421 | IdlMemberImpl::getTypes() ); | |||||
422 | s_pTypes = &s_aTypes; | |||||
423 | } | |||||
424 | } | |||||
425 | return s_pTypes->getTypes(); | |||||
426 | } | |||||
427 | //__________________________________________________________________________________________________ | |||||
428 | Sequence< sal_Int8 > IdlInterfaceMethodImpl::getImplementationId() | |||||
429 | throw (::com::sun::star::uno::RuntimeException) | |||||
430 | { | |||||
431 | static OImplementationId * s_pId = 0; | |||||
432 | if (! s_pId) | |||||
433 | { | |||||
434 | MutexGuard aGuard( getMutexAccess() ); | |||||
435 | if (! s_pId) | |||||
436 | { | |||||
437 | static OImplementationId s_aId; | |||||
438 | s_pId = &s_aId; | |||||
439 | } | |||||
440 | } | |||||
441 | return s_pId->getImplementationId(); | |||||
442 | } | |||||
443 | ||||||
444 | // XIdlMember | |||||
445 | //__________________________________________________________________________________________________ | |||||
446 | Reference< XIdlClass > IdlInterfaceMethodImpl::getDeclaringClass() | |||||
447 | throw(::com::sun::star::uno::RuntimeException) | |||||
448 | { | |||||
449 | if (! _xDeclClass.is()) | |||||
450 | { | |||||
451 | MutexGuard aGuard( getMutexAccess() ); | |||||
452 | if (! _xDeclClass.is()) | |||||
453 | { | |||||
454 | rtl::OUString aName(getMethodTypeDescr()->aBase.aBase.pTypeName); | |||||
455 | sal_Int32 i = aName.indexOf(':'); | |||||
456 | OSL_ASSERT(i >= 0)do { if (true && (!(i >= 0))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/stoc/source/corereflection/criface.cxx" ":" "456" ": "), "OSL_ASSERT: %s", "i >= 0"); } } while ( false); | |||||
457 | _xDeclClass = getReflection()->forName(aName.copy(0, i)); | |||||
458 | } | |||||
459 | } | |||||
460 | return _xDeclClass; | |||||
461 | } | |||||
462 | //__________________________________________________________________________________________________ | |||||
463 | OUString IdlInterfaceMethodImpl::getName() | |||||
464 | throw(::com::sun::star::uno::RuntimeException) | |||||
465 | { | |||||
466 | return IdlMemberImpl::getName(); | |||||
467 | } | |||||
468 | ||||||
469 | // XIdlMethod | |||||
470 | //__________________________________________________________________________________________________ | |||||
471 | Reference< XIdlClass > SAL_CALL IdlInterfaceMethodImpl::getReturnType() | |||||
472 | throw(::com::sun::star::uno::RuntimeException) | |||||
473 | { | |||||
474 | return getReflection()->forType( getMethodTypeDescr()->pReturnTypeRef ); | |||||
475 | } | |||||
476 | //__________________________________________________________________________________________________ | |||||
477 | Sequence< Reference< XIdlClass > > IdlInterfaceMethodImpl::getExceptionTypes() | |||||
478 | throw(::com::sun::star::uno::RuntimeException) | |||||
479 | { | |||||
480 | if (! _pExceptionTypes) | |||||
481 | { | |||||
482 | MutexGuard aGuard( getMutexAccess() ); | |||||
483 | if (! _pExceptionTypes) | |||||
484 | { | |||||
485 | sal_Int32 nExc = getMethodTypeDescr()->nExceptions; | |||||
486 | Sequence< Reference< XIdlClass > > * pTempExceptionTypes = | |||||
487 | new Sequence< Reference< XIdlClass > >( nExc ); | |||||
488 | Reference< XIdlClass > * pExceptionTypes = pTempExceptionTypes->getArray(); | |||||
489 | ||||||
490 | typelib_TypeDescriptionReference ** ppExc = | |||||
491 | getMethodTypeDescr()->ppExceptions; | |||||
492 | IdlReflectionServiceImpl * pRefl = getReflection(); | |||||
493 | ||||||
494 | while (nExc--) | |||||
495 | pExceptionTypes[nExc] = pRefl->forType( ppExc[nExc] ); | |||||
496 | ||||||
497 | _pExceptionTypes = pTempExceptionTypes; | |||||
498 | } | |||||
499 | } | |||||
500 | return *_pExceptionTypes; | |||||
501 | } | |||||
502 | //__________________________________________________________________________________________________ | |||||
503 | Sequence< Reference< XIdlClass > > IdlInterfaceMethodImpl::getParameterTypes() | |||||
504 | throw(::com::sun::star::uno::RuntimeException) | |||||
505 | { | |||||
506 | if (! _pParamTypes) | |||||
507 | { | |||||
508 | MutexGuard aGuard( getMutexAccess() ); | |||||
509 | if (! _pParamTypes) | |||||
510 | { | |||||
511 | sal_Int32 nParams = getMethodTypeDescr()->nParams; | |||||
512 | Sequence< Reference< XIdlClass > > * pTempParamTypes = | |||||
513 | new Sequence< Reference< XIdlClass > >( nParams ); | |||||
514 | Reference< XIdlClass > * pParamTypes = pTempParamTypes->getArray(); | |||||
515 | ||||||
516 | typelib_MethodParameter * pTypelibParams = | |||||
517 | getMethodTypeDescr()->pParams; | |||||
518 | IdlReflectionServiceImpl * pRefl = getReflection(); | |||||
519 | ||||||
520 | while (nParams--) | |||||
521 | pParamTypes[nParams] = pRefl->forType( pTypelibParams[nParams].pTypeRef ); | |||||
522 | ||||||
523 | _pParamTypes = pTempParamTypes; | |||||
524 | } | |||||
525 | } | |||||
526 | return *_pParamTypes; | |||||
527 | } | |||||
528 | //__________________________________________________________________________________________________ | |||||
529 | Sequence< ParamInfo > IdlInterfaceMethodImpl::getParameterInfos() | |||||
530 | throw(::com::sun::star::uno::RuntimeException) | |||||
531 | { | |||||
532 | if (! _pParamInfos) | |||||
533 | { | |||||
534 | MutexGuard aGuard( getMutexAccess() ); | |||||
535 | if (! _pParamInfos) | |||||
536 | { | |||||
537 | sal_Int32 nParams = getMethodTypeDescr()->nParams; | |||||
538 | Sequence< ParamInfo > * pTempParamInfos = new Sequence< ParamInfo >( nParams ); | |||||
539 | ParamInfo * pParamInfos = pTempParamInfos->getArray(); | |||||
540 | ||||||
541 | typelib_MethodParameter * pTypelibParams = | |||||
542 | getMethodTypeDescr()->pParams; | |||||
543 | ||||||
544 | if (_pParamTypes) // use param types | |||||
545 | { | |||||
546 | const Reference< XIdlClass > * pParamTypes = _pParamTypes->getConstArray(); | |||||
547 | ||||||
548 | while (nParams--) | |||||
549 | { | |||||
550 | const typelib_MethodParameter & rParam = pTypelibParams[nParams]; | |||||
551 | ParamInfo & rInfo = pParamInfos[nParams]; | |||||
552 | rInfo.aName = rParam.pName; | |||||
553 | if (rParam.bIn) | |||||
554 | rInfo.aMode = (rParam.bOut ? ParamMode_INOUT : ParamMode_IN); | |||||
555 | else | |||||
556 | rInfo.aMode = ParamMode_OUT; | |||||
557 | rInfo.aType = pParamTypes[nParams]; | |||||
558 | } | |||||
559 | } | |||||
560 | else // make also param types sequence if not already initialized | |||||
561 | { | |||||
562 | Sequence< Reference< XIdlClass > > * pTempParamTypes = | |||||
563 | new Sequence< Reference< XIdlClass > >( nParams ); | |||||
564 | Reference< XIdlClass > * pParamTypes = pTempParamTypes->getArray(); | |||||
565 | ||||||
566 | IdlReflectionServiceImpl * pRefl = getReflection(); | |||||
567 | ||||||
568 | while (nParams--) | |||||
569 | { | |||||
570 | const typelib_MethodParameter & rParam = pTypelibParams[nParams]; | |||||
571 | ParamInfo & rInfo = pParamInfos[nParams]; | |||||
572 | rInfo.aName = rParam.pName; | |||||
573 | if (rParam.bIn) | |||||
574 | rInfo.aMode = (rParam.bOut ? ParamMode_INOUT : ParamMode_IN); | |||||
575 | else | |||||
576 | rInfo.aMode = ParamMode_OUT; | |||||
577 | rInfo.aType = pParamTypes[nParams] = pRefl->forType( rParam.pTypeRef ); | |||||
578 | } | |||||
579 | ||||||
580 | _pParamTypes = pTempParamTypes; | |||||
581 | } | |||||
582 | ||||||
583 | _pParamInfos = pTempParamInfos; | |||||
584 | } | |||||
585 | } | |||||
586 | return *_pParamInfos; | |||||
587 | } | |||||
588 | //__________________________________________________________________________________________________ | |||||
589 | MethodMode SAL_CALL IdlInterfaceMethodImpl::getMode() | |||||
590 | throw(::com::sun::star::uno::RuntimeException) | |||||
591 | { | |||||
592 | return | |||||
593 | getMethodTypeDescr()->bOneWay ? MethodMode_ONEWAY : MethodMode_TWOWAY; | |||||
594 | } | |||||
595 | //__________________________________________________________________________________________________ | |||||
596 | Any SAL_CALL IdlInterfaceMethodImpl::invoke( const Any & rObj, Sequence< Any > & rArgs ) | |||||
597 | throw(::com::sun::star::lang::IllegalArgumentException, | |||||
598 | ::com::sun::star::reflection::InvocationTargetException, | |||||
599 | ::com::sun::star::uno::RuntimeException) | |||||
600 | { | |||||
601 | if (rObj.getValueTypeClass() == TypeClass_INTERFACE) | |||||
| ||||||
602 | { | |||||
603 | // acquire()/ release() | |||||
604 | if (rtl_ustr_ascii_compare( getTypeDescr()->pTypeName->buffer, | |||||
605 | "com.sun.star.uno.XInterface::acquire" ) == 0) | |||||
606 | { | |||||
607 | (*(const Reference< XInterface > *)rObj.getValue())->acquire(); | |||||
608 | return Any(); | |||||
609 | } | |||||
610 | else if (rtl_ustr_ascii_compare( getTypeDescr()->pTypeName->buffer, | |||||
611 | "com.sun.star.uno.XInterface::release" ) == 0) | |||||
612 | { | |||||
613 | (*(const Reference< XInterface > *)rObj.getValue())->release(); | |||||
614 | return Any(); | |||||
615 | } | |||||
616 | } | |||||
617 | ||||||
618 | uno_Interface * pUnoI = getReflection()->mapToUno( | |||||
619 | rObj, (typelib_InterfaceTypeDescription *)getDeclTypeDescr() ); | |||||
620 | OSL_ENSURE( pUnoI, "### illegal destination object given!" )do { if (true && (!(pUnoI))) { sal_detail_logFormat(( SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/stoc/source/corereflection/criface.cxx" ":" "620" ": "), "%s", "### illegal destination object given!" ); } } while (false); | |||||
621 | if (pUnoI) | |||||
622 | { | |||||
623 | sal_Int32 nParams = getMethodTypeDescr()->nParams; | |||||
624 | if (rArgs.getLength() != nParams) | |||||
625 | { | |||||
626 | (*pUnoI->release)( pUnoI ); | |||||
627 | throw IllegalArgumentException( | |||||
628 | OUString( RTL_CONSTASCII_USTRINGPARAM("arguments len differ!")(&("arguments len differ!")[0]), ((sal_Int32)((sizeof ("arguments len differ!" ) / sizeof (("arguments len differ!")[0]))-1)), (((rtl_TextEncoding ) 11)) ), | |||||
629 | *(const Reference< XInterface > *)rObj.getValue(), 1 ); | |||||
630 | } | |||||
631 | ||||||
632 | Any * pCppArgs = rArgs.getArray(); | |||||
633 | typelib_MethodParameter * pParams = getMethodTypeDescr()->pParams; | |||||
634 | typelib_TypeDescription * pReturnType = 0; | |||||
635 | TYPELIB_DANGER_GET({ typelib_TypeDescriptionReference * pMacroTypeRef = (getMethodTypeDescr ()->pReturnTypeRef); typelib_TypeDescription ** ppMacroTypeDescr = (&pReturnType); 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; } } | |||||
636 | &pReturnType, getMethodTypeDescr()->pReturnTypeRef ){ typelib_TypeDescriptionReference * pMacroTypeRef = (getMethodTypeDescr ()->pReturnTypeRef); typelib_TypeDescription ** ppMacroTypeDescr = (&pReturnType); 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; } }; | |||||
637 | ||||||
638 | void * pUnoReturn = alloca( pReturnType->nSize )__builtin_alloca (pReturnType->nSize); | |||||
639 | void ** ppUnoArgs = (void **)alloca( sizeof(void *) * nParams *2 )__builtin_alloca (sizeof(void *) * nParams *2); | |||||
640 | typelib_TypeDescription ** ppParamTypes = (typelib_TypeDescription **)(ppUnoArgs + nParams); | |||||
641 | ||||||
642 | // convert arguments | |||||
643 | for ( sal_Int32 nPos = 0; nPos < nParams; ++nPos ) | |||||
644 | { | |||||
645 | ppParamTypes[nPos] = 0; | |||||
646 | TYPELIB_DANGER_GET( ppParamTypes + nPos, pParams[nPos].pTypeRef ){ typelib_TypeDescriptionReference * pMacroTypeRef = (pParams [nPos].pTypeRef); typelib_TypeDescription ** ppMacroTypeDescr = (ppParamTypes + nPos); 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; } }; | |||||
647 | typelib_TypeDescription * pTD = ppParamTypes[nPos]; | |||||
648 | ||||||
649 | ppUnoArgs[nPos] = alloca( pTD->nSize )__builtin_alloca (pTD->nSize); | |||||
650 | if (pParams[nPos].bIn) | |||||
651 | { | |||||
652 | sal_Bool bAssign; | |||||
653 | if (typelib_typedescriptionreference_equals( | |||||
654 | pCppArgs[nPos].getValueTypeRef(), pTD->pWeakRef )) | |||||
655 | { | |||||
656 | uno_type_copyAndConvertData( | |||||
657 | ppUnoArgs[nPos], (void *)pCppArgs[nPos].getValue(), | |||||
658 | pCppArgs[nPos].getValueTypeRef(), getReflection()->getCpp2Uno().get() ); | |||||
659 | bAssign = sal_True((sal_Bool)1); | |||||
660 | } | |||||
661 | else if (pTD->eTypeClass == typelib_TypeClass_ANY) | |||||
662 | { | |||||
663 | uno_type_any_constructAndConvert( | |||||
664 | (uno_Any *)ppUnoArgs[nPos], (void *)pCppArgs[nPos].getValue(), | |||||
665 | pCppArgs[nPos].getValueTypeRef(), getReflection()->getCpp2Uno().get() ); | |||||
666 | bAssign = sal_True((sal_Bool)1); | |||||
667 | } | |||||
668 | else if (pTD->eTypeClass == typelib_TypeClass_INTERFACE) | |||||
669 | { | |||||
670 | Reference< XInterface > xDest; | |||||
671 | bAssign = extract( | |||||
672 | pCppArgs[nPos], (typelib_InterfaceTypeDescription *)pTD, | |||||
673 | xDest, getReflection() ); | |||||
674 | if (bAssign) | |||||
675 | { | |||||
676 | *(void **)ppUnoArgs[nPos] = getReflection()->getCpp2Uno().mapInterface( | |||||
677 | xDest.get(), (typelib_InterfaceTypeDescription *)pTD ); | |||||
678 | } | |||||
679 | } | |||||
680 | else | |||||
681 | { | |||||
682 | typelib_TypeDescription * pValueTD = 0; | |||||
683 | TYPELIB_DANGER_GET( &pValueTD, pCppArgs[nPos].getValueTypeRef() ){ typelib_TypeDescriptionReference * pMacroTypeRef = (pCppArgs [nPos].getValueTypeRef()); typelib_TypeDescription ** ppMacroTypeDescr = (&pValueTD); 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; } }; | |||||
684 | // construct temp uno val to do proper assignment: todo opt | |||||
685 | void * pTemp = alloca( pValueTD->nSize )__builtin_alloca (pValueTD->nSize); | |||||
| ||||||
686 | uno_copyAndConvertData( | |||||
687 | pTemp, (void *)pCppArgs[nPos].getValue(), pValueTD, | |||||
688 | getReflection()->getCpp2Uno().get() ); | |||||
689 | uno_constructData( | |||||
690 | ppUnoArgs[nPos], pTD ); | |||||
691 | // assignment does simple conversion | |||||
692 | bAssign = uno_assignData( | |||||
693 | ppUnoArgs[nPos], pTD, pTemp, pValueTD, 0, 0, 0 ); | |||||
694 | uno_destructData( | |||||
695 | pTemp, pValueTD, 0 ); | |||||
696 | TYPELIB_DANGER_RELEASE( pValueTD ){ if ((((pValueTD)->eTypeClass) == typelib_TypeClass_INTERFACE_METHOD || ((pValueTD)->eTypeClass) == typelib_TypeClass_INTERFACE_ATTRIBUTE )) typelib_typedescription_release( pValueTD ); }; | |||||
697 | } | |||||
698 | ||||||
699 | if (! bAssign) | |||||
700 | { | |||||
701 | IllegalArgumentException aExc( | |||||
702 | OUString( RTL_CONSTASCII_USTRINGPARAM("cannot coerce argument type during corereflection call!")(&("cannot coerce argument type during corereflection call!" )[0]), ((sal_Int32)((sizeof ("cannot coerce argument type during corereflection call!" ) / sizeof (("cannot coerce argument type during corereflection call!" )[0]))-1)), (((rtl_TextEncoding) 11)) ), | |||||
703 | *(const Reference< XInterface > *)rObj.getValue(), (sal_Int16)nPos ); | |||||
704 | ||||||
705 | // cleanup | |||||
706 | while (nPos--) | |||||
707 | { | |||||
708 | if (pParams[nPos].bIn) | |||||
709 | uno_destructData( ppUnoArgs[nPos], ppParamTypes[nPos], 0 ); | |||||
710 | TYPELIB_DANGER_RELEASE( ppParamTypes[nPos] ){ if ((((ppParamTypes[nPos])->eTypeClass) == typelib_TypeClass_INTERFACE_METHOD || ((ppParamTypes[nPos])->eTypeClass) == typelib_TypeClass_INTERFACE_ATTRIBUTE )) typelib_typedescription_release( ppParamTypes[nPos] ); }; | |||||
711 | } | |||||
712 | TYPELIB_DANGER_RELEASE( pReturnType ){ if ((((pReturnType)->eTypeClass) == typelib_TypeClass_INTERFACE_METHOD || ((pReturnType)->eTypeClass) == typelib_TypeClass_INTERFACE_ATTRIBUTE )) typelib_typedescription_release( pReturnType ); }; | |||||
713 | (*pUnoI->release)( pUnoI ); | |||||
714 | ||||||
715 | throw aExc; | |||||
716 | } | |||||
717 | } | |||||
718 | } | |||||
719 | ||||||
720 | uno_Any aUnoExc; | |||||
721 | uno_Any * pUnoExc = &aUnoExc; | |||||
722 | ||||||
723 | (*pUnoI->pDispatcher)( | |||||
724 | pUnoI, getTypeDescr(), pUnoReturn, ppUnoArgs, &pUnoExc ); | |||||
725 | (*pUnoI->release)( pUnoI ); | |||||
726 | ||||||
727 | Any aRet; | |||||
728 | if (pUnoExc) | |||||
729 | { | |||||
730 | // cleanup | |||||
731 | while (nParams--) | |||||
732 | { | |||||
733 | if (pParams[nParams].bIn) | |||||
734 | uno_destructData( ppUnoArgs[nParams], ppParamTypes[nParams], 0 ); | |||||
735 | TYPELIB_DANGER_RELEASE( ppParamTypes[nParams] ){ if ((((ppParamTypes[nParams])->eTypeClass) == typelib_TypeClass_INTERFACE_METHOD || ((ppParamTypes[nParams])->eTypeClass) == typelib_TypeClass_INTERFACE_ATTRIBUTE )) typelib_typedescription_release( ppParamTypes[nParams] ); }; | |||||
736 | } | |||||
737 | TYPELIB_DANGER_RELEASE( pReturnType ){ if ((((pReturnType)->eTypeClass) == typelib_TypeClass_INTERFACE_METHOD || ((pReturnType)->eTypeClass) == typelib_TypeClass_INTERFACE_ATTRIBUTE )) typelib_typedescription_release( pReturnType ); }; | |||||
738 | ||||||
739 | InvocationTargetException aExc; | |||||
740 | aExc.Context = *(const Reference< XInterface > *)rObj.getValue(); | |||||
741 | aExc.Message = OUString( RTL_CONSTASCII_USTRINGPARAM("exception occurred during invocation!")(&("exception occurred during invocation!")[0]), ((sal_Int32 )((sizeof ("exception occurred during invocation!") / sizeof ( ("exception occurred during invocation!")[0]))-1)), (((rtl_TextEncoding ) 11)) ); | |||||
742 | uno_any_destruct( | |||||
743 | &aExc.TargetException, | |||||
744 | reinterpret_cast< uno_ReleaseFunc >(cpp_release) ); | |||||
745 | uno_type_copyAndConvertData( | |||||
746 | &aExc.TargetException, pUnoExc, ::getCppuType( (const Any *)0 ).getTypeLibType(), | |||||
747 | getReflection()->getUno2Cpp().get() ); | |||||
748 | uno_any_destruct( pUnoExc, 0 ); | |||||
749 | throw aExc; | |||||
750 | } | |||||
751 | else | |||||
752 | { | |||||
753 | // reconvert arguments and cleanup | |||||
754 | while (nParams--) | |||||
755 | { | |||||
756 | if (pParams[nParams].bOut) // write back | |||||
757 | { | |||||
758 | uno_any_destruct( | |||||
759 | &pCppArgs[nParams], | |||||
760 | reinterpret_cast< uno_ReleaseFunc >(cpp_release) ); | |||||
761 | uno_any_constructAndConvert( | |||||
762 | &pCppArgs[nParams], ppUnoArgs[nParams], ppParamTypes[nParams], | |||||
763 | getReflection()->getUno2Cpp().get() ); | |||||
764 | } | |||||
765 | uno_destructData( ppUnoArgs[nParams], ppParamTypes[nParams], 0 ); | |||||
766 | TYPELIB_DANGER_RELEASE( ppParamTypes[nParams] ){ if ((((ppParamTypes[nParams])->eTypeClass) == typelib_TypeClass_INTERFACE_METHOD || ((ppParamTypes[nParams])->eTypeClass) == typelib_TypeClass_INTERFACE_ATTRIBUTE )) typelib_typedescription_release( ppParamTypes[nParams] ); }; | |||||
767 | } | |||||
768 | uno_any_destruct( | |||||
769 | &aRet, reinterpret_cast< uno_ReleaseFunc >(cpp_release) ); | |||||
770 | uno_any_constructAndConvert( | |||||
771 | &aRet, pUnoReturn, pReturnType, | |||||
772 | getReflection()->getUno2Cpp().get() ); | |||||
773 | uno_destructData( pUnoReturn, pReturnType, 0 ); | |||||
774 | TYPELIB_DANGER_RELEASE( pReturnType ){ if ((((pReturnType)->eTypeClass) == typelib_TypeClass_INTERFACE_METHOD || ((pReturnType)->eTypeClass) == typelib_TypeClass_INTERFACE_ATTRIBUTE )) typelib_typedescription_release( pReturnType ); }; | |||||
775 | } | |||||
776 | return aRet; | |||||
777 | } | |||||
778 | throw IllegalArgumentException( | |||||
779 | OUString( RTL_CONSTASCII_USTRINGPARAM("illegal destination object given!")(&("illegal destination object given!")[0]), ((sal_Int32) ((sizeof ("illegal destination object given!") / sizeof (("illegal destination object given!" )[0]))-1)), (((rtl_TextEncoding) 11)) ), | |||||
780 | (XWeak *)(OWeakObject *)this, 0 ); | |||||
781 | } | |||||
782 | ||||||
783 | ||||||
784 | //################################################################################################## | |||||
785 | //################################################################################################## | |||||
786 | //################################################################################################## | |||||
787 | ||||||
788 | ||||||
789 | //__________________________________________________________________________________________________ | |||||
790 | InterfaceIdlClassImpl::~InterfaceIdlClassImpl() | |||||
791 | { | |||||
792 | for ( sal_Int32 nPos = _nMethods + _nAttributes; nPos--; ) | |||||
793 | typelib_typedescription_release( _pSortedMemberInit[nPos].second ); | |||||
794 | ||||||
795 | delete [] _pSortedMemberInit; | |||||
796 | } | |||||
797 | ||||||
798 | //__________________________________________________________________________________________________ | |||||
799 | Sequence< Reference< XIdlClass > > InterfaceIdlClassImpl::getSuperclasses() | |||||
800 | throw(::com::sun::star::uno::RuntimeException) | |||||
801 | { | |||||
802 | MutexGuard aGuard(getMutexAccess()); | |||||
803 | if (_xSuperClasses.getLength() == 0) { | |||||
804 | typelib_InterfaceTypeDescription * pType = getTypeDescr(); | |||||
805 | _xSuperClasses.realloc(pType->nBaseTypes); | |||||
806 | for (sal_Int32 i = 0; i < pType->nBaseTypes; ++i) { | |||||
807 | _xSuperClasses[i] = getReflection()->forType( | |||||
808 | &pType->ppBaseTypes[i]->aBase); | |||||
809 | OSL_ASSERT(_xSuperClasses[i].is())do { if (true && (!(_xSuperClasses[i].is()))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/stoc/source/corereflection/criface.cxx" ":" "809" ": "), "OSL_ASSERT: %s", "_xSuperClasses[i].is()") ; } } while (false); | |||||
810 | } | |||||
811 | } | |||||
812 | return Sequence< Reference< XIdlClass > >(_xSuperClasses); | |||||
813 | } | |||||
814 | //__________________________________________________________________________________________________ | |||||
815 | void InterfaceIdlClassImpl::initMembers() | |||||
816 | { | |||||
817 | sal_Int32 nAll = getTypeDescr()->nAllMembers; | |||||
818 | MemberInit * pSortedMemberInit = new MemberInit[nAll]; | |||||
819 | typelib_TypeDescriptionReference ** ppAllMembers = getTypeDescr()->ppAllMembers; | |||||
820 | ||||||
821 | for ( sal_Int32 nPos = 0; nPos < nAll; ++nPos ) | |||||
822 | { | |||||
823 | sal_Int32 nIndex; | |||||
824 | if (ppAllMembers[nPos]->eTypeClass == typelib_TypeClass_INTERFACE_METHOD) | |||||
825 | { | |||||
826 | // methods to front | |||||
827 | nIndex = _nMethods; | |||||
828 | ++_nMethods; | |||||
829 | } | |||||
830 | else | |||||
831 | { | |||||
832 | ++_nAttributes; | |||||
833 | nIndex = (nAll - _nAttributes); | |||||
834 | // attributes at the back | |||||
835 | } | |||||
836 | ||||||
837 | typelib_TypeDescription * pTD = 0; | |||||
838 | typelib_typedescriptionreference_getDescription( &pTD, ppAllMembers[nPos] ); | |||||
839 | OSL_ENSURE( pTD, "### cannot get type description!" )do { if (true && (!(pTD))) { sal_detail_logFormat((SAL_DETAIL_LOG_LEVEL_WARN ), ("legacy.osl"), ("/usr/local/src/libreoffice/stoc/source/corereflection/criface.cxx" ":" "839" ": "), "%s", "### cannot get type description!"); } } while (false); | |||||
840 | pSortedMemberInit[nIndex].first = ((typelib_InterfaceMemberTypeDescription *)pTD)->pMemberName; | |||||
841 | pSortedMemberInit[nIndex].second = pTD; | |||||
842 | } | |||||
843 | ||||||
844 | _pSortedMemberInit = pSortedMemberInit; | |||||
845 | } | |||||
846 | //__________________________________________________________________________________________________ | |||||
847 | sal_Bool InterfaceIdlClassImpl::isAssignableFrom( const Reference< XIdlClass > & xType ) | |||||
848 | throw(::com::sun::star::uno::RuntimeException) | |||||
849 | { | |||||
850 | if (xType.is() && xType->getTypeClass() == TypeClass_INTERFACE) | |||||
851 | { | |||||
852 | if (equals( xType )) | |||||
853 | return sal_True((sal_Bool)1); | |||||
854 | else | |||||
855 | { | |||||
856 | const Sequence< Reference< XIdlClass > > & rSeq = xType->getSuperclasses(); | |||||
857 | for (sal_Int32 i = 0; i < rSeq.getLength(); ++i) { | |||||
858 | if (isAssignableFrom(rSeq[i])) { | |||||
859 | return true; | |||||
860 | } | |||||
861 | } | |||||
862 | } | |||||
863 | } | |||||
864 | return sal_False((sal_Bool)0); | |||||
865 | } | |||||
866 | //__________________________________________________________________________________________________ | |||||
867 | Uik InterfaceIdlClassImpl::getUik() | |||||
868 | throw(::com::sun::star::uno::RuntimeException) | |||||
869 | { | |||||
870 | return Uik(0, 0, 0, 0, 0); | |||||
871 | // Uiks are deprecated and this function must not be called | |||||
872 | } | |||||
873 | //__________________________________________________________________________________________________ | |||||
874 | Sequence< Reference< XIdlMethod > > InterfaceIdlClassImpl::getMethods() | |||||
875 | throw(::com::sun::star::uno::RuntimeException) | |||||
876 | { | |||||
877 | MutexGuard aGuard( getMutexAccess() ); | |||||
878 | if (! _pSortedMemberInit) | |||||
879 | initMembers(); | |||||
880 | ||||||
881 | // create methods sequence | |||||
882 | Sequence< Reference< XIdlMethod > > aRet( _nMethods ); | |||||
883 | Reference< XIdlMethod > * pRet = aRet.getArray(); | |||||
884 | for ( sal_Int32 nPos = _nMethods; nPos--; ) | |||||
885 | { | |||||
886 | ||||||
887 | /*_aName2Method[_pSortedMemberInit[nPos].first] = */pRet[nPos] = new IdlInterfaceMethodImpl( | |||||
888 | getReflection(), _pSortedMemberInit[nPos].first, | |||||
889 | _pSortedMemberInit[nPos].second, IdlClassImpl::getTypeDescr() ); | |||||
890 | } | |||||
891 | return aRet; | |||||
892 | } | |||||
893 | //__________________________________________________________________________________________________ | |||||
894 | Sequence< Reference< XIdlField > > InterfaceIdlClassImpl::getFields() | |||||
895 | throw(::com::sun::star::uno::RuntimeException) | |||||
896 | { | |||||
897 | MutexGuard aGuard( getMutexAccess() ); | |||||
898 | if (! _pSortedMemberInit) | |||||
899 | initMembers(); | |||||
900 | ||||||
901 | // create fields sequence | |||||
902 | Sequence< Reference< XIdlField > > aRet( _nAttributes ); | |||||
903 | Reference< XIdlField > * pRet = aRet.getArray(); | |||||
904 | for ( sal_Int32 nPos = _nAttributes; nPos--; ) | |||||
905 | { | |||||
906 | /*_aName2Field[_pSortedMemberInit[_nMethods+nPos].first] = */pRet[_nAttributes-nPos-1] = | |||||
907 | new IdlAttributeFieldImpl( | |||||
908 | getReflection(), _pSortedMemberInit[_nMethods+nPos].first, | |||||
909 | _pSortedMemberInit[_nMethods+nPos].second, IdlClassImpl::getTypeDescr() ); | |||||
910 | } | |||||
911 | return aRet; | |||||
912 | } | |||||
913 | //__________________________________________________________________________________________________ | |||||
914 | Reference< XIdlMethod > InterfaceIdlClassImpl::getMethod( const OUString & rName ) | |||||
915 | throw(::com::sun::star::uno::RuntimeException) | |||||
916 | { | |||||
917 | MutexGuard aGuard( getMutexAccess() ); | |||||
918 | if (! _pSortedMemberInit) | |||||
919 | initMembers(); | |||||
920 | ||||||
921 | Reference< XIdlMethod > xRet; | |||||
922 | ||||||
923 | // try weak map | |||||
924 | const OUString2Method::const_iterator iFind( _aName2Method.find( rName ) ); | |||||
925 | if (iFind != _aName2Method.end()) | |||||
926 | xRet = (*iFind).second; // harden ref | |||||
927 | ||||||
928 | if (! xRet.is()) | |||||
929 | { | |||||
930 | for ( sal_Int32 nPos = _nMethods; nPos--; ) | |||||
931 | { | |||||
932 | if (_pSortedMemberInit[nPos].first == rName) | |||||
933 | { | |||||
934 | _aName2Method[rName] = xRet = new IdlInterfaceMethodImpl( | |||||
935 | getReflection(), rName, | |||||
936 | _pSortedMemberInit[nPos].second, IdlClassImpl::getTypeDescr() ); | |||||
937 | break; | |||||
938 | } | |||||
939 | } | |||||
940 | } | |||||
941 | return xRet; | |||||
942 | } | |||||
943 | //__________________________________________________________________________________________________ | |||||
944 | Reference< XIdlField > InterfaceIdlClassImpl::getField( const OUString & rName ) | |||||
945 | throw(::com::sun::star::uno::RuntimeException) | |||||
946 | { | |||||
947 | MutexGuard aGuard( getMutexAccess() ); | |||||
948 | if (! _pSortedMemberInit) | |||||
949 | initMembers(); | |||||
950 | ||||||
951 | Reference< XIdlField > xRet; | |||||
952 | ||||||
953 | // try weak map | |||||
954 | const OUString2Field::const_iterator iFind( _aName2Field.find( rName ) ); | |||||
955 | if (iFind != _aName2Field.end()) | |||||
956 | xRet = (*iFind).second; // harden ref | |||||
957 | ||||||
958 | if (! xRet.is()) | |||||
959 | { | |||||
960 | for ( sal_Int32 nPos = _nAttributes; nPos--; ) | |||||
961 | { | |||||
962 | if (_pSortedMemberInit[_nMethods+nPos].first == rName) | |||||
963 | { | |||||
964 | _aName2Field[rName] = xRet = new IdlAttributeFieldImpl( | |||||
965 | getReflection(), rName, | |||||
966 | _pSortedMemberInit[_nMethods+nPos].second, IdlClassImpl::getTypeDescr() ); | |||||
967 | break; | |||||
968 | } | |||||
969 | } | |||||
970 | } | |||||
971 | return xRet; | |||||
972 | } | |||||
973 | //__________________________________________________________________________________________________ | |||||
974 | void InterfaceIdlClassImpl::createObject( Any & rObj ) | |||||
975 | throw(::com::sun::star::uno::RuntimeException) | |||||
976 | { | |||||
977 | // interfaces cannot be constructed | |||||
978 | rObj.clear(); | |||||
979 | } | |||||
980 | ||||||
981 | } | |||||
982 | ||||||
983 | ||||||
984 | /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |