1*b1cdbd2cSJim Jagielski /************************************************************** 2*b1cdbd2cSJim Jagielski * 3*b1cdbd2cSJim Jagielski * Licensed to the Apache Software Foundation (ASF) under one 4*b1cdbd2cSJim Jagielski * or more contributor license agreements. See the NOTICE file 5*b1cdbd2cSJim Jagielski * distributed with this work for additional information 6*b1cdbd2cSJim Jagielski * regarding copyright ownership. The ASF licenses this file 7*b1cdbd2cSJim Jagielski * to you under the Apache License, Version 2.0 (the 8*b1cdbd2cSJim Jagielski * "License"); you may not use this file except in compliance 9*b1cdbd2cSJim Jagielski * with the License. You may obtain a copy of the License at 10*b1cdbd2cSJim Jagielski * 11*b1cdbd2cSJim Jagielski * http://www.apache.org/licenses/LICENSE-2.0 12*b1cdbd2cSJim Jagielski * 13*b1cdbd2cSJim Jagielski * Unless required by applicable law or agreed to in writing, 14*b1cdbd2cSJim Jagielski * software distributed under the License is distributed on an 15*b1cdbd2cSJim Jagielski * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*b1cdbd2cSJim Jagielski * KIND, either express or implied. See the License for the 17*b1cdbd2cSJim Jagielski * specific language governing permissions and limitations 18*b1cdbd2cSJim Jagielski * under the License. 19*b1cdbd2cSJim Jagielski * 20*b1cdbd2cSJim Jagielski *************************************************************/ 21*b1cdbd2cSJim Jagielski 22*b1cdbd2cSJim Jagielski 23*b1cdbd2cSJim Jagielski 24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove 25*b1cdbd2cSJim Jagielski #include "precompiled_basic.hxx" 26*b1cdbd2cSJim Jagielski #include <basic/basicmanagerrepository.hxx> 27*b1cdbd2cSJim Jagielski #include <basic/basmgr.hxx> 28*b1cdbd2cSJim Jagielski #include "scriptcont.hxx" 29*b1cdbd2cSJim Jagielski #include "dlgcont.hxx" 30*b1cdbd2cSJim Jagielski #include <basic/sbuno.hxx> 31*b1cdbd2cSJim Jagielski #include "sbintern.hxx" 32*b1cdbd2cSJim Jagielski 33*b1cdbd2cSJim Jagielski /** === begin UNO includes === **/ 34*b1cdbd2cSJim Jagielski #include <com/sun/star/beans/XPropertySet.hpp> 35*b1cdbd2cSJim Jagielski #include <com/sun/star/document/XStorageBasedDocument.hpp> 36*b1cdbd2cSJim Jagielski #include <com/sun/star/document/XEmbeddedScripts.hpp> 37*b1cdbd2cSJim Jagielski /** === end UNO includes === **/ 38*b1cdbd2cSJim Jagielski #include <svtools/ehdl.hxx> 39*b1cdbd2cSJim Jagielski #include <svtools/sfxecode.hxx> 40*b1cdbd2cSJim Jagielski #include <unotools/pathoptions.hxx> 41*b1cdbd2cSJim Jagielski #include <svl/smplhint.hxx> 42*b1cdbd2cSJim Jagielski #include <vcl/svapp.hxx> 43*b1cdbd2cSJim Jagielski #include <tools/debug.hxx> 44*b1cdbd2cSJim Jagielski #include <tools/diagnose_ex.h> 45*b1cdbd2cSJim Jagielski #include <tools/urlobj.hxx> 46*b1cdbd2cSJim Jagielski #include <comphelper/stl_types.hxx> 47*b1cdbd2cSJim Jagielski #include <comphelper/processfactory.hxx> 48*b1cdbd2cSJim Jagielski #include <comphelper/documentinfo.hxx> 49*b1cdbd2cSJim Jagielski #include <unotools/eventlisteneradapter.hxx> 50*b1cdbd2cSJim Jagielski 51*b1cdbd2cSJim Jagielski #ifndef INCLUDED_OSL_DOUBLECHECKEDLOCKING_H 52*b1cdbd2cSJim Jagielski #include <rtl/instance.hxx> 53*b1cdbd2cSJim Jagielski #endif 54*b1cdbd2cSJim Jagielski 55*b1cdbd2cSJim Jagielski #include <map> 56*b1cdbd2cSJim Jagielski 57*b1cdbd2cSJim Jagielski //........................................................................ 58*b1cdbd2cSJim Jagielski namespace basic 59*b1cdbd2cSJim Jagielski { 60*b1cdbd2cSJim Jagielski //........................................................................ 61*b1cdbd2cSJim Jagielski 62*b1cdbd2cSJim Jagielski /** === begin UNO using === **/ 63*b1cdbd2cSJim Jagielski using ::com::sun::star::uno::Reference; 64*b1cdbd2cSJim Jagielski using ::com::sun::star::frame::XModel; 65*b1cdbd2cSJim Jagielski using ::com::sun::star::uno::XInterface; 66*b1cdbd2cSJim Jagielski using ::com::sun::star::uno::UNO_QUERY; 67*b1cdbd2cSJim Jagielski using ::com::sun::star::embed::XStorage; 68*b1cdbd2cSJim Jagielski using ::com::sun::star::script::XPersistentLibraryContainer; 69*b1cdbd2cSJim Jagielski using ::com::sun::star::uno::Any; 70*b1cdbd2cSJim Jagielski using ::com::sun::star::lang::XMultiServiceFactory; 71*b1cdbd2cSJim Jagielski using ::com::sun::star::uno::UNO_QUERY_THROW; 72*b1cdbd2cSJim Jagielski using ::com::sun::star::beans::XPropertySet; 73*b1cdbd2cSJim Jagielski using ::com::sun::star::uno::Exception; 74*b1cdbd2cSJim Jagielski using ::com::sun::star::document::XStorageBasedDocument; 75*b1cdbd2cSJim Jagielski using ::com::sun::star::lang::XComponent; 76*b1cdbd2cSJim Jagielski using ::com::sun::star::document::XEmbeddedScripts; 77*b1cdbd2cSJim Jagielski /** === end UNO using === **/ 78*b1cdbd2cSJim Jagielski 79*b1cdbd2cSJim Jagielski typedef BasicManager* BasicManagerPointer; 80*b1cdbd2cSJim Jagielski typedef ::std::map< Reference< XInterface >, BasicManagerPointer, ::comphelper::OInterfaceCompare< XInterface > > BasicManagerStore; 81*b1cdbd2cSJim Jagielski 82*b1cdbd2cSJim Jagielski typedef ::std::vector< BasicManagerCreationListener* > CreationListeners; 83*b1cdbd2cSJim Jagielski 84*b1cdbd2cSJim Jagielski //==================================================================== 85*b1cdbd2cSJim Jagielski //= BasicManagerCleaner 86*b1cdbd2cSJim Jagielski //==================================================================== 87*b1cdbd2cSJim Jagielski /// is the only instance which is allowed to delete a BasicManager instance 88*b1cdbd2cSJim Jagielski class BasicManagerCleaner 89*b1cdbd2cSJim Jagielski { 90*b1cdbd2cSJim Jagielski public: deleteBasicManager(BasicManager * & _rpManager)91*b1cdbd2cSJim Jagielski static void deleteBasicManager( BasicManager*& _rpManager ) 92*b1cdbd2cSJim Jagielski { 93*b1cdbd2cSJim Jagielski delete _rpManager; 94*b1cdbd2cSJim Jagielski _rpManager = NULL; 95*b1cdbd2cSJim Jagielski } 96*b1cdbd2cSJim Jagielski }; 97*b1cdbd2cSJim Jagielski 98*b1cdbd2cSJim Jagielski //==================================================================== 99*b1cdbd2cSJim Jagielski //= ImplRepository 100*b1cdbd2cSJim Jagielski //==================================================================== 101*b1cdbd2cSJim Jagielski class ImplRepository : public ::utl::OEventListenerAdapter, public SfxListener 102*b1cdbd2cSJim Jagielski { 103*b1cdbd2cSJim Jagielski private: 104*b1cdbd2cSJim Jagielski friend struct CreateImplRepository; 105*b1cdbd2cSJim Jagielski ImplRepository(); 106*b1cdbd2cSJim Jagielski 107*b1cdbd2cSJim Jagielski private: 108*b1cdbd2cSJim Jagielski ::osl::Mutex m_aMutex; 109*b1cdbd2cSJim Jagielski BasicManagerStore m_aStore; 110*b1cdbd2cSJim Jagielski CreationListeners m_aCreationListeners; 111*b1cdbd2cSJim Jagielski 112*b1cdbd2cSJim Jagielski public: 113*b1cdbd2cSJim Jagielski static ImplRepository& Instance(); 114*b1cdbd2cSJim Jagielski 115*b1cdbd2cSJim Jagielski BasicManager* getDocumentBasicManager( const Reference< XModel >& _rxDocumentModel ); 116*b1cdbd2cSJim Jagielski BasicManager* getApplicationBasicManager( bool _bCreate ); 117*b1cdbd2cSJim Jagielski void setApplicationBasicManager( BasicManager* _pBasicManager ); 118*b1cdbd2cSJim Jagielski void registerCreationListener( BasicManagerCreationListener& _rListener ); 119*b1cdbd2cSJim Jagielski void revokeCreationListener( BasicManagerCreationListener& _rListener ); 120*b1cdbd2cSJim Jagielski 121*b1cdbd2cSJim Jagielski private: 122*b1cdbd2cSJim Jagielski /** retrieves the location at which the BasicManager for the given model 123*b1cdbd2cSJim Jagielski is stored. 124*b1cdbd2cSJim Jagielski 125*b1cdbd2cSJim Jagielski If previously, the BasicManager for this model has never been requested, 126*b1cdbd2cSJim Jagielski then the model is added to the map, with an initial NULL BasicManager. 127*b1cdbd2cSJim Jagielski 128*b1cdbd2cSJim Jagielski @param _rxDocumentModel 129*b1cdbd2cSJim Jagielski the model whose BasicManager's location is to be retrieved. Must not be <NULL/>. 130*b1cdbd2cSJim Jagielski 131*b1cdbd2cSJim Jagielski @precond 132*b1cdbd2cSJim Jagielski our mutex is locked 133*b1cdbd2cSJim Jagielski */ 134*b1cdbd2cSJim Jagielski BasicManagerPointer& 135*b1cdbd2cSJim Jagielski impl_getLocationForModel( const Reference< XModel >& _rxDocumentModel ); 136*b1cdbd2cSJim Jagielski 137*b1cdbd2cSJim Jagielski /** creates a new BasicManager instance for the given model 138*b1cdbd2cSJim Jagielski 139*b1cdbd2cSJim Jagielski @param _out_rpBasicManager 140*b1cdbd2cSJim Jagielski reference to the pointer variable that will hold the new 141*b1cdbd2cSJim Jagielski BasicManager. 142*b1cdbd2cSJim Jagielski 143*b1cdbd2cSJim Jagielski @param _rxDocumentModel 144*b1cdbd2cSJim Jagielski the model whose BasicManager will be created. Must not be <NULL/>. 145*b1cdbd2cSJim Jagielski */ 146*b1cdbd2cSJim Jagielski void impl_createManagerForModel( 147*b1cdbd2cSJim Jagielski BasicManagerPointer& _out_rpBasicManager, 148*b1cdbd2cSJim Jagielski const Reference< XModel >& _rxDocumentModel ); 149*b1cdbd2cSJim Jagielski 150*b1cdbd2cSJim Jagielski /** creates the application-wide BasicManager 151*b1cdbd2cSJim Jagielski */ 152*b1cdbd2cSJim Jagielski BasicManagerPointer impl_createApplicationBasicManager(); 153*b1cdbd2cSJim Jagielski 154*b1cdbd2cSJim Jagielski /** notifies all listeners which expressed interest in the creation of BasicManager instances. 155*b1cdbd2cSJim Jagielski */ 156*b1cdbd2cSJim Jagielski void impl_notifyCreationListeners( 157*b1cdbd2cSJim Jagielski const Reference< XModel >& _rxDocumentModel, 158*b1cdbd2cSJim Jagielski BasicManager& _rManager 159*b1cdbd2cSJim Jagielski ); 160*b1cdbd2cSJim Jagielski 161*b1cdbd2cSJim Jagielski /** retrieves the current storage of a given document 162*b1cdbd2cSJim Jagielski 163*b1cdbd2cSJim Jagielski @param _rxDocument 164*b1cdbd2cSJim Jagielski the document whose storage is to be retrieved. 165*b1cdbd2cSJim Jagielski 166*b1cdbd2cSJim Jagielski @param _out_rStorage 167*b1cdbd2cSJim Jagielski takes the storage upon successful return. Note that this might be <NULL/> even 168*b1cdbd2cSJim Jagielski if <TRUE/> is returned. In this case, the document has not yet been saved. 169*b1cdbd2cSJim Jagielski 170*b1cdbd2cSJim Jagielski @return 171*b1cdbd2cSJim Jagielski <TRUE/> if the storage could be successfully retrieved (in which case 172*b1cdbd2cSJim Jagielski <arg>_out_rStorage</arg> might or might not be <NULL/>), <FALSE/> otherwise. 173*b1cdbd2cSJim Jagielski In the latter case, processing this document should stop. 174*b1cdbd2cSJim Jagielski */ 175*b1cdbd2cSJim Jagielski bool impl_getDocumentStorage_nothrow( const Reference< XModel >& _rxDocument, Reference< XStorage >& _out_rStorage ); 176*b1cdbd2cSJim Jagielski 177*b1cdbd2cSJim Jagielski /** retrieves the containers for Basic and Dialog libraries for a given document 178*b1cdbd2cSJim Jagielski 179*b1cdbd2cSJim Jagielski @param _rxDocument 180*b1cdbd2cSJim Jagielski the document whose containers are to be retrieved. 181*b1cdbd2cSJim Jagielski 182*b1cdbd2cSJim Jagielski @param _out_rxBasicLibraries 183*b1cdbd2cSJim Jagielski takes the basic library container upon successful return 184*b1cdbd2cSJim Jagielski 185*b1cdbd2cSJim Jagielski @param _out_rxDialogLibraries 186*b1cdbd2cSJim Jagielski takes the dialog library container upon successful return 187*b1cdbd2cSJim Jagielski 188*b1cdbd2cSJim Jagielski @return 189*b1cdbd2cSJim Jagielski <TRUE/> if and only if both containers exist, and could successfully be retrieved 190*b1cdbd2cSJim Jagielski */ 191*b1cdbd2cSJim Jagielski bool impl_getDocumentLibraryContainers_nothrow( 192*b1cdbd2cSJim Jagielski const Reference< XModel >& _rxDocument, 193*b1cdbd2cSJim Jagielski Reference< XPersistentLibraryContainer >& _out_rxBasicLibraries, 194*b1cdbd2cSJim Jagielski Reference< XPersistentLibraryContainer >& _out_rxDialogLibraries 195*b1cdbd2cSJim Jagielski ); 196*b1cdbd2cSJim Jagielski 197*b1cdbd2cSJim Jagielski /** initializes the given library containers, which belong to a document 198*b1cdbd2cSJim Jagielski */ 199*b1cdbd2cSJim Jagielski void impl_initDocLibraryContainers_nothrow( 200*b1cdbd2cSJim Jagielski const Reference< XPersistentLibraryContainer >& _rxBasicLibraries, 201*b1cdbd2cSJim Jagielski const Reference< XPersistentLibraryContainer >& _rxDialogLibraries 202*b1cdbd2cSJim Jagielski ); 203*b1cdbd2cSJim Jagielski 204*b1cdbd2cSJim Jagielski // OEventListenerAdapter overridables 205*b1cdbd2cSJim Jagielski virtual void _disposing( const ::com::sun::star::lang::EventObject& _rSource ); 206*b1cdbd2cSJim Jagielski 207*b1cdbd2cSJim Jagielski // SfxListener overridables 208*b1cdbd2cSJim Jagielski virtual void Notify( SfxBroadcaster& _rBC, const SfxHint& _rHint ); 209*b1cdbd2cSJim Jagielski 210*b1cdbd2cSJim Jagielski /** removes the Model/BasicManager pair given by iterator from our store 211*b1cdbd2cSJim Jagielski */ 212*b1cdbd2cSJim Jagielski void impl_removeFromRepository( BasicManagerStore::iterator _pos ); 213*b1cdbd2cSJim Jagielski 214*b1cdbd2cSJim Jagielski private: 215*b1cdbd2cSJim Jagielski StarBASIC* impl_getDefaultAppBasicLibrary(); 216*b1cdbd2cSJim Jagielski }; 217*b1cdbd2cSJim Jagielski 218*b1cdbd2cSJim Jagielski //==================================================================== 219*b1cdbd2cSJim Jagielski //= CreateImplRepository 220*b1cdbd2cSJim Jagielski //==================================================================== 221*b1cdbd2cSJim Jagielski struct CreateImplRepository 222*b1cdbd2cSJim Jagielski { operator ()basic::CreateImplRepository223*b1cdbd2cSJim Jagielski ImplRepository* operator()() 224*b1cdbd2cSJim Jagielski { 225*b1cdbd2cSJim Jagielski static ImplRepository* pRepository = new ImplRepository; 226*b1cdbd2cSJim Jagielski return pRepository; 227*b1cdbd2cSJim Jagielski } 228*b1cdbd2cSJim Jagielski }; 229*b1cdbd2cSJim Jagielski 230*b1cdbd2cSJim Jagielski 231*b1cdbd2cSJim Jagielski //==================================================================== 232*b1cdbd2cSJim Jagielski //= ImplRepository 233*b1cdbd2cSJim Jagielski //==================================================================== 234*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- ImplRepository()235*b1cdbd2cSJim Jagielski ImplRepository::ImplRepository() 236*b1cdbd2cSJim Jagielski { 237*b1cdbd2cSJim Jagielski } 238*b1cdbd2cSJim Jagielski 239*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- Instance()240*b1cdbd2cSJim Jagielski ImplRepository& ImplRepository::Instance() 241*b1cdbd2cSJim Jagielski { 242*b1cdbd2cSJim Jagielski return *rtl_Instance< ImplRepository, CreateImplRepository, ::osl::MutexGuard, ::osl::GetGlobalMutex >:: 243*b1cdbd2cSJim Jagielski create( CreateImplRepository(), ::osl::GetGlobalMutex() ); 244*b1cdbd2cSJim Jagielski } 245*b1cdbd2cSJim Jagielski 246*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- getDocumentBasicManager(const Reference<XModel> & _rxDocumentModel)247*b1cdbd2cSJim Jagielski BasicManager* ImplRepository::getDocumentBasicManager( const Reference< XModel >& _rxDocumentModel ) 248*b1cdbd2cSJim Jagielski { 249*b1cdbd2cSJim Jagielski ::osl::MutexGuard aGuard( m_aMutex ); 250*b1cdbd2cSJim Jagielski 251*b1cdbd2cSJim Jagielski /* #163556# (DR) - This function may be called recursively while 252*b1cdbd2cSJim Jagielski constructing the Basic manager and loading the Basic storage. By 253*b1cdbd2cSJim Jagielski passing the map entry received from impl_getLocationForModel() to 254*b1cdbd2cSJim Jagielski the function impl_createManagerForModel(), the new Basic manager 255*b1cdbd2cSJim Jagielski will be put immediately into the map of existing Basic managers, 256*b1cdbd2cSJim Jagielski thus a recursive call of this function will find and return it 257*b1cdbd2cSJim Jagielski without creating another instance. 258*b1cdbd2cSJim Jagielski */ 259*b1cdbd2cSJim Jagielski BasicManagerPointer& pBasicManager = impl_getLocationForModel( _rxDocumentModel ); 260*b1cdbd2cSJim Jagielski if ( pBasicManager == NULL ) 261*b1cdbd2cSJim Jagielski impl_createManagerForModel( pBasicManager, _rxDocumentModel ); 262*b1cdbd2cSJim Jagielski 263*b1cdbd2cSJim Jagielski return pBasicManager; 264*b1cdbd2cSJim Jagielski } 265*b1cdbd2cSJim Jagielski 266*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- getApplicationBasicManager(bool _bCreate)267*b1cdbd2cSJim Jagielski BasicManager* ImplRepository::getApplicationBasicManager( bool _bCreate ) 268*b1cdbd2cSJim Jagielski { 269*b1cdbd2cSJim Jagielski ::osl::MutexGuard aGuard( m_aMutex ); 270*b1cdbd2cSJim Jagielski 271*b1cdbd2cSJim Jagielski BasicManager* pAppManager = GetSbData()->pAppBasMgr; 272*b1cdbd2cSJim Jagielski if ( ( pAppManager == NULL ) && _bCreate ) 273*b1cdbd2cSJim Jagielski pAppManager = impl_createApplicationBasicManager(); 274*b1cdbd2cSJim Jagielski 275*b1cdbd2cSJim Jagielski return pAppManager; 276*b1cdbd2cSJim Jagielski } 277*b1cdbd2cSJim Jagielski 278*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- setApplicationBasicManager(BasicManager * _pBasicManager)279*b1cdbd2cSJim Jagielski void ImplRepository::setApplicationBasicManager( BasicManager* _pBasicManager ) 280*b1cdbd2cSJim Jagielski { 281*b1cdbd2cSJim Jagielski ::osl::MutexGuard aGuard( m_aMutex ); 282*b1cdbd2cSJim Jagielski 283*b1cdbd2cSJim Jagielski BasicManager* pPreviousManager = getApplicationBasicManager( false ); 284*b1cdbd2cSJim Jagielski BasicManagerCleaner::deleteBasicManager( pPreviousManager ); 285*b1cdbd2cSJim Jagielski 286*b1cdbd2cSJim Jagielski GetSbData()->pAppBasMgr = _pBasicManager; 287*b1cdbd2cSJim Jagielski } 288*b1cdbd2cSJim Jagielski 289*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- impl_createApplicationBasicManager()290*b1cdbd2cSJim Jagielski BasicManager* ImplRepository::impl_createApplicationBasicManager() 291*b1cdbd2cSJim Jagielski { 292*b1cdbd2cSJim Jagielski ::osl::MutexGuard aGuard( m_aMutex ); 293*b1cdbd2cSJim Jagielski OSL_PRECOND( getApplicationBasicManager( false ) == NULL, "ImplRepository::impl_createApplicationBasicManager: there already is one!" ); 294*b1cdbd2cSJim Jagielski 295*b1cdbd2cSJim Jagielski // Determine Directory 296*b1cdbd2cSJim Jagielski SvtPathOptions aPathCFG; 297*b1cdbd2cSJim Jagielski String aAppBasicDir( aPathCFG.GetBasicPath() ); 298*b1cdbd2cSJim Jagielski if ( !aAppBasicDir.Len() ) 299*b1cdbd2cSJim Jagielski aPathCFG.SetBasicPath( String::CreateFromAscii("$(prog)") ); 300*b1cdbd2cSJim Jagielski 301*b1cdbd2cSJim Jagielski // #58293# soffice.new search only in user dir => first dir 302*b1cdbd2cSJim Jagielski String aAppFirstBasicDir = aAppBasicDir.GetToken(1); 303*b1cdbd2cSJim Jagielski 304*b1cdbd2cSJim Jagielski // Create basic and load it 305*b1cdbd2cSJim Jagielski // MT: #47347# AppBasicDir is now a PATH 306*b1cdbd2cSJim Jagielski INetURLObject aAppBasic( SvtPathOptions().SubstituteVariable( String::CreateFromAscii("$(progurl)") ) ); 307*b1cdbd2cSJim Jagielski aAppBasic.insertName( Application::GetAppName() ); 308*b1cdbd2cSJim Jagielski 309*b1cdbd2cSJim Jagielski BasicManager* pBasicManager = new BasicManager( new StarBASIC, &aAppBasicDir ); 310*b1cdbd2cSJim Jagielski setApplicationBasicManager( pBasicManager ); 311*b1cdbd2cSJim Jagielski 312*b1cdbd2cSJim Jagielski // Als Destination das erste Dir im Pfad: 313*b1cdbd2cSJim Jagielski String aFileName( aAppBasic.getName() ); 314*b1cdbd2cSJim Jagielski aAppBasic = INetURLObject( aAppBasicDir.GetToken(1) ); 315*b1cdbd2cSJim Jagielski DBG_ASSERT( aAppBasic.GetProtocol() != INET_PROT_NOT_VALID, "Invalid URL!" ); 316*b1cdbd2cSJim Jagielski aAppBasic.insertName( aFileName ); 317*b1cdbd2cSJim Jagielski pBasicManager->SetStorageName( aAppBasic.PathToFileName() ); 318*b1cdbd2cSJim Jagielski 319*b1cdbd2cSJim Jagielski // Basic container 320*b1cdbd2cSJim Jagielski SfxScriptLibraryContainer* pBasicCont = new SfxScriptLibraryContainer( Reference< XStorage >() ); 321*b1cdbd2cSJim Jagielski Reference< XPersistentLibraryContainer > xBasicCont( pBasicCont ); 322*b1cdbd2cSJim Jagielski pBasicCont->setBasicManager( pBasicManager ); 323*b1cdbd2cSJim Jagielski 324*b1cdbd2cSJim Jagielski // Dialog container 325*b1cdbd2cSJim Jagielski SfxDialogLibraryContainer* pDialogCont = new SfxDialogLibraryContainer( Reference< XStorage >() ); 326*b1cdbd2cSJim Jagielski Reference< XPersistentLibraryContainer > xDialogCont( pDialogCont ); 327*b1cdbd2cSJim Jagielski 328*b1cdbd2cSJim Jagielski LibraryContainerInfo aInfo( xBasicCont, xDialogCont, static_cast< OldBasicPassword* >( pBasicCont ) ); 329*b1cdbd2cSJim Jagielski pBasicManager->SetLibraryContainerInfo( aInfo ); 330*b1cdbd2cSJim Jagielski 331*b1cdbd2cSJim Jagielski // global constants 332*b1cdbd2cSJim Jagielski 333*b1cdbd2cSJim Jagielski // StarDesktop 334*b1cdbd2cSJim Jagielski Reference< XMultiServiceFactory > xSMgr = ::comphelper::getProcessServiceFactory(); 335*b1cdbd2cSJim Jagielski pBasicManager->SetGlobalUNOConstant( 336*b1cdbd2cSJim Jagielski "StarDesktop", 337*b1cdbd2cSJim Jagielski makeAny( xSMgr->createInstance( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.frame.Desktop" ) ) ) ) 338*b1cdbd2cSJim Jagielski ); 339*b1cdbd2cSJim Jagielski 340*b1cdbd2cSJim Jagielski // (BasicLibraries and DialogLibraries have automatically been added in SetLibraryContainerInfo) 341*b1cdbd2cSJim Jagielski 342*b1cdbd2cSJim Jagielski // notify 343*b1cdbd2cSJim Jagielski impl_notifyCreationListeners( NULL, *pBasicManager ); 344*b1cdbd2cSJim Jagielski 345*b1cdbd2cSJim Jagielski // outta here 346*b1cdbd2cSJim Jagielski return pBasicManager; 347*b1cdbd2cSJim Jagielski } 348*b1cdbd2cSJim Jagielski 349*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- registerCreationListener(BasicManagerCreationListener & _rListener)350*b1cdbd2cSJim Jagielski void ImplRepository::registerCreationListener( BasicManagerCreationListener& _rListener ) 351*b1cdbd2cSJim Jagielski { 352*b1cdbd2cSJim Jagielski ::osl::MutexGuard aGuard( m_aMutex ); 353*b1cdbd2cSJim Jagielski m_aCreationListeners.push_back( &_rListener ); 354*b1cdbd2cSJim Jagielski } 355*b1cdbd2cSJim Jagielski 356*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- revokeCreationListener(BasicManagerCreationListener & _rListener)357*b1cdbd2cSJim Jagielski void ImplRepository::revokeCreationListener( BasicManagerCreationListener& _rListener ) 358*b1cdbd2cSJim Jagielski { 359*b1cdbd2cSJim Jagielski ::osl::MutexGuard aGuard( m_aMutex ); 360*b1cdbd2cSJim Jagielski CreationListeners::iterator pos = ::std::find( m_aCreationListeners.begin(), m_aCreationListeners.end(), &_rListener ); 361*b1cdbd2cSJim Jagielski if ( pos != m_aCreationListeners.end() ) 362*b1cdbd2cSJim Jagielski m_aCreationListeners.erase( pos ); 363*b1cdbd2cSJim Jagielski else { 364*b1cdbd2cSJim Jagielski DBG_ERROR( "ImplRepository::revokeCreationListener: listener is not registered!" ); 365*b1cdbd2cSJim Jagielski } 366*b1cdbd2cSJim Jagielski } 367*b1cdbd2cSJim Jagielski 368*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- impl_notifyCreationListeners(const Reference<XModel> & _rxDocumentModel,BasicManager & _rManager)369*b1cdbd2cSJim Jagielski void ImplRepository::impl_notifyCreationListeners( const Reference< XModel >& _rxDocumentModel, BasicManager& _rManager ) 370*b1cdbd2cSJim Jagielski { 371*b1cdbd2cSJim Jagielski for ( CreationListeners::const_iterator loop = m_aCreationListeners.begin(); 372*b1cdbd2cSJim Jagielski loop != m_aCreationListeners.end(); 373*b1cdbd2cSJim Jagielski ++loop 374*b1cdbd2cSJim Jagielski ) 375*b1cdbd2cSJim Jagielski { 376*b1cdbd2cSJim Jagielski (*loop)->onBasicManagerCreated( _rxDocumentModel, _rManager ); 377*b1cdbd2cSJim Jagielski } 378*b1cdbd2cSJim Jagielski } 379*b1cdbd2cSJim Jagielski 380*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- impl_getDefaultAppBasicLibrary()381*b1cdbd2cSJim Jagielski StarBASIC* ImplRepository::impl_getDefaultAppBasicLibrary() 382*b1cdbd2cSJim Jagielski { 383*b1cdbd2cSJim Jagielski BasicManager* pAppManager = getApplicationBasicManager( true ); 384*b1cdbd2cSJim Jagielski 385*b1cdbd2cSJim Jagielski StarBASIC* pAppBasic = pAppManager ? pAppManager->GetLib(0) : NULL; 386*b1cdbd2cSJim Jagielski DBG_ASSERT( pAppBasic != NULL, "impl_getApplicationBasic: unable to determine the default application's Basic library!" ); 387*b1cdbd2cSJim Jagielski return pAppBasic; 388*b1cdbd2cSJim Jagielski } 389*b1cdbd2cSJim Jagielski 390*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- impl_getLocationForModel(const Reference<XModel> & _rxDocumentModel)391*b1cdbd2cSJim Jagielski BasicManagerPointer& ImplRepository::impl_getLocationForModel( const Reference< XModel >& _rxDocumentModel ) 392*b1cdbd2cSJim Jagielski { 393*b1cdbd2cSJim Jagielski Reference< XInterface > xNormalized( _rxDocumentModel, UNO_QUERY ); 394*b1cdbd2cSJim Jagielski DBG_ASSERT( xNormalized.is(), "ImplRepository::impl_getLocationForModel: invalid model!" ); 395*b1cdbd2cSJim Jagielski 396*b1cdbd2cSJim Jagielski BasicManagerPointer& location = m_aStore[ xNormalized ]; 397*b1cdbd2cSJim Jagielski return location; 398*b1cdbd2cSJim Jagielski } 399*b1cdbd2cSJim Jagielski 400*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- impl_initDocLibraryContainers_nothrow(const Reference<XPersistentLibraryContainer> & _rxBasicLibraries,const Reference<XPersistentLibraryContainer> & _rxDialogLibraries)401*b1cdbd2cSJim Jagielski void ImplRepository::impl_initDocLibraryContainers_nothrow( const Reference< XPersistentLibraryContainer >& _rxBasicLibraries, const Reference< XPersistentLibraryContainer >& _rxDialogLibraries ) 402*b1cdbd2cSJim Jagielski { 403*b1cdbd2cSJim Jagielski OSL_PRECOND( _rxBasicLibraries.is() && _rxDialogLibraries.is(), 404*b1cdbd2cSJim Jagielski "ImplRepository::impl_initDocLibraryContainers_nothrow: illegal library containers, this will crash!" ); 405*b1cdbd2cSJim Jagielski 406*b1cdbd2cSJim Jagielski try 407*b1cdbd2cSJim Jagielski { 408*b1cdbd2cSJim Jagielski // ensure there's a standard library in the basic container 409*b1cdbd2cSJim Jagielski ::rtl::OUString aStdLibName( RTL_CONSTASCII_USTRINGPARAM( "Standard" ) ); 410*b1cdbd2cSJim Jagielski if ( !_rxBasicLibraries->hasByName( aStdLibName ) ) 411*b1cdbd2cSJim Jagielski _rxBasicLibraries->createLibrary( aStdLibName ); 412*b1cdbd2cSJim Jagielski // as well as in the dialog container 413*b1cdbd2cSJim Jagielski if ( !_rxDialogLibraries->hasByName( aStdLibName ) ) 414*b1cdbd2cSJim Jagielski _rxDialogLibraries->createLibrary( aStdLibName ); 415*b1cdbd2cSJim Jagielski } 416*b1cdbd2cSJim Jagielski catch( const Exception& ) 417*b1cdbd2cSJim Jagielski { 418*b1cdbd2cSJim Jagielski DBG_UNHANDLED_EXCEPTION(); 419*b1cdbd2cSJim Jagielski } 420*b1cdbd2cSJim Jagielski } 421*b1cdbd2cSJim Jagielski 422*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- impl_createManagerForModel(BasicManagerPointer & _out_rpBasicManager,const Reference<XModel> & _rxDocumentModel)423*b1cdbd2cSJim Jagielski void ImplRepository::impl_createManagerForModel( BasicManagerPointer& _out_rpBasicManager, const Reference< XModel >& _rxDocumentModel ) 424*b1cdbd2cSJim Jagielski { 425*b1cdbd2cSJim Jagielski StarBASIC* pAppBasic = impl_getDefaultAppBasicLibrary(); 426*b1cdbd2cSJim Jagielski 427*b1cdbd2cSJim Jagielski _out_rpBasicManager = 0; 428*b1cdbd2cSJim Jagielski Reference< XStorage > xStorage; 429*b1cdbd2cSJim Jagielski if ( !impl_getDocumentStorage_nothrow( _rxDocumentModel, xStorage ) ) 430*b1cdbd2cSJim Jagielski // the document is not able to provide the storage it is based on. 431*b1cdbd2cSJim Jagielski return; 432*b1cdbd2cSJim Jagielski 433*b1cdbd2cSJim Jagielski Reference< XPersistentLibraryContainer > xBasicLibs; 434*b1cdbd2cSJim Jagielski Reference< XPersistentLibraryContainer > xDialogLibs; 435*b1cdbd2cSJim Jagielski if ( !impl_getDocumentLibraryContainers_nothrow( _rxDocumentModel, xBasicLibs, xDialogLibs ) ) 436*b1cdbd2cSJim Jagielski // the document does not have BasicLibraries and DialogLibraries 437*b1cdbd2cSJim Jagielski return; 438*b1cdbd2cSJim Jagielski 439*b1cdbd2cSJim Jagielski if ( xStorage.is() ) 440*b1cdbd2cSJim Jagielski { 441*b1cdbd2cSJim Jagielski // load BASIC-manager 442*b1cdbd2cSJim Jagielski SfxErrorContext aErrContext( ERRCTX_SFX_LOADBASIC, 443*b1cdbd2cSJim Jagielski ::comphelper::DocumentInfo::getDocumentTitle( _rxDocumentModel ) ); 444*b1cdbd2cSJim Jagielski String aAppBasicDir = SvtPathOptions().GetBasicPath(); 445*b1cdbd2cSJim Jagielski 446*b1cdbd2cSJim Jagielski // Storage and BaseURL are only needed by binary documents! 447*b1cdbd2cSJim Jagielski SotStorageRef xDummyStor = new SotStorage( ::rtl::OUString() ); 448*b1cdbd2cSJim Jagielski _out_rpBasicManager = new BasicManager( *xDummyStor, String() /* TODO/LATER: xStorage */, 449*b1cdbd2cSJim Jagielski pAppBasic, 450*b1cdbd2cSJim Jagielski &aAppBasicDir, sal_True ); 451*b1cdbd2cSJim Jagielski if ( _out_rpBasicManager->HasErrors() ) 452*b1cdbd2cSJim Jagielski { 453*b1cdbd2cSJim Jagielski // handle errors 454*b1cdbd2cSJim Jagielski BasicError* pErr = _out_rpBasicManager->GetFirstError(); 455*b1cdbd2cSJim Jagielski while ( pErr ) 456*b1cdbd2cSJim Jagielski { 457*b1cdbd2cSJim Jagielski // show message to user 458*b1cdbd2cSJim Jagielski if ( ERRCODE_BUTTON_CANCEL == ErrorHandler::HandleError( pErr->GetErrorId() ) ) 459*b1cdbd2cSJim Jagielski { 460*b1cdbd2cSJim Jagielski // user wants to break loading of BASIC-manager 461*b1cdbd2cSJim Jagielski BasicManagerCleaner::deleteBasicManager( _out_rpBasicManager ); 462*b1cdbd2cSJim Jagielski xStorage.clear(); 463*b1cdbd2cSJim Jagielski break; 464*b1cdbd2cSJim Jagielski } 465*b1cdbd2cSJim Jagielski pErr = _out_rpBasicManager->GetNextError(); 466*b1cdbd2cSJim Jagielski } 467*b1cdbd2cSJim Jagielski } 468*b1cdbd2cSJim Jagielski } 469*b1cdbd2cSJim Jagielski 470*b1cdbd2cSJim Jagielski // not loaded? 471*b1cdbd2cSJim Jagielski if ( !xStorage.is() ) 472*b1cdbd2cSJim Jagielski { 473*b1cdbd2cSJim Jagielski // create new BASIC-manager 474*b1cdbd2cSJim Jagielski StarBASIC* pBasic = new StarBASIC( pAppBasic ); 475*b1cdbd2cSJim Jagielski pBasic->SetFlag( SBX_EXTSEARCH ); 476*b1cdbd2cSJim Jagielski _out_rpBasicManager = new BasicManager( pBasic, NULL, sal_True ); 477*b1cdbd2cSJim Jagielski } 478*b1cdbd2cSJim Jagielski 479*b1cdbd2cSJim Jagielski // knit the containers with the BasicManager 480*b1cdbd2cSJim Jagielski LibraryContainerInfo aInfo( xBasicLibs, xDialogLibs, dynamic_cast< OldBasicPassword* >( xBasicLibs.get() ) ); 481*b1cdbd2cSJim Jagielski OSL_ENSURE( aInfo.mpOldBasicPassword, "ImplRepository::impl_createManagerForModel: wrong BasicLibraries implementation!" ); 482*b1cdbd2cSJim Jagielski _out_rpBasicManager->SetLibraryContainerInfo( aInfo ); 483*b1cdbd2cSJim Jagielski //pBasicCont->setBasicManager( _out_rpBasicManager ); 484*b1cdbd2cSJim Jagielski // that's not needed anymore today. The containers will retrieve their associated 485*b1cdbd2cSJim Jagielski // BasicManager from the BasicManagerRepository, when needed. 486*b1cdbd2cSJim Jagielski 487*b1cdbd2cSJim Jagielski // initialize the containers 488*b1cdbd2cSJim Jagielski impl_initDocLibraryContainers_nothrow( xBasicLibs, xDialogLibs ); 489*b1cdbd2cSJim Jagielski 490*b1cdbd2cSJim Jagielski // damit auch Dialoge etc. 'qualifiziert' angesprochen werden k"onnen 491*b1cdbd2cSJim Jagielski _out_rpBasicManager->GetLib(0)->SetParent( pAppBasic ); 492*b1cdbd2cSJim Jagielski 493*b1cdbd2cSJim Jagielski // global properties in the document's Basic 494*b1cdbd2cSJim Jagielski _out_rpBasicManager->SetGlobalUNOConstant( "ThisComponent", makeAny( _rxDocumentModel ) ); 495*b1cdbd2cSJim Jagielski 496*b1cdbd2cSJim Jagielski // notify 497*b1cdbd2cSJim Jagielski impl_notifyCreationListeners( _rxDocumentModel, *_out_rpBasicManager ); 498*b1cdbd2cSJim Jagielski 499*b1cdbd2cSJim Jagielski // register as listener for this model being disposed/closed 500*b1cdbd2cSJim Jagielski Reference< XComponent > xDocumentComponent( _rxDocumentModel, UNO_QUERY ); 501*b1cdbd2cSJim Jagielski OSL_ENSURE( xDocumentComponent.is(), "ImplRepository::impl_createManagerForModel: the document must be an XComponent!" ); 502*b1cdbd2cSJim Jagielski startComponentListening( xDocumentComponent ); 503*b1cdbd2cSJim Jagielski 504*b1cdbd2cSJim Jagielski // register as listener for the BasicManager being destroyed 505*b1cdbd2cSJim Jagielski StartListening( *_out_rpBasicManager ); 506*b1cdbd2cSJim Jagielski 507*b1cdbd2cSJim Jagielski // #i104876: Library container must not be modified just after 508*b1cdbd2cSJim Jagielski // creation. This happens as side effect when creating default 509*b1cdbd2cSJim Jagielski // "Standard" libraries and needs to be corrected here 510*b1cdbd2cSJim Jagielski xBasicLibs->setModified( sal_False ); 511*b1cdbd2cSJim Jagielski xDialogLibs->setModified( sal_False ); 512*b1cdbd2cSJim Jagielski 513*b1cdbd2cSJim Jagielski } 514*b1cdbd2cSJim Jagielski 515*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- impl_getDocumentStorage_nothrow(const Reference<XModel> & _rxDocument,Reference<XStorage> & _out_rStorage)516*b1cdbd2cSJim Jagielski bool ImplRepository::impl_getDocumentStorage_nothrow( const Reference< XModel >& _rxDocument, Reference< XStorage >& _out_rStorage ) 517*b1cdbd2cSJim Jagielski { 518*b1cdbd2cSJim Jagielski _out_rStorage.clear(); 519*b1cdbd2cSJim Jagielski try 520*b1cdbd2cSJim Jagielski { 521*b1cdbd2cSJim Jagielski Reference< XStorageBasedDocument > xStorDoc( _rxDocument, UNO_QUERY_THROW ); 522*b1cdbd2cSJim Jagielski _out_rStorage.set( xStorDoc->getDocumentStorage() ); 523*b1cdbd2cSJim Jagielski } 524*b1cdbd2cSJim Jagielski catch( const Exception& ) 525*b1cdbd2cSJim Jagielski { 526*b1cdbd2cSJim Jagielski DBG_UNHANDLED_EXCEPTION(); 527*b1cdbd2cSJim Jagielski return false; 528*b1cdbd2cSJim Jagielski } 529*b1cdbd2cSJim Jagielski return true; 530*b1cdbd2cSJim Jagielski } 531*b1cdbd2cSJim Jagielski 532*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- impl_getDocumentLibraryContainers_nothrow(const Reference<XModel> & _rxDocument,Reference<XPersistentLibraryContainer> & _out_rxBasicLibraries,Reference<XPersistentLibraryContainer> & _out_rxDialogLibraries)533*b1cdbd2cSJim Jagielski bool ImplRepository::impl_getDocumentLibraryContainers_nothrow( const Reference< XModel >& _rxDocument, 534*b1cdbd2cSJim Jagielski Reference< XPersistentLibraryContainer >& _out_rxBasicLibraries, Reference< XPersistentLibraryContainer >& _out_rxDialogLibraries ) 535*b1cdbd2cSJim Jagielski { 536*b1cdbd2cSJim Jagielski _out_rxBasicLibraries.clear(); 537*b1cdbd2cSJim Jagielski _out_rxDialogLibraries.clear(); 538*b1cdbd2cSJim Jagielski try 539*b1cdbd2cSJim Jagielski { 540*b1cdbd2cSJim Jagielski Reference< XEmbeddedScripts > xScripts( _rxDocument, UNO_QUERY_THROW ); 541*b1cdbd2cSJim Jagielski _out_rxBasicLibraries.set( xScripts->getBasicLibraries(), UNO_QUERY_THROW ); 542*b1cdbd2cSJim Jagielski _out_rxDialogLibraries.set( xScripts->getDialogLibraries(), UNO_QUERY_THROW ); 543*b1cdbd2cSJim Jagielski } 544*b1cdbd2cSJim Jagielski catch( const Exception& ) 545*b1cdbd2cSJim Jagielski { 546*b1cdbd2cSJim Jagielski DBG_UNHANDLED_EXCEPTION(); 547*b1cdbd2cSJim Jagielski } 548*b1cdbd2cSJim Jagielski return _out_rxBasicLibraries.is() && _out_rxDialogLibraries.is(); 549*b1cdbd2cSJim Jagielski } 550*b1cdbd2cSJim Jagielski 551*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- impl_removeFromRepository(BasicManagerStore::iterator _pos)552*b1cdbd2cSJim Jagielski void ImplRepository::impl_removeFromRepository( BasicManagerStore::iterator _pos ) 553*b1cdbd2cSJim Jagielski { 554*b1cdbd2cSJim Jagielski OSL_PRECOND( _pos != m_aStore.end(), "ImplRepository::impl_removeFromRepository: invalid position!" ); 555*b1cdbd2cSJim Jagielski 556*b1cdbd2cSJim Jagielski BasicManager* pManager = _pos->second; 557*b1cdbd2cSJim Jagielski 558*b1cdbd2cSJim Jagielski // *first* remove from map (else Notify won't work properly) 559*b1cdbd2cSJim Jagielski m_aStore.erase( _pos ); 560*b1cdbd2cSJim Jagielski 561*b1cdbd2cSJim Jagielski // *then* delete the BasicManager 562*b1cdbd2cSJim Jagielski EndListening( *pManager ); 563*b1cdbd2cSJim Jagielski BasicManagerCleaner::deleteBasicManager( pManager ); 564*b1cdbd2cSJim Jagielski } 565*b1cdbd2cSJim Jagielski 566*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- _disposing(const::com::sun::star::lang::EventObject & _rSource)567*b1cdbd2cSJim Jagielski void ImplRepository::_disposing( const ::com::sun::star::lang::EventObject& _rSource ) 568*b1cdbd2cSJim Jagielski { 569*b1cdbd2cSJim Jagielski ::osl::MutexGuard aGuard( m_aMutex ); 570*b1cdbd2cSJim Jagielski 571*b1cdbd2cSJim Jagielski Reference< XInterface > xNormalizedSource( _rSource.Source, UNO_QUERY ); 572*b1cdbd2cSJim Jagielski #if OSL_DEBUG_LEVEL > 0 573*b1cdbd2cSJim Jagielski bool bFound = false; 574*b1cdbd2cSJim Jagielski #endif 575*b1cdbd2cSJim Jagielski 576*b1cdbd2cSJim Jagielski for ( BasicManagerStore::iterator loop = m_aStore.begin(); 577*b1cdbd2cSJim Jagielski loop != m_aStore.end(); 578*b1cdbd2cSJim Jagielski ++loop 579*b1cdbd2cSJim Jagielski ) 580*b1cdbd2cSJim Jagielski { 581*b1cdbd2cSJim Jagielski if ( loop->first.get() == xNormalizedSource.get() ) 582*b1cdbd2cSJim Jagielski { 583*b1cdbd2cSJim Jagielski impl_removeFromRepository( loop ); 584*b1cdbd2cSJim Jagielski #if OSL_DEBUG_LEVEL > 0 585*b1cdbd2cSJim Jagielski bFound = true; 586*b1cdbd2cSJim Jagielski #endif 587*b1cdbd2cSJim Jagielski break; 588*b1cdbd2cSJim Jagielski } 589*b1cdbd2cSJim Jagielski } 590*b1cdbd2cSJim Jagielski 591*b1cdbd2cSJim Jagielski OSL_ENSURE( bFound, "ImplRepository::_disposing: where does this come from?" ); 592*b1cdbd2cSJim Jagielski } 593*b1cdbd2cSJim Jagielski 594*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- Notify(SfxBroadcaster & _rBC,const SfxHint & _rHint)595*b1cdbd2cSJim Jagielski void ImplRepository::Notify( SfxBroadcaster& _rBC, const SfxHint& _rHint ) 596*b1cdbd2cSJim Jagielski { 597*b1cdbd2cSJim Jagielski const SfxSimpleHint* pSimpleHint = dynamic_cast< const SfxSimpleHint* >( &_rHint ); 598*b1cdbd2cSJim Jagielski if ( !pSimpleHint || ( pSimpleHint->GetId() != SFX_HINT_DYING ) ) 599*b1cdbd2cSJim Jagielski // not interested in 600*b1cdbd2cSJim Jagielski return; 601*b1cdbd2cSJim Jagielski 602*b1cdbd2cSJim Jagielski BasicManager* pManager = dynamic_cast< BasicManager* >( &_rBC ); 603*b1cdbd2cSJim Jagielski OSL_ENSURE( pManager, "ImplRepository::Notify: where does this come from?" ); 604*b1cdbd2cSJim Jagielski 605*b1cdbd2cSJim Jagielski for ( BasicManagerStore::iterator loop = m_aStore.begin(); 606*b1cdbd2cSJim Jagielski loop != m_aStore.end(); 607*b1cdbd2cSJim Jagielski ++loop 608*b1cdbd2cSJim Jagielski ) 609*b1cdbd2cSJim Jagielski { 610*b1cdbd2cSJim Jagielski if ( loop->second == pManager ) 611*b1cdbd2cSJim Jagielski { 612*b1cdbd2cSJim Jagielski // a BasicManager which is still in our repository is being deleted. 613*b1cdbd2cSJim Jagielski // That's bad, since by definition, we *own* all instances in our 614*b1cdbd2cSJim Jagielski // repository. 615*b1cdbd2cSJim Jagielski OSL_ENSURE( false, "ImplRepository::Notify: nobody should tamper with the managers, except ourself!" ); 616*b1cdbd2cSJim Jagielski m_aStore.erase( loop ); 617*b1cdbd2cSJim Jagielski break; 618*b1cdbd2cSJim Jagielski } 619*b1cdbd2cSJim Jagielski } 620*b1cdbd2cSJim Jagielski } 621*b1cdbd2cSJim Jagielski 622*b1cdbd2cSJim Jagielski //==================================================================== 623*b1cdbd2cSJim Jagielski //= BasicManagerRepository 624*b1cdbd2cSJim Jagielski //==================================================================== 625*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- getDocumentBasicManager(const Reference<XModel> & _rxDocumentModel)626*b1cdbd2cSJim Jagielski BasicManager* BasicManagerRepository::getDocumentBasicManager( const Reference< XModel >& _rxDocumentModel ) 627*b1cdbd2cSJim Jagielski { 628*b1cdbd2cSJim Jagielski return ImplRepository::Instance().getDocumentBasicManager( _rxDocumentModel ); 629*b1cdbd2cSJim Jagielski } 630*b1cdbd2cSJim Jagielski 631*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- getApplicationBasicManager(bool _bCreate)632*b1cdbd2cSJim Jagielski BasicManager* BasicManagerRepository::getApplicationBasicManager( bool _bCreate ) 633*b1cdbd2cSJim Jagielski { 634*b1cdbd2cSJim Jagielski return ImplRepository::Instance().getApplicationBasicManager( _bCreate ); 635*b1cdbd2cSJim Jagielski } 636*b1cdbd2cSJim Jagielski 637*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- resetApplicationBasicManager()638*b1cdbd2cSJim Jagielski void BasicManagerRepository::resetApplicationBasicManager() 639*b1cdbd2cSJim Jagielski { 640*b1cdbd2cSJim Jagielski return ImplRepository::Instance().setApplicationBasicManager( NULL ); 641*b1cdbd2cSJim Jagielski } 642*b1cdbd2cSJim Jagielski 643*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- registerCreationListener(BasicManagerCreationListener & _rListener)644*b1cdbd2cSJim Jagielski void BasicManagerRepository::registerCreationListener( BasicManagerCreationListener& _rListener ) 645*b1cdbd2cSJim Jagielski { 646*b1cdbd2cSJim Jagielski ImplRepository::Instance().registerCreationListener( _rListener ); 647*b1cdbd2cSJim Jagielski } 648*b1cdbd2cSJim Jagielski 649*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- revokeCreationListener(BasicManagerCreationListener & _rListener)650*b1cdbd2cSJim Jagielski void BasicManagerRepository::revokeCreationListener( BasicManagerCreationListener& _rListener ) 651*b1cdbd2cSJim Jagielski { 652*b1cdbd2cSJim Jagielski ImplRepository::Instance().revokeCreationListener( _rListener ); 653*b1cdbd2cSJim Jagielski } 654*b1cdbd2cSJim Jagielski 655*b1cdbd2cSJim Jagielski //........................................................................ 656*b1cdbd2cSJim Jagielski } // namespace basic 657*b1cdbd2cSJim Jagielski //........................................................................ 658*b1cdbd2cSJim Jagielski 659