1*2a97ec55SAndrew Rist /**************************************************************
2cdf0e10cSrcweir *
3*2a97ec55SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one
4*2a97ec55SAndrew Rist * or more contributor license agreements. See the NOTICE file
5*2a97ec55SAndrew Rist * distributed with this work for additional information
6*2a97ec55SAndrew Rist * regarding copyright ownership. The ASF licenses this file
7*2a97ec55SAndrew Rist * to you under the Apache License, Version 2.0 (the
8*2a97ec55SAndrew Rist * "License"); you may not use this file except in compliance
9*2a97ec55SAndrew Rist * with the License. You may obtain a copy of the License at
10*2a97ec55SAndrew Rist *
11*2a97ec55SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0
12*2a97ec55SAndrew Rist *
13*2a97ec55SAndrew Rist * Unless required by applicable law or agreed to in writing,
14*2a97ec55SAndrew Rist * software distributed under the License is distributed on an
15*2a97ec55SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*2a97ec55SAndrew Rist * KIND, either express or implied. See the License for the
17*2a97ec55SAndrew Rist * specific language governing permissions and limitations
18*2a97ec55SAndrew Rist * under the License.
19*2a97ec55SAndrew Rist *
20*2a97ec55SAndrew Rist *************************************************************/
21*2a97ec55SAndrew Rist
22*2a97ec55SAndrew Rist
23cdf0e10cSrcweir
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_extensions.hxx"
26cdf0e10cSrcweir #include "res_services.hxx"
27cdf0e10cSrcweir
28cdf0e10cSrcweir #include <vos/mutex.hxx>
29cdf0e10cSrcweir #include <uno/lbnames.h> // CPPU_CURRENT_LANGUAGE_BINDING_NAME macro, which specify the environment type
30cdf0e10cSrcweir #include <cppuhelper/factory.hxx> // helper for factories
31cdf0e10cSrcweir #include <cppuhelper/implbase3.hxx> // helper for implementations
32cdf0e10cSrcweir
33cdf0e10cSrcweir #include <com/sun/star/lang/XServiceInfo.hpp>
34cdf0e10cSrcweir #include <com/sun/star/script/XInvocation.hpp>
35cdf0e10cSrcweir #include <com/sun/star/script/XTypeConverter.hpp>
36cdf0e10cSrcweir #include <com/sun/star/reflection/InvocationTargetException.hpp>
37cdf0e10cSrcweir #include <com/sun/star/beans/XExactName.hpp>
38cdf0e10cSrcweir #include <com/sun/star/beans/PropertyValue.hpp>
39cdf0e10cSrcweir #include <com/sun/star/beans/PropertyState.hpp>
40cdf0e10cSrcweir
41cdf0e10cSrcweir #include <tools/resmgr.hxx>
42cdf0e10cSrcweir #include <tools/rcid.h>
43cdf0e10cSrcweir #include <tools/resary.hxx>
44cdf0e10cSrcweir #include <vcl/svapp.hxx>
45cdf0e10cSrcweir
46cdf0e10cSrcweir #include <rtl/ustring.hxx>
47cdf0e10cSrcweir #include <rtl/strbuf.hxx>
48cdf0e10cSrcweir
49cdf0e10cSrcweir using namespace vos;
50cdf0e10cSrcweir using namespace rtl;
51cdf0e10cSrcweir using namespace com::sun::star::uno;
52cdf0e10cSrcweir using namespace com::sun::star::lang;
53cdf0e10cSrcweir using namespace com::sun::star::registry;
54cdf0e10cSrcweir using namespace com::sun::star::script;
55cdf0e10cSrcweir using namespace com::sun::star::beans;
56cdf0e10cSrcweir using namespace com::sun::star::reflection;
57cdf0e10cSrcweir
58cdf0e10cSrcweir //------------------------------------------------------------------------
59cdf0e10cSrcweir //------------------------------------------------------------------------
60cdf0e10cSrcweir //------------------------------------------------------------------------
61cdf0e10cSrcweir class ResourceService : public cppu::WeakImplHelper3< XInvocation, XExactName, XServiceInfo >
62cdf0e10cSrcweir {
63cdf0e10cSrcweir public:
64cdf0e10cSrcweir ResourceService( const Reference< XMultiServiceFactory > & );
65cdf0e10cSrcweir ~ResourceService();
66cdf0e10cSrcweir
67cdf0e10cSrcweir // XServiceInfo
68cdf0e10cSrcweir OUString SAL_CALL getImplementationName() throw();
69cdf0e10cSrcweir sal_Bool SAL_CALL supportsService(const OUString& ServiceName) throw();
70cdf0e10cSrcweir Sequence< OUString > SAL_CALL getSupportedServiceNames(void) throw();
71cdf0e10cSrcweir
72cdf0e10cSrcweir static Sequence< OUString > getSupportedServiceNames_Static(void) throw();
getImplementationName_Static()73cdf0e10cSrcweir static OUString getImplementationName_Static() throw()
74cdf0e10cSrcweir {
75cdf0e10cSrcweir return OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.comp.extensions.ResourceService"));
76cdf0e10cSrcweir }
77cdf0e10cSrcweir static Reference< XInterface > Create( const Reference< XComponentContext >& _rxContext );
78cdf0e10cSrcweir
79cdf0e10cSrcweir // XExactName
80cdf0e10cSrcweir OUString SAL_CALL getExactName( const OUString & ApproximateName ) throw(RuntimeException);
81cdf0e10cSrcweir
82cdf0e10cSrcweir // XInvokation
83cdf0e10cSrcweir Reference< XIntrospectionAccess > SAL_CALL getIntrospection(void) throw(RuntimeException);
84cdf0e10cSrcweir Any SAL_CALL invoke(const OUString& FunctionName, const Sequence< Any >& Params, Sequence< sal_Int16 >& OutParamIndex, Sequence< Any >& OutParam) throw(IllegalArgumentException, CannotConvertException, InvocationTargetException, RuntimeException);
85cdf0e10cSrcweir void SAL_CALL setValue(const OUString& PropertyName, const Any& Value) throw(UnknownPropertyException, CannotConvertException, InvocationTargetException, RuntimeException);
86cdf0e10cSrcweir Any SAL_CALL getValue(const OUString& PropertyName) throw(UnknownPropertyException, RuntimeException);
87cdf0e10cSrcweir sal_Bool SAL_CALL hasMethod(const OUString& Name) throw(RuntimeException);
88cdf0e10cSrcweir sal_Bool SAL_CALL hasProperty(const OUString& Name) throw(RuntimeException);
89cdf0e10cSrcweir private:
90cdf0e10cSrcweir Reference< XTypeConverter > getTypeConverter() const;
91cdf0e10cSrcweir Reference< XInvocation > getDefaultInvocation() const;
92cdf0e10cSrcweir
93cdf0e10cSrcweir Reference< XMultiServiceFactory > xSMgr;
94cdf0e10cSrcweir Reference< XInvocation > xDefaultInvocation;
95cdf0e10cSrcweir Reference< XTypeConverter > xTypeConverter;
96cdf0e10cSrcweir OUString aFileName;
97cdf0e10cSrcweir ResMgr * pResMgr;
98cdf0e10cSrcweir };
99cdf0e10cSrcweir
100cdf0e10cSrcweir
101cdf0e10cSrcweir //-----------------------------------------------------------------------------
ResourceService(const Reference<XMultiServiceFactory> & rSMgr)102cdf0e10cSrcweir ResourceService::ResourceService( const Reference< XMultiServiceFactory > & rSMgr )
103cdf0e10cSrcweir : xSMgr( rSMgr )
104cdf0e10cSrcweir , pResMgr( NULL )
105cdf0e10cSrcweir {
106cdf0e10cSrcweir }
107cdf0e10cSrcweir
108cdf0e10cSrcweir //-----------------------------------------------------------------------------
Create(const Reference<XComponentContext> & _rxContext)109cdf0e10cSrcweir Reference< XInterface > ResourceService::Create( const Reference< XComponentContext >& _rxContext )
110cdf0e10cSrcweir {
111cdf0e10cSrcweir Reference< XMultiServiceFactory > xFactory( _rxContext->getServiceManager(), UNO_QUERY_THROW );
112cdf0e10cSrcweir return *( new ResourceService( xFactory ) );
113cdf0e10cSrcweir }
114cdf0e10cSrcweir
115cdf0e10cSrcweir //-----------------------------------------------------------------------------
~ResourceService()116cdf0e10cSrcweir ResourceService::~ResourceService()
117cdf0e10cSrcweir {
118cdf0e10cSrcweir delete pResMgr;
119cdf0e10cSrcweir }
120cdf0e10cSrcweir
121cdf0e10cSrcweir // XServiceInfo
getImplementationName()122cdf0e10cSrcweir OUString ResourceService::getImplementationName() throw()
123cdf0e10cSrcweir {
124cdf0e10cSrcweir return getImplementationName_Static();
125cdf0e10cSrcweir }
126cdf0e10cSrcweir
127cdf0e10cSrcweir // XServiceInfo
supportsService(const OUString & ServiceName)128cdf0e10cSrcweir sal_Bool SAL_CALL ResourceService::supportsService(const OUString& ServiceName) throw()
129cdf0e10cSrcweir {
130cdf0e10cSrcweir Sequence< OUString > aSNL = getSupportedServiceNames();
131cdf0e10cSrcweir const OUString * pArray = aSNL.getConstArray();
132cdf0e10cSrcweir for( sal_Int32 i = 0; i < aSNL.getLength(); i++ )
133cdf0e10cSrcweir if( pArray[i] == ServiceName )
134cdf0e10cSrcweir return sal_True;
135cdf0e10cSrcweir return sal_False;
136cdf0e10cSrcweir }
137cdf0e10cSrcweir
138cdf0e10cSrcweir // XServiceInfo
getSupportedServiceNames(void)139cdf0e10cSrcweir Sequence< OUString > SAL_CALL ResourceService::getSupportedServiceNames(void) throw()
140cdf0e10cSrcweir {
141cdf0e10cSrcweir return getSupportedServiceNames_Static();
142cdf0e10cSrcweir }
143cdf0e10cSrcweir
144cdf0e10cSrcweir // ResourceService
getSupportedServiceNames_Static(void)145cdf0e10cSrcweir Sequence< OUString > ResourceService::getSupportedServiceNames_Static(void) throw()
146cdf0e10cSrcweir {
147cdf0e10cSrcweir Sequence< OUString > aSNS( 1 );
148cdf0e10cSrcweir aSNS.getArray()[0] = OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.resource.VclStringResourceLoader"));
149cdf0e10cSrcweir return aSNS;
150cdf0e10cSrcweir }
151cdf0e10cSrcweir
152cdf0e10cSrcweir // ResourceService
getTypeConverter() const153cdf0e10cSrcweir Reference< XTypeConverter > ResourceService::getTypeConverter() const
154cdf0e10cSrcweir {
155cdf0e10cSrcweir OGuard aGuard( Application::GetSolarMutex() );
156cdf0e10cSrcweir if( xSMgr.is() )
157cdf0e10cSrcweir {
158cdf0e10cSrcweir Reference< XTypeConverter > xConv( xSMgr->createInstance( OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.script.Converter" ))), UNO_QUERY );
159cdf0e10cSrcweir ((ResourceService*)this)->xTypeConverter = xConv;
160cdf0e10cSrcweir }
161cdf0e10cSrcweir return xTypeConverter;
162cdf0e10cSrcweir }
163cdf0e10cSrcweir
164cdf0e10cSrcweir // ResourceService
getDefaultInvocation() const165cdf0e10cSrcweir Reference< XInvocation > ResourceService::getDefaultInvocation() const
166cdf0e10cSrcweir {
167cdf0e10cSrcweir OGuard aGuard( Application::GetSolarMutex() );
168cdf0e10cSrcweir /* f�hrt zur Zeit noch zu einer rekursion
169cdf0e10cSrcweir if( xSMgr.is() )
170cdf0e10cSrcweir {
171cdf0e10cSrcweir Reference< XSingleServiceFactory > xFact( xSMgr->createInstance( OUString::createFromAscii("com.sun.star.script.Invocation") ), UNO_QUERY );
172cdf0e10cSrcweir if( xFact.is() )
173cdf0e10cSrcweir {
174cdf0e10cSrcweir Sequence< Any > aArgs( 1 );
175cdf0e10cSrcweir Reference< XInterface > xThis( *this );
176cdf0e10cSrcweir aArgs.getArray()[0].set( &xThis, XInterface_Reference< get >lection() );
177cdf0e10cSrcweir Reference< XInvokation > xI( xFact->createInstanceWithArguments( aArgs ), UNO_QUERY );
178cdf0e10cSrcweir ((ResourceService*)this)->xDefaultInvocation = xI;
179cdf0e10cSrcweir }
180cdf0e10cSrcweir }
181cdf0e10cSrcweir */
182cdf0e10cSrcweir return xDefaultInvocation;
183cdf0e10cSrcweir }
184cdf0e10cSrcweir
185cdf0e10cSrcweir // XExactName
getExactName(const OUString & ApproximateName)186cdf0e10cSrcweir OUString SAL_CALL ResourceService::getExactName( const OUString & ApproximateName ) throw(RuntimeException)
187cdf0e10cSrcweir {
188cdf0e10cSrcweir OUString aName( ApproximateName );
189cdf0e10cSrcweir aName = aName.toAsciiLowerCase();
190cdf0e10cSrcweir if( aName.equalsAscii("filename") )
191cdf0e10cSrcweir return OUString(RTL_CONSTASCII_USTRINGPARAM("FileName"));
192cdf0e10cSrcweir else if( aName.equalsAscii("getstring" ))
193cdf0e10cSrcweir return OUString(RTL_CONSTASCII_USTRINGPARAM("getString"));
194cdf0e10cSrcweir else if( aName.equalsAscii("getstrings" ))
195cdf0e10cSrcweir return OUString(RTL_CONSTASCII_USTRINGPARAM("getStrings"));
196cdf0e10cSrcweir else if( aName.equalsAscii("hasstring") )
197cdf0e10cSrcweir return OUString(RTL_CONSTASCII_USTRINGPARAM("hasString"));
198cdf0e10cSrcweir else if( aName.equalsAscii("hasstrings") )
199cdf0e10cSrcweir return OUString(RTL_CONSTASCII_USTRINGPARAM("hasStrings"));
200cdf0e10cSrcweir else if( aName.equalsAscii("getstringlist") )
201cdf0e10cSrcweir return OUString(RTL_CONSTASCII_USTRINGPARAM("getStringList"));
202cdf0e10cSrcweir else if( aName.equalsAscii("hasStringList") )
203cdf0e10cSrcweir return OUString(RTL_CONSTASCII_USTRINGPARAM("hasStringList"));
204cdf0e10cSrcweir Reference< XExactName > xEN( getDefaultInvocation(), UNO_QUERY );
205cdf0e10cSrcweir if( xEN.is() )
206cdf0e10cSrcweir return xEN->getExactName( ApproximateName );
207cdf0e10cSrcweir return OUString();
208cdf0e10cSrcweir }
209cdf0e10cSrcweir
210cdf0e10cSrcweir // XInvokation
getIntrospection(void)211cdf0e10cSrcweir Reference< XIntrospectionAccess > SAL_CALL ResourceService::getIntrospection(void)
212cdf0e10cSrcweir throw(RuntimeException)
213cdf0e10cSrcweir {
214cdf0e10cSrcweir Reference< XInvocation > xI = getDefaultInvocation();
215cdf0e10cSrcweir if( xI.is() )
216cdf0e10cSrcweir return xI->getIntrospection();
217cdf0e10cSrcweir return Reference< XIntrospectionAccess >();
218cdf0e10cSrcweir }
219cdf0e10cSrcweir
220cdf0e10cSrcweir // XInvokation
invoke(const OUString & FunctionName,const Sequence<Any> & Params,Sequence<sal_Int16> & OutParamIndex,Sequence<Any> & OutParam)221cdf0e10cSrcweir Any SAL_CALL ResourceService::invoke
222cdf0e10cSrcweir (
223cdf0e10cSrcweir const OUString& FunctionName,
224cdf0e10cSrcweir const Sequence< Any >& Params,
225cdf0e10cSrcweir Sequence< sal_Int16 >& OutParamIndex,
226cdf0e10cSrcweir Sequence< Any >& OutParam
227cdf0e10cSrcweir )
228cdf0e10cSrcweir throw(IllegalArgumentException, CannotConvertException, InvocationTargetException, RuntimeException)
229cdf0e10cSrcweir {
230cdf0e10cSrcweir Any aRet;
231cdf0e10cSrcweir if( FunctionName.equalsAscii("getString")
232cdf0e10cSrcweir || FunctionName.equalsAscii("getStrings" )
233cdf0e10cSrcweir || FunctionName.equalsAscii("hasString" )
234cdf0e10cSrcweir || FunctionName.equalsAscii("hasStrings" )
235cdf0e10cSrcweir )
236cdf0e10cSrcweir {
237cdf0e10cSrcweir sal_Int32 nElements = Params.getLength();
238cdf0e10cSrcweir if( nElements < 1 )
239cdf0e10cSrcweir throw IllegalArgumentException();
240cdf0e10cSrcweir if( nElements > 1 && (FunctionName.equalsAscii("getString") || FunctionName.equalsAscii("hasString") ) )
241cdf0e10cSrcweir throw IllegalArgumentException();
242cdf0e10cSrcweir if( !pResMgr )
243cdf0e10cSrcweir throw IllegalArgumentException();
244cdf0e10cSrcweir
245cdf0e10cSrcweir Sequence< OUString > aStrings( Params.getLength() );
246cdf0e10cSrcweir Sequence< sal_Bool > aBools( Params.getLength() );
247cdf0e10cSrcweir const Any* pIn = Params.getConstArray();
248cdf0e10cSrcweir OUString* pOutString = aStrings.getArray();
249cdf0e10cSrcweir sal_Bool* pOutBool = aBools.getArray();
250cdf0e10cSrcweir
251cdf0e10cSrcweir Reference< XTypeConverter > xC = getTypeConverter();
252cdf0e10cSrcweir bool bGetBranch = FunctionName.equalsAscii( "getString" ) || FunctionName.equalsAscii( "getStrings" );
253cdf0e10cSrcweir
254cdf0e10cSrcweir OGuard aGuard( Application::GetSolarMutex() );
255cdf0e10cSrcweir for( sal_Int32 n = 0; n < nElements; n++ )
256cdf0e10cSrcweir {
257cdf0e10cSrcweir sal_Int32 nId = 0;
258cdf0e10cSrcweir if( !(pIn[n] >>= nId) )
259cdf0e10cSrcweir {
260cdf0e10cSrcweir if( xC.is() )
261cdf0e10cSrcweir {
262cdf0e10cSrcweir xC->convertToSimpleType( pIn[n], TypeClass_LONG ) >>= nId;
263cdf0e10cSrcweir }
264cdf0e10cSrcweir else
265cdf0e10cSrcweir throw CannotConvertException();
266cdf0e10cSrcweir }
267cdf0e10cSrcweir if( nId > 0xFFFF || nId < 0 )
268cdf0e10cSrcweir throw IllegalArgumentException();
269cdf0e10cSrcweir
270cdf0e10cSrcweir if( bGetBranch )
271cdf0e10cSrcweir {
272cdf0e10cSrcweir ResId aId( (sal_uInt16)nId, *pResMgr );
273cdf0e10cSrcweir aId.SetRT( RSC_STRING );
274cdf0e10cSrcweir if( pResMgr->IsAvailable( aId ) )
275cdf0e10cSrcweir {
276cdf0e10cSrcweir String aStr( aId );
277cdf0e10cSrcweir pOutString[n] = aStr;
278cdf0e10cSrcweir }
279cdf0e10cSrcweir else
280cdf0e10cSrcweir throw IllegalArgumentException();
281cdf0e10cSrcweir }
282cdf0e10cSrcweir else // hasString(s)
283cdf0e10cSrcweir {
284cdf0e10cSrcweir sal_Bool bRet = sal_False;
285cdf0e10cSrcweir if( pResMgr )
286cdf0e10cSrcweir {
287cdf0e10cSrcweir ResId aId( (sal_uInt16)nId, *pResMgr );
288cdf0e10cSrcweir aId.SetRT( RSC_STRING );
289cdf0e10cSrcweir bRet = pResMgr->IsAvailable( aId );
290cdf0e10cSrcweir }
291cdf0e10cSrcweir pOutBool[n] = bRet;
292cdf0e10cSrcweir }
293cdf0e10cSrcweir }
294cdf0e10cSrcweir if( FunctionName.equalsAscii("getString") )
295cdf0e10cSrcweir aRet <<= pOutString[0];
296cdf0e10cSrcweir else if( FunctionName.equalsAscii("getStrings" ) )
297cdf0e10cSrcweir aRet <<= aStrings;
298cdf0e10cSrcweir else if( FunctionName.equalsAscii("hasString" ) )
299cdf0e10cSrcweir aRet <<= pOutBool[0];
300cdf0e10cSrcweir else
301cdf0e10cSrcweir aRet <<= aBools;
302cdf0e10cSrcweir }
303cdf0e10cSrcweir else if( FunctionName.equalsAscii("getStringList") || FunctionName.equalsAscii("hasStringList" ) )
304cdf0e10cSrcweir {
305cdf0e10cSrcweir if( Params.getLength() != 1 )
306cdf0e10cSrcweir throw IllegalArgumentException();
307cdf0e10cSrcweir Reference< XTypeConverter > xC = getTypeConverter();
308cdf0e10cSrcweir OGuard aGuard( Application::GetSolarMutex() );
309cdf0e10cSrcweir
310cdf0e10cSrcweir sal_Int32 nId = 0;
311cdf0e10cSrcweir if( !(Params.getConstArray()[0] >>= nId) )
312cdf0e10cSrcweir {
313cdf0e10cSrcweir if( xC.is() )
314cdf0e10cSrcweir {
315cdf0e10cSrcweir xC->convertToSimpleType( Params.getConstArray()[0], TypeClass_LONG ) >>= nId;
316cdf0e10cSrcweir }
317cdf0e10cSrcweir else
318cdf0e10cSrcweir throw CannotConvertException();
319cdf0e10cSrcweir }
320cdf0e10cSrcweir
321cdf0e10cSrcweir if( FunctionName.equalsAscii("getStringList") )
322cdf0e10cSrcweir {
323cdf0e10cSrcweir ResId aId( (sal_uInt16)nId, *pResMgr );
324cdf0e10cSrcweir aId.SetRT( RSC_STRINGARRAY );
325cdf0e10cSrcweir if( pResMgr->IsAvailable( aId ) )
326cdf0e10cSrcweir {
327cdf0e10cSrcweir ResStringArray aStr( aId );
328cdf0e10cSrcweir int nEntries = aStr.Count();
329cdf0e10cSrcweir Sequence< PropertyValue > aPropSeq( nEntries );
330cdf0e10cSrcweir PropertyValue* pOut = aPropSeq.getArray();
331cdf0e10cSrcweir for( int i = 0; i < nEntries; i++ )
332cdf0e10cSrcweir {
333cdf0e10cSrcweir pOut[i].Name = aStr.GetString( i );
334cdf0e10cSrcweir pOut[i].Handle = -1;
335cdf0e10cSrcweir pOut[i].Value <<= aStr.GetValue( i );
336cdf0e10cSrcweir pOut[i].State = PropertyState_DIRECT_VALUE;
337cdf0e10cSrcweir }
338cdf0e10cSrcweir aRet <<= aPropSeq;
339cdf0e10cSrcweir }
340cdf0e10cSrcweir else
341cdf0e10cSrcweir throw IllegalArgumentException();
342cdf0e10cSrcweir }
343cdf0e10cSrcweir else // hasStringList
344cdf0e10cSrcweir {
345cdf0e10cSrcweir sal_Bool bRet = sal_False;
346cdf0e10cSrcweir if( pResMgr )
347cdf0e10cSrcweir {
348cdf0e10cSrcweir ResId aId( (sal_uInt16)nId, *pResMgr );
349cdf0e10cSrcweir aId.SetRT( RSC_STRINGARRAY );
350cdf0e10cSrcweir bRet = pResMgr->IsAvailable( aId );
351cdf0e10cSrcweir }
352cdf0e10cSrcweir aRet <<= bRet;
353cdf0e10cSrcweir }
354cdf0e10cSrcweir }
355cdf0e10cSrcweir else
356cdf0e10cSrcweir {
357cdf0e10cSrcweir Reference< XInvocation > xI = getDefaultInvocation();
358cdf0e10cSrcweir if( xI.is() )
359cdf0e10cSrcweir return xI->invoke( FunctionName, Params, OutParamIndex, OutParam );
360cdf0e10cSrcweir else
361cdf0e10cSrcweir throw IllegalArgumentException();
362cdf0e10cSrcweir }
363cdf0e10cSrcweir return aRet;
364cdf0e10cSrcweir }
365cdf0e10cSrcweir
366cdf0e10cSrcweir // XInvokation
setValue(const OUString & PropertyName,const Any & Value)367cdf0e10cSrcweir void SAL_CALL ResourceService::setValue(const OUString& PropertyName, const Any& Value)
368cdf0e10cSrcweir throw(UnknownPropertyException, CannotConvertException, InvocationTargetException, RuntimeException)
369cdf0e10cSrcweir {
370cdf0e10cSrcweir if( PropertyName.equalsAscii("FileName") )
371cdf0e10cSrcweir {
372cdf0e10cSrcweir OUString aName;
373cdf0e10cSrcweir if( !(Value >>= aName) )
374cdf0e10cSrcweir {
375cdf0e10cSrcweir Reference< XTypeConverter > xC = getTypeConverter();
376cdf0e10cSrcweir if( xC.is() )
377cdf0e10cSrcweir xC->convertToSimpleType( Value, TypeClass_STRING ) >>= aName;
378cdf0e10cSrcweir else
379cdf0e10cSrcweir throw CannotConvertException();
380cdf0e10cSrcweir }
381cdf0e10cSrcweir
382cdf0e10cSrcweir OGuard aGuard( Application::GetSolarMutex() );
383cdf0e10cSrcweir OStringBuffer aBuf( aName.getLength()+8 );
384cdf0e10cSrcweir aBuf.append( OUStringToOString( aName, osl_getThreadTextEncoding() ) );
385cdf0e10cSrcweir ResMgr * pRM = ResMgr::CreateResMgr( aBuf.getStr() );
386cdf0e10cSrcweir if( !pRM )
387cdf0e10cSrcweir throw InvocationTargetException();
388cdf0e10cSrcweir if( pResMgr )
389cdf0e10cSrcweir delete pResMgr;
390cdf0e10cSrcweir pResMgr = pRM;
391cdf0e10cSrcweir aFileName = OStringToOUString( aBuf.makeStringAndClear(), osl_getThreadTextEncoding() );
392cdf0e10cSrcweir }
393cdf0e10cSrcweir else
394cdf0e10cSrcweir {
395cdf0e10cSrcweir Reference< XInvocation > xI = getDefaultInvocation();
396cdf0e10cSrcweir if( xI.is() )
397cdf0e10cSrcweir xI->setValue( PropertyName, Value );
398cdf0e10cSrcweir else
399cdf0e10cSrcweir throw UnknownPropertyException();
400cdf0e10cSrcweir }
401cdf0e10cSrcweir }
402cdf0e10cSrcweir
403cdf0e10cSrcweir // XInvokation
getValue(const OUString & PropertyName)404cdf0e10cSrcweir Any SAL_CALL ResourceService::getValue(const OUString& PropertyName)
405cdf0e10cSrcweir throw(UnknownPropertyException, RuntimeException)
406cdf0e10cSrcweir {
407cdf0e10cSrcweir OGuard aGuard( Application::GetSolarMutex() );
408cdf0e10cSrcweir if( PropertyName.equalsAscii("FileName" ))
409cdf0e10cSrcweir return makeAny( aFileName );
410cdf0e10cSrcweir
411cdf0e10cSrcweir Reference< XInvocation > xI = getDefaultInvocation();
412cdf0e10cSrcweir if( xI.is() )
413cdf0e10cSrcweir return xI->getValue( PropertyName );
414cdf0e10cSrcweir
415cdf0e10cSrcweir throw UnknownPropertyException();
416cdf0e10cSrcweir }
417cdf0e10cSrcweir
418cdf0e10cSrcweir // XInvokation
hasMethod(const OUString & Name)419cdf0e10cSrcweir sal_Bool SAL_CALL ResourceService::hasMethod(const OUString& Name)
420cdf0e10cSrcweir throw(RuntimeException)
421cdf0e10cSrcweir {
422cdf0e10cSrcweir if( Name.equalsAscii("getString") ||
423cdf0e10cSrcweir Name.equalsAscii("getStrings") ||
424cdf0e10cSrcweir Name.equalsAscii("hasString") ||
425cdf0e10cSrcweir Name.equalsAscii("hasStrings") ||
426cdf0e10cSrcweir Name.equalsAscii("getStringList") ||
427cdf0e10cSrcweir Name.equalsAscii("hasStringList")
428cdf0e10cSrcweir )
429cdf0e10cSrcweir return sal_True;
430cdf0e10cSrcweir else
431cdf0e10cSrcweir {
432cdf0e10cSrcweir Reference< XInvocation > xI = getDefaultInvocation();
433cdf0e10cSrcweir if( xI.is() )
434cdf0e10cSrcweir return xI->hasMethod( Name );
435cdf0e10cSrcweir else
436cdf0e10cSrcweir return sal_False;
437cdf0e10cSrcweir }
438cdf0e10cSrcweir }
439cdf0e10cSrcweir
440cdf0e10cSrcweir // XInvokation
hasProperty(const OUString & Name)441cdf0e10cSrcweir sal_Bool SAL_CALL ResourceService::hasProperty(const OUString& Name)
442cdf0e10cSrcweir throw(RuntimeException)
443cdf0e10cSrcweir {
444cdf0e10cSrcweir if( Name.equalsAscii("FileName") )
445cdf0e10cSrcweir return sal_True;
446cdf0e10cSrcweir else
447cdf0e10cSrcweir {
448cdf0e10cSrcweir Reference< XInvocation > xI = getDefaultInvocation();
449cdf0e10cSrcweir if( xI.is() )
450cdf0e10cSrcweir return xI->hasProperty( Name );
451cdf0e10cSrcweir else
452cdf0e10cSrcweir return sal_False;
453cdf0e10cSrcweir }
454cdf0e10cSrcweir }
455cdf0e10cSrcweir
456cdf0e10cSrcweir namespace res
457cdf0e10cSrcweir {
getComponentInfo_VclStringResourceLoader()458cdf0e10cSrcweir ComponentInfo getComponentInfo_VclStringResourceLoader()
459cdf0e10cSrcweir {
460cdf0e10cSrcweir ComponentInfo aInfo;
461cdf0e10cSrcweir aInfo.aSupportedServices = ResourceService::getSupportedServiceNames_Static();
462cdf0e10cSrcweir aInfo.sImplementationName = ResourceService::getImplementationName_Static();
463cdf0e10cSrcweir aInfo.pFactory = &ResourceService::Create;
464cdf0e10cSrcweir return aInfo;
465cdf0e10cSrcweir }
466cdf0e10cSrcweir }
467cdf0e10cSrcweir
468