xref: /trunk/main/basic/source/inc/namecont.hxx (revision 91144cd0085a7583d2099b982122deb2184ab956)
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