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 virtual sal_Bool SAL_CALL hasElements( ); 107 108 // Methods XNameAccess 109 virtual ::com::sun::star::uno::Any SAL_CALL getByName( const ::rtl::OUString& aName ); 110 virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getElementNames( ); 111 virtual sal_Bool SAL_CALL hasByName( const ::rtl::OUString& aName ); 112 113 // Methods XNameReplace 114 virtual void SAL_CALL replaceByName( const ::rtl::OUString& aName, const ::com::sun::star::uno::Any& aElement ); 115 116 // Methods XNameContainer 117 virtual void SAL_CALL insertByName( const ::rtl::OUString& aName, const ::com::sun::star::uno::Any& aElement ); 118 virtual void SAL_CALL removeByName( const ::rtl::OUString& Name ); 119 120 // Methods XContainer 121 virtual void SAL_CALL addContainerListener( const ::com::sun::star::uno::Reference< 122 ::com::sun::star::container::XContainerListener >& xListener ); 123 virtual void SAL_CALL removeContainerListener( const ::com::sun::star::uno::Reference< 124 ::com::sun::star::container::XContainerListener >& xListener ); 125 126 // Methods XChangesNotifier 127 virtual void SAL_CALL addChangesListener( const ::com::sun::star::uno::Reference< 128 ::com::sun::star::util::XChangesListener >& xListener ); 129 virtual void SAL_CALL removeChangesListener( const ::com::sun::star::uno::Reference< 130 ::com::sun::star::util::XChangesListener >& xListener ); 131 }; 132 133 //============================================================================ 134 135 class ModifiableHelper 136 { 137 private: 138 ::cppu::OInterfaceContainerHelper m_aModifyListeners; 139 ::cppu::OWeakObject& m_rEventSource; 140 sal_Bool mbModified; 141 142 public: ModifiableHelper(::cppu::OWeakObject & _rEventSource,::osl::Mutex & _rMutex)143 ModifiableHelper( ::cppu::OWeakObject& _rEventSource, ::osl::Mutex& _rMutex ) 144 :m_aModifyListeners( _rMutex ) 145 ,m_rEventSource( _rEventSource ) 146 ,mbModified( sal_False ) 147 { 148 } 149 isModified() const150 inline sal_Bool isModified() const { return mbModified; } 151 void setModified( sal_Bool _bModified ); 152 addModifyListener(const::com::sun::star::uno::Reference<::com::sun::star::util::XModifyListener> & _rxListener)153 inline void addModifyListener( const ::com::sun::star::uno::Reference< ::com::sun::star::util::XModifyListener >& _rxListener ) 154 { 155 m_aModifyListeners.addInterface( _rxListener ); 156 } 157 removeModifyListener(const::com::sun::star::uno::Reference<::com::sun::star::util::XModifyListener> & _rxListener)158 inline void removeModifyListener( const ::com::sun::star::uno::Reference< ::com::sun::star::util::XModifyListener >& _rxListener ) 159 { 160 m_aModifyListeners.removeInterface( _rxListener ); 161 } 162 }; 163 164 //============================================================================ 165 166 typedef ::comphelper::OListenerContainerBase< 167 ::com::sun::star::script::vba::XVBAScriptListener, 168 ::com::sun::star::script::vba::VBAScriptEvent > VBAScriptListenerContainer_BASE; 169 170 class VBAScriptListenerContainer : public VBAScriptListenerContainer_BASE 171 { 172 public: 173 explicit VBAScriptListenerContainer( ::osl::Mutex& rMutex ); 174 175 private: 176 virtual bool implTypedNotify( 177 const ::com::sun::star::uno::Reference< ::com::sun::star::script::vba::XVBAScriptListener >& rxListener, 178 const ::com::sun::star::script::vba::VBAScriptEvent& rEvent ); 179 }; 180 181 //============================================================================ 182 183 class SfxLibrary; 184 185 typedef ::cppu::WeakComponentImplHelper8< 186 ::com::sun::star::lang::XInitialization, 187 ::com::sun::star::script::XStorageBasedLibraryContainer, 188 ::com::sun::star::script::XLibraryContainerPassword, 189 ::com::sun::star::script::XLibraryContainerExport, 190 ::com::sun::star::script::XLibraryContainer3, 191 ::com::sun::star::container::XContainer, 192 ::com::sun::star::script::vba::XVBACompatibility, 193 ::com::sun::star::lang::XServiceInfo > SfxLibraryContainer_BASE; 194 195 class SfxLibraryContainer : public SfxLibraryContainer_BASE, public ::utl::OEventListenerAdapter 196 { 197 VBAScriptListenerContainer maVBAScriptListeners; 198 sal_Int32 mnRunningVBAScripts; 199 sal_Bool mbVBACompat; 200 protected: 201 ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > mxMSF; 202 ::com::sun::star::uno::Reference< ::com::sun::star::ucb::XSimpleFileAccess > mxSFI; 203 ::com::sun::star::uno::Reference< ::com::sun::star::util::XMacroExpander > mxMacroExpander; 204 ::com::sun::star::uno::Reference< ::com::sun::star::util::XStringSubstitution > mxStringSubstitution; 205 ::com::sun::star::uno::WeakReference< ::com::sun::star::frame::XModel > mxOwnerDocument; 206 207 ::osl::Mutex maMutex; 208 ModifiableHelper maModifiable; 209 210 NameContainer maNameContainer; 211 sal_Bool mbOldInfoFormat; 212 sal_Bool mbOasis2OOoFormat; 213 214 ::rtl::OUString maInitialDocumentURL; 215 ::rtl::OUString maInfoFileName; 216 ::rtl::OUString maOldInfoFileName; 217 ::rtl::OUString maLibElementFileExtension; 218 ::rtl::OUString maLibraryPath; 219 ::rtl::OUString maLibrariesDir; 220 221 ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage > mxStorage; 222 BasicManager* mpBasMgr; 223 sal_Bool mbOwnBasMgr; 224 225 enum InitMode 226 { 227 DEFAULT, 228 CONTAINER_INIT_FILE, 229 LIBRARY_INIT_FILE, 230 OFFICE_DOCUMENT, 231 OLD_BASIC_STORAGE 232 } meInitMode; 233 234 void implStoreLibrary( SfxLibrary* pLib, 235 const ::rtl::OUString& aName, 236 const ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage >& xStorage ); 237 238 // New variant for library export 239 void implStoreLibrary( SfxLibrary* pLib, 240 const ::rtl::OUString& aName, 241 const ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage >& xStorage, 242 const ::rtl::OUString& aTargetURL, 243 const ::com::sun::star::uno::Reference< ::com::sun::star::ucb::XSimpleFileAccess > xToUseSFI, 244 const ::com::sun::star::uno::Reference< ::com::sun::star::task::XInteractionHandler >& xHandler ); 245 246 void implStoreLibraryIndexFile( SfxLibrary* pLib, const ::xmlscript::LibDescriptor& rLib, 247 const ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage >& xStorage ); 248 249 // New variant for library export 250 void implStoreLibraryIndexFile( SfxLibrary* pLib, const ::xmlscript::LibDescriptor& rLib, 251 const ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage >& xStorage, 252 const ::rtl::OUString& aTargetURL, 253 const ::com::sun::star::uno::Reference< ::com::sun::star::ucb::XSimpleFileAccess > xToUseSFI ); 254 255 sal_Bool implLoadLibraryIndexFile( SfxLibrary* pLib, 256 ::xmlscript::LibDescriptor& rLib, 257 const ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage >& xStorage, 258 const ::rtl::OUString& aIndexFileName ); 259 260 void implImportLibDescriptor( SfxLibrary* pLib, ::xmlscript::LibDescriptor& rLib ); 261 262 // Methods to distinguish between different library types 263 virtual SfxLibrary* SAL_CALL implCreateLibrary( const ::rtl::OUString& aName ) = 0; 264 virtual SfxLibrary* SAL_CALL implCreateLibraryLink 265 ( const ::rtl::OUString& aName, const ::rtl::OUString& aLibInfoFileURL, 266 const ::rtl::OUString& StorageURL, sal_Bool ReadOnly ) = 0; 267 virtual ::com::sun::star::uno::Any SAL_CALL createEmptyLibraryElement( void ) = 0; 268 virtual bool SAL_CALL isLibraryElementValid( ::com::sun::star::uno::Any aElement ) const = 0; 269 virtual void SAL_CALL writeLibraryElement 270 ( 271 const ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameContainer>& xLibrary, 272 const ::rtl::OUString& aElementName, 273 const ::com::sun::star::uno::Reference< ::com::sun::star::io::XOutputStream >& xOutput 274 ) = 0; 275 276 virtual ::com::sun::star::uno::Any SAL_CALL importLibraryElement 277 ( 278 const ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameContainer>& xLibrary, 279 const ::rtl::OUString& aElementName, 280 const ::rtl::OUString& aFile, 281 const ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream >& xElementStream ) = 0; 282 virtual void SAL_CALL importFromOldStorage( const ::rtl::OUString& aFile ) = 0; 283 284 // Password encryption 285 virtual sal_Bool implStorePasswordLibrary( SfxLibrary* pLib, const ::rtl::OUString& aName, 286 const ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage >& xStorage, const ::com::sun::star::uno::Reference< ::com::sun::star::task::XInteractionHandler >& Handler ); 287 288 // New variant for library export 289 virtual sal_Bool implStorePasswordLibrary( SfxLibrary* pLib, const ::rtl::OUString& aName, 290 const ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage >& xStorage, 291 const ::rtl::OUString& aTargetURL, 292 const ::com::sun::star::uno::Reference< ::com::sun::star::ucb::XSimpleFileAccess > xToUseSFI, const ::com::sun::star::uno::Reference< ::com::sun::star::task::XInteractionHandler >& Handler ); 293 294 virtual sal_Bool implLoadPasswordLibrary( SfxLibrary* pLib, const ::rtl::OUString& Name, 295 sal_Bool bVerifyPasswordOnly=false ); 296 297 virtual void onNewRootStorage() = 0; 298 299 300 // #56666, Creates another library container 301 // instance of the same derived class 302 virtual SfxLibraryContainer* createInstanceImpl( void ) = 0; 303 304 305 // Interface to get the BasicManager (Hack for password implementation) 306 BasicManager* getBasicManager( void ); 307 ::rtl::OUString createAppLibraryFolder( SfxLibrary* pLib, const ::rtl::OUString& aName ); 308 309 sal_Bool init( const ::rtl::OUString& rInitialDocumentURL, 310 const ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage >& _rxInitialStorage ); 311 312 virtual const sal_Char* SAL_CALL getInfoFileName() const = 0; 313 virtual const sal_Char* SAL_CALL getOldInfoFileName() const = 0; 314 virtual const sal_Char* SAL_CALL getLibElementFileExtension() const = 0; 315 virtual const sal_Char* SAL_CALL getLibrariesDir() const = 0; 316 317 // Handle maLibInfoFileURL and maStorageURL correctly 318 void checkStorageURL 319 ( 320 const ::rtl::OUString& aSourceURL, 321 ::rtl::OUString& aLibInfoFileURL, 322 ::rtl::OUString& aStorageURL, 323 ::rtl::OUString& aUnexpandedStorageURL 324 ); 325 ::rtl::OUString expand_url( const ::rtl::OUString& url ); 326 327 SfxLibrary* getImplLib( const String& rLibraryName ); 328 329 void storeLibraries_Impl( 330 const ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage >& xStorage, 331 sal_Bool bComplete ); 332 333 void SAL_CALL initializeFromDocumentURL( const ::rtl::OUString& _rInitialDocumentURL ); 334 void SAL_CALL initializeFromDocument( const ::com::sun::star::uno::Reference< ::com::sun::star::document::XStorageBasedDocument >& _rxDocument ); 335 336 // OEventListenerAdapter 337 virtual void _disposing( const ::com::sun::star::lang::EventObject& _rSource ); 338 339 // OComponentHelper 340 virtual void SAL_CALL disposing(); 341 342 private: 343 sal_Bool init_Impl( const ::rtl::OUString& rInitialDocumentURL, 344 const ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage >& _rxInitialStorage ); 345 void implScanExtensions( void ); 346 347 public: 348 SfxLibraryContainer( void ); 349 ~SfxLibraryContainer(); 350 351 352 // Interface to set the BasicManager (Hack for password implementation) setBasicManager(BasicManager * pBasMgr)353 void setBasicManager( BasicManager* pBasMgr ) 354 { 355 mpBasMgr = pBasMgr; 356 } 357 358 void enterMethod(); 359 void leaveMethod(); isDisposed() const360 bool isDisposed() const { return rBHelper.bInDispose || rBHelper.bDisposed; } 361 void checkDisposed() const; 362 363 // Methods XElementAccess 364 virtual ::com::sun::star::uno::Type SAL_CALL getElementType(); 365 virtual sal_Bool SAL_CALL hasElements(); 366 367 // Methods XNameAccess 368 virtual ::com::sun::star::uno::Any SAL_CALL getByName( const ::rtl::OUString& aName ); 369 virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getElementNames(); 370 virtual sal_Bool SAL_CALL hasByName( const ::rtl::OUString& aName ); 371 372 // Members XStorageBasedLibraryContainer 373 virtual ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage > SAL_CALL getRootStorage(); 374 virtual void SAL_CALL setRootStorage( const ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage >& _rootstorage ); 375 virtual void SAL_CALL storeLibrariesToStorage( const ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage >& RootStorage ); 376 377 // Methods XModifiable (base of XPersistentLibraryContainer) 378 virtual ::sal_Bool SAL_CALL isModified( ); 379 virtual void SAL_CALL setModified( ::sal_Bool bModified ); 380 virtual void SAL_CALL addModifyListener( const ::com::sun::star::uno::Reference< ::com::sun::star::util::XModifyListener >& aListener ); 381 virtual void SAL_CALL removeModifyListener( const ::com::sun::star::uno::Reference< ::com::sun::star::util::XModifyListener >& aListener ); 382 383 // Methods XPersistentLibraryContainer (base of XStorageBasedLibraryContainer) 384 virtual ::com::sun::star::uno::Any SAL_CALL getRootLocation(); 385 virtual ::rtl::OUString SAL_CALL getContainerLocationName(); 386 virtual void SAL_CALL storeLibraries( ); 387 388 //Methods XLibraryContainer3 389 virtual ::rtl::OUString SAL_CALL getOriginalLibraryLinkURL( const ::rtl::OUString& Name ); 390 391 // Methods XLibraryContainer2 (base of XPersistentLibraryContainer) 392 virtual sal_Bool SAL_CALL isLibraryLink( const ::rtl::OUString& Name ); 393 virtual ::rtl::OUString SAL_CALL getLibraryLinkURL( const ::rtl::OUString& Name ); 394 virtual sal_Bool SAL_CALL isLibraryReadOnly( const ::rtl::OUString& Name ); 395 virtual void SAL_CALL setLibraryReadOnly( const ::rtl::OUString& Name, sal_Bool bReadOnly ); 396 virtual void SAL_CALL renameLibrary( const ::rtl::OUString& Name, const ::rtl::OUString& NewName ); 397 398 // Methods XLibraryContainer (base of XLibraryContainer2) 399 virtual ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameContainer > SAL_CALL 400 createLibrary( const ::rtl::OUString& Name ); 401 virtual ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess > SAL_CALL createLibraryLink 402 ( const ::rtl::OUString& Name, const ::rtl::OUString& StorageURL, sal_Bool ReadOnly ); 403 virtual void SAL_CALL removeLibrary( const ::rtl::OUString& Name ); 404 virtual sal_Bool SAL_CALL isLibraryLoaded( const ::rtl::OUString& Name ); 405 virtual void SAL_CALL loadLibrary( const ::rtl::OUString& Name ); 406 407 // Methods XInitialization 408 virtual void SAL_CALL initialize( const ::com::sun::star::uno::Sequence< 409 ::com::sun::star::uno::Any >& aArguments ); 410 411 // Methods XLibraryContainerPassword 412 virtual sal_Bool SAL_CALL isLibraryPasswordProtected( const ::rtl::OUString& Name ); 413 virtual sal_Bool SAL_CALL isLibraryPasswordVerified( const ::rtl::OUString& Name ); 414 virtual sal_Bool SAL_CALL verifyLibraryPassword( const ::rtl::OUString& Name, const ::rtl::OUString& Password ); 415 virtual void SAL_CALL changeLibraryPassword( const ::rtl::OUString& Name, 416 const ::rtl::OUString& OldPassword, const ::rtl::OUString& NewPassword ); 417 418 // Methods XContainer 419 virtual void SAL_CALL addContainerListener( const ::com::sun::star::uno::Reference< 420 ::com::sun::star::container::XContainerListener >& xListener ); 421 virtual void SAL_CALL removeContainerListener( const ::com::sun::star::uno::Reference< 422 ::com::sun::star::container::XContainerListener >& xListener ); 423 424 // Methods XLibraryContainerExport 425 virtual void SAL_CALL exportLibrary( const ::rtl::OUString& Name, const ::rtl::OUString& URL, 426 const ::com::sun::star::uno::Reference< ::com::sun::star::task::XInteractionHandler >& Handler ); 427 428 // Methods XServiceInfo 429 virtual ::rtl::OUString SAL_CALL getImplementationName( ) = 0; 430 virtual ::sal_Bool SAL_CALL supportsService( const ::rtl::OUString& ServiceName ); 431 virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames( ) = 0; 432 // Methods XVBACompatibility 433 virtual ::sal_Bool SAL_CALL getVBACompatibilityMode(); 434 virtual void SAL_CALL setVBACompatibilityMode( ::sal_Bool _vbacompatmodeon ); 435 virtual sal_Int32 SAL_CALL getRunningVBAScripts(); 436 virtual void SAL_CALL addVBAScriptListener( 437 const ::com::sun::star::uno::Reference< ::com::sun::star::script::vba::XVBAScriptListener >& Listener ); 438 virtual void SAL_CALL removeVBAScriptListener( 439 const ::com::sun::star::uno::Reference< ::com::sun::star::script::vba::XVBAScriptListener >& Listener ); 440 virtual void SAL_CALL broadcastVBAScriptEvent( sal_Int32 nIdentifier, const ::rtl::OUString& rModuleName ); 441 }; 442 443 //============================================================================ 444 445 class LibraryContainerMethodGuard 446 { 447 private: 448 SfxLibraryContainer& m_rContainer; 449 public: LibraryContainerMethodGuard(SfxLibraryContainer & _rContainer)450 LibraryContainerMethodGuard( SfxLibraryContainer& _rContainer ) 451 :m_rContainer( _rContainer ) 452 { 453 m_rContainer.enterMethod(); 454 } 455 ~LibraryContainerMethodGuard()456 ~LibraryContainerMethodGuard() 457 { 458 m_rContainer.leaveMethod(); 459 } 460 }; 461 462 //============================================================================ 463 464 class SfxLibrary 465 : public ::com::sun::star::container::XNameContainer 466 , public ::com::sun::star::container::XContainer 467 , public ::com::sun::star::util::XChangesNotifier 468 , public ::cppu::BaseMutex 469 , public ::cppu::OComponentHelper 470 { 471 friend class SfxLibraryContainer; 472 friend class SfxDialogLibraryContainer; 473 friend class SfxScriptLibraryContainer; 474 475 ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > mxMSF; 476 ::com::sun::star::uno::Reference< ::com::sun::star::ucb::XSimpleFileAccess > mxSFI; 477 478 ModifiableHelper& mrModifiable; 479 NameContainer maNameContainer; 480 481 sal_Bool mbLoaded; 482 sal_Bool mbIsModified; 483 sal_Bool mbInitialised; 484 485 private: 486 487 ::rtl::OUString maLibElementFileExtension; 488 ::rtl::OUString maLibInfoFileURL; 489 ::rtl::OUString maStorageURL; 490 ::rtl::OUString maUnexpandedStorageURL; 491 ::rtl::OUString maOrignialStorageURL; 492 493 sal_Bool mbLink; 494 sal_Bool mbReadOnly; 495 sal_Bool mbReadOnlyLink; 496 sal_Bool mbPreload; 497 498 sal_Bool mbPasswordProtected; 499 sal_Bool mbPasswordVerified; 500 sal_Bool mbDoc50Password; 501 ::rtl::OUString maPassword; 502 503 sal_Bool mbSharedIndexFile; 504 sal_Bool mbExtension; 505 506 // Additional functionality for localization 507 // Provide modify state including resources 508 virtual sal_Bool isModified( void ) = 0; 509 virtual void storeResources( void ) = 0; 510 virtual void storeResourcesAsURL( const ::rtl::OUString& URL, const ::rtl::OUString& NewName ) = 0; 511 virtual void storeResourcesToURL( const ::rtl::OUString& URL, 512 const ::com::sun::star::uno::Reference< ::com::sun::star::task::XInteractionHandler >& xHandler ) = 0; 513 virtual void storeResourcesToStorage( const ::com::sun::star::uno::Reference 514 < ::com::sun::star::embed::XStorage >& xStorage ) = 0; 515 516 protected: implIsModified() const517 inline sal_Bool implIsModified() const { return mbIsModified; } 518 void implSetModified( sal_Bool _bIsModified ); 519 520 private: 521 /** checks whether the lib is readonly, or a readonly link, throws an IllegalArgumentException if so 522 */ 523 void impl_checkReadOnly(); 524 /** checks whether the library is loaded, throws a LibraryNotLoadedException (wrapped in a WrappedTargetException), 525 if not. 526 */ 527 void impl_checkLoaded(); 528 529 private: 530 void impl_removeWithoutChecks( const ::rtl::OUString& _rElementName ); 531 532 public: 533 SfxLibrary( 534 ModifiableHelper& _rModifiable, 535 const ::com::sun::star::uno::Type& aType, 536 const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& xMSF, 537 const ::com::sun::star::uno::Reference< ::com::sun::star::ucb::XSimpleFileAccess >& xSFI 538 ); 539 SfxLibrary( 540 ModifiableHelper& _rModifiable, 541 const ::com::sun::star::uno::Type& aType, 542 const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& xMSF, 543 const ::com::sun::star::uno::Reference< ::com::sun::star::ucb::XSimpleFileAccess >& xSFI, 544 const ::rtl::OUString& aLibInfoFileURL, 545 const ::rtl::OUString& 546 aStorageURL, 547 sal_Bool ReadOnly 548 ); 549 550 // Methods XInterface 551 virtual ::com::sun::star::uno::Any SAL_CALL queryInterface( const ::com::sun::star::uno::Type& rType ); acquire()552 virtual void SAL_CALL acquire() throw() { OComponentHelper::acquire(); } release()553 virtual void SAL_CALL release() throw() { OComponentHelper::release(); } 554 555 // Methods XElementAccess 556 virtual ::com::sun::star::uno::Type SAL_CALL getElementType( ); 557 virtual sal_Bool SAL_CALL hasElements( ); 558 559 // Methods XNameAccess 560 virtual ::com::sun::star::uno::Any SAL_CALL getByName( const ::rtl::OUString& aName ); 561 virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getElementNames( ); 562 virtual sal_Bool SAL_CALL hasByName( const ::rtl::OUString& aName ); 563 564 // Methods XNameReplace 565 virtual void SAL_CALL replaceByName( const ::rtl::OUString& aName, const ::com::sun::star::uno::Any& aElement ); 566 567 // Methods XNameContainer 568 virtual void SAL_CALL insertByName( const ::rtl::OUString& aName, const ::com::sun::star::uno::Any& aElement ); 569 virtual void SAL_CALL removeByName( const ::rtl::OUString& Name ); 570 571 // XTypeProvider 572 ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > SAL_CALL getTypes( ); 573 ::com::sun::star::uno::Sequence<sal_Int8> SAL_CALL getImplementationId( ); 574 575 // Methods XContainer 576 virtual void SAL_CALL addContainerListener( const ::com::sun::star::uno::Reference< 577 ::com::sun::star::container::XContainerListener >& xListener ); 578 virtual void SAL_CALL removeContainerListener( const ::com::sun::star::uno::Reference< 579 ::com::sun::star::container::XContainerListener >& xListener ); 580 581 // Methods XChangesNotifier 582 virtual void SAL_CALL addChangesListener( const ::com::sun::star::uno::Reference< 583 ::com::sun::star::util::XChangesListener >& xListener ); 584 virtual void SAL_CALL removeChangesListener( const ::com::sun::star::uno::Reference< 585 ::com::sun::star::util::XChangesListener >& xListener ); 586 587 public: LibraryContainerAccessbasic::SfxLibrary::LibraryContainerAccess588 struct LibraryContainerAccess { friend class SfxLibraryContainer; private: LibraryContainerAccess() { } }; removeElementWithoutChecks(const::rtl::OUString & _rElementName,LibraryContainerAccess)589 void removeElementWithoutChecks( const ::rtl::OUString& _rElementName, LibraryContainerAccess ) 590 { 591 impl_removeWithoutChecks( _rElementName ); 592 } 593 594 protected: 595 virtual bool SAL_CALL isLibraryElementValid( ::com::sun::star::uno::Any aElement ) const = 0; 596 }; 597 598 //============================================================================ 599 600 class ScriptSubPackageIterator 601 { 602 com::sun::star::uno::Reference< com::sun::star::deployment::XPackage > m_xMainPackage; 603 604 bool m_bIsValid; 605 bool m_bIsBundle; 606 607 com::sun::star::uno::Sequence< com::sun::star::uno::Reference 608 < com::sun::star::deployment::XPackage > > m_aSubPkgSeq; 609 sal_Int32 m_nSubPkgCount; 610 sal_Int32 m_iNextSubPkg; 611 612 com::sun::star::uno::Reference< com::sun::star::deployment::XPackage > 613 implDetectScriptPackage( const com::sun::star::uno::Reference 614 < com::sun::star::deployment::XPackage > xPackage, bool& rbPureDialogLib ); 615 616 public: 617 ScriptSubPackageIterator( com::sun::star::uno::Reference< com::sun::star::deployment::XPackage > xMainPackage ); 618 619 com::sun::star::uno::Reference< com::sun::star::deployment::XPackage > getNextScriptSubPackage( bool& rbPureDialogLib ); 620 }; 621 622 //============================================================================ 623 624 class ScriptExtensionIterator 625 { 626 public: 627 ScriptExtensionIterator( void ); 628 rtl::OUString nextBasicOrDialogLibrary( bool& rbPureDialogLib ); 629 630 private: 631 com::sun::star::uno::Reference< com::sun::star::deployment::XPackage > implGetScriptPackageFromPackage 632 ( const com::sun::star::uno::Reference< com::sun::star::deployment::XPackage > xPackage, 633 bool& rbPureDialogLib ); 634 635 protected: 636 com::sun::star::uno::Reference< com::sun::star::deployment::XPackage > 637 implGetNextUserScriptPackage( bool& rbPureDialogLib ); 638 com::sun::star::uno::Reference< com::sun::star::deployment::XPackage > 639 implGetNextSharedScriptPackage( bool& rbPureDialogLib ); 640 com::sun::star::uno::Reference< com::sun::star::deployment::XPackage > 641 implGetNextBundledScriptPackage( bool& rbPureDialogLib ); 642 643 com::sun::star::uno::Reference< com::sun::star::uno::XComponentContext > m_xContext; 644 645 enum IteratorState 646 { 647 USER_EXTENSIONS, 648 SHARED_EXTENSIONS, 649 BUNDLED_EXTENSIONS, 650 END_REACHED 651 } m_eState; 652 653 com::sun::star::uno::Sequence< com::sun::star::uno::Reference 654 < com::sun::star::deployment::XPackage > > m_aUserPackagesSeq; 655 bool m_bUserPackagesLoaded; 656 657 com::sun::star::uno::Sequence< com::sun::star::uno::Reference 658 < com::sun::star::deployment::XPackage > > m_aSharedPackagesSeq; 659 bool m_bSharedPackagesLoaded; 660 661 com::sun::star::uno::Sequence< com::sun::star::uno::Reference 662 < com::sun::star::deployment::XPackage > > m_aBundledPackagesSeq; 663 bool m_bBundledPackagesLoaded; 664 665 int m_iUserPackage; 666 int m_iSharedPackage; 667 int m_iBundledPackage; 668 669 ScriptSubPackageIterator* m_pScriptSubPackageIterator; 670 671 }; // end class ScriptExtensionIterator 672 673 //============================================================================ 674 675 } // namespace basic 676 677 #endif 678