diff options
Diffstat (limited to 'scripting/source/runtimemgr/ScriptRuntimeManager.cxx')
-rwxr-xr-x | scripting/source/runtimemgr/ScriptRuntimeManager.cxx | 504 |
1 files changed, 504 insertions, 0 deletions
diff --git a/scripting/source/runtimemgr/ScriptRuntimeManager.cxx b/scripting/source/runtimemgr/ScriptRuntimeManager.cxx new file mode 100755 index 000000000000..4780d58acc88 --- /dev/null +++ b/scripting/source/runtimemgr/ScriptRuntimeManager.cxx @@ -0,0 +1,504 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * 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" + +#ifndef _VCL_MSGBOX_HXX +#include <vcl/msgbox.hxx> +#endif + +#include "ScriptExecDialog.hrc" + +#include <util/scriptingconstants.hxx> + +#include <cppuhelper/implementationentry.hxx> + +#include <com/sun/star/beans/XPropertySet.hpp> +#include <com/sun/star/lang/XEventListener.hpp> +#include <com/sun/star/lang/EventObject.hpp> + +#include "ScriptNameResolverImpl.hxx" +#include "ScriptRuntimeManager.hxx" +#include <util/util.hxx> +#include <util/scriptingconstants.hxx> + +using namespace ::rtl; +using namespace ::osl; +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::drafts::com::sun::star::script::framework; + +namespace scripting_runtimemgr +{ + +static OUString s_implName = ::rtl::OUString::createFromAscii( + "drafts.com.sun.star.script.framework.runtime.ScriptRuntimeManager" ); +static OUString s_serviceName = ::rtl::OUString::createFromAscii( + "drafts.com.sun.star.script.framework.runtime.ScriptRuntimeManager" ); +static Sequence< OUString > s_serviceNames = Sequence< OUString >( &s_serviceName, 1 ); + +::rtl_StandardModuleCount s_moduleCount = MODULE_COUNT_INIT; + +//************************************************************************* +// ScriptRuntimeManager Constructor +ScriptRuntimeManager::ScriptRuntimeManager( + const Reference< XComponentContext > & xContext ) : + m_xContext( xContext ) +{ + OSL_TRACE( "< ScriptRuntimeManager ctor called >\n" ); + validateXRef( m_xContext, + "ScriptRuntimeManager::ScriptRuntimeManager: invalid context" ); + m_xMgr = m_xContext->getServiceManager(); + validateXRef( m_xMgr, + "ScriptRuntimeManager::ScriptRuntimeManager: cannot get ServiceManager" ); + s_moduleCount.modCnt.acquire( &s_moduleCount.modCnt ); + // test + //scripting_securitymgr::ScriptSecurityManager ssm(xContext); +} + +//************************************************************************* +// ScriptRuntimeManager Destructor +ScriptRuntimeManager::~ScriptRuntimeManager() +{ + OSL_TRACE( "< ScriptRuntimeManager dtor called >\n" ); + s_moduleCount.modCnt.release( &s_moduleCount.modCnt ); +} + +//************************************************************************* +// Get the proper XScriptInvocation +Reference< runtime::XScriptInvocation > SAL_CALL ScriptRuntimeManager::getScriptRuntime( +const Reference< XInterface >& scriptInfo ) +throw( RuntimeException ) +{ + OSL_TRACE( "** ==> ScriptRuntimeManager in getScriptRuntime\n" ); + + Reference< runtime::XScriptInvocation > xScriptInvocation; + + try + { + Reference< XInterface > xInterface; + + Reference< storage::XScriptInfo > sinfo = + Reference< storage::XScriptInfo >( scriptInfo, UNO_QUERY_THROW ); + + OUStringBuffer *buf = new OUStringBuffer(80); + buf->appendAscii("/singletons/drafts.com.sun.star.script.framework.runtime.theScriptRuntimeFor"); + buf->append(sinfo->getLanguage()); + + Any a = m_xContext->getValueByName(buf->makeStringAndClear()); + + if ( sal_False == ( a >>= xInterface ) ) + { + throw RuntimeException( + sinfo->getLanguage().concat( OUSTR( " runtime support is not installed for this language" ) ), + Reference< XInterface >() ); + } + validateXRef( xInterface, + "ScriptRuntimeManager::GetScriptRuntime: cannot get appropriate ScriptRuntime Service" + ); + xScriptInvocation = Reference< runtime::XScriptInvocation >( xInterface, UNO_QUERY_THROW ); + } + catch ( Exception & e ) + { + OUString temp = OUSTR( "ScriptRuntimeManager::GetScriptRuntime: " ); + throw RuntimeException( temp.concat( e.Message ), Reference< XInterface >() ); + } + + return xScriptInvocation; +} + +//************************************************************************* +// Get the proper XScriptNameResolver +Reference< runtime::XScriptNameResolver > SAL_CALL +ScriptRuntimeManager::getScriptNameResolver() +throw( RuntimeException ) +{ + OSL_TRACE( "** ==> ScriptRuntimeManager in getScriptNameResolver\n" ); + Reference< runtime::XScriptNameResolver > xScriptNameResolver; + + try + { + Reference< XInterface > xInterface = m_xMgr->createInstanceWithContext( + OUString::createFromAscii( + "drafts.com.sun.star.script.framework.runtime.DefaultScriptNameResolver" ), + m_xContext ); + validateXRef( xInterface, + "ScriptRuntimeManager::GetScriptRuntime: cannot get instance of DefaultScriptNameResolver" ); + xScriptNameResolver = Reference< runtime::XScriptNameResolver >( xInterface, UNO_QUERY_THROW ); + } + catch ( Exception & e ) + { + OUString temp = OUSTR( "ScriptRuntimeManager::GetScriptNameResolver: " ); + throw RuntimeException( temp.concat( e.Message ), Reference< XInterface >() ); + } + return xScriptNameResolver; +} + +//************************************************************************* +// XScriptInvocation implementation +Any SAL_CALL ScriptRuntimeManager::invoke( + const ::rtl::OUString & scriptURI, + const Any& invocationCtx, const Sequence< Any >& aParams, + Sequence< sal_Int16 >& aOutParamIndex, Sequence< Any >& aOutParam ) + throw ( lang::IllegalArgumentException, script::CannotConvertException, + reflection::InvocationTargetException, RuntimeException ) +{ + OSL_TRACE( "** ==> ScriptRuntimeManager in runtimemgr invoke\n" ); + + Any results; + scripting_constants::ScriptingConstantsPool& scriptingConstantsPool = + scripting_constants::ScriptingConstantsPool::instance(); + + // Initialise resolved context with invocation context, + // the resolved context (resolvedCtx will be modified by the + // resolve method to contain the storage where the script code is + // stored + Any resolvedCtx = invocationCtx; + + try + { + Reference< storage::XScriptInfo > resolvedScript = resolve( scriptURI, + resolvedCtx ); + validateXRef( resolvedScript, "ScriptRuntimeManager::invoke: No resolvedURI" ); + + Reference< beans::XPropertySet > xPropSetResolvedCtx; + if ( sal_False == ( resolvedCtx >>= xPropSetResolvedCtx ) ) + { + throw RuntimeException( OUSTR( + "ScriptRuntimeManager::invoke : unable to get XPropSetScriptingContext from param" ), + Reference< XInterface > () ); + } + + Any any = xPropSetResolvedCtx->getPropertyValue( + scriptingConstantsPool.RESOLVED_STORAGE_ID ); + sal_Int32 resolvedSid; + if ( sal_False == ( any >>= resolvedSid ) ) + { + throw RuntimeException( OUSTR( + "ScriptRuntimeManager::invoke : unable to get resolved storage id from xPropSetResolvedCtx" ), + Reference< XInterface > () ); + } + + OSL_TRACE("Storage sid is: %d\n", resolvedSid); + + // modifying the XPropertySet on the resolved Context to contain the + // full script info + Any aResolvedScript; + aResolvedScript <<= resolvedScript; + + xPropSetResolvedCtx->setPropertyValue( scriptingConstantsPool.SCRIPT_INFO, + aResolvedScript ); + + Reference< runtime::XScriptInvocation > xScriptInvocation = + getScriptRuntime( resolvedScript ); + validateXRef( xScriptInvocation, + "ScriptRuntimeManager::invoke: cannot get instance of language specific runtime." ); + + // the scriptURI is currently passed to the language-dept runtime but + // is not used (may be useful in the future?). All of the script info + // is contained as a property(SCRIPT_INFO) within the resolvedCtx + results = xScriptInvocation->invoke( scriptURI, resolvedCtx, aParams, + aOutParamIndex, aOutParam ); + + // need to dispose of filesystem storage + OUString filesysString = OUString::createFromAscii( + "location=filesystem" ); + if ( scriptURI.indexOf( filesysString ) != -1 ) + { + Any a = m_xContext->getValueByName( + scriptingConstantsPool.SCRIPTSTORAGEMANAGER_SERVICE ); + Reference < lang::XEventListener > xEL_ScriptStorageManager; + if ( sal_False == ( a >>= xEL_ScriptStorageManager ) ) + { + throw RuntimeException( OUSTR( "ScriptRuntimeManager::invoke: can't get ScriptStorageManager XEventListener interface when trying to dispose of filesystem storage" ), + Reference< XInterface > () ); + } + validateXRef( xEL_ScriptStorageManager, "Cannot get XEventListener from ScriptStorageManager" ); + lang::EventObject event(resolvedScript); + xEL_ScriptStorageManager->disposing( event ); + } + } + catch ( lang::IllegalArgumentException & iae ) + { + OUString temp = OUSTR( "ScriptRuntimeManager::invoke IllegalArgumentException: " ); + throw lang::IllegalArgumentException( temp.concat( iae.Message ), + Reference< XInterface > (), + iae.ArgumentPosition ); + } + catch ( script::CannotConvertException & cce ) + { + OUString temp = OUSTR( "ScriptRuntimeManager::invoke CannotConvertException: " ); + throw script::CannotConvertException( temp.concat( cce.Message ), + Reference< XInterface > (), + cce.DestinationTypeClass, cce.Reason, + cce.ArgumentIndex ); + } + catch ( reflection::InvocationTargetException & ite ) + { + OUString temp = OUSTR( "ScriptRuntimeManager::invoke InvocationTargetException: " ); + throw reflection::InvocationTargetException( temp.concat( ite.Message ), + Reference< XInterface > (), ite.TargetException ); + } + catch ( beans::UnknownPropertyException & e ) + { + OUString temp = OUSTR( "ScriptRuntimeManager::invoke UnknownPropertyException: " ); + throw RuntimeException( temp.concat( e.Message ), + Reference< XInterface > () ); + } + catch ( lang::WrappedTargetException & e ) + { + OUString temp = OUSTR( "ScriptRuntimeManager::invoke WrappedTargetException : " ); + throw RuntimeException( temp.concat( e.Message ), + Reference< XInterface > () ); + } + catch ( RuntimeException & re ) + { + OUString temp = OUSTR( "ScriptRuntimeManager::invoke RuntimeException: " ); + throw RuntimeException( temp.concat( re.Message ), + Reference< XInterface > () ); + } + catch ( Exception & e ) + { + OUString temp = OUSTR( "ScriptRuntimeManager::invoke Exception: " ); + throw RuntimeException( temp.concat( e.Message ), + Reference< XInterface > () ); + } +#ifdef _DEBUG + catch ( ... ) + { + throw RuntimeException( OUSTR( "ScriptRuntimeManager::invoke UnknownException: " ), + Reference< XInterface > () ); + } +#endif + OSL_TRACE( "** ==> ScriptRuntimeManager returned from invoke: %s\n", ::rtl::OUStringToOString( results.getValueTypeName(), RTL_TEXTENCODING_ASCII_US ).pData->buffer ); + return results; +} + +//************************************************************************* +// XScriptNameResolver implementation +Reference< storage::XScriptInfo > SAL_CALL +ScriptRuntimeManager::resolve( const ::rtl::OUString& scriptURI, + Any& invocationCtx ) +throw( lang::IllegalArgumentException, script::CannotConvertException, RuntimeException ) +{ + OSL_TRACE( "** ==> ScriptRuntimeManager in resolve\n" ); + Reference< storage::XScriptInfo > resolvedURI; + + Reference< runtime::XScriptNameResolver > xScriptNameResolver = getScriptNameResolver(); + validateXRef( xScriptNameResolver, + "ScriptRuntimeManager::resolve: No ScriptNameResolver" ); + + try + { + resolvedURI = xScriptNameResolver->resolve( scriptURI, invocationCtx ); + } + catch ( lang::IllegalArgumentException & iae ) + { + OUString temp = + OUSTR( "ScriptRuntimeManager::resolve IllegalArgumentException: " ); + throw lang::IllegalArgumentException( temp.concat( iae.Message ), + Reference< XInterface > (), + iae.ArgumentPosition ); + } + catch ( script::CannotConvertException & cce ) + { + OUString temp = OUSTR( "ScriptRuntimeManager::resolve CannotConvertException: " ); + throw script::CannotConvertException( temp.concat( cce.Message ), + Reference< XInterface > (), + cce.DestinationTypeClass, cce.Reason, + cce.ArgumentIndex ); + } + catch ( RuntimeException & re ) + { + OUString temp = OUSTR( "ScriptRuntimeManager::resolve RuntimeException: " ); + throw RuntimeException( temp.concat( re.Message ), + Reference< XInterface > () ); + } +#ifdef _DEBUG + catch ( ... ) + { + throw RuntimeException( + OUSTR( "ScriptRuntimeManager::resolve UnknownException: " ), + Reference< XInterface > () ); + } +#endif + + return resolvedURI; +} + +//************************************************************************* +OUString SAL_CALL ScriptRuntimeManager::getImplementationName( ) +throw( RuntimeException ) +{ + return s_implName; +} + +//************************************************************************* +sal_Bool SAL_CALL ScriptRuntimeManager::supportsService( const OUString& serviceName ) +throw( RuntimeException ) +{ + OUString const * pNames = s_serviceNames.getConstArray(); + for ( sal_Int32 nPos = s_serviceNames.getLength(); nPos--; ) + { + if ( serviceName.equals( pNames[ nPos ] ) ) + { + return sal_True; + } + } + return sal_False; +} + +//************************************************************************* +Sequence<OUString> SAL_CALL ScriptRuntimeManager::getSupportedServiceNames( ) +throw( RuntimeException ) +{ + return s_serviceNames; +} + +//************************************************************************* +static Reference< XInterface > SAL_CALL srm_create( + const Reference< XComponentContext > & xCompC ) +{ + return ( cppu::OWeakObject * ) new ScriptRuntimeManager( xCompC ); +} + +//************************************************************************* +static Sequence<OUString> srm_getSupportedServiceNames( ) +SAL_THROW( () ) +{ + return s_serviceNames; +} + +//************************************************************************* +static OUString srm_getImplementationName( ) +SAL_THROW( () ) +{ + return s_implName; +} + +//************************************************************************* +Reference< XInterface > SAL_CALL scriptnri_create( + Reference< XComponentContext > const & xComponentContext ) +SAL_THROW( ( Exception ) ); + +//************************************************************************* +Sequence< OUString > scriptnri_getSupportedServiceNames() SAL_THROW( () ); + +//************************************************************************* +OUString scriptnri_getImplementationName() SAL_THROW( () ); + +//******************** ScriptStorageMangaer defines *********************** +Reference< XInterface > SAL_CALL ssm_create( + Reference< XComponentContext > const & xComponentContext ) +SAL_THROW( ( Exception ) ); +//************************************************************************* +Sequence< OUString > ssm_getSupportedServiceNames() SAL_THROW( () ); +//************************************************************************* +OUString ssm_getImplementationName() SAL_THROW( () ); +//************************************************************************* + +//************ Script Provider defines ************************************ +Reference< XInterface > SAL_CALL sp_create( const Reference< XComponentContext > & xCompC ); +//******************** ScriptProvider defines *************************** +Sequence< OUString > sp_getSupportedServiceNames( ) SAL_THROW( () ); +//************************************************************************* +OUString sp_getImplementationName( ) SAL_THROW( () ); +//************************************************************************* + +//************ ScriptStorage defines ************************************** +Reference< XInterface > SAL_CALL ss_create( const Reference< XComponentContext > & xCompC ); +//******************** ScriptProvider defines *************************** +Sequence< OUString > ss_getSupportedServiceNames( ) SAL_THROW( () ); +//************************************************************************* +OUString ss_getImplementationName( ) SAL_THROW( () ); +//************************************************************************* + + +static struct cppu::ImplementationEntry s_entries [] = + { + { + srm_create, srm_getImplementationName, + srm_getSupportedServiceNames, cppu::createSingleComponentFactory, + &s_moduleCount.modCnt, 0 + }, + { + scriptnri_create, scriptnri_getImplementationName, + scriptnri_getSupportedServiceNames, cppu::createSingleComponentFactory, + &s_moduleCount.modCnt, 0 + }, + { + ssm_create, ssm_getImplementationName, + ssm_getSupportedServiceNames, cppu::createSingleComponentFactory, + 0, 0 + }, + { + ss_create, ss_getImplementationName, + ss_getSupportedServiceNames, cppu::createSingleComponentFactory, + 0, 0 + }, + { + sp_create, sp_getImplementationName, + sp_getSupportedServiceNames, cppu::createSingleComponentFactory, + 0, 0 + }, + { 0, 0, 0, 0, 0, 0 } + }; +} // Namespace + +//####################################################################################### +//#### EXPORTED ######################################################################### +//####################################################################################### + +/** + * Gives the environment this component belongs to. + */ +extern "C" +{ + void SAL_CALL component_getImplementationEnvironment( const sal_Char ** ppEnvTypeName, + uno_Environment ** ppEnv ) + { + *ppEnvTypeName = CPPU_CURRENT_LANGUAGE_BINDING_NAME; + } + + /** + * This function is called to get service factories for an implementation. + * + * @param pImplName name of implementation + * @param pServiceManager a service manager, need for component creation + * @param pRegistryKey the registry key for this component, need for persistent + * data + * @return a component factory + */ + void * SAL_CALL component_getFactory( const sal_Char * pImplName, + lang::XMultiServiceFactory * pServiceManager, + registry::XRegistryKey * pRegistryKey ) + { + return ::cppu::component_getFactoryHelper( pImplName, pServiceManager, + pRegistryKey, ::scripting_runtimemgr::s_entries ); + } +} |