1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 #ifndef SCRIPTING_DLGPROV_HXX
29 #define SCRIPTING_DLGPROV_HXX
30 
31 #ifndef _COM_SUN_STAR_AWT_XSTRINGRESOURCEWITHSTORAGE_HPP_
32 #include <com/sun/star/resource/XStringResourceWithStorage.hpp>
33 #endif
34 #ifndef _COM_SUN_STAR_AWT_XSTRINGRESOURCEWITHSTORAGE_HPP_
35 #include <com/sun/star/resource/XStringResourceWithLocation.hpp>
36 #endif
37 #include <com/sun/star/lang/XServiceInfo.hpp>
38 #include <com/sun/star/lang/XInitialization.hpp>
39 #include <com/sun/star/uno/XComponentContext.hpp>
40 #include <com/sun/star/ucb/XSimpleFileAccess.hpp>
41 #include <com/sun/star/io/XInputStream.hpp>
42 #include <com/sun/star/io/XOutputStream.hpp>
43 #include <cppuhelper/implbase1.hxx>
44 #include <cppuhelper/implbase2.hxx>
45 #include <cppuhelper/interfacecontainer.hxx>
46 #include <osl/mutex.hxx>
47 
48 #include <vector>
49 #include <hash_map>
50 
51 //.........................................................................
52 namespace stringresource
53 {
54 //.........................................................................
55 
56 // =============================================================================
57 // mutex
58 // =============================================================================
59 
60 ::osl::Mutex& getMutex();
61 
62 
63 // =============================================================================
64 // class stringresourceImpl
65 // =============================================================================
66 
67 // Hashtable to map string ids to string
68 struct hashName_Impl
69 {
70 	size_t operator()(const ::rtl::OUString Str) const
71 	{
72 		return (size_t)Str.hashCode();
73 	}
74 };
75 
76 struct eqName_Impl
77 {
78 	sal_Bool operator()(const ::rtl::OUString Str1, const ::rtl::OUString Str2) const
79 	{
80 		return ( Str1 == Str2 );
81 	}
82 };
83 
84 typedef std::hash_map
85 <
86 	::rtl::OUString,
87 	::rtl::OUString,
88 	hashName_Impl,
89 	eqName_Impl
90 >
91 IdToStringMap;
92 
93 typedef std::hash_map
94 <
95 	::rtl::OUString,
96 	sal_Int32,
97 	hashName_Impl,
98 	eqName_Impl
99 >
100 IdToIndexMap;
101 
102 
103 struct LocaleItem
104 {
105 	::com::sun::star::lang::Locale		m_locale;
106 	IdToStringMap						m_aIdToStringMap;
107 	IdToIndexMap						m_aIdToIndexMap;
108 	sal_Int32							m_nNextIndex;
109 	bool								m_bLoaded;
110 	bool								m_bModified;
111 
112 	LocaleItem( ::com::sun::star::lang::Locale locale, bool bLoaded=true )
113 		: m_locale( locale )
114 		, m_nNextIndex( 0 )
115 		, m_bLoaded( bLoaded )
116 		, m_bModified( false )
117 	{}
118 };
119 
120 typedef std::vector< LocaleItem* > LocaleItemVector;
121 typedef std::vector< LocaleItem* >::iterator LocaleItemVectorIt;
122 typedef std::vector< LocaleItem* >::const_iterator LocaleItemVectorConstIt;
123 
124 typedef ::cppu::WeakImplHelper2<
125     ::com::sun::star::lang::XServiceInfo,
126     ::com::sun::star::resource::XStringResourceManager > StringResourceImpl_BASE;
127 
128 class StringResourceImpl : public StringResourceImpl_BASE
129 {
130 protected:
131     ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext >        m_xContext;
132 	::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiComponentFactory >	m_xMCF;
133 
134 	LocaleItem*																			m_pCurrentLocaleItem;
135 	LocaleItem*																			m_pDefaultLocaleItem;
136 	bool																				m_bDefaultModified;
137 
138 	::cppu::OInterfaceContainerHelper													m_aListenerContainer;
139 
140 	LocaleItemVector																	m_aLocaleItemVector;
141 	LocaleItemVector																	m_aDeletedLocaleItemVector;
142 	LocaleItemVector																	m_aChangedDefaultLocaleVector;
143 
144 	bool																				m_bModified;
145 	bool																				m_bReadOnly;
146 
147 	sal_Int32																			m_nNextUniqueNumericId;
148 
149 	// Scans ResourceID to start with number and adapt m_nNextUniqueNumericId
150 	void implScanIdForNumber( const ::rtl::OUString& ResourceID );
151 	const static sal_Int32 UNIQUE_NUMBER_NEEDS_INITIALISATION = -1;
152 
153 	// Checks read only status and throws exception if it's true
154 	void implCheckReadOnly( const sal_Char* pExceptionMsg )
155 		throw (::com::sun::star::lang::NoSupportException);
156 
157 	// Return the context's MultiComponentFactory
158 	::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiComponentFactory >
159 		getMultiComponentFactory( void );
160 
161 	// Returns the LocalItem for a given locale, if it exists, otherwise NULL
162 	// This method compares the locales exactly, no closest match search is performed
163 	LocaleItem* getItemForLocale( const ::com::sun::star::lang::Locale& locale, sal_Bool bException )
164 		throw (::com::sun::star::lang::IllegalArgumentException);
165 
166 	// Returns the LocalItem for a given locale, if it exists, otherwise NULL
167 	// This method performes a closest match search, at least the language must match
168 	LocaleItem* getClosestMatchItemForLocale( const ::com::sun::star::lang::Locale& locale );
169 	void implSetCurrentLocale( const ::com::sun::star::lang::Locale& locale,
170 		sal_Bool FindClosestMatch, sal_Bool bUseDefaultIfNoMatch )
171 			throw (::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException);
172 
173 	void implModified( void );
174 	void implNotifyListeners( void );
175 
176 	//=== Impl methods for ...ForLocale methods ===
177     ::rtl::OUString SAL_CALL implResolveString( const ::rtl::OUString& ResourceID, LocaleItem* pLocaleItem )
178 		throw (::com::sun::star::resource::MissingResourceException);
179     ::sal_Bool implHasEntryForId( const ::rtl::OUString& ResourceID, LocaleItem* pLocaleItem );
180 	::com::sun::star::uno::Sequence< ::rtl::OUString > implGetResourceIDs( LocaleItem* pLocaleItem );
181 	void implSetString( const ::rtl::OUString& ResourceID,
182 		const ::rtl::OUString& Str, LocaleItem* pLocaleItem );
183     void implRemoveId( const ::rtl::OUString& ResourceID, LocaleItem* pLocaleItem )
184 		throw (::com::sun::star::resource::MissingResourceException);
185 
186 	// Method to load a locale if necessary, returns true if loading was
187 	// successful. Default implementation in base class just returns true.
188 	virtual bool loadLocale( LocaleItem* pLocaleItem );
189 
190 	virtual void implLoadAllLocales( void );
191 
192 public:
193     StringResourceImpl(
194         const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext >& rxContext );
195     virtual ~StringResourceImpl();
196 
197     // XServiceInfo
198     virtual ::rtl::OUString SAL_CALL getImplementationName(  )
199         throw (::com::sun::star::uno::RuntimeException);
200     virtual sal_Bool SAL_CALL supportsService( const ::rtl::OUString& ServiceName )
201         throw (::com::sun::star::uno::RuntimeException);
202     virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames(  )
203         throw (::com::sun::star::uno::RuntimeException);
204 
205 	// XModifyBroadcaster
206 	virtual void SAL_CALL addModifyListener( const ::com::sun::star::uno::Reference< ::com::sun::star::util::XModifyListener >& aListener )
207 		throw (::com::sun::star::uno::RuntimeException);
208 	virtual void SAL_CALL removeModifyListener( const ::com::sun::star::uno::Reference< ::com::sun::star::util::XModifyListener >& aListener )
209 		throw (::com::sun::star::uno::RuntimeException);
210 
211  	// XStringResourceResolver
212 	virtual ::rtl::OUString SAL_CALL resolveString( const ::rtl::OUString& ResourceID )
213 		throw (::com::sun::star::resource::MissingResourceException, ::com::sun::star::uno::RuntimeException);
214     virtual ::rtl::OUString SAL_CALL resolveStringForLocale( const ::rtl::OUString& ResourceID,
215 		const ::com::sun::star::lang::Locale& locale )
216 			throw ( ::com::sun::star::resource::MissingResourceException,
217 					::com::sun::star::uno::RuntimeException);
218     virtual ::sal_Bool SAL_CALL hasEntryForId( const ::rtl::OUString& ResourceID )
219 		throw (::com::sun::star::uno::RuntimeException);
220     virtual ::sal_Bool SAL_CALL hasEntryForIdAndLocale( const ::rtl::OUString& ResourceID,
221 		const ::com::sun::star::lang::Locale& locale )
222 			throw (::com::sun::star::uno::RuntimeException);
223 	virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getResourceIDs(  )
224 		throw (::com::sun::star::uno::RuntimeException);
225     virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getResourceIDsForLocale
226 		( const ::com::sun::star::lang::Locale& locale )
227 			throw (::com::sun::star::uno::RuntimeException);
228 	virtual ::com::sun::star::lang::Locale SAL_CALL getCurrentLocale(  )
229 		throw (::com::sun::star::uno::RuntimeException);
230 	virtual ::com::sun::star::lang::Locale SAL_CALL getDefaultLocale(  )
231 		throw (::com::sun::star::uno::RuntimeException);
232 	virtual ::com::sun::star::uno::Sequence< ::com::sun::star::lang::Locale > SAL_CALL getLocales(  )
233 		throw (::com::sun::star::uno::RuntimeException);
234 
235 	// XStringResourceManager
236 	virtual ::sal_Bool SAL_CALL isReadOnly()
237 		throw (::com::sun::star::uno::RuntimeException);
238 	virtual void SAL_CALL setCurrentLocale( const ::com::sun::star::lang::Locale& locale, ::sal_Bool FindClosestMatch )
239 		throw (::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException);
240 	virtual void SAL_CALL setDefaultLocale( const ::com::sun::star::lang::Locale& locale )
241 		throw (::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException,
242 		       ::com::sun::star::lang::NoSupportException);
243     virtual void SAL_CALL setString( const ::rtl::OUString& ResourceID, const ::rtl::OUString& Str )
244 		throw (::com::sun::star::lang::NoSupportException, ::com::sun::star::uno::RuntimeException);
245     virtual void SAL_CALL setStringForLocale( const ::rtl::OUString& ResourceID, const ::rtl::OUString& Str,
246 		const ::com::sun::star::lang::Locale& locale )
247 			throw (::com::sun::star::lang::NoSupportException, ::com::sun::star::uno::RuntimeException);
248 	virtual void SAL_CALL removeId( const ::rtl::OUString& ResourceID )
249 		throw (::com::sun::star::resource::MissingResourceException, ::com::sun::star::uno::RuntimeException,
250 		       ::com::sun::star::lang::NoSupportException);
251     virtual void SAL_CALL removeIdForLocale( const ::rtl::OUString& ResourceID,
252 		const ::com::sun::star::lang::Locale& locale )
253 			throw (::com::sun::star::resource::MissingResourceException, ::com::sun::star::uno::RuntimeException,
254 				   ::com::sun::star::lang::NoSupportException);
255 	virtual void SAL_CALL newLocale( const ::com::sun::star::lang::Locale& locale )
256 		throw (::com::sun::star::container::ElementExistException, ::com::sun::star::lang::IllegalArgumentException,
257 			   ::com::sun::star::lang::NoSupportException, ::com::sun::star::uno::RuntimeException);
258 	virtual void SAL_CALL removeLocale( const ::com::sun::star::lang::Locale& locale )
259 		throw (::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException,
260 		       ::com::sun::star::lang::NoSupportException);
261     virtual ::sal_Int32 SAL_CALL getUniqueNumericId(  )
262 		throw (::com::sun::star::lang::NoSupportException,
263 			   ::com::sun::star::uno::RuntimeException);
264  };
265 
266 typedef ::cppu::ImplInheritanceHelper1<
267 		StringResourceImpl,
268 		::com::sun::star::resource::XStringResourcePersistence > StringResourcePersistenceImpl_BASE;
269 
270 class BinaryOutput;
271 class BinaryInput;
272 
273 class StringResourcePersistenceImpl : public StringResourcePersistenceImpl_BASE
274 {
275 protected:
276 	::rtl::OUString																m_aNameBase;
277 	::rtl::OUString																m_aComment;
278 
279     void SAL_CALL implInitializeCommonParameters
280 		( const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any >& aArguments )
281 			throw (::com::sun::star::uno::Exception, ::com::sun::star::uno::RuntimeException);
282 
283 	// Scan locale properties files
284 	virtual void implScanLocales( void );
285 
286 	// Method to load a locale if necessary, returns true if loading was successful
287 	virtual bool loadLocale( LocaleItem* pLocaleItem );
288 
289 	// does the actual loading
290 	virtual bool implLoadLocale( LocaleItem* pLocaleItem );
291 
292 	virtual void implLoadAllLocales( void );
293 
294 	void implScanLocaleNames( const ::com::sun::star::uno::Sequence< ::rtl::OUString >& aContentSeq );
295 	::rtl::OUString implGetFileNameForLocaleItem( LocaleItem* pLocaleItem, const ::rtl::OUString& aNameBase );
296 	::rtl::OUString implGetPathForLocaleItem( LocaleItem* pLocaleItem, const ::rtl::OUString& aNameBase,
297 		const ::rtl::OUString& aLocation, bool bDefaultFile=false );
298 
299 	bool implReadPropertiesFile( LocaleItem* pLocaleItem,
300 		const ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream >& xInput );
301 
302 	bool implWritePropertiesFile( LocaleItem* pLocaleItem, const ::com::sun::star::uno::Reference
303 		< ::com::sun::star::io::XOutputStream >& xOutputStream, const ::rtl::OUString& aComment );
304 
305 	void implWriteLocaleBinary( LocaleItem* pLocaleItem, BinaryOutput& rOut );
306 
307 	void implStoreAtStorage
308 	(
309 		const ::rtl::OUString& aNameBase,
310 		const ::rtl::OUString& aComment,
311 		const ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage >& Storage,
312 		bool bUsedForStore,
313 		bool bStoreAll
314 	)
315 	throw (::com::sun::star::uno::Exception, ::com::sun::star::uno::RuntimeException);
316 
317 	void implKillRemovedLocaleFiles
318 	(
319 		const ::rtl::OUString& Location,
320 		const ::rtl::OUString& aNameBase,
321 		const ::com::sun::star::uno::Reference< ::com::sun::star::ucb::XSimpleFileAccess >& xFileAccess
322 	)
323 	throw (::com::sun::star::uno::Exception, ::com::sun::star::uno::RuntimeException);
324 
325 	void implKillChangedDefaultFiles
326 	(
327 		const ::rtl::OUString& Location,
328 		const ::rtl::OUString& aNameBase,
329 		const ::com::sun::star::uno::Reference< ::com::sun::star::ucb::XSimpleFileAccess >& xFileAccess
330 	)
331 	throw (::com::sun::star::uno::Exception, ::com::sun::star::uno::RuntimeException);
332 
333 	void implStoreAtLocation
334 	(
335 		const ::rtl::OUString& Location,
336 		const ::rtl::OUString& aNameBase,
337 		const ::rtl::OUString& aComment,
338 		const ::com::sun::star::uno::Reference< ::com::sun::star::ucb::XSimpleFileAccess >& xFileAccess,
339 		bool bUsedForStore,
340 		bool bStoreAll,
341 		bool bKillAll = false
342 	)
343 	throw (::com::sun::star::uno::Exception, ::com::sun::star::uno::RuntimeException);
344 
345 public:
346     StringResourcePersistenceImpl(
347         const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext >& rxContext );
348     virtual ~StringResourcePersistenceImpl();
349 
350     // XServiceInfo
351     virtual ::rtl::OUString SAL_CALL getImplementationName(  )
352         throw (::com::sun::star::uno::RuntimeException);
353     virtual sal_Bool SAL_CALL supportsService( const ::rtl::OUString& ServiceName )
354         throw (::com::sun::star::uno::RuntimeException);
355     virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames(  )
356         throw (::com::sun::star::uno::RuntimeException);
357 
358 	// XModifyBroadcaster
359 	virtual void SAL_CALL addModifyListener( const ::com::sun::star::uno::Reference< ::com::sun::star::util::XModifyListener >& aListener )
360 		throw (::com::sun::star::uno::RuntimeException);
361 	virtual void SAL_CALL removeModifyListener( const ::com::sun::star::uno::Reference< ::com::sun::star::util::XModifyListener >& aListener )
362 		throw (::com::sun::star::uno::RuntimeException);
363 
364  	// XStringResourceResolver
365 	virtual ::rtl::OUString SAL_CALL resolveString( const ::rtl::OUString& ResourceID )
366 		throw (::com::sun::star::resource::MissingResourceException, ::com::sun::star::uno::RuntimeException);
367     virtual ::rtl::OUString SAL_CALL resolveStringForLocale( const ::rtl::OUString& ResourceID,
368 		const ::com::sun::star::lang::Locale& locale )
369 			throw ( ::com::sun::star::resource::MissingResourceException,
370 					::com::sun::star::uno::RuntimeException);
371     virtual ::sal_Bool SAL_CALL hasEntryForId( const ::rtl::OUString& ResourceID )
372 		throw (::com::sun::star::uno::RuntimeException);
373     virtual ::sal_Bool SAL_CALL hasEntryForIdAndLocale( const ::rtl::OUString& ResourceID,
374 		const ::com::sun::star::lang::Locale& locale )
375 			throw (::com::sun::star::uno::RuntimeException);
376 	virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getResourceIDs(  )
377 		throw (::com::sun::star::uno::RuntimeException);
378     virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getResourceIDsForLocale
379 		( const ::com::sun::star::lang::Locale& locale )
380 			throw (::com::sun::star::uno::RuntimeException);
381 	virtual ::com::sun::star::lang::Locale SAL_CALL getCurrentLocale(  )
382 		throw (::com::sun::star::uno::RuntimeException);
383 	virtual ::com::sun::star::lang::Locale SAL_CALL getDefaultLocale(  )
384 		throw (::com::sun::star::uno::RuntimeException);
385 	virtual ::com::sun::star::uno::Sequence< ::com::sun::star::lang::Locale > SAL_CALL getLocales(  )
386 		throw (::com::sun::star::uno::RuntimeException);
387 
388 	// XStringResourceManager
389 	virtual ::sal_Bool SAL_CALL isReadOnly()
390 		throw (::com::sun::star::uno::RuntimeException);
391 	virtual void SAL_CALL setCurrentLocale( const ::com::sun::star::lang::Locale& locale, ::sal_Bool FindClosestMatch )
392 		throw (::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException);
393 	virtual void SAL_CALL setDefaultLocale( const ::com::sun::star::lang::Locale& locale )
394 		throw (::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException,
395 		       ::com::sun::star::lang::NoSupportException);
396     virtual void SAL_CALL setString( const ::rtl::OUString& ResourceID, const ::rtl::OUString& Str )
397 		throw (::com::sun::star::lang::NoSupportException, ::com::sun::star::uno::RuntimeException);
398     virtual void SAL_CALL setStringForLocale( const ::rtl::OUString& ResourceID, const ::rtl::OUString& Str,
399 		const ::com::sun::star::lang::Locale& locale )
400 			throw (::com::sun::star::lang::NoSupportException, ::com::sun::star::uno::RuntimeException);
401 	virtual void SAL_CALL removeId( const ::rtl::OUString& ResourceID )
402 		throw (::com::sun::star::resource::MissingResourceException, ::com::sun::star::uno::RuntimeException,
403 		       ::com::sun::star::lang::NoSupportException);
404     virtual void SAL_CALL removeIdForLocale( const ::rtl::OUString& ResourceID,
405 		const ::com::sun::star::lang::Locale& locale )
406 			throw (::com::sun::star::resource::MissingResourceException, ::com::sun::star::uno::RuntimeException,
407 				   ::com::sun::star::lang::NoSupportException);
408 	virtual void SAL_CALL newLocale( const ::com::sun::star::lang::Locale& locale )
409 		throw (::com::sun::star::container::ElementExistException, ::com::sun::star::lang::IllegalArgumentException,
410 			   ::com::sun::star::lang::NoSupportException, ::com::sun::star::uno::RuntimeException);
411 	virtual void SAL_CALL removeLocale( const ::com::sun::star::lang::Locale& locale )
412 		throw (::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException,
413 		       ::com::sun::star::lang::NoSupportException);
414     virtual ::sal_Int32 SAL_CALL getUniqueNumericId(  )
415 		throw (::com::sun::star::lang::NoSupportException,
416 			   ::com::sun::star::uno::RuntimeException);
417 
418 	// XStringResourcePersistence
419     virtual void SAL_CALL store(  )
420 		throw (::com::sun::star::lang::NoSupportException,
421 			   ::com::sun::star::uno::Exception,
422 			   ::com::sun::star::uno::RuntimeException);
423     virtual ::sal_Bool SAL_CALL isModified(  )
424 		throw (::com::sun::star::uno::RuntimeException);
425     virtual void SAL_CALL setComment( const ::rtl::OUString& Comment )
426 		throw (::com::sun::star::uno::RuntimeException);
427 	virtual void SAL_CALL storeToStorage
428 		( const ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage >& Storage,
429 		  const ::rtl::OUString& NameBase, const ::rtl::OUString& Comment )
430 			throw (::com::sun::star::uno::Exception, ::com::sun::star::uno::RuntimeException);
431     virtual void SAL_CALL storeToURL( const ::rtl::OUString& URL, const ::rtl::OUString& NameBase,
432 		const ::rtl::OUString& Comment,	const ::com::sun::star::uno::Reference
433 		< ::com::sun::star::task::XInteractionHandler >& Handler )
434 			throw (::com::sun::star::uno::Exception, ::com::sun::star::uno::RuntimeException);
435     virtual ::com::sun::star::uno::Sequence< ::sal_Int8 > SAL_CALL exportBinary(  )
436 		throw (::com::sun::star::uno::RuntimeException);
437     virtual void SAL_CALL importBinary( const ::com::sun::star::uno::Sequence< ::sal_Int8 >& Data )
438 		throw (::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException);
439 };
440 
441 
442 typedef ::cppu::ImplInheritanceHelper2<
443 		StringResourcePersistenceImpl,
444 	    ::com::sun::star::lang::XInitialization,
445 		::com::sun::star::resource::XStringResourceWithStorage > StringResourceWithStorageImpl_BASE;
446 
447 class StringResourceWithStorageImpl : public StringResourceWithStorageImpl_BASE
448 {
449 	::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage >		m_xStorage;
450 	bool																		m_bStorageChanged;
451 
452 	virtual void implScanLocales( void );
453 	virtual bool implLoadLocale( LocaleItem* pLocaleItem );
454 
455 public:
456     StringResourceWithStorageImpl(
457         const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext >& rxContext );
458     virtual ~StringResourceWithStorageImpl();
459 
460     // XServiceInfo
461     virtual ::rtl::OUString SAL_CALL getImplementationName(  )
462         throw (::com::sun::star::uno::RuntimeException);
463     virtual sal_Bool SAL_CALL supportsService( const ::rtl::OUString& ServiceName )
464         throw (::com::sun::star::uno::RuntimeException);
465     virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames(  )
466         throw (::com::sun::star::uno::RuntimeException);
467 
468     // XInitialization
469     virtual void SAL_CALL initialize( const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any >& aArguments )
470         throw (::com::sun::star::uno::Exception, ::com::sun::star::uno::RuntimeException);
471 
472 	// XModifyBroadcaster
473 	virtual void SAL_CALL addModifyListener( const ::com::sun::star::uno::Reference< ::com::sun::star::util::XModifyListener >& aListener )
474 		throw (::com::sun::star::uno::RuntimeException);
475 	virtual void SAL_CALL removeModifyListener( const ::com::sun::star::uno::Reference< ::com::sun::star::util::XModifyListener >& aListener )
476 		throw (::com::sun::star::uno::RuntimeException);
477 
478  	// XStringResourceResolver
479 	virtual ::rtl::OUString SAL_CALL resolveString( const ::rtl::OUString& ResourceID )
480 		throw (::com::sun::star::resource::MissingResourceException, ::com::sun::star::uno::RuntimeException);
481     virtual ::rtl::OUString SAL_CALL resolveStringForLocale( const ::rtl::OUString& ResourceID,
482 		const ::com::sun::star::lang::Locale& locale )
483 			throw ( ::com::sun::star::resource::MissingResourceException,
484 					::com::sun::star::uno::RuntimeException);
485     virtual ::sal_Bool SAL_CALL hasEntryForId( const ::rtl::OUString& ResourceID )
486 		throw (::com::sun::star::uno::RuntimeException);
487     virtual ::sal_Bool SAL_CALL hasEntryForIdAndLocale( const ::rtl::OUString& ResourceID,
488 		const ::com::sun::star::lang::Locale& locale )
489 			throw (::com::sun::star::uno::RuntimeException);
490 	virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getResourceIDs(  )
491 		throw (::com::sun::star::uno::RuntimeException);
492     virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getResourceIDsForLocale
493 		( const ::com::sun::star::lang::Locale& locale )
494 			throw (::com::sun::star::uno::RuntimeException);
495 	virtual ::com::sun::star::lang::Locale SAL_CALL getCurrentLocale(  )
496 		throw (::com::sun::star::uno::RuntimeException);
497 	virtual ::com::sun::star::lang::Locale SAL_CALL getDefaultLocale(  )
498 		throw (::com::sun::star::uno::RuntimeException);
499 	virtual ::com::sun::star::uno::Sequence< ::com::sun::star::lang::Locale > SAL_CALL getLocales(  )
500 		throw (::com::sun::star::uno::RuntimeException);
501 
502 	// XStringResourceManager
503 	virtual ::sal_Bool SAL_CALL isReadOnly()
504 		throw (::com::sun::star::uno::RuntimeException);
505 	virtual void SAL_CALL setCurrentLocale( const ::com::sun::star::lang::Locale& locale, ::sal_Bool FindClosestMatch )
506 		throw (::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException);
507 	virtual void SAL_CALL setDefaultLocale( const ::com::sun::star::lang::Locale& locale )
508 		throw (::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException,
509 		       ::com::sun::star::lang::NoSupportException);
510     virtual void SAL_CALL setString( const ::rtl::OUString& ResourceID, const ::rtl::OUString& Str )
511 		throw (::com::sun::star::lang::NoSupportException, ::com::sun::star::uno::RuntimeException);
512     virtual void SAL_CALL setStringForLocale( const ::rtl::OUString& ResourceID, const ::rtl::OUString& Str,
513 		const ::com::sun::star::lang::Locale& locale )
514 			throw (::com::sun::star::lang::NoSupportException, ::com::sun::star::uno::RuntimeException);
515 	virtual void SAL_CALL removeId( const ::rtl::OUString& ResourceID )
516 		throw (::com::sun::star::resource::MissingResourceException, ::com::sun::star::uno::RuntimeException,
517 		       ::com::sun::star::lang::NoSupportException);
518     virtual void SAL_CALL removeIdForLocale( const ::rtl::OUString& ResourceID,
519 		const ::com::sun::star::lang::Locale& locale )
520 			throw (::com::sun::star::resource::MissingResourceException, ::com::sun::star::uno::RuntimeException,
521 				   ::com::sun::star::lang::NoSupportException);
522 	virtual void SAL_CALL newLocale( const ::com::sun::star::lang::Locale& locale )
523 		throw (::com::sun::star::container::ElementExistException, ::com::sun::star::lang::IllegalArgumentException,
524 			   ::com::sun::star::lang::NoSupportException, ::com::sun::star::uno::RuntimeException);
525 	virtual void SAL_CALL removeLocale( const ::com::sun::star::lang::Locale& locale )
526 		throw (::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException,
527 		       ::com::sun::star::lang::NoSupportException);
528     virtual ::sal_Int32 SAL_CALL getUniqueNumericId(  )
529 		throw (::com::sun::star::lang::NoSupportException,
530 			   ::com::sun::star::uno::RuntimeException);
531 
532 	// XStringResourcePersistence
533     virtual void SAL_CALL store(  )
534 		throw (::com::sun::star::lang::NoSupportException,
535 			   ::com::sun::star::uno::Exception,
536 			   ::com::sun::star::uno::RuntimeException);
537     virtual ::sal_Bool SAL_CALL isModified(  )
538 		throw (::com::sun::star::uno::RuntimeException);
539     virtual void SAL_CALL setComment( const ::rtl::OUString& Comment )
540 		throw (::com::sun::star::uno::RuntimeException);
541     virtual void SAL_CALL storeToStorage
542 		( const ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage >& Storage,
543 		  const ::rtl::OUString& NameBase, const ::rtl::OUString& Comment )
544 			throw (::com::sun::star::uno::Exception, ::com::sun::star::uno::RuntimeException);
545     virtual void SAL_CALL storeToURL( const ::rtl::OUString& URL, const ::rtl::OUString& NameBase,
546 		const ::rtl::OUString& Comment, const ::com::sun::star::uno::Reference
547 		< ::com::sun::star::task::XInteractionHandler >& Handler )
548 			throw (::com::sun::star::uno::Exception, ::com::sun::star::uno::RuntimeException);
549     virtual ::com::sun::star::uno::Sequence< ::sal_Int8 > SAL_CALL exportBinary(  )
550 		throw (::com::sun::star::uno::RuntimeException);
551     virtual void SAL_CALL importBinary( const ::com::sun::star::uno::Sequence< ::sal_Int8 >& Data )
552 		throw (::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException);
553 
554 	// XStringResourceWithStorage
555     virtual void SAL_CALL storeAsStorage
556 		( const ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage >& Storage )
557 			throw (::com::sun::star::uno::Exception, ::com::sun::star::uno::RuntimeException);
558     virtual void SAL_CALL setStorage
559 		( const ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage >& Storage )
560 			throw (::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException);
561 };
562 
563 
564 typedef ::cppu::ImplInheritanceHelper2<
565 		StringResourcePersistenceImpl,
566 	    ::com::sun::star::lang::XInitialization,
567 		::com::sun::star::resource::XStringResourceWithLocation > StringResourceWithLocationImpl_BASE;
568 
569 class StringResourceWithLocationImpl : public StringResourceWithLocationImpl_BASE
570 {
571 	::rtl::OUString																m_aLocation;
572 	bool																		m_bLocationChanged;
573 	com::sun::star::uno::Reference< com::sun::star::ucb::XSimpleFileAccess >	m_xSFI;
574 	com::sun::star::uno::Reference< com::sun::star::task::XInteractionHandler >	m_xInteractionHandler;
575 
576 	const ::com::sun::star::uno::Reference< ::com::sun::star::ucb::XSimpleFileAccess > getFileAccess( void );
577 
578 	virtual void implScanLocales( void );
579 	virtual bool implLoadLocale( LocaleItem* pLocaleItem );
580 
581 public:
582     StringResourceWithLocationImpl(
583         const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext >& rxContext );
584     virtual ~StringResourceWithLocationImpl();
585 
586     // XServiceInfo
587     virtual ::rtl::OUString SAL_CALL getImplementationName(  )
588         throw (::com::sun::star::uno::RuntimeException);
589     virtual sal_Bool SAL_CALL supportsService( const ::rtl::OUString& ServiceName )
590         throw (::com::sun::star::uno::RuntimeException);
591     virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames(  )
592         throw (::com::sun::star::uno::RuntimeException);
593 
594     // XInitialization
595     virtual void SAL_CALL initialize( const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any >& aArguments )
596         throw (::com::sun::star::uno::Exception, ::com::sun::star::uno::RuntimeException);
597 
598 	// XModifyBroadcaster
599 	virtual void SAL_CALL addModifyListener( const ::com::sun::star::uno::Reference< ::com::sun::star::util::XModifyListener >& aListener )
600 		throw (::com::sun::star::uno::RuntimeException);
601 	virtual void SAL_CALL removeModifyListener( const ::com::sun::star::uno::Reference< ::com::sun::star::util::XModifyListener >& aListener )
602 		throw (::com::sun::star::uno::RuntimeException);
603 
604  	// XStringResourceResolver
605 	virtual ::rtl::OUString SAL_CALL resolveString( const ::rtl::OUString& ResourceID )
606 		throw (::com::sun::star::resource::MissingResourceException, ::com::sun::star::uno::RuntimeException);
607     virtual ::rtl::OUString SAL_CALL resolveStringForLocale( const ::rtl::OUString& ResourceID,
608 		const ::com::sun::star::lang::Locale& locale )
609 			throw ( ::com::sun::star::resource::MissingResourceException,
610 					::com::sun::star::uno::RuntimeException);
611     virtual ::sal_Bool SAL_CALL hasEntryForId( const ::rtl::OUString& ResourceID )
612 		throw (::com::sun::star::uno::RuntimeException);
613     virtual ::sal_Bool SAL_CALL hasEntryForIdAndLocale( const ::rtl::OUString& ResourceID,
614 		const ::com::sun::star::lang::Locale& locale )
615 			throw (::com::sun::star::uno::RuntimeException);
616 	virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getResourceIDs(  )
617 		throw (::com::sun::star::uno::RuntimeException);
618     virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getResourceIDsForLocale
619 		( const ::com::sun::star::lang::Locale& locale )
620 			throw (::com::sun::star::uno::RuntimeException);
621 	virtual ::com::sun::star::lang::Locale SAL_CALL getCurrentLocale(  )
622 		throw (::com::sun::star::uno::RuntimeException);
623 	virtual ::com::sun::star::lang::Locale SAL_CALL getDefaultLocale(  )
624 		throw (::com::sun::star::uno::RuntimeException);
625 	virtual ::com::sun::star::uno::Sequence< ::com::sun::star::lang::Locale > SAL_CALL getLocales(  )
626 		throw (::com::sun::star::uno::RuntimeException);
627 
628 	// XStringResourceManager
629 	virtual ::sal_Bool SAL_CALL isReadOnly()
630 		throw (::com::sun::star::uno::RuntimeException);
631 	virtual void SAL_CALL setCurrentLocale( const ::com::sun::star::lang::Locale& locale, ::sal_Bool FindClosestMatch )
632 		throw (::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException);
633 	virtual void SAL_CALL setDefaultLocale( const ::com::sun::star::lang::Locale& locale )
634 		throw (::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException,
635 		       ::com::sun::star::lang::NoSupportException);
636     virtual void SAL_CALL setString( const ::rtl::OUString& ResourceID, const ::rtl::OUString& Str )
637 		throw (::com::sun::star::lang::NoSupportException, ::com::sun::star::uno::RuntimeException);
638     virtual void SAL_CALL setStringForLocale( const ::rtl::OUString& ResourceID, const ::rtl::OUString& Str,
639 		const ::com::sun::star::lang::Locale& locale )
640 			throw (::com::sun::star::lang::NoSupportException, ::com::sun::star::uno::RuntimeException);
641 	virtual void SAL_CALL removeId( const ::rtl::OUString& ResourceID )
642 		throw (::com::sun::star::resource::MissingResourceException, ::com::sun::star::uno::RuntimeException,
643 		       ::com::sun::star::lang::NoSupportException);
644     virtual void SAL_CALL removeIdForLocale( const ::rtl::OUString& ResourceID,
645 		const ::com::sun::star::lang::Locale& locale )
646 			throw (::com::sun::star::resource::MissingResourceException, ::com::sun::star::uno::RuntimeException,
647 				   ::com::sun::star::lang::NoSupportException);
648 	virtual void SAL_CALL newLocale( const ::com::sun::star::lang::Locale& locale )
649 		throw (::com::sun::star::container::ElementExistException, ::com::sun::star::lang::IllegalArgumentException,
650 			   ::com::sun::star::lang::NoSupportException, ::com::sun::star::uno::RuntimeException);
651 	virtual void SAL_CALL removeLocale( const ::com::sun::star::lang::Locale& locale )
652 		throw (::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException,
653 		       ::com::sun::star::lang::NoSupportException);
654     virtual ::sal_Int32 SAL_CALL getUniqueNumericId(  )
655 		throw (::com::sun::star::lang::NoSupportException,
656 			   ::com::sun::star::uno::RuntimeException);
657 
658 	// XStringResourcePersistence
659     virtual void SAL_CALL store(  )
660 		throw (::com::sun::star::lang::NoSupportException,
661 			   ::com::sun::star::uno::Exception,
662 			   ::com::sun::star::uno::RuntimeException);
663     virtual ::sal_Bool SAL_CALL isModified(  )
664 		throw (::com::sun::star::uno::RuntimeException);
665     virtual void SAL_CALL setComment( const ::rtl::OUString& Comment )
666 		throw (::com::sun::star::uno::RuntimeException);
667     virtual void SAL_CALL storeToStorage
668 		( const ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage >& Storage,
669 		  const ::rtl::OUString& NameBase, const ::rtl::OUString& Comment )
670 			throw (::com::sun::star::uno::Exception, ::com::sun::star::uno::RuntimeException);
671     virtual void SAL_CALL storeToURL( const ::rtl::OUString& URL, const ::rtl::OUString& NameBase,
672 		const ::rtl::OUString& Comment, const ::com::sun::star::uno::Reference
673 		< ::com::sun::star::task::XInteractionHandler >& Handler )
674 			throw (::com::sun::star::uno::Exception, ::com::sun::star::uno::RuntimeException);
675     virtual ::com::sun::star::uno::Sequence< ::sal_Int8 > SAL_CALL exportBinary(  )
676 		throw (::com::sun::star::uno::RuntimeException);
677     virtual void SAL_CALL importBinary( const ::com::sun::star::uno::Sequence< ::sal_Int8 >& Data )
678 		throw (::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException);
679 
680 	// XStringResourceWithLocation
681     virtual void SAL_CALL storeAsURL( const ::rtl::OUString& URL )
682 		throw (::com::sun::star::uno::Exception, ::com::sun::star::uno::RuntimeException);
683     virtual void SAL_CALL setURL( const ::rtl::OUString& URL )
684 		throw (::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException);
685 };
686 
687 //.........................................................................
688 }	// namespace stringtable
689 //.........................................................................
690 
691 #endif // SCRIPTING_DLGPROV_HXX
692