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