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