1 /************************************************************************* 2 * 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * Copyright 2000, 2010 Oracle and/or its affiliates. 6 * 7 * OpenOffice.org - a multi-platform office productivity suite 8 * 9 * This file is part of OpenOffice.org. 10 * 11 * OpenOffice.org is free software: you can redistribute it and/or modify 12 * it under the terms of the GNU Lesser General Public License version 3 13 * only, as published by the Free Software Foundation. 14 * 15 * OpenOffice.org is distributed in the hope that it will be useful, 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 * GNU Lesser General Public License version 3 for more details 19 * (a copy is included in the LICENSE file that accompanied this code). 20 * 21 * You should have received a copy of the GNU Lesser General Public License 22 * version 3 along with OpenOffice.org. If not, see 23 * <http://www.openoffice.org/license.html> 24 * for a copy of the LGPLv3 License. 25 * 26 ************************************************************************/ 27 28 #ifndef BASIC_NAMECONTAINER_HXX 29 #define BASIC_NAMECONTAINER_HXX 30 31 #include <hash_map> 32 33 #include <com/sun/star/lang/XSingleServiceFactory.hpp> 34 #include <com/sun/star/uno/XComponentContext.hpp> 35 #include <com/sun/star/lang/XInitialization.hpp> 36 #include <com/sun/star/script/XStorageBasedLibraryContainer.hpp> 37 #include <com/sun/star/script/XLibraryContainerPassword.hpp> 38 #include <com/sun/star/script/XLibraryContainerExport.hpp> 39 #include <com/sun/star/script/XLibraryContainer3.hpp> 40 #include <com/sun/star/container/XNameContainer.hpp> 41 #include <com/sun/star/container/XContainer.hpp> 42 #include <com/sun/star/ucb/XSimpleFileAccess.hpp> 43 #include <com/sun/star/io/XOutputStream.hpp> 44 #include <com/sun/star/io/XInputStream.hpp> 45 #include <com/sun/star/util/XMacroExpander.hpp> 46 #include <com/sun/star/util/XStringSubstitution.hpp> 47 #include <com/sun/star/document/XStorageBasedDocument.hpp> 48 #include <com/sun/star/lang/XServiceInfo.hpp> 49 #include <com/sun/star/frame/XModel.hpp> 50 #include <com/sun/star/deployment/XPackage.hpp> 51 #include <com/sun/star/script/vba/XVBACompatibility.hpp> 52 #include <com/sun/star/script/vba/XVBAScriptListener.hpp> 53 #include <com/sun/star/util/XChangesNotifier.hpp> 54 55 #include <osl/mutex.hxx> 56 #include <unotools/eventlisteneradapter.hxx> 57 #include <cppuhelper/implbase3.hxx> 58 #include <cppuhelper/compbase8.hxx> 59 #include <cppuhelper/interfacecontainer.hxx> 60 #include <cppuhelper/weakref.hxx> 61 #include <cppuhelper/component.hxx> 62 #include <cppuhelper/typeprovider.hxx> 63 #include <cppuhelper/interfacecontainer.hxx> 64 #include <cppuhelper/basemutex.hxx> 65 #include <sot/storage.hxx> 66 #include <comphelper/listenernotification.hxx> 67 #include <xmlscript/xmllib_imexp.hxx> 68 69 class BasicManager; 70 71 namespace basic 72 { 73 74 //============================================================================ 75 76 typedef ::cppu::WeakImplHelper3< 77 ::com::sun::star::container::XNameContainer, 78 ::com::sun::star::container::XContainer, 79 ::com::sun::star::util::XChangesNotifier > NameContainer_BASE; 80 81 class NameContainer : public ::cppu::BaseMutex, public NameContainer_BASE 82 { 83 typedef std::hash_map< ::rtl::OUString, sal_Int32, ::rtl::OUStringHash > NameContainerNameMap; 84 85 NameContainerNameMap mHashMap; 86 ::com::sun::star::uno::Sequence< ::rtl::OUString > mNames; 87 ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any > mValues; 88 sal_Int32 mnElementCount; 89 90 ::com::sun::star::uno::Type mType; 91 ::com::sun::star::uno::XInterface* mpxEventSource; 92 93 ::cppu::OInterfaceContainerHelper maContainerListeners; 94 ::cppu::OInterfaceContainerHelper maChangesListeners; 95 96 public: 97 NameContainer( const ::com::sun::star::uno::Type& rType ) 98 : mnElementCount( 0 ) 99 , mType( rType ) 100 , mpxEventSource( NULL ) 101 , maContainerListeners( m_aMutex ) 102 , maChangesListeners( m_aMutex ) 103 {} 104 105 void setEventSource( ::com::sun::star::uno::XInterface* pxEventSource ) 106 { mpxEventSource = pxEventSource; } 107 108 // Methods XElementAccess 109 virtual ::com::sun::star::uno::Type SAL_CALL getElementType( ) 110 throw(::com::sun::star::uno::RuntimeException); 111 virtual sal_Bool SAL_CALL hasElements( ) 112 throw(::com::sun::star::uno::RuntimeException); 113 114 // Methods XNameAccess 115 virtual ::com::sun::star::uno::Any SAL_CALL getByName( const ::rtl::OUString& aName ) 116 throw(::com::sun::star::container::NoSuchElementException, 117 ::com::sun::star::lang::WrappedTargetException, 118 ::com::sun::star::uno::RuntimeException); 119 virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getElementNames( ) 120 throw(::com::sun::star::uno::RuntimeException); 121 virtual sal_Bool SAL_CALL hasByName( const ::rtl::OUString& aName ) 122 throw(::com::sun::star::uno::RuntimeException); 123 124 // Methods XNameReplace 125 virtual void SAL_CALL replaceByName( const ::rtl::OUString& aName, const ::com::sun::star::uno::Any& aElement ) 126 throw(::com::sun::star::lang::IllegalArgumentException, 127 ::com::sun::star::container::NoSuchElementException, 128 ::com::sun::star::lang::WrappedTargetException, 129 ::com::sun::star::uno::RuntimeException); 130 131 // Methods XNameContainer 132 virtual void SAL_CALL insertByName( const ::rtl::OUString& aName, const ::com::sun::star::uno::Any& aElement ) 133 throw(::com::sun::star::lang::IllegalArgumentException, 134 ::com::sun::star::container::ElementExistException, 135 ::com::sun::star::lang::WrappedTargetException, 136 ::com::sun::star::uno::RuntimeException); 137 virtual void SAL_CALL removeByName( const ::rtl::OUString& Name ) 138 throw(::com::sun::star::container::NoSuchElementException, 139 ::com::sun::star::lang::WrappedTargetException, 140 ::com::sun::star::uno::RuntimeException); 141 142 // Methods XContainer 143 virtual void SAL_CALL addContainerListener( const ::com::sun::star::uno::Reference< 144 ::com::sun::star::container::XContainerListener >& xListener ) 145 throw (::com::sun::star::uno::RuntimeException); 146 virtual void SAL_CALL removeContainerListener( const ::com::sun::star::uno::Reference< 147 ::com::sun::star::container::XContainerListener >& xListener ) 148 throw (::com::sun::star::uno::RuntimeException); 149 150 // Methods XChangesNotifier 151 virtual void SAL_CALL addChangesListener( const ::com::sun::star::uno::Reference< 152 ::com::sun::star::util::XChangesListener >& xListener ) 153 throw (::com::sun::star::uno::RuntimeException); 154 virtual void SAL_CALL removeChangesListener( const ::com::sun::star::uno::Reference< 155 ::com::sun::star::util::XChangesListener >& xListener ) 156 throw (::com::sun::star::uno::RuntimeException); 157 }; 158 159 //============================================================================ 160 161 class ModifiableHelper 162 { 163 private: 164 ::cppu::OInterfaceContainerHelper m_aModifyListeners; 165 ::cppu::OWeakObject& m_rEventSource; 166 sal_Bool mbModified; 167 168 public: 169 ModifiableHelper( ::cppu::OWeakObject& _rEventSource, ::osl::Mutex& _rMutex ) 170 :m_aModifyListeners( _rMutex ) 171 ,m_rEventSource( _rEventSource ) 172 ,mbModified( sal_False ) 173 { 174 } 175 176 inline sal_Bool isModified() const { return mbModified; } 177 void setModified( sal_Bool _bModified ); 178 179 inline void addModifyListener( const ::com::sun::star::uno::Reference< ::com::sun::star::util::XModifyListener >& _rxListener ) 180 { 181 m_aModifyListeners.addInterface( _rxListener ); 182 } 183 184 inline void removeModifyListener( const ::com::sun::star::uno::Reference< ::com::sun::star::util::XModifyListener >& _rxListener ) 185 { 186 m_aModifyListeners.removeInterface( _rxListener ); 187 } 188 }; 189 190 //============================================================================ 191 192 typedef ::comphelper::OListenerContainerBase< 193 ::com::sun::star::script::vba::XVBAScriptListener, 194 ::com::sun::star::script::vba::VBAScriptEvent > VBAScriptListenerContainer_BASE; 195 196 class VBAScriptListenerContainer : public VBAScriptListenerContainer_BASE 197 { 198 public: 199 explicit VBAScriptListenerContainer( ::osl::Mutex& rMutex ); 200 201 private: 202 virtual bool implTypedNotify( 203 const ::com::sun::star::uno::Reference< ::com::sun::star::script::vba::XVBAScriptListener >& rxListener, 204 const ::com::sun::star::script::vba::VBAScriptEvent& rEvent ) 205 throw (::com::sun::star::uno::Exception); 206 }; 207 208 //============================================================================ 209 210 class SfxLibrary; 211 212 typedef ::cppu::WeakComponentImplHelper8< 213 ::com::sun::star::lang::XInitialization, 214 ::com::sun::star::script::XStorageBasedLibraryContainer, 215 ::com::sun::star::script::XLibraryContainerPassword, 216 ::com::sun::star::script::XLibraryContainerExport, 217 ::com::sun::star::script::XLibraryContainer3, 218 ::com::sun::star::container::XContainer, 219 ::com::sun::star::script::vba::XVBACompatibility, 220 ::com::sun::star::lang::XServiceInfo > SfxLibraryContainer_BASE; 221 222 class SfxLibraryContainer : public SfxLibraryContainer_BASE, public ::utl::OEventListenerAdapter 223 { 224 VBAScriptListenerContainer maVBAScriptListeners; 225 sal_Int32 mnRunningVBAScripts; 226 sal_Bool mbVBACompat; 227 protected: 228 ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > mxMSF; 229 ::com::sun::star::uno::Reference< ::com::sun::star::ucb::XSimpleFileAccess > mxSFI; 230 ::com::sun::star::uno::Reference< ::com::sun::star::util::XMacroExpander > mxMacroExpander; 231 ::com::sun::star::uno::Reference< ::com::sun::star::util::XStringSubstitution > mxStringSubstitution; 232 ::com::sun::star::uno::WeakReference< ::com::sun::star::frame::XModel > mxOwnerDocument; 233 234 ::osl::Mutex maMutex; 235 ModifiableHelper maModifiable; 236 237 NameContainer maNameContainer; 238 sal_Bool mbOldInfoFormat; 239 sal_Bool mbOasis2OOoFormat; 240 241 ::rtl::OUString maInitialDocumentURL; 242 ::rtl::OUString maInfoFileName; 243 ::rtl::OUString maOldInfoFileName; 244 ::rtl::OUString maLibElementFileExtension; 245 ::rtl::OUString maLibraryPath; 246 ::rtl::OUString maLibrariesDir; 247 248 ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage > mxStorage; 249 BasicManager* mpBasMgr; 250 sal_Bool mbOwnBasMgr; 251 252 enum InitMode 253 { 254 DEFAULT, 255 CONTAINER_INIT_FILE, 256 LIBRARY_INIT_FILE, 257 OFFICE_DOCUMENT, 258 OLD_BASIC_STORAGE 259 } meInitMode; 260 261 void implStoreLibrary( SfxLibrary* pLib, 262 const ::rtl::OUString& aName, 263 const ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage >& xStorage ); 264 265 // New variant for library export 266 void implStoreLibrary( SfxLibrary* pLib, 267 const ::rtl::OUString& aName, 268 const ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage >& xStorage, 269 const ::rtl::OUString& aTargetURL, 270 const ::com::sun::star::uno::Reference< ::com::sun::star::ucb::XSimpleFileAccess > xToUseSFI, 271 const ::com::sun::star::uno::Reference< ::com::sun::star::task::XInteractionHandler >& xHandler ); 272 273 void implStoreLibraryIndexFile( SfxLibrary* pLib, const ::xmlscript::LibDescriptor& rLib, 274 const ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage >& xStorage ); 275 276 // New variant for library export 277 void implStoreLibraryIndexFile( SfxLibrary* pLib, const ::xmlscript::LibDescriptor& rLib, 278 const ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage >& xStorage, 279 const ::rtl::OUString& aTargetURL, 280 const ::com::sun::star::uno::Reference< ::com::sun::star::ucb::XSimpleFileAccess > xToUseSFI ); 281 282 sal_Bool implLoadLibraryIndexFile( SfxLibrary* pLib, 283 ::xmlscript::LibDescriptor& rLib, 284 const ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage >& xStorage, 285 const ::rtl::OUString& aIndexFileName ); 286 287 void implImportLibDescriptor( SfxLibrary* pLib, ::xmlscript::LibDescriptor& rLib ); 288 289 // Methods to distinguish between deffirent library types 290 virtual SfxLibrary* SAL_CALL implCreateLibrary( const ::rtl::OUString& aName ) = 0; 291 virtual SfxLibrary* SAL_CALL implCreateLibraryLink 292 ( const ::rtl::OUString& aName, const ::rtl::OUString& aLibInfoFileURL, 293 const ::rtl::OUString& StorageURL, sal_Bool ReadOnly ) = 0; 294 virtual ::com::sun::star::uno::Any SAL_CALL createEmptyLibraryElement( void ) = 0; 295 virtual bool SAL_CALL isLibraryElementValid( ::com::sun::star::uno::Any aElement ) const = 0; 296 virtual void SAL_CALL writeLibraryElement 297 ( 298 const ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameContainer>& xLibrary, 299 const ::rtl::OUString& aElementName, 300 const ::com::sun::star::uno::Reference< ::com::sun::star::io::XOutputStream >& xOutput 301 ) 302 throw(::com::sun::star::uno::Exception) = 0; 303 304 virtual ::com::sun::star::uno::Any SAL_CALL importLibraryElement 305 ( 306 const ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameContainer>& xLibrary, 307 const ::rtl::OUString& aElementName, 308 const ::rtl::OUString& aFile, 309 const ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream >& xElementStream ) = 0; 310 virtual void SAL_CALL importFromOldStorage( const ::rtl::OUString& aFile ) = 0; 311 312 // Password encryption 313 virtual sal_Bool implStorePasswordLibrary( SfxLibrary* pLib, const ::rtl::OUString& aName, 314 const ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage >& xStorage, const ::com::sun::star::uno::Reference< ::com::sun::star::task::XInteractionHandler >& Handler ); 315 316 // New variant for library export 317 virtual sal_Bool implStorePasswordLibrary( SfxLibrary* pLib, const ::rtl::OUString& aName, 318 const ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage >& xStorage, 319 const ::rtl::OUString& aTargetURL, 320 const ::com::sun::star::uno::Reference< ::com::sun::star::ucb::XSimpleFileAccess > xToUseSFI, const ::com::sun::star::uno::Reference< ::com::sun::star::task::XInteractionHandler >& Handler ); 321 322 virtual sal_Bool implLoadPasswordLibrary( SfxLibrary* pLib, const ::rtl::OUString& Name, 323 sal_Bool bVerifyPasswordOnly=false ) 324 throw(::com::sun::star::lang::WrappedTargetException, 325 ::com::sun::star::uno::RuntimeException); 326 327 virtual void onNewRootStorage() = 0; 328 329 330 // #56666, Creates another library container 331 // instance of the same derived class 332 virtual SfxLibraryContainer* createInstanceImpl( void ) = 0; 333 334 335 // Interface to get the BasicManager (Hack for password implementation) 336 BasicManager* getBasicManager( void ); 337 ::rtl::OUString createAppLibraryFolder( SfxLibrary* pLib, const ::rtl::OUString& aName ); 338 339 sal_Bool init( const ::rtl::OUString& rInitialDocumentURL, 340 const ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage >& _rxInitialStorage ); 341 342 virtual const sal_Char* SAL_CALL getInfoFileName() const = 0; 343 virtual const sal_Char* SAL_CALL getOldInfoFileName() const = 0; 344 virtual const sal_Char* SAL_CALL getLibElementFileExtension() const = 0; 345 virtual const sal_Char* SAL_CALL getLibrariesDir() const = 0; 346 347 // Handle maLibInfoFileURL and maStorageURL correctly 348 void checkStorageURL 349 ( 350 const ::rtl::OUString& aSourceURL, 351 ::rtl::OUString& aLibInfoFileURL, 352 ::rtl::OUString& aStorageURL, 353 ::rtl::OUString& aUnexpandedStorageURL 354 ); 355 ::rtl::OUString expand_url( const ::rtl::OUString& url ) 356 throw(::com::sun::star::uno::RuntimeException); 357 358 SfxLibrary* getImplLib( const String& rLibraryName ); 359 360 void storeLibraries_Impl( 361 const ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage >& xStorage, 362 sal_Bool bComplete ); 363 364 void SAL_CALL initializeFromDocumentURL( const ::rtl::OUString& _rInitialDocumentURL ); 365 void SAL_CALL initializeFromDocument( const ::com::sun::star::uno::Reference< ::com::sun::star::document::XStorageBasedDocument >& _rxDocument ); 366 367 // OEventListenerAdapter 368 virtual void _disposing( const ::com::sun::star::lang::EventObject& _rSource ); 369 370 // OComponentHelper 371 virtual void SAL_CALL disposing(); 372 373 private: 374 sal_Bool init_Impl( const ::rtl::OUString& rInitialDocumentURL, 375 const ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage >& _rxInitialStorage ); 376 void implScanExtensions( void ); 377 378 public: 379 SfxLibraryContainer( void ); 380 ~SfxLibraryContainer(); 381 382 383 // Interface to set the BasicManager (Hack for password implementation) 384 void setBasicManager( BasicManager* pBasMgr ) 385 { 386 mpBasMgr = pBasMgr; 387 } 388 389 void enterMethod(); 390 void leaveMethod(); 391 bool isDisposed() const { return rBHelper.bInDispose || rBHelper.bDisposed; } 392 void checkDisposed() const; 393 394 // Methods XElementAccess 395 virtual ::com::sun::star::uno::Type SAL_CALL getElementType() 396 throw(::com::sun::star::uno::RuntimeException); 397 virtual sal_Bool SAL_CALL hasElements() 398 throw(::com::sun::star::uno::RuntimeException); 399 400 // Methods XNameAccess 401 virtual ::com::sun::star::uno::Any SAL_CALL getByName( const ::rtl::OUString& aName ) 402 throw(::com::sun::star::container::NoSuchElementException, 403 ::com::sun::star::lang::WrappedTargetException, 404 ::com::sun::star::uno::RuntimeException); 405 virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getElementNames() 406 throw(::com::sun::star::uno::RuntimeException); 407 virtual sal_Bool SAL_CALL hasByName( const ::rtl::OUString& aName ) 408 throw(::com::sun::star::uno::RuntimeException); 409 410 // Members XStorageBasedLibraryContainer 411 virtual ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage > SAL_CALL getRootStorage() throw (::com::sun::star::uno::RuntimeException); 412 virtual void SAL_CALL setRootStorage( const ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage >& _rootstorage ) throw (::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException); 413 virtual void SAL_CALL storeLibrariesToStorage( const ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage >& RootStorage ) throw (::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException); 414 415 // Methods XModifiable (base of XPersistentLibraryContainer) 416 virtual ::sal_Bool SAL_CALL isModified( ) throw (::com::sun::star::uno::RuntimeException); 417 virtual void SAL_CALL setModified( ::sal_Bool bModified ) throw (::com::sun::star::beans::PropertyVetoException, ::com::sun::star::uno::RuntimeException); 418 virtual void SAL_CALL addModifyListener( const ::com::sun::star::uno::Reference< ::com::sun::star::util::XModifyListener >& aListener ) throw (::com::sun::star::uno::RuntimeException); 419 virtual void SAL_CALL removeModifyListener( const ::com::sun::star::uno::Reference< ::com::sun::star::util::XModifyListener >& aListener ) throw (::com::sun::star::uno::RuntimeException); 420 421 // Methods XPersistentLibraryContainer (base of XStorageBasedLibraryContainer) 422 virtual ::com::sun::star::uno::Any SAL_CALL getRootLocation() throw (::com::sun::star::uno::RuntimeException); 423 virtual ::rtl::OUString SAL_CALL getContainerLocationName() throw (::com::sun::star::uno::RuntimeException); 424 virtual void SAL_CALL storeLibraries( ) throw (::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException); 425 426 //Methods XLibraryContainer3 427 virtual ::rtl::OUString SAL_CALL getOriginalLibraryLinkURL( const ::rtl::OUString& Name ) 428 throw (::com::sun::star::lang::IllegalArgumentException, 429 ::com::sun::star::container::NoSuchElementException, 430 ::com::sun::star::uno::RuntimeException); 431 432 // Methods XLibraryContainer2 (base of XPersistentLibraryContainer) 433 virtual sal_Bool SAL_CALL isLibraryLink( const ::rtl::OUString& Name ) 434 throw (::com::sun::star::container::NoSuchElementException, 435 ::com::sun::star::uno::RuntimeException); 436 virtual ::rtl::OUString SAL_CALL getLibraryLinkURL( const ::rtl::OUString& Name ) 437 throw (::com::sun::star::lang::IllegalArgumentException, 438 ::com::sun::star::container::NoSuchElementException, 439 ::com::sun::star::uno::RuntimeException); 440 virtual sal_Bool SAL_CALL isLibraryReadOnly( const ::rtl::OUString& Name ) 441 throw (::com::sun::star::container::NoSuchElementException, 442 ::com::sun::star::uno::RuntimeException); 443 virtual void SAL_CALL setLibraryReadOnly( const ::rtl::OUString& Name, sal_Bool bReadOnly ) 444 throw (::com::sun::star::container::NoSuchElementException, 445 ::com::sun::star::uno::RuntimeException); 446 virtual void SAL_CALL renameLibrary( const ::rtl::OUString& Name, const ::rtl::OUString& NewName ) 447 throw (::com::sun::star::container::NoSuchElementException, 448 ::com::sun::star::container::ElementExistException, 449 ::com::sun::star::uno::RuntimeException); 450 451 // Methods XLibraryContainer (base of XLibraryContainer2) 452 virtual ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameContainer > SAL_CALL 453 createLibrary( const ::rtl::OUString& Name ) 454 throw(::com::sun::star::lang::IllegalArgumentException, 455 ::com::sun::star::container::ElementExistException, 456 ::com::sun::star::uno::RuntimeException); 457 virtual ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess > SAL_CALL createLibraryLink 458 ( const ::rtl::OUString& Name, const ::rtl::OUString& StorageURL, sal_Bool ReadOnly ) 459 throw(::com::sun::star::lang::IllegalArgumentException, 460 ::com::sun::star::container::ElementExistException, 461 ::com::sun::star::uno::RuntimeException); 462 virtual void SAL_CALL removeLibrary( const ::rtl::OUString& Name ) 463 throw(::com::sun::star::container::NoSuchElementException, 464 ::com::sun::star::lang::WrappedTargetException, 465 ::com::sun::star::uno::RuntimeException); 466 virtual sal_Bool SAL_CALL isLibraryLoaded( const ::rtl::OUString& Name ) 467 throw(::com::sun::star::container::NoSuchElementException, 468 ::com::sun::star::uno::RuntimeException); 469 virtual void SAL_CALL loadLibrary( const ::rtl::OUString& Name ) 470 throw(::com::sun::star::container::NoSuchElementException, 471 ::com::sun::star::lang::WrappedTargetException, 472 ::com::sun::star::uno::RuntimeException); 473 474 // Methods XInitialization 475 virtual void SAL_CALL initialize( const ::com::sun::star::uno::Sequence< 476 ::com::sun::star::uno::Any >& aArguments ) 477 throw (::com::sun::star::uno::Exception, 478 ::com::sun::star::uno::RuntimeException); 479 480 // Methods XLibraryContainerPassword 481 virtual sal_Bool SAL_CALL isLibraryPasswordProtected( const ::rtl::OUString& Name ) 482 throw (::com::sun::star::container::NoSuchElementException, 483 ::com::sun::star::uno::RuntimeException); 484 virtual sal_Bool SAL_CALL isLibraryPasswordVerified( const ::rtl::OUString& Name ) 485 throw (::com::sun::star::lang::IllegalArgumentException, 486 ::com::sun::star::container::NoSuchElementException, 487 ::com::sun::star::uno::RuntimeException); 488 virtual sal_Bool SAL_CALL verifyLibraryPassword( const ::rtl::OUString& Name, const ::rtl::OUString& Password ) 489 throw (::com::sun::star::lang::IllegalArgumentException, 490 ::com::sun::star::container::NoSuchElementException, 491 ::com::sun::star::uno::RuntimeException); 492 virtual void SAL_CALL changeLibraryPassword( const ::rtl::OUString& Name, 493 const ::rtl::OUString& OldPassword, const ::rtl::OUString& NewPassword ) 494 throw (::com::sun::star::lang::IllegalArgumentException, 495 ::com::sun::star::container::NoSuchElementException, 496 ::com::sun::star::uno::RuntimeException); 497 498 // Methods XContainer 499 virtual void SAL_CALL addContainerListener( const ::com::sun::star::uno::Reference< 500 ::com::sun::star::container::XContainerListener >& xListener ) 501 throw (::com::sun::star::uno::RuntimeException); 502 virtual void SAL_CALL removeContainerListener( const ::com::sun::star::uno::Reference< 503 ::com::sun::star::container::XContainerListener >& xListener ) 504 throw (::com::sun::star::uno::RuntimeException); 505 506 // Methods XLibraryContainerExport 507 virtual void SAL_CALL exportLibrary( const ::rtl::OUString& Name, const ::rtl::OUString& URL, 508 const ::com::sun::star::uno::Reference< ::com::sun::star::task::XInteractionHandler >& Handler ) 509 throw (::com::sun::star::uno::Exception, 510 ::com::sun::star::container::NoSuchElementException, 511 ::com::sun::star::uno::RuntimeException); 512 513 // Methods XServiceInfo 514 virtual ::rtl::OUString SAL_CALL getImplementationName( ) 515 throw (::com::sun::star::uno::RuntimeException) = 0; 516 virtual ::sal_Bool SAL_CALL supportsService( const ::rtl::OUString& ServiceName ) 517 throw (::com::sun::star::uno::RuntimeException); 518 virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames( ) 519 throw (::com::sun::star::uno::RuntimeException) = 0; 520 // Methods XVBACompatibility 521 virtual ::sal_Bool SAL_CALL getVBACompatibilityMode() 522 throw (::com::sun::star::uno::RuntimeException); 523 virtual void SAL_CALL setVBACompatibilityMode( ::sal_Bool _vbacompatmodeon ) 524 throw (::com::sun::star::uno::RuntimeException); 525 virtual sal_Int32 SAL_CALL getRunningVBAScripts() 526 throw (::com::sun::star::uno::RuntimeException); 527 virtual void SAL_CALL addVBAScriptListener( 528 const ::com::sun::star::uno::Reference< ::com::sun::star::script::vba::XVBAScriptListener >& Listener ) 529 throw (::com::sun::star::uno::RuntimeException); 530 virtual void SAL_CALL removeVBAScriptListener( 531 const ::com::sun::star::uno::Reference< ::com::sun::star::script::vba::XVBAScriptListener >& Listener ) 532 throw (::com::sun::star::uno::RuntimeException); 533 virtual void SAL_CALL broadcastVBAScriptEvent( sal_Int32 nIdentifier, const ::rtl::OUString& rModuleName ) 534 throw (::com::sun::star::uno::RuntimeException); 535 }; 536 537 //============================================================================ 538 539 class LibraryContainerMethodGuard 540 { 541 private: 542 SfxLibraryContainer& m_rContainer; 543 public: 544 LibraryContainerMethodGuard( SfxLibraryContainer& _rContainer ) 545 :m_rContainer( _rContainer ) 546 { 547 m_rContainer.enterMethod(); 548 } 549 550 ~LibraryContainerMethodGuard() 551 { 552 m_rContainer.leaveMethod(); 553 } 554 }; 555 556 //============================================================================ 557 558 class SfxLibrary 559 : public ::com::sun::star::container::XNameContainer 560 , public ::com::sun::star::container::XContainer 561 , public ::com::sun::star::util::XChangesNotifier 562 , public ::cppu::BaseMutex 563 , public ::cppu::OComponentHelper 564 { 565 friend class SfxLibraryContainer; 566 friend class SfxDialogLibraryContainer; 567 friend class SfxScriptLibraryContainer; 568 569 ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > mxMSF; 570 ::com::sun::star::uno::Reference< ::com::sun::star::ucb::XSimpleFileAccess > mxSFI; 571 572 ModifiableHelper& mrModifiable; 573 NameContainer maNameContainer; 574 575 sal_Bool mbLoaded; 576 sal_Bool mbIsModified; 577 sal_Bool mbInitialised; 578 579 private: 580 581 ::rtl::OUString maLibElementFileExtension; 582 ::rtl::OUString maLibInfoFileURL; 583 ::rtl::OUString maStorageURL; 584 ::rtl::OUString maUnexpandedStorageURL; 585 ::rtl::OUString maOrignialStorageURL; 586 587 sal_Bool mbLink; 588 sal_Bool mbReadOnly; 589 sal_Bool mbReadOnlyLink; 590 sal_Bool mbPreload; 591 592 sal_Bool mbPasswordProtected; 593 sal_Bool mbPasswordVerified; 594 sal_Bool mbDoc50Password; 595 ::rtl::OUString maPassword; 596 597 sal_Bool mbSharedIndexFile; 598 sal_Bool mbExtension; 599 600 // Additional functionality for localisation 601 // Provide modify state including resources 602 virtual sal_Bool isModified( void ) = 0; 603 virtual void storeResources( void ) = 0; 604 virtual void storeResourcesAsURL( const ::rtl::OUString& URL, const ::rtl::OUString& NewName ) = 0; 605 virtual void storeResourcesToURL( const ::rtl::OUString& URL, 606 const ::com::sun::star::uno::Reference< ::com::sun::star::task::XInteractionHandler >& xHandler ) = 0; 607 virtual void storeResourcesToStorage( const ::com::sun::star::uno::Reference 608 < ::com::sun::star::embed::XStorage >& xStorage ) = 0; 609 610 protected: 611 inline sal_Bool implIsModified() const { return mbIsModified; } 612 void implSetModified( sal_Bool _bIsModified ); 613 614 private: 615 /** checks whether the lib is readonly, or a readonly link, throws an IllegalArgumentException if so 616 */ 617 void impl_checkReadOnly(); 618 /** checks whether the library is loaded, throws a LibraryNotLoadedException (wrapped in a WrappedTargetException), 619 if not. 620 */ 621 void impl_checkLoaded(); 622 623 private: 624 void impl_removeWithoutChecks( const ::rtl::OUString& _rElementName ); 625 626 public: 627 SfxLibrary( 628 ModifiableHelper& _rModifiable, 629 const ::com::sun::star::uno::Type& aType, 630 const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& xMSF, 631 const ::com::sun::star::uno::Reference< ::com::sun::star::ucb::XSimpleFileAccess >& xSFI 632 ); 633 SfxLibrary( 634 ModifiableHelper& _rModifiable, 635 const ::com::sun::star::uno::Type& aType, 636 const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& xMSF, 637 const ::com::sun::star::uno::Reference< ::com::sun::star::ucb::XSimpleFileAccess >& xSFI, 638 const ::rtl::OUString& aLibInfoFileURL, 639 const ::rtl::OUString& 640 aStorageURL, 641 sal_Bool ReadOnly 642 ); 643 644 // Methods XInterface 645 virtual ::com::sun::star::uno::Any SAL_CALL queryInterface( const ::com::sun::star::uno::Type& rType ) throw( ::com::sun::star::uno::RuntimeException ); 646 virtual void SAL_CALL acquire() throw() { OComponentHelper::acquire(); } 647 virtual void SAL_CALL release() throw() { OComponentHelper::release(); } 648 649 // Methods XElementAccess 650 virtual ::com::sun::star::uno::Type SAL_CALL getElementType( ) 651 throw(::com::sun::star::uno::RuntimeException); 652 virtual sal_Bool SAL_CALL hasElements( ) 653 throw(::com::sun::star::uno::RuntimeException); 654 655 // Methods XNameAccess 656 virtual ::com::sun::star::uno::Any SAL_CALL getByName( const ::rtl::OUString& aName ) 657 throw(::com::sun::star::container::NoSuchElementException, 658 ::com::sun::star::lang::WrappedTargetException, 659 ::com::sun::star::uno::RuntimeException); 660 virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getElementNames( ) 661 throw(::com::sun::star::uno::RuntimeException); 662 virtual sal_Bool SAL_CALL hasByName( const ::rtl::OUString& aName ) 663 throw(::com::sun::star::uno::RuntimeException); 664 665 // Methods XNameReplace 666 virtual void SAL_CALL replaceByName( const ::rtl::OUString& aName, const ::com::sun::star::uno::Any& aElement ) 667 throw(::com::sun::star::lang::IllegalArgumentException, 668 ::com::sun::star::container::NoSuchElementException, 669 ::com::sun::star::lang::WrappedTargetException, 670 ::com::sun::star::uno::RuntimeException); 671 672 // Methods XNameContainer 673 virtual void SAL_CALL insertByName( const ::rtl::OUString& aName, const ::com::sun::star::uno::Any& aElement ) 674 throw(::com::sun::star::lang::IllegalArgumentException, 675 ::com::sun::star::container::ElementExistException, 676 ::com::sun::star::lang::WrappedTargetException, 677 ::com::sun::star::uno::RuntimeException); 678 virtual void SAL_CALL removeByName( const ::rtl::OUString& Name ) 679 throw(::com::sun::star::container::NoSuchElementException, 680 ::com::sun::star::lang::WrappedTargetException, 681 ::com::sun::star::uno::RuntimeException); 682 683 // XTypeProvider 684 ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > SAL_CALL getTypes( ) 685 throw( ::com::sun::star::uno::RuntimeException ); 686 ::com::sun::star::uno::Sequence<sal_Int8> SAL_CALL getImplementationId( ) 687 throw( ::com::sun::star::uno::RuntimeException ); 688 689 // Methods XContainer 690 virtual void SAL_CALL addContainerListener( const ::com::sun::star::uno::Reference< 691 ::com::sun::star::container::XContainerListener >& xListener ) 692 throw (::com::sun::star::uno::RuntimeException); 693 virtual void SAL_CALL removeContainerListener( const ::com::sun::star::uno::Reference< 694 ::com::sun::star::container::XContainerListener >& xListener ) 695 throw (::com::sun::star::uno::RuntimeException); 696 697 // Methods XChangesNotifier 698 virtual void SAL_CALL addChangesListener( const ::com::sun::star::uno::Reference< 699 ::com::sun::star::util::XChangesListener >& xListener ) 700 throw (::com::sun::star::uno::RuntimeException); 701 virtual void SAL_CALL removeChangesListener( const ::com::sun::star::uno::Reference< 702 ::com::sun::star::util::XChangesListener >& xListener ) 703 throw (::com::sun::star::uno::RuntimeException); 704 705 public: 706 struct LibraryContainerAccess { friend class SfxLibraryContainer; private: LibraryContainerAccess() { } }; 707 void removeElementWithoutChecks( const ::rtl::OUString& _rElementName, LibraryContainerAccess ) 708 { 709 impl_removeWithoutChecks( _rElementName ); 710 } 711 712 protected: 713 virtual bool SAL_CALL isLibraryElementValid( ::com::sun::star::uno::Any aElement ) const = 0; 714 }; 715 716 //============================================================================ 717 718 class ScriptSubPackageIterator 719 { 720 com::sun::star::uno::Reference< com::sun::star::deployment::XPackage > m_xMainPackage; 721 722 bool m_bIsValid; 723 bool m_bIsBundle; 724 725 com::sun::star::uno::Sequence< com::sun::star::uno::Reference 726 < com::sun::star::deployment::XPackage > > m_aSubPkgSeq; 727 sal_Int32 m_nSubPkgCount; 728 sal_Int32 m_iNextSubPkg; 729 730 com::sun::star::uno::Reference< com::sun::star::deployment::XPackage > 731 implDetectScriptPackage( const com::sun::star::uno::Reference 732 < com::sun::star::deployment::XPackage > xPackage, bool& rbPureDialogLib ); 733 734 public: 735 ScriptSubPackageIterator( com::sun::star::uno::Reference< com::sun::star::deployment::XPackage > xMainPackage ); 736 737 com::sun::star::uno::Reference< com::sun::star::deployment::XPackage > getNextScriptSubPackage( bool& rbPureDialogLib ); 738 }; 739 740 //============================================================================ 741 742 class ScriptExtensionIterator 743 { 744 public: 745 ScriptExtensionIterator( void ); 746 rtl::OUString nextBasicOrDialogLibrary( bool& rbPureDialogLib ); 747 748 private: 749 com::sun::star::uno::Reference< com::sun::star::deployment::XPackage > implGetScriptPackageFromPackage 750 ( const com::sun::star::uno::Reference< com::sun::star::deployment::XPackage > xPackage, 751 bool& rbPureDialogLib ); 752 753 protected: 754 com::sun::star::uno::Reference< com::sun::star::deployment::XPackage > 755 implGetNextUserScriptPackage( bool& rbPureDialogLib ); 756 com::sun::star::uno::Reference< com::sun::star::deployment::XPackage > 757 implGetNextSharedScriptPackage( bool& rbPureDialogLib ); 758 com::sun::star::uno::Reference< com::sun::star::deployment::XPackage > 759 implGetNextBundledScriptPackage( bool& rbPureDialogLib ); 760 761 com::sun::star::uno::Reference< com::sun::star::uno::XComponentContext > m_xContext; 762 763 enum IteratorState 764 { 765 USER_EXTENSIONS, 766 SHARED_EXTENSIONS, 767 BUNDLED_EXTENSIONS, 768 END_REACHED 769 } m_eState; 770 771 com::sun::star::uno::Sequence< com::sun::star::uno::Reference 772 < com::sun::star::deployment::XPackage > > m_aUserPackagesSeq; 773 bool m_bUserPackagesLoaded; 774 775 com::sun::star::uno::Sequence< com::sun::star::uno::Reference 776 < com::sun::star::deployment::XPackage > > m_aSharedPackagesSeq; 777 bool m_bSharedPackagesLoaded; 778 779 com::sun::star::uno::Sequence< com::sun::star::uno::Reference 780 < com::sun::star::deployment::XPackage > > m_aBundledPackagesSeq; 781 bool m_bBundledPackagesLoaded; 782 783 int m_iUserPackage; 784 int m_iSharedPackage; 785 int m_iBundledPackage; 786 787 ScriptSubPackageIterator* m_pScriptSubPackageIterator; 788 789 }; // end class ScriptExtensionIterator 790 791 //============================================================================ 792 793 } // namespace basic 794 795 #endif 796 797