summaryrefslogtreecommitdiff
path: root/scripting/source/runtimemgr/ScriptNameResolverImpl.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'scripting/source/runtimemgr/ScriptNameResolverImpl.cxx')
-rw-r--r--scripting/source/runtimemgr/ScriptNameResolverImpl.cxx663
1 files changed, 663 insertions, 0 deletions
diff --git a/scripting/source/runtimemgr/ScriptNameResolverImpl.cxx b/scripting/source/runtimemgr/ScriptNameResolverImpl.cxx
new file mode 100644
index 000000000000..c1e650f1507a
--- /dev/null
+++ b/scripting/source/runtimemgr/ScriptNameResolverImpl.cxx
@@ -0,0 +1,663 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: ScriptNameResolverImpl.cxx,v $
+ * $Revision: 1.31 $
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_scripting.hxx"
+
+#include <vector>
+#include <stdlib.h>
+
+#include <cppuhelper/implementationentry.hxx>
+#include <com/sun/star/beans/XPropertySet.hpp>
+#include <com/sun/star/security/AccessControlException.hpp>
+
+#include <util/util.hxx>
+#include <util/scriptingconstants.hxx>
+
+#include <drafts/com/sun/star/script/framework/storage/XScriptStorageManager.hpp>
+#include <drafts/com/sun/star/script/framework/security/XScriptSecurity.hpp>
+
+#include "ScriptNameResolverImpl.hxx"
+#include "ScriptRuntimeManager.hxx"
+
+using namespace ::rtl;
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::drafts::com::sun::star::script::framework;
+
+namespace scripting_runtimemgr
+{
+
+const sal_Char* const LANGUAGE_TO_RESOLVE_ON[] = { "All" }; // should be configurable
+OUString nrs_implName = OUString::createFromAscii(
+ "drafts.com.sun.star.script.framework.runtime.DefaultScriptNameResolver" );
+OUString nrs_serviceName = OUString::createFromAscii(
+ "drafts.com.sun.star.script.framework.runtime.DefaultScriptNameResolver" );
+Sequence< OUString > nrs_serviceNames = Sequence< OUString >( &nrs_serviceName, 1 );
+
+const char* const SCRIPTSTORAGEMANAGER_SERVICE =
+ "/singletons/drafts.com.sun.star.script.framework.storage.theScriptStorageManager";
+
+extern ::rtl_StandardModuleCount s_moduleCount;
+
+// define storages to search
+static ::std::vector< sal_Int32 >* m_pSearchIDs = NULL;
+
+//*************************************************************************
+ScriptNameResolverImpl::ScriptNameResolverImpl(
+ const Reference< XComponentContext > & xContext ) :
+ m_xContext( xContext )
+{
+ OSL_TRACE( "< ScriptNameResolverImpl ctor called >\n" );
+ validateXRef( m_xContext, "ScriptNameResolverImpl::ScriptNameResolverImpl: invalid context" );
+ m_xMultiComFac = m_xContext->getServiceManager();
+
+ validateXRef( m_xMultiComFac, "ScriptNameResolverImpl::ScriptNameResolverImpl: invalid XMultiComponentFactory " );
+
+ if( !m_pSearchIDs )
+ {
+ osl::Guard< osl::Mutex > aGuard( m_mutex );
+ if( !m_pSearchIDs )
+ {
+ scripting_constants::ScriptingConstantsPool& scriptingConstantsPool =
+ scripting_constants::ScriptingConstantsPool::instance();
+ m_pSearchIDs = new ::std::vector< sal_Int32 >();
+ m_pSearchIDs->push_back( scriptingConstantsPool.DOC_STORAGE_ID_NOT_SET );
+ m_pSearchIDs->push_back( scriptingConstantsPool.USER_STORAGE_ID );
+ m_pSearchIDs->push_back( scriptingConstantsPool.SHARED_STORAGE_ID );
+ }
+ }
+
+ s_moduleCount.modCnt.acquire( &s_moduleCount.modCnt );
+}
+
+//*************************************************************************
+ScriptNameResolverImpl::~ScriptNameResolverImpl()
+{
+ OSL_TRACE( "< ScriptNameResolverImpl dtor called >\n" );
+ s_moduleCount.modCnt.release( &s_moduleCount.modCnt );
+}
+
+//*************************************************************************
+Reference< storage::XScriptInfo > ScriptNameResolverImpl::resolve(
+const ::rtl::OUString & scriptURI, Any& invocationCtx )
+throw ( lang::IllegalArgumentException, script::CannotConvertException, RuntimeException )
+{
+
+ Reference< storage::XScriptInfo > resolvedName;
+ Reference< beans::XPropertySet > xPropSetScriptingContext;
+ scripting_constants::ScriptingConstantsPool& scriptingConstantsPool =
+ scripting_constants::ScriptingConstantsPool::instance();
+
+ OSL_TRACE( "ScriptNameResolverImpl::resolve: in resolve - start" );
+
+ if ( sal_False == ( invocationCtx >>= xPropSetScriptingContext ) )
+ {
+ throw RuntimeException( OUSTR(
+ "ScriptNameResolverImpl::resolve : unable to get XScriptingContext from param" ),
+ Reference< XInterface > () );
+ }
+
+ Any any;
+ OUString docUri;
+ sal_Int32 filesysScriptStorageID = -1;
+ Reference < storage::XScriptStorageManager > xScriptStorageMgr;
+ sal_Int32 docSid;
+ try
+ {
+ any = xPropSetScriptingContext->getPropertyValue(
+ scriptingConstantsPool.DOC_URI );
+ OSL_TRACE( "ScriptNameResolverImpl::resolve: in resolve - got anyUri" );
+ if ( sal_False == ( any >>= docUri ) )
+ {
+ throw RuntimeException( OUSTR(
+ "ScriptNameResolverImpl::resolve : unable to get doc Uri from xPropSetScriptingContext" ),
+ Reference< XInterface > () );
+ }
+ any = xPropSetScriptingContext->getPropertyValue(
+ scriptingConstantsPool.DOC_STORAGE_ID );
+ if ( sal_False == ( any >>= docSid ) )
+ {
+ throw RuntimeException( OUSTR(
+ "ScriptNameResolverImpl::resolve : unable to get doc storage id from xPropSetScriptingContext" ),
+ Reference< XInterface > () );
+ }
+ }
+ catch ( Exception & e )
+ {
+ OUString temp = OUSTR(
+ "ScriptNameResolverImpl::resolve : problem with getPropertyValue" );
+ throw RuntimeException( temp.concat( e.Message ),
+ Reference< XInterface > () );
+ }
+#ifdef _DEBUG
+ catch ( ... )
+ {
+ throw RuntimeException( OUSTR(
+ "ScriptNameResolverImpl::resolve Unknown Exception caught - RuntimeException rethrown" ),
+ Reference< XInterface > () );
+ }
+#endif
+
+
+ ::rtl::OString docUriO(
+ ::rtl::OUStringToOString( docUri , RTL_TEXTENCODING_ASCII_US ) );
+ OSL_TRACE(
+ "ScriptNameResolverImpl::resolve: *** >>> DOC URI: %s, doc sid is %d\n",
+ docUriO.pData->buffer, docSid );
+
+
+ OSL_TRACE( "ScriptNameResolverImpl::resolve Starting..." );
+ OUString docString = OUString::createFromAscii( "location=document" );
+ OUString userString = OUString::createFromAscii( "location=user" );
+ OUString shareString = OUString::createFromAscii( "location=share" );
+ OUString filesysString = OUString::createFromAscii( "location=filesystem" );
+
+ // initialise vector with doc, user and share
+
+ // m_pSearchIDs is initialised as follows,
+ // m_pSearchIDs [ 0 ] empty
+ // m_pSearchIDs [ 1 ] user storage id
+ // m_pSearchIDs [ 2 ] share " "
+
+ ::std::vector< sal_Int32 > m_vSearchIDs = *m_pSearchIDs;
+ m_vSearchIDs[ 0 ] = docSid;
+
+ if ( scriptURI.indexOf( docString ) != -1 )
+ {
+ OSL_TRACE("Full resolution available, search document");
+ // search in document
+ m_vSearchIDs.resize( 1 );
+ }
+ else if ( scriptURI.indexOf( userString ) != -1 )
+ {
+ OSL_TRACE("Full resolution available, search user");
+ // search in user
+ m_vSearchIDs[ 0 ] = ( *m_pSearchIDs )[ 1 ];
+ m_vSearchIDs.resize( 1 );
+ }
+ else if ( scriptURI.indexOf( shareString ) != -1 )
+ {
+ OSL_TRACE("Full resolution available, search share");
+ // search in share
+ m_vSearchIDs[ 0 ] = ( *m_pSearchIDs )[ 2 ];
+ m_vSearchIDs.resize( 1 );
+ }
+ else if ( scriptURI.indexOf( filesysString ) != -1 )
+ {
+ OSL_TRACE("Full resolution available, create & search filesystem");
+ OUString filesysURL;
+ try
+ {
+ filesysURL = getFilesysURL( scriptURI );
+ }
+ catch ( lang::IllegalArgumentException & e )
+ {
+ OUString temp = OUSTR( "ScriptNameResolverImpl::resolve: " );
+ throw RuntimeException( temp.concat( e.Message ), Reference< XInterface >() );
+ }
+ Reference< XInterface > xInterface = m_xMultiComFac->createInstanceWithContext(
+ ::rtl::OUString::createFromAscii(
+ "com.sun.star.ucb.SimpleFileAccess" ), m_xContext );
+ validateXRef( xInterface,
+ "ScriptProvider::initialise: cannot get SimpleFileAccess Service\n" );
+ Reference < ucb::XSimpleFileAccess > xSimpleFileAccess = Reference <
+ ucb::XSimpleFileAccess > ( xInterface, UNO_QUERY_THROW );
+
+ // do we need to encode this? hope not.
+ OSL_TRACE( ">>>> About to create storage for %s",
+ ::rtl::OUStringToOString( filesysURL,
+ RTL_TEXTENCODING_ASCII_US ).pData->buffer );
+ // ask storage manager to create storage
+ try
+ {
+ // need to get the ScriptStorageManager
+ Any a = m_xContext->getValueByName(
+ scriptingConstantsPool.SCRIPTSTORAGEMANAGER_SERVICE );
+ if ( sal_False == ( a >>= xScriptStorageMgr ) )
+ {
+ OUString temp = OUSTR( "ScriptNameResolverImpl::resolve: failed to get ScriptStorageManager" );
+ throw RuntimeException( temp, Reference< XInterface >() );
+ // need to throw
+ }
+ validateXRef( xScriptStorageMgr, "Cannot get ScriptStorageManager" );
+ filesysScriptStorageID =
+ xScriptStorageMgr->createScriptStorageWithURI(
+ xSimpleFileAccess, filesysURL );
+ OSL_TRACE( ">>>> Created storage %d - for %s ",
+ filesysScriptStorageID, ::rtl::OUStringToOString(
+ filesysURL, RTL_TEXTENCODING_ASCII_US ).pData->buffer );
+ }
+ catch ( RuntimeException & e )
+ {
+ OUString temp = OUSTR( "ScriptNameResolverImpl::resolve: " );
+ throw RuntimeException( temp.concat( e.Message ), Reference< XInterface >() );
+ }
+ m_vSearchIDs[ 0 ] = filesysScriptStorageID;
+ m_vSearchIDs.resize( 1 );
+ }
+ else
+ {
+ OSL_TRACE("Only partial uri available, search doc, user & share");
+ // is this illegal or do we search in a default way
+ // if we get to here a uri has been passed in that has:
+ // a) not got a location specified
+ // b) an illegal location
+
+ // detect illegal location
+ if ( scriptURI.indexOf( OUString::createFromAscii( "location=" ) ) != -1 )
+ {
+ OSL_TRACE(
+ "ScriptNameResolver::resolve, throwing IllegalArgException" );
+ throw lang::IllegalArgumentException(
+ OUSTR( "invalid URI: " ).concat( scriptURI ),
+ Reference < XInterface > (), 1 );
+
+ }
+ // leave vSearchIDs take care of the search...
+ }
+
+ ::std::vector< sal_Int32 >::const_iterator iter;
+ ::std::vector< sal_Int32 >::const_iterator iterEnd = m_vSearchIDs.end();
+
+ for ( iter = m_vSearchIDs.begin() ; iter != iterEnd; ++iter )
+ {
+ try
+ {
+ OSL_TRACE( "** about to resolve from storage using id %d from vector of size %d",
+ *iter, m_vSearchIDs.size() );
+ if ( ( resolvedName = resolveURIFromStorageID( *iter, docUri, scriptURI ) ).is() )
+ {
+ OSL_TRACE( "found match in uri from storage %d", *iter );
+ xPropSetScriptingContext->setPropertyValue(
+ scriptingConstantsPool.RESOLVED_STORAGE_ID, makeAny(*iter) );
+ break;
+ }
+
+ }
+ catch ( css::security::AccessControlException & e )
+ {
+ // no execute permission
+ OSL_TRACE( "ScriptNameResolverImpl::resolve : AccessControlException " );
+ continue;
+ }
+ catch ( beans::UnknownPropertyException & e )
+ {
+ OUString temp = OUSTR(
+ "ScriptNameResolverImpl::resolve : UnknownPropertyException" );
+ throw RuntimeException( temp.concat( e.Message ),
+ Reference< XInterface > () );
+ }
+ catch ( beans::PropertyVetoException & e )
+ {
+ OUString temp = OUSTR(
+ "ScriptNameResolverImpl::resolve : PropertyVetoException " );
+ throw RuntimeException( temp.concat( e.Message ),
+ Reference< XInterface > () );
+ }
+ catch ( lang::IllegalArgumentException & e )
+ {
+ OUString temp = OUSTR(
+ "ScriptNameResolverImpl::resolve : IllegalArgumentException " );
+ throw lang::IllegalArgumentException( temp.concat( e.Message ),
+ Reference< XInterface > (), e.ArgumentPosition );
+ }
+ catch ( lang::WrappedTargetException & e )
+ {
+ OUString temp = OUSTR(
+ "ScriptNameResolverImpl::resolve : WrappedTargetException " );
+ throw RuntimeException( temp.concat( e.Message ),
+ Reference< XInterface > () );
+ }
+ catch ( Exception & e )
+ {
+ OSL_TRACE(
+ "Exception thrown by storage %d, failed to match uri: %s",
+ *iter,
+ ::rtl::OUStringToOString( e.Message,
+ RTL_TEXTENCODING_ASCII_US ).pData->buffer );
+ OUString temp = OUSTR(
+ "ScriptNameResolverImpl::resolve : unknown exception" );
+ throw RuntimeException( temp.concat( e.Message ),
+ Reference< XInterface > () );
+ }
+#ifdef _DEBUG
+ catch ( ... )
+ {
+ OSL_TRACE(
+ "unknown exception thrown by storage %d, failed to match uri",
+ *iter );
+ OUString temp = OUSTR(
+ "ScriptNameResolverImpl::resolve Unknown exception caught - RuntimeException rethrown" );
+ throw RuntimeException( temp,
+ Reference< XInterface > () );
+ }
+#endif
+
+ }
+ if ( !resolvedName.is() )
+ {
+ if( filesysScriptStorageID > 2 )
+ {
+ // get the filesys storage and dispose of it
+ Reference< XInterface > xScriptStorage =
+ xScriptStorageMgr->getScriptStorage( filesysScriptStorageID );
+ validateXRef( xScriptStorage,
+ "ScriptNameResolverImpl::getStorageInstance: cannot get Script Storage service" );
+ Reference< storage::XScriptInfoAccess > xScriptInfoAccess = Reference<
+ storage::XScriptInfoAccess > ( xScriptStorage, UNO_QUERY_THROW );
+ validateXRef( xScriptInfoAccess,
+ "ScriptNameResolverImpl::resolveURIFromStorageID: cannot get XScriptInfoAccess" );
+ Sequence< Reference< storage::XScriptInfo > > results =
+ xScriptInfoAccess->getAllImplementations( );
+ Reference < lang::XEventListener > xEL_ScriptStorageMgr =
+ Reference< lang::XEventListener >
+ ( xScriptStorageMgr ,UNO_QUERY_THROW );
+ validateXRef( xEL_ScriptStorageMgr, "ScriptNameResolverImpl::resolve: can't get ScriptStorageManager XEventListener interface when trying to dispose of filesystem storage" );
+ lang::EventObject event( results[ 0 ] );
+ xEL_ScriptStorageMgr->disposing( event );
+ }
+ throw lang::IllegalArgumentException( OUSTR(
+ "ScriptNameResolverImpl::resolve: no script found for uri=" ).concat( scriptURI ),
+ Reference< XInterface > (), 0 );
+ }
+ return resolvedName;
+}
+
+//*************************************************************************
+OUString SAL_CALL
+ScriptNameResolverImpl::getImplementationName( )
+throw( RuntimeException )
+{
+ return nrs_implName;
+}
+
+//*************************************************************************
+sal_Bool SAL_CALL
+ScriptNameResolverImpl::supportsService( const OUString& serviceName )
+throw( RuntimeException )
+{
+ OUString const * pNames = nrs_serviceNames.getConstArray();
+ for ( sal_Int32 nPos = nrs_serviceNames.getLength(); nPos--; )
+ {
+ if ( serviceName.equals( pNames[ nPos ] ) )
+ {
+ return sal_True;
+ }
+ }
+ return sal_False;
+}
+
+//*************************************************************************
+
+Reference< storage::XScriptInfo >
+ScriptNameResolverImpl::resolveURIFromStorageID
+( sal_Int32 sid, const ::rtl::OUString & docURI,
+ const ::rtl::OUString& scriptURI )
+SAL_THROW ( ( lang::IllegalArgumentException, css::security::AccessControlException, RuntimeException ) )
+{
+ Reference< storage::XScriptInfo > resolvedScriptInfo;
+ scripting_constants::ScriptingConstantsPool& scriptingConstantsPool =
+ scripting_constants::ScriptingConstantsPool::instance();
+ if ( sid == scriptingConstantsPool.DOC_STORAGE_ID_NOT_SET )
+ {
+ OSL_TRACE( "@@@@ **** ScriptNameResolverImpl::resolve DOC_STORAGE_ID_NOT_SET" );
+ return resolvedScriptInfo;
+ }
+ try
+ {
+ OUString permissionURI = docURI;
+ OUString filesysString = OUString::createFromAscii( "location=filesystem" );
+ if ( scriptURI.indexOf( filesysString ) != -1 )
+ {
+ // in the case of filesys scripts we're checking whether the
+ // location of the script, rather than the location of the document,
+ // has execute permission
+ try
+ {
+ permissionURI = getFilesysURL( scriptURI );
+ }
+ catch ( lang::IllegalArgumentException & e )
+ {
+ OUString temp = OUSTR( "ScriptNameResolverImpl::resolveFromURI: " );
+ throw RuntimeException( temp.concat( e.Message ), Reference< XInterface >() );
+ }
+ }
+ Reference< storage::XScriptInfoAccess > storage = getStorageInstance( sid, permissionURI );
+ validateXRef( storage,
+ "ScriptNameResolverImpl::resolveURIFromStorageID: cannot get XScriptInfoAccess" );
+ Sequence< Reference< storage::XScriptInfo > > results =
+ storage->getImplementations( scriptURI );
+
+ const sal_Int32 length = results.getLength();
+
+ if ( !length )
+ {
+ return resolvedScriptInfo;
+ }
+
+ OSL_TRACE( "ScriptNameResolverImpl::resolve Got some results..." );
+ // if we get results, just return first in list,
+ // storage has already matched language, function name etc. if
+ // that information was in the uri
+ resolvedScriptInfo = results[ 0 ];
+ }
+ catch ( css::security::AccessControlException & ace )
+ {
+ OUString temp = OUSTR(
+ "ScriptRuntimeManager::resolveURIFromStorageID AccessControlException: " );
+ throw css::security::AccessControlException( temp.concat( ace.Message ),
+ Reference< XInterface > (),
+ ace.LackingPermission );
+ }
+ catch ( lang::IllegalArgumentException & iae )
+ {
+ OUString temp = OUSTR(
+ "ScriptRuntimeManager::resolveURIFromStorageID IllegalArgumentException: " );
+ throw lang::IllegalArgumentException( temp.concat( iae.Message ),
+ Reference< XInterface > (),
+ iae.ArgumentPosition );
+ }
+ catch ( RuntimeException & re )
+ {
+ OUString temp = OUSTR(
+ "ScriptRuntimeManager::resolveURIFromStorageID RuntimeException: " );
+ throw RuntimeException( temp.concat( re.Message ),
+ Reference< XInterface > () );
+ }
+ catch ( Exception & e )
+ {
+ OUString temp = OUSTR(
+ "ScriptNameResolverImpl::resolveURIFromStorageID : Exception caught - RuntimeException rethrown" );
+ throw RuntimeException( temp.concat( e.Message ),
+ Reference< XInterface > () );
+ }
+#ifdef _DEBUG
+ catch ( ... )
+ {
+ throw RuntimeException( OUSTR(
+ "ScriptNameResolverImpl::resolveURIFromStorageID Unknown exception caught - RuntimeException rethrown" ),
+ Reference< XInterface > () );
+ }
+#endif
+ return resolvedScriptInfo;
+}
+//*************************************************************************
+
+Reference< storage::XScriptInfoAccess >
+
+ScriptNameResolverImpl::getStorageInstance( sal_Int32 sid,
+const ::rtl::OUString & permissionURI ) SAL_THROW ( ( RuntimeException, css::security::AccessControlException, lang::IllegalArgumentException ) )
+{
+ Reference< storage::XScriptInfoAccess > xScriptInfoAccess;
+ try
+ {
+ Reference< XInterface > xInterface;
+
+ Any a = m_xContext->getValueByName(
+ OUString::createFromAscii( SCRIPTSTORAGEMANAGER_SERVICE ) );
+ if ( sal_False == ( a >>= xInterface ) )
+ {
+ throw RuntimeException(
+ OUSTR( "ScriptNameResolverImpl::getStorageInstance: could not obtain ScriptStorageManager singleton" ),
+ Reference< XInterface >() );
+ }
+ validateXRef( xInterface,
+ "ScriptNameResolverImpl::getStorageInstance: cannot get Storage service" );
+ // check that we have permissions for this storage
+ Reference< dcsssf::security::XScriptSecurity > xScriptSecurity( xInterface, UNO_QUERY_THROW );
+ validateXRef( xScriptSecurity,
+ "ScriptNameResolverImpl::getStorageInstance: cannot get Script Security service" );
+ scripting_constants::ScriptingConstantsPool& scriptingConstantsPool =
+ scripting_constants::ScriptingConstantsPool::instance();
+ // if we dealing with a document storage (ie. not user or share
+ // we need to check the permission
+ if( ( sid != scriptingConstantsPool.USER_STORAGE_ID ) &&
+ ( sid != scriptingConstantsPool.SHARED_STORAGE_ID ) )
+ {
+ xScriptSecurity->checkPermission( permissionURI,
+ OUString::createFromAscii( "execute" ) );
+ // if we get here, the checkPermission hasn't thrown an
+ // AccessControlException, ie. permission has been granted
+ OSL_TRACE( "ScriptNameResolverImpl::getStorageInstance: got execute permission for ID=%d", sid );
+ }
+ Reference< storage::XScriptStorageManager > xScriptStorageManager( xInterface, UNO_QUERY_THROW );
+ validateXRef( xScriptStorageManager,
+ "ScriptNameResolverImpl::getStorageInstance: cannot get Script Storage Manager service" );
+ Reference< XInterface > xScriptStorage =
+ xScriptStorageManager->getScriptStorage( sid );
+ validateXRef( xScriptStorage,
+ "ScriptNameResolverImpl::getStorageInstance: cannot get Script Storage service" );
+ xScriptInfoAccess = Reference<
+ storage::XScriptInfoAccess > ( xScriptStorage, UNO_QUERY_THROW );
+ }
+ catch ( lang::IllegalArgumentException & e )
+ {
+ OUString temp = OUSTR( "ScriptNameResolverImpl::getStorageInstance: " );
+ throw lang::IllegalArgumentException( temp.concat( e.Message ),
+ Reference< XInterface >(), e.ArgumentPosition );
+ }
+ catch ( css::security::AccessControlException & e )
+ {
+ OUString temp = OUSTR( "ScriptNameResolverImpl::getStorageInstance: AccessControlException " );
+ throw css::security::AccessControlException( temp.concat( e.Message ), Reference< XInterface >(), e.LackingPermission );
+ }
+ catch ( RuntimeException & re )
+ {
+ OUString temp = OUSTR( "ScriptNameResolverImpl::getStorageInstance: " );
+ throw RuntimeException( temp.concat( re.Message ), Reference< XInterface >() );
+ }
+ catch ( Exception & e )
+ {
+ OUString temp = OUSTR( "ScriptNameResolverImpl::getStorageInstance: " );
+ throw RuntimeException( temp.concat( e.Message ), Reference< XInterface >() );
+ }
+ return xScriptInfoAccess;
+}
+//*************************************************************************
+OUString
+ScriptNameResolverImpl::getFilesysURL( const OUString & scriptURI )
+throw( lang::IllegalArgumentException )
+{
+ OUString filePath;
+ OUString fileName;
+ OUString filesysString = OUString::createFromAscii( "location=filesystem" );
+ sal_Int32 locationPos = scriptURI.indexOf( filesysString );
+ // expect location=filesys:file:///foo/bar/myscript.bsh etc
+ // except the file url at this point is encoded
+ // so we should be ok searching for the '&'
+ sal_Int32 filesysStrLen = filesysString.getLength() + 1;
+ sal_Int32 endOfLocn = scriptURI.indexOf( '&', locationPos );
+ if (endOfLocn == -1 )
+ {
+ filePath = scriptURI.copy( locationPos + filesysString.getLength() + 1 );
+ }
+ else
+ {
+ filePath = scriptURI.copy( locationPos + filesysStrLen,
+ endOfLocn - locationPos - filesysStrLen );
+ }
+ //file name shoul also be encoded so again ok to search for '&'
+ OUString functionKey = OUString::createFromAscii( "function=" );
+ sal_Int32 functionKeyLength = functionKey.getLength();
+ sal_Int32 functionNamePos = scriptURI.indexOf( functionKey );
+ if ( functionNamePos > 0 )
+ {
+ sal_Int32 endOfFn = scriptURI.indexOf( '&', functionNamePos );
+ if ( endOfFn == -1 )
+ {
+ fileName = scriptURI.copy( functionNamePos + functionKeyLength );
+ }
+ else
+ {
+ fileName = scriptURI.copy( functionNamePos + functionKeyLength,
+ endOfFn - functionNamePos - functionKeyLength );
+ }
+ }
+ else
+ {
+ // we need to throw
+ OUString temp = OUSTR( "ScriptNameResolverImpl::getFilesysURL: error getting the filesysURL" );
+ throw lang::IllegalArgumentException( temp, Reference< XInterface >(), 0 );
+ }
+ filePath+=fileName;
+ OSL_TRACE( "ScriptNameResolverImpl::getFilesysURL: filesys URL = %s",
+ ::rtl::OUStringToOString( filePath,
+ RTL_TEXTENCODING_ASCII_US ).pData->buffer );
+ return filePath;
+}
+//*************************************************************************
+Sequence<OUString> SAL_CALL
+ScriptNameResolverImpl::getSupportedServiceNames( )
+throw( RuntimeException )
+{
+ return nrs_serviceNames;
+}
+
+//*************************************************************************
+Reference< XInterface > SAL_CALL scriptnri_create(
+ Reference< XComponentContext > const & xComponentContext )
+SAL_THROW( ( Exception ) )
+{
+ return ( cppu::OWeakObject * ) new ScriptNameResolverImpl( xComponentContext );
+}
+
+//*************************************************************************
+Sequence< OUString > scriptnri_getSupportedServiceNames() SAL_THROW( () )
+{
+ return nrs_serviceNames;
+}
+
+//*************************************************************************
+OUString scriptnri_getImplementationName() SAL_THROW( () )
+{
+ return nrs_implName;
+}
+} // namespace scripting_runtimemgr