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