LCOV - code coverage report
Current view: top level - scripting/source/provider - MasterScriptProvider.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 108 298 36.2 %
Date: 2015-06-13 12:38:46 Functions: 14 32 43.8 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       5             :  * This Source Code Form is subject to the terms of the Mozilla Public
       6             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8             :  *
       9             :  * This file incorporates work covered by the following license notice:
      10             :  *
      11             :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      12             :  *   contributor license agreements. See the NOTICE file distributed
      13             :  *   with this work for additional information regarding copyright
      14             :  *   ownership. The ASF licenses this file to you under the Apache
      15             :  *   License, Version 2.0 (the "License"); you may not use this file
      16             :  *   except in compliance with the License. You may obtain a copy of
      17             :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      18             :  */
      19             : 
      20             : 
      21             : #include <comphelper/documentinfo.hxx>
      22             : 
      23             : #include <cppuhelper/implementationentry.hxx>
      24             : #include <cppuhelper/exc_hlp.hxx>
      25             : #include <cppuhelper/factory.hxx>
      26             : #include <cppuhelper/supportsservice.hxx>
      27             : #include <tools/diagnose_ex.h>
      28             : 
      29             : #include <com/sun/star/frame/XModel.hpp>
      30             : #include <com/sun/star/lang/EventObject.hpp>
      31             : #include <com/sun/star/container/XContentEnumerationAccess.hpp>
      32             : #include <com/sun/star/document/XScriptInvocationContext.hpp>
      33             : 
      34             : #include <com/sun/star/uri/XUriReference.hpp>
      35             : #include <com/sun/star/uri/UriReferenceFactory.hpp>
      36             : #include <com/sun/star/uri/XVndSunStarScriptUrl.hpp>
      37             : 
      38             : #include <com/sun/star/deployment/XPackage.hpp>
      39             : #include <com/sun/star/script/browse/BrowseNodeTypes.hpp>
      40             : #include <com/sun/star/script/provider/theMasterScriptProviderFactory.hpp>
      41             : #include <com/sun/star/script/provider/ScriptFrameworkErrorType.hpp>
      42             : 
      43             : #include <util/scriptingconstants.hxx>
      44             : #include <util/MiscUtils.hxx>
      45             : 
      46             : #include "ActiveMSPList.hxx"
      47             : #include "MasterScriptProvider.hxx"
      48             : #include "URIHelper.hxx"
      49             : 
      50             : using namespace ::com::sun::star;
      51             : using namespace ::com::sun::star::uno;
      52             : using namespace ::com::sun::star::script;
      53             : using namespace ::com::sun::star::document;
      54             : using namespace ::sf_misc;
      55             : 
      56             : namespace func_provider
      57             : {
      58             : 
      59           0 : bool endsWith( const OUString& target,
      60             :     const OUString& item )
      61             : {
      62           0 :     sal_Int32 index = 0;
      63           0 :     if (  ( index = target.indexOf( item ) ) != -1  &&
      64           0 :        ( index == ( target.getLength() - item.getLength() ) ) )
      65             :     {
      66           0 :         return true;
      67             :     }
      68           0 :     return false;
      69             : }
      70             : 
      71             : /* should be available in some central location. */
      72             : 
      73             : // XScriptProvider implementation
      74             : 
      75             : 
      76          32 : MasterScriptProvider::MasterScriptProvider( const Reference< XComponentContext > & xContext ) throw ( RuntimeException ):
      77             :         m_xContext( xContext ), m_bIsValid( false ), m_bInitialised( false ),
      78          32 :         m_bIsPkgMSP( false ), m_pPCache( 0 )
      79             : {
      80          32 :     ENSURE_OR_THROW( m_xContext.is(), "MasterScriptProvider::MasterScriptProvider: No context available\n" );
      81          32 :     m_xMgr = m_xContext->getServiceManager();
      82          32 :     ENSURE_OR_THROW( m_xMgr.is(), "MasterScriptProvider::MasterScriptProvider: No service manager available\n" );
      83          32 :     m_bIsValid = true;
      84          32 : }
      85             : 
      86             : 
      87          96 : MasterScriptProvider::~MasterScriptProvider()
      88             : {
      89          32 :     if ( m_pPCache )
      90             :     {
      91          31 :         delete m_pPCache;
      92             :     }
      93          32 :     m_pPCache = 0;
      94          64 : }
      95             : 
      96             : 
      97          31 : void SAL_CALL MasterScriptProvider::initialize( const Sequence < Any >& args )
      98             : throw ( Exception, RuntimeException, std::exception )
      99             : {
     100          31 :     if ( m_bInitialised )
     101          31 :         return;
     102             : 
     103          31 :     m_bIsValid = false;
     104             : 
     105          31 :     sal_Int32 len = args.getLength();
     106          31 :     if ( len > 1  )
     107             :     {
     108             :         throw RuntimeException(
     109           0 :             "MasterScriptProvider::initialize: invalid number of arguments" );
     110             :     }
     111             : 
     112          31 :     Sequence< Any > invokeArgs( len );
     113             : 
     114          31 :     if ( len != 0 )
     115             :     {
     116             :         // check if first parameter is a string
     117             :         // if it is, this implies that this is a MSP created
     118             :         // with a user or share ctx ( used for browse functionality )
     119             : 
     120          31 :         if ( args[ 0 ] >>= m_sCtxString )
     121             :         {
     122          31 :             invokeArgs[ 0  ] = args[ 0 ];
     123          31 :             if ( m_sCtxString.startsWith( "vnd.sun.star.tdoc" ) )
     124             :             {
     125          31 :                 m_xModel =  MiscUtils::tDocUrlToModel( m_sCtxString );
     126             :             }
     127             :         }
     128           0 :         else if ( args[ 0 ] >>= m_xInvocationContext )
     129             :         {
     130           0 :             m_xModel.set( m_xInvocationContext->getScriptContainer(), UNO_QUERY_THROW );
     131             :         }
     132             :         else
     133             :         {
     134           0 :             args[ 0 ] >>= m_xModel;
     135             :         }
     136             : 
     137          31 :         if ( m_xModel.is() )
     138             :         {
     139             :             // from the arguments, we were able to deduce a model. That alone doesn't
     140             :             // suffice, we also need an XEmbeddedScripts which actually indicates support
     141             :             // for embeddeding scripts
     142          31 :             Reference< XEmbeddedScripts > xScripts( m_xModel, UNO_QUERY );
     143          31 :             if ( !xScripts.is() )
     144             :             {
     145             :                 throw lang::IllegalArgumentException(
     146             :                     OUString( "The given document does not support embedding scripts into it, and cannot be associated with such a document."
     147             :                      ),
     148             :                     *this,
     149             :                     1
     150           0 :                 );
     151             :             }
     152             : 
     153             :             try
     154             :             {
     155          31 :                 m_sCtxString =  MiscUtils::xModelToTdocUrl( m_xModel, m_xContext );
     156             :             }
     157           0 :             catch ( const Exception& )
     158             :             {
     159           0 :                 Any aError( ::cppu::getCaughtException() );
     160             : 
     161           0 :                 OUStringBuffer buf;
     162           0 :                 buf.appendAscii( "MasterScriptProvider::initialize: caught " );
     163           0 :                 buf.append     ( aError.getValueTypeName() );
     164           0 :                 buf.appendAscii( ":" );
     165             : 
     166           0 :                 Exception aException; aError >>= aException;
     167           0 :                 buf.append     ( aException.Message );
     168           0 :                 throw lang::WrappedTargetException( buf.makeStringAndClear(), *this, aError );
     169             :             }
     170             : 
     171          31 :             if ( m_xInvocationContext.is() && m_xInvocationContext != m_xModel )
     172           0 :                 invokeArgs[ 0 ] <<= m_xInvocationContext;
     173             :             else
     174          31 :                 invokeArgs[ 0 ] <<= m_sCtxString;
     175             :         }
     176             : 
     177          31 :         OUString pkgSpec = "uno_packages";
     178          31 :         sal_Int32 indexOfPkgSpec = m_sCtxString.lastIndexOf( pkgSpec );
     179             : 
     180             :         // if contex string ends with "uno_packages"
     181          31 :         if ( indexOfPkgSpec > -1 && m_sCtxString.match( pkgSpec, indexOfPkgSpec ) )
     182             :         {
     183           0 :             m_bIsPkgMSP = true;
     184             :         }
     185             :         else
     186             :         {
     187          31 :             m_bIsPkgMSP = false;
     188          31 :         }
     189             :     }
     190             :     else // no args
     191             :     {
     192             :         // use either scriping context or maybe zero args?
     193           0 :         invokeArgs = Sequence< Any >( 0 ); // no arguments
     194             :     }
     195          31 :     m_sAargs = invokeArgs;
     196             :     // don't create pkg mgr MSP for documents, not supported
     197          31 :     if ( !m_bIsPkgMSP && !m_xModel.is() )
     198             :     {
     199           0 :         createPkgProvider();
     200             :     }
     201             : 
     202          31 :     m_bInitialised = true;
     203          31 :     m_bIsValid = true;
     204             : }
     205             : 
     206             : 
     207             : 
     208           0 : void MasterScriptProvider::createPkgProvider()
     209             : {
     210             :     try
     211             :     {
     212           0 :         Any location;
     213           0 :         OUString sPkgCtx =  m_sCtxString.concat( ":uno_packages" );
     214           0 :         location <<= sPkgCtx;
     215             : 
     216             :         Reference< provider::XScriptProviderFactory > xFac =
     217           0 :             provider::theMasterScriptProviderFactory::get( m_xContext );
     218             : 
     219             :         m_xMSPPkg.set(
     220           0 :             xFac->createScriptProvider( location ), UNO_QUERY_THROW );
     221             : 
     222             :     }
     223           0 :     catch ( const Exception& e )
     224             :     {
     225             :         (void)e;
     226             :         OSL_TRACE("Exception creating MasterScriptProvider for uno_packages in context %s: %s",
     227             :                 OUStringToOString( m_sCtxString,
     228             :                     RTL_TEXTENCODING_ASCII_US ).pData->buffer,
     229             :                 OUStringToOString( e.Message,
     230             :                     RTL_TEXTENCODING_ASCII_US ).pData->buffer );
     231             :     }
     232           0 : }
     233             : 
     234             : 
     235             : Reference< provider::XScript >
     236          80 : MasterScriptProvider::getScript( const OUString& scriptURI )
     237             : throw ( provider::ScriptFrameworkErrorException,
     238             :         RuntimeException, std::exception )
     239             : {
     240          80 :     if ( !isValid() )
     241             :     {
     242             :         throw provider::ScriptFrameworkErrorException(
     243             :             "MasterScriptProvider not initialised", Reference< XInterface >(),
     244             :             scriptURI, "",
     245           0 :             provider::ScriptFrameworkErrorType::UNKNOWN );
     246             :     }
     247             : 
     248             :     // need to get the language from the string
     249             : 
     250          80 :     Reference< uri::XUriReferenceFactory > xFac ( uri::UriReferenceFactory::create( m_xContext )  );
     251             : 
     252             :     Reference<  uri::XUriReference > uriRef(
     253         160 :         xFac->parse( scriptURI ), UNO_QUERY );
     254             : 
     255         160 :     Reference < uri::XVndSunStarScriptUrl > sfUri( uriRef, UNO_QUERY );
     256             : 
     257          80 :     if ( !uriRef.is() || !sfUri.is() )
     258             :     {
     259           0 :         OUString errorMsg = "Incorrect format for Script URI: ";
     260           0 :         errorMsg = errorMsg.concat( scriptURI );
     261             :         throw provider::ScriptFrameworkErrorException(
     262             :             errorMsg, Reference< XInterface >(),
     263             :             scriptURI, "",
     264           0 :             provider::ScriptFrameworkErrorType::UNKNOWN );
     265             :     }
     266             : 
     267         160 :     OUString langKey("language");
     268         160 :     OUString locKey("location");
     269             : 
     270         320 :     if ( sfUri->hasParameter( langKey ) == sal_False ||
     271         320 :          sfUri->hasParameter( locKey ) == sal_False ||
     272         320 :          ( sfUri->getName().isEmpty()  ) )
     273             :     {
     274           0 :         OUString errorMsg = "Incorrect format for Script URI: ";
     275           0 :         errorMsg = errorMsg.concat( scriptURI );
     276             :         throw provider::ScriptFrameworkErrorException(
     277             :             errorMsg, Reference< XInterface >(),
     278             :             scriptURI, "",
     279           0 :             provider::ScriptFrameworkErrorType::UNKNOWN );
     280             :     }
     281             : 
     282         160 :     OUString language = sfUri->getParameter( langKey );
     283         160 :     OUString location = sfUri->getParameter( locKey );
     284             : 
     285             :     // if script us located in uno pkg
     286          80 :     sal_Int32 index = -1;
     287         160 :     OUString pkgTag(":uno_packages");
     288             :     // for languages other than basic,  scripts located in uno packages
     289             :     // are merged into the user/share location context.
     290             :     // For other languages the location attribute in script url has the form
     291             :     // location = [user|share]:uno_packages or location :uno_pacakges/xxxx.uno.pkg
     292             :     // we need to extract the value of location part from the
     293             :     // location attribute of the script, if the script is located in an
     294             :     // uno package then that is the location part up to and including
     295             :     // ":uno_packages", if the script is not in an uno package then the
     296             :     // normal value is used e.g. user or share.
     297             :     // The value extracted will be used to determine if the script is
     298             :     // located in the same location context as this MSP.
     299             :     // For Basic, the language script provider can handle the execution of a
     300             :     // script in any location context
     301          80 :     if ( ( index = location.indexOf( pkgTag ) ) > -1 )
     302             :     {
     303           0 :         location = location.copy( 0, index + pkgTag.getLength() );
     304             :     }
     305             : 
     306          80 :     Reference< provider::XScript > xScript;
     307             : 
     308             :     // If the script location is in the same location context as this
     309             :     // MSP then delate to the lanaguage provider controlled by this MSP
     310             :     // ** Special case is BASIC, all calls to getScript will be handled
     311             :     // by the language script provider in the current location context
     312             :     // even if its different
     313         160 :     if  (   (   location == "document"
     314          80 :             &&  m_xModel.is()
     315             :             )
     316           0 :             ||  ( endsWith( m_sCtxString, location ) )
     317          80 :             ||  ( language == "Basic" )
     318             :          )
     319             :     {
     320          80 :         Reference< provider::XScriptProvider > xScriptProvider;
     321         160 :         OUStringBuffer buf( 80 );
     322          80 :         buf.appendAscii( "com.sun.star.script.provider.ScriptProviderFor");
     323          80 :         buf.append( language );
     324         160 :         OUString serviceName = buf.makeStringAndClear();
     325          80 :         if ( providerCache() )
     326             :         {
     327             :             try
     328             :             {
     329             :                 xScriptProvider.set(
     330             :                     providerCache()->getProvider( serviceName ),
     331          80 :                     UNO_QUERY_THROW );
     332             :             }
     333           0 :             catch( const Exception& e )
     334             :             {
     335             :                 throw provider::ScriptFrameworkErrorException(
     336             :                     e.Message, Reference< XInterface >(),
     337           0 :                     sfUri->getName(), language,
     338           0 :                     provider::ScriptFrameworkErrorType::NOTSUPPORTED );
     339             :             }
     340             :         }
     341             :         else
     342             :         {
     343             :             throw provider::ScriptFrameworkErrorException(
     344             :                 "No LanguageProviders detected",
     345             :                 Reference< XInterface >(),
     346           0 :                 sfUri->getName(), language,
     347           0 :                 provider::ScriptFrameworkErrorType::NOTSUPPORTED );
     348             :         }
     349         160 :         xScript=xScriptProvider->getScript( scriptURI );
     350             :     }
     351             :     else
     352             :     {
     353             :         Reference< provider::XScriptProviderFactory > xFac_ =
     354           0 :             provider::theMasterScriptProviderFactory::get( m_xContext );
     355             : 
     356             :         Reference< provider::XScriptProvider > xSP(
     357           0 :             xFac_->createScriptProvider( makeAny( location ) ), UNO_QUERY_THROW );
     358           0 :         xScript = xSP->getScript( scriptURI );
     359             :     }
     360             : 
     361         160 :     return xScript;
     362             : }
     363             : 
     364             : 
     365             : 
     366             : ProviderCache*
     367         160 : MasterScriptProvider::providerCache()
     368             : {
     369         160 :     if ( !m_pPCache )
     370             :     {
     371          31 :         ::osl::MutexGuard aGuard( m_mutex );
     372          31 :         if ( !m_pPCache )
     373             :         {
     374          31 :             OUString serviceName1 = "com.sun.star.script.provider.ScriptProviderForBasic";
     375          62 :             Sequence< OUString > blacklist(1);
     376          31 :             blacklist[ 0 ] = serviceName1;
     377             : 
     378          31 :             if ( !m_bIsPkgMSP )
     379             :             {
     380          31 :                 m_pPCache = new ProviderCache( m_xContext, m_sAargs );
     381             :             }
     382             :             else
     383             :             {
     384           0 :                 m_pPCache = new ProviderCache( m_xContext, m_sAargs, blacklist );
     385          31 :             }
     386          31 :         }
     387             :     }
     388         160 :     return m_pPCache;
     389             : }
     390             : 
     391             : 
     392             : 
     393             : OUString SAL_CALL
     394           0 : MasterScriptProvider::getName()
     395             :         throw ( css::uno::RuntimeException, std::exception )
     396             : {
     397           0 :     if ( !isPkgProvider() )
     398             :     {
     399           0 :         OUString sCtx = getContextString();
     400           0 :         if ( sCtx.startsWith( "vnd.sun.star.tdoc" ) )
     401             :         {
     402           0 :             Reference< frame::XModel > xModel = m_xModel;
     403           0 :             if ( !xModel.is() )
     404             :             {
     405           0 :                 xModel = MiscUtils::tDocUrlToModel( sCtx );
     406             :             }
     407             : 
     408           0 :             m_sNodeName = ::comphelper::DocumentInfo::getDocumentTitle( xModel );
     409             :         }
     410             :         else
     411             :         {
     412           0 :             m_sNodeName = parseLocationName( getContextString() );
     413           0 :         }
     414             :     }
     415             :     else
     416             :     {
     417           0 :         m_sNodeName = "uno_packages";
     418             :     }
     419           0 :     return m_sNodeName;
     420             : }
     421             : 
     422             : 
     423             : Sequence< Reference< browse::XBrowseNode > > SAL_CALL
     424           0 : MasterScriptProvider::getChildNodes()
     425             :         throw ( css::uno::RuntimeException, std::exception )
     426             : {
     427           0 :     Sequence< Reference< provider::XScriptProvider > > providers = getAllProviders();
     428             : 
     429           0 :     Reference< provider::XScriptProvider > pkgProv = getPkgProvider();
     430           0 :     sal_Int32 size = providers.getLength();
     431           0 :     bool hasPkgs = pkgProv.is();
     432           0 :     if ( hasPkgs  )
     433             :     {
     434           0 :         size++;
     435             :     }
     436           0 :     Sequence<  Reference< browse::XBrowseNode > > children( size );
     437           0 :     sal_Int32 provIndex = 0;
     438           0 :     for ( ; provIndex < providers.getLength(); provIndex++ )
     439             :     {
     440           0 :         children[ provIndex ] = Reference< browse::XBrowseNode >( providers[ provIndex ], UNO_QUERY );
     441             :     }
     442             : 
     443           0 :     if ( hasPkgs  )
     444             :     {
     445           0 :         children[ provIndex ] = Reference< browse::XBrowseNode >( pkgProv, UNO_QUERY );
     446             : 
     447             :     }
     448             : 
     449           0 :     return children;
     450             : }
     451             : 
     452             : 
     453             : sal_Bool SAL_CALL
     454           0 : MasterScriptProvider::hasChildNodes()
     455             :         throw ( css::uno::RuntimeException, std::exception )
     456             : {
     457           0 :     return sal_True;
     458             : }
     459             : 
     460             : 
     461             : sal_Int16 SAL_CALL
     462           0 : MasterScriptProvider::getType()
     463             :         throw ( css::uno::RuntimeException, std::exception )
     464             : {
     465           0 :     return browse::BrowseNodeTypes::CONTAINER;
     466             : }
     467             : 
     468             : 
     469             : 
     470             : OUString
     471           0 : MasterScriptProvider::parseLocationName( const OUString& location )
     472             : {
     473             :     // strip out the last leaf of location name
     474             :     // e.g. file://dir1/dir2/Blah.sxw - > Blah.sxw
     475           0 :     OUString temp = location;
     476           0 :     INetURLObject aURLObj( temp );
     477           0 :     if ( !aURLObj.HasError() )
     478           0 :         temp = aURLObj.getName( INetURLObject::LAST_SEGMENT, true, INetURLObject::DECODE_WITH_CHARSET );
     479           0 :     return temp;
     480             : }
     481             : 
     482             : 
     483             : // Register Package
     484             : void SAL_CALL
     485           0 : MasterScriptProvider::insertByName( const OUString& aName, const Any& aElement ) throw ( lang::IllegalArgumentException, container::ElementExistException, lang::WrappedTargetException, css::uno::RuntimeException, std::exception)
     486             : {
     487           0 :     if ( !m_bIsPkgMSP )
     488             :     {
     489           0 :         if ( m_xMSPPkg.is() )
     490             :         {
     491           0 :             Reference< container::XNameContainer > xCont( m_xMSPPkg, UNO_QUERY );
     492           0 :             if ( !xCont.is() )
     493             :             {
     494             :                 throw RuntimeException(
     495           0 :                     "PackageMasterScriptProvider doesn't implement XNameContainer" );
     496             :             }
     497           0 :             xCont->insertByName( aName, aElement );
     498             :         }
     499             :         else
     500             :         {
     501           0 :             throw RuntimeException( "PackageMasterScriptProvider is unitialised" );
     502             :         }
     503             : 
     504             :     }
     505             :     else
     506             :     {
     507           0 :         Reference< deployment::XPackage > xPkg( aElement, UNO_QUERY );
     508           0 :         if ( !xPkg.is() )
     509             :         {
     510             :             throw lang::IllegalArgumentException( "Couldn't convert to XPackage",
     511           0 :                                                       Reference < XInterface > (), 2 );
     512             :         }
     513           0 :         if ( aName.isEmpty() )
     514             :         {
     515             :             throw lang::IllegalArgumentException( "Name not set!!",
     516           0 :                                                       Reference < XInterface > (), 1 );
     517             :         }
     518             :         // TODO for library pacakge parse the language, for the moment will try
     519             :         // to get each provider to process the new Package, the first one the succeeds
     520             :         // will terminate processing
     521           0 :         if ( !providerCache() )
     522             :         {
     523             :             throw RuntimeException(
     524             :                 "insertByName cannot instantiate "
     525           0 :                 "child script providers." );
     526             :         }
     527             :         Sequence < Reference< provider::XScriptProvider > > xSProviders =
     528           0 :             providerCache()->getAllProviders();
     529           0 :         sal_Int32 index = 0;
     530             : 
     531           0 :         for ( ; index < xSProviders.getLength(); index++ )
     532             :         {
     533           0 :             Reference< container::XNameContainer > xCont( xSProviders[ index ], UNO_QUERY );
     534           0 :             if ( !xCont.is() )
     535             :             {
     536           0 :                 continue;
     537             :             }
     538             :             try
     539             :             {
     540           0 :                 xCont->insertByName( aName, aElement );
     541           0 :                 break;
     542             :             }
     543           0 :             catch ( Exception& e )
     544             :             {
     545             :                 SAL_INFO(
     546             :                     "scripting.provider", "ignoring Exception " << e.Message);
     547             :             }
     548             : 
     549           0 :         }
     550           0 :         if ( index == xSProviders.getLength() )
     551             :         {
     552             :             // No script providers could process the package
     553           0 :             OUString message = "Failed to register package for ";
     554           0 :             message = message.concat( aName );
     555             :             throw lang::IllegalArgumentException( message,
     556           0 :                 Reference < XInterface > (), 2 );
     557           0 :         }
     558             :    }
     559           0 : }
     560             : 
     561             : 
     562             : // Revoke Package
     563             : void SAL_CALL
     564           0 : MasterScriptProvider::removeByName( const OUString& Name ) throw ( container::NoSuchElementException, lang::WrappedTargetException, RuntimeException, std::exception)
     565             : {
     566           0 :     if ( !m_bIsPkgMSP )
     567             :     {
     568           0 :         if ( m_xMSPPkg.is() )
     569             :         {
     570           0 :             Reference< container::XNameContainer > xCont( m_xMSPPkg, UNO_QUERY );
     571           0 :             if ( !xCont.is() )
     572             :             {
     573             :                 throw RuntimeException(
     574           0 :                     "PackageMasterScriptProvider doesn't implement XNameContainer" );
     575             :             }
     576           0 :             xCont->removeByName( Name );
     577             :         }
     578             :         else
     579             :         {
     580           0 :             throw RuntimeException( "PackageMasterScriptProvider is unitialised" );
     581             :         }
     582             : 
     583             :    }
     584             :    else
     585             :    {
     586           0 :         if ( Name.isEmpty() )
     587             :         {
     588             :             throw lang::IllegalArgumentException( "Name not set!!",
     589           0 :                                                       Reference < XInterface > (), 1 );
     590             :         }
     591             :         // TODO for Script library pacakge url parse the language,
     592             :         // for the moment will just try to get each provider to process remove/revoke
     593             :         // request, the first one the succeeds will terminate processing
     594             : 
     595           0 :         if ( !providerCache() )
     596             :         {
     597             :             throw RuntimeException(
     598             :                 "removeByName() cannot instantiate "
     599           0 :                 "child script providers." );
     600             :         }
     601             :         Sequence < Reference< provider::XScriptProvider > > xSProviders =
     602           0 :             providerCache()->getAllProviders();
     603           0 :         sal_Int32 index = 0;
     604           0 :         for ( ; index < xSProviders.getLength(); index++ )
     605             :         {
     606           0 :             Reference< container::XNameContainer > xCont( xSProviders[ index ], UNO_QUERY );
     607           0 :             if ( !xCont.is() )
     608             :             {
     609           0 :                 continue;
     610             :             }
     611             :             try
     612             :             {
     613           0 :                 xCont->removeByName( Name );
     614           0 :                 break;
     615             :             }
     616           0 :             catch ( Exception& )
     617             :             {
     618             :             }
     619             : 
     620           0 :         }
     621           0 :         if ( index == xSProviders.getLength() )
     622             :         {
     623             :             // No script providers could process the package
     624           0 :             OUString message = "Failed to revoke package for ";
     625           0 :             message = message.concat( Name );
     626             :             throw lang::IllegalArgumentException( message,
     627           0 :                                                       Reference < XInterface > (), 1 );
     628           0 :         }
     629             : 
     630             :     }
     631           0 : }
     632             : 
     633             : 
     634             : void SAL_CALL
     635           0 : MasterScriptProvider::replaceByName( const OUString& aName, const Any& aElement ) throw ( lang::IllegalArgumentException, container::NoSuchElementException, lang::WrappedTargetException, RuntimeException, std::exception)
     636             : {
     637             :     (void)aName;
     638             :     (void)aElement;
     639             : 
     640             :     // TODO needs implementing
     641             :     if ( true )
     642             :     {
     643           0 :         throw RuntimeException( "replaceByName not implemented!!!!" );
     644             :     }
     645             : }
     646             : 
     647             : Any SAL_CALL
     648           0 : MasterScriptProvider::getByName( const OUString& aName ) throw ( container::NoSuchElementException, lang::WrappedTargetException, RuntimeException, std::exception)
     649             : {
     650             :     (void)aName;
     651             : 
     652             :     // TODO needs to be implemented
     653           0 :     Any result;
     654             :     if ( true )
     655             :     {
     656           0 :         throw RuntimeException( "getByName not implemented!!!!" );
     657             :     }
     658             :     return result;
     659             : }
     660             : 
     661             : sal_Bool SAL_CALL
     662           1 : MasterScriptProvider::hasByName( const OUString& aName ) throw (RuntimeException, std::exception)
     663             : {
     664           1 :     bool result = false;
     665           1 :     if ( !m_bIsPkgMSP )
     666             :     {
     667           1 :         if ( m_xMSPPkg.is() )
     668             :         {
     669           0 :             Reference< container::XNameContainer > xCont( m_xMSPPkg, UNO_QUERY );
     670           0 :             if ( !xCont.is() )
     671             :             {
     672             :                 throw RuntimeException(
     673           0 :                     "PackageMasterScriptProvider doesn't implement XNameContainer" );
     674             :             }
     675             : 
     676           0 :             result = xCont->hasByName( aName );
     677             :         }
     678             :         // If this is a document provider then we shouldn't
     679             :         // have a PackageProvider
     680           1 :         else if (!m_xModel.is())
     681             :         {
     682           0 :             throw RuntimeException( "PackageMasterScriptProvider is unitialised" );
     683             :         }
     684             : 
     685             :    }
     686             :    else
     687             :    {
     688           0 :         if ( aName.isEmpty() )
     689             :         {
     690             :             throw lang::IllegalArgumentException( "Name not set!!",
     691           0 :                                                       Reference < XInterface > (), 1 );
     692             :         }
     693             :         // TODO for Script library pacakge url parse the language,
     694             :         // for the moment will just try to get each provider to see if the
     695             :         // package exists in any provider, first one that succeed will
     696             :         // terminate the loop
     697             : 
     698           0 :         if ( !providerCache() )
     699             :         {
     700             :             throw RuntimeException(
     701             :                 "removeByName() cannot instantiate "
     702           0 :                 "child script providers." );
     703             :         }
     704             :         Sequence < Reference< provider::XScriptProvider > > xSProviders =
     705           0 :             providerCache()->getAllProviders();
     706           0 :         for ( sal_Int32 index = 0; index < xSProviders.getLength(); index++ )
     707             :         {
     708           0 :             Reference< container::XNameContainer > xCont( xSProviders[ index ], UNO_QUERY );
     709           0 :             if ( !xCont.is() )
     710             :             {
     711           0 :                 continue;
     712             :             }
     713             :             try
     714             :             {
     715           0 :                 result = xCont->hasByName( aName );
     716           0 :                 if ( result )
     717             :                 {
     718           0 :                     break;
     719             :                 }
     720             :             }
     721           0 :             catch ( Exception& )
     722             :             {
     723             :             }
     724             : 
     725           0 :         }
     726             :     }
     727           1 :     return result;
     728             : }
     729             : 
     730             : 
     731             : Sequence< OUString > SAL_CALL
     732           0 : MasterScriptProvider::getElementNames(  ) throw ( RuntimeException, std::exception)
     733             : {
     734             :     // TODO needs implementing
     735           0 :     Sequence< OUString >  names;
     736             :     if ( true )
     737             :     {
     738           0 :         throw RuntimeException( "getElementNames not implemented!!!!" );
     739             :     }
     740             :     return names;
     741             : }
     742             : 
     743             : Type SAL_CALL
     744           0 : MasterScriptProvider::getElementType(  ) throw ( RuntimeException, std::exception)
     745             : {
     746             :     // TODO needs implementing
     747           0 :     Type t;
     748           0 :     return t;
     749             : }
     750             : 
     751           0 : sal_Bool SAL_CALL MasterScriptProvider::hasElements(  ) throw ( RuntimeException, std::exception)
     752             : {
     753             :     // TODO needs implementing
     754             :     if ( true )
     755             :     {
     756           0 :         throw RuntimeException( "hasElements not implemented!!!!" );
     757             :     }
     758             :     return false;
     759             : }
     760             : 
     761             : 
     762             : Sequence< Reference< provider::XScriptProvider > > SAL_CALL
     763           0 : MasterScriptProvider::getAllProviders() throw ( css::uno::RuntimeException )
     764             : {
     765           0 :     if ( providerCache() )
     766             :     {
     767           0 :         return providerCache()->getAllProviders();
     768             :     }
     769             :     else
     770             :     {
     771             :         OUString errorMsg(
     772           0 :             "MasterScriptProvider::getAllProviders, cache not initialised");
     773           0 :         throw RuntimeException( errorMsg.concat( errorMsg ) );
     774             :     }
     775             : }
     776             : 
     777             : 
     778             : 
     779           1 : OUString SAL_CALL MasterScriptProvider::getImplementationName( )
     780             : throw( RuntimeException, std::exception )
     781             : {
     782           1 :     return OUString( "com.sun.star.script.provider.MasterScriptProvider"  );
     783             : }
     784             : 
     785           0 : sal_Bool SAL_CALL MasterScriptProvider::supportsService( const OUString& serviceName )
     786             : throw( RuntimeException, std::exception )
     787             : {
     788           0 :     return cppu::supportsService(this, serviceName);
     789             : }
     790             : 
     791             : 
     792           1 : Sequence< OUString > SAL_CALL MasterScriptProvider::getSupportedServiceNames( )
     793             : throw( RuntimeException, std::exception )
     794             : {
     795           4 :     OUString names[3];
     796             : 
     797           1 :     names[0] = "com.sun.star.script.provider.MasterScriptProvider";
     798           1 :     names[1] = "com.sun.star.script.browse.BrowseNode";
     799           1 :     names[2] = "com.sun.star.script.provider.ScriptProvider";
     800             : 
     801           4 :     return Sequence< OUString >( names, 3 );
     802             : }
     803             : 
     804             : } // namespace func_provider
     805             : 
     806             : 
     807             : namespace scripting_runtimemgr
     808             : {
     809             : 
     810          32 : Reference< XInterface > SAL_CALL sp_create(
     811             :     const Reference< XComponentContext > & xCompC )
     812             : {
     813          32 :     return static_cast<cppu::OWeakObject *>(new ::func_provider::MasterScriptProvider( xCompC ));
     814             : }
     815             : 
     816             : 
     817           5 : Sequence< OUString > sp_getSupportedServiceNames( )
     818             : {
     819          20 :     OUString names[3];
     820             : 
     821           5 :     names[0] = "com.sun.star.script.provider.MasterScriptProvider";
     822           5 :     names[1] = "com.sun.star.script.browse.BrowseNode";
     823           5 :     names[2] = "com.sun.star.script.provider.ScriptProvider";
     824             : 
     825          20 :     return Sequence< OUString >( names, 3 );
     826             : }
     827             : 
     828             : 
     829          11 : OUString sp_getImplementationName( )
     830             : {
     831          11 :     return OUString( "com.sun.star.script.provider.MasterScriptProvider"  );
     832             : }
     833             : 
     834             : // ***** registration or ScriptingFrameworkURIHelper
     835           0 : Reference< XInterface > SAL_CALL urihelper_create(
     836             :     const Reference< XComponentContext > & xCompC )
     837             : {
     838             :     return static_cast<cppu::OWeakObject *>(
     839           0 :         new ::func_provider::ScriptingFrameworkURIHelper( xCompC ));
     840             : }
     841             : 
     842           0 : Sequence< OUString > urihelper_getSupportedServiceNames( )
     843             : {
     844             :     OUString serviceNameList[] = {
     845             :         OUString(
     846           0 :             "com.sun.star.script.provider.ScriptURIHelper" ) };
     847             : 
     848             :     Sequence< OUString > serviceNames = Sequence <
     849           0 :         OUString > ( serviceNameList, 1 );
     850             : 
     851           0 :     return serviceNames;
     852             : }
     853             : 
     854          11 : OUString urihelper_getImplementationName( )
     855             : {
     856             :     return OUString(
     857          11 :         "com.sun.star.script.provider.ScriptURIHelper");
     858             : }
     859             : 
     860             : static const struct cppu::ImplementationEntry s_entries [] =
     861             :     {
     862             :         {
     863             :             sp_create, sp_getImplementationName,
     864             :             sp_getSupportedServiceNames, cppu::createSingleComponentFactory,
     865             :             0, 0
     866             :         },
     867             :         {
     868             :             urihelper_create,
     869             :             urihelper_getImplementationName,
     870             :             urihelper_getSupportedServiceNames,
     871             :             cppu::createSingleComponentFactory,
     872             :             0, 0
     873             :         },
     874             :         {
     875             :             func_provider::mspf_create, func_provider::mspf_getImplementationName,
     876             :             func_provider::mspf_getSupportedServiceNames, cppu::createSingleComponentFactory,
     877             :             0, 0
     878             :         },
     879             :         {
     880             :             browsenodefactory::bnf_create, browsenodefactory::bnf_getImplementationName,
     881             :             browsenodefactory::bnf_getSupportedServiceNames, cppu::createSingleComponentFactory,
     882             :             0, 0
     883             :         },
     884             :         { 0, 0, 0, 0, 0, 0 }
     885             :     };
     886             : }
     887             : 
     888             : 
     889             : //#### EXPORTED ##############################################################
     890             : 
     891             : 
     892             : extern "C"
     893             : {
     894             :     /**
     895             :      * This function is called to get service factories for an implementation.
     896             :      *
     897             :      * @param pImplName       name of implementation
     898             :      * @param pServiceManager a service manager, need for component creation
     899             :      * @param pRegistryKey    the registry key for this component, need for persistent
     900             :      *                        data
     901             :      * @return a component factory
     902             :      */
     903          11 :     SAL_DLLPUBLIC_EXPORT void * SAL_CALL scriptframe_component_getFactory(
     904             :         const sal_Char * pImplName,
     905             :         void * pServiceManager,
     906             :         void * pRegistryKey )
     907             :     {
     908             :         return ::cppu::component_getFactoryHelper( pImplName, pServiceManager,
     909          11 :             pRegistryKey, ::scripting_runtimemgr::s_entries );
     910             :     }
     911             : }
     912             : 
     913             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.11