1 /**************************************************************
2 *
3 * Licensed to the Apache Software Foundation (ASF) under one
4 * or more contributor license agreements. See the NOTICE file
5 * distributed with this work for additional information
6 * regarding copyright ownership. The ASF licenses this file
7 * to you under the Apache License, Version 2.0 (the
8 * "License"); you may not use this file except in compliance
9 * with the License. You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing,
14 * software distributed under the License is distributed on an
15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16 * KIND, either express or implied. See the License for the
17 * specific language governing permissions and limitations
18 * under the License.
19 *
20 *************************************************************/
21
22
23
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_scripting.hxx"
26
27 #ifndef _VCL_MSGBOX_HXX
28 #include <vcl/msgbox.hxx>
29 #endif
30
31 #include "ScriptExecDialog.hrc"
32
33 #include <util/scriptingconstants.hxx>
34
35 #include <cppuhelper/implementationentry.hxx>
36 #include <tools/diagnose_ex.h>
37
38 #include <com/sun/star/beans/XPropertySet.hpp>
39 #include <com/sun/star/lang/XEventListener.hpp>
40 #include <com/sun/star/lang/EventObject.hpp>
41
42 #include "ScriptNameResolverImpl.hxx"
43 #include "ScriptRuntimeManager.hxx"
44 #include <util/util.hxx>
45 #include <util/scriptingconstants.hxx>
46
47 using namespace ::rtl;
48 using namespace ::osl;
49 using namespace ::com::sun::star;
50 using namespace ::com::sun::star::uno;
51 using namespace ::drafts::com::sun::star::script::framework;
52
53 namespace scripting_runtimemgr
54 {
55
56 static OUString s_implName = ::rtl::OUString::createFromAscii(
57 "drafts.com.sun.star.script.framework.runtime.ScriptRuntimeManager" );
58 static OUString s_serviceName = ::rtl::OUString::createFromAscii(
59 "drafts.com.sun.star.script.framework.runtime.ScriptRuntimeManager" );
60 static Sequence< OUString > s_serviceNames = Sequence< OUString >( &s_serviceName, 1 );
61
62 ::rtl_StandardModuleCount s_moduleCount = MODULE_COUNT_INIT;
63
64 //*************************************************************************
65 // ScriptRuntimeManager Constructor
ScriptRuntimeManager(const Reference<XComponentContext> & xContext)66 ScriptRuntimeManager::ScriptRuntimeManager(
67 const Reference< XComponentContext > & xContext ) :
68 m_xContext( xContext, UNO_SET_THROW )
69 {
70 OSL_TRACE( "< ScriptRuntimeManager ctor called >\n" );
71 m_xMgr.set( m_xContext->getServiceManager(), UNO_SET_THROW );
72 s_moduleCount.modCnt.acquire( &s_moduleCount.modCnt );
73 // test
74 //scripting_securitymgr::ScriptSecurityManager ssm(xContext);
75 }
76
77 //*************************************************************************
78 // ScriptRuntimeManager Destructor
~ScriptRuntimeManager()79 ScriptRuntimeManager::~ScriptRuntimeManager()
80 {
81 OSL_TRACE( "< ScriptRuntimeManager dtor called >\n" );
82 s_moduleCount.modCnt.release( &s_moduleCount.modCnt );
83 }
84
85 //*************************************************************************
86 // Get the proper XScriptInvocation
getScriptRuntime(const Reference<XInterface> & scriptInfo)87 Reference< runtime::XScriptInvocation > SAL_CALL ScriptRuntimeManager::getScriptRuntime(
88 const Reference< XInterface >& scriptInfo )
89 {
90 OSL_TRACE( "** ==> ScriptRuntimeManager in getScriptRuntime\n" );
91
92 Reference< runtime::XScriptInvocation > xScriptInvocation;
93
94 try
95 {
96 Reference< XInterface > xInterface;
97
98 Reference< storage::XScriptInfo > sinfo =
99 Reference< storage::XScriptInfo >( scriptInfo, UNO_QUERY_THROW );
100
101 OUStringBuffer* buf( 80 );
102 buf.appendAscii("/singletons/drafts.com.sun.star.script.framework.runtime.theScriptRuntimeFor");
103 buf.append(sinfo->getLanguage());
104
105 xInterface.set( m_xContext->getValueByName( buf.makeStringAndClear() ), UNO_QUERY_THROW );
106 xScriptInvocation.set( xInterface, UNO_QUERY_THROW );
107 }
108 catch ( Exception & e )
109 {
110 OUString temp = OUSTR( "ScriptRuntimeManager::GetScriptRuntime: " );
111 throw RuntimeException( temp.concat( e.Message ), Reference< XInterface >() );
112 }
113
114 return xScriptInvocation;
115 }
116
117 //*************************************************************************
118 // Get the proper XScriptNameResolver
119 Reference< runtime::XScriptNameResolver > SAL_CALL
getScriptNameResolver()120 ScriptRuntimeManager::getScriptNameResolver()
121 {
122 OSL_TRACE( "** ==> ScriptRuntimeManager in getScriptNameResolver\n" );
123 Reference< runtime::XScriptNameResolver > xScriptNameResolver;
124
125 try
126 {
127 Reference< XInterface > xInterface(
128 m_xMgr->createInstanceWithContext(
129 OUString::createFromAscii("drafts.com.sun.star.script.framework.runtime.DefaultScriptNameResolver" ),
130 m_xContext
131 ),
132 UNO_SET_THROW
133 );
134 xScriptNameResolver.set( xInterface, UNO_QUERY_THROW );
135 }
136 catch ( Exception & e )
137 {
138 OUString temp = OUSTR( "ScriptRuntimeManager::GetScriptNameResolver: " );
139 throw RuntimeException( temp.concat( e.Message ), Reference< XInterface >() );
140 }
141 return xScriptNameResolver;
142 }
143
144 //*************************************************************************
145 // XScriptInvocation implementation
invoke(const::rtl::OUString & scriptURI,const Any & invocationCtx,const Sequence<Any> & aParams,Sequence<sal_Int16> & aOutParamIndex,Sequence<Any> & aOutParam)146 Any SAL_CALL ScriptRuntimeManager::invoke(
147 const ::rtl::OUString & scriptURI,
148 const Any& invocationCtx, const Sequence< Any >& aParams,
149 Sequence< sal_Int16 >& aOutParamIndex, Sequence< Any >& aOutParam )
150 {
151 OSL_TRACE( "** ==> ScriptRuntimeManager in runtimemgr invoke\n" );
152
153 Any results;
154 scripting_constants::ScriptingConstantsPool& scriptingConstantsPool =
155 scripting_constants::ScriptingConstantsPool::instance();
156
157 // Initialise resolved context with invocation context,
158 // the resolved context (resolvedCtx will be modified by the
159 // resolve method to contain the storage where the script code is
160 // stored
161 Any resolvedCtx = invocationCtx;
162
163 try
164 {
165 Reference< storage::XScriptInfo > resolvedScript = resolve( scriptURI, resolvedCtx );
166 ENSURE_OR_THROW( resolvedScript.is(), "ScriptRuntimeManager::invoke: No resolvedURI" );
167
168 Reference< beans::XPropertySet > xPropSetResolvedCtx;
169 if ( sal_False == ( resolvedCtx >>= xPropSetResolvedCtx ) )
170 {
171 throw RuntimeException( OUSTR(
172 "ScriptRuntimeManager::invoke : unable to get XPropSetScriptingContext from param" ),
173 Reference< XInterface > () );
174 }
175
176 Any any = xPropSetResolvedCtx->getPropertyValue(
177 scriptingConstantsPool.RESOLVED_STORAGE_ID );
178 sal_Int32 resolvedSid;
179 if ( sal_False == ( any >>= resolvedSid ) )
180 {
181 throw RuntimeException( OUSTR(
182 "ScriptRuntimeManager::invoke : unable to get resolved storage id from xPropSetResolvedCtx" ),
183 Reference< XInterface > () );
184 }
185
186 OSL_TRACE("Storage sid is: %d\n", resolvedSid);
187
188 // modifying the XPropertySet on the resolved Context to contain the
189 // full script info
190 Any aResolvedScript;
191 aResolvedScript <<= resolvedScript;
192
193 xPropSetResolvedCtx->setPropertyValue( scriptingConstantsPool.SCRIPT_INFO,
194 aResolvedScript );
195
196 Reference< runtime::XScriptInvocation > xScriptInvocation =
197 getScriptRuntime( resolvedScript );
198 ENSURE_OR_THROW( xScriptInvocation.is(),
199 "ScriptRuntimeManager::invoke: cannot get instance of language specific runtime." );
200
201 // the scriptURI is currently passed to the language-dept runtime but
202 // is not used (may be useful in the future?). All of the script info
203 // is contained as a property(SCRIPT_INFO) within the resolvedCtx
204 results = xScriptInvocation->invoke( scriptURI, resolvedCtx, aParams,
205 aOutParamIndex, aOutParam );
206
207 // need to dispose of filesystem storage
208 OUString filesysString = OUString::createFromAscii(
209 "location=filesystem" );
210 if ( scriptURI.indexOf( filesysString ) != -1 )
211 {
212 Any a = m_xContext->getValueByName(
213 scriptingConstantsPool.SCRIPTSTORAGEMANAGER_SERVICE );
214 Reference < lang::XEventListener > xEL_ScriptStorageManager( a, UNO_QUERY_THROW );
215 lang::EventObject event(resolvedScript);
216 xEL_ScriptStorageManager->disposing( event );
217 }
218 }
219 catch ( lang::IllegalArgumentException & iae )
220 {
221 OUString temp = OUSTR( "ScriptRuntimeManager::invoke IllegalArgumentException: " );
222 throw lang::IllegalArgumentException( temp.concat( iae.Message ),
223 Reference< XInterface > (),
224 iae.ArgumentPosition );
225 }
226 catch ( script::CannotConvertException & cce )
227 {
228 OUString temp = OUSTR( "ScriptRuntimeManager::invoke CannotConvertException: " );
229 throw script::CannotConvertException( temp.concat( cce.Message ),
230 Reference< XInterface > (),
231 cce.DestinationTypeClass, cce.Reason,
232 cce.ArgumentIndex );
233 }
234 catch ( reflection::InvocationTargetException & ite )
235 {
236 OUString temp = OUSTR( "ScriptRuntimeManager::invoke InvocationTargetException: " );
237 throw reflection::InvocationTargetException( temp.concat( ite.Message ),
238 Reference< XInterface > (), ite.TargetException );
239 }
240 catch ( beans::UnknownPropertyException & e )
241 {
242 OUString temp = OUSTR( "ScriptRuntimeManager::invoke UnknownPropertyException: " );
243 throw RuntimeException( temp.concat( e.Message ),
244 Reference< XInterface > () );
245 }
246 catch ( lang::WrappedTargetException & e )
247 {
248 OUString temp = OUSTR( "ScriptRuntimeManager::invoke WrappedTargetException : " );
249 throw RuntimeException( temp.concat( e.Message ),
250 Reference< XInterface > () );
251 }
252 catch ( RuntimeException & re )
253 {
254 OUString temp = OUSTR( "ScriptRuntimeManager::invoke RuntimeException: " );
255 throw RuntimeException( temp.concat( re.Message ),
256 Reference< XInterface > () );
257 }
258 catch ( Exception & e )
259 {
260 OUString temp = OUSTR( "ScriptRuntimeManager::invoke Exception: " );
261 throw RuntimeException( temp.concat( e.Message ),
262 Reference< XInterface > () );
263 }
264 #ifdef _DEBUG
265 catch ( ... )
266 {
267 throw RuntimeException( OUSTR( "ScriptRuntimeManager::invoke UnknownException: " ),
268 Reference< XInterface > () );
269 }
270 #endif
271 OSL_TRACE( "** ==> ScriptRuntimeManager returned from invoke: %s\n", ::rtl::OUStringToOString( results.getValueTypeName(), RTL_TEXTENCODING_ASCII_US ).pData->buffer );
272 return results;
273 }
274
275 //*************************************************************************
276 // XScriptNameResolver implementation
277 Reference< storage::XScriptInfo > SAL_CALL
resolve(const::rtl::OUString & scriptURI,Any & invocationCtx)278 ScriptRuntimeManager::resolve( const ::rtl::OUString& scriptURI,
279 Any& invocationCtx )
280 {
281 OSL_TRACE( "** ==> ScriptRuntimeManager in resolve\n" );
282 Reference< storage::XScriptInfo > resolvedURI;
283
284 Reference< runtime::XScriptNameResolver > xScriptNameResolver = getScriptNameResolver();
285 ENSURE_OR_THROW( xScriptNameResolver.is(),
286 "ScriptRuntimeManager::resolve: No ScriptNameResolver" );
287
288 try
289 {
290 resolvedURI = xScriptNameResolver->resolve( scriptURI, invocationCtx );
291 }
292 catch ( lang::IllegalArgumentException & iae )
293 {
294 OUString temp =
295 OUSTR( "ScriptRuntimeManager::resolve IllegalArgumentException: " );
296 throw lang::IllegalArgumentException( temp.concat( iae.Message ),
297 Reference< XInterface > (),
298 iae.ArgumentPosition );
299 }
300 catch ( script::CannotConvertException & cce )
301 {
302 OUString temp = OUSTR( "ScriptRuntimeManager::resolve CannotConvertException: " );
303 throw script::CannotConvertException( temp.concat( cce.Message ),
304 Reference< XInterface > (),
305 cce.DestinationTypeClass, cce.Reason,
306 cce.ArgumentIndex );
307 }
308 catch ( RuntimeException & re )
309 {
310 OUString temp = OUSTR( "ScriptRuntimeManager::resolve RuntimeException: " );
311 throw RuntimeException( temp.concat( re.Message ),
312 Reference< XInterface > () );
313 }
314 #ifdef _DEBUG
315 catch ( ... )
316 {
317 throw RuntimeException(
318 OUSTR( "ScriptRuntimeManager::resolve UnknownException: " ),
319 Reference< XInterface > () );
320 }
321 #endif
322
323 return resolvedURI;
324 }
325
326 //*************************************************************************
getImplementationName()327 OUString SAL_CALL ScriptRuntimeManager::getImplementationName( )
328 {
329 return s_implName;
330 }
331
332 //*************************************************************************
supportsService(const OUString & serviceName)333 sal_Bool SAL_CALL ScriptRuntimeManager::supportsService( const OUString& serviceName )
334 {
335 OUString const * pNames = s_serviceNames.getConstArray();
336 for ( sal_Int32 nPos = s_serviceNames.getLength(); nPos--; )
337 {
338 if ( serviceName.equals( pNames[ nPos ] ) )
339 {
340 return sal_True;
341 }
342 }
343 return sal_False;
344 }
345
346 //*************************************************************************
getSupportedServiceNames()347 Sequence<OUString> SAL_CALL ScriptRuntimeManager::getSupportedServiceNames( )
348 {
349 return s_serviceNames;
350 }
351
352 //*************************************************************************
srm_create(const Reference<XComponentContext> & xCompC)353 static Reference< XInterface > SAL_CALL srm_create(
354 const Reference< XComponentContext > & xCompC )
355 {
356 return ( cppu::OWeakObject * ) new ScriptRuntimeManager( xCompC );
357 }
358
359 //*************************************************************************
srm_getSupportedServiceNames()360 static Sequence<OUString> srm_getSupportedServiceNames( )
361 SAL_THROW( () )
362 {
363 return s_serviceNames;
364 }
365
366 //*************************************************************************
srm_getImplementationName()367 static OUString srm_getImplementationName( )
368 SAL_THROW( () )
369 {
370 return s_implName;
371 }
372
373 //*************************************************************************
374 Reference< XInterface > SAL_CALL scriptnri_create(
375 Reference< XComponentContext > const & xComponentContext );
376
377 //*************************************************************************
378 Sequence< OUString > scriptnri_getSupportedServiceNames() SAL_THROW( () );
379
380 //*************************************************************************
381 OUString scriptnri_getImplementationName() SAL_THROW( () );
382
383 //******************** ScriptStorageMangaer defines ***********************
384 Reference< XInterface > SAL_CALL ssm_create(
385 Reference< XComponentContext > const & xComponentContext );
386 //*************************************************************************
387 Sequence< OUString > ssm_getSupportedServiceNames() SAL_THROW( () );
388 //*************************************************************************
389 OUString ssm_getImplementationName() SAL_THROW( () );
390 //*************************************************************************
391
392 //************ Script Provider defines ************************************
393 Reference< XInterface > SAL_CALL sp_create( const Reference< XComponentContext > & xCompC );
394 //******************** ScriptProvider defines ***************************
395 Sequence< OUString > sp_getSupportedServiceNames( ) SAL_THROW( () );
396 //*************************************************************************
397 OUString sp_getImplementationName( ) SAL_THROW( () );
398 //*************************************************************************
399
400 //************ ScriptStorage defines **************************************
401 Reference< XInterface > SAL_CALL ss_create( const Reference< XComponentContext > & xCompC );
402 //******************** ScriptProvider defines ***************************
403 Sequence< OUString > ss_getSupportedServiceNames( ) SAL_THROW( () );
404 //*************************************************************************
405 OUString ss_getImplementationName( ) SAL_THROW( () );
406 //*************************************************************************
407
408
409 static struct cppu::ImplementationEntry s_entries [] =
410 {
411 {
412 srm_create, srm_getImplementationName,
413 srm_getSupportedServiceNames, cppu::createSingleComponentFactory,
414 &s_moduleCount.modCnt, 0
415 },
416 {
417 scriptnri_create, scriptnri_getImplementationName,
418 scriptnri_getSupportedServiceNames, cppu::createSingleComponentFactory,
419 &s_moduleCount.modCnt, 0
420 },
421 {
422 ssm_create, ssm_getImplementationName,
423 ssm_getSupportedServiceNames, cppu::createSingleComponentFactory,
424 0, 0
425 },
426 {
427 ss_create, ss_getImplementationName,
428 ss_getSupportedServiceNames, cppu::createSingleComponentFactory,
429 0, 0
430 },
431 {
432 sp_create, sp_getImplementationName,
433 sp_getSupportedServiceNames, cppu::createSingleComponentFactory,
434 0, 0
435 },
436 { 0, 0, 0, 0, 0, 0 }
437 };
438 } // Namespace
439
440 //#######################################################################################
441 //#### EXPORTED #########################################################################
442 //#######################################################################################
443
444 /**
445 * Gives the environment this component belongs to.
446 */
447 extern "C"
448 {
component_getImplementationEnvironment(const sal_Char ** ppEnvTypeName,uno_Environment ** ppEnv)449 void SAL_CALL component_getImplementationEnvironment( const sal_Char ** ppEnvTypeName,
450 uno_Environment ** ppEnv )
451 {
452 *ppEnvTypeName = CPPU_CURRENT_LANGUAGE_BINDING_NAME;
453 }
454
455 /**
456 * This function is called to get service factories for an implementation.
457 *
458 * @param pImplName name of implementation
459 * @param pServiceManager a service manager, need for component creation
460 * @param pRegistryKey the registry key for this component, need for persistent
461 * data
462 * @return a component factory
463 */
component_getFactory(const sal_Char * pImplName,lang::XMultiServiceFactory * pServiceManager,registry::XRegistryKey * pRegistryKey)464 void * SAL_CALL component_getFactory( const sal_Char * pImplName,
465 lang::XMultiServiceFactory * pServiceManager,
466 registry::XRegistryKey * pRegistryKey )
467 {
468 return ::cppu::component_getFactoryHelper( pImplName, pServiceManager,
469 pRegistryKey, ::scripting_runtimemgr::s_entries );
470 }
471 }
472