xref: /trunk/main/scripting/source/runtimemgr/ScriptNameResolverImpl.cxx (revision 91144cd0085a7583d2099b982122deb2184ab956)
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 #include <vector>
28 #include <stdlib.h>
29 
30 #include <cppuhelper/implementationentry.hxx>
31 #include <com/sun/star/beans/XPropertySet.hpp>
32 #include <com/sun/star/security/AccessControlException.hpp>
33 
34 #include <util/util.hxx>
35 #include <util/scriptingconstants.hxx>
36 
37 #include <drafts/com/sun/star/script/framework/storage/XScriptStorageManager.hpp>
38 #include <drafts/com/sun/star/script/framework/security/XScriptSecurity.hpp>
39 
40 #include "ScriptNameResolverImpl.hxx"
41 #include "ScriptRuntimeManager.hxx"
42 
43 using namespace ::rtl;
44 using namespace ::com::sun::star;
45 using namespace ::com::sun::star::uno;
46 using namespace ::drafts::com::sun::star::script::framework;
47 
48 namespace scripting_runtimemgr
49 {
50 
51 const sal_Char* const LANGUAGE_TO_RESOLVE_ON[] = { "All" }; // should be configurable
52 OUString nrs_implName = OUString::createFromAscii(
53     "drafts.com.sun.star.script.framework.runtime.DefaultScriptNameResolver" );
54 OUString nrs_serviceName = OUString::createFromAscii(
55     "drafts.com.sun.star.script.framework.runtime.DefaultScriptNameResolver" );
56 Sequence< OUString > nrs_serviceNames = Sequence< OUString >( &nrs_serviceName, 1 );
57 
58 const char* const SCRIPTSTORAGEMANAGER_SERVICE =
59     "/singletons/drafts.com.sun.star.script.framework.storage.theScriptStorageManager";
60 
61 extern ::rtl_StandardModuleCount s_moduleCount;
62 
63 // define storages to search
64 static ::std::vector< sal_Int32 >* m_pSearchIDs = NULL;
65 
66 //*************************************************************************
ScriptNameResolverImpl(const Reference<XComponentContext> & xContext)67 ScriptNameResolverImpl::ScriptNameResolverImpl(
68     const Reference< XComponentContext > & xContext ) :
69     m_xContext( xContext, UNO_SET_THROW )
70 {
71     OSL_TRACE( "< ScriptNameResolverImpl ctor called >\n" );
72     validateXRef( m_xContext, "ScriptNameResolverImpl::ScriptNameResolverImpl: invalid context" );
73     m_xMultiComFac.set( m_xContext->getServiceManager(), UNO_SET_THROW );
74 
75     if( !m_pSearchIDs )
76     {
77         osl::Guard< osl::Mutex > aGuard( m_mutex );
78         if( !m_pSearchIDs )
79         {
80             scripting_constants::ScriptingConstantsPool& scriptingConstantsPool =
81                 scripting_constants::ScriptingConstantsPool::instance();
82             m_pSearchIDs = new ::std::vector< sal_Int32 >();
83             m_pSearchIDs->push_back( scriptingConstantsPool.DOC_STORAGE_ID_NOT_SET );
84             m_pSearchIDs->push_back( scriptingConstantsPool.USER_STORAGE_ID );
85             m_pSearchIDs->push_back( scriptingConstantsPool.SHARED_STORAGE_ID );
86         }
87     }
88 
89     s_moduleCount.modCnt.acquire( &s_moduleCount.modCnt );
90 }
91 
92 //*************************************************************************
~ScriptNameResolverImpl()93 ScriptNameResolverImpl::~ScriptNameResolverImpl()
94 {
95     OSL_TRACE( "< ScriptNameResolverImpl dtor called >\n" );
96     s_moduleCount.modCnt.release( &s_moduleCount.modCnt );
97 }
98 
99 //*************************************************************************
resolve(const::rtl::OUString & scriptURI,Any & invocationCtx)100 Reference< storage::XScriptInfo > ScriptNameResolverImpl::resolve(
101 const ::rtl::OUString & scriptURI, Any& invocationCtx )
102 {
103 
104     Reference< storage::XScriptInfo > resolvedName;
105     Reference< beans::XPropertySet > xPropSetScriptingContext;
106     scripting_constants::ScriptingConstantsPool& scriptingConstantsPool =
107             scripting_constants::ScriptingConstantsPool::instance();
108 
109     OSL_TRACE( "ScriptNameResolverImpl::resolve: in resolve - start" );
110 
111     if ( sal_False == ( invocationCtx >>= xPropSetScriptingContext ) )
112     {
113         throw RuntimeException( OUSTR(
114             "ScriptNameResolverImpl::resolve : unable to get XScriptingContext from param" ),
115             Reference< XInterface > () );
116     }
117 
118     Any any;
119     OUString docUri;
120     sal_Int32 filesysScriptStorageID = -1;
121     Reference < storage::XScriptStorageManager > xScriptStorageMgr;
122     sal_Int32 docSid;
123     try
124     {
125         any = xPropSetScriptingContext->getPropertyValue(
126             scriptingConstantsPool.DOC_URI );
127         OSL_TRACE( "ScriptNameResolverImpl::resolve: in resolve - got anyUri" );
128         if ( sal_False == ( any >>= docUri ) )
129         {
130             throw RuntimeException( OUSTR(
131             "ScriptNameResolverImpl::resolve : unable to get doc Uri from xPropSetScriptingContext" ),
132                 Reference< XInterface > () );
133         }
134         any = xPropSetScriptingContext->getPropertyValue(
135             scriptingConstantsPool.DOC_STORAGE_ID );
136         if ( sal_False == ( any >>= docSid ) )
137         {
138             throw RuntimeException( OUSTR(
139                 "ScriptNameResolverImpl::resolve : unable to get doc storage id from xPropSetScriptingContext" ),
140                 Reference< XInterface > () );
141         }
142     }
143     catch ( Exception & e )
144     {
145         OUString temp = OUSTR(
146             "ScriptNameResolverImpl::resolve : problem with getPropertyValue" );
147         throw RuntimeException( temp.concat( e.Message ),
148                                 Reference< XInterface > () );
149     }
150 #ifdef _DEBUG
151     catch ( ... )
152     {
153         throw RuntimeException( OUSTR(
154             "ScriptNameResolverImpl::resolve Unknown Exception caught - RuntimeException rethrown" ),
155             Reference< XInterface > () );
156     }
157 #endif
158 
159 
160     ::rtl::OString docUriO(
161         ::rtl::OUStringToOString( docUri , RTL_TEXTENCODING_ASCII_US ) );
162     OSL_TRACE(
163         "ScriptNameResolverImpl::resolve: *** >>> DOC URI: %s, doc sid is %d\n",
164         docUriO.pData->buffer, docSid );
165 
166 
167     OSL_TRACE( "ScriptNameResolverImpl::resolve Starting..." );
168     OUString docString = OUString::createFromAscii( "location=document" );
169     OUString userString = OUString::createFromAscii( "location=user" );
170     OUString shareString = OUString::createFromAscii( "location=share" );
171     OUString filesysString = OUString::createFromAscii( "location=filesystem" );
172 
173     // initialise vector with doc, user and share
174 
175     // m_pSearchIDs is initialised as follows,
176     // m_pSearchIDs [ 0 ] empty
177     // m_pSearchIDs [ 1 ] user storage id
178     // m_pSearchIDs [ 2 ] share "      "
179 
180     ::std::vector< sal_Int32 > m_vSearchIDs = *m_pSearchIDs;
181     m_vSearchIDs[ 0 ] = docSid;
182 
183     if ( scriptURI.indexOf( docString ) != -1 )
184     {
185         OSL_TRACE("Full resolution available, search document");
186         // search in document
187         m_vSearchIDs.resize( 1 );
188     }
189     else if ( scriptURI.indexOf( userString ) != -1 )
190     {
191         OSL_TRACE("Full resolution available, search user");
192         // search in user
193         m_vSearchIDs[ 0 ] = ( *m_pSearchIDs )[ 1 ];
194         m_vSearchIDs.resize( 1 );
195     }
196     else if ( scriptURI.indexOf( shareString ) != -1 )
197     {
198         OSL_TRACE("Full resolution available, search share");
199         // search in share
200         m_vSearchIDs[ 0 ] = ( *m_pSearchIDs )[ 2 ];
201         m_vSearchIDs.resize( 1 );
202     }
203     else if ( scriptURI.indexOf( filesysString ) != -1 )
204     {
205         OSL_TRACE("Full resolution available, create & search filesystem");
206         OUString filesysURL;
207         try
208         {
209             filesysURL = getFilesysURL( scriptURI );
210         }
211         catch ( lang::IllegalArgumentException & e )
212         {
213             OUString temp = OUSTR( "ScriptNameResolverImpl::resolve: " );
214             throw RuntimeException( temp.concat( e.Message ), Reference< XInterface >() );
215         }
216         Reference< XInterface > xInterface(
217             m_xMultiComFac->createInstanceWithContext(
218                 ::rtl::OUString::createFromAscii( "com.sun.star.ucb.SimpleFileAccess" ),
219                 m_xContext
220             ),
221             UNO_SET_THROW
222         );
223         Reference < ucb::XSimpleFileAccess > xSimpleFileAccess = Reference <
224                     ucb::XSimpleFileAccess > ( xInterface, UNO_QUERY_THROW );
225 
226         // do we need to encode this? hope not.
227         OSL_TRACE( ">>>> About to create storage for %s",
228                 ::rtl::OUStringToOString( filesysURL,
229                     RTL_TEXTENCODING_ASCII_US ).pData->buffer );
230         // ask storage manager to create storage
231         try
232         {
233             // need to get the ScriptStorageManager
234             xScriptStorageMgr.set( m_xContext->getValueByName(
235                     scriptingConstantsPool.SCRIPTSTORAGEMANAGER_SERVICE ), UNO_QUERY_THROW );
236             filesysScriptStorageID =
237                     xScriptStorageMgr->createScriptStorageWithURI(
238                         xSimpleFileAccess, filesysURL );
239                 OSL_TRACE( ">>>> Created storage %d - for %s ",
240                     filesysScriptStorageID, ::rtl::OUStringToOString(
241                         filesysURL, RTL_TEXTENCODING_ASCII_US ).pData->buffer );
242         }
243         catch ( RuntimeException & e )
244         {
245             OUString temp = OUSTR( "ScriptNameResolverImpl::resolve: " );
246             throw RuntimeException( temp.concat( e.Message ), Reference< XInterface >() );
247         }
248         m_vSearchIDs[ 0 ] = filesysScriptStorageID;
249         m_vSearchIDs.resize( 1 );
250     }
251     else
252     {
253         OSL_TRACE("Only partial uri available, search doc, user & share");
254         // is this illegal or do we search in a default way
255         // if we get to here a uri has been passed in that has:
256         // a) not got a location specified
257         // b) an illegal location
258 
259         // detect illegal location
260         if (  scriptURI.indexOf( OUString::createFromAscii( "location=" ) ) != -1 )
261         {
262             OSL_TRACE(
263                 "ScriptNameResolver::resolve, throwing IllegalArgException" );
264             throw lang::IllegalArgumentException(
265                 OUSTR( "invalid URI: " ).concat( scriptURI ),
266                 Reference < XInterface > (), 1 );
267 
268         }
269         // leave vSearchIDs take care of the search...
270     }
271 
272     ::std::vector< sal_Int32 >::const_iterator iter;
273     ::std::vector< sal_Int32 >::const_iterator iterEnd = m_vSearchIDs.end();
274 
275     for ( iter = m_vSearchIDs.begin() ; iter != iterEnd; ++iter )
276     {
277         try
278         {
279             OSL_TRACE( "** about to resolve from storage using id %d from vector of size %d",
280                 *iter, m_vSearchIDs.size() );
281             if ( ( resolvedName = resolveURIFromStorageID( *iter, docUri, scriptURI ) ).is() )
282             {
283                 OSL_TRACE( "found match in uri from storage %d", *iter );
284                 xPropSetScriptingContext->setPropertyValue(
285                 scriptingConstantsPool.RESOLVED_STORAGE_ID, makeAny(*iter) );
286                 break;
287             }
288 
289         }
290         catch ( css::security::AccessControlException  & e )
291         {
292             // no execute permission
293             OSL_TRACE( "ScriptNameResolverImpl::resolve : AccessControlException " );
294             continue;
295         }
296         catch ( beans::UnknownPropertyException & e )
297         {
298             OUString temp = OUSTR(
299                 "ScriptNameResolverImpl::resolve : UnknownPropertyException" );
300             throw RuntimeException( temp.concat( e.Message ),
301                 Reference< XInterface > () );
302         }
303         catch ( beans::PropertyVetoException  & e )
304         {
305             OUString temp = OUSTR(
306                 "ScriptNameResolverImpl::resolve : PropertyVetoException " );
307             throw RuntimeException( temp.concat( e.Message ),
308                 Reference< XInterface > () );
309         }
310         catch ( lang::IllegalArgumentException  & e )
311         {
312             OUString temp = OUSTR(
313                 "ScriptNameResolverImpl::resolve : IllegalArgumentException " );
314             throw lang::IllegalArgumentException( temp.concat( e.Message ),
315                 Reference< XInterface > (), e.ArgumentPosition );
316         }
317         catch ( lang::WrappedTargetException & e )
318         {
319         OUString temp = OUSTR(
320                 "ScriptNameResolverImpl::resolve : WrappedTargetException " );
321             throw RuntimeException( temp.concat( e.Message ),
322                 Reference< XInterface > () );
323         }
324         catch ( Exception & e )
325         {
326             OSL_TRACE(
327                 "Exception thrown by storage %d, failed to match uri: %s",
328                  *iter,
329                  ::rtl::OUStringToOString( e.Message,
330                  RTL_TEXTENCODING_ASCII_US ).pData->buffer );
331         OUString temp = OUSTR(
332                 "ScriptNameResolverImpl::resolve : unknown exception" );
333             throw RuntimeException( temp.concat( e.Message ),
334                 Reference< XInterface > () );
335         }
336 #ifdef _DEBUG
337         catch ( ... )
338         {
339             OSL_TRACE(
340                 "unknown exception thrown by storage %d, failed to match uri",
341                 *iter );
342         OUString temp = OUSTR(
343                 "ScriptNameResolverImpl::resolve Unknown exception caught - RuntimeException rethrown" );
344             throw RuntimeException( temp,
345                 Reference< XInterface > () );
346         }
347 #endif
348 
349     }
350     if ( !resolvedName.is() )
351     {
352         if( filesysScriptStorageID >  2 )
353         {
354             // get the filesys storage and dispose of it
355             Reference< XInterface > xScriptStorage( xScriptStorageMgr->getScriptStorage( filesysScriptStorageID ), UNO_SET_THROW );
356             Reference< storage::XScriptInfoAccess > xScriptInfoAccess = Reference<
357                 storage::XScriptInfoAccess > ( xScriptStorage, UNO_QUERY_THROW );
358             Sequence< Reference< storage::XScriptInfo > > results =
359                 xScriptInfoAccess->getAllImplementations( );
360             Reference < lang::XEventListener > xEL_ScriptStorageMgr(( xScriptStorageMgr ,UNO_QUERY_THROW );
361             lang::EventObject event( results[ 0 ] );
362             xEL_ScriptStorageMgr->disposing( event );
363         }
364         throw lang::IllegalArgumentException( OUSTR(
365             "ScriptNameResolverImpl::resolve: no script found for uri=" ).concat( scriptURI ),
366             Reference< XInterface > (), 0 );
367     }
368     return resolvedName;
369 }
370 
371 //*************************************************************************
372 OUString SAL_CALL
373 ScriptNameResolverImpl::getImplementationName( )
374 {
375     return nrs_implName;
376 }
377 
378 //*************************************************************************
379 sal_Bool SAL_CALL
380 ScriptNameResolverImpl::supportsService( const OUString& serviceName )
381 {
382     OUString const * pNames = nrs_serviceNames.getConstArray();
383     for ( sal_Int32 nPos = nrs_serviceNames.getLength(); nPos--; )
384     {
385         if ( serviceName.equals( pNames[ nPos ] ) )
386         {
387             return sal_True;
388         }
389     }
390     return sal_False;
391 }
392 
393 //*************************************************************************
394 
395 Reference< storage::XScriptInfo >
396 ScriptNameResolverImpl::resolveURIFromStorageID
397 ( sal_Int32 sid, const ::rtl::OUString & docURI,
398   const ::rtl::OUString& scriptURI )
399 {
400     Reference< storage::XScriptInfo > resolvedScriptInfo;
401     scripting_constants::ScriptingConstantsPool& scriptingConstantsPool =
402         scripting_constants::ScriptingConstantsPool::instance();
403     if ( sid == scriptingConstantsPool.DOC_STORAGE_ID_NOT_SET )
404     {
405         OSL_TRACE( "@@@@ **** ScriptNameResolverImpl::resolve DOC_STORAGE_ID_NOT_SET" );
406         return resolvedScriptInfo;
407     }
408     try
409     {
410         OUString permissionURI = docURI;
411         OUString filesysString = OUString::createFromAscii( "location=filesystem" );
412         if ( scriptURI.indexOf( filesysString ) != -1 )
413         {
414             // in the case of filesys scripts we're checking whether the
415             // location of the script, rather than the location of the document,
416             // has execute permission
417             try
418             {
419                 permissionURI = getFilesysURL( scriptURI );
420             }
421             catch ( lang::IllegalArgumentException & e )
422             {
423                 OUString temp = OUSTR( "ScriptNameResolverImpl::resolveFromURI: " );
424                 throw RuntimeException( temp.concat( e.Message ), Reference< XInterface >() );
425             }
426         }
427         Reference< storage::XScriptInfoAccess > storage( getStorageInstance( sid, permissionURI ), UNO_SET_THROW );
428         Sequence< Reference< storage::XScriptInfo > > results =
429             storage->getImplementations( scriptURI );
430 
431         const sal_Int32 length = results.getLength();
432 
433         if ( !length )
434         {
435             return resolvedScriptInfo;
436         }
437 
438         OSL_TRACE( "ScriptNameResolverImpl::resolve Got some results..." );
439         // if we get results, just return first in list,
440         // storage has already matched language, function name etc. if
441         // that information was in the uri
442         resolvedScriptInfo = results[ 0 ];
443     }
444     catch ( css::security::AccessControlException & ace )
445     {
446         OUString temp = OUSTR(
447             "ScriptRuntimeManager::resolveURIFromStorageID AccessControlException: " );
448         throw css::security::AccessControlException( temp.concat( ace.Message ),
449                                               Reference< XInterface > (),
450                                                 ace.LackingPermission );
451     }
452     catch ( lang::IllegalArgumentException & iae )
453     {
454         OUString temp = OUSTR(
455             "ScriptRuntimeManager::resolveURIFromStorageID IllegalArgumentException: " );
456         throw lang::IllegalArgumentException( temp.concat( iae.Message ),
457                                               Reference< XInterface > (),
458                                               iae.ArgumentPosition );
459     }
460     catch ( RuntimeException & re )
461     {
462         OUString temp = OUSTR(
463             "ScriptRuntimeManager::resolveURIFromStorageID RuntimeException: " );
464         throw RuntimeException( temp.concat( re.Message ),
465                                 Reference< XInterface > () );
466     }
467     catch ( Exception & e )
468     {
469         OUString temp = OUSTR(
470             "ScriptNameResolverImpl::resolveURIFromStorageID : Exception caught - RuntimeException rethrown" );
471         throw RuntimeException( temp.concat( e.Message ),
472                                 Reference< XInterface > () );
473     }
474 #ifdef _DEBUG
475     catch ( ... )
476     {
477         throw RuntimeException( OUSTR(
478             "ScriptNameResolverImpl::resolveURIFromStorageID Unknown exception caught - RuntimeException rethrown" ),
479             Reference< XInterface > () );
480     }
481 #endif
482     return resolvedScriptInfo;
483 }
484 //*************************************************************************
485 
486 Reference< storage::XScriptInfoAccess >
487 
488 ScriptNameResolverImpl::getStorageInstance( sal_Int32 sid,
489 const ::rtl::OUString & permissionURI )
490 {
491     Reference< storage::XScriptInfoAccess > xScriptInfoAccess;
492     try
493     {
494         Reference< XInterface > xInterface( m_xContext->getValueByName(
495                     OUString::createFromAscii( SCRIPTSTORAGEMANAGER_SERVICE ) ), UNO_QUERY_THROW );
496         // check that we have permissions for this storage
497         Reference< dcsssf::security::XScriptSecurity > xScriptSecurity( xInterface, UNO_QUERY_THROW );
498         scripting_constants::ScriptingConstantsPool& scriptingConstantsPool =
499                 scripting_constants::ScriptingConstantsPool::instance();
500         // if we dealing with a document storage (ie. not user or share
501         // we need to check the permission
502         if( ( sid != scriptingConstantsPool.USER_STORAGE_ID ) &&
503             ( sid != scriptingConstantsPool.SHARED_STORAGE_ID ) )
504         {
505             xScriptSecurity->checkPermission( permissionURI,
506                 OUString::createFromAscii( "execute" ) );
507             // if we get here, the checkPermission hasn't thrown an
508             // AccessControlException, ie. permission has been granted
509             OSL_TRACE( "ScriptNameResolverImpl::getStorageInstance: got execute permission for ID=%d", sid );
510         }
511         Reference< storage::XScriptStorageManager > xScriptStorageManager( xInterface, UNO_QUERY_THROW );
512         Reference< XInterface > xScriptStorage( ScriptStorageManager->getScriptStorage( sid ), UNO_SET_THROW );
513         xScriptInfoAccess.set( xScriptStorage, UNO_QUERY_THROW );
514     }
515     catch ( lang::IllegalArgumentException & e )
516     {
517         OUString temp = OUSTR( "ScriptNameResolverImpl::getStorageInstance: " );
518         throw lang::IllegalArgumentException( temp.concat( e.Message ),
519             Reference< XInterface >(), e.ArgumentPosition );
520     }
521     catch ( css::security::AccessControlException & e )
522     {
523         OUString temp = OUSTR( "ScriptNameResolverImpl::getStorageInstance: AccessControlException " );
524         throw css::security::AccessControlException( temp.concat( e.Message ), Reference< XInterface >(), e.LackingPermission );
525     }
526     catch ( RuntimeException & re )
527     {
528         OUString temp = OUSTR( "ScriptNameResolverImpl::getStorageInstance: " );
529         throw RuntimeException( temp.concat( re.Message ), Reference< XInterface >() );
530     }
531     catch ( Exception & e )
532     {
533         OUString temp = OUSTR( "ScriptNameResolverImpl::getStorageInstance: " );
534         throw RuntimeException( temp.concat( e.Message ), Reference< XInterface >() );
535     }
536     return xScriptInfoAccess;
537 }
538 //*************************************************************************
539 OUString
540 ScriptNameResolverImpl::getFilesysURL( const OUString & scriptURI )
541 {
542         OUString filePath;
543         OUString fileName;
544         OUString filesysString = OUString::createFromAscii( "location=filesystem" );
545         sal_Int32 locationPos = scriptURI.indexOf( filesysString );
546         // expect location=filesys:file:///foo/bar/myscript.bsh etc
547         // except the file url at this point is encoded
548         // so we should be ok searching for the '&'
549         sal_Int32 filesysStrLen = filesysString.getLength() + 1;
550         sal_Int32 endOfLocn = scriptURI.indexOf( '&', locationPos );
551         if (endOfLocn == -1 )
552         {
553                 filePath = scriptURI.copy( locationPos + filesysString.getLength() + 1 );
554         }
555         else
556         {
557                 filePath = scriptURI.copy( locationPos + filesysStrLen,
558                                 endOfLocn - locationPos - filesysStrLen );
559         }
560         //file name shoul also be encoded so again ok to search for '&'
561         OUString functionKey = OUString::createFromAscii( "function=" );
562         sal_Int32 functionKeyLength = functionKey.getLength();
563         sal_Int32 functionNamePos = scriptURI.indexOf( functionKey );
564         if ( functionNamePos > 0 )
565         {
566             sal_Int32 endOfFn = scriptURI.indexOf( '&', functionNamePos );
567             if ( endOfFn == -1 )
568             {
569                 fileName = scriptURI.copy( functionNamePos + functionKeyLength );
570             }
571             else
572             {
573                 fileName = scriptURI.copy( functionNamePos + functionKeyLength,
574                                 endOfFn - functionNamePos - functionKeyLength );
575             }
576         }
577         else
578         {
579             // we need to throw
580             OUString temp = OUSTR( "ScriptNameResolverImpl::getFilesysURL: error getting the filesysURL" );
581             throw lang::IllegalArgumentException( temp, Reference< XInterface >(), 0 );
582         }
583         filePath+=fileName;
584         OSL_TRACE( "ScriptNameResolverImpl::getFilesysURL: filesys URL = %s",
585                  ::rtl::OUStringToOString( filePath,
586                  RTL_TEXTENCODING_ASCII_US ).pData->buffer );
587         return filePath;
588 }
589 //*************************************************************************
590 Sequence<OUString> SAL_CALL
591 ScriptNameResolverImpl::getSupportedServiceNames( )
592 {
593     return nrs_serviceNames;
594 }
595 
596 //*************************************************************************
597 Reference< XInterface > SAL_CALL scriptnri_create(
598     Reference< XComponentContext > const & xComponentContext )
599 {
600     return ( cppu::OWeakObject * ) new ScriptNameResolverImpl( xComponentContext );
601 }
602 
603 //*************************************************************************
604 Sequence< OUString > scriptnri_getSupportedServiceNames() SAL_THROW( () )
605 {
606     return nrs_serviceNames;
607 }
608 
609 //*************************************************************************
610 OUString scriptnri_getImplementationName() SAL_THROW( () )
611 {
612     return nrs_implName;
613 }
614 } // namespace scripting_runtimemgr
615