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