File: | stoc/source/invocation/invocation.cxx |
Location: | line 942, column 19 |
Description: | Called C++ object pointer is null |
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 | #include <osl/mutex.hxx> | |||
21 | #include <cppuhelper/queryinterface.hxx> | |||
22 | #include <cppuhelper/weak.hxx> | |||
23 | #include <cppuhelper/factory.hxx> | |||
24 | #include <cppuhelper/implementationentry.hxx> | |||
25 | #include <cppuhelper/typeprovider.hxx> | |||
26 | #include <cppuhelper/implbase2.hxx> | |||
27 | ||||
28 | #include <com/sun/star/uno/DeploymentException.hpp> | |||
29 | #include <com/sun/star/script/FailReason.hpp> | |||
30 | #include <com/sun/star/script/XTypeConverter.hpp> | |||
31 | #include <com/sun/star/script/XInvocation.hpp> | |||
32 | #include <com/sun/star/script/XInvocation2.hpp> | |||
33 | #include <com/sun/star/reflection/XIdlReflection.hpp> | |||
34 | #include <com/sun/star/container/XNameContainer.hpp> | |||
35 | #include <com/sun/star/container/XIndexContainer.hpp> | |||
36 | #include <com/sun/star/container/XEnumerationAccess.hpp> | |||
37 | #include <com/sun/star/beans/XExactName.hpp> | |||
38 | #include <com/sun/star/beans/XMaterialHolder.hpp> | |||
39 | #include <com/sun/star/beans/XIntrospection.hpp> | |||
40 | #include <com/sun/star/beans/XPropertySet.hpp> | |||
41 | #include <com/sun/star/beans/PropertyAttribute.hpp> | |||
42 | #include <com/sun/star/beans/MethodConcept.hpp> | |||
43 | #include <com/sun/star/beans/PropertyConcept.hpp> | |||
44 | #include <com/sun/star/lang/XSingleServiceFactory.hpp> | |||
45 | #include <com/sun/star/lang/XMultiServiceFactory.hpp> | |||
46 | #include <com/sun/star/lang/XServiceInfo.hpp> | |||
47 | #include <com/sun/star/lang/XTypeProvider.hpp> | |||
48 | #include <com/sun/star/registry/XRegistryKey.hpp> | |||
49 | ||||
50 | #include <boost/scoped_array.hpp> | |||
51 | #include <rtl/ustrbuf.hxx> | |||
52 | #include <rtl/strbuf.hxx> | |||
53 | ||||
54 | #define SERVICENAME"com.sun.star.script.Invocation" "com.sun.star.script.Invocation" | |||
55 | #define IMPLNAME"com.sun.star.comp.stoc.Invocation" "com.sun.star.comp.stoc.Invocation" | |||
56 | ||||
57 | using namespace com::sun::star::uno; | |||
58 | using namespace com::sun::star::lang; | |||
59 | using namespace com::sun::star::script; | |||
60 | using namespace com::sun::star::reflection; | |||
61 | using namespace com::sun::star::beans; | |||
62 | using namespace com::sun::star::registry; | |||
63 | using namespace com::sun::star::container; | |||
64 | using namespace cppu; | |||
65 | using namespace osl; | |||
66 | using ::rtl::OUString; | |||
67 | ||||
68 | namespace stoc_inv | |||
69 | { | |||
70 | static rtl_StandardModuleCount g_moduleCount = MODULE_COUNT_INIT{ {rtl_moduleCount_acquire,rtl_moduleCount_release}, rtl_moduleCount_canUnload , 0, {0, 0}}; | |||
71 | ||||
72 | static Sequence< OUString > inv_getSupportedServiceNames() | |||
73 | { | |||
74 | Sequence< OUString > seqNames(1); | |||
75 | seqNames.getArray()[0] = OUString(RTL_CONSTASCII_USTRINGPARAM(SERVICENAME)(&("com.sun.star.script.Invocation")[0]), ((sal_Int32)((sizeof ("com.sun.star.script.Invocation") / sizeof (("com.sun.star.script.Invocation" )[0]))-1)), (((rtl_TextEncoding) 11))); | |||
76 | return seqNames; | |||
77 | } | |||
78 | ||||
79 | static OUString inv_getImplementationName() | |||
80 | { | |||
81 | return OUString(RTL_CONSTASCII_USTRINGPARAM(IMPLNAME)(&("com.sun.star.comp.stoc.Invocation")[0]), ((sal_Int32) ((sizeof ("com.sun.star.comp.stoc.Invocation") / sizeof (("com.sun.star.comp.stoc.Invocation" )[0]))-1)), (((rtl_TextEncoding) 11))); | |||
82 | } | |||
83 | ||||
84 | // TODO: Zentral implementieren | |||
85 | inline Reference<XIdlClass> TypeToIdlClass( const Type& rType, const Reference< XIdlReflection > & xRefl ) | |||
86 | { | |||
87 | return xRefl->forName( rType.getTypeName() ); | |||
88 | } | |||
89 | ||||
90 | ||||
91 | //================================================================================================== | |||
92 | class Invocation_Impl | |||
93 | : public OWeakObject | |||
94 | , public XInvocation2 | |||
95 | , public XNameContainer | |||
96 | , public XIndexContainer | |||
97 | , public XEnumerationAccess | |||
98 | , public XExactName | |||
99 | , public XMaterialHolder | |||
100 | , public XTypeProvider | |||
101 | { | |||
102 | public: | |||
103 | Invocation_Impl( const Any & rAdapted, const Reference<XTypeConverter> &, | |||
104 | const Reference<XIntrospection> &, | |||
105 | const Reference<XIdlReflection> & ); | |||
106 | virtual ~Invocation_Impl(); | |||
107 | ||||
108 | // XInterface | |||
109 | virtual Any SAL_CALL queryInterface( const Type & aType) throw( RuntimeException ); | |||
110 | virtual void SAL_CALL acquire() throw() { OWeakObject::acquire(); } | |||
111 | virtual void SAL_CALL release() throw() { OWeakObject::release(); } | |||
112 | ||||
113 | ||||
114 | // XTypeProvider | |||
115 | virtual Sequence< ::com::sun::star::uno::Type > SAL_CALL getTypes( ) | |||
116 | throw(RuntimeException); | |||
117 | virtual Sequence< sal_Int8 > SAL_CALL getImplementationId( ) | |||
118 | throw( RuntimeException); | |||
119 | ||||
120 | // Methoden von XMaterialHolder | |||
121 | virtual Any SAL_CALL getMaterial(void) throw(RuntimeException); | |||
122 | ||||
123 | // ? XTool | |||
124 | virtual void SAL_CALL setMaterial( const Any& rMaterial ); | |||
125 | ||||
126 | // XInvocation | |||
127 | virtual Reference<XIntrospectionAccess> SAL_CALL getIntrospection(void) throw( RuntimeException ); | |||
128 | virtual Any SAL_CALL invoke(const OUString& FunctionName, const Sequence< Any >& Params, Sequence< sal_Int16 >& OutParamIndex, Sequence< Any >& OutParam) | |||
129 | throw( IllegalArgumentException, CannotConvertException, InvocationTargetException, RuntimeException ); | |||
130 | virtual void SAL_CALL setValue(const OUString& PropertyName, const Any& Value) | |||
131 | throw( UnknownPropertyException, CannotConvertException, InvocationTargetException, RuntimeException ); | |||
132 | virtual Any SAL_CALL getValue(const OUString& PropertyName) | |||
133 | throw( UnknownPropertyException, RuntimeException ); | |||
134 | virtual sal_Bool SAL_CALL hasMethod(const OUString& Name) throw( RuntimeException ); | |||
135 | virtual sal_Bool SAL_CALL hasProperty(const OUString& Name) throw( RuntimeException ); | |||
136 | ||||
137 | // XInvocation2 | |||
138 | virtual Sequence< OUString > SAL_CALL getMemberNames( ) | |||
139 | throw( RuntimeException ); | |||
140 | virtual Sequence< InvocationInfo > SAL_CALL getInfo( ) | |||
141 | throw( RuntimeException ); | |||
142 | virtual InvocationInfo SAL_CALL getInfoForName( const OUString& aName, sal_Bool bExact ) | |||
143 | throw( IllegalArgumentException, RuntimeException ); | |||
144 | ||||
145 | // All Access and Container methods are not thread save | |||
146 | // XElementAccess | |||
147 | virtual Type SAL_CALL getElementType(void) throw( RuntimeException ) | |||
148 | { return _xElementAccess->getElementType(); } | |||
149 | ||||
150 | virtual sal_Bool SAL_CALL hasElements(void) throw( RuntimeException ) | |||
151 | { return _xElementAccess->hasElements(); } | |||
152 | ||||
153 | // XNameContainer | |||
154 | virtual void SAL_CALL insertByName( const OUString& Name, const Any& Element ) | |||
155 | throw( IllegalArgumentException, ElementExistException, WrappedTargetException, RuntimeException ) | |||
156 | { _xNameContainer->insertByName( Name, Element ); } | |||
157 | ||||
158 | virtual void SAL_CALL replaceByName( const OUString& Name, const Any& Element ) | |||
159 | throw( IllegalArgumentException, NoSuchElementException, WrappedTargetException, RuntimeException ) | |||
160 | { _xNameContainer->replaceByName( Name, Element ); } | |||
161 | ||||
162 | virtual void SAL_CALL removeByName( const OUString& Name ) | |||
163 | throw( NoSuchElementException, WrappedTargetException, RuntimeException ) | |||
164 | { _xNameContainer->removeByName( Name ); } | |||
165 | ||||
166 | // XNameAccess | |||
167 | virtual Any SAL_CALL getByName( const OUString& Name ) | |||
168 | throw( NoSuchElementException, WrappedTargetException, RuntimeException ) | |||
169 | { return _xNameAccess->getByName( Name ); } | |||
170 | ||||
171 | virtual Sequence<OUString> SAL_CALL getElementNames(void) throw( RuntimeException ) | |||
172 | { return _xNameAccess->getElementNames(); } | |||
173 | ||||
174 | virtual sal_Bool SAL_CALL hasByName( const OUString& Name ) throw( RuntimeException ) | |||
175 | { return _xNameAccess->hasByName( Name ); } | |||
176 | ||||
177 | // XIndexContainer | |||
178 | virtual void SAL_CALL insertByIndex( sal_Int32 Index, const Any& Element ) | |||
179 | throw( IllegalArgumentException, IndexOutOfBoundsException, WrappedTargetException, RuntimeException ) | |||
180 | { _xIndexContainer->insertByIndex( Index, Element ); } | |||
181 | ||||
182 | virtual void SAL_CALL replaceByIndex( sal_Int32 Index, const Any& Element ) | |||
183 | throw( IllegalArgumentException, IndexOutOfBoundsException, WrappedTargetException, RuntimeException ) | |||
184 | { _xIndexContainer->replaceByIndex( Index, Element ); } | |||
185 | ||||
186 | virtual void SAL_CALL removeByIndex( sal_Int32 Index ) | |||
187 | throw( IndexOutOfBoundsException, WrappedTargetException, RuntimeException ) | |||
188 | { _xIndexContainer->removeByIndex( Index ); } | |||
189 | ||||
190 | // XIndexAccess | |||
191 | virtual sal_Int32 SAL_CALL getCount(void) throw( RuntimeException ) | |||
192 | { return _xIndexAccess->getCount(); } | |||
193 | ||||
194 | virtual Any SAL_CALL getByIndex( sal_Int32 Index ) | |||
195 | throw( IndexOutOfBoundsException, WrappedTargetException, RuntimeException ) | |||
196 | { return _xIndexAccess->getByIndex( Index ); } | |||
197 | ||||
198 | // XEnumerationAccess | |||
199 | virtual Reference<XEnumeration> SAL_CALL createEnumeration(void) throw( RuntimeException ) | |||
200 | { return _xEnumerationAccess->createEnumeration(); } | |||
201 | ||||
202 | // XExactName | |||
203 | virtual OUString SAL_CALL getExactName( const OUString& rApproximateName ) throw( RuntimeException ); | |||
204 | ||||
205 | ||||
206 | //===================================================================================================== | |||
207 | private: | |||
208 | void getInfoSequenceImpl( Sequence< OUString >* pStringSeq, Sequence< InvocationInfo >* pInfoSeq ); | |||
209 | void fillInfoForNameAccess( InvocationInfo& rInfo, const OUString& aName ); | |||
210 | void fillInfoForProperty( InvocationInfo& rInfo, const Property& rProp ); | |||
211 | void fillInfoForMethod( InvocationInfo& rInfo, const Reference< XIdlMethod > xMethod ); | |||
212 | ||||
213 | Reference<XTypeConverter> xTypeConverter; | |||
214 | Reference<XIntrospection> xIntrospection; | |||
215 | Reference<XIdlReflection> xCoreReflection; | |||
216 | ||||
217 | Any _aMaterial; | |||
218 | // _xDirect and (_xIntrospectionAccess, xPropertySet) are exclusive | |||
219 | Reference<XInvocation> _xDirect; | |||
220 | Reference<XInvocation2> _xDirect2; | |||
221 | Reference<XPropertySet> _xPropertySet; | |||
222 | Reference<XIntrospectionAccess> _xIntrospectionAccess; | |||
223 | ||||
224 | // supplied Interfaces | |||
225 | Reference<XNameContainer> _xNameContainer; | |||
226 | Reference<XNameAccess> _xNameAccess; | |||
227 | Reference<XIndexContainer> _xIndexContainer; | |||
228 | Reference<XIndexAccess> _xIndexAccess; | |||
229 | Reference<XEnumerationAccess> _xEnumerationAccess; | |||
230 | Reference<XElementAccess> _xElementAccess; | |||
231 | ||||
232 | // | |||
233 | Reference<XExactName> _xENDirect, _xENIntrospection, _xENNameAccess; | |||
234 | }; | |||
235 | ||||
236 | ||||
237 | //================================================================================================== | |||
238 | //================================================================================================== | |||
239 | //================================================================================================== | |||
240 | ||||
241 | //-------------------------------------------------------------------------------------------------- | |||
242 | Invocation_Impl::Invocation_Impl | |||
243 | ( | |||
244 | const Any & rAdapted, | |||
245 | const Reference<XTypeConverter> & rTC, | |||
246 | const Reference<XIntrospection> & rI, | |||
247 | const Reference<XIdlReflection> & rCR | |||
248 | ) | |||
249 | : xTypeConverter( rTC ) | |||
250 | , xIntrospection( rI ) | |||
251 | , xCoreReflection( rCR ) | |||
252 | { | |||
253 | g_moduleCount.modCnt.acquire( &g_moduleCount.modCnt ); | |||
254 | setMaterial( rAdapted ); | |||
255 | } | |||
256 | ||||
257 | Invocation_Impl::~Invocation_Impl() | |||
258 | { | |||
259 | g_moduleCount.modCnt.release( &g_moduleCount.modCnt ); | |||
260 | } | |||
261 | ||||
262 | //################################################################################################## | |||
263 | //### INTERFACE IMPLEMENTATIONS #################################################################### | |||
264 | //################################################################################################## | |||
265 | ||||
266 | ||||
267 | Any SAL_CALL Invocation_Impl::queryInterface( const Type & aType ) | |||
268 | throw( RuntimeException ) | |||
269 | { | |||
270 | // PropertySet-Implementation | |||
271 | Any a = ::cppu::queryInterface( aType, | |||
272 | (static_cast< XInvocation* >(this)), | |||
273 | (static_cast< XMaterialHolder* >(this)), | |||
274 | (static_cast< XTypeProvider * >(this)) ); | |||
275 | if( a.hasValue() ) | |||
276 | { | |||
277 | return a; | |||
278 | } | |||
279 | ||||
280 | if( aType == getCppuType( (Reference<XExactName>*) NULL__null ) ) | |||
281 | { | |||
282 | // Ivocation does not support XExactName, if direct object supports | |||
283 | // XInvocation, but not XExactName. | |||
284 | if ((_xDirect.is() && _xENDirect.is()) || | |||
285 | (!_xDirect.is() && (_xENIntrospection.is() || _xENNameAccess.is()))) | |||
286 | { | |||
287 | return makeAny( Reference< XExactName >( (static_cast< XExactName* >(this)) ) ); | |||
288 | } | |||
289 | } | |||
290 | else if ( aType == getCppuType( (Reference<XNameContainer>*) NULL__null ) ) | |||
291 | { | |||
292 | if( _xNameContainer.is() ) | |||
293 | return makeAny( Reference< XNameContainer >( (static_cast< XNameContainer* >(this)) ) ); | |||
294 | } | |||
295 | else if ( aType == getCppuType( (Reference<XNameAccess>*) NULL__null ) ) | |||
296 | { | |||
297 | if( _xNameAccess.is() ) | |||
298 | return makeAny( Reference< XNameAccess >( (static_cast< XNameAccess* >(this)) ) ); | |||
299 | } | |||
300 | else if ( aType == getCppuType( (Reference<XIndexContainer>*) NULL__null ) ) | |||
301 | { | |||
302 | if (_xIndexContainer.is()) | |||
303 | return makeAny( Reference< XIndexContainer >( (static_cast< XIndexContainer* >(this)) ) ); | |||
304 | } | |||
305 | else if ( aType == getCppuType( (Reference<XIndexAccess>*) NULL__null ) ) | |||
306 | { | |||
307 | if (_xIndexAccess.is()) | |||
308 | return makeAny( Reference< XIndexAccess >( (static_cast< XIndexAccess* >(this)) ) ); | |||
309 | } | |||
310 | else if ( aType == getCppuType( (Reference<XEnumerationAccess>*) NULL__null ) ) | |||
311 | { | |||
312 | if (_xEnumerationAccess.is()) | |||
313 | return makeAny( Reference< XEnumerationAccess >( (static_cast< XEnumerationAccess* >(this)) ) ); | |||
314 | } | |||
315 | else if ( aType == getCppuType( (Reference<XElementAccess>*) NULL__null ) ) | |||
316 | { | |||
317 | if (_xElementAccess.is()) | |||
318 | { | |||
319 | return makeAny( Reference< XElementAccess >( | |||
320 | (static_cast< XElementAccess* >((static_cast< XNameContainer* >(this))) ) ) ); | |||
321 | } | |||
322 | } | |||
323 | else if ( aType == getCppuType( (Reference<XInvocation2>*) NULL__null ) ) | |||
324 | { | |||
325 | // Invocation does not support XInvocation2, if direct object supports | |||
326 | // XInvocation, but not XInvocation2. | |||
327 | if ( ( _xDirect.is() && _xDirect2.is()) || | |||
328 | (!_xDirect.is() && _xIntrospectionAccess.is() ) ) | |||
329 | { | |||
330 | return makeAny( Reference< XInvocation2 >( (static_cast< XInvocation2* >(this)) ) ); | |||
331 | } | |||
332 | } | |||
333 | ||||
334 | return OWeakObject::queryInterface( aType ); | |||
335 | } | |||
336 | ||||
337 | ||||
338 | //-------------------------------------------------------------------------------------------------- | |||
339 | Any Invocation_Impl::getMaterial(void) throw(RuntimeException) | |||
340 | { | |||
341 | // AB, 12.2.1999 Sicherstellen, dass das Material wenn moeglich | |||
342 | // aus der direkten Invocation bzw. von der Introspection geholt | |||
343 | // wird, da sonst Structs nicht korrekt behandelt werden | |||
344 | Reference<XMaterialHolder> xMaterialHolder; | |||
345 | if( _xDirect.is() ) | |||
346 | { | |||
347 | xMaterialHolder = Reference<XMaterialHolder>::query( _xDirect ); | |||
348 | //_xDirect->queryInterface( XMaterialHolder::getSmartUik(), xMaterialHolder ); | |||
349 | } | |||
350 | else if( _xIntrospectionAccess.is() ) | |||
351 | { | |||
352 | xMaterialHolder = Reference<XMaterialHolder>::query( _xIntrospectionAccess ); | |||
353 | //_xIntrospectionAccess->queryInterface( XMaterialHolder::getSmartUik(), xMaterialHolder ); | |||
354 | } | |||
355 | if( xMaterialHolder.is() ) | |||
356 | { | |||
357 | return xMaterialHolder->getMaterial(); | |||
358 | } | |||
359 | return _aMaterial; | |||
360 | } | |||
361 | ||||
362 | //-------------------------------------------------------------------------------------------------- | |||
363 | void Invocation_Impl::setMaterial( const Any& rMaterial ) | |||
364 | { | |||
365 | // set the material first and only once | |||
366 | Reference<XInterface> xObj; | |||
367 | ||||
368 | if (rMaterial.getValueType().getTypeClass() == TypeClass_INTERFACE) | |||
369 | xObj = *(Reference<XInterface>*)rMaterial.getValue(); | |||
370 | _aMaterial = rMaterial; | |||
371 | ||||
372 | // Ersteinmal alles ausserhalb des guards machen | |||
373 | _xDirect = Reference<XInvocation>::query( xObj ); | |||
374 | ||||
375 | if( _xDirect.is() ) | |||
376 | { | |||
377 | // Objekt direkt befragen | |||
378 | _xElementAccess = Reference<XElementAccess>::query( _xDirect ); | |||
379 | _xEnumerationAccess = Reference<XEnumerationAccess>::query( _xDirect ); | |||
380 | _xIndexAccess = Reference<XIndexAccess>::query( _xDirect ); | |||
381 | _xIndexContainer = Reference<XIndexContainer>::query( _xDirect ); | |||
382 | _xNameAccess = Reference<XNameAccess>::query( _xDirect ); | |||
383 | _xNameContainer = Reference<XNameContainer>::query( _xDirect ); | |||
384 | _xENDirect = Reference<XExactName>::query( _xDirect ); | |||
385 | _xDirect2 = Reference<XInvocation2>::query( _xDirect ); | |||
386 | ||||
387 | // only once!!! | |||
388 | //_xIntrospectionAccess = XIntrospectionAccessRef(); | |||
389 | //_xPropertySet = XPropertySetRef(); | |||
390 | } | |||
391 | else | |||
392 | { | |||
393 | // Invocation ueber die Introspection machen | |||
394 | if (xIntrospection.is()) | |||
395 | { | |||
396 | _xIntrospectionAccess = xIntrospection->inspect( _aMaterial ); | |||
397 | if( _xIntrospectionAccess.is() ) | |||
398 | { | |||
399 | ||||
400 | _xElementAccess = Reference<XElementAccess>::query( | |||
401 | _xIntrospectionAccess->queryAdapter( | |||
402 | getCppuType( (Reference<XElementAccess>*) NULL__null ) ) ); | |||
403 | ||||
404 | _xEnumerationAccess = Reference<XEnumerationAccess>::query( | |||
405 | _xIntrospectionAccess->queryAdapter( | |||
406 | getCppuType( (Reference<XEnumerationAccess>*) NULL__null )) ); | |||
407 | ||||
408 | _xIndexAccess = Reference<XIndexAccess>::query( | |||
409 | _xIntrospectionAccess->queryAdapter( | |||
410 | getCppuType( (Reference<XIndexAccess>*) NULL__null ) ) ); | |||
411 | ||||
412 | _xIndexContainer = Reference<XIndexContainer>::query( | |||
413 | _xIntrospectionAccess->queryAdapter( | |||
414 | getCppuType( (Reference<XIndexContainer>*) NULL__null ) ) ); | |||
415 | ||||
416 | _xNameAccess = Reference<XNameAccess>::query( | |||
417 | _xIntrospectionAccess->queryAdapter( | |||
418 | getCppuType( (Reference<XNameAccess>*) NULL__null ) ) ); | |||
419 | ||||
420 | _xNameContainer = Reference<XNameContainer>::query( | |||
421 | _xIntrospectionAccess->queryAdapter( | |||
422 | getCppuType( (Reference<XNameContainer>*) NULL__null ) ) ); | |||
423 | ||||
424 | _xPropertySet = Reference<XPropertySet>::query( | |||
425 | _xIntrospectionAccess->queryAdapter( | |||
426 | getCppuType( (Reference<XPropertySet>*) NULL__null )) ); | |||
427 | ||||
428 | _xENIntrospection = Reference<XExactName>::query( _xIntrospectionAccess ); | |||
429 | if (_xNameAccess.is()) | |||
430 | _xENNameAccess = Reference<XExactName>::query( _xNameAccess ); | |||
431 | } | |||
432 | } | |||
433 | /* only once !!! | |||
434 | _xDirect = XInvocationRef(); | |||
435 | if( !_xIntrospectionAccess.is() ) | |||
436 | { | |||
437 | // reset | |||
438 | _xElementAccess = XElementAccessRef(); | |||
439 | _xEnumerationAccess = XEnumerationAccessRef(); | |||
440 | _xIndexAccess = XIndexAccessRef(); | |||
441 | _xIndexContainer = XIndexContainerRef(); | |||
442 | _xNameAccess = XNameAccessRef(); | |||
443 | _xNameContainer = XNameContainerRef(); | |||
444 | _xPropertySet = XPropertySetRef(); | |||
445 | } | |||
446 | */ | |||
447 | } | |||
448 | } | |||
449 | ||||
450 | //-------------------------------------------------------------------------------------------------- | |||
451 | OUString Invocation_Impl::getExactName( const OUString& rApproximateName ) | |||
452 | throw( RuntimeException ) | |||
453 | { | |||
454 | if (_xENDirect.is()) | |||
455 | return _xENDirect->getExactName( rApproximateName ); | |||
456 | ||||
457 | OUString aRet; | |||
458 | if (_xENIntrospection.is()) | |||
459 | aRet = _xENIntrospection->getExactName( rApproximateName ); | |||
460 | if (aRet.isEmpty() && _xENNameAccess.is()) | |||
461 | aRet = _xENNameAccess->getExactName( rApproximateName ); | |||
462 | return aRet; | |||
463 | } | |||
464 | ||||
465 | //-------------------------------------------------------------------------------------------------- | |||
466 | Reference<XIntrospectionAccess> Invocation_Impl::getIntrospection(void) | |||
467 | throw( RuntimeException ) | |||
468 | { | |||
469 | if( _xDirect.is() ) | |||
470 | return _xDirect->getIntrospection(); | |||
471 | else | |||
472 | return _xIntrospectionAccess; | |||
473 | } | |||
474 | ||||
475 | //-------------------------------------------------------------------------------------------------- | |||
476 | sal_Bool Invocation_Impl::hasMethod( const OUString& Name ) | |||
477 | throw( RuntimeException ) | |||
478 | { | |||
479 | if (_xDirect.is()) | |||
480 | return _xDirect->hasMethod( Name ); | |||
481 | if( _xIntrospectionAccess.is() ) | |||
482 | return _xIntrospectionAccess->hasMethod( Name, MethodConcept::ALL ^ MethodConcept::DANGEROUS ); | |||
483 | return sal_False((sal_Bool)0); | |||
484 | } | |||
485 | ||||
486 | //-------------------------------------------------------------------------------------------------- | |||
487 | sal_Bool Invocation_Impl::hasProperty( const OUString& Name ) | |||
488 | throw( RuntimeException ) | |||
489 | { | |||
490 | if (_xDirect.is()) | |||
491 | return _xDirect->hasProperty( Name ); | |||
492 | // PropertySet | |||
493 | if( _xIntrospectionAccess.is() | |||
494 | && _xIntrospectionAccess->hasProperty( Name, PropertyConcept::ALL ^ PropertyConcept::DANGEROUS ) ) | |||
495 | return sal_True((sal_Bool)1); | |||
496 | // NameAccess | |||
497 | if( _xNameAccess.is() ) | |||
498 | return _xNameAccess->hasByName( Name ); | |||
499 | return sal_False((sal_Bool)0); | |||
500 | } | |||
501 | ||||
502 | //-------------------------------------------------------------------------------------------------- | |||
503 | Any Invocation_Impl::getValue( const OUString& PropertyName ) | |||
504 | throw( UnknownPropertyException, RuntimeException ) | |||
505 | { | |||
506 | if (_xDirect.is()) | |||
507 | return _xDirect->getValue( PropertyName ); | |||
508 | try | |||
509 | { | |||
510 | // PropertySet | |||
511 | if( _xIntrospectionAccess.is() && _xPropertySet.is() | |||
512 | && _xIntrospectionAccess->hasProperty | |||
513 | ( PropertyName, PropertyConcept::ALL ^ PropertyConcept::DANGEROUS ) ) | |||
514 | { | |||
515 | return _xPropertySet->getPropertyValue( PropertyName ); | |||
516 | } | |||
517 | // NameAccess | |||
518 | if( _xNameAccess.is() && _xNameAccess->hasByName( PropertyName ) ) | |||
519 | return _xNameAccess->getByName( PropertyName ); | |||
520 | } | |||
521 | catch (UnknownPropertyException &) | |||
522 | { | |||
523 | throw; | |||
524 | } | |||
525 | catch (RuntimeException &) | |||
526 | { | |||
527 | throw; | |||
528 | } | |||
529 | catch (Exception &) | |||
530 | { | |||
531 | } | |||
532 | ||||
533 | throw UnknownPropertyException( | |||
534 | OUString( RTL_CONSTASCII_USTRINGPARAM("cannot get value ")(&("cannot get value ")[0]), ((sal_Int32)((sizeof ("cannot get value " ) / sizeof (("cannot get value ")[0]))-1)), (((rtl_TextEncoding ) 11)) ) + PropertyName, | |||
535 | Reference< XInterface >() ); | |||
536 | } | |||
537 | ||||
538 | //-------------------------------------------------------------------------------------------------- | |||
539 | void Invocation_Impl::setValue( const OUString& PropertyName, const Any& Value ) | |||
540 | throw( UnknownPropertyException, CannotConvertException, InvocationTargetException, RuntimeException ) | |||
541 | { | |||
542 | if (_xDirect.is()) | |||
543 | _xDirect->setValue( PropertyName, Value ); | |||
544 | else | |||
545 | { | |||
546 | try | |||
547 | { | |||
548 | // Properties | |||
549 | if( _xIntrospectionAccess.is() && _xPropertySet.is() | |||
550 | && _xIntrospectionAccess->hasProperty( | |||
551 | PropertyName, PropertyConcept::ALL ^ PropertyConcept::DANGEROUS ) ) | |||
552 | { | |||
553 | Property aProp = _xIntrospectionAccess->getProperty( | |||
554 | PropertyName, PropertyConcept::ALL ^ PropertyConcept::DANGEROUS ); | |||
555 | Reference < XIdlClass > r = TypeToIdlClass( aProp.Type, xCoreReflection ); | |||
556 | if( r->isAssignableFrom( TypeToIdlClass( Value.getValueType(), xCoreReflection ) ) ) | |||
557 | _xPropertySet->setPropertyValue( PropertyName, Value ); | |||
558 | else if( xTypeConverter.is() ) | |||
559 | _xPropertySet->setPropertyValue( | |||
560 | PropertyName, xTypeConverter->convertTo( Value, aProp.Type ) ); | |||
561 | else | |||
562 | throw RuntimeException( | |||
563 | OUString( RTL_CONSTASCII_USTRINGPARAM("no type converter service!")(&("no type converter service!")[0]), ((sal_Int32)((sizeof ("no type converter service!") / sizeof (("no type converter service!" )[0]))-1)), (((rtl_TextEncoding) 11)) ), | |||
564 | Reference< XInterface >() ); | |||
565 | } | |||
566 | // NameContainer | |||
567 | else if( _xNameContainer.is() ) | |||
568 | { | |||
569 | Any aConv; | |||
570 | Reference < XIdlClass > r = | |||
571 | TypeToIdlClass( _xNameContainer->getElementType(), xCoreReflection ); | |||
572 | if( r->isAssignableFrom(TypeToIdlClass( Value.getValueType(), xCoreReflection ) ) ) | |||
573 | aConv = Value; | |||
574 | else if( xTypeConverter.is() ) | |||
575 | aConv = xTypeConverter->convertTo( Value, _xNameContainer->getElementType() ); | |||
576 | else | |||
577 | throw RuntimeException( | |||
578 | OUString( RTL_CONSTASCII_USTRINGPARAM("no type converter service!")(&("no type converter service!")[0]), ((sal_Int32)((sizeof ("no type converter service!") / sizeof (("no type converter service!" )[0]))-1)), (((rtl_TextEncoding) 11)) ), | |||
579 | Reference< XInterface >() ); | |||
580 | ||||
581 | // bei Vorhandensein ersetzen, ansonsten einfuegen | |||
582 | if (_xNameContainer->hasByName( PropertyName )) | |||
583 | _xNameContainer->replaceByName( PropertyName, aConv ); | |||
584 | else | |||
585 | _xNameContainer->insertByName( PropertyName, aConv ); | |||
586 | } | |||
587 | else | |||
588 | throw UnknownPropertyException( | |||
589 | OUString( RTL_CONSTASCII_USTRINGPARAM("no introspection nor name container!")(&("no introspection nor name container!")[0]), ((sal_Int32 )((sizeof ("no introspection nor name container!") / sizeof ( ("no introspection nor name container!")[0]))-1)), (((rtl_TextEncoding ) 11)) ), | |||
590 | Reference< XInterface >() ); | |||
591 | } | |||
592 | catch (UnknownPropertyException &) | |||
593 | { | |||
594 | throw; | |||
595 | } | |||
596 | catch (CannotConvertException &) | |||
597 | { | |||
598 | throw; | |||
599 | } | |||
600 | catch (InvocationTargetException &) | |||
601 | { | |||
602 | throw; | |||
603 | } | |||
604 | catch (RuntimeException &) | |||
605 | { | |||
606 | throw; | |||
607 | } | |||
608 | catch (const Exception & exc) | |||
609 | { | |||
610 | throw InvocationTargetException( | |||
611 | OUString( RTL_CONSTASCII_USTRINGPARAM("exception occurred in setValue(): ")(&("exception occurred in setValue(): ")[0]), ((sal_Int32 )((sizeof ("exception occurred in setValue(): ") / sizeof (("exception occurred in setValue(): " )[0]))-1)), (((rtl_TextEncoding) 11)) ) + | |||
612 | exc.Message, Reference< XInterface >(), makeAny( exc /* though sliced */ ) ); | |||
613 | } | |||
614 | } | |||
615 | } | |||
616 | ||||
617 | //-------------------------------------------------------------------------------------------------- | |||
618 | Any Invocation_Impl::invoke( const OUString& FunctionName, const Sequence<Any>& InParams, | |||
619 | Sequence<sal_Int16>& OutIndizes, Sequence<Any>& OutParams ) | |||
620 | throw( IllegalArgumentException, CannotConvertException, InvocationTargetException, RuntimeException ) | |||
621 | { | |||
622 | if (_xDirect.is()) | |||
623 | return _xDirect->invoke( FunctionName, InParams, OutIndizes, OutParams ); | |||
624 | ||||
625 | if (_xIntrospectionAccess.is()) | |||
626 | { | |||
627 | // throw NoSuchMethodException if not exist | |||
628 | Reference<XIdlMethod> xMethod = _xIntrospectionAccess->getMethod( | |||
629 | FunctionName, MethodConcept::ALL ^ MethodConcept::DANGEROUS ); | |||
630 | ||||
631 | // ParameterInfos | |||
632 | Sequence<ParamInfo> aFParams = xMethod->getParameterInfos(); | |||
633 | const ParamInfo* pFParams = aFParams.getConstArray(); | |||
634 | sal_Int32 nFParamsLen = aFParams.getLength(); | |||
635 | if (nFParamsLen != InParams.getLength()) | |||
636 | { | |||
637 | throw IllegalArgumentException( | |||
638 | OUString( RTL_CONSTASCII_USTRINGPARAM("incorrect number of parameters passed invoking function ")(&("incorrect number of parameters passed invoking function " )[0]), ((sal_Int32)((sizeof ("incorrect number of parameters passed invoking function " ) / sizeof (("incorrect number of parameters passed invoking function " )[0]))-1)), (((rtl_TextEncoding) 11)) ) + FunctionName, | |||
639 | (OWeakObject *) this, (sal_Int16) 1 ); | |||
640 | } | |||
641 | ||||
642 | // IN Parameter | |||
643 | const Any* pInParams = InParams.getConstArray(); | |||
644 | ||||
645 | // Introspection Invoke Parameter | |||
646 | Sequence<Any> aInvokeParams( nFParamsLen ); | |||
647 | Any* pInvokeParams = aInvokeParams.getArray(); | |||
648 | ||||
649 | // OUT Indizes | |||
650 | OutIndizes.realloc( nFParamsLen ); | |||
651 | sal_Int16* pOutIndizes = OutIndizes.getArray(); | |||
652 | sal_uInt32 nOutIndex = 0; | |||
653 | ||||
654 | for ( sal_Int32 nPos = 0; nPos < nFParamsLen; ++nPos ) | |||
655 | { | |||
656 | try | |||
657 | { | |||
658 | const ParamInfo& rFParam = pFParams[nPos]; | |||
659 | const Reference<XIdlClass>& rDestType = rFParam.aType; | |||
660 | ||||
661 | // is IN/INOUT parameter? | |||
662 | if (rFParam.aMode != ParamMode_OUT) | |||
663 | { | |||
664 | if (rDestType->isAssignableFrom( TypeToIdlClass( pInParams[nPos].getValueType(), xCoreReflection ) )) | |||
665 | { | |||
666 | pInvokeParams[nPos] = pInParams[nPos]; | |||
667 | } | |||
668 | else if (xTypeConverter.is()) | |||
669 | { | |||
670 | Type aDestType( rDestType->getTypeClass(), rDestType->getName() ); | |||
671 | pInvokeParams[nPos] = xTypeConverter->convertTo( pInParams[nPos], aDestType ); | |||
672 | } | |||
673 | else | |||
674 | { | |||
675 | CannotConvertException aExc; | |||
676 | aExc.Context = *this; | |||
677 | aExc.Message = OUString( RTL_CONSTASCII_USTRINGPARAM("invocation type mismatch!")(&("invocation type mismatch!")[0]), ((sal_Int32)((sizeof ("invocation type mismatch!") / sizeof (("invocation type mismatch!" )[0]))-1)), (((rtl_TextEncoding) 11)) ); | |||
678 | throw aExc; | |||
679 | } | |||
680 | } | |||
681 | ||||
682 | // is OUT/INOUT parameter? | |||
683 | if (rFParam.aMode != ParamMode_IN) | |||
684 | { | |||
685 | pOutIndizes[nOutIndex] = (sal_Int16)nPos; | |||
686 | if (rFParam.aMode == ParamMode_OUT) | |||
687 | rDestType->createObject( pInvokeParams[nPos] ); // default init | |||
688 | ++nOutIndex; | |||
689 | } | |||
690 | } | |||
691 | catch( CannotConvertException& rExc ) | |||
692 | { | |||
693 | rExc.ArgumentIndex = nPos; // optionalen Parameter Index hinzufuegen | |||
694 | throw; | |||
695 | } | |||
696 | } | |||
697 | ||||
698 | // execute Method | |||
699 | Any aRet = xMethod->invoke( _aMaterial, aInvokeParams ); | |||
700 | ||||
701 | // OUT Params | |||
702 | OutIndizes.realloc( nOutIndex ); | |||
703 | pOutIndizes = OutIndizes.getArray(); | |||
704 | OutParams.realloc( nOutIndex ); | |||
705 | Any* pOutParams = OutParams.getArray(); | |||
706 | ||||
707 | while (nOutIndex--) | |||
708 | { | |||
709 | pOutParams[nOutIndex] = pInvokeParams[ pOutIndizes[nOutIndex] ]; | |||
710 | } | |||
711 | ||||
712 | return aRet; | |||
713 | } | |||
714 | ||||
715 | RuntimeException aExc; | |||
716 | aExc.Context = *this; | |||
717 | aExc.Message = OUString( RTL_CONSTASCII_USTRINGPARAM("invocation lacking of introspection access!")(&("invocation lacking of introspection access!")[0]), (( sal_Int32)((sizeof ("invocation lacking of introspection access!" ) / sizeof (("invocation lacking of introspection access!")[0 ]))-1)), (((rtl_TextEncoding) 11)) ); | |||
718 | throw aExc; | |||
719 | } | |||
720 | ||||
721 | //-------------------------------------------------------------------------------------------------- | |||
722 | ||||
723 | // Struct to optimize sorting | |||
724 | struct MemberItem | |||
725 | { | |||
726 | OUString aName; | |||
727 | ||||
728 | // Defines where the member comes from | |||
729 | enum Mode { NAMEACCESS, PROPERTYSET, METHOD } eMode; | |||
730 | ||||
731 | // Index to respective sequence | |||
732 | // (Index to NameAccess sequence for eMode==NAMEACCESS etc.) | |||
733 | sal_Int32 nIndex; | |||
734 | }; | |||
735 | ||||
736 | // Implementation of getting name or info | |||
737 | // String sequence will be filled when pStringSeq != NULL | |||
738 | // Info sequence will be filled when pInfoSeq != NULL | |||
739 | void Invocation_Impl::getInfoSequenceImpl | |||
740 | ( | |||
741 | Sequence< OUString >* pStringSeq, | |||
742 | Sequence< InvocationInfo >* pInfoSeq | |||
743 | ) | |||
744 | { | |||
745 | //Sequence< OUString > aStrSeq; | |||
746 | //if( !pStringSeq ) | |||
747 | //pStringSeq = &aStrSeq; | |||
748 | ||||
749 | ||||
750 | // Get all needed sequences | |||
751 | Sequence<OUString> aNameAccessNames; | |||
752 | Sequence<Property> aPropertySeq; | |||
753 | Sequence< Reference< XIdlMethod > > aMethodSeq; | |||
754 | ||||
755 | if( _xNameAccess.is() ) | |||
756 | { | |||
757 | aNameAccessNames = _xNameAccess->getElementNames(); | |||
758 | } | |||
759 | ||||
760 | if( _xIntrospectionAccess.is() ) | |||
761 | { | |||
762 | aPropertySeq = _xIntrospectionAccess->getProperties | |||
763 | ( PropertyConcept::ALL - PropertyConcept::DANGEROUS ); | |||
764 | ||||
765 | aMethodSeq = _xIntrospectionAccess->getMethods | |||
766 | ( MethodConcept::ALL - MethodConcept::DANGEROUS ); | |||
767 | } | |||
768 | ||||
769 | sal_Int32 nNameAccessCount = aNameAccessNames.getLength(); | |||
770 | sal_Int32 nPropertyCount = aPropertySeq.getLength(); | |||
771 | sal_Int32 nMethodCount = aMethodSeq.getLength(); | |||
772 | sal_Int32 nTotalCount = nNameAccessCount + nPropertyCount + nMethodCount; | |||
773 | ||||
774 | // Create and fill array of MemberItems | |||
775 | boost::scoped_array< MemberItem > pItems( new MemberItem[ nTotalCount ] ); | |||
776 | const OUString* pStrings = aNameAccessNames.getConstArray(); | |||
777 | const Property* pProps = aPropertySeq.getConstArray(); | |||
778 | const Reference< XIdlMethod >* pMethods = aMethodSeq.getConstArray(); | |||
779 | ||||
780 | // Fill array of MemberItems | |||
781 | sal_Int32 i, iTotal = 0; | |||
782 | ||||
783 | // Name Access | |||
784 | for( i = 0 ; i < nNameAccessCount ; i++, iTotal++ ) | |||
785 | { | |||
786 | MemberItem& rItem = pItems[ iTotal ]; | |||
787 | rItem.aName = pStrings[ i ]; | |||
788 | rItem.eMode = MemberItem::NAMEACCESS; | |||
789 | rItem.nIndex = i; | |||
790 | } | |||
791 | ||||
792 | // Property set | |||
793 | for( i = 0 ; i < nPropertyCount ; i++, iTotal++ ) | |||
794 | { | |||
795 | MemberItem& rItem = pItems[ iTotal ]; | |||
796 | rItem.aName = pProps[ i ].Name; | |||
797 | rItem.eMode = MemberItem::PROPERTYSET; | |||
798 | rItem.nIndex = i; | |||
799 | } | |||
800 | ||||
801 | // Methods | |||
802 | for( i = 0 ; i < nMethodCount ; i++, iTotal++ ) | |||
803 | { | |||
804 | MemberItem& rItem = pItems[ iTotal ]; | |||
805 | Reference< XIdlMethod > xMethod = pMethods[ i ]; | |||
806 | rItem.aName = xMethod->getName(); | |||
807 | rItem.eMode = MemberItem::METHOD; | |||
808 | rItem.nIndex = i; | |||
809 | } | |||
810 | ||||
811 | // Setting up result sequences | |||
812 | OUString* pRetStrings = NULL__null; | |||
813 | if( pStringSeq ) | |||
814 | { | |||
815 | pStringSeq->realloc( nTotalCount ); | |||
816 | pRetStrings = pStringSeq->getArray(); | |||
817 | } | |||
818 | ||||
819 | InvocationInfo* pRetInfos = NULL__null; | |||
820 | if( pInfoSeq ) | |||
821 | { | |||
822 | pInfoSeq->realloc( nTotalCount ); | |||
823 | pRetInfos = pInfoSeq->getArray(); | |||
824 | } | |||
825 | ||||
826 | // Fill result sequences in the correct order of members | |||
827 | for( iTotal = 0 ; iTotal < nTotalCount ; iTotal++ ) | |||
828 | { | |||
829 | MemberItem& rItem = pItems[ iTotal ]; | |||
830 | if( pRetStrings ) | |||
831 | { | |||
832 | pRetStrings[ iTotal ] = rItem.aName; | |||
833 | } | |||
834 | ||||
835 | if( pRetInfos ) | |||
836 | { | |||
837 | if( rItem.eMode == MemberItem::NAMEACCESS ) | |||
838 | { | |||
839 | fillInfoForNameAccess( pRetInfos[ iTotal ], rItem.aName ); | |||
840 | } | |||
841 | else if( rItem.eMode == MemberItem::PROPERTYSET ) | |||
842 | { | |||
843 | fillInfoForProperty( pRetInfos[ iTotal ], pProps[ rItem.nIndex ] ); | |||
844 | } | |||
845 | else if( rItem.eMode == MemberItem::METHOD ) | |||
846 | { | |||
847 | fillInfoForMethod( pRetInfos[ iTotal ], pMethods[ rItem.nIndex ] ); | |||
848 | } | |||
849 | } | |||
850 | } | |||
851 | } | |||
852 | ||||
853 | // XInvocation2 | |||
854 | Sequence< OUString > SAL_CALL Invocation_Impl::getMemberNames( ) | |||
855 | throw( RuntimeException ) | |||
856 | { | |||
857 | if( _xDirect2.is() ) | |||
858 | { | |||
859 | return _xDirect2->getMemberNames(); | |||
860 | } | |||
861 | Sequence< OUString > aRetSeq; | |||
862 | getInfoSequenceImpl( &aRetSeq, NULL__null ); | |||
863 | return aRetSeq; | |||
864 | } | |||
865 | ||||
866 | Sequence< InvocationInfo > SAL_CALL Invocation_Impl::getInfo( ) | |||
867 | throw( RuntimeException ) | |||
868 | { | |||
869 | if( _xDirect2.is() ) | |||
| ||||
870 | { | |||
871 | return _xDirect2->getInfo(); | |||
872 | } | |||
873 | Sequence< InvocationInfo > aRetSeq; | |||
874 | getInfoSequenceImpl( NULL__null, &aRetSeq ); | |||
875 | return aRetSeq; | |||
876 | } | |||
877 | ||||
878 | InvocationInfo SAL_CALL Invocation_Impl::getInfoForName( const OUString& aName, sal_Bool bExact ) | |||
879 | throw( IllegalArgumentException, RuntimeException ) | |||
880 | { | |||
881 | if( _xDirect2.is() ) | |||
882 | { | |||
883 | return _xDirect2->getInfoForName( aName, bExact ); | |||
884 | } | |||
885 | ||||
886 | sal_Bool bFound = sal_False((sal_Bool)0); | |||
887 | OUString aExactName = aName; | |||
888 | InvocationInfo aRetInfo; | |||
889 | ||||
890 | if( bExact ) | |||
891 | aExactName = getExactName( aName ); | |||
892 | if( !aExactName.isEmpty() ) | |||
893 | { | |||
894 | if( _xIntrospectionAccess->hasMethod( aExactName, MethodConcept::ALL ^ MethodConcept::DANGEROUS ) ) | |||
895 | { | |||
896 | Reference<XIdlMethod> xMethod = _xIntrospectionAccess->getMethod | |||
897 | ( aExactName, MethodConcept::ALL ^ MethodConcept::DANGEROUS ); | |||
898 | fillInfoForMethod( aRetInfo, xMethod ); | |||
899 | bFound = sal_True((sal_Bool)1); | |||
900 | } | |||
901 | else | |||
902 | { | |||
903 | if( _xIntrospectionAccess.is() && _xIntrospectionAccess->hasProperty | |||
904 | ( aExactName, PropertyConcept::ALL ^ PropertyConcept::DANGEROUS ) ) | |||
905 | { | |||
906 | Property aProp = _xIntrospectionAccess->getProperty | |||
907 | ( aExactName, PropertyConcept::ALL ^ PropertyConcept::DANGEROUS ); | |||
908 | fillInfoForProperty( aRetInfo, aProp ); | |||
909 | bFound = sal_True((sal_Bool)1); | |||
910 | } | |||
911 | // NameAccess | |||
912 | else if( _xNameAccess.is() && _xNameAccess->hasByName( aExactName ) ) | |||
913 | { | |||
914 | fillInfoForNameAccess( aRetInfo, aExactName ); | |||
915 | bFound = sal_True((sal_Bool)1); | |||
916 | } | |||
917 | } | |||
918 | } | |||
919 | if( !bFound ) | |||
920 | { | |||
921 | throw IllegalArgumentException( | |||
922 | OUString( RTL_CONSTASCII_USTRINGPARAM("Unknown name, getExactName() failed!")(&("Unknown name, getExactName() failed!")[0]), ((sal_Int32 )((sizeof ("Unknown name, getExactName() failed!") / sizeof ( ("Unknown name, getExactName() failed!")[0]))-1)), (((rtl_TextEncoding ) 11)) ), | |||
923 | (XWeak *)(OWeakObject *)this, 0 ); | |||
924 | } | |||
925 | return aRetInfo; | |||
926 | } | |||
927 | ||||
928 | // Helper functions to fill InvocationInfo for XNameAccess | |||
929 | void Invocation_Impl::fillInfoForNameAccess | |||
930 | ( | |||
931 | InvocationInfo& rInfo, | |||
932 | const OUString& aName | |||
933 | ) | |||
934 | { | |||
935 | rInfo.aName = aName; | |||
936 | rInfo.eMemberType = MemberType_PROPERTY; | |||
937 | rInfo.PropertyAttribute = 0; | |||
938 | if( !_xNameContainer.is() ) | |||
939 | { | |||
940 | rInfo.PropertyAttribute = PropertyAttribute::READONLY; | |||
941 | } | |||
942 | rInfo.aType = _xNameAccess->getElementType(); | |||
| ||||
943 | } | |||
944 | ||||
945 | void Invocation_Impl::fillInfoForProperty | |||
946 | ( | |||
947 | InvocationInfo& rInfo, | |||
948 | const Property& rProp | |||
949 | ) | |||
950 | { | |||
951 | rInfo.aName = rProp.Name; | |||
952 | rInfo.eMemberType = MemberType_PROPERTY; | |||
953 | rInfo.PropertyAttribute = rProp.Attributes; | |||
954 | rInfo.aType = rProp.Type; | |||
955 | } | |||
956 | ||||
957 | void Invocation_Impl::fillInfoForMethod | |||
958 | ( | |||
959 | InvocationInfo& rInfo, | |||
960 | const Reference< XIdlMethod > xMethod | |||
961 | ) | |||
962 | { | |||
963 | rInfo.aName = xMethod->getName(); | |||
964 | rInfo.eMemberType = MemberType_METHOD; | |||
965 | Reference< XIdlClass > xReturnClass = xMethod->getReturnType(); | |||
966 | Type aReturnType( xReturnClass->getTypeClass(), xReturnClass->getName() ); | |||
967 | rInfo.aType = aReturnType; | |||
968 | Sequence<ParamInfo> aParamInfos = xMethod->getParameterInfos(); | |||
969 | sal_Int32 nParamCount = aParamInfos.getLength(); | |||
970 | if( nParamCount > 0 ) | |||
971 | { | |||
972 | const ParamInfo* pInfos = aParamInfos.getConstArray(); | |||
973 | ||||
974 | rInfo.aParamTypes.realloc( nParamCount ); | |||
975 | Type* pParamTypes = rInfo.aParamTypes.getArray(); | |||
976 | rInfo.aParamModes.realloc( nParamCount ); | |||
977 | ParamMode* pParamModes = rInfo.aParamModes.getArray(); | |||
978 | ||||
979 | for( sal_Int32 i = 0 ; i < nParamCount ; i++ ) | |||
980 | { | |||
981 | Reference< XIdlClass > xParamClass = pInfos[i].aType; | |||
982 | Type aParamType( xParamClass->getTypeClass(), xParamClass->getName() ); | |||
983 | pParamTypes[ i ] = aParamType; | |||
984 | pParamModes[ i ] = pInfos[i].aMode; | |||
985 | } | |||
986 | } | |||
987 | } | |||
988 | ||||
989 | ||||
990 | // XTypeProvider | |||
991 | Sequence< Type > SAL_CALL Invocation_Impl::getTypes(void) throw( RuntimeException ) | |||
992 | { | |||
993 | static Sequence< Type > const * s_pTypes = 0; | |||
994 | if (! s_pTypes) | |||
995 | { | |||
996 | Sequence< Type > types( 4 +8 ); | |||
997 | Type * pTypes = types.getArray(); | |||
998 | sal_Int32 n = 0; | |||
999 | ||||
1000 | pTypes[ n++ ] = ::getCppuType( (Reference< XTypeProvider > const *)0 ); | |||
1001 | pTypes[ n++ ] = ::getCppuType( (Reference< XWeak > const *)0 ); | |||
1002 | pTypes[ n++ ] = ::getCppuType( (Reference< XInvocation > const *)0 ); | |||
1003 | pTypes[ n++ ] = ::getCppuType( (Reference< XMaterialHolder > const *)0 ); | |||
1004 | ||||
1005 | // Ivocation does not support XExactName, if direct object supports | |||
1006 | // XInvocation, but not XExactName. | |||
1007 | if ((_xDirect.is() && _xENDirect.is()) || | |||
1008 | (!_xDirect.is() && (_xENIntrospection.is() || _xENNameAccess.is()))) | |||
1009 | { | |||
1010 | pTypes[ n++ ] = ::getCppuType( (Reference< XExactName > const *)0 ); | |||
1011 | } | |||
1012 | if( _xNameContainer.is() ) | |||
1013 | { | |||
1014 | pTypes[ n++ ] = ::getCppuType( (Reference< XNameContainer > const *)0 ); | |||
1015 | } | |||
1016 | if( _xNameAccess.is() ) | |||
1017 | { | |||
1018 | pTypes[ n++ ] = ::getCppuType( (Reference< XNameAccess > const *)0 ); | |||
1019 | } | |||
1020 | if (_xIndexContainer.is()) | |||
1021 | { | |||
1022 | pTypes[ n++ ] = ::getCppuType( (Reference< XIndexContainer > const *)0 ); | |||
1023 | } | |||
1024 | if (_xIndexAccess.is()) | |||
1025 | { | |||
1026 | pTypes[ n++ ] = ::getCppuType( (Reference< XIndexAccess > const *)0 ); | |||
1027 | } | |||
1028 | if (_xEnumerationAccess.is()) | |||
1029 | { | |||
1030 | pTypes[ n++ ] = ::getCppuType( (Reference< XEnumerationAccess > const *)0 ); | |||
1031 | } | |||
1032 | if (_xElementAccess.is()) | |||
1033 | { | |||
1034 | pTypes[ n++ ] = ::getCppuType( (Reference< XElementAccess > const *)0 ); | |||
1035 | } | |||
1036 | // Invocation does not support XInvocation2, if direct object supports | |||
1037 | // XInvocation, but not XInvocation2. | |||
1038 | if ( ( _xDirect.is() && _xDirect2.is()) || | |||
1039 | (!_xDirect.is() && _xIntrospectionAccess.is() ) ) | |||
1040 | { | |||
1041 | pTypes[ n++ ] = ::getCppuType( (Reference< XInvocation2 > const *)0 ); | |||
1042 | } | |||
1043 | ||||
1044 | types.realloc( n ); | |||
1045 | ||||
1046 | // store types | |||
1047 | MutexGuard guard( Mutex::getGlobalMutex() ); | |||
1048 | if (! s_pTypes) | |||
1049 | { | |||
1050 | static Sequence< Type > s_types( types ); | |||
1051 | s_pTypes = &s_types; | |||
1052 | } | |||
1053 | } | |||
1054 | return *s_pTypes; | |||
1055 | } | |||
1056 | ||||
1057 | Sequence< sal_Int8 > SAL_CALL Invocation_Impl::getImplementationId( ) throw( RuntimeException) | |||
1058 | { | |||
1059 | static OImplementationId *pId = 0; | |||
1060 | if( ! pId ) | |||
1061 | { | |||
1062 | MutexGuard guard( Mutex::getGlobalMutex() ); | |||
1063 | if( ! pId ) | |||
1064 | { | |||
1065 | static OImplementationId id( sal_False((sal_Bool)0) ); | |||
1066 | pId = &id; | |||
1067 | } | |||
1068 | } | |||
1069 | return pId->getImplementationId(); | |||
1070 | } | |||
1071 | ||||
1072 | //================================================================================================== | |||
1073 | //================================================================================================== | |||
1074 | //================================================================================================== | |||
1075 | class InvocationService | |||
1076 | : public WeakImplHelper2< XSingleServiceFactory, XServiceInfo > | |||
1077 | { | |||
1078 | public: | |||
1079 | InvocationService( const Reference<XComponentContext> & xCtx ); | |||
1080 | virtual ~InvocationService(); | |||
1081 | ||||
1082 | // XServiceInfo | |||
1083 | OUString SAL_CALL getImplementationName() throw( RuntimeException ); | |||
1084 | sal_Bool SAL_CALL supportsService(const OUString& ServiceName) throw( RuntimeException ); | |||
1085 | Sequence< OUString > SAL_CALL getSupportedServiceNames(void) throw( RuntimeException ); | |||
1086 | ||||
1087 | // XSingleServiceFactory | |||
1088 | Reference<XInterface> SAL_CALL createInstance(void) throw( Exception, RuntimeException ); | |||
1089 | Reference<XInterface> SAL_CALL createInstanceWithArguments( | |||
1090 | const Sequence<Any>& rArguments ) throw( Exception, RuntimeException ); | |||
1091 | private: | |||
1092 | Reference<XComponentContext> mxCtx; | |||
1093 | Reference<XMultiComponentFactory> mxSMgr; | |||
1094 | Reference<XTypeConverter> xTypeConverter; | |||
1095 | Reference<XIntrospection> xIntrospection; | |||
1096 | Reference<XIdlReflection> xCoreReflection; | |||
1097 | }; | |||
1098 | ||||
1099 | InvocationService::InvocationService( const Reference<XComponentContext> & xCtx ) | |||
1100 | : mxCtx( xCtx ) | |||
1101 | , mxSMgr( xCtx->getServiceManager() ) | |||
1102 | { | |||
1103 | g_moduleCount.modCnt.acquire( &g_moduleCount.modCnt ); | |||
1104 | xTypeConverter = Reference<XTypeConverter>( | |||
1105 | mxSMgr->createInstanceWithContext( | |||
1106 | OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.script.Converter")(&("com.sun.star.script.Converter")[0]), ((sal_Int32)((sizeof ("com.sun.star.script.Converter") / sizeof (("com.sun.star.script.Converter" )[0]))-1)), (((rtl_TextEncoding) 11))), | |||
1107 | xCtx ), | |||
1108 | UNO_QUERY ); | |||
1109 | xIntrospection = Reference<XIntrospection>( | |||
1110 | mxSMgr->createInstanceWithContext( | |||
1111 | OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.beans.Introspection")(&("com.sun.star.beans.Introspection")[0]), ((sal_Int32)( (sizeof ("com.sun.star.beans.Introspection") / sizeof (("com.sun.star.beans.Introspection" )[0]))-1)), (((rtl_TextEncoding) 11))), | |||
1112 | xCtx), | |||
1113 | UNO_QUERY); | |||
1114 | mxCtx->getValueByName( | |||
1115 | OUString( | |||
1116 | RTL_CONSTASCII_USTRINGPARAM("/singletons/com.sun.star.reflection.theCoreReflection")(&("/singletons/com.sun.star.reflection.theCoreReflection" )[0]), ((sal_Int32)((sizeof ("/singletons/com.sun.star.reflection.theCoreReflection" ) / sizeof (("/singletons/com.sun.star.reflection.theCoreReflection" )[0]))-1)), (((rtl_TextEncoding) 11))) ) | |||
1117 | >>= xCoreReflection; | |||
1118 | OSL_ENSURE( xCoreReflection.is(), "### CoreReflection singleton not accessable!?" )do { if (true && (!(xCoreReflection.is()))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/stoc/source/invocation/invocation.cxx" ":" "1118" ": "), "%s", "### CoreReflection singleton not accessable!?" ); } } while (false); | |||
1119 | if (! xCoreReflection.is()) | |||
1120 | { | |||
1121 | throw DeploymentException( | |||
1122 | OUString( RTL_CONSTASCII_USTRINGPARAM("/singletons/com.sun.star.reflection.theCoreReflection singleton not accessable")(&("/singletons/com.sun.star.reflection.theCoreReflection singleton not accessable" )[0]), ((sal_Int32)((sizeof ("/singletons/com.sun.star.reflection.theCoreReflection singleton not accessable" ) / sizeof (("/singletons/com.sun.star.reflection.theCoreReflection singleton not accessable" )[0]))-1)), (((rtl_TextEncoding) 11)) ), | |||
1123 | Reference< XInterface >() ); | |||
1124 | } | |||
1125 | // xCoreReflection = Reference<XIdlReflection>( | |||
1126 | // mxSMgr->createInstanceWithContext( | |||
1127 | // OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.reflection.CoreReflection")), | |||
1128 | // xCtx), | |||
1129 | // UNO_QUERY); | |||
1130 | } | |||
1131 | ||||
1132 | InvocationService::~InvocationService() | |||
1133 | { | |||
1134 | g_moduleCount.modCnt.release( &g_moduleCount.modCnt ); | |||
1135 | } | |||
1136 | ||||
1137 | // XServiceInfo | |||
1138 | OUString InvocationService::getImplementationName() throw( RuntimeException ) | |||
1139 | { | |||
1140 | return inv_getImplementationName(); | |||
1141 | } | |||
1142 | ||||
1143 | // XServiceInfo | |||
1144 | sal_Bool InvocationService::supportsService(const OUString& ServiceName) throw( RuntimeException ) | |||
1145 | { | |||
1146 | Sequence< OUString > aSNL = getSupportedServiceNames(); | |||
1147 | const OUString * pArray = aSNL.getConstArray(); | |||
1148 | for( sal_Int32 i = 0; i < aSNL.getLength(); i++ ) | |||
1149 | if( pArray[i] == ServiceName ) | |||
1150 | return sal_True((sal_Bool)1); | |||
1151 | return sal_False((sal_Bool)0); | |||
1152 | } | |||
1153 | ||||
1154 | // XServiceInfo | |||
1155 | Sequence< OUString > InvocationService::getSupportedServiceNames(void) throw( RuntimeException ) | |||
1156 | { | |||
1157 | return inv_getSupportedServiceNames(); | |||
1158 | } | |||
1159 | ||||
1160 | //-------------------------------------------------------------------------------------------------- | |||
1161 | Reference<XInterface> InvocationService::createInstance(void) throw( Exception, RuntimeException ) | |||
1162 | { | |||
1163 | //TODO:throw( Exception(OUString( RTL_CONSTASCII_USTRINGPARAM("no default construction of invocation adapter possible!")), *this) ); | |||
1164 | return Reference<XInterface>(); // dummy | |||
1165 | } | |||
1166 | ||||
1167 | //-------------------------------------------------------------------------------------------------- | |||
1168 | Reference<XInterface> InvocationService::createInstanceWithArguments( | |||
1169 | const Sequence<Any>& rArguments ) throw( Exception, RuntimeException ) | |||
1170 | { | |||
1171 | if (rArguments.getLength() == 1) | |||
1172 | { | |||
1173 | return Reference< XInterface > | |||
1174 | ( *new Invocation_Impl( *rArguments.getConstArray(), | |||
1175 | xTypeConverter, xIntrospection, xCoreReflection ) ); | |||
1176 | } | |||
1177 | else | |||
1178 | { | |||
1179 | //TODO:throw( Exception(OUString( RTL_CONSTASCII_USTRINGPARAM("no default construction of invocation adapter possible!")), *this) ); | |||
1180 | return Reference<XInterface>(); | |||
1181 | } | |||
1182 | } | |||
1183 | ||||
1184 | ||||
1185 | //************************************************************************* | |||
1186 | Reference<XInterface> SAL_CALL InvocationService_CreateInstance( const Reference<XComponentContext> & xCtx ) | |||
1187 | throw( RuntimeException ) | |||
1188 | { | |||
1189 | Reference<XInterface> xService = Reference< XInterface > ( *new InvocationService( xCtx ) ); | |||
1190 | return xService; | |||
1191 | } | |||
1192 | ||||
1193 | } | |||
1194 | ||||
1195 | using namespace stoc_inv; | |||
1196 | static struct ImplementationEntry g_entries[] = | |||
1197 | { | |||
1198 | { | |||
1199 | InvocationService_CreateInstance, inv_getImplementationName, | |||
1200 | inv_getSupportedServiceNames, createSingleComponentFactory, | |||
1201 | &g_moduleCount.modCnt , 0 | |||
1202 | }, | |||
1203 | { 0, 0, 0, 0, 0, 0 } | |||
1204 | }; | |||
1205 | ||||
1206 | extern "C" | |||
1207 | { | |||
1208 | SAL_DLLPUBLIC_EXPORT__attribute__ ((visibility("default"))) sal_Bool SAL_CALL component_canUnload( TimeValue *pTime ) | |||
1209 | { | |||
1210 | return g_moduleCount.canUnload( &g_moduleCount , pTime ); | |||
1211 | } | |||
1212 | ||||
1213 | //================================================================================================== | |||
1214 | SAL_DLLPUBLIC_EXPORT__attribute__ ((visibility("default"))) void * SAL_CALL component_getFactory( | |||
1215 | const sal_Char * pImplName, void * pServiceManager, void * pRegistryKey ) | |||
1216 | { | |||
1217 | return component_getFactoryHelper( pImplName, pServiceManager, pRegistryKey , g_entries ); | |||
1218 | } | |||
1219 | } | |||
1220 | ||||
1221 | ||||
1222 | ||||
1223 | /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |