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