diff options
Diffstat (limited to 'scripting/source/provider/MasterScriptProvider.cxx')
-rwxr-xr-x | scripting/source/provider/MasterScriptProvider.cxx | 1001 |
1 files changed, 1001 insertions, 0 deletions
diff --git a/scripting/source/provider/MasterScriptProvider.cxx b/scripting/source/provider/MasterScriptProvider.cxx new file mode 100755 index 000000000000..94ea78f80c73 --- /dev/null +++ b/scripting/source/provider/MasterScriptProvider.cxx @@ -0,0 +1,1001 @@ +/************************************************************************* + * + * 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" + +#include <comphelper/documentinfo.hxx> + +#include <cppuhelper/implementationentry.hxx> +#include <cppuhelper/exc_hlp.hxx> +#include <cppuhelper/factory.hxx> +#include <com/sun/star/frame/XModel.hpp> +#include <com/sun/star/lang/EventObject.hpp> +#include <com/sun/star/container/XContentEnumerationAccess.hpp> +#include <com/sun/star/document/XScriptInvocationContext.hpp> + +#include <com/sun/star/uri/XUriReference.hpp> +#include <com/sun/star/uri/XUriReferenceFactory.hpp> +#include <com/sun/star/uri/XVndSunStarScriptUrl.hpp> + +#include <com/sun/star/deployment/XPackage.hpp> +#include <com/sun/star/script/browse/BrowseNodeTypes.hpp> +#include <com/sun/star/script/provider/XScriptProviderFactory.hpp> +#include <com/sun/star/script/provider/ScriptFrameworkErrorType.hpp> + +#include <util/scriptingconstants.hxx> +#include <util/util.hxx> +#include <util/MiscUtils.hxx> + +#include "ActiveMSPList.hxx" +#include "MasterScriptProvider.hxx" +#include "URIHelper.hxx" + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::script; +using namespace ::com::sun::star::document; +using namespace ::sf_misc; +using namespace ::scripting_util; + +namespace func_provider +{ +//************************************************************************* +// Definitions for MasterScriptProviderFactory global methods. +//************************************************************************* + +::rtl::OUString SAL_CALL mspf_getImplementationName() ; +Reference< XInterface > SAL_CALL mspf_create( Reference< XComponentContext > const & xComponentContext ); +Sequence< ::rtl::OUString > SAL_CALL mspf_getSupportedServiceNames(); + + +bool endsWith( const ::rtl::OUString& target, + const ::rtl::OUString& item ) +{ + sal_Int32 index = 0; + if ( ( index = target.indexOf( item ) ) != -1 && + ( index == ( target.getLength() - item.getLength() ) ) ) + { + return true; + } + return false; +} +//::rtl_StandardModuleCount s_moduleCount = MODULE_COUNT_INIT; + +/* should be available in some central location. */ +//************************************************************************* +// XScriptProvider implementation +// +//************************************************************************* +MasterScriptProvider::MasterScriptProvider( const Reference< XComponentContext > & xContext ) throw ( RuntimeException ): + m_xContext( xContext ), m_bIsValid( false ), m_bInitialised( false ), + m_bIsPkgMSP( false ), m_pPCache( 0 ) +{ + validateXRef( m_xContext, "MasterScriptProvider::MasterScriptProvider: No context available\n" ); + m_xMgr = m_xContext->getServiceManager(); + validateXRef( m_xMgr, + "MasterScriptProvider::MasterScriptProvider: No service manager available\n" ); + m_bIsValid = true; +} + +//************************************************************************* +MasterScriptProvider::~MasterScriptProvider() +{ + //s_moduleCount.modCnt.release( &s_moduleCount.modCnt ); + if ( m_pPCache ) + { + delete m_pPCache; + } + m_pPCache = 0; +} + +//************************************************************************* +void SAL_CALL MasterScriptProvider::initialize( const Sequence < Any >& args ) +throw ( Exception, RuntimeException ) +{ + if ( m_bInitialised ) + return; + + m_bIsValid = false; + + sal_Int32 len = args.getLength(); + if ( len > 1 ) + { + throw RuntimeException( + OUSTR( "MasterScriptProvider::initialize: invalid number of arguments" ), + Reference< XInterface >() ); + } + + Sequence< Any > invokeArgs( len ); + + if ( len != 0 ) + { + // check if first parameter is a string + // if it is, this implies that this is a MSP created + // with a user or share ctx ( used for browse functionality ) + // + if ( args[ 0 ] >>= m_sCtxString ) + { + invokeArgs[ 0 ] = args[ 0 ]; + if ( m_sCtxString.indexOfAsciiL( RTL_CONSTASCII_STRINGPARAM( "vnd.sun.star.tdoc" ) ) == 0 ) + { + m_xModel = MiscUtils::tDocUrlToModel( m_sCtxString ); + } + } + else if ( args[ 0 ] >>= m_xInvocationContext ) + { + m_xModel.set( m_xInvocationContext->getScriptContainer(), UNO_QUERY_THROW ); + } + else + { + args[ 0 ] >>= m_xModel; + } + + if ( m_xModel.is() ) + { + // from the arguments, we were able to deduce a model. That alone doesn't + // suffice, we also need an XEmbeddedScripts which actually indicates support + // for embeddeding scripts + Reference< XEmbeddedScripts > xScripts( m_xModel, UNO_QUERY ); + if ( !xScripts.is() ) + { + throw lang::IllegalArgumentException( + ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( + "The given document does not support embedding scripts into it, and cannot be associated with such a document." + ) ), + *this, + 1 + ); + } + + try + { + m_sCtxString = MiscUtils::xModelToTdocUrl( m_xModel, m_xContext ); + } + catch ( const Exception& ) + { + Any aError( ::cppu::getCaughtException() ); + + ::rtl::OUStringBuffer buf; + buf.appendAscii( "MasterScriptProvider::initialize: caught " ); + buf.append ( aError.getValueTypeName() ); + buf.appendAscii( ":" ); + + Exception aException; aError >>= aException; + buf.append ( aException.Message ); + throw lang::WrappedTargetException( buf.makeStringAndClear(), *this, aError ); + } + + if ( m_xInvocationContext.is() && m_xInvocationContext != m_xModel ) + invokeArgs[ 0 ] <<= m_xInvocationContext; + else + invokeArgs[ 0 ] <<= m_sCtxString; + } + + ::rtl::OUString pkgSpec = OUSTR("uno_packages"); + sal_Int32 indexOfPkgSpec = m_sCtxString.lastIndexOf( pkgSpec ); + + // if contex string ends with "uno_packages" + if ( indexOfPkgSpec > -1 && ( m_sCtxString.match( pkgSpec, indexOfPkgSpec ) == sal_True ) ) + { + m_bIsPkgMSP = sal_True; + } + else + { + m_bIsPkgMSP = sal_False; + } + } + else // no args + { + // use either scriping context or maybe zero args? + invokeArgs = Sequence< Any >( 0 ); // no arguments + } + m_sAargs = invokeArgs; + // don't create pkg mgr MSP for documents, not supported + if ( m_bIsPkgMSP == sal_False && !m_xModel.is() ) + { + createPkgProvider(); + } + + m_bInitialised = true; + m_bIsValid = true; +} + + +//************************************************************************* +void MasterScriptProvider::createPkgProvider() +{ + try + { + ::rtl::OUString loc = m_sCtxString; + Any location; + ::rtl::OUString sPkgCtx = m_sCtxString.concat( OUSTR(":uno_packages") ); + location <<= sPkgCtx; + + Reference< provider::XScriptProviderFactory > xFac( + m_xContext->getValueByName( + OUSTR( "/singletons/com.sun.star.script.provider.theMasterScriptProviderFactory") ), UNO_QUERY_THROW ); + + m_xMSPPkg.set( + xFac->createScriptProvider( location ), UNO_QUERY_THROW ); + + } + catch ( Exception& e ) + { + (void)e; + OSL_TRACE("Exception creating MasterScriptProvider for uno_packages in context %s: %s", + ::rtl::OUStringToOString( m_sCtxString, + RTL_TEXTENCODING_ASCII_US ).pData->buffer, + ::rtl::OUStringToOString( e.Message, + RTL_TEXTENCODING_ASCII_US ).pData->buffer ); + } +} + +//************************************************************************* +Reference< provider::XScript > +MasterScriptProvider::getScript( const ::rtl::OUString& scriptURI ) +throw ( provider::ScriptFrameworkErrorException, + RuntimeException ) +{ + if ( !isValid() ) + { + throw provider::ScriptFrameworkErrorException( + OUSTR( "MasterScriptProvider not initialised" ), Reference< XInterface >(), + scriptURI, OUSTR(""), + provider::ScriptFrameworkErrorType::UNKNOWN ); + } + + // need to get the language from the string + + Reference< uri::XUriReferenceFactory > xFac ( + m_xMgr->createInstanceWithContext( rtl::OUString::createFromAscii( + "com.sun.star.uri.UriReferenceFactory"), m_xContext ) , UNO_QUERY ); + if ( !xFac.is() ) + { + ::rtl::OUString message = ::rtl::OUString::createFromAscii("Failed to instantiate UriReferenceFactory"); + throw provider::ScriptFrameworkErrorException( + message, Reference< XInterface >(), + scriptURI, ::rtl::OUString(), + provider::ScriptFrameworkErrorType::UNKNOWN ); + } + + Reference< uri::XUriReference > uriRef( + xFac->parse( scriptURI ), UNO_QUERY ); + + Reference < uri::XVndSunStarScriptUrl > sfUri( uriRef, UNO_QUERY ); + + if ( !uriRef.is() || !sfUri.is() ) + { + ::rtl::OUString errorMsg = OUSTR( "Incorrect format for Script URI: " ); + errorMsg = errorMsg.concat( scriptURI ); + throw provider::ScriptFrameworkErrorException( + errorMsg, Reference< XInterface >(), + scriptURI, OUSTR(""), + provider::ScriptFrameworkErrorType::UNKNOWN ); + } + + ::rtl::OUString langKey = ::rtl::OUString::createFromAscii( "language" ); + ::rtl::OUString locKey = ::rtl::OUString::createFromAscii( "location" ); + + if ( sfUri->hasParameter( langKey ) == sal_False || + sfUri->hasParameter( locKey ) == sal_False || + ( sfUri->getName().getLength() == 0 ) ) + { + ::rtl::OUString errorMsg = OUSTR( "Incorrect format for Script URI: " ); + errorMsg = errorMsg.concat( scriptURI ); + throw provider::ScriptFrameworkErrorException( + errorMsg, Reference< XInterface >(), + scriptURI, OUSTR(""), + provider::ScriptFrameworkErrorType::UNKNOWN ); + } + + ::rtl::OUString language = sfUri->getParameter( langKey ); + ::rtl::OUString location = sfUri->getParameter( locKey ); + + // if script us located in uno pkg + sal_Int32 index = -1; + ::rtl::OUString pkgTag = + ::rtl::OUString::createFromAscii( ":uno_packages" ); + // for languages other than basic, scripts located in uno packages + // are merged into the user/share location context. + // For other languages the location attribute in script url has the form + // location = [user|share]:uno_packages or location :uno_pacakges/xxxx.uno.pkg + // we need to extract the value of location part from the + // location attribute of the script, if the script is located in an + // uno package then that is the location part up to and including + // ":uno_packages", if the script is not in an uno package then the + // normal value is used e.g. user or share. + // The value extracted will be used to determine if the script is + // located in the same location context as this MSP. + // For Basic, the language script provider can handle the execution of a + // script in any location context + if ( ( index = location.indexOf( pkgTag ) ) > -1 ) + { + location = location.copy( 0, index + pkgTag.getLength() ); + } + + Reference< provider::XScript > xScript; + + // If the script location is in the same location context as this + // MSP then delate to the lanaguage provider controlled by this MSP + // ** Special case is BASIC, all calls to getScript will be handled + // by the language script provider in the current location context + // even if its different + if ( ( location.equals( OUSTR( "document" ) ) + && m_xModel.is() + ) + || ( endsWith( m_sCtxString, location ) ) + || ( language.equals( OUSTR( "Basic" ) ) ) + ) + { + Reference< provider::XScriptProvider > xScriptProvider; + ::rtl::OUStringBuffer buf( 80 ); + buf.appendAscii( "com.sun.star.script.provider.ScriptProviderFor"); + buf.append( language ); + ::rtl::OUString serviceName = buf.makeStringAndClear(); + if ( providerCache() ) + { + try + { + xScriptProvider.set( + providerCache()->getProvider( serviceName ), + UNO_QUERY_THROW ); + } + catch( const Exception& e ) + { + throw provider::ScriptFrameworkErrorException( + e.Message, Reference< XInterface >(), + sfUri->getName(), language, + provider::ScriptFrameworkErrorType::NOTSUPPORTED ); + } + } + else + { + throw provider::ScriptFrameworkErrorException( + OUSTR( "No LanguageProviders detected" ), + Reference< XInterface >(), + sfUri->getName(), language, + provider::ScriptFrameworkErrorType::NOTSUPPORTED ); + } + xScript=xScriptProvider->getScript( scriptURI ); + } + else + { + Reference< provider::XScriptProviderFactory > xFac_( + m_xContext->getValueByName( + OUSTR( "/singletons/com.sun.star.script.provider.theMasterScriptProviderFactory") ), UNO_QUERY_THROW ); + + Reference< provider::XScriptProvider > xSP( + xFac_->createScriptProvider( makeAny( location ) ), UNO_QUERY_THROW ); + xScript = xSP->getScript( scriptURI ); + } + + return xScript; +} +//************************************************************************* +bool +MasterScriptProvider::isValid() +{ + return m_bIsValid; +} + +//************************************************************************* +ProviderCache* +MasterScriptProvider::providerCache() +{ + if ( !m_pPCache ) + { + ::osl::MutexGuard aGuard( m_mutex ); + if ( !m_pPCache ) + { + ::rtl::OUString serviceName1 = OUSTR("com.sun.star.script.provider.ScriptProviderForBasic"); + Sequence< ::rtl::OUString > blacklist(1); + blacklist[ 0 ] = serviceName1; + + if ( !m_bIsPkgMSP ) + { + m_pPCache = new ProviderCache( m_xContext, m_sAargs ); + } + else + { + m_pPCache = new ProviderCache( m_xContext, m_sAargs, blacklist ); + } + } + } + return m_pPCache; +} + + +//************************************************************************* +::rtl::OUString SAL_CALL +MasterScriptProvider::getName() + throw ( css::uno::RuntimeException ) +{ + if ( !isPkgProvider() ) + { + ::rtl::OUString sCtx = getContextString(); + if ( sCtx.indexOf( OUSTR( "vnd.sun.star.tdoc" ) ) == 0 ) + { + Reference< frame::XModel > xModel = m_xModel; + if ( !xModel.is() ) + { + xModel = MiscUtils::tDocUrlToModel( sCtx ); + } + + m_sNodeName = ::comphelper::DocumentInfo::getDocumentTitle( xModel ); + } + else + { + m_sNodeName = parseLocationName( getContextString() ); + } + } + else + { + m_sNodeName = OUSTR("uno_packages"); + } + return m_sNodeName; +} + +//************************************************************************* +Sequence< Reference< browse::XBrowseNode > > SAL_CALL +MasterScriptProvider::getChildNodes() + throw ( css::uno::RuntimeException ) +{ + Sequence< Reference< provider::XScriptProvider > > providers = getAllProviders(); + + Reference< provider::XScriptProvider > pkgProv = getPkgProvider(); + sal_Int32 size = providers.getLength(); + bool hasPkgs = pkgProv.is(); + if ( hasPkgs ) + { + size++; + } + Sequence< Reference< browse::XBrowseNode > > children( size ); + sal_Int32 provIndex = 0; + for ( ; provIndex < providers.getLength(); provIndex++ ) + { + children[ provIndex ] = Reference< browse::XBrowseNode >( providers[ provIndex ], UNO_QUERY ); + } + + if ( hasPkgs ) + { + children[ provIndex ] = Reference< browse::XBrowseNode >( pkgProv, UNO_QUERY ); + + } + + return children; +} + +//************************************************************************* +sal_Bool SAL_CALL +MasterScriptProvider::hasChildNodes() + throw ( css::uno::RuntimeException ) +{ + return sal_True; +} + +//************************************************************************* +sal_Int16 SAL_CALL +MasterScriptProvider::getType() + throw ( css::uno::RuntimeException ) +{ + return browse::BrowseNodeTypes::CONTAINER; +} + +//************************************************************************* + +::rtl::OUString +MasterScriptProvider::parseLocationName( const ::rtl::OUString& location ) +{ + // strip out the last leaf of location name + // e.g. file://dir1/dir2/Blah.sxw - > Blah.sxw + ::rtl::OUString temp = location; + INetURLObject aURLObj( temp ); + if ( !aURLObj.HasError() ) + temp = aURLObj.getName( INetURLObject::LAST_SEGMENT, true, INetURLObject::DECODE_WITH_CHARSET ); + return temp; +} + +//************************************************************************* +// Register Package +void SAL_CALL +MasterScriptProvider::insertByName( const ::rtl::OUString& aName, const Any& aElement ) throw ( lang::IllegalArgumentException, container::ElementExistException, lang::WrappedTargetException, css::uno::RuntimeException) +{ + if ( !m_bIsPkgMSP ) + { + if ( m_xMSPPkg.is() ) + { + Reference< container::XNameContainer > xCont( m_xMSPPkg, UNO_QUERY ); + if ( !xCont.is() ) + { + throw RuntimeException( + OUSTR("PackageMasterScriptProvider doesn't implement XNameContainer"), + Reference< XInterface >() ); + } + xCont->insertByName( aName, aElement ); + } + else + { + throw RuntimeException( OUSTR("PackageMasterScriptProvider is unitialised"), + Reference< XInterface >() ); + } + + } + else + { + Reference< deployment::XPackage > xPkg( aElement, UNO_QUERY ); + if ( !xPkg.is() ) + { + throw lang::IllegalArgumentException( OUSTR("Couldn't convert to XPackage"), + Reference < XInterface > (), 2 ); + } + if ( !aName.getLength() ) + { + throw lang::IllegalArgumentException( OUSTR("Name not set!!"), + Reference < XInterface > (), 1 ); + } + // TODO for library pacakge parse the language, for the moment will try + // to get each provider to process the new Package, the first one the succeeds + // will terminate processing + if ( !providerCache() ) + { + throw RuntimeException( + OUSTR("insertByName cannot instantiate " + "child script providers."), + Reference< XInterface >() ); + } + Sequence < Reference< provider::XScriptProvider > > xSProviders = + providerCache()->getAllProviders(); + sal_Int32 index = 0; + + for ( ; index < xSProviders.getLength(); index++ ) + { + Reference< container::XNameContainer > xCont( xSProviders[ index ], UNO_QUERY ); + if ( !xCont.is() ) + { + continue; + } + try + { + xCont->insertByName( aName, aElement ); + break; + } + catch ( Exception& ) + { + } + + } + if ( index == xSProviders.getLength() ) + { + // No script providers could process the package + ::rtl::OUString message = OUSTR("Failed to register package for "); + message = message.concat( aName ); + throw lang::IllegalArgumentException( message, + Reference < XInterface > (), 2 ); + } + } +} + +//************************************************************************* +// Revoke Package +void SAL_CALL +MasterScriptProvider::removeByName( const ::rtl::OUString& Name ) throw ( container::NoSuchElementException, lang::WrappedTargetException, RuntimeException) +{ + if ( !m_bIsPkgMSP ) + { + if ( m_xMSPPkg.is() ) + { + Reference< container::XNameContainer > xCont( m_xMSPPkg, UNO_QUERY ); + if ( !xCont.is() ) + { + throw RuntimeException( + OUSTR("PackageMasterScriptProvider doesn't implement XNameContainer"), + Reference< XInterface >() ); + } + xCont->removeByName( Name ); + } + else + { + throw RuntimeException( OUSTR("PackageMasterScriptProvider is unitialised"), + Reference< XInterface >() ); + } + + } + else + { + if ( !Name.getLength() ) + { + throw lang::IllegalArgumentException( OUSTR("Name not set!!"), + Reference < XInterface > (), 1 ); + } + // TODO for Script library pacakge url parse the language, + // for the moment will just try to get each provider to process remove/revoke + // request, the first one the succeeds will terminate processing + + if ( !providerCache() ) + { + throw RuntimeException( + OUSTR("removeByName() cannot instantiate " + "child script providers."), + Reference< XInterface >() ); + } + Sequence < Reference< provider::XScriptProvider > > xSProviders = + providerCache()->getAllProviders(); + sal_Int32 index = 0; + for ( ; index < xSProviders.getLength(); index++ ) + { + Reference< container::XNameContainer > xCont( xSProviders[ index ], UNO_QUERY ); + if ( !xCont.is() ) + { + continue; + } + try + { + xCont->removeByName( Name ); + break; + } + catch ( Exception& ) + { + } + + } + if ( index == xSProviders.getLength() ) + { + // No script providers could process the package + ::rtl::OUString message = OUSTR("Failed to revoke package for "); + message = message.concat( Name ); + throw lang::IllegalArgumentException( message, + Reference < XInterface > (), 1 ); + } + + } +} + +//************************************************************************* +void SAL_CALL +MasterScriptProvider::replaceByName( const ::rtl::OUString& aName, const Any& aElement ) throw ( lang::IllegalArgumentException, container::NoSuchElementException, lang::WrappedTargetException, RuntimeException) +{ + (void)aName; + (void)aElement; + + // TODO needs implementing + if ( true ) + { + throw RuntimeException( OUSTR("replaceByName not implemented!!!!") , + Reference< XInterface >() ); + } +} +//************************************************************************* +Any SAL_CALL +MasterScriptProvider::getByName( const ::rtl::OUString& aName ) throw ( container::NoSuchElementException, lang::WrappedTargetException, RuntimeException) +{ + (void)aName; + + // TODO needs to be implemented + Any result; + if ( true ) + { + throw RuntimeException( OUSTR("getByName not implemented!!!!") , + Reference< XInterface >() ); + } + return result; +} +//************************************************************************* +sal_Bool SAL_CALL +MasterScriptProvider::hasByName( const ::rtl::OUString& aName ) throw (RuntimeException) +{ + sal_Bool result = sal_False; + if ( !m_bIsPkgMSP ) + { + if ( m_xMSPPkg.is() ) + { + Reference< container::XNameContainer > xCont( m_xMSPPkg, UNO_QUERY ); + if ( !xCont.is() ) + { + throw RuntimeException( + OUSTR("PackageMasterScriptProvider doesn't implement XNameContainer"), + Reference< XInterface >() ); + } + + result = xCont->hasByName( aName ); + } + else + { + throw RuntimeException( OUSTR("PackageMasterScriptProvider is unitialised"), + Reference< XInterface >() ); + } + + } + else + { + if ( !aName.getLength() ) + { + throw lang::IllegalArgumentException( OUSTR("Name not set!!"), + Reference < XInterface > (), 1 ); + } + // TODO for Script library pacakge url parse the language, + // for the moment will just try to get each provider to see if the + // package exists in any provider, first one that succeed will + // terminate the loop + + if ( !providerCache() ) + { + throw RuntimeException( + OUSTR("removeByName() cannot instantiate " + "child script providers."), + Reference< XInterface >() ); + } + Sequence < Reference< provider::XScriptProvider > > xSProviders = + providerCache()->getAllProviders(); + for ( sal_Int32 index = 0; index < xSProviders.getLength(); index++ ) + { + Reference< container::XNameContainer > xCont( xSProviders[ index ], UNO_QUERY ); + if ( !xCont.is() ) + { + continue; + } + try + { + result = xCont->hasByName( aName ); + if ( result == sal_True ) + { + break; + } + } + catch ( Exception& ) + { + } + + } + } + return result; +} + +//************************************************************************* +Sequence< ::rtl::OUString > SAL_CALL +MasterScriptProvider::getElementNames( ) throw ( RuntimeException) +{ + // TODO needs implementing + Sequence< ::rtl::OUString > names; + if ( true ) + { + throw RuntimeException( OUSTR("getElementNames not implemented!!!!") , + Reference< XInterface >() ); + } + return names; +} +//************************************************************************* +Type SAL_CALL +MasterScriptProvider::getElementType( ) throw ( RuntimeException) +{ + // TODO needs implementing + Type t; + return t; +} +//************************************************************************* +sal_Bool SAL_CALL MasterScriptProvider::hasElements( ) throw ( RuntimeException) +{ + // TODO needs implementing + if ( true ) + { + throw RuntimeException( OUSTR("hasElements not implemented!!!!") , + Reference< XInterface >() ); + } + return false; +} + +//************************************************************************* +Sequence< Reference< provider::XScriptProvider > > SAL_CALL +MasterScriptProvider::getAllProviders() throw ( css::uno::RuntimeException ) +{ + if ( providerCache() ) + { + return providerCache()->getAllProviders(); + } + else + { + ::rtl::OUString errorMsg = ::rtl::OUString::createFromAscii( + "MasterScriptProvider::getAllProviders, cache not initialised"); + throw RuntimeException( errorMsg.concat( errorMsg ), + Reference< XInterface >() ); + } +} + + +//************************************************************************* +::rtl::OUString SAL_CALL MasterScriptProvider::getImplementationName( ) +throw( RuntimeException ) +{ + return ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM ( + "com.sun.star.script.provider.MasterScriptProvider" ) ); +} + +//************************************************************************* +sal_Bool SAL_CALL MasterScriptProvider::supportsService( const ::rtl::OUString& serviceName ) +throw( RuntimeException ) +{ + Sequence< ::rtl::OUString > serviceNames( getSupportedServiceNames() ); + ::rtl::OUString const * pNames = serviceNames.getConstArray(); + for ( sal_Int32 nPos = serviceNames.getLength(); nPos--; ) + { + if ( serviceName.equals( pNames[ nPos ] ) ) + { + return sal_True; + } + } + return sal_False; +} + +//************************************************************************* +Sequence< ::rtl::OUString > SAL_CALL MasterScriptProvider::getSupportedServiceNames( ) +throw( RuntimeException ) +{ + ::rtl::OUString names[3]; + + names[0] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM ( + "com.sun.star.script.provider.MasterScriptProvider" ) ); + names[1] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM ( + "com.sun.star.script.browse.BrowseNode" ) ); + names[2] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM ( + "com.sun.star.script.provider.ScriptProvider" ) ); + + return Sequence< ::rtl::OUString >( names, 3 ); +} + +} // namespace func_provider + + +namespace browsenodefactory +{ +::rtl::OUString SAL_CALL bnf_getImplementationName() ; +Reference< XInterface > SAL_CALL bnf_create( Reference< XComponentContext > const & xComponentContext ); +Sequence< ::rtl::OUString > SAL_CALL bnf_getSupportedServiceNames(); +} + +namespace scripting_runtimemgr +{ +//************************************************************************* +Reference< XInterface > SAL_CALL sp_create( + const Reference< XComponentContext > & xCompC ) +{ + return ( cppu::OWeakObject * ) new ::func_provider::MasterScriptProvider( xCompC ); +} + +//************************************************************************* +Sequence< ::rtl::OUString > sp_getSupportedServiceNames( ) + SAL_THROW( () ) +{ + ::rtl::OUString names[3]; + + names[0] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM ( + "com.sun.star.script.provider.MasterScriptProvider" ) ); + names[1] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM ( + "com.sun.star.script.browse.BrowseNode" ) ); + names[2] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM ( + "com.sun.star.script.provider.ScriptProvider" ) ); + + return Sequence< ::rtl::OUString >( names, 3 ); +} + +//************************************************************************* +::rtl::OUString sp_getImplementationName( ) +SAL_THROW( () ) +{ + return ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM ( + "com.sun.star.script.provider.MasterScriptProvider" ) ); +} + +// ***** registration or ScriptingFrameworkURIHelper +Reference< XInterface > SAL_CALL urihelper_create( + const Reference< XComponentContext > & xCompC ) +{ + return ( cppu::OWeakObject * ) + new ::func_provider::ScriptingFrameworkURIHelper( xCompC ); +} + +Sequence< ::rtl::OUString > urihelper_getSupportedServiceNames( ) + SAL_THROW( () ) +{ + ::rtl::OUString serviceNameList[] = { + ::rtl::OUString::createFromAscii( + "com.sun.star.script.provider.ScriptURIHelper" ) }; + + Sequence< ::rtl::OUString > serviceNames = Sequence < + ::rtl::OUString > ( serviceNameList, 1 ); + + return serviceNames; +} + +::rtl::OUString urihelper_getImplementationName( ) + SAL_THROW( () ) +{ + return ::rtl::OUString::createFromAscii( + "com.sun.star.script.provider.ScriptURIHelper"); +} + +static struct cppu::ImplementationEntry s_entries [] = + { + { + sp_create, sp_getImplementationName, + sp_getSupportedServiceNames, cppu::createSingleComponentFactory, + 0, 0 + }, + { + urihelper_create, + urihelper_getImplementationName, + urihelper_getSupportedServiceNames, + cppu::createSingleComponentFactory, + 0, 0 + }, + { + func_provider::mspf_create, func_provider::mspf_getImplementationName, + func_provider::mspf_getSupportedServiceNames, cppu::createSingleComponentFactory, + 0, 0 + }, + { + browsenodefactory::bnf_create, browsenodefactory::bnf_getImplementationName, + browsenodefactory::bnf_getSupportedServiceNames, cppu::createSingleComponentFactory, + 0, 0 + }, + { 0, 0, 0, 0, 0, 0 } + }; +} + +//############################################################################ +//#### EXPORTED ############################################################## +//############################################################################ + +/** + * Gives the environment this component belongs to. + */ +extern "C" +{ + SAL_DLLPUBLIC_EXPORT void SAL_CALL component_getImplementationEnvironment( + const sal_Char ** ppEnvTypeName, uno_Environment ** ppEnv ) + { + (void)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 + */ + SAL_DLLPUBLIC_EXPORT 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 ); + } +} |