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_basic.hxx" 26 #include "scriptcont.hxx" 27 #include "sbmodule.hxx" 28 #include <com/sun/star/container/XNameContainer.hpp> 29 #include <com/sun/star/xml/sax/XParser.hpp> 30 #include <com/sun/star/xml/sax/InputSource.hpp> 31 #include <com/sun/star/io/XOutputStream.hpp> 32 #include <com/sun/star/io/XInputStream.hpp> 33 #include <com/sun/star/io/XActiveDataSource.hpp> 34 #include <com/sun/star/ucb/XSimpleFileAccess.hpp> 35 #include <com/sun/star/embed/ElementModes.hpp> 36 #include <com/sun/star/embed/XEncryptionProtectedSource.hpp> 37 #include <com/sun/star/beans/XPropertySet.hpp> 38 #include <com/sun/star/embed/XTransactedObject.hpp> 39 #include <com/sun/star/task/ErrorCodeIOException.hpp> 40 #include <com/sun/star/script/ModuleType.hpp> 41 #include <comphelper/processfactory.hxx> 42 #ifndef _COMPHELPER_STORAGEHELPER_HXX_ 43 #include <comphelper/storagehelper.hxx> 44 #endif 45 #include <unotools/streamwrap.hxx> 46 #include <unotools/ucbstreamhelper.hxx> 47 #include <osl/mutex.hxx> 48 #include <rtl/digest.h> 49 #include <rtl/strbuf.hxx> 50 51 // For password functionality 52 #include <tools/urlobj.hxx> 53 54 55 #include <unotools/pathoptions.hxx> 56 #include <svtools/sfxecode.hxx> 57 #include <svtools/ehdl.hxx> 58 #include <basic/basmgr.hxx> 59 #include <basic/sbmod.hxx> 60 #include <basic/basicmanagerrepository.hxx> 61 #include "basic/modsizeexceeded.hxx" 62 #include <xmlscript/xmlmod_imexp.hxx> 63 #include <cppuhelper/factory.hxx> 64 #include <com/sun/star/util/VetoException.hpp> 65 66 namespace basic 67 { 68 69 using namespace com::sun::star::document; 70 using namespace com::sun::star::container; 71 using namespace com::sun::star::io; 72 using namespace com::sun::star::uno; 73 using namespace com::sun::star::ucb; 74 using namespace com::sun::star::lang; 75 using namespace com::sun::star::script; 76 using namespace com::sun::star::xml::sax; 77 using namespace com::sun::star; 78 using namespace cppu; 79 using namespace osl; 80 81 using ::rtl::OUString; 82 83 //============================================================================ 84 // Implementation class SfxScriptLibraryContainer 85 86 const sal_Char* SAL_CALL SfxScriptLibraryContainer::getInfoFileName() const { return "script"; } 87 const sal_Char* SAL_CALL SfxScriptLibraryContainer::getOldInfoFileName() const { return "script"; } 88 const sal_Char* SAL_CALL SfxScriptLibraryContainer::getLibElementFileExtension() const { return "xba"; } 89 const sal_Char* SAL_CALL SfxScriptLibraryContainer::getLibrariesDir() const { return "Basic"; } 90 91 // OldBasicPassword interface 92 void SfxScriptLibraryContainer::setLibraryPassword 93 ( const String& rLibraryName, const String& rPassword ) 94 { 95 try 96 { 97 SfxLibrary* pImplLib = getImplLib( rLibraryName ); 98 if( rPassword.Len() ) 99 { 100 pImplLib->mbDoc50Password = sal_True; 101 pImplLib->mbPasswordProtected = sal_True; 102 pImplLib->maPassword = rPassword; 103 } 104 } 105 catch( NoSuchElementException& ) {} 106 } 107 108 String SfxScriptLibraryContainer::getLibraryPassword( const String& rLibraryName ) 109 { 110 SfxLibrary* pImplLib = getImplLib( rLibraryName ); 111 String aPassword; 112 if( pImplLib->mbPasswordVerified ) 113 aPassword = pImplLib->maPassword; 114 return aPassword; 115 } 116 117 void SfxScriptLibraryContainer::clearLibraryPassword( const String& rLibraryName ) 118 { 119 try 120 { 121 SfxLibrary* pImplLib = getImplLib( rLibraryName ); 122 pImplLib->mbDoc50Password = sal_False; 123 pImplLib->mbPasswordProtected = sal_False; 124 pImplLib->maPassword = OUString(); 125 } 126 catch( NoSuchElementException& ) {} 127 } 128 129 sal_Bool SfxScriptLibraryContainer::hasLibraryPassword( const String& rLibraryName ) 130 { 131 SfxLibrary* pImplLib = getImplLib( rLibraryName ); 132 return pImplLib->mbPasswordProtected; 133 } 134 135 136 // Ctor for service 137 SfxScriptLibraryContainer::SfxScriptLibraryContainer( void ) 138 :maScriptLanguage( RTL_CONSTASCII_USTRINGPARAM( "StarBasic" ) ) 139 { 140 // all initialisation has to be done 141 // by calling XInitialization::initialize 142 } 143 144 SfxScriptLibraryContainer::SfxScriptLibraryContainer( const uno::Reference< embed::XStorage >& xStorage ) 145 :maScriptLanguage( RTL_CONSTASCII_USTRINGPARAM( "StarBasic" ) ) 146 { 147 init( OUString(), xStorage ); 148 } 149 150 // Methods to get library instances of the correct type 151 SfxLibrary* SfxScriptLibraryContainer::implCreateLibrary( const OUString& aName ) 152 { 153 (void)aName; // Only needed for SfxDialogLibrary 154 SfxLibrary* pRet = new SfxScriptLibrary( maModifiable, mxMSF, mxSFI ); 155 return pRet; 156 } 157 158 SfxLibrary* SfxScriptLibraryContainer::implCreateLibraryLink 159 ( const OUString& aName, const OUString& aLibInfoFileURL, 160 const OUString& StorageURL, sal_Bool ReadOnly ) 161 { 162 (void)aName; // Only needed for SfxDialogLibrary 163 SfxLibrary* pRet = 164 new SfxScriptLibrary 165 ( maModifiable, mxMSF, mxSFI, aLibInfoFileURL, StorageURL, ReadOnly ); 166 return pRet; 167 } 168 169 Any SAL_CALL SfxScriptLibraryContainer::createEmptyLibraryElement( void ) 170 { 171 OUString aMod; 172 Any aRetAny; 173 aRetAny <<= aMod; 174 return aRetAny; 175 } 176 177 bool SAL_CALL SfxScriptLibraryContainer::isLibraryElementValid( Any aElement ) const 178 { 179 return SfxScriptLibrary::containsValidModule( aElement ); 180 } 181 182 void SAL_CALL SfxScriptLibraryContainer::writeLibraryElement 183 ( 184 const Reference < XNameContainer >& xLib, 185 const OUString& aElementName, 186 const Reference< XOutputStream >& xOutput 187 ) 188 throw(Exception) 189 { 190 // Create sax writer 191 Reference< XExtendedDocumentHandler > xHandler( 192 mxMSF->createInstance( 193 OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.xml.sax.Writer") ) ), UNO_QUERY ); 194 if( !xHandler.is() ) 195 { 196 OSL_ENSURE( 0, "### couln't create sax-writer component\n" ); 197 return; 198 } 199 200 Reference< XTruncate > xTruncate( xOutput, UNO_QUERY ); 201 OSL_ENSURE( xTruncate.is(), "Currently only the streams that can be truncated are expected!" ); 202 if ( xTruncate.is() ) 203 xTruncate->truncate(); 204 205 Reference< XActiveDataSource > xSource( xHandler, UNO_QUERY ); 206 xSource->setOutputStream( xOutput ); 207 208 xmlscript::ModuleDescriptor aMod; 209 aMod.aName = aElementName; 210 aMod.aLanguage = maScriptLanguage; 211 Any aElement = xLib->getByName( aElementName ); 212 aElement >>= aMod.aCode; 213 214 Reference< script::vba::XVBAModuleInfo > xModInfo( xLib, UNO_QUERY ); 215 if( xModInfo.is() && xModInfo->hasModuleInfo( aElementName ) ) 216 { 217 script::ModuleInfo aModInfo = xModInfo->getModuleInfo( aElementName ); 218 switch( aModInfo.ModuleType ) 219 { 220 case ModuleType::NORMAL: 221 aMod.aModuleType = OUString( RTL_CONSTASCII_USTRINGPARAM("normal") ); 222 break; 223 case ModuleType::CLASS: 224 aMod.aModuleType = OUString( RTL_CONSTASCII_USTRINGPARAM("class") ); 225 break; 226 case ModuleType::FORM: 227 aMod.aModuleType = OUString( RTL_CONSTASCII_USTRINGPARAM("form") ); 228 break; 229 case ModuleType::DOCUMENT: 230 aMod.aModuleType = OUString( RTL_CONSTASCII_USTRINGPARAM("document") ); 231 break; 232 case ModuleType::UNKNOWN: 233 // nothing 234 break; 235 } 236 } 237 238 xmlscript::exportScriptModule( xHandler, aMod ); 239 } 240 241 242 Any SAL_CALL SfxScriptLibraryContainer::importLibraryElement 243 ( const Reference < XNameContainer >& xLib, 244 const OUString& aElementName, const OUString& aFile, 245 const uno::Reference< io::XInputStream >& xInStream ) 246 { 247 Any aRetAny; 248 249 Reference< XParser > xParser( mxMSF->createInstance( 250 OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.xml.sax.Parser") ) ), UNO_QUERY ); 251 if( !xParser.is() ) 252 { 253 OSL_ENSURE( 0, "### couln't create sax parser component\n" ); 254 return aRetAny; 255 } 256 257 258 // Read from storage? 259 sal_Bool bStorage = xInStream.is(); 260 Reference< XInputStream > xInput; 261 262 if( bStorage ) 263 { 264 xInput = xInStream; 265 } 266 else 267 { 268 try 269 { 270 xInput = mxSFI->openFileRead( aFile ); 271 } 272 catch( Exception& ) 273 //catch( Exception& e ) 274 { 275 // TODO: 276 //throw WrappedTargetException( e ); 277 } 278 } 279 280 if( !xInput.is() ) 281 return aRetAny; 282 283 InputSource source; 284 source.aInputStream = xInput; 285 source.sSystemId = aFile; 286 287 // start parsing 288 xmlscript::ModuleDescriptor aMod; 289 290 try 291 { 292 xParser->setDocumentHandler( ::xmlscript::importScriptModule( aMod ) ); 293 xParser->parseStream( source ); 294 } 295 catch( Exception& ) 296 { 297 SfxErrorContext aEc( ERRCTX_SFX_LOADBASIC, aFile ); 298 sal_uIntPtr nErrorCode = ERRCODE_IO_GENERAL; 299 ErrorHandler::HandleError( nErrorCode ); 300 } 301 302 aRetAny <<= aMod.aCode; 303 304 // TODO: Check language 305 // aMod.aLanguage 306 // aMod.aName ignored 307 if( aMod.aModuleType.getLength() > 0 ) 308 { 309 /* If in VBA compatibility mode, force creation of the VBA Globals 310 object. Each application will create an instance of its own 311 implementation and store it in its Basic manager. Implementations 312 will do all necessary additional initialization, such as 313 registering the global "This***Doc" UNO constant, starting the 314 document events processor etc. 315 */ 316 if( getVBACompatibilityMode() ) try 317 { 318 Reference< frame::XModel > xModel( mxOwnerDocument ); // weak-ref -> ref 319 Reference< XMultiServiceFactory > xFactory( xModel, UNO_QUERY_THROW ); 320 xFactory->createInstance( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "ooo.vba.VBAGlobals" ) ) ); 321 } 322 catch( Exception& ) 323 { 324 } 325 326 script::ModuleInfo aModInfo; 327 aModInfo.ModuleType = ModuleType::UNKNOWN; 328 if( aMod.aModuleType.equalsAsciiL( 329 RTL_CONSTASCII_STRINGPARAM("normal") )) 330 { 331 aModInfo.ModuleType = ModuleType::NORMAL; 332 } 333 else if( aMod.aModuleType.equalsAsciiL( 334 RTL_CONSTASCII_STRINGPARAM("class") )) 335 { 336 aModInfo.ModuleType = ModuleType::CLASS; 337 } 338 else if( aMod.aModuleType.equalsAsciiL( 339 RTL_CONSTASCII_STRINGPARAM("form") )) 340 { 341 aModInfo.ModuleType = ModuleType::FORM; 342 aModInfo.ModuleObject = mxOwnerDocument; 343 } 344 else if( aMod.aModuleType.equalsAsciiL( 345 RTL_CONSTASCII_STRINGPARAM("document") )) 346 { 347 aModInfo.ModuleType = ModuleType::DOCUMENT; 348 349 // #163691# use the same codename access instance for all document modules 350 if( !mxCodeNameAccess.is() ) try 351 { 352 Reference<frame::XModel > xModel( mxOwnerDocument ); 353 Reference< XMultiServiceFactory> xSF( xModel, UNO_QUERY_THROW ); 354 mxCodeNameAccess.set( xSF->createInstance( rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "ooo.vba.VBAObjectModuleObjectProvider" ) ) ), UNO_QUERY ); 355 } 356 catch( Exception& ) {} 357 358 if( mxCodeNameAccess.is() ) 359 { 360 try 361 { 362 aModInfo.ModuleObject.set( mxCodeNameAccess->getByName( aElementName), uno::UNO_QUERY ); 363 } 364 catch(uno::Exception&) 365 { 366 OSL_TRACE("Failed to get documument object for %s", rtl::OUStringToOString( aElementName, RTL_TEXTENCODING_UTF8 ).getStr() ); 367 } 368 } 369 } 370 371 Reference< script::vba::XVBAModuleInfo > xVBAModuleInfo( xLib, UNO_QUERY ); 372 if( xVBAModuleInfo.is() ) 373 { 374 if( xVBAModuleInfo->hasModuleInfo( aElementName ) ) 375 xVBAModuleInfo->removeModuleInfo( aElementName ); 376 xVBAModuleInfo->insertModuleInfo( aElementName, aModInfo ); 377 } 378 } 379 380 return aRetAny; 381 } 382 383 SfxLibraryContainer* SfxScriptLibraryContainer::createInstanceImpl( void ) 384 { 385 return new SfxScriptLibraryContainer(); 386 } 387 388 void SAL_CALL SfxScriptLibraryContainer::importFromOldStorage( const ::rtl::OUString& aFile ) 389 { 390 // TODO: move loading from old storage to binary filters? 391 SotStorageRef xStorage = new SotStorage( sal_False, aFile ); 392 if( xStorage.Is() && xStorage->GetError() == ERRCODE_NONE ) 393 { 394 // We need a BasicManager to avoid problems 395 // StarBASIC* pBas = new StarBASIC(); 396 BasicManager* pBasicManager = new BasicManager( *(SotStorage*)xStorage, aFile ); 397 398 // Set info 399 LibraryContainerInfo aInfo( this, NULL, static_cast< OldBasicPassword* >( this ) ); 400 pBasicManager->SetLibraryContainerInfo( aInfo ); 401 402 // Now the libraries should be copied to this SfxScriptLibraryContainer 403 BasicManager::LegacyDeleteBasicManager( pBasicManager ); 404 } 405 } 406 407 408 // Storing with password encryption 409 410 // Methods XLibraryContainerPassword 411 sal_Bool SAL_CALL SfxScriptLibraryContainer::isLibraryPasswordProtected( const OUString& Name ) 412 throw (NoSuchElementException, RuntimeException) 413 { 414 LibraryContainerMethodGuard aGuard( *this ); 415 SfxLibrary* pImplLib = getImplLib( Name ); 416 sal_Bool bRet = pImplLib->mbPasswordProtected; 417 return bRet; 418 } 419 420 sal_Bool SAL_CALL SfxScriptLibraryContainer::isLibraryPasswordVerified( const OUString& Name ) 421 throw (IllegalArgumentException, NoSuchElementException, RuntimeException) 422 { 423 LibraryContainerMethodGuard aGuard( *this ); 424 SfxLibrary* pImplLib = getImplLib( Name ); 425 if( !pImplLib->mbPasswordProtected ) 426 throw IllegalArgumentException(); 427 sal_Bool bRet = pImplLib->mbPasswordVerified; 428 return bRet; 429 } 430 431 sal_Bool SAL_CALL SfxScriptLibraryContainer::verifyLibraryPassword 432 ( const OUString& Name, const OUString& Password ) 433 throw (IllegalArgumentException, NoSuchElementException, RuntimeException) 434 { 435 LibraryContainerMethodGuard aGuard( *this ); 436 SfxLibrary* pImplLib = getImplLib( Name ); 437 if( !pImplLib->mbPasswordProtected || pImplLib->mbPasswordVerified ) 438 throw IllegalArgumentException(); 439 440 // Test password 441 sal_Bool bSuccess = sal_False; 442 if( pImplLib->mbDoc50Password ) 443 { 444 bSuccess = ( Password == pImplLib->maPassword ); 445 if( bSuccess ) 446 pImplLib->mbPasswordVerified = sal_True; 447 } 448 else 449 { 450 pImplLib->maPassword = Password; 451 bSuccess = implLoadPasswordLibrary( pImplLib, Name, sal_True ); 452 if( bSuccess ) 453 { 454 // The library gets modified by verifiying the password, because other- 455 // wise for saving the storage would be copied and that doesn't work 456 // with mtg's storages when the password is verified 457 pImplLib->implSetModified( sal_True ); 458 pImplLib->mbPasswordVerified = sal_True; 459 460 // Reload library to get source 461 if( pImplLib->mbLoaded ) 462 implLoadPasswordLibrary( pImplLib, Name ); 463 } 464 } 465 return bSuccess; 466 } 467 468 void SAL_CALL SfxScriptLibraryContainer::changeLibraryPassword( const OUString& Name, 469 const OUString& OldPassword, const OUString& NewPassword ) 470 throw (IllegalArgumentException, NoSuchElementException, RuntimeException) 471 { 472 LibraryContainerMethodGuard aGuard( *this ); 473 SfxLibrary* pImplLib = getImplLib( Name ); 474 if( OldPassword == NewPassword ) 475 return; 476 477 sal_Bool bOldPassword = ( OldPassword.getLength() > 0 ); 478 sal_Bool bNewPassword = ( NewPassword.getLength() > 0 ); 479 sal_Bool bStorage = mxStorage.is() && !pImplLib->mbLink; 480 481 if( pImplLib->mbReadOnly || (bOldPassword && !pImplLib->mbPasswordProtected) ) 482 throw IllegalArgumentException(); 483 484 // Library must be loaded 485 loadLibrary( Name ); 486 487 sal_Bool bKillCryptedFiles = sal_False; 488 sal_Bool bKillUncryptedFiles = sal_False; 489 490 // Remove or change password? 491 if( bOldPassword ) 492 { 493 if( isLibraryPasswordVerified( Name ) ) 494 { 495 if( pImplLib->maPassword != OldPassword ) 496 throw IllegalArgumentException(); 497 } 498 else 499 { 500 if( !verifyLibraryPassword( Name, OldPassword ) ) 501 throw IllegalArgumentException(); 502 503 // Reload library to get source 504 // Should be done in verifyLibraryPassword loadLibrary( Name ); 505 } 506 507 if( !bNewPassword ) 508 { 509 pImplLib->mbPasswordProtected = sal_False; 510 pImplLib->mbPasswordVerified = sal_False; 511 pImplLib->maPassword = OUString(); 512 513 maModifiable.setModified( sal_True ); 514 pImplLib->implSetModified( sal_True ); 515 516 if( !bStorage && !pImplLib->mbDoc50Password ) 517 { 518 // Store application basic uncrypted 519 uno::Reference< embed::XStorage > xStorage; 520 storeLibraries_Impl( xStorage, sal_False ); 521 bKillCryptedFiles = sal_True; 522 } 523 } 524 } 525 526 // Set new password? 527 if( bNewPassword ) 528 { 529 pImplLib->mbPasswordProtected = sal_True; 530 pImplLib->mbPasswordVerified = sal_True; 531 pImplLib->maPassword = NewPassword; 532 533 maModifiable.setModified( sal_True ); 534 pImplLib->implSetModified( sal_True ); 535 536 if( !bStorage && !pImplLib->mbDoc50Password ) 537 { 538 // Store applictaion basic crypted 539 uno::Reference< embed::XStorage > xStorage; 540 storeLibraries_Impl( xStorage, sal_False ); 541 bKillUncryptedFiles = sal_True; 542 } 543 } 544 545 if( bKillCryptedFiles || bKillUncryptedFiles ) 546 { 547 Sequence< OUString > aElementNames = pImplLib->getElementNames(); 548 sal_Int32 nNameCount = aElementNames.getLength(); 549 const OUString* pNames = aElementNames.getConstArray(); 550 OUString aLibDirPath = createAppLibraryFolder( pImplLib, Name ); 551 try 552 { 553 for( sal_Int32 i = 0 ; i < nNameCount ; i++ ) 554 { 555 OUString aElementName = pNames[ i ]; 556 557 INetURLObject aElementInetObj( aLibDirPath ); 558 aElementInetObj.insertName( aElementName, sal_False, 559 INetURLObject::LAST_SEGMENT, sal_True, INetURLObject::ENCODE_ALL ); 560 if( bKillUncryptedFiles ) 561 aElementInetObj.setExtension( maLibElementFileExtension ); 562 else 563 aElementInetObj.setExtension( OUString( RTL_CONSTASCII_USTRINGPARAM("pba") ) ); 564 String aElementPath( aElementInetObj.GetMainURL( INetURLObject::NO_DECODE ) ); 565 566 if( mxSFI->exists( aElementPath ) ) 567 mxSFI->kill( aElementPath ); 568 } 569 } 570 catch( Exception& ) {} 571 } 572 } 573 574 575 void setStreamKey( uno::Reference< io::XStream > xStream, const ::rtl::OUString& aPass ) 576 { 577 uno::Reference< embed::XEncryptionProtectedSource > xEncrStream( xStream, uno::UNO_QUERY ); 578 if ( xEncrStream.is() ) 579 xEncrStream->setEncryptionPassword( aPass ); 580 } 581 582 583 // Impl methods 584 sal_Bool SfxScriptLibraryContainer::implStorePasswordLibrary( SfxLibrary* pLib, 585 const ::rtl::OUString& aName, const uno::Reference< embed::XStorage >& xStorage, const ::com::sun::star::uno::Reference< ::com::sun::star::task::XInteractionHandler >& xHandler ) 586 { 587 OUString aDummyLocation; 588 Reference< XSimpleFileAccess > xDummySFA; 589 return implStorePasswordLibrary( pLib, aName, xStorage, aDummyLocation, xDummySFA, xHandler ); 590 } 591 592 sal_Bool SfxScriptLibraryContainer::implStorePasswordLibrary( SfxLibrary* pLib, const ::rtl::OUString& aName, 593 const ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage >& xStorage, 594 const ::rtl::OUString& aTargetURL, const Reference< XSimpleFileAccess > xToUseSFI, const ::com::sun::star::uno::Reference< ::com::sun::star::task::XInteractionHandler >& xHandler ) 595 { 596 bool bExport = aTargetURL.getLength(); 597 598 BasicManager* pBasicMgr = getBasicManager(); 599 OSL_ENSURE( pBasicMgr, "SfxScriptLibraryContainer::implStorePasswordLibrary: cannot do this without a BasicManager!" ); 600 if ( !pBasicMgr ) 601 return sal_False; 602 603 // Only need to handle the export case here, 604 // save/saveas etc are handled in sfxbasemodel::storeSelf & 605 // sfxbasemodel::impl_store 606 uno::Sequence<rtl::OUString> aNames; 607 if ( bExport && pBasicMgr->LegacyPsswdBinaryLimitExceeded(aNames) ) 608 { 609 if ( xHandler.is() ) 610 { 611 ModuleSizeExceeded* pReq = new ModuleSizeExceeded( aNames ); 612 uno::Reference< task::XInteractionRequest > xReq( pReq ); 613 xHandler->handle( xReq ); 614 if ( pReq->isAbort() ) 615 throw util::VetoException(); 616 } 617 } 618 619 StarBASIC* pBasicLib = pBasicMgr->GetLib( aName ); 620 if( !pBasicLib ) 621 return sal_False; 622 623 Sequence< OUString > aElementNames = pLib->getElementNames(); 624 sal_Int32 nNameCount = aElementNames.getLength(); 625 const OUString* pNames = aElementNames.getConstArray(); 626 627 sal_Bool bLink = pLib->mbLink; 628 sal_Bool bStorage = xStorage.is() && !bLink; 629 if( bStorage ) 630 { 631 for( sal_Int32 i = 0 ; i < nNameCount ; i++ ) 632 { 633 OUString aElementName = pNames[ i ]; 634 635 // Write binary image stream 636 SbModule* pMod = pBasicLib->FindModule( aElementName ); 637 if( pMod ) 638 { 639 //OUString aCodeStreamName( RTL_CONSTASCII_USTRINGPARAM("code.bin") ); 640 OUString aCodeStreamName = aElementName; 641 aCodeStreamName += String( RTL_CONSTASCII_USTRINGPARAM(".bin") ); 642 643 try { 644 uno::Reference< io::XStream > xCodeStream = xStorage->openStreamElement( 645 aCodeStreamName, 646 embed::ElementModes::READWRITE | embed::ElementModes::TRUNCATE ); 647 648 if ( !xCodeStream.is() ) 649 throw uno::RuntimeException(); 650 651 SvMemoryStream aMemStream; 652 /*sal_Bool bStore = */pMod->StoreBinaryData( aMemStream ); 653 654 sal_Int32 nSize = (sal_Int32)aMemStream.Tell(); 655 Sequence< sal_Int8 > aBinSeq( nSize ); 656 sal_Int8* pData = aBinSeq.getArray(); 657 ::rtl_copyMemory( pData, aMemStream.GetData(), nSize ); 658 659 Reference< XOutputStream > xOut = xCodeStream->getOutputStream(); 660 if ( !xOut.is() ) 661 throw io::IOException(); // access denied because the stream is readonly 662 663 xOut->writeBytes( aBinSeq ); 664 xOut->closeOutput(); 665 } 666 catch( uno::Exception& ) 667 { 668 // TODO: handle error 669 } 670 } 671 672 if( pLib->mbPasswordVerified || pLib->mbDoc50Password ) 673 { 674 /*Any aElement = pLib->getByName( aElementName );*/ 675 if( !isLibraryElementValid( pLib->getByName( aElementName ) ) ) 676 { 677 #if OSL_DEBUG_LEVEL > 0 678 ::rtl::OStringBuffer aMessage; 679 aMessage.append( "invalid library element '" ); 680 aMessage.append( ::rtl::OUStringToOString( aElementName, osl_getThreadTextEncoding() ) ); 681 aMessage.append( "'." ); 682 OSL_ENSURE( false, aMessage.makeStringAndClear().getStr() ); 683 #endif 684 continue; 685 } 686 687 OUString aSourceStreamName = aElementName; 688 aSourceStreamName += String( RTL_CONSTASCII_USTRINGPARAM(".xml") ); 689 690 try { 691 uno::Reference< io::XStream > xSourceStream = xStorage->openStreamElement( 692 aSourceStreamName, 693 embed::ElementModes::READWRITE ); 694 uno::Reference< beans::XPropertySet > xProps( xSourceStream, uno::UNO_QUERY ); 695 if ( !xProps.is() ) 696 throw uno::RuntimeException(); 697 698 String aPropName( String::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM("MediaType") ) ); 699 OUString aMime( RTL_CONSTASCII_USTRINGPARAM("text/xml") ); 700 xProps->setPropertyValue( aPropName, uno::makeAny( aMime ) ); 701 702 // Set encryption key 703 setStreamKey( xSourceStream, pLib->maPassword ); 704 705 Reference< XOutputStream > xOutput = xSourceStream->getOutputStream(); 706 Reference< XNameContainer > xLib( pLib ); 707 writeLibraryElement( xLib, aElementName, xOutput ); 708 // writeLibraryElement should have the stream already closed 709 // xOutput->closeOutput(); 710 } 711 catch( uno::Exception& ) 712 { 713 OSL_ENSURE( sal_False, "Problem on storing of password library!\n" ); 714 // TODO: error handling 715 } 716 } 717 else // !mbPasswordVerified 718 { 719 // TODO 720 // What to do if not verified?! In any case it's already loaded here 721 } 722 } 723 724 } 725 // Application libraries have only to be saved if the password 726 // is verified because otherwise they can't be modified 727 else if( pLib->mbPasswordVerified || bExport ) 728 { 729 try 730 { 731 Reference< XSimpleFileAccess > xSFI = mxSFI; 732 if( xToUseSFI.is() ) 733 xSFI = xToUseSFI; 734 735 OUString aLibDirPath; 736 if( bExport ) 737 { 738 INetURLObject aInetObj( aTargetURL ); 739 aInetObj.insertName( aName, sal_True, INetURLObject::LAST_SEGMENT, sal_True, INetURLObject::ENCODE_ALL ); 740 aLibDirPath = aInetObj.GetMainURL( INetURLObject::NO_DECODE ); 741 742 if( !xSFI->isFolder( aLibDirPath ) ) 743 xSFI->createFolder( aLibDirPath ); 744 } 745 else 746 { 747 aLibDirPath = createAppLibraryFolder( pLib, aName ); 748 } 749 750 for( sal_Int32 i = 0 ; i < nNameCount ; i++ ) 751 { 752 OUString aElementName = pNames[ i ]; 753 754 INetURLObject aElementInetObj( aLibDirPath ); 755 aElementInetObj.insertName( aElementName, sal_False, 756 INetURLObject::LAST_SEGMENT, sal_True, INetURLObject::ENCODE_ALL ); 757 aElementInetObj.setExtension( OUString( RTL_CONSTASCII_USTRINGPARAM("pba") ) ); 758 String aElementPath = aElementInetObj.GetMainURL( INetURLObject::NO_DECODE ); 759 760 /*Any aElement = pLib->getByName( aElementName );*/ 761 if( !isLibraryElementValid( pLib->getByName( aElementName ) ) ) 762 { 763 #if OSL_DEBUG_LEVEL > 0 764 ::rtl::OStringBuffer aMessage; 765 aMessage.append( "invalid library element '" ); 766 aMessage.append( ::rtl::OUStringToOString( aElementName, osl_getThreadTextEncoding() ) ); 767 aMessage.append( "'." ); 768 OSL_ENSURE( false, aMessage.makeStringAndClear().getStr() ); 769 #endif 770 continue; 771 } 772 773 try 774 { 775 uno::Reference< embed::XStorage > xElementRootStorage = 776 ::comphelper::OStorageHelper::GetStorageFromURL( 777 aElementPath, 778 embed::ElementModes::READWRITE ); 779 if ( !xElementRootStorage.is() ) 780 throw uno::RuntimeException(); 781 782 // Write binary image stream 783 SbModule* pMod = pBasicLib->FindModule( aElementName ); 784 if( pMod ) 785 { 786 OUString aCodeStreamName( RTL_CONSTASCII_USTRINGPARAM("code.bin") ); 787 788 uno::Reference< io::XStream > xCodeStream = xElementRootStorage->openStreamElement( 789 aCodeStreamName, 790 embed::ElementModes::WRITE | embed::ElementModes::TRUNCATE ); 791 792 SvMemoryStream aMemStream; 793 /*sal_Bool bStore = */pMod->StoreBinaryData( aMemStream ); 794 795 sal_Int32 nSize = (sal_Int32)aMemStream.Tell(); 796 Sequence< sal_Int8 > aBinSeq( nSize ); 797 sal_Int8* pData = aBinSeq.getArray(); 798 ::rtl_copyMemory( pData, aMemStream.GetData(), nSize ); 799 800 Reference< XOutputStream > xOut = xCodeStream->getOutputStream(); 801 if ( xOut.is() ) 802 { 803 xOut->writeBytes( aBinSeq ); 804 xOut->closeOutput(); 805 } 806 } 807 808 // Write encrypted source stream 809 OUString aSourceStreamName( RTL_CONSTASCII_USTRINGPARAM("source.xml") ); 810 811 uno::Reference< io::XStream > xSourceStream; 812 try 813 { 814 xSourceStream = xElementRootStorage->openStreamElement( 815 aSourceStreamName, 816 embed::ElementModes::WRITE | embed::ElementModes::TRUNCATE ); 817 818 // #87671 Allow encryption 819 uno::Reference< embed::XEncryptionProtectedSource > xEncr( xSourceStream, uno::UNO_QUERY ); 820 OSL_ENSURE( xEncr.is(), 821 "StorageStream opened for writing must implement XEncryptionProtectedSource!\n" ); 822 if ( !xEncr.is() ) 823 throw uno::RuntimeException(); 824 xEncr->setEncryptionPassword( pLib->maPassword ); 825 } 826 catch( ::com::sun::star::packages::WrongPasswordException& ) 827 { 828 xSourceStream = xElementRootStorage->openEncryptedStreamElement( 829 aSourceStreamName, 830 embed::ElementModes::WRITE | embed::ElementModes::TRUNCATE, 831 pLib->maPassword ); 832 } 833 834 uno::Reference< beans::XPropertySet > xProps( xSourceStream, uno::UNO_QUERY ); 835 if ( !xProps.is() ) 836 throw uno::RuntimeException(); 837 String aPropName( String::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM("MediaType") ) ); 838 OUString aMime( RTL_CONSTASCII_USTRINGPARAM("text/xml") ); 839 xProps->setPropertyValue( aPropName, uno::makeAny( aMime ) ); 840 841 Reference< XOutputStream > xOut = xSourceStream->getOutputStream(); 842 Reference< XNameContainer > xLib( pLib ); 843 writeLibraryElement( xLib, aElementName, xOut ); 844 // i50568: sax writer already closes stream 845 // xOut->closeOutput(); 846 847 uno::Reference< embed::XTransactedObject > xTransact( xElementRootStorage, uno::UNO_QUERY ); 848 OSL_ENSURE( xTransact.is(), "The storage must implement XTransactedObject!\n" ); 849 if ( !xTransact.is() ) 850 throw uno::RuntimeException(); 851 852 xTransact->commit(); 853 } 854 catch( uno::Exception& ) 855 { 856 // TODO: handle error 857 } 858 859 // Storage Dtor commits too, that makes problems 860 // xElementRootStorage->Commit(); 861 } 862 } 863 catch( Exception& ) 864 { 865 //throw e; 866 } 867 } 868 return sal_True; 869 } 870 871 sal_Bool SfxScriptLibraryContainer::implLoadPasswordLibrary 872 ( SfxLibrary* pLib, const OUString& Name, sal_Bool bVerifyPasswordOnly ) 873 throw(WrappedTargetException, RuntimeException) 874 { 875 sal_Bool bRet = sal_True; 876 877 sal_Bool bLink = pLib->mbLink; 878 sal_Bool bStorage = mxStorage.is() && !bLink; 879 880 // Already loaded? Then only verifiedPassword can change something 881 SfxScriptLibrary* pScriptLib = static_cast< SfxScriptLibrary* >( pLib ); 882 if( pScriptLib->mbLoaded ) 883 { 884 if( pScriptLib->mbLoadedBinary && !bVerifyPasswordOnly && 885 (pScriptLib->mbLoadedSource || !pLib->mbPasswordVerified) ) 886 return sal_False; 887 } 888 889 StarBASIC* pBasicLib = NULL; 890 sal_Bool bLoadBinary = sal_False; 891 if( !pScriptLib->mbLoadedBinary && !bVerifyPasswordOnly && !pLib->mbPasswordVerified ) 892 { 893 BasicManager* pBasicMgr = getBasicManager(); 894 OSL_ENSURE( pBasicMgr, "SfxScriptLibraryContainer::implLoadPasswordLibrary: cannot do this without a BasicManager!" ); 895 sal_Bool bLoaded = pScriptLib->mbLoaded; 896 pScriptLib->mbLoaded = sal_True; // Necessary to get lib 897 pBasicLib = pBasicMgr ? pBasicMgr->GetLib( Name ) : NULL; 898 pScriptLib->mbLoaded = bLoaded; // Restore flag 899 if( !pBasicLib ) 900 return sal_False; 901 902 bLoadBinary = sal_True; 903 pScriptLib->mbLoadedBinary = sal_True; 904 } 905 906 sal_Bool bLoadSource = sal_False; 907 if( !pScriptLib->mbLoadedSource && pLib->mbPasswordVerified && !bVerifyPasswordOnly ) 908 { 909 bLoadSource = sal_True; 910 pScriptLib->mbLoadedSource = sal_True; 911 } 912 913 Sequence< OUString > aElementNames = pLib->getElementNames(); 914 sal_Int32 nNameCount = aElementNames.getLength(); 915 const OUString* pNames = aElementNames.getConstArray(); 916 917 if( bStorage ) 918 { 919 uno::Reference< embed::XStorage > xLibrariesStor; 920 uno::Reference< embed::XStorage > xLibraryStor; 921 if( bStorage ) 922 { 923 try { 924 xLibrariesStor = mxStorage->openStorageElement( maLibrariesDir, embed::ElementModes::READ ); 925 if ( !xLibrariesStor.is() ) 926 throw uno::RuntimeException(); 927 928 xLibraryStor = xLibrariesStor->openStorageElement( Name, embed::ElementModes::READ ); 929 if ( !xLibraryStor.is() ) 930 throw uno::RuntimeException(); 931 } 932 catch( uno::Exception& ) 933 { 934 OSL_ENSURE( 0, "### couln't open sub storage for library\n" ); 935 return sal_False; 936 } 937 } 938 939 for( sal_Int32 i = 0 ; i < nNameCount ; i++ ) 940 { 941 OUString aElementName = pNames[ i ]; 942 943 // Load binary 944 if( bLoadBinary ) 945 { 946 SbModule* pMod = pBasicLib->FindModule( aElementName ); 947 if( !pMod ) 948 { 949 pMod = pBasicLib->MakeModule( aElementName, String() ); 950 pBasicLib->SetModified( sal_False ); 951 } 952 953 //OUString aCodeStreamName( RTL_CONSTASCII_USTRINGPARAM("code.bin") ); 954 OUString aCodeStreamName= aElementName; 955 aCodeStreamName += String( RTL_CONSTASCII_USTRINGPARAM(".bin") ); 956 957 try { 958 uno::Reference< io::XStream > xCodeStream = xLibraryStor->openStreamElement( 959 aCodeStreamName, 960 embed::ElementModes::READ ); 961 if ( !xCodeStream.is() ) 962 throw uno::RuntimeException(); 963 964 SvStream* pStream = ::utl::UcbStreamHelper::CreateStream( xCodeStream ); 965 if ( !pStream || pStream->GetError() ) 966 { 967 sal_Int32 nError = pStream ? pStream->GetError() : ERRCODE_IO_GENERAL; 968 delete pStream; 969 throw task::ErrorCodeIOException( ::rtl::OUString(), uno::Reference< uno::XInterface >(), nError ); 970 } 971 972 /*sal_Bool bRet = */pMod->LoadBinaryData( *pStream ); 973 // TODO: Check return value 974 975 delete pStream; 976 } 977 catch( uno::Exception& ) 978 { 979 // TODO: error handling 980 } 981 } 982 983 // Load source 984 if( bLoadSource || bVerifyPasswordOnly ) 985 { 986 // Access encrypted source stream 987 OUString aSourceStreamName = aElementName; 988 aSourceStreamName += String( RTL_CONSTASCII_USTRINGPARAM(".xml") ); 989 990 try { 991 uno::Reference< io::XStream > xSourceStream = xLibraryStor->openEncryptedStreamElement( 992 aSourceStreamName, 993 embed::ElementModes::READ, 994 pLib->maPassword ); 995 if ( !xSourceStream.is() ) 996 throw uno::RuntimeException(); 997 998 // if this point is reached then the password is correct 999 if ( !bVerifyPasswordOnly ) 1000 { 1001 uno::Reference< io::XInputStream > xInStream = xSourceStream->getInputStream(); 1002 if ( !xInStream.is() ) 1003 throw io::IOException(); // read access denied, seems to be impossible 1004 1005 Reference< XNameContainer > xLib( pLib ); 1006 Any aAny = importLibraryElement( xLib, 1007 aElementName, aSourceStreamName, 1008 xInStream ); 1009 if( pLib->hasByName( aElementName ) ) 1010 { 1011 if( aAny.hasValue() ) 1012 pLib->maNameContainer.replaceByName( aElementName, aAny ); 1013 } 1014 else 1015 { 1016 pLib->maNameContainer.insertByName( aElementName, aAny ); 1017 } 1018 } 1019 } 1020 catch( uno::Exception& ) 1021 { 1022 bRet = sal_False; 1023 } 1024 } 1025 } 1026 } 1027 else 1028 { 1029 try 1030 { 1031 OUString aLibDirPath = createAppLibraryFolder( pLib, Name ); 1032 1033 for( sal_Int32 i = 0 ; i < nNameCount ; i++ ) 1034 { 1035 OUString aElementName = pNames[ i ]; 1036 1037 INetURLObject aElementInetObj( aLibDirPath ); 1038 aElementInetObj.insertName( aElementName, sal_False, 1039 INetURLObject::LAST_SEGMENT, sal_True, INetURLObject::ENCODE_ALL ); 1040 aElementInetObj.setExtension( OUString( RTL_CONSTASCII_USTRINGPARAM("pba") ) ); 1041 String aElementPath = aElementInetObj.GetMainURL( INetURLObject::NO_DECODE ); 1042 1043 uno::Reference< embed::XStorage > xElementRootStorage; 1044 try { 1045 xElementRootStorage = ::comphelper::OStorageHelper::GetStorageFromURL( 1046 aElementPath, 1047 embed::ElementModes::READ ); 1048 } catch( uno::Exception& ) 1049 { 1050 // TODO: error handling 1051 } 1052 1053 if ( xElementRootStorage.is() ) 1054 { 1055 // Load binary 1056 if( bLoadBinary ) 1057 { 1058 SbModule* pMod = pBasicLib->FindModule( aElementName ); 1059 if( !pMod ) 1060 { 1061 pMod = pBasicLib->MakeModule( aElementName, String() ); 1062 pBasicLib->SetModified( sal_False ); 1063 } 1064 1065 try { 1066 OUString aCodeStreamName( RTL_CONSTASCII_USTRINGPARAM("code.bin") ); 1067 uno::Reference< io::XStream > xCodeStream = xElementRootStorage->openStreamElement( 1068 aCodeStreamName, 1069 embed::ElementModes::READ ); 1070 1071 SvStream* pStream = ::utl::UcbStreamHelper::CreateStream( xCodeStream ); 1072 if ( !pStream || pStream->GetError() ) 1073 { 1074 sal_Int32 nError = pStream ? pStream->GetError() : ERRCODE_IO_GENERAL; 1075 delete pStream; 1076 throw task::ErrorCodeIOException( ::rtl::OUString(), 1077 uno::Reference< uno::XInterface >(), 1078 nError ); 1079 } 1080 1081 /*sal_Bool bRet = */pMod->LoadBinaryData( *pStream ); 1082 // TODO: Check return value 1083 1084 delete pStream; 1085 } 1086 catch( uno::Exception& ) 1087 { 1088 // TODO: error handling 1089 } 1090 } 1091 1092 // Load source 1093 if( bLoadSource || bVerifyPasswordOnly ) 1094 { 1095 // Access encrypted source stream 1096 OUString aSourceStreamName( RTL_CONSTASCII_USTRINGPARAM("source.xml") ); 1097 try { 1098 uno::Reference< io::XStream > xSourceStream = xElementRootStorage->openEncryptedStreamElement( 1099 aSourceStreamName, 1100 embed::ElementModes::READ, 1101 pLib->maPassword ); 1102 if ( !xSourceStream.is() ) 1103 throw uno::RuntimeException(); 1104 1105 if ( !bVerifyPasswordOnly ) 1106 { 1107 uno::Reference< io::XInputStream > xInStream = xSourceStream->getInputStream(); 1108 if ( !xInStream.is() ) 1109 throw io::IOException(); // read access denied, seems to be impossible 1110 1111 Reference< XNameContainer > xLib( pLib ); 1112 Any aAny = importLibraryElement( xLib, 1113 aElementName, 1114 aSourceStreamName, 1115 xInStream ); 1116 if( pLib->hasByName( aElementName ) ) 1117 { 1118 if( aAny.hasValue() ) 1119 pLib->maNameContainer.replaceByName( aElementName, aAny ); 1120 } 1121 else 1122 { 1123 pLib->maNameContainer.insertByName( aElementName, aAny ); 1124 } 1125 } 1126 } 1127 catch ( uno::Exception& ) 1128 { 1129 bRet = sal_False; 1130 } 1131 } 1132 } 1133 } 1134 1135 } 1136 catch( Exception& ) 1137 { 1138 // TODO 1139 //throw e; 1140 } 1141 } 1142 1143 //REMOVE // If the password is verified the library must remain modified, because 1144 //REMOVE // otherwise for saving the storage would be copied and that doesn't work 1145 //REMOVE // with mtg's storages when the password is verified 1146 //REMOVE if( !pLib->mbPasswordVerified ) 1147 //REMOVE pLib->mbModified = sal_False; 1148 return bRet; 1149 } 1150 1151 1152 void SfxScriptLibraryContainer::onNewRootStorage() 1153 { 1154 } 1155 1156 //============================================================================ 1157 // Service 1158 void createRegistryInfo_SfxScriptLibraryContainer() 1159 { 1160 static OAutoRegistration< SfxScriptLibraryContainer > aAutoRegistration; 1161 } 1162 1163 ::rtl::OUString SAL_CALL SfxScriptLibraryContainer::getImplementationName( ) throw (RuntimeException) 1164 { 1165 return getImplementationName_static(); 1166 } 1167 1168 Sequence< ::rtl::OUString > SAL_CALL SfxScriptLibraryContainer::getSupportedServiceNames( ) throw (RuntimeException) 1169 { 1170 return getSupportedServiceNames_static(); 1171 } 1172 1173 Sequence< OUString > SfxScriptLibraryContainer::getSupportedServiceNames_static() 1174 { 1175 Sequence< OUString > aServiceNames( 2 ); 1176 aServiceNames[0] = OUString::createFromAscii( "com.sun.star.script.DocumentScriptLibraryContainer" ); 1177 // plus, for compatibility: 1178 aServiceNames[1] = OUString::createFromAscii( "com.sun.star.script.ScriptLibraryContainer" ); 1179 return aServiceNames; 1180 } 1181 1182 OUString SfxScriptLibraryContainer::getImplementationName_static() 1183 { 1184 static OUString aImplName; 1185 static sal_Bool bNeedsInit = sal_True; 1186 1187 MutexGuard aGuard( Mutex::getGlobalMutex() ); 1188 if( bNeedsInit ) 1189 { 1190 aImplName = OUString::createFromAscii( "com.sun.star.comp.sfx2.ScriptLibraryContainer" ); 1191 bNeedsInit = sal_False; 1192 } 1193 return aImplName; 1194 } 1195 1196 Reference< XInterface > SAL_CALL SfxScriptLibraryContainer::Create 1197 ( const Reference< XComponentContext >& ) 1198 throw( Exception ) 1199 { 1200 Reference< XInterface > xRet = 1201 static_cast< XInterface* >( static_cast< OWeakObject* >(new SfxScriptLibraryContainer()) ); 1202 return xRet; 1203 } 1204 1205 //============================================================================ 1206 // Implementation class SfxScriptLibrary 1207 1208 // Ctor 1209 SfxScriptLibrary::SfxScriptLibrary( ModifiableHelper& _rModifiable, 1210 const Reference< XMultiServiceFactory >& xMSF, 1211 const Reference< XSimpleFileAccess >& xSFI ) 1212 : SfxLibrary( _rModifiable, getCppuType( (const OUString *)0 ), xMSF, xSFI ) 1213 , mbLoadedSource( sal_False ) 1214 , mbLoadedBinary( sal_False ) 1215 { 1216 } 1217 1218 SfxScriptLibrary::SfxScriptLibrary( ModifiableHelper& _rModifiable, 1219 const Reference< XMultiServiceFactory >& xMSF, 1220 const Reference< XSimpleFileAccess >& xSFI, 1221 const OUString& aLibInfoFileURL, 1222 const OUString& aStorageURL, 1223 sal_Bool ReadOnly ) 1224 : SfxLibrary( _rModifiable, getCppuType( (const OUString *)0 ), xMSF, xSFI, 1225 aLibInfoFileURL, aStorageURL, ReadOnly) 1226 , mbLoadedSource( sal_False ) 1227 , mbLoadedBinary( sal_False ) 1228 { 1229 } 1230 1231 // Provide modify state including resources 1232 sal_Bool SfxScriptLibrary::isModified( void ) 1233 { 1234 return implIsModified(); // No resources 1235 } 1236 1237 void SfxScriptLibrary::storeResources( void ) 1238 { 1239 // No resources 1240 } 1241 1242 void SfxScriptLibrary::storeResourcesToURL( const ::rtl::OUString& URL, 1243 const Reference< task::XInteractionHandler >& Handler ) 1244 { 1245 (void)URL; 1246 (void)Handler; 1247 } 1248 1249 void SfxScriptLibrary::storeResourcesAsURL 1250 ( const ::rtl::OUString& URL, const ::rtl::OUString& NewName ) 1251 { 1252 (void)URL; 1253 (void)NewName; 1254 } 1255 1256 void SfxScriptLibrary::storeResourcesToStorage( const ::com::sun::star::uno::Reference 1257 < ::com::sun::star::embed::XStorage >& xStorage ) 1258 { 1259 // No resources 1260 (void)xStorage; 1261 } 1262 1263 bool SfxScriptLibrary::containsValidModule( const Any& aElement ) 1264 { 1265 OUString sModuleText; 1266 aElement >>= sModuleText; 1267 return ( sModuleText.getLength() > 0 ); 1268 } 1269 1270 bool SAL_CALL SfxScriptLibrary::isLibraryElementValid( ::com::sun::star::uno::Any aElement ) const 1271 { 1272 return SfxScriptLibrary::containsValidModule( aElement ); 1273 } 1274 1275 IMPLEMENT_FORWARD_XINTERFACE2( SfxScriptLibrary, SfxLibrary, SfxScriptLibrary_BASE ); 1276 IMPLEMENT_FORWARD_XTYPEPROVIDER2( SfxScriptLibrary, SfxLibrary, SfxScriptLibrary_BASE ); 1277 1278 script::ModuleInfo SAL_CALL 1279 SfxScriptLibrary::getModuleInfo( const ::rtl::OUString& ModuleName ) throw (NoSuchElementException, WrappedTargetException, RuntimeException) 1280 { 1281 if ( !hasModuleInfo( ModuleName ) ) 1282 throw NoSuchElementException(); 1283 return mModuleInfos[ ModuleName ]; 1284 } 1285 1286 sal_Bool SAL_CALL 1287 SfxScriptLibrary::hasModuleInfo( const ::rtl::OUString& ModuleName ) throw (RuntimeException) 1288 { 1289 sal_Bool bRes = sal_False; 1290 ModuleInfoMap::iterator it = mModuleInfos.find( ModuleName ); 1291 1292 if ( it != mModuleInfos.end() ) 1293 bRes = sal_True; 1294 1295 return bRes; 1296 } 1297 1298 void SAL_CALL SfxScriptLibrary::insertModuleInfo( const ::rtl::OUString& ModuleName, const script::ModuleInfo& ModuleInfo ) throw (IllegalArgumentException, ElementExistException, WrappedTargetException, RuntimeException) 1299 { 1300 if ( hasModuleInfo( ModuleName ) ) 1301 throw ElementExistException(); 1302 mModuleInfos[ ModuleName ] = ModuleInfo; 1303 } 1304 1305 void SAL_CALL SfxScriptLibrary::removeModuleInfo( const ::rtl::OUString& ModuleName ) throw (NoSuchElementException, WrappedTargetException, RuntimeException) 1306 { 1307 // #FIXME add NoSuchElementException to the spec 1308 if ( !hasModuleInfo( ModuleName ) ) 1309 throw NoSuchElementException(); 1310 mModuleInfos.erase( mModuleInfos.find( ModuleName ) ); 1311 } 1312 1313 1314 //============================================================================ 1315 1316 } // namespace basic 1317