12c696243SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
32c696243SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
42c696243SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
52c696243SAndrew Rist  * distributed with this work for additional information
62c696243SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
72c696243SAndrew Rist  * to you under the Apache License, Version 2.0 (the
82c696243SAndrew Rist  * "License"); you may not use this file except in compliance
92c696243SAndrew Rist  * with the License.  You may obtain a copy of the License at
102c696243SAndrew Rist  *
112c696243SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
122c696243SAndrew Rist  *
132c696243SAndrew Rist  * Unless required by applicable law or agreed to in writing,
142c696243SAndrew Rist  * software distributed under the License is distributed on an
152c696243SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
162c696243SAndrew Rist  * KIND, either express or implied.  See the License for the
172c696243SAndrew Rist  * specific language governing permissions and limitations
182c696243SAndrew Rist  * under the License.
192c696243SAndrew Rist  *
202c696243SAndrew Rist  *************************************************************/
212c696243SAndrew Rist 
222c696243SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_scripting.hxx"
26cdf0e10cSrcweir #include "stringresource.hxx"
27cdf0e10cSrcweir #include <com/sun/star/io/XTextInputStream.hpp>
28cdf0e10cSrcweir #include <com/sun/star/io/XTextOutputStream.hpp>
29cdf0e10cSrcweir #include <com/sun/star/io/XActiveDataSink.hpp>
30cdf0e10cSrcweir #include <com/sun/star/io/XActiveDataSource.hpp>
31cdf0e10cSrcweir #include <com/sun/star/io/XStream.hpp>
32cdf0e10cSrcweir #include <com/sun/star/io/XSeekable.hpp>
33cdf0e10cSrcweir #include <com/sun/star/embed/ElementModes.hpp>
34cdf0e10cSrcweir #include <com/sun/star/lang/XMultiComponentFactory.hpp>
35cdf0e10cSrcweir #ifndef _CPPUHELPER_IMPLEMENTATIONENTRY_HXX_
36cdf0e10cSrcweir #include <cppuhelper/implementationentry.hxx>
37cdf0e10cSrcweir #endif
38cdf0e10cSrcweir #include <com/sun/star/beans/XPropertySet.hpp>
39cdf0e10cSrcweir #include <com/sun/star/container/XNameAccess.hpp>
40cdf0e10cSrcweir 
41cdf0e10cSrcweir 
42cdf0e10cSrcweir #include <rtl/ustrbuf.hxx>
43cdf0e10cSrcweir #include <rtl/strbuf.hxx>
44cdf0e10cSrcweir #include <tools/urlobj.hxx>
45cdf0e10cSrcweir 
46cdf0e10cSrcweir using namespace ::com::sun::star;
47cdf0e10cSrcweir using namespace ::com::sun::star::lang;
48cdf0e10cSrcweir using namespace ::com::sun::star::uno;
49cdf0e10cSrcweir using namespace ::com::sun::star::ucb;
50cdf0e10cSrcweir using namespace ::com::sun::star::util;
51cdf0e10cSrcweir using namespace ::com::sun::star::embed;
52cdf0e10cSrcweir using namespace ::com::sun::star::container;
53cdf0e10cSrcweir 
54cdf0e10cSrcweir 
55cdf0e10cSrcweir //.........................................................................
56cdf0e10cSrcweir namespace stringresource
57cdf0e10cSrcweir {
58cdf0e10cSrcweir //.........................................................................
59cdf0e10cSrcweir 
60cdf0e10cSrcweir // =============================================================================
61cdf0e10cSrcweir // mutex
62cdf0e10cSrcweir // =============================================================================
63cdf0e10cSrcweir 
getMutex()64cdf0e10cSrcweir ::osl::Mutex& getMutex()
65cdf0e10cSrcweir {
66cdf0e10cSrcweir     static ::osl::Mutex* s_pMutex = 0;
67cdf0e10cSrcweir     if ( !s_pMutex )
68cdf0e10cSrcweir     {
69cdf0e10cSrcweir         ::osl::MutexGuard aGuard( ::osl::Mutex::getGlobalMutex() );
70cdf0e10cSrcweir 	    if ( !s_pMutex )
71cdf0e10cSrcweir 	    {
72cdf0e10cSrcweir             static ::osl::Mutex s_aMutex;
73cdf0e10cSrcweir 		    s_pMutex = &s_aMutex;
74cdf0e10cSrcweir 	    }
75cdf0e10cSrcweir     }
76cdf0e10cSrcweir     return *s_pMutex;
77cdf0e10cSrcweir }
78cdf0e10cSrcweir 
79cdf0e10cSrcweir 
80cdf0e10cSrcweir // =============================================================================
81cdf0e10cSrcweir // StringResourceImpl
82cdf0e10cSrcweir // =============================================================================
83cdf0e10cSrcweir 
84cdf0e10cSrcweir // component operations
getSupportedServiceNames_StringResourceImpl()85cdf0e10cSrcweir static Sequence< ::rtl::OUString > getSupportedServiceNames_StringResourceImpl()
86cdf0e10cSrcweir {
87cdf0e10cSrcweir     Sequence< ::rtl::OUString > names(1);
88cdf0e10cSrcweir     names[0] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.resource.StringResource") );
89cdf0e10cSrcweir     return names;
90cdf0e10cSrcweir }
91cdf0e10cSrcweir 
getImplementationName_StringResourceImpl()92cdf0e10cSrcweir static ::rtl::OUString getImplementationName_StringResourceImpl()
93cdf0e10cSrcweir {
94cdf0e10cSrcweir     return ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.scripting.StringResource") );
95cdf0e10cSrcweir }
96cdf0e10cSrcweir 
create_StringResourceImpl(Reference<XComponentContext> const & xContext)97cdf0e10cSrcweir static Reference< XInterface > SAL_CALL create_StringResourceImpl(
98cdf0e10cSrcweir     Reference< XComponentContext > const & xContext )
99cdf0e10cSrcweir     SAL_THROW( () )
100cdf0e10cSrcweir {
101cdf0e10cSrcweir     return static_cast< ::cppu::OWeakObject * >( new StringResourcePersistenceImpl( xContext ) );
102cdf0e10cSrcweir }
103cdf0e10cSrcweir 
104cdf0e10cSrcweir 
105cdf0e10cSrcweir // =============================================================================
106cdf0e10cSrcweir 
StringResourceImpl(const Reference<XComponentContext> & rxContext)107cdf0e10cSrcweir StringResourceImpl::StringResourceImpl( const Reference< XComponentContext >& rxContext )
108cdf0e10cSrcweir     : m_xContext( rxContext )
109cdf0e10cSrcweir 	, m_pCurrentLocaleItem( NULL )
110cdf0e10cSrcweir 	, m_pDefaultLocaleItem( NULL )
111cdf0e10cSrcweir 	, m_bDefaultModified( false )
112cdf0e10cSrcweir 	, m_aListenerContainer( getMutex() )
113cdf0e10cSrcweir 	, m_bModified( false )
114cdf0e10cSrcweir 	, m_bReadOnly( false )
115cdf0e10cSrcweir 	, m_nNextUniqueNumericId( UNIQUE_NUMBER_NEEDS_INITIALISATION )
116cdf0e10cSrcweir {
117cdf0e10cSrcweir }
118cdf0e10cSrcweir 
119cdf0e10cSrcweir // =============================================================================
120cdf0e10cSrcweir 
~StringResourceImpl()121cdf0e10cSrcweir StringResourceImpl::~StringResourceImpl()
122cdf0e10cSrcweir {
123cdf0e10cSrcweir 	for( LocaleItemVectorIt it = m_aLocaleItemVector.begin(); it != m_aLocaleItemVector.end(); it++ )
124cdf0e10cSrcweir 	{
125cdf0e10cSrcweir 		LocaleItem* pLocaleItem = *it;
126cdf0e10cSrcweir 		delete pLocaleItem;
127cdf0e10cSrcweir 	}
128cdf0e10cSrcweir 
129cdf0e10cSrcweir 	for( LocaleItemVectorIt it = m_aDeletedLocaleItemVector.begin(); it != m_aDeletedLocaleItemVector.end(); it++ )
130cdf0e10cSrcweir 	{
131cdf0e10cSrcweir 		LocaleItem* pLocaleItem = *it;
132cdf0e10cSrcweir 		delete pLocaleItem;
133cdf0e10cSrcweir 	}
134cdf0e10cSrcweir }
135cdf0e10cSrcweir 
136cdf0e10cSrcweir 
137cdf0e10cSrcweir // =============================================================================
138cdf0e10cSrcweir // XServiceInfo
139cdf0e10cSrcweir 
getImplementationName()140cdf0e10cSrcweir ::rtl::OUString StringResourceImpl::getImplementationName(  ) throw (RuntimeException)
141cdf0e10cSrcweir {
142cdf0e10cSrcweir     return getImplementationName_StringResourceImpl();
143cdf0e10cSrcweir }
144cdf0e10cSrcweir 
supportsService(const::rtl::OUString & rServiceName)145cdf0e10cSrcweir sal_Bool StringResourceImpl::supportsService( const ::rtl::OUString& rServiceName ) throw (RuntimeException)
146cdf0e10cSrcweir {
147cdf0e10cSrcweir 	Sequence< ::rtl::OUString > aNames( getSupportedServiceNames() );
148cdf0e10cSrcweir 	const ::rtl::OUString* pNames = aNames.getConstArray();
149cdf0e10cSrcweir 	const ::rtl::OUString* pEnd = pNames + aNames.getLength();
150cdf0e10cSrcweir 	for ( ; pNames != pEnd && !pNames->equals( rServiceName ); ++pNames )
151cdf0e10cSrcweir 		;
152cdf0e10cSrcweir 
153cdf0e10cSrcweir 	return pNames != pEnd;
154cdf0e10cSrcweir }
155cdf0e10cSrcweir 
getSupportedServiceNames()156cdf0e10cSrcweir Sequence< ::rtl::OUString > StringResourceImpl::getSupportedServiceNames(  ) throw (RuntimeException)
157cdf0e10cSrcweir {
158cdf0e10cSrcweir     return getSupportedServiceNames_StringResourceImpl();
159cdf0e10cSrcweir }
160cdf0e10cSrcweir 
161cdf0e10cSrcweir 
162cdf0e10cSrcweir // =============================================================================
163cdf0e10cSrcweir // XModifyBroadcaster
164cdf0e10cSrcweir 
addModifyListener(const Reference<XModifyListener> & aListener)165cdf0e10cSrcweir void StringResourceImpl::addModifyListener( const Reference< XModifyListener >& aListener )
166cdf0e10cSrcweir 	throw (RuntimeException)
167cdf0e10cSrcweir {
168cdf0e10cSrcweir 	if( !aListener.is() )
169cdf0e10cSrcweir 		throw RuntimeException();
170cdf0e10cSrcweir 
171cdf0e10cSrcweir     ::osl::MutexGuard aGuard( getMutex() );
172cdf0e10cSrcweir 	Reference< XInterface > xIface( aListener, UNO_QUERY );
173cdf0e10cSrcweir 	m_aListenerContainer.addInterface( xIface );
174cdf0e10cSrcweir }
175cdf0e10cSrcweir 
removeModifyListener(const Reference<XModifyListener> & aListener)176cdf0e10cSrcweir void StringResourceImpl::removeModifyListener( const Reference< XModifyListener >& aListener )
177cdf0e10cSrcweir 	throw (RuntimeException)
178cdf0e10cSrcweir {
179cdf0e10cSrcweir 	if( !aListener.is() )
180cdf0e10cSrcweir 		throw RuntimeException();
181cdf0e10cSrcweir 
182cdf0e10cSrcweir     ::osl::MutexGuard aGuard( getMutex() );
183cdf0e10cSrcweir 	Reference< XInterface > xIface( aListener, UNO_QUERY );
184cdf0e10cSrcweir 	m_aListenerContainer.removeInterface( xIface );
185cdf0e10cSrcweir }
186cdf0e10cSrcweir 
187cdf0e10cSrcweir 
188cdf0e10cSrcweir // =============================================================================
189cdf0e10cSrcweir // XStringResourceResolver
190cdf0e10cSrcweir 
implResolveString(const::rtl::OUString & ResourceID,LocaleItem * pLocaleItem)191cdf0e10cSrcweir ::rtl::OUString StringResourceImpl::implResolveString
192cdf0e10cSrcweir 	( const ::rtl::OUString& ResourceID, LocaleItem* pLocaleItem )
193cdf0e10cSrcweir 		throw (::com::sun::star::resource::MissingResourceException)
194cdf0e10cSrcweir {
195cdf0e10cSrcweir 	::rtl::OUString aRetStr;
196cdf0e10cSrcweir 	bool bSuccess = false;
197cdf0e10cSrcweir 	if( pLocaleItem != NULL && loadLocale( pLocaleItem ) )
198cdf0e10cSrcweir 	{
199cdf0e10cSrcweir 		IdToStringMap::iterator it = pLocaleItem->m_aIdToStringMap.find( ResourceID );
200cdf0e10cSrcweir 		if( !( it == pLocaleItem->m_aIdToStringMap.end() ) )
201cdf0e10cSrcweir 		{
202cdf0e10cSrcweir 			aRetStr = (*it).second;
203cdf0e10cSrcweir 			bSuccess = true;
204cdf0e10cSrcweir 		}
205cdf0e10cSrcweir 	}
206cdf0e10cSrcweir 	if( !bSuccess )
207cdf0e10cSrcweir 	{
208cdf0e10cSrcweir 		::rtl::OUString errorMsg = ::rtl::OUString::createFromAscii( "StringResourceImpl: No entry for ResourceID: " );
209cdf0e10cSrcweir         errorMsg.concat( ResourceID );
210cdf0e10cSrcweir         throw ::com::sun::star::resource::MissingResourceException( errorMsg, Reference< XInterface >() );
211cdf0e10cSrcweir 	}
212cdf0e10cSrcweir 	return aRetStr;
213cdf0e10cSrcweir }
214cdf0e10cSrcweir 
resolveString(const::rtl::OUString & ResourceID)215cdf0e10cSrcweir ::rtl::OUString StringResourceImpl::resolveString( const ::rtl::OUString& ResourceID )
216cdf0e10cSrcweir 	throw (::com::sun::star::resource::MissingResourceException, RuntimeException)
217cdf0e10cSrcweir {
218cdf0e10cSrcweir     ::osl::MutexGuard aGuard( getMutex() );
219cdf0e10cSrcweir 	return implResolveString( ResourceID, m_pCurrentLocaleItem );
220cdf0e10cSrcweir }
221cdf0e10cSrcweir 
resolveStringForLocale(const::rtl::OUString & ResourceID,const Locale & locale)222cdf0e10cSrcweir ::rtl::OUString StringResourceImpl::resolveStringForLocale( const ::rtl::OUString& ResourceID, const Locale& locale )
223cdf0e10cSrcweir 	throw ( ::com::sun::star::resource::MissingResourceException, RuntimeException)
224cdf0e10cSrcweir {
225cdf0e10cSrcweir     ::osl::MutexGuard aGuard( getMutex() );
226cdf0e10cSrcweir 	LocaleItem* pLocaleItem = getItemForLocale( locale, false );
227cdf0e10cSrcweir 	return implResolveString( ResourceID, pLocaleItem );
228cdf0e10cSrcweir }
229cdf0e10cSrcweir 
implHasEntryForId(const::rtl::OUString & ResourceID,LocaleItem * pLocaleItem)230cdf0e10cSrcweir sal_Bool StringResourceImpl::implHasEntryForId( const ::rtl::OUString& ResourceID, LocaleItem* pLocaleItem )
231cdf0e10cSrcweir {
232cdf0e10cSrcweir 	bool bSuccess = false;
233cdf0e10cSrcweir 	if( pLocaleItem != NULL && loadLocale( pLocaleItem ) )
234cdf0e10cSrcweir 	{
235cdf0e10cSrcweir 		IdToStringMap::iterator it = pLocaleItem->m_aIdToStringMap.find( ResourceID );
236cdf0e10cSrcweir 		if( !( it == pLocaleItem->m_aIdToStringMap.end() ) )
237cdf0e10cSrcweir 			bSuccess = true;
238cdf0e10cSrcweir 	}
239cdf0e10cSrcweir 	return bSuccess;
240cdf0e10cSrcweir }
241cdf0e10cSrcweir 
hasEntryForId(const::rtl::OUString & ResourceID)242cdf0e10cSrcweir sal_Bool StringResourceImpl::hasEntryForId( const ::rtl::OUString& ResourceID )
243cdf0e10cSrcweir 	throw (RuntimeException)
244cdf0e10cSrcweir {
245cdf0e10cSrcweir     ::osl::MutexGuard aGuard( getMutex() );
246cdf0e10cSrcweir 	return implHasEntryForId( ResourceID, m_pCurrentLocaleItem );
247cdf0e10cSrcweir }
248cdf0e10cSrcweir 
hasEntryForIdAndLocale(const::rtl::OUString & ResourceID,const Locale & locale)249cdf0e10cSrcweir sal_Bool StringResourceImpl::hasEntryForIdAndLocale( const ::rtl::OUString& ResourceID,
250cdf0e10cSrcweir 	const Locale& locale )
251cdf0e10cSrcweir 		throw (RuntimeException)
252cdf0e10cSrcweir {
253cdf0e10cSrcweir     ::osl::MutexGuard aGuard( getMutex() );
254cdf0e10cSrcweir 	LocaleItem* pLocaleItem = getItemForLocale( locale, false );
255cdf0e10cSrcweir 	return implHasEntryForId( ResourceID, pLocaleItem );
256cdf0e10cSrcweir }
257cdf0e10cSrcweir 
implGetResourceIDs(LocaleItem * pLocaleItem)258cdf0e10cSrcweir Sequence< ::rtl::OUString > StringResourceImpl::implGetResourceIDs( LocaleItem* pLocaleItem )
259cdf0e10cSrcweir {
260cdf0e10cSrcweir 	Sequence< ::rtl::OUString > aIDSeq( 0 );
261cdf0e10cSrcweir 	if( pLocaleItem && loadLocale( pLocaleItem ) )
262cdf0e10cSrcweir 	{
263cdf0e10cSrcweir 		const IdToStringMap& rHashMap = pLocaleItem->m_aIdToStringMap;
264cdf0e10cSrcweir 		sal_Int32 nResourceIDCount = rHashMap.size();
265cdf0e10cSrcweir 		aIDSeq.realloc( nResourceIDCount );
266cdf0e10cSrcweir 		::rtl::OUString* pStrings = aIDSeq.getArray();
267cdf0e10cSrcweir 
268cdf0e10cSrcweir 		IdToStringMap::const_iterator it;
269cdf0e10cSrcweir 		int iTarget = 0;
270cdf0e10cSrcweir 		for( it = rHashMap.begin(); it != rHashMap.end(); it++ )
271cdf0e10cSrcweir 		{
272cdf0e10cSrcweir 			::rtl::OUString aStr = (*it).first;
273cdf0e10cSrcweir 			pStrings[iTarget] = aStr;
274cdf0e10cSrcweir 			iTarget++;
275cdf0e10cSrcweir 		}
276cdf0e10cSrcweir 	}
277cdf0e10cSrcweir 	return aIDSeq;
278cdf0e10cSrcweir }
279cdf0e10cSrcweir 
getResourceIDsForLocale(const Locale & locale)280cdf0e10cSrcweir Sequence< ::rtl::OUString > StringResourceImpl::getResourceIDsForLocale
281cdf0e10cSrcweir 	( const Locale& locale ) throw (::com::sun::star::uno::RuntimeException)
282cdf0e10cSrcweir {
283cdf0e10cSrcweir     ::osl::MutexGuard aGuard( getMutex() );
284cdf0e10cSrcweir 	LocaleItem* pLocaleItem = getItemForLocale( locale, false );
285cdf0e10cSrcweir 	return implGetResourceIDs( pLocaleItem );
286cdf0e10cSrcweir }
287cdf0e10cSrcweir 
getResourceIDs()288cdf0e10cSrcweir Sequence< ::rtl::OUString > StringResourceImpl::getResourceIDs(  )
289cdf0e10cSrcweir 	throw (RuntimeException)
290cdf0e10cSrcweir {
291cdf0e10cSrcweir     ::osl::MutexGuard aGuard( getMutex() );
292cdf0e10cSrcweir 	return implGetResourceIDs( m_pCurrentLocaleItem );
293cdf0e10cSrcweir }
294cdf0e10cSrcweir 
getCurrentLocale()295cdf0e10cSrcweir Locale StringResourceImpl::getCurrentLocale()
296cdf0e10cSrcweir 	throw (RuntimeException)
297cdf0e10cSrcweir {
298cdf0e10cSrcweir     ::osl::MutexGuard aGuard( getMutex() );
299cdf0e10cSrcweir 
300cdf0e10cSrcweir 	Locale aRetLocale;
301cdf0e10cSrcweir 	if( m_pCurrentLocaleItem != NULL )
302cdf0e10cSrcweir 		aRetLocale = m_pCurrentLocaleItem->m_locale;
303cdf0e10cSrcweir 	return aRetLocale;
304cdf0e10cSrcweir }
305cdf0e10cSrcweir 
getDefaultLocale()306cdf0e10cSrcweir Locale StringResourceImpl::getDefaultLocale(  )
307cdf0e10cSrcweir 	throw (RuntimeException)
308cdf0e10cSrcweir {
309cdf0e10cSrcweir     ::osl::MutexGuard aGuard( getMutex() );
310cdf0e10cSrcweir 
311cdf0e10cSrcweir 	Locale aRetLocale;
312cdf0e10cSrcweir 	if( m_pDefaultLocaleItem != NULL )
313cdf0e10cSrcweir 		aRetLocale = m_pDefaultLocaleItem->m_locale;
314cdf0e10cSrcweir 	return aRetLocale;
315cdf0e10cSrcweir }
316cdf0e10cSrcweir 
getLocales()317cdf0e10cSrcweir Sequence< Locale > StringResourceImpl::getLocales(  )
318cdf0e10cSrcweir 	throw (RuntimeException)
319cdf0e10cSrcweir {
320cdf0e10cSrcweir     ::osl::MutexGuard aGuard( getMutex() );
321cdf0e10cSrcweir 
322cdf0e10cSrcweir 	sal_Int32 nSize = m_aLocaleItemVector.size();
323cdf0e10cSrcweir 	Sequence< Locale > aLocalSeq( nSize );
324cdf0e10cSrcweir 	Locale* pLocales = aLocalSeq.getArray();
325cdf0e10cSrcweir 	int iTarget = 0;
326cdf0e10cSrcweir     for( LocaleItemVectorConstIt it = m_aLocaleItemVector.begin(); it != m_aLocaleItemVector.end(); it++ )
327cdf0e10cSrcweir     {
328cdf0e10cSrcweir 		LocaleItem* pLocaleItem = *it;
329cdf0e10cSrcweir 		pLocales[iTarget] = pLocaleItem->m_locale;
330cdf0e10cSrcweir 		iTarget++;
331cdf0e10cSrcweir 	}
332cdf0e10cSrcweir 	return aLocalSeq;
333cdf0e10cSrcweir }
334cdf0e10cSrcweir 
335cdf0e10cSrcweir 
336cdf0e10cSrcweir // =============================================================================
337cdf0e10cSrcweir // XStringResourceManager
338cdf0e10cSrcweir 
implCheckReadOnly(const sal_Char * pExceptionMsg)339cdf0e10cSrcweir void StringResourceImpl::implCheckReadOnly( const sal_Char* pExceptionMsg )
340cdf0e10cSrcweir 	throw (NoSupportException)
341cdf0e10cSrcweir {
342cdf0e10cSrcweir 	if( m_bReadOnly )
343cdf0e10cSrcweir 	{
344cdf0e10cSrcweir 		::rtl::OUString errorMsg = ::rtl::OUString::createFromAscii( pExceptionMsg );
345cdf0e10cSrcweir         throw NoSupportException( errorMsg, Reference< XInterface >() );
346cdf0e10cSrcweir 	}
347cdf0e10cSrcweir }
348cdf0e10cSrcweir 
isReadOnly()349cdf0e10cSrcweir sal_Bool StringResourceImpl::isReadOnly()
350cdf0e10cSrcweir 	throw (RuntimeException)
351cdf0e10cSrcweir {
352cdf0e10cSrcweir 	return m_bReadOnly;
353cdf0e10cSrcweir }
354cdf0e10cSrcweir 
implSetCurrentLocale(const Locale & locale,sal_Bool FindClosestMatch,sal_Bool bUseDefaultIfNoMatch)355cdf0e10cSrcweir void StringResourceImpl::implSetCurrentLocale( const Locale& locale,
356cdf0e10cSrcweir 	sal_Bool FindClosestMatch, sal_Bool bUseDefaultIfNoMatch )
357cdf0e10cSrcweir 		throw (IllegalArgumentException, RuntimeException)
358cdf0e10cSrcweir {
359cdf0e10cSrcweir     ::osl::MutexGuard aGuard( getMutex() );
360cdf0e10cSrcweir 
361cdf0e10cSrcweir 	LocaleItem* pLocaleItem = NULL;
362cdf0e10cSrcweir 	if( FindClosestMatch )
363cdf0e10cSrcweir 		pLocaleItem = getClosestMatchItemForLocale( locale );
364cdf0e10cSrcweir 	else
365cdf0e10cSrcweir 		pLocaleItem = getItemForLocale( locale, true );
366cdf0e10cSrcweir 
367cdf0e10cSrcweir 	if( pLocaleItem == NULL && bUseDefaultIfNoMatch )
368cdf0e10cSrcweir 		pLocaleItem = m_pDefaultLocaleItem;
369cdf0e10cSrcweir 
370cdf0e10cSrcweir 	if( pLocaleItem != NULL )
371cdf0e10cSrcweir 	{
372cdf0e10cSrcweir 		loadLocale( pLocaleItem );
373cdf0e10cSrcweir 		m_pCurrentLocaleItem = pLocaleItem;
374cdf0e10cSrcweir 
375cdf0e10cSrcweir 		// Only notify without modifying
376cdf0e10cSrcweir 		implNotifyListeners();
377cdf0e10cSrcweir 	}
378cdf0e10cSrcweir }
379cdf0e10cSrcweir 
setCurrentLocale(const Locale & locale,sal_Bool FindClosestMatch)380cdf0e10cSrcweir void StringResourceImpl::setCurrentLocale( const Locale& locale, sal_Bool FindClosestMatch )
381cdf0e10cSrcweir 	throw (IllegalArgumentException, RuntimeException)
382cdf0e10cSrcweir {
383cdf0e10cSrcweir 	sal_Bool bUseDefaultIfNoMatch = false;
384cdf0e10cSrcweir 	implSetCurrentLocale( locale, FindClosestMatch, bUseDefaultIfNoMatch );
385cdf0e10cSrcweir }
386cdf0e10cSrcweir 
setDefaultLocale(const Locale & locale)387cdf0e10cSrcweir void StringResourceImpl::setDefaultLocale( const Locale& locale )
388cdf0e10cSrcweir 	throw (IllegalArgumentException, RuntimeException,NoSupportException)
389cdf0e10cSrcweir {
390cdf0e10cSrcweir     ::osl::MutexGuard aGuard( getMutex() );
391cdf0e10cSrcweir 	implCheckReadOnly( "StringResourceImpl::setDefaultLocale(): Read only" );
392cdf0e10cSrcweir 
393cdf0e10cSrcweir 	LocaleItem* pLocaleItem = getItemForLocale( locale, true );
394cdf0e10cSrcweir 	if( pLocaleItem && pLocaleItem != m_pDefaultLocaleItem )
395cdf0e10cSrcweir 	{
396cdf0e10cSrcweir 		if( m_pDefaultLocaleItem )
397cdf0e10cSrcweir 		{
398cdf0e10cSrcweir 			LocaleItem* pChangedDefaultLocaleItem = new LocaleItem( m_pDefaultLocaleItem->m_locale );
399cdf0e10cSrcweir 			m_aChangedDefaultLocaleVector.push_back( pChangedDefaultLocaleItem );
400cdf0e10cSrcweir 		}
401cdf0e10cSrcweir 
402cdf0e10cSrcweir 		m_pDefaultLocaleItem = pLocaleItem;
403cdf0e10cSrcweir 		m_bDefaultModified = true;
404cdf0e10cSrcweir 		implModified();
405cdf0e10cSrcweir 	}
406cdf0e10cSrcweir }
407cdf0e10cSrcweir 
implSetString(const::rtl::OUString & ResourceID,const::rtl::OUString & Str,LocaleItem * pLocaleItem)408cdf0e10cSrcweir void StringResourceImpl::implSetString( const ::rtl::OUString& ResourceID,
409cdf0e10cSrcweir 	const ::rtl::OUString& Str, LocaleItem* pLocaleItem )
410cdf0e10cSrcweir {
411cdf0e10cSrcweir 	if( pLocaleItem != NULL && loadLocale( pLocaleItem ) )
412cdf0e10cSrcweir 	{
413cdf0e10cSrcweir 		IdToStringMap& rHashMap = pLocaleItem->m_aIdToStringMap;
414cdf0e10cSrcweir 
415cdf0e10cSrcweir 		IdToStringMap::iterator it = rHashMap.find( ResourceID );
416cdf0e10cSrcweir 		bool bNew = ( it == rHashMap.end() );
417cdf0e10cSrcweir 		if( bNew )
418cdf0e10cSrcweir 		{
419cdf0e10cSrcweir 			IdToIndexMap& rIndexMap = pLocaleItem->m_aIdToIndexMap;
420cdf0e10cSrcweir 			rIndexMap[ ResourceID ] = pLocaleItem->m_nNextIndex++;
421cdf0e10cSrcweir 			implScanIdForNumber( ResourceID );
422cdf0e10cSrcweir 		}
423cdf0e10cSrcweir 		rHashMap[ ResourceID ] = Str;
424cdf0e10cSrcweir 		pLocaleItem->m_bModified = true;
425cdf0e10cSrcweir 		implModified();
426cdf0e10cSrcweir 	}
427cdf0e10cSrcweir }
428cdf0e10cSrcweir 
setString(const::rtl::OUString & ResourceID,const::rtl::OUString & Str)429cdf0e10cSrcweir void StringResourceImpl::setString( const ::rtl::OUString& ResourceID, const ::rtl::OUString& Str )
430cdf0e10cSrcweir 	throw (NoSupportException, RuntimeException)
431cdf0e10cSrcweir {
432cdf0e10cSrcweir     ::osl::MutexGuard aGuard( getMutex() );
433cdf0e10cSrcweir 	implCheckReadOnly( "StringResourceImpl::setString(): Read only" );
434cdf0e10cSrcweir 	implSetString( ResourceID, Str, m_pCurrentLocaleItem );
435cdf0e10cSrcweir }
436cdf0e10cSrcweir 
setStringForLocale(const::rtl::OUString & ResourceID,const::rtl::OUString & Str,const Locale & locale)437cdf0e10cSrcweir void StringResourceImpl::setStringForLocale
438cdf0e10cSrcweir 	( const ::rtl::OUString& ResourceID, const ::rtl::OUString& Str, const Locale& locale )
439cdf0e10cSrcweir 		throw (NoSupportException, RuntimeException)
440cdf0e10cSrcweir {
441cdf0e10cSrcweir     ::osl::MutexGuard aGuard( getMutex() );
442cdf0e10cSrcweir 	implCheckReadOnly( "StringResourceImpl::setStringForLocale(): Read only" );
443cdf0e10cSrcweir 	LocaleItem* pLocaleItem = getItemForLocale( locale, false );
444cdf0e10cSrcweir 	implSetString( ResourceID, Str, pLocaleItem );
445cdf0e10cSrcweir }
446cdf0e10cSrcweir 
implRemoveId(const::rtl::OUString & ResourceID,LocaleItem * pLocaleItem)447cdf0e10cSrcweir void StringResourceImpl::implRemoveId( const ::rtl::OUString& ResourceID, LocaleItem* pLocaleItem )
448cdf0e10cSrcweir 	throw (::com::sun::star::resource::MissingResourceException)
449cdf0e10cSrcweir {
450cdf0e10cSrcweir 	if( pLocaleItem != NULL && loadLocale( pLocaleItem ) )
451cdf0e10cSrcweir 	{
452cdf0e10cSrcweir 		IdToStringMap& rHashMap = pLocaleItem->m_aIdToStringMap;
453cdf0e10cSrcweir 		IdToStringMap::iterator it = rHashMap.find( ResourceID );
454cdf0e10cSrcweir 		if( it == rHashMap.end() )
455cdf0e10cSrcweir 		{
456cdf0e10cSrcweir 			::rtl::OUString errorMsg = ::rtl::OUString::createFromAscii( "StringResourceImpl: No entries for ResourceID: " );
457cdf0e10cSrcweir 			errorMsg.concat( ResourceID );
458cdf0e10cSrcweir 			throw ::com::sun::star::resource::MissingResourceException( errorMsg, Reference< XInterface >() );
459cdf0e10cSrcweir 		}
460cdf0e10cSrcweir 		rHashMap.erase( it );
461cdf0e10cSrcweir 		pLocaleItem->m_bModified = true;
462cdf0e10cSrcweir 		implModified();
463cdf0e10cSrcweir 	}
464cdf0e10cSrcweir }
465cdf0e10cSrcweir 
removeId(const::rtl::OUString & ResourceID)466cdf0e10cSrcweir void StringResourceImpl::removeId( const ::rtl::OUString& ResourceID )
467cdf0e10cSrcweir 	throw (::com::sun::star::resource::MissingResourceException, RuntimeException, NoSupportException)
468cdf0e10cSrcweir {
469cdf0e10cSrcweir     ::osl::MutexGuard aGuard( getMutex() );
470cdf0e10cSrcweir 	implCheckReadOnly( "StringResourceImpl::removeId(): Read only" );
471cdf0e10cSrcweir 	implRemoveId( ResourceID, m_pCurrentLocaleItem );
472cdf0e10cSrcweir }
473cdf0e10cSrcweir 
removeIdForLocale(const::rtl::OUString & ResourceID,const Locale & locale)474cdf0e10cSrcweir void StringResourceImpl::removeIdForLocale( const ::rtl::OUString& ResourceID, const Locale& locale )
475cdf0e10cSrcweir 	throw (::com::sun::star::resource::MissingResourceException, RuntimeException, NoSupportException)
476cdf0e10cSrcweir {
477cdf0e10cSrcweir     ::osl::MutexGuard aGuard( getMutex() );
478cdf0e10cSrcweir 	implCheckReadOnly( "StringResourceImpl::removeIdForLocale(): Read only" );
479cdf0e10cSrcweir 	LocaleItem* pLocaleItem = getItemForLocale( locale, false );
480cdf0e10cSrcweir 	implRemoveId( ResourceID, pLocaleItem );
481cdf0e10cSrcweir }
482cdf0e10cSrcweir 
newLocale(const Locale & locale)483cdf0e10cSrcweir void StringResourceImpl::newLocale( const Locale& locale )
484cdf0e10cSrcweir 	throw (ElementExistException, IllegalArgumentException, RuntimeException, NoSupportException)
485cdf0e10cSrcweir {
486cdf0e10cSrcweir     ::osl::MutexGuard aGuard( getMutex() );
487cdf0e10cSrcweir 	implCheckReadOnly( "StringResourceImpl::newLocale(): Read only" );
488cdf0e10cSrcweir 
489cdf0e10cSrcweir 	if( getItemForLocale( locale, false ) != NULL )
490cdf0e10cSrcweir 	{
491cdf0e10cSrcweir         ::rtl::OUString errorMsg = ::rtl::OUString::createFromAscii( "StringResourceImpl: locale already exists" );
492cdf0e10cSrcweir         throw ElementExistException( errorMsg, Reference< XInterface >() );
493cdf0e10cSrcweir 	}
494cdf0e10cSrcweir 
495cdf0e10cSrcweir 	// TODO?: Check if locale is valid? How?
496cdf0e10cSrcweir 	bool bValid = true;
497cdf0e10cSrcweir 	if( bValid )
498cdf0e10cSrcweir 	{
499cdf0e10cSrcweir 		LocaleItem* pLocaleItem = new LocaleItem( locale );
500cdf0e10cSrcweir 		m_aLocaleItemVector.push_back( pLocaleItem );
501cdf0e10cSrcweir 		pLocaleItem->m_bModified = true;
502cdf0e10cSrcweir 
503cdf0e10cSrcweir 		// Copy strings from default locale
504cdf0e10cSrcweir 		LocaleItem* pCopyFromItem = m_pDefaultLocaleItem;
505cdf0e10cSrcweir 		if( pCopyFromItem == NULL )
506cdf0e10cSrcweir 			pCopyFromItem = m_pCurrentLocaleItem;
507cdf0e10cSrcweir 		if( pCopyFromItem != NULL && loadLocale( pCopyFromItem ) )
508cdf0e10cSrcweir 		{
509cdf0e10cSrcweir 			const IdToStringMap& rSourceMap = pCopyFromItem->m_aIdToStringMap;
510cdf0e10cSrcweir 			IdToStringMap& rTargetMap = pLocaleItem->m_aIdToStringMap;
511cdf0e10cSrcweir 			IdToStringMap::const_iterator it;
512cdf0e10cSrcweir 			for( it = rSourceMap.begin(); it != rSourceMap.end(); it++ )
513cdf0e10cSrcweir 			{
514cdf0e10cSrcweir 				::rtl::OUString aId  = (*it).first;
515cdf0e10cSrcweir 				::rtl::OUString aStr = (*it).second;
516cdf0e10cSrcweir 				rTargetMap[ aId ] = aStr;
517cdf0e10cSrcweir 			}
518cdf0e10cSrcweir 
519cdf0e10cSrcweir 			const IdToIndexMap& rSourceIndexMap = pCopyFromItem->m_aIdToIndexMap;
520cdf0e10cSrcweir 			IdToIndexMap& rTargetIndexMap = pLocaleItem->m_aIdToIndexMap;
521cdf0e10cSrcweir 			IdToIndexMap::const_iterator it_index;
522cdf0e10cSrcweir 			for( it_index = rSourceIndexMap.begin(); it_index != rSourceIndexMap.end(); it_index++ )
523cdf0e10cSrcweir 			{
524cdf0e10cSrcweir 				::rtl::OUString aId  = (*it_index).first;
525cdf0e10cSrcweir 				sal_Int32 nIndex = (*it_index).second;
526cdf0e10cSrcweir 				rTargetIndexMap[ aId ] = nIndex;
527cdf0e10cSrcweir 			}
528cdf0e10cSrcweir 			pLocaleItem->m_nNextIndex = pCopyFromItem->m_nNextIndex;
529cdf0e10cSrcweir 		}
530cdf0e10cSrcweir 
531cdf0e10cSrcweir 		if( m_pCurrentLocaleItem == NULL )
532cdf0e10cSrcweir 			m_pCurrentLocaleItem = pLocaleItem;
533cdf0e10cSrcweir 
534cdf0e10cSrcweir 		if( m_pDefaultLocaleItem == NULL )
535cdf0e10cSrcweir 		{
536cdf0e10cSrcweir 			m_pDefaultLocaleItem = pLocaleItem;
537cdf0e10cSrcweir 			m_bDefaultModified = true;
538cdf0e10cSrcweir 		}
539cdf0e10cSrcweir 
540cdf0e10cSrcweir 		implModified();
541cdf0e10cSrcweir 	}
542cdf0e10cSrcweir 	else
543cdf0e10cSrcweir 	{
544cdf0e10cSrcweir         ::rtl::OUString errorMsg = ::rtl::OUString::createFromAscii( "StringResourceImpl: Invalid locale" );
545cdf0e10cSrcweir         throw IllegalArgumentException( errorMsg, Reference< XInterface >(), 0 );
546cdf0e10cSrcweir 	}
547cdf0e10cSrcweir }
548cdf0e10cSrcweir 
removeLocale(const Locale & locale)549cdf0e10cSrcweir void StringResourceImpl::removeLocale( const Locale& locale )
550cdf0e10cSrcweir 	throw (IllegalArgumentException, RuntimeException, NoSupportException)
551cdf0e10cSrcweir {
552cdf0e10cSrcweir     ::osl::MutexGuard aGuard( getMutex() );
553cdf0e10cSrcweir 	implCheckReadOnly( "StringResourceImpl::removeLocale(): Read only" );
554cdf0e10cSrcweir 
555cdf0e10cSrcweir 	LocaleItem* pRemoveItem = getItemForLocale( locale, true );
556cdf0e10cSrcweir 	if( pRemoveItem )
557cdf0e10cSrcweir 	{
558cdf0e10cSrcweir 		// Last locale?
559cdf0e10cSrcweir 		sal_Int32 nLocaleCount = m_aLocaleItemVector.size();
560cdf0e10cSrcweir 		if( nLocaleCount > 1 )
561cdf0e10cSrcweir 		{
562cdf0e10cSrcweir 			LocaleItem* pFallbackItem = NULL;
563cdf0e10cSrcweir 			if( m_pCurrentLocaleItem == pRemoveItem ||
564cdf0e10cSrcweir 				m_pDefaultLocaleItem  == pRemoveItem )
565cdf0e10cSrcweir 			{
566cdf0e10cSrcweir 				for( LocaleItemVectorIt it = m_aLocaleItemVector.begin(); it != m_aLocaleItemVector.end(); it++ )
567cdf0e10cSrcweir 				{
568cdf0e10cSrcweir 					LocaleItem* pLocaleItem = *it;
569cdf0e10cSrcweir 					if( pLocaleItem != pRemoveItem )
570cdf0e10cSrcweir 					{
571cdf0e10cSrcweir 						pFallbackItem = pLocaleItem;
572cdf0e10cSrcweir 						break;
573cdf0e10cSrcweir 					}
574cdf0e10cSrcweir 				}
575cdf0e10cSrcweir 				if( m_pCurrentLocaleItem == pRemoveItem )
576cdf0e10cSrcweir 				{
577cdf0e10cSrcweir 					sal_Bool FindClosestMatch = false;
578cdf0e10cSrcweir 					setCurrentLocale( pFallbackItem->m_locale, FindClosestMatch );
579cdf0e10cSrcweir 				}
580cdf0e10cSrcweir 				if( m_pDefaultLocaleItem == pRemoveItem )
581cdf0e10cSrcweir 				{
582cdf0e10cSrcweir 					setDefaultLocale( pFallbackItem->m_locale );
583cdf0e10cSrcweir 				}
584cdf0e10cSrcweir 			}
585cdf0e10cSrcweir 		}
586cdf0e10cSrcweir 		for( LocaleItemVectorIt it = m_aLocaleItemVector.begin(); it != m_aLocaleItemVector.end(); it++ )
587cdf0e10cSrcweir 		{
588cdf0e10cSrcweir 			LocaleItem* pLocaleItem = *it;
589cdf0e10cSrcweir 			if( pLocaleItem == pRemoveItem )
590cdf0e10cSrcweir 			{
591cdf0e10cSrcweir 				// Remember locale item to delete file while storing
592cdf0e10cSrcweir 				m_aDeletedLocaleItemVector.push_back( pLocaleItem );
593cdf0e10cSrcweir 
594cdf0e10cSrcweir 				// Last locale?
595cdf0e10cSrcweir 				if( nLocaleCount == 1 )
596cdf0e10cSrcweir 				{
597cdf0e10cSrcweir 					m_nNextUniqueNumericId = 0;
598cdf0e10cSrcweir 					if( m_pDefaultLocaleItem )
599cdf0e10cSrcweir 					{
600cdf0e10cSrcweir 						LocaleItem* pChangedDefaultLocaleItem = new LocaleItem( m_pDefaultLocaleItem->m_locale );
601cdf0e10cSrcweir 						m_aChangedDefaultLocaleVector.push_back( pChangedDefaultLocaleItem );
602cdf0e10cSrcweir 					}
603cdf0e10cSrcweir 					m_pCurrentLocaleItem = NULL;
604cdf0e10cSrcweir 					m_pDefaultLocaleItem = NULL;
605cdf0e10cSrcweir 				}
606cdf0e10cSrcweir 
607cdf0e10cSrcweir 				m_aLocaleItemVector.erase( it );
608cdf0e10cSrcweir 
609cdf0e10cSrcweir 				implModified();
610cdf0e10cSrcweir 				break;
611cdf0e10cSrcweir 			}
612cdf0e10cSrcweir 		}
613cdf0e10cSrcweir 	}
614cdf0e10cSrcweir }
615cdf0e10cSrcweir 
implScanIdForNumber(const::rtl::OUString & ResourceID)616cdf0e10cSrcweir void StringResourceImpl::implScanIdForNumber( const ::rtl::OUString& ResourceID )
617cdf0e10cSrcweir {
618cdf0e10cSrcweir 	const sal_Unicode* pSrc = ResourceID.getStr();
619cdf0e10cSrcweir 	sal_Int32 nLen = ResourceID.getLength();
620cdf0e10cSrcweir 
621cdf0e10cSrcweir 	sal_Int32 nNumber = 0;
622cdf0e10cSrcweir 	for( sal_Int32 i = 0 ; i < nLen ; i++ )
623cdf0e10cSrcweir 	{
624cdf0e10cSrcweir 		sal_Unicode c = pSrc[i];
625cdf0e10cSrcweir 		if( c >= '0' && c <= '9' )
626cdf0e10cSrcweir 		{
627cdf0e10cSrcweir 			sal_uInt16 nDigitVal = c - '0';
628cdf0e10cSrcweir 			nNumber = 10*nNumber + nDigitVal;
629cdf0e10cSrcweir 		}
630cdf0e10cSrcweir 		else
631cdf0e10cSrcweir 			break;
632cdf0e10cSrcweir 	}
633cdf0e10cSrcweir 
634cdf0e10cSrcweir 	if( m_nNextUniqueNumericId < nNumber + 1 )
635cdf0e10cSrcweir 		m_nNextUniqueNumericId = nNumber + 1;
636cdf0e10cSrcweir }
637cdf0e10cSrcweir 
getUniqueNumericId()638cdf0e10cSrcweir sal_Int32 StringResourceImpl::getUniqueNumericId(  )
639cdf0e10cSrcweir 	throw (RuntimeException, NoSupportException)
640cdf0e10cSrcweir {
641cdf0e10cSrcweir 	if( m_nNextUniqueNumericId == UNIQUE_NUMBER_NEEDS_INITIALISATION )
642cdf0e10cSrcweir 	{
643cdf0e10cSrcweir 		implLoadAllLocales();
644cdf0e10cSrcweir 		m_nNextUniqueNumericId = 0;
645cdf0e10cSrcweir 	}
646cdf0e10cSrcweir 
647cdf0e10cSrcweir 	if( m_nNextUniqueNumericId < UNIQUE_NUMBER_NEEDS_INITIALISATION )
648cdf0e10cSrcweir 	{
649cdf0e10cSrcweir         ::rtl::OUString errorMsg = ::rtl::OUString::createFromAscii( "getUniqueNumericId: Extended sal_Int32 range" );
650cdf0e10cSrcweir         throw NoSupportException( errorMsg, Reference< XInterface >() );
651cdf0e10cSrcweir 	}
652cdf0e10cSrcweir 	return m_nNextUniqueNumericId;
653cdf0e10cSrcweir }
654cdf0e10cSrcweir 
655cdf0e10cSrcweir 
656cdf0e10cSrcweir // =============================================================================
657cdf0e10cSrcweir // Private helper methods
658cdf0e10cSrcweir 
getItemForLocale(const Locale & locale,sal_Bool bException)659cdf0e10cSrcweir LocaleItem* StringResourceImpl::getItemForLocale
660cdf0e10cSrcweir 	( const Locale& locale, sal_Bool bException )
661cdf0e10cSrcweir 		throw (::com::sun::star::lang::IllegalArgumentException)
662cdf0e10cSrcweir {
663cdf0e10cSrcweir 	LocaleItem* pRetItem = NULL;
664cdf0e10cSrcweir 
665cdf0e10cSrcweir 	// Search for locale
666cdf0e10cSrcweir     for( LocaleItemVectorConstIt it = m_aLocaleItemVector.begin(); it != m_aLocaleItemVector.end(); it++ )
667cdf0e10cSrcweir     {
668cdf0e10cSrcweir 		LocaleItem* pLocaleItem = *it;
669cdf0e10cSrcweir 		if( pLocaleItem )
670cdf0e10cSrcweir 		{
671cdf0e10cSrcweir 			Locale& cmp_locale = pLocaleItem->m_locale;
672cdf0e10cSrcweir 			if( cmp_locale.Language == locale.Language &&
673cdf0e10cSrcweir 				cmp_locale.Country  == locale.Country &&
674cdf0e10cSrcweir 				cmp_locale.Variant  == locale.Variant )
675cdf0e10cSrcweir 			{
676cdf0e10cSrcweir 				pRetItem = pLocaleItem;
677cdf0e10cSrcweir 				break;
678cdf0e10cSrcweir 			}
679cdf0e10cSrcweir 		}
680cdf0e10cSrcweir     }
681cdf0e10cSrcweir 
682cdf0e10cSrcweir 	if( pRetItem == NULL && bException )
683cdf0e10cSrcweir 	{
684cdf0e10cSrcweir         ::rtl::OUString errorMsg = ::rtl::OUString::createFromAscii( "StringResourceImpl: Invalid locale" );
685cdf0e10cSrcweir         throw IllegalArgumentException( errorMsg, Reference< XInterface >(), 0 );
686cdf0e10cSrcweir 	}
687cdf0e10cSrcweir 	return pRetItem;
688cdf0e10cSrcweir }
689cdf0e10cSrcweir 
690cdf0e10cSrcweir // Returns the LocalItem for a given locale, if it exists, otherwise NULL
69130acf5e8Spfg // This method performs a closest match search, at least the language must match
getClosestMatchItemForLocale(const Locale & locale)692cdf0e10cSrcweir LocaleItem* StringResourceImpl::getClosestMatchItemForLocale( const Locale& locale )
693cdf0e10cSrcweir {
694cdf0e10cSrcweir 	LocaleItem* pRetItem = NULL;
695cdf0e10cSrcweir 
696cdf0e10cSrcweir 	// Search for locale
697cdf0e10cSrcweir 	for( sal_Int32 iPass = 0 ; iPass <= 2 ; ++iPass )
698cdf0e10cSrcweir 	{
699cdf0e10cSrcweir 		for( LocaleItemVectorConstIt it = m_aLocaleItemVector.begin(); it != m_aLocaleItemVector.end(); it++ )
700cdf0e10cSrcweir 		{
701cdf0e10cSrcweir 			LocaleItem* pLocaleItem = *it;
702cdf0e10cSrcweir 			if( pLocaleItem )
703cdf0e10cSrcweir 			{
704cdf0e10cSrcweir 				Locale& cmp_locale = pLocaleItem->m_locale;
705cdf0e10cSrcweir 				if( cmp_locale.Language == locale.Language &&
706cdf0e10cSrcweir 					(iPass > 1 || cmp_locale.Country  == locale.Country) &&
707cdf0e10cSrcweir 					(iPass > 0 || cmp_locale.Variant  == locale.Variant) )
708cdf0e10cSrcweir 				{
709cdf0e10cSrcweir 					pRetItem = pLocaleItem;
710cdf0e10cSrcweir 					break;
711cdf0e10cSrcweir 				}
712cdf0e10cSrcweir 			}
713cdf0e10cSrcweir 		}
714cdf0e10cSrcweir 		if( pRetItem )
715cdf0e10cSrcweir 			break;
716cdf0e10cSrcweir 	}
717cdf0e10cSrcweir 
718cdf0e10cSrcweir 	return pRetItem;
719cdf0e10cSrcweir }
720cdf0e10cSrcweir 
implModified(void)721cdf0e10cSrcweir void StringResourceImpl::implModified( void )
722cdf0e10cSrcweir {
723cdf0e10cSrcweir 	m_bModified = true;
724cdf0e10cSrcweir 	implNotifyListeners();
725cdf0e10cSrcweir }
726cdf0e10cSrcweir 
implNotifyListeners(void)727cdf0e10cSrcweir void StringResourceImpl::implNotifyListeners( void )
728cdf0e10cSrcweir {
729cdf0e10cSrcweir 	EventObject aEvent;
730cdf0e10cSrcweir 	aEvent.Source = static_cast< XInterface* >( (OWeakObject*)this );
731cdf0e10cSrcweir 
732cdf0e10cSrcweir 	::cppu::OInterfaceIteratorHelper it( m_aListenerContainer );
733cdf0e10cSrcweir 	while( it.hasMoreElements() )
734cdf0e10cSrcweir 	{
735cdf0e10cSrcweir 		Reference< XInterface > xIface = it.next();
736cdf0e10cSrcweir 		Reference< XModifyListener > xListener( xIface, UNO_QUERY );
737cdf0e10cSrcweir         try
738cdf0e10cSrcweir         {
739cdf0e10cSrcweir             xListener->modified( aEvent );
740cdf0e10cSrcweir         }
741cdf0e10cSrcweir         catch(RuntimeException&)
742cdf0e10cSrcweir         {
743cdf0e10cSrcweir             it.remove();
744cdf0e10cSrcweir         }
745cdf0e10cSrcweir 	}
746cdf0e10cSrcweir }
747cdf0e10cSrcweir 
748cdf0e10cSrcweir 
749cdf0e10cSrcweir // =============================================================================
750cdf0e10cSrcweir // Loading
751cdf0e10cSrcweir 
loadLocale(LocaleItem * pLocaleItem)752cdf0e10cSrcweir bool StringResourceImpl::loadLocale( LocaleItem* pLocaleItem )
753cdf0e10cSrcweir {
754cdf0e10cSrcweir 	// Base implementation has nothing to load
755cdf0e10cSrcweir 	(void)pLocaleItem;
756cdf0e10cSrcweir 	return true;
757cdf0e10cSrcweir }
758cdf0e10cSrcweir 
implLoadAllLocales(void)759cdf0e10cSrcweir void StringResourceImpl::implLoadAllLocales( void )
760cdf0e10cSrcweir {
761cdf0e10cSrcweir 	// Base implementation has nothing to load
762cdf0e10cSrcweir }
763cdf0e10cSrcweir 
764cdf0e10cSrcweir 
getMultiComponentFactory(void)765cdf0e10cSrcweir Reference< XMultiComponentFactory > StringResourceImpl::getMultiComponentFactory( void )
766cdf0e10cSrcweir {
767cdf0e10cSrcweir     ::osl::MutexGuard aGuard( getMutex() );
768cdf0e10cSrcweir 
769cdf0e10cSrcweir 	if( !m_xMCF.is() )
770cdf0e10cSrcweir 	{
771cdf0e10cSrcweir 		Reference< XMultiComponentFactory > xSMgr( m_xContext->getServiceManager(), UNO_QUERY );
772cdf0e10cSrcweir 		if( !xSMgr.is() )
773cdf0e10cSrcweir 		{
774cdf0e10cSrcweir 			throw RuntimeException(
775cdf0e10cSrcweir 				::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "StringResourceImpl::getMultiComponentFactory: Couldn't instantiate MultiComponentFactory" ) ),
776cdf0e10cSrcweir 					Reference< XInterface >() );
777cdf0e10cSrcweir 		}
778cdf0e10cSrcweir 		m_xMCF = xSMgr;
779cdf0e10cSrcweir 	}
780cdf0e10cSrcweir 	return m_xMCF;
781cdf0e10cSrcweir }
782cdf0e10cSrcweir 
783cdf0e10cSrcweir 
784cdf0e10cSrcweir // =============================================================================
785cdf0e10cSrcweir // StringResourcePersistenceImpl
786cdf0e10cSrcweir // =============================================================================
787cdf0e10cSrcweir 
StringResourcePersistenceImpl(const Reference<XComponentContext> & rxContext)788cdf0e10cSrcweir StringResourcePersistenceImpl::StringResourcePersistenceImpl( const Reference< XComponentContext >& rxContext )
789cdf0e10cSrcweir     : StringResourcePersistenceImpl_BASE( rxContext )
790cdf0e10cSrcweir {
791cdf0e10cSrcweir }
792cdf0e10cSrcweir 
793cdf0e10cSrcweir // -----------------------------------------------------------------------------
794cdf0e10cSrcweir 
~StringResourcePersistenceImpl()795cdf0e10cSrcweir StringResourcePersistenceImpl::~StringResourcePersistenceImpl()
796cdf0e10cSrcweir {
797cdf0e10cSrcweir }
798cdf0e10cSrcweir 
799cdf0e10cSrcweir // -----------------------------------------------------------------------------
800cdf0e10cSrcweir // XServiceInfo
801cdf0e10cSrcweir // -----------------------------------------------------------------------------
802cdf0e10cSrcweir 
getImplementationName()803cdf0e10cSrcweir ::rtl::OUString StringResourcePersistenceImpl::getImplementationName(  )
804cdf0e10cSrcweir 	throw (RuntimeException)
805cdf0e10cSrcweir {
806cdf0e10cSrcweir     return ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM
807cdf0e10cSrcweir 		( "com.sun.star.comp.scripting.StringResourceWithLocation") );
808cdf0e10cSrcweir }
809cdf0e10cSrcweir 
810cdf0e10cSrcweir // -----------------------------------------------------------------------------
811cdf0e10cSrcweir 
supportsService(const::rtl::OUString & rServiceName)812cdf0e10cSrcweir sal_Bool StringResourcePersistenceImpl::supportsService( const ::rtl::OUString& rServiceName )
813cdf0e10cSrcweir 	throw (RuntimeException)
814cdf0e10cSrcweir {
815cdf0e10cSrcweir 	return StringResourceImpl::supportsService( rServiceName );
816cdf0e10cSrcweir }
817cdf0e10cSrcweir 
818cdf0e10cSrcweir // -----------------------------------------------------------------------------
819cdf0e10cSrcweir 
getSupportedServiceNames()820cdf0e10cSrcweir Sequence< ::rtl::OUString > StringResourcePersistenceImpl::getSupportedServiceNames(  )
821cdf0e10cSrcweir 	throw (RuntimeException)
822cdf0e10cSrcweir {
823cdf0e10cSrcweir     return StringResourceImpl::getSupportedServiceNames();
824cdf0e10cSrcweir }
825cdf0e10cSrcweir 
826cdf0e10cSrcweir // -----------------------------------------------------------------------------
827cdf0e10cSrcweir // XInitialization base functionality for derived classes
828cdf0e10cSrcweir // -----------------------------------------------------------------------------
829cdf0e10cSrcweir 
830cdf0e10cSrcweir static ::rtl::OUString aNameBaseDefaultStr = ::rtl::OUString::createFromAscii( "strings" );
831cdf0e10cSrcweir 
implInitializeCommonParameters(const Sequence<Any> & aArguments)832cdf0e10cSrcweir void StringResourcePersistenceImpl::implInitializeCommonParameters
833cdf0e10cSrcweir 	( const Sequence< Any >& aArguments )
834cdf0e10cSrcweir 		throw (Exception, RuntimeException)
835cdf0e10cSrcweir {
836cdf0e10cSrcweir 	bool bReadOnlyOk = (aArguments[1] >>= m_bReadOnly);
837cdf0e10cSrcweir 	if( !bReadOnlyOk )
838cdf0e10cSrcweir     {
839cdf0e10cSrcweir         ::rtl::OUString errorMsg = ::rtl::OUString::createFromAscii( "XInitialization::initialize: Expected ReadOnly flag" );
840cdf0e10cSrcweir         throw IllegalArgumentException( errorMsg, Reference< XInterface >(), 1 );
841cdf0e10cSrcweir 	}
842cdf0e10cSrcweir 
843cdf0e10cSrcweir 	com::sun::star::lang::Locale aCurrentLocale;
844cdf0e10cSrcweir 	bool bLocaleOk = (aArguments[2] >>= aCurrentLocale);
845cdf0e10cSrcweir 	if( !bLocaleOk )
846cdf0e10cSrcweir     {
847cdf0e10cSrcweir         ::rtl::OUString errorMsg = ::rtl::OUString::createFromAscii( "XInitialization::initialize: Expected Locale" );
848cdf0e10cSrcweir         throw IllegalArgumentException( errorMsg, Reference< XInterface >(), 2 );
849cdf0e10cSrcweir 	}
850cdf0e10cSrcweir 
851cdf0e10cSrcweir 	bool bNameBaseOk = (aArguments[3] >>= m_aNameBase);
852cdf0e10cSrcweir 	if( !bNameBaseOk )
853cdf0e10cSrcweir     {
854cdf0e10cSrcweir         ::rtl::OUString errorMsg = ::rtl::OUString::createFromAscii( "XInitialization::initialize: Expected NameBase string" );
855cdf0e10cSrcweir         throw IllegalArgumentException( errorMsg, Reference< XInterface >(), 3 );
856cdf0e10cSrcweir 	}
857cdf0e10cSrcweir 	if( m_aNameBase.getLength() == 0 )
858cdf0e10cSrcweir 		m_aNameBase = aNameBaseDefaultStr;
859cdf0e10cSrcweir 
860cdf0e10cSrcweir 	bool bCommentOk = (aArguments[4] >>= m_aComment);
861cdf0e10cSrcweir 	if( !bCommentOk )
862cdf0e10cSrcweir     {
863cdf0e10cSrcweir         ::rtl::OUString errorMsg = ::rtl::OUString::createFromAscii( "XInitialization::initialize: Expected Comment string" );
864cdf0e10cSrcweir         throw IllegalArgumentException( errorMsg, Reference< XInterface >(), 4 );
865cdf0e10cSrcweir 	}
866cdf0e10cSrcweir 
867cdf0e10cSrcweir 	implScanLocales();
868cdf0e10cSrcweir 
869cdf0e10cSrcweir 	sal_Bool FindClosestMatch = true;
870cdf0e10cSrcweir 	sal_Bool bUseDefaultIfNoMatch = true;
871cdf0e10cSrcweir 	implSetCurrentLocale( aCurrentLocale, FindClosestMatch, bUseDefaultIfNoMatch );
872cdf0e10cSrcweir }
873cdf0e10cSrcweir 
874cdf0e10cSrcweir // -----------------------------------------------------------------------------
875cdf0e10cSrcweir // Forwarding calls to base class
876cdf0e10cSrcweir 
877cdf0e10cSrcweir // XModifyBroadcaster
addModifyListener(const Reference<XModifyListener> & aListener)878cdf0e10cSrcweir void StringResourcePersistenceImpl::addModifyListener( const Reference< XModifyListener >& aListener )
879cdf0e10cSrcweir 	throw (RuntimeException)
880cdf0e10cSrcweir {
881cdf0e10cSrcweir 	StringResourceImpl::addModifyListener( aListener );
882cdf0e10cSrcweir }
removeModifyListener(const Reference<XModifyListener> & aListener)883cdf0e10cSrcweir void StringResourcePersistenceImpl::removeModifyListener( const Reference< XModifyListener >& aListener )
884cdf0e10cSrcweir 	throw (RuntimeException)
885cdf0e10cSrcweir {
886cdf0e10cSrcweir 	StringResourceImpl::removeModifyListener( aListener );
887cdf0e10cSrcweir }
888cdf0e10cSrcweir 
889cdf0e10cSrcweir // XStringResourceResolver
resolveString(const::rtl::OUString & ResourceID)890cdf0e10cSrcweir ::rtl::OUString StringResourcePersistenceImpl::resolveString( const ::rtl::OUString& ResourceID )
891cdf0e10cSrcweir 	throw (::com::sun::star::resource::MissingResourceException, RuntimeException)
892cdf0e10cSrcweir {
893cdf0e10cSrcweir 	return StringResourceImpl::resolveString( ResourceID ) ;
894cdf0e10cSrcweir }
resolveStringForLocale(const::rtl::OUString & ResourceID,const Locale & locale)895cdf0e10cSrcweir ::rtl::OUString StringResourcePersistenceImpl::resolveStringForLocale( const ::rtl::OUString& ResourceID, const Locale& locale )
896cdf0e10cSrcweir 	throw ( ::com::sun::star::resource::MissingResourceException, RuntimeException)
897cdf0e10cSrcweir {
898cdf0e10cSrcweir 	return StringResourceImpl::resolveStringForLocale( ResourceID, locale );
899cdf0e10cSrcweir }
hasEntryForId(const::rtl::OUString & ResourceID)900cdf0e10cSrcweir sal_Bool StringResourcePersistenceImpl::hasEntryForId( const ::rtl::OUString& ResourceID )
901cdf0e10cSrcweir 	throw (RuntimeException)
902cdf0e10cSrcweir {
903cdf0e10cSrcweir 	return StringResourceImpl::hasEntryForId( ResourceID ) ;
904cdf0e10cSrcweir }
hasEntryForIdAndLocale(const::rtl::OUString & ResourceID,const Locale & locale)905cdf0e10cSrcweir sal_Bool StringResourcePersistenceImpl::hasEntryForIdAndLocale( const ::rtl::OUString& ResourceID,
906cdf0e10cSrcweir 	const Locale& locale )
907cdf0e10cSrcweir 		throw (RuntimeException)
908cdf0e10cSrcweir {
909cdf0e10cSrcweir 	return StringResourceImpl::hasEntryForIdAndLocale( ResourceID, locale );
910cdf0e10cSrcweir }
getCurrentLocale()911cdf0e10cSrcweir Locale StringResourcePersistenceImpl::getCurrentLocale()
912cdf0e10cSrcweir 	throw (RuntimeException)
913cdf0e10cSrcweir {
914cdf0e10cSrcweir 	return StringResourceImpl::getCurrentLocale();
915cdf0e10cSrcweir }
getDefaultLocale()916cdf0e10cSrcweir Locale StringResourcePersistenceImpl::getDefaultLocale(  )
917cdf0e10cSrcweir 	throw (RuntimeException)
918cdf0e10cSrcweir {
919cdf0e10cSrcweir 	return StringResourceImpl::getDefaultLocale();
920cdf0e10cSrcweir }
getLocales()921cdf0e10cSrcweir Sequence< Locale > StringResourcePersistenceImpl::getLocales(  )
922cdf0e10cSrcweir 	throw (RuntimeException)
923cdf0e10cSrcweir {
924cdf0e10cSrcweir 	return StringResourceImpl::getLocales();
925cdf0e10cSrcweir }
926cdf0e10cSrcweir 
927cdf0e10cSrcweir // XStringResourceManager
isReadOnly()928cdf0e10cSrcweir sal_Bool StringResourcePersistenceImpl::isReadOnly()
929cdf0e10cSrcweir 	throw (RuntimeException)
930cdf0e10cSrcweir {
931cdf0e10cSrcweir 	return StringResourceImpl::isReadOnly();
932cdf0e10cSrcweir }
setCurrentLocale(const Locale & locale,sal_Bool FindClosestMatch)933cdf0e10cSrcweir void StringResourcePersistenceImpl::setCurrentLocale( const Locale& locale, sal_Bool FindClosestMatch )
934cdf0e10cSrcweir 	throw (IllegalArgumentException, RuntimeException)
935cdf0e10cSrcweir {
936cdf0e10cSrcweir 	StringResourceImpl::setCurrentLocale( locale, FindClosestMatch );
937cdf0e10cSrcweir }
setDefaultLocale(const Locale & locale)938cdf0e10cSrcweir void StringResourcePersistenceImpl::setDefaultLocale( const Locale& locale )
939cdf0e10cSrcweir 	throw (IllegalArgumentException, RuntimeException,NoSupportException)
940cdf0e10cSrcweir {
941cdf0e10cSrcweir 	StringResourceImpl::setDefaultLocale( locale );
942cdf0e10cSrcweir }
getResourceIDs()943cdf0e10cSrcweir Sequence< ::rtl::OUString > StringResourcePersistenceImpl::getResourceIDs(  )
944cdf0e10cSrcweir 	throw (RuntimeException)
945cdf0e10cSrcweir {
946cdf0e10cSrcweir 	return StringResourceImpl::getResourceIDs();
947cdf0e10cSrcweir }
setString(const::rtl::OUString & ResourceID,const::rtl::OUString & Str)948cdf0e10cSrcweir void StringResourcePersistenceImpl::setString( const ::rtl::OUString& ResourceID, const ::rtl::OUString& Str )
949cdf0e10cSrcweir 	throw (NoSupportException, RuntimeException)
950cdf0e10cSrcweir {
951cdf0e10cSrcweir 	StringResourceImpl::setString( ResourceID, Str );
952cdf0e10cSrcweir }
setStringForLocale(const::rtl::OUString & ResourceID,const::rtl::OUString & Str,const Locale & locale)953cdf0e10cSrcweir void StringResourcePersistenceImpl::setStringForLocale
954cdf0e10cSrcweir 	( const ::rtl::OUString& ResourceID, const ::rtl::OUString& Str, const Locale& locale )
955cdf0e10cSrcweir 		throw (NoSupportException, RuntimeException)
956cdf0e10cSrcweir {
957cdf0e10cSrcweir 	StringResourceImpl::setStringForLocale( ResourceID, Str, locale );
958cdf0e10cSrcweir }
getResourceIDsForLocale(const Locale & locale)959cdf0e10cSrcweir Sequence< ::rtl::OUString > StringResourcePersistenceImpl::getResourceIDsForLocale
960cdf0e10cSrcweir 	( const Locale& locale ) throw (::com::sun::star::uno::RuntimeException)
961cdf0e10cSrcweir {
962cdf0e10cSrcweir 	return StringResourceImpl::getResourceIDsForLocale( locale );
963cdf0e10cSrcweir }
removeId(const::rtl::OUString & ResourceID)964cdf0e10cSrcweir void StringResourcePersistenceImpl::removeId( const ::rtl::OUString& ResourceID )
965cdf0e10cSrcweir 	throw (::com::sun::star::resource::MissingResourceException, RuntimeException, NoSupportException)
966cdf0e10cSrcweir {
967cdf0e10cSrcweir 	StringResourceImpl::removeId( ResourceID );
968cdf0e10cSrcweir }
removeIdForLocale(const::rtl::OUString & ResourceID,const Locale & locale)969cdf0e10cSrcweir void StringResourcePersistenceImpl::removeIdForLocale( const ::rtl::OUString& ResourceID, const Locale& locale )
970cdf0e10cSrcweir 	throw (::com::sun::star::resource::MissingResourceException, RuntimeException, NoSupportException)
971cdf0e10cSrcweir {
972cdf0e10cSrcweir 	StringResourceImpl::removeIdForLocale( ResourceID, locale );
973cdf0e10cSrcweir }
newLocale(const Locale & locale)974cdf0e10cSrcweir void StringResourcePersistenceImpl::newLocale( const Locale& locale )
975cdf0e10cSrcweir 	throw (ElementExistException, IllegalArgumentException, RuntimeException, NoSupportException)
976cdf0e10cSrcweir {
977cdf0e10cSrcweir 	StringResourceImpl::newLocale( locale );
978cdf0e10cSrcweir }
removeLocale(const Locale & locale)979cdf0e10cSrcweir void StringResourcePersistenceImpl::removeLocale( const Locale& locale )
980cdf0e10cSrcweir 	throw (IllegalArgumentException, RuntimeException, NoSupportException)
981cdf0e10cSrcweir {
982cdf0e10cSrcweir 	StringResourceImpl::removeLocale( locale );
983cdf0e10cSrcweir }
getUniqueNumericId()984cdf0e10cSrcweir sal_Int32 StringResourcePersistenceImpl::getUniqueNumericId(  )
985cdf0e10cSrcweir 	throw (RuntimeException, NoSupportException)
986cdf0e10cSrcweir {
987cdf0e10cSrcweir 	return StringResourceImpl::getUniqueNumericId();
988cdf0e10cSrcweir }
989cdf0e10cSrcweir 
990cdf0e10cSrcweir // -----------------------------------------------------------------------------
991cdf0e10cSrcweir // XStringResourcePersistence
992cdf0e10cSrcweir 
store()993cdf0e10cSrcweir void StringResourcePersistenceImpl::store()
994cdf0e10cSrcweir 	throw (NoSupportException, Exception, RuntimeException)
995cdf0e10cSrcweir {
996cdf0e10cSrcweir }
997cdf0e10cSrcweir 
isModified()998cdf0e10cSrcweir sal_Bool StringResourcePersistenceImpl::isModified(  )
999cdf0e10cSrcweir 	throw (RuntimeException)
1000cdf0e10cSrcweir {
1001cdf0e10cSrcweir     ::osl::MutexGuard aGuard( getMutex() );
1002cdf0e10cSrcweir 
1003cdf0e10cSrcweir 	return m_bModified;
1004cdf0e10cSrcweir }
1005cdf0e10cSrcweir 
setComment(const::rtl::OUString & Comment)1006cdf0e10cSrcweir void StringResourcePersistenceImpl::setComment( const ::rtl::OUString& Comment )
1007cdf0e10cSrcweir 	throw (::com::sun::star::uno::RuntimeException)
1008cdf0e10cSrcweir {
1009cdf0e10cSrcweir 	m_aComment = Comment;
1010cdf0e10cSrcweir }
1011cdf0e10cSrcweir 
storeToStorage(const Reference<XStorage> & Storage,const::rtl::OUString & NameBase,const::rtl::OUString & Comment)1012cdf0e10cSrcweir void StringResourcePersistenceImpl::storeToStorage( const Reference< XStorage >& Storage,
1013cdf0e10cSrcweir 	const ::rtl::OUString& NameBase, const ::rtl::OUString& Comment )
1014cdf0e10cSrcweir 		throw (Exception, RuntimeException)
1015cdf0e10cSrcweir {
1016cdf0e10cSrcweir     ::osl::MutexGuard aGuard( getMutex() );
1017cdf0e10cSrcweir 
1018cdf0e10cSrcweir 	bool bUsedForStore = false;
1019cdf0e10cSrcweir 	bool bStoreAll = true;
1020cdf0e10cSrcweir 	implStoreAtStorage( NameBase, Comment, Storage, bUsedForStore, bStoreAll );
1021cdf0e10cSrcweir }
1022cdf0e10cSrcweir 
implStoreAtStorage(const::rtl::OUString & aNameBase,const::rtl::OUString & aComment,const Reference<::com::sun::star::embed::XStorage> & Storage,bool bUsedForStore,bool bStoreAll)1023cdf0e10cSrcweir void StringResourcePersistenceImpl::implStoreAtStorage
1024cdf0e10cSrcweir (
1025cdf0e10cSrcweir 	const ::rtl::OUString& aNameBase,
1026cdf0e10cSrcweir 	const ::rtl::OUString& aComment,
1027cdf0e10cSrcweir 	const Reference< ::com::sun::star::embed::XStorage >& Storage,
1028cdf0e10cSrcweir 	bool bUsedForStore,
1029cdf0e10cSrcweir 	bool bStoreAll
1030cdf0e10cSrcweir )
1031cdf0e10cSrcweir 	throw (Exception, RuntimeException)
1032cdf0e10cSrcweir {
1033cdf0e10cSrcweir 	// Delete files for deleted locales
1034cdf0e10cSrcweir 	if( bUsedForStore )
1035cdf0e10cSrcweir 	{
1036cdf0e10cSrcweir 		while( m_aDeletedLocaleItemVector.size() > 0 )
1037cdf0e10cSrcweir 		{
1038cdf0e10cSrcweir 			LocaleItemVectorIt it = m_aDeletedLocaleItemVector.begin();
1039cdf0e10cSrcweir 			LocaleItem* pLocaleItem = *it;
1040cdf0e10cSrcweir 			if( pLocaleItem != NULL )
1041cdf0e10cSrcweir 			{
1042cdf0e10cSrcweir 				::rtl::OUString aStreamName = implGetFileNameForLocaleItem( pLocaleItem, m_aNameBase );
1043cdf0e10cSrcweir 				aStreamName += ::rtl::OUString::createFromAscii( ".properties" );
1044cdf0e10cSrcweir 
1045cdf0e10cSrcweir 				try
1046cdf0e10cSrcweir 				{
1047cdf0e10cSrcweir 					Storage->removeElement( aStreamName );
1048cdf0e10cSrcweir 				}
1049cdf0e10cSrcweir 				catch( Exception& )
1050cdf0e10cSrcweir 				{}
1051cdf0e10cSrcweir 
1052cdf0e10cSrcweir 				m_aDeletedLocaleItemVector.erase( it );
1053cdf0e10cSrcweir 				delete pLocaleItem;
1054cdf0e10cSrcweir 			}
1055cdf0e10cSrcweir 		}
1056cdf0e10cSrcweir 	}
1057cdf0e10cSrcweir 
1058cdf0e10cSrcweir     for( LocaleItemVectorConstIt it = m_aLocaleItemVector.begin(); it != m_aLocaleItemVector.end(); it++ )
1059cdf0e10cSrcweir     {
1060cdf0e10cSrcweir 		LocaleItem* pLocaleItem = *it;
1061cdf0e10cSrcweir 		if( pLocaleItem != NULL && (bStoreAll || pLocaleItem->m_bModified) &&
1062cdf0e10cSrcweir 			loadLocale( pLocaleItem ) )
1063cdf0e10cSrcweir 		{
1064cdf0e10cSrcweir 			::rtl::OUString aStreamName = implGetFileNameForLocaleItem( pLocaleItem, aNameBase );
1065cdf0e10cSrcweir 			aStreamName += ::rtl::OUString::createFromAscii( ".properties" );
1066cdf0e10cSrcweir 
1067cdf0e10cSrcweir 			Reference< io::XStream > xElementStream =
1068cdf0e10cSrcweir 					Storage->openStreamElement( aStreamName, ElementModes::READWRITE );
1069cdf0e10cSrcweir 
1070cdf0e10cSrcweir 			::rtl::OUString aPropName = ::rtl::OUString::createFromAscii( "MediaType" );
1071cdf0e10cSrcweir 			::rtl::OUString aMime = ::rtl::OUString::createFromAscii( "text/plain" );
1072cdf0e10cSrcweir 
1073cdf0e10cSrcweir 			uno::Reference< beans::XPropertySet > xProps( xElementStream, uno::UNO_QUERY );
1074cdf0e10cSrcweir 			OSL_ENSURE( xProps.is(), "The StorageStream must implement XPropertySet interface!\n" );
1075cdf0e10cSrcweir             if ( xProps.is() )
1076cdf0e10cSrcweir             {
1077cdf0e10cSrcweir                 xProps->setPropertyValue( aPropName, uno::makeAny( aMime ) );
1078cdf0e10cSrcweir 
1079cdf0e10cSrcweir                 aPropName = ::rtl::OUString::createFromAscii( "UseCommonStoragePasswordEncryption" );
1080cdf0e10cSrcweir                 xProps->setPropertyValue( aPropName, uno::makeAny( sal_True ) );
1081cdf0e10cSrcweir             }
1082cdf0e10cSrcweir 
1083cdf0e10cSrcweir             Reference< io::XOutputStream > xOutputStream = xElementStream->getOutputStream();
1084cdf0e10cSrcweir 			if( xOutputStream.is() )
1085cdf0e10cSrcweir 				implWritePropertiesFile( pLocaleItem, xOutputStream, aComment );
1086cdf0e10cSrcweir             xOutputStream->closeOutput();
1087cdf0e10cSrcweir 
1088cdf0e10cSrcweir 			if( bUsedForStore )
1089cdf0e10cSrcweir 				pLocaleItem->m_bModified = false;
1090cdf0e10cSrcweir 		}
1091cdf0e10cSrcweir 	}
1092cdf0e10cSrcweir 
1093cdf0e10cSrcweir 	// Delete files for changed defaults
1094cdf0e10cSrcweir 	if( bUsedForStore )
1095cdf0e10cSrcweir 	{
1096cdf0e10cSrcweir 		for( LocaleItemVectorIt it = m_aChangedDefaultLocaleVector.begin();
1097cdf0e10cSrcweir 			 it != m_aChangedDefaultLocaleVector.end(); it++ )
1098cdf0e10cSrcweir 		{
1099cdf0e10cSrcweir 			LocaleItem* pLocaleItem = *it;
1100cdf0e10cSrcweir 			if( pLocaleItem != NULL )
1101cdf0e10cSrcweir 			{
1102cdf0e10cSrcweir 				::rtl::OUString aStreamName = implGetFileNameForLocaleItem( pLocaleItem, m_aNameBase );
1103cdf0e10cSrcweir 				aStreamName += ::rtl::OUString::createFromAscii( ".default" );
1104cdf0e10cSrcweir 
1105cdf0e10cSrcweir 				try
1106cdf0e10cSrcweir 				{
1107cdf0e10cSrcweir 					Storage->removeElement( aStreamName );
1108cdf0e10cSrcweir 				}
1109cdf0e10cSrcweir 				catch( Exception& )
1110cdf0e10cSrcweir 				{}
1111cdf0e10cSrcweir 
1112cdf0e10cSrcweir 				delete pLocaleItem;
1113cdf0e10cSrcweir 			}
1114cdf0e10cSrcweir 		}
1115cdf0e10cSrcweir 		m_aChangedDefaultLocaleVector.clear();
1116cdf0e10cSrcweir 	}
1117cdf0e10cSrcweir 
1118cdf0e10cSrcweir 	// Default locale
1119cdf0e10cSrcweir 	if( m_pDefaultLocaleItem != NULL && (bStoreAll || m_bDefaultModified) )
1120cdf0e10cSrcweir 	{
1121cdf0e10cSrcweir 		::rtl::OUString aStreamName = implGetFileNameForLocaleItem( m_pDefaultLocaleItem, aNameBase );
1122cdf0e10cSrcweir 		aStreamName += ::rtl::OUString::createFromAscii( ".default" );
1123cdf0e10cSrcweir 
1124cdf0e10cSrcweir 		Reference< io::XStream > xElementStream =
1125cdf0e10cSrcweir 				Storage->openStreamElement( aStreamName, ElementModes::READWRITE );
1126cdf0e10cSrcweir 
1127cdf0e10cSrcweir 		::rtl::OUString aPropName = ::rtl::OUString::createFromAscii( "MediaType" );
1128cdf0e10cSrcweir 		::rtl::OUString aMime = ::rtl::OUString::createFromAscii( "text/plain" );
1129cdf0e10cSrcweir 
1130cdf0e10cSrcweir 		// Only create stream without content
1131cdf0e10cSrcweir 		Reference< io::XOutputStream > xOutputStream = xElementStream->getOutputStream();
1132cdf0e10cSrcweir 		xOutputStream->closeOutput();
1133cdf0e10cSrcweir 
1134cdf0e10cSrcweir 		if( bUsedForStore )
1135cdf0e10cSrcweir 			m_bDefaultModified = false;
1136cdf0e10cSrcweir 	}
1137cdf0e10cSrcweir }
1138cdf0e10cSrcweir 
storeToURL(const::rtl::OUString & URL,const::rtl::OUString & NameBase,const::rtl::OUString & Comment,const Reference<::com::sun::star::task::XInteractionHandler> & Handler)1139cdf0e10cSrcweir void StringResourcePersistenceImpl::storeToURL( const ::rtl::OUString& URL,
1140cdf0e10cSrcweir 	const ::rtl::OUString& NameBase, const ::rtl::OUString& Comment,
1141cdf0e10cSrcweir 	const Reference< ::com::sun::star::task::XInteractionHandler >& Handler )
1142cdf0e10cSrcweir 		throw (Exception, RuntimeException)
1143cdf0e10cSrcweir {
1144cdf0e10cSrcweir     ::osl::MutexGuard aGuard( getMutex() );
1145cdf0e10cSrcweir 
1146cdf0e10cSrcweir 	bool bUsedForStore = false;
1147cdf0e10cSrcweir 	bool bStoreAll = true;
1148cdf0e10cSrcweir 
1149cdf0e10cSrcweir 	Reference< XMultiComponentFactory > xMCF = getMultiComponentFactory();
1150cdf0e10cSrcweir 	Reference< ucb::XSimpleFileAccess > xFileAccess;
1151cdf0e10cSrcweir 	xFileAccess = Reference< ucb::XSimpleFileAccess >( xMCF->createInstanceWithContext
1152cdf0e10cSrcweir 		( ::rtl::OUString::createFromAscii( "com.sun.star.ucb.SimpleFileAccess" ),
1153cdf0e10cSrcweir 			m_xContext ), UNO_QUERY );
1154cdf0e10cSrcweir 	if( xFileAccess.is() && Handler.is() )
1155cdf0e10cSrcweir 		xFileAccess->setInteractionHandler( Handler );
1156cdf0e10cSrcweir 
1157cdf0e10cSrcweir 	implStoreAtLocation( URL, NameBase, Comment, xFileAccess, bUsedForStore, bStoreAll );
1158cdf0e10cSrcweir }
1159cdf0e10cSrcweir 
implKillRemovedLocaleFiles(const::rtl::OUString & Location,const::rtl::OUString & aNameBase,const::com::sun::star::uno::Reference<::com::sun::star::ucb::XSimpleFileAccess> & xFileAccess)1160cdf0e10cSrcweir void StringResourcePersistenceImpl::implKillRemovedLocaleFiles
1161cdf0e10cSrcweir (
1162cdf0e10cSrcweir 	const ::rtl::OUString& Location,
1163cdf0e10cSrcweir 	const ::rtl::OUString& aNameBase,
1164cdf0e10cSrcweir 	const ::com::sun::star::uno::Reference< ::com::sun::star::ucb::XSimpleFileAccess >& xFileAccess
1165cdf0e10cSrcweir )
1166cdf0e10cSrcweir 	throw (Exception, RuntimeException)
1167cdf0e10cSrcweir {
1168cdf0e10cSrcweir 	// Delete files for deleted locales
1169cdf0e10cSrcweir 	while( m_aDeletedLocaleItemVector.size() > 0 )
1170cdf0e10cSrcweir 	{
1171cdf0e10cSrcweir 		LocaleItemVectorIt it = m_aDeletedLocaleItemVector.begin();
1172cdf0e10cSrcweir 		LocaleItem* pLocaleItem = *it;
1173cdf0e10cSrcweir 		if( pLocaleItem != NULL )
1174cdf0e10cSrcweir 		{
1175cdf0e10cSrcweir 			::rtl::OUString aCompleteFileName =
1176cdf0e10cSrcweir 				implGetPathForLocaleItem( pLocaleItem, aNameBase, Location );
1177cdf0e10cSrcweir 			if( xFileAccess->exists( aCompleteFileName ) )
1178cdf0e10cSrcweir 				xFileAccess->kill( aCompleteFileName );
1179cdf0e10cSrcweir 
1180cdf0e10cSrcweir 			m_aDeletedLocaleItemVector.erase( it );
1181cdf0e10cSrcweir 			delete pLocaleItem;
1182cdf0e10cSrcweir 		}
1183cdf0e10cSrcweir 	}
1184cdf0e10cSrcweir }
1185cdf0e10cSrcweir 
implKillChangedDefaultFiles(const::rtl::OUString & Location,const::rtl::OUString & aNameBase,const::com::sun::star::uno::Reference<::com::sun::star::ucb::XSimpleFileAccess> & xFileAccess)1186cdf0e10cSrcweir void StringResourcePersistenceImpl::implKillChangedDefaultFiles
1187cdf0e10cSrcweir (
1188cdf0e10cSrcweir 	const ::rtl::OUString& Location,
1189cdf0e10cSrcweir 	const ::rtl::OUString& aNameBase,
1190cdf0e10cSrcweir 	const ::com::sun::star::uno::Reference< ::com::sun::star::ucb::XSimpleFileAccess >& xFileAccess
1191cdf0e10cSrcweir )
1192cdf0e10cSrcweir 	throw (Exception, RuntimeException)
1193cdf0e10cSrcweir {
1194cdf0e10cSrcweir 	// Delete files for changed defaults
1195cdf0e10cSrcweir 	for( LocaleItemVectorIt it = m_aChangedDefaultLocaleVector.begin();
1196cdf0e10cSrcweir 		 it != m_aChangedDefaultLocaleVector.end(); it++ )
1197cdf0e10cSrcweir 	{
1198cdf0e10cSrcweir 		LocaleItem* pLocaleItem = *it;
1199cdf0e10cSrcweir 		if( pLocaleItem != NULL )
1200cdf0e10cSrcweir 		{
1201cdf0e10cSrcweir 			::rtl::OUString aCompleteFileName =
1202cdf0e10cSrcweir 				implGetPathForLocaleItem( pLocaleItem, aNameBase, Location, true );
1203cdf0e10cSrcweir 			if( xFileAccess->exists( aCompleteFileName ) )
1204cdf0e10cSrcweir 				xFileAccess->kill( aCompleteFileName );
1205cdf0e10cSrcweir 
1206cdf0e10cSrcweir 			delete pLocaleItem;
1207cdf0e10cSrcweir 		}
1208cdf0e10cSrcweir 	}
1209cdf0e10cSrcweir 	m_aChangedDefaultLocaleVector.clear();
1210cdf0e10cSrcweir }
1211cdf0e10cSrcweir 
implStoreAtLocation(const::rtl::OUString & Location,const::rtl::OUString & aNameBase,const::rtl::OUString & aComment,const Reference<ucb::XSimpleFileAccess> & xFileAccess,bool bUsedForStore,bool bStoreAll,bool bKillAll)1212cdf0e10cSrcweir void StringResourcePersistenceImpl::implStoreAtLocation
1213cdf0e10cSrcweir (
1214cdf0e10cSrcweir 	const ::rtl::OUString& Location,
1215cdf0e10cSrcweir 	const ::rtl::OUString& aNameBase,
1216cdf0e10cSrcweir 	const ::rtl::OUString& aComment,
1217cdf0e10cSrcweir 	const Reference< ucb::XSimpleFileAccess >& xFileAccess,
1218cdf0e10cSrcweir 	bool bUsedForStore,
1219cdf0e10cSrcweir 	bool bStoreAll,
1220cdf0e10cSrcweir 	bool bKillAll
1221cdf0e10cSrcweir )
1222cdf0e10cSrcweir 	throw (Exception, RuntimeException)
1223cdf0e10cSrcweir {
1224cdf0e10cSrcweir 	// Delete files for deleted locales
1225cdf0e10cSrcweir 	if( bUsedForStore || bKillAll )
1226cdf0e10cSrcweir 		implKillRemovedLocaleFiles( Location, aNameBase, xFileAccess );
1227cdf0e10cSrcweir 
1228cdf0e10cSrcweir     for( LocaleItemVectorConstIt it = m_aLocaleItemVector.begin(); it != m_aLocaleItemVector.end(); it++ )
1229cdf0e10cSrcweir     {
1230cdf0e10cSrcweir 		LocaleItem* pLocaleItem = *it;
1231cdf0e10cSrcweir 		if( pLocaleItem != NULL && (bStoreAll || bKillAll || pLocaleItem->m_bModified) &&
1232cdf0e10cSrcweir 			loadLocale( pLocaleItem ) )
1233cdf0e10cSrcweir 		{
1234cdf0e10cSrcweir 			::rtl::OUString aCompleteFileName =
1235cdf0e10cSrcweir 				implGetPathForLocaleItem( pLocaleItem, aNameBase, Location );
1236cdf0e10cSrcweir 			if( xFileAccess->exists( aCompleteFileName ) )
1237cdf0e10cSrcweir 				xFileAccess->kill( aCompleteFileName );
1238cdf0e10cSrcweir 
1239cdf0e10cSrcweir 			if( !bKillAll )
1240cdf0e10cSrcweir 			{
1241cdf0e10cSrcweir 				// Create Output stream
1242cdf0e10cSrcweir 				Reference< io::XOutputStream > xOutputStream = xFileAccess->openFileWrite( aCompleteFileName );
1243cdf0e10cSrcweir 				if( xOutputStream.is() )
1244cdf0e10cSrcweir 				{
1245cdf0e10cSrcweir 					implWritePropertiesFile( pLocaleItem, xOutputStream, aComment );
1246cdf0e10cSrcweir 					xOutputStream->closeOutput();
1247cdf0e10cSrcweir 				}
1248cdf0e10cSrcweir 				if( bUsedForStore )
1249cdf0e10cSrcweir 					pLocaleItem->m_bModified = false;
1250cdf0e10cSrcweir 			}
1251cdf0e10cSrcweir 		}
1252cdf0e10cSrcweir 	}
1253cdf0e10cSrcweir 
1254cdf0e10cSrcweir 	// Delete files for changed defaults
1255cdf0e10cSrcweir 	if( bUsedForStore || bKillAll )
1256cdf0e10cSrcweir 		implKillChangedDefaultFiles( Location, aNameBase, xFileAccess );
1257cdf0e10cSrcweir 
1258cdf0e10cSrcweir 	// Default locale
1259cdf0e10cSrcweir 	if( m_pDefaultLocaleItem != NULL && (bStoreAll || bKillAll || m_bDefaultModified) )
1260cdf0e10cSrcweir 	{
1261cdf0e10cSrcweir 		::rtl::OUString aCompleteFileName =
1262cdf0e10cSrcweir 			implGetPathForLocaleItem( m_pDefaultLocaleItem, aNameBase, Location, true );
1263cdf0e10cSrcweir 		if( xFileAccess->exists( aCompleteFileName ) )
1264cdf0e10cSrcweir 			xFileAccess->kill( aCompleteFileName );
1265cdf0e10cSrcweir 
1266cdf0e10cSrcweir 		if( !bKillAll )
1267cdf0e10cSrcweir 		{
1268cdf0e10cSrcweir 			// Create Output stream
1269cdf0e10cSrcweir 			Reference< io::XOutputStream > xOutputStream = xFileAccess->openFileWrite( aCompleteFileName );
1270cdf0e10cSrcweir 			if( xOutputStream.is() )
1271cdf0e10cSrcweir 				xOutputStream->closeOutput();
1272cdf0e10cSrcweir 
1273cdf0e10cSrcweir 			if( bUsedForStore )
1274cdf0e10cSrcweir 				m_bDefaultModified = false;
1275cdf0e10cSrcweir 		}
1276cdf0e10cSrcweir 	}
1277cdf0e10cSrcweir }
1278cdf0e10cSrcweir 
1279cdf0e10cSrcweir 
1280cdf0e10cSrcweir // -----------------------------------------------------------------------------
1281cdf0e10cSrcweir // BinaryOutput, helper class for exportBinary
1282cdf0e10cSrcweir 
1283cdf0e10cSrcweir class BinaryOutput
1284cdf0e10cSrcweir {
1285cdf0e10cSrcweir 	Reference< XMultiComponentFactory >		m_xMCF;
1286cdf0e10cSrcweir     Reference< XComponentContext >	        m_xContext;
1287cdf0e10cSrcweir 	Reference< XInterface >					m_xTempFile;
1288cdf0e10cSrcweir 	Reference< io::XOutputStream >			m_xOutputStream;
1289cdf0e10cSrcweir 
1290cdf0e10cSrcweir public:
1291cdf0e10cSrcweir 	BinaryOutput( Reference< XMultiComponentFactory > xMCF,
1292cdf0e10cSrcweir 		Reference< XComponentContext > xContext );
1293cdf0e10cSrcweir 
getOutputStream(void)1294cdf0e10cSrcweir 	Reference< io::XOutputStream > getOutputStream( void )
1295cdf0e10cSrcweir 		{ return m_xOutputStream; }
1296cdf0e10cSrcweir 
1297cdf0e10cSrcweir 	Sequence< ::sal_Int8 > closeAndGetData( void );
1298cdf0e10cSrcweir 
1299cdf0e10cSrcweir 	// Template to be used with sal_Int16 and sal_Unicode
1300cdf0e10cSrcweir 	template< class T >
1301cdf0e10cSrcweir 	void write16BitInt( T n );
writeInt16(sal_Int16 n)1302cdf0e10cSrcweir 	void writeInt16( sal_Int16 n )
1303cdf0e10cSrcweir 		{ write16BitInt( n ); }
writeUnicodeChar(sal_Unicode n)1304cdf0e10cSrcweir 	void writeUnicodeChar( sal_Unicode n )
1305cdf0e10cSrcweir 		{ write16BitInt( n ); }
1306cdf0e10cSrcweir 	void writeInt32( sal_Int32 n );
1307cdf0e10cSrcweir 	void writeString( const ::rtl::OUString& aStr );
1308cdf0e10cSrcweir };
1309cdf0e10cSrcweir 
BinaryOutput(Reference<XMultiComponentFactory> xMCF,Reference<XComponentContext> xContext)1310cdf0e10cSrcweir BinaryOutput::BinaryOutput( Reference< XMultiComponentFactory > xMCF,
1311cdf0e10cSrcweir 	Reference< XComponentContext > xContext )
1312cdf0e10cSrcweir 		: m_xMCF( xMCF )
1313cdf0e10cSrcweir 		, m_xContext( xContext )
1314cdf0e10cSrcweir {
1315cdf0e10cSrcweir 	m_xTempFile = m_xMCF->createInstanceWithContext
1316cdf0e10cSrcweir 		( ::rtl::OUString::createFromAscii( "com.sun.star.io.TempFile" ), m_xContext );
1317cdf0e10cSrcweir 	if( m_xTempFile.is() )
1318cdf0e10cSrcweir 		m_xOutputStream = Reference< io::XOutputStream >( m_xTempFile, UNO_QUERY );
1319cdf0e10cSrcweir }
1320cdf0e10cSrcweir 
1321cdf0e10cSrcweir template< class T >
write16BitInt(T n)1322cdf0e10cSrcweir void BinaryOutput::write16BitInt( T n )
1323cdf0e10cSrcweir {
1324cdf0e10cSrcweir 	if( !m_xOutputStream.is() )
1325cdf0e10cSrcweir 		return;
1326cdf0e10cSrcweir 
1327cdf0e10cSrcweir 	Sequence< sal_Int8 > aSeq( 2 );
1328cdf0e10cSrcweir 	sal_Int8* p = aSeq.getArray();
1329cdf0e10cSrcweir 
1330cdf0e10cSrcweir 	sal_Int8 nLow  = sal_Int8( n & 0xff );
1331cdf0e10cSrcweir 	sal_Int8 nHigh = sal_Int8( n >> 8 );
1332cdf0e10cSrcweir 
1333cdf0e10cSrcweir 	p[0] = nLow;
1334cdf0e10cSrcweir 	p[1] = nHigh;
1335cdf0e10cSrcweir 	m_xOutputStream->writeBytes( aSeq );
1336cdf0e10cSrcweir }
1337cdf0e10cSrcweir 
writeInt32(sal_Int32 n)1338cdf0e10cSrcweir void BinaryOutput::writeInt32( sal_Int32 n )
1339cdf0e10cSrcweir {
1340cdf0e10cSrcweir 	if( !m_xOutputStream.is() )
1341cdf0e10cSrcweir 		return;
1342cdf0e10cSrcweir 
1343cdf0e10cSrcweir 	Sequence< sal_Int8 > aSeq( 4 );
1344cdf0e10cSrcweir 	sal_Int8* p = aSeq.getArray();
1345cdf0e10cSrcweir 
1346cdf0e10cSrcweir 	for( sal_Int16 i = 0 ; i < 4 ; i++ )
1347cdf0e10cSrcweir 	{
1348cdf0e10cSrcweir 		p[i] = sal_Int8( n & 0xff );
1349cdf0e10cSrcweir 		n >>= 8;
1350cdf0e10cSrcweir 	}
1351cdf0e10cSrcweir 	m_xOutputStream->writeBytes( aSeq );
1352cdf0e10cSrcweir }
1353cdf0e10cSrcweir 
writeString(const::rtl::OUString & aStr)1354cdf0e10cSrcweir void BinaryOutput::writeString( const ::rtl::OUString& aStr )
1355cdf0e10cSrcweir {
1356cdf0e10cSrcweir 	sal_Int32 nLen = aStr.getLength();
1357cdf0e10cSrcweir 	const sal_Unicode* pStr = aStr.getStr();
1358cdf0e10cSrcweir 
1359cdf0e10cSrcweir 	for( sal_Int32 i = 0 ; i < nLen ; i++ )
1360cdf0e10cSrcweir 		writeUnicodeChar( pStr[i] );
1361cdf0e10cSrcweir 
1362cdf0e10cSrcweir 	writeUnicodeChar( 0 );
1363cdf0e10cSrcweir }
1364cdf0e10cSrcweir 
closeAndGetData(void)1365cdf0e10cSrcweir Sequence< ::sal_Int8 > BinaryOutput::closeAndGetData( void )
1366cdf0e10cSrcweir {
1367cdf0e10cSrcweir 	Sequence< ::sal_Int8 > aRetSeq;
1368cdf0e10cSrcweir 	if( !m_xOutputStream.is() )
1369cdf0e10cSrcweir 		return aRetSeq;
1370cdf0e10cSrcweir 
1371cdf0e10cSrcweir 	m_xOutputStream->closeOutput();
1372cdf0e10cSrcweir 
1373cdf0e10cSrcweir 	Reference< io::XSeekable> xSeekable( m_xTempFile, UNO_QUERY );
1374cdf0e10cSrcweir 	if( !xSeekable.is() )
1375cdf0e10cSrcweir 		return aRetSeq;
1376cdf0e10cSrcweir 
1377cdf0e10cSrcweir 	sal_Int32 nSize = (sal_Int32)xSeekable->getPosition();
1378cdf0e10cSrcweir 
1379cdf0e10cSrcweir 	Reference< io::XInputStream> xInputStream( m_xTempFile, UNO_QUERY );
1380cdf0e10cSrcweir 	if( !xInputStream.is() )
1381cdf0e10cSrcweir 		return aRetSeq;
1382cdf0e10cSrcweir 
1383cdf0e10cSrcweir 	xSeekable->seek( 0 );
1384cdf0e10cSrcweir 	sal_Int32 nRead = xInputStream->readBytes( aRetSeq, nSize );
1385cdf0e10cSrcweir 	(void)nRead;
1386cdf0e10cSrcweir 	OSL_ENSURE( nRead == nSize, "BinaryOutput::closeAndGetData: nRead != nSize" );
1387cdf0e10cSrcweir 
1388cdf0e10cSrcweir 	return aRetSeq;
1389cdf0e10cSrcweir }
1390cdf0e10cSrcweir 
1391cdf0e10cSrcweir 
1392cdf0e10cSrcweir // Binary format:
1393cdf0e10cSrcweir 
1394cdf0e10cSrcweir // Header
1395cdf0e10cSrcweir // Byte			Content
1396cdf0e10cSrcweir // 0 + 1		sal_Int16:	Version, currently 0, low byte first
1397cdf0e10cSrcweir // 2 + 3		sal_Int16:	Locale count = n, low byte first
1398cdf0e10cSrcweir // 4 + 5		sal_Int16:	Default Locale position in Locale list, == n if none
1399cdf0e10cSrcweir // 6 - 7		sal_Int32:	Start index locale block 0, lowest byte first
1400cdf0e10cSrcweir // (n-1) *		sal_Int32:	Start index locale block 1 to n, lowest byte first
1401cdf0e10cSrcweir // 6 + 4*n		sal_Int32:	"Start index" non existing locale block n+1,
1402cdf0e10cSrcweir //							marks the first invalid index, kind of EOF
1403cdf0e10cSrcweir 
1404cdf0e10cSrcweir // Locale block
1405cdf0e10cSrcweir // All strings are stored as 2-Byte-0 terminated sequence
1406cdf0e10cSrcweir // of 16 bit Unicode characters, each with low byte first
1407cdf0e10cSrcweir // Empty strings only contain the 2-Byte-0
1408cdf0e10cSrcweir 
1409cdf0e10cSrcweir // Members of com.sun.star.lang.Locale
1410cdf0e10cSrcweir // with l1 = Locale.Language.getLength()
1411cdf0e10cSrcweir // with l2 = Locale.Country.getLength()
1412cdf0e10cSrcweir // with l3 = Locale.Variant.getLength()
1413cdf0e10cSrcweir // pos0 = 0						Locale.Language
1414cdf0e10cSrcweir // pos1 = 2 * (l1 + 1)			Locale.Country
1415cdf0e10cSrcweir // pos2 = pos1 + 2 * (l2 + 1)	Locale.Variant
1416cdf0e10cSrcweir // pos3 = pos2 + 2 * (l3 + 1)
1417cdf0e10cSrcweir // pos3							Properties file written by implWritePropertiesFile
1418cdf0e10cSrcweir 
exportBinary()1419cdf0e10cSrcweir Sequence< sal_Int8 > StringResourcePersistenceImpl::exportBinary(  )
1420cdf0e10cSrcweir 	throw (RuntimeException)
1421cdf0e10cSrcweir {
1422cdf0e10cSrcweir 	Reference< XMultiComponentFactory > xMCF = getMultiComponentFactory();
1423cdf0e10cSrcweir 	BinaryOutput aOut( xMCF, m_xContext );
1424cdf0e10cSrcweir 
1425cdf0e10cSrcweir 	sal_Int32 nLocaleCount = m_aLocaleItemVector.size();
1426cdf0e10cSrcweir 	Sequence< sal_Int8 >* pLocaleDataSeq = new Sequence< sal_Int8 >[ nLocaleCount ];
1427cdf0e10cSrcweir 
1428cdf0e10cSrcweir 	sal_Int32 iLocale = 0;
1429cdf0e10cSrcweir 	sal_Int32 iDefault = 0;
1430cdf0e10cSrcweir     for( LocaleItemVectorConstIt it = m_aLocaleItemVector.begin();
1431cdf0e10cSrcweir 		 it != m_aLocaleItemVector.end(); it++,iLocale++ )
1432cdf0e10cSrcweir     {
1433cdf0e10cSrcweir 		LocaleItem* pLocaleItem = *it;
1434cdf0e10cSrcweir 		if( pLocaleItem != NULL && loadLocale( pLocaleItem ) )
1435cdf0e10cSrcweir 		{
1436cdf0e10cSrcweir 			if( m_pDefaultLocaleItem == pLocaleItem )
1437cdf0e10cSrcweir 				iDefault = iLocale;
1438cdf0e10cSrcweir 
1439cdf0e10cSrcweir 			BinaryOutput aLocaleOut( m_xMCF, m_xContext );
1440cdf0e10cSrcweir 			implWriteLocaleBinary( pLocaleItem, aLocaleOut );
1441cdf0e10cSrcweir 
1442cdf0e10cSrcweir 			pLocaleDataSeq[iLocale] = aLocaleOut.closeAndGetData();
1443cdf0e10cSrcweir 		}
1444cdf0e10cSrcweir 	}
1445cdf0e10cSrcweir 
1446cdf0e10cSrcweir 	// Write header
1447cdf0e10cSrcweir 	sal_Int16 nVersion = 0;
1448cdf0e10cSrcweir 	sal_Int16 nLocaleCount16 = (sal_Int16)nLocaleCount;
1449cdf0e10cSrcweir 	sal_Int16 iDefault16 = (sal_Int16)iDefault;
1450cdf0e10cSrcweir 	aOut.writeInt16( nVersion );
1451cdf0e10cSrcweir 	aOut.writeInt16( nLocaleCount16 );
1452cdf0e10cSrcweir 	aOut.writeInt16( iDefault16 );
1453cdf0e10cSrcweir 
1454cdf0e10cSrcweir 	// Write data positions
1455cdf0e10cSrcweir 	sal_Int32 nDataPos = 6 + 4 * (nLocaleCount + 1);
1456cdf0e10cSrcweir 	for( iLocale = 0; iLocale < nLocaleCount; iLocale++ )
1457cdf0e10cSrcweir 	{
1458cdf0e10cSrcweir 		aOut.writeInt32( nDataPos );
1459cdf0e10cSrcweir 
1460cdf0e10cSrcweir 		Sequence< sal_Int8 >& rSeq = pLocaleDataSeq[iLocale];
1461cdf0e10cSrcweir 	    sal_Int32 nSeqLen = rSeq.getLength();
1462cdf0e10cSrcweir 		nDataPos += nSeqLen;
1463cdf0e10cSrcweir 	}
1464cdf0e10cSrcweir 	// Write final position
1465cdf0e10cSrcweir 	aOut.writeInt32( nDataPos );
1466cdf0e10cSrcweir 
1467cdf0e10cSrcweir 	// Write data
1468cdf0e10cSrcweir 	Reference< io::XOutputStream > xOutputStream = aOut.getOutputStream();
1469cdf0e10cSrcweir 	if( xOutputStream.is() )
1470cdf0e10cSrcweir 	{
1471cdf0e10cSrcweir 		for( iLocale = 0; iLocale < nLocaleCount; iLocale++ )
1472cdf0e10cSrcweir 		{
1473cdf0e10cSrcweir 			Sequence< sal_Int8 >& rSeq = pLocaleDataSeq[iLocale];
1474cdf0e10cSrcweir 			xOutputStream->writeBytes( rSeq );
1475cdf0e10cSrcweir 		}
1476cdf0e10cSrcweir 	}
1477cdf0e10cSrcweir 
1478cdf0e10cSrcweir 	delete[] pLocaleDataSeq;
1479cdf0e10cSrcweir 
1480cdf0e10cSrcweir 	Sequence< sal_Int8 > aRetSeq = aOut.closeAndGetData();
1481cdf0e10cSrcweir 	return aRetSeq;
1482cdf0e10cSrcweir }
1483cdf0e10cSrcweir 
implWriteLocaleBinary(LocaleItem * pLocaleItem,BinaryOutput & rOut)1484cdf0e10cSrcweir void StringResourcePersistenceImpl::implWriteLocaleBinary
1485cdf0e10cSrcweir 	( LocaleItem* pLocaleItem, BinaryOutput& rOut )
1486cdf0e10cSrcweir {
1487cdf0e10cSrcweir 	Reference< io::XOutputStream > xOutputStream = rOut.getOutputStream();
1488cdf0e10cSrcweir 	if( !xOutputStream.is() )
1489cdf0e10cSrcweir 		return;
1490cdf0e10cSrcweir 
1491cdf0e10cSrcweir 	Locale& rLocale = pLocaleItem->m_locale;
1492cdf0e10cSrcweir 	rOut.writeString( rLocale.Language );
1493cdf0e10cSrcweir 	rOut.writeString( rLocale.Country );
1494cdf0e10cSrcweir 	rOut.writeString( rLocale.Variant );
1495cdf0e10cSrcweir 	implWritePropertiesFile( pLocaleItem, xOutputStream, m_aComment );
1496cdf0e10cSrcweir }
1497cdf0e10cSrcweir 
1498cdf0e10cSrcweir // -----------------------------------------------------------------------------
1499cdf0e10cSrcweir // BinaryOutput, helper class for exportBinary
1500cdf0e10cSrcweir 
1501cdf0e10cSrcweir class BinaryInput
1502cdf0e10cSrcweir {
1503cdf0e10cSrcweir 	Sequence< sal_Int8 >					m_aData;
1504cdf0e10cSrcweir 	Reference< XMultiComponentFactory >		m_xMCF;
1505cdf0e10cSrcweir 	Reference< XComponentContext >	        m_xContext;
1506cdf0e10cSrcweir 
1507cdf0e10cSrcweir 	const sal_Int8*							m_pData;
1508cdf0e10cSrcweir 	sal_Int32								m_nCurPos;
1509cdf0e10cSrcweir 	sal_Int32								m_nSize;
1510cdf0e10cSrcweir 
1511cdf0e10cSrcweir public:
1512cdf0e10cSrcweir 	BinaryInput( Sequence< ::sal_Int8 > aData, Reference< XMultiComponentFactory > xMCF,
1513cdf0e10cSrcweir 		Reference< XComponentContext > xContext );
1514cdf0e10cSrcweir 
1515cdf0e10cSrcweir 	Reference< io::XInputStream > getInputStreamForSection( sal_Int32 nSize );
1516cdf0e10cSrcweir 
1517cdf0e10cSrcweir 	void seek( sal_Int32 nPos );
getPosition(void)1518cdf0e10cSrcweir 	sal_Int32 getPosition( void )
1519cdf0e10cSrcweir 		{ return m_nCurPos; }
1520cdf0e10cSrcweir 
1521cdf0e10cSrcweir 	sal_Int16 readInt16( void );
1522cdf0e10cSrcweir 	sal_Int32 readInt32( void );
1523cdf0e10cSrcweir 	sal_Unicode readUnicodeChar( void );
1524cdf0e10cSrcweir 	::rtl::OUString readString( void );
1525cdf0e10cSrcweir };
1526cdf0e10cSrcweir 
BinaryInput(Sequence<::sal_Int8> aData,Reference<XMultiComponentFactory> xMCF,Reference<XComponentContext> xContext)1527cdf0e10cSrcweir BinaryInput::BinaryInput( Sequence< ::sal_Int8 > aData, Reference< XMultiComponentFactory > xMCF,
1528cdf0e10cSrcweir 	Reference< XComponentContext > xContext )
1529cdf0e10cSrcweir 		: m_aData( aData )
1530cdf0e10cSrcweir 		, m_xMCF( xMCF )
1531cdf0e10cSrcweir 		, m_xContext( xContext )
1532cdf0e10cSrcweir {
1533cdf0e10cSrcweir 	m_pData = m_aData.getConstArray();
1534cdf0e10cSrcweir 	m_nCurPos = 0;
1535cdf0e10cSrcweir 	m_nSize = m_aData.getLength();
1536cdf0e10cSrcweir }
1537cdf0e10cSrcweir 
getInputStreamForSection(sal_Int32 nSize)1538cdf0e10cSrcweir Reference< io::XInputStream > BinaryInput::getInputStreamForSection( sal_Int32 nSize )
1539cdf0e10cSrcweir {
1540cdf0e10cSrcweir 	Reference< io::XInputStream > xIn;
1541cdf0e10cSrcweir 	if( m_nCurPos + nSize <= m_nSize )
1542cdf0e10cSrcweir 	{
1543cdf0e10cSrcweir 		Reference< io::XOutputStream > xTempOut( m_xMCF->createInstanceWithContext
1544cdf0e10cSrcweir 			( ::rtl::OUString::createFromAscii( "com.sun.star.io.TempFile" ), m_xContext ), UNO_QUERY );
1545cdf0e10cSrcweir 		if( xTempOut.is() )
1546cdf0e10cSrcweir 		{
1547cdf0e10cSrcweir 			Sequence< sal_Int8 > aSection( m_pData + m_nCurPos, nSize );
1548cdf0e10cSrcweir 			xTempOut->writeBytes( aSection );
1549cdf0e10cSrcweir 
1550cdf0e10cSrcweir 			Reference< io::XSeekable> xSeekable( xTempOut, UNO_QUERY );
1551cdf0e10cSrcweir 			if( xSeekable.is() )
1552cdf0e10cSrcweir 				xSeekable->seek( 0 );
1553cdf0e10cSrcweir 
1554cdf0e10cSrcweir 			xIn = Reference< io::XInputStream>( xTempOut, UNO_QUERY );
1555cdf0e10cSrcweir 		}
1556cdf0e10cSrcweir 	}
1557cdf0e10cSrcweir 	else
1558cdf0e10cSrcweir 		OSL_ENSURE( false, "BinaryInput::getInputStreamForSection(): Read past end" );
1559cdf0e10cSrcweir 
1560cdf0e10cSrcweir 	return xIn;
1561cdf0e10cSrcweir }
1562cdf0e10cSrcweir 
seek(sal_Int32 nPos)1563cdf0e10cSrcweir void BinaryInput::seek( sal_Int32 nPos )
1564cdf0e10cSrcweir {
1565cdf0e10cSrcweir 	if( nPos <= m_nSize )
1566cdf0e10cSrcweir 		m_nCurPos = nPos;
1567cdf0e10cSrcweir 	else
1568cdf0e10cSrcweir 		OSL_ENSURE( false, "BinaryInput::seek(): Position past end" );
1569cdf0e10cSrcweir }
1570cdf0e10cSrcweir 
1571cdf0e10cSrcweir 
readInt16(void)1572cdf0e10cSrcweir sal_Int16 BinaryInput::readInt16( void )
1573cdf0e10cSrcweir {
1574cdf0e10cSrcweir 	sal_Int16 nRet = 0;
1575cdf0e10cSrcweir 	if( m_nCurPos + 2 <= m_nSize )
1576cdf0e10cSrcweir 	{
1577cdf0e10cSrcweir 		nRet = nRet + sal_Int16( sal_uInt8( m_pData[m_nCurPos++] ) );
1578cdf0e10cSrcweir 		nRet += 256 * sal_Int16( sal_uInt8( m_pData[m_nCurPos++] ) );
1579cdf0e10cSrcweir 	}
1580cdf0e10cSrcweir 	else
1581cdf0e10cSrcweir 		OSL_ENSURE( false, "BinaryInput::readInt16(): Read past end" );
1582cdf0e10cSrcweir 
1583cdf0e10cSrcweir 	return nRet;
1584cdf0e10cSrcweir }
1585cdf0e10cSrcweir 
readInt32(void)1586cdf0e10cSrcweir sal_Int32 BinaryInput::readInt32( void )
1587cdf0e10cSrcweir {
1588cdf0e10cSrcweir 	sal_Int32 nRet = 0;
1589cdf0e10cSrcweir 	if( m_nCurPos + 4 <= m_nSize )
1590cdf0e10cSrcweir 	{
1591cdf0e10cSrcweir 		sal_Int32 nFactor = 1;
1592cdf0e10cSrcweir 		for( sal_Int16 i = 0; i < 4; i++ )
1593cdf0e10cSrcweir 		{
1594cdf0e10cSrcweir 			nRet += sal_uInt8( m_pData[m_nCurPos++] ) * nFactor;
1595cdf0e10cSrcweir 			nFactor *= 256;
1596cdf0e10cSrcweir 		}
1597cdf0e10cSrcweir 	}
1598cdf0e10cSrcweir 	else
1599cdf0e10cSrcweir 		OSL_ENSURE( false, "BinaryInput::readInt32(): Read past end" );
1600cdf0e10cSrcweir 
1601cdf0e10cSrcweir 	return nRet;
1602cdf0e10cSrcweir }
1603cdf0e10cSrcweir 
readUnicodeChar(void)1604cdf0e10cSrcweir sal_Unicode BinaryInput::readUnicodeChar( void )
1605cdf0e10cSrcweir {
1606cdf0e10cSrcweir 	sal_uInt16 nRet = 0;
1607cdf0e10cSrcweir 	if( m_nCurPos + 2 <= m_nSize )
1608cdf0e10cSrcweir 	{
1609cdf0e10cSrcweir 		nRet = nRet + sal_uInt8( m_pData[m_nCurPos++] );
1610cdf0e10cSrcweir 		nRet += 256 * sal_uInt8( m_pData[m_nCurPos++] );
1611cdf0e10cSrcweir 	}
1612cdf0e10cSrcweir 	else
1613cdf0e10cSrcweir 		OSL_ENSURE( false, "BinaryInput::readUnicodeChar(): Read past end" );
1614cdf0e10cSrcweir 
1615cdf0e10cSrcweir 	sal_Unicode cRet = nRet;
1616cdf0e10cSrcweir 	return cRet;
1617cdf0e10cSrcweir }
1618cdf0e10cSrcweir 
readString(void)1619cdf0e10cSrcweir ::rtl::OUString BinaryInput::readString( void )
1620cdf0e10cSrcweir {
1621cdf0e10cSrcweir 	::rtl::OUStringBuffer aBuf;
1622cdf0e10cSrcweir 	sal_Unicode c;
1623cdf0e10cSrcweir 	do
1624cdf0e10cSrcweir 	{
1625cdf0e10cSrcweir 		c = readUnicodeChar();
1626cdf0e10cSrcweir 		if( c != 0 )
1627cdf0e10cSrcweir 			aBuf.append( c );
1628cdf0e10cSrcweir 	}
1629cdf0e10cSrcweir 	while( c != 0 );
1630cdf0e10cSrcweir 
1631cdf0e10cSrcweir 	::rtl::OUString aRetStr = aBuf.makeStringAndClear();
1632cdf0e10cSrcweir 	return aRetStr;
1633cdf0e10cSrcweir }
1634cdf0e10cSrcweir 
importBinary(const Sequence<::sal_Int8> & Data)1635cdf0e10cSrcweir void StringResourcePersistenceImpl::importBinary( const Sequence< ::sal_Int8 >& Data )
1636cdf0e10cSrcweir 	throw (IllegalArgumentException, RuntimeException)
1637cdf0e10cSrcweir {
1638cdf0e10cSrcweir 	// Init: Remove all locales
1639cdf0e10cSrcweir 	sal_Int32 nOldLocaleCount = 0;
1640cdf0e10cSrcweir 	do
1641cdf0e10cSrcweir 	{
1642cdf0e10cSrcweir 		Sequence< Locale > aLocaleSeq = getLocales();
1643cdf0e10cSrcweir 		nOldLocaleCount = aLocaleSeq.getLength();
1644cdf0e10cSrcweir 		if( nOldLocaleCount > 0 )
1645cdf0e10cSrcweir 		{
1646cdf0e10cSrcweir 			Locale aLocale = aLocaleSeq[0];
1647cdf0e10cSrcweir 			removeLocale( aLocale );
1648cdf0e10cSrcweir 		}
1649cdf0e10cSrcweir 	}
1650cdf0e10cSrcweir 	while( nOldLocaleCount > 0 );
1651cdf0e10cSrcweir 
1652cdf0e10cSrcweir 	// Import data
1653cdf0e10cSrcweir 	Reference< XMultiComponentFactory > xMCF = getMultiComponentFactory();
1654cdf0e10cSrcweir 	BinaryInput aIn( Data, xMCF, m_xContext );
1655cdf0e10cSrcweir 
1656cdf0e10cSrcweir 	sal_Int32 nVersion = aIn.readInt16();
1657cdf0e10cSrcweir 	(void)nVersion;
1658cdf0e10cSrcweir 	sal_Int32 nLocaleCount = aIn.readInt16();
1659cdf0e10cSrcweir 	sal_Int32 iDefault = aIn.readInt16();
1660cdf0e10cSrcweir 	(void)iDefault;
1661cdf0e10cSrcweir 
1662cdf0e10cSrcweir 	sal_Int32* pPositions = new sal_Int32[nLocaleCount + 1];
1663cdf0e10cSrcweir 	for( sal_Int32 i = 0; i < nLocaleCount + 1; i++ )
1664cdf0e10cSrcweir 		pPositions[i] = aIn.readInt32();
1665cdf0e10cSrcweir 
1666cdf0e10cSrcweir 	// Import locales
1667cdf0e10cSrcweir 	LocaleItem* pUseAsDefaultItem = NULL;
1668cdf0e10cSrcweir 	for( sal_Int32 i = 0; i < nLocaleCount; i++ )
1669cdf0e10cSrcweir 	{
1670cdf0e10cSrcweir 		sal_Int32 nPos = pPositions[i];
1671cdf0e10cSrcweir 		aIn.seek( nPos );
1672cdf0e10cSrcweir 
1673cdf0e10cSrcweir 		Locale aLocale;
1674cdf0e10cSrcweir 		aLocale.Language = aIn.readString();
1675cdf0e10cSrcweir 		aLocale.Country = aIn.readString();
1676cdf0e10cSrcweir 		aLocale.Variant = aIn.readString();
1677cdf0e10cSrcweir 
1678cdf0e10cSrcweir 		sal_Int32 nAfterStringPos = aIn.getPosition();
1679cdf0e10cSrcweir 		sal_Int32 nSize = pPositions[i+1] - nAfterStringPos;
1680cdf0e10cSrcweir 		Reference< io::XInputStream > xInput = aIn.getInputStreamForSection( nSize );
1681cdf0e10cSrcweir 		if( xInput.is() )
1682cdf0e10cSrcweir 		{
1683cdf0e10cSrcweir 			LocaleItem* pLocaleItem = new LocaleItem( aLocale );
1684cdf0e10cSrcweir 			if( iDefault == i )
1685cdf0e10cSrcweir 				pUseAsDefaultItem = pLocaleItem;
1686cdf0e10cSrcweir 			m_aLocaleItemVector.push_back( pLocaleItem );
1687cdf0e10cSrcweir 			implReadPropertiesFile( pLocaleItem, xInput );
1688cdf0e10cSrcweir 		}
1689cdf0e10cSrcweir 	}
1690cdf0e10cSrcweir 
1691cdf0e10cSrcweir 	if( pUseAsDefaultItem != NULL )
1692cdf0e10cSrcweir 		setDefaultLocale( pUseAsDefaultItem->m_locale );
1693cdf0e10cSrcweir 
1694cdf0e10cSrcweir 	delete[] pPositions;
1695cdf0e10cSrcweir }
1696cdf0e10cSrcweir 
1697cdf0e10cSrcweir 
1698cdf0e10cSrcweir // =============================================================================
1699cdf0e10cSrcweir // Private helper methods
1700cdf0e10cSrcweir 
checkNamingSceme(const::rtl::OUString & aName,const::rtl::OUString & aNameBase,Locale & aLocale)1701cdf0e10cSrcweir bool checkNamingSceme( const ::rtl::OUString& aName, const ::rtl::OUString& aNameBase,
1702cdf0e10cSrcweir 					   Locale& aLocale )
1703cdf0e10cSrcweir {
1704cdf0e10cSrcweir 	bool bSuccess = false;
1705cdf0e10cSrcweir 
1706cdf0e10cSrcweir 	sal_Int32 nNameLen = aName.getLength();
1707cdf0e10cSrcweir 	sal_Int32 nNameBaseLen = aNameBase.getLength();
1708cdf0e10cSrcweir 
1709cdf0e10cSrcweir 	// Name has to start with NameBase followed
1710cdf0e10cSrcweir 	// by a '_' and at least one more character
1711cdf0e10cSrcweir     if( aName.indexOf( aNameBase ) == 0 && nNameBaseLen < nNameLen-1 &&
1712cdf0e10cSrcweir 		aName.getStr()[nNameBaseLen] == '_' )
1713cdf0e10cSrcweir 	{
1714cdf0e10cSrcweir 		bSuccess = true;
1715cdf0e10cSrcweir 
1716cdf0e10cSrcweir 		sal_Int32 iStart = nNameBaseLen + 1;
1717cdf0e10cSrcweir 		sal_Int32 iNext_ = aName.indexOf( '_', iStart );
1718cdf0e10cSrcweir 		if( iNext_ != -1 && iNext_ < nNameLen-1 )
1719cdf0e10cSrcweir 		{
1720cdf0e10cSrcweir 			aLocale.Language = aName.copy( iStart, iNext_ - iStart );
1721cdf0e10cSrcweir 
1722cdf0e10cSrcweir 			iStart = iNext_ + 1;
1723cdf0e10cSrcweir 			iNext_ = aName.indexOf( '_', iStart );
1724cdf0e10cSrcweir 			if( iNext_ != -1 && iNext_ < nNameLen-1 )
1725cdf0e10cSrcweir 			{
1726cdf0e10cSrcweir 				aLocale.Country = aName.copy( iStart, iNext_ - iStart );
1727cdf0e10cSrcweir 				aLocale.Variant = aName.copy( iNext_ + 1 );
1728cdf0e10cSrcweir 			}
1729cdf0e10cSrcweir 			else
1730cdf0e10cSrcweir 				aLocale.Country = aName.copy( iStart );
1731cdf0e10cSrcweir 		}
1732cdf0e10cSrcweir 		else
1733cdf0e10cSrcweir 			aLocale.Language = aName.copy( iStart );
1734cdf0e10cSrcweir 	}
1735cdf0e10cSrcweir 	return bSuccess;
1736cdf0e10cSrcweir }
1737cdf0e10cSrcweir 
implLoadAllLocales(void)1738cdf0e10cSrcweir void StringResourcePersistenceImpl::implLoadAllLocales( void )
1739cdf0e10cSrcweir {
1740cdf0e10cSrcweir 	for( LocaleItemVectorIt it = m_aLocaleItemVector.begin(); it != m_aLocaleItemVector.end(); it++ )
1741cdf0e10cSrcweir 	{
1742cdf0e10cSrcweir 		LocaleItem* pLocaleItem = *it;
1743cdf0e10cSrcweir 		if( pLocaleItem != NULL )
1744cdf0e10cSrcweir 			loadLocale( pLocaleItem );
1745cdf0e10cSrcweir 	}
1746cdf0e10cSrcweir }
1747cdf0e10cSrcweir 
1748cdf0e10cSrcweir // Scan locale properties files helper
implScanLocaleNames(const Sequence<::rtl::OUString> & aContentSeq)1749cdf0e10cSrcweir void StringResourcePersistenceImpl::implScanLocaleNames( const Sequence< ::rtl::OUString >& aContentSeq )
1750cdf0e10cSrcweir {
1751cdf0e10cSrcweir 	Locale aDefaultLocale;
1752cdf0e10cSrcweir 	bool bDefaultFound = false;
1753cdf0e10cSrcweir 
1754cdf0e10cSrcweir     sal_Int32 nCount = aContentSeq.getLength();
1755cdf0e10cSrcweir 	const ::rtl::OUString* pFiles = aContentSeq.getConstArray();
1756cdf0e10cSrcweir 	for( int i = 0 ; i < nCount ; i++ )
1757cdf0e10cSrcweir 	{
1758cdf0e10cSrcweir 		::rtl::OUString aCompleteName = pFiles[i];
1759cdf0e10cSrcweir 		rtl::OUString aPureName;
1760cdf0e10cSrcweir 		rtl::OUString aExtension;
1761cdf0e10cSrcweir 		sal_Int32 iDot = aCompleteName.lastIndexOf( '.' );
1762cdf0e10cSrcweir 		sal_Int32 iSlash = aCompleteName.lastIndexOf( '/' );
1763cdf0e10cSrcweir 		if( iDot != -1 )
1764cdf0e10cSrcweir 		{
1765cdf0e10cSrcweir 			sal_Int32 iCopyFrom = (iSlash != -1) ? iSlash + 1 : 0;
1766cdf0e10cSrcweir 			aPureName = aCompleteName.copy( iCopyFrom, iDot-iCopyFrom );
1767cdf0e10cSrcweir 			aExtension = aCompleteName.copy( iDot + 1 );
1768cdf0e10cSrcweir 		}
1769cdf0e10cSrcweir 
1770cdf0e10cSrcweir 		if( aExtension.equalsAscii( "properties" ) )
1771cdf0e10cSrcweir 		{
1772cdf0e10cSrcweir 			//rtl::OUString aName = aInetObj.getBase();
1773cdf0e10cSrcweir 			Locale aLocale;
1774cdf0e10cSrcweir 
1775cdf0e10cSrcweir 			if( checkNamingSceme( aPureName, m_aNameBase, aLocale ) )
1776cdf0e10cSrcweir 			{
1777cdf0e10cSrcweir 				LocaleItem* pLocaleItem = new LocaleItem( aLocale, false );
1778cdf0e10cSrcweir 				m_aLocaleItemVector.push_back( pLocaleItem );
1779cdf0e10cSrcweir 
1780cdf0e10cSrcweir 				if( m_pCurrentLocaleItem == NULL )
1781cdf0e10cSrcweir 					m_pCurrentLocaleItem = pLocaleItem;
1782cdf0e10cSrcweir 
1783cdf0e10cSrcweir 				if( m_pDefaultLocaleItem == NULL )
1784cdf0e10cSrcweir 				{
1785cdf0e10cSrcweir 					m_pDefaultLocaleItem = pLocaleItem;
1786cdf0e10cSrcweir 					m_bDefaultModified = true;
1787cdf0e10cSrcweir 				}
1788cdf0e10cSrcweir 			}
1789cdf0e10cSrcweir 		}
1790cdf0e10cSrcweir 		else if( !bDefaultFound && aExtension.equalsAscii( "default" ) )
1791cdf0e10cSrcweir 		{
1792cdf0e10cSrcweir 			//rtl::OUString aName = aInetObj.getBase();
1793cdf0e10cSrcweir 			Locale aLocale;
1794cdf0e10cSrcweir 
1795cdf0e10cSrcweir 			if( checkNamingSceme( aPureName, m_aNameBase, aDefaultLocale ) )
1796cdf0e10cSrcweir 				bDefaultFound = true;
1797cdf0e10cSrcweir 		}
1798cdf0e10cSrcweir 	}
1799cdf0e10cSrcweir 	if( bDefaultFound )
1800cdf0e10cSrcweir 	{
1801cdf0e10cSrcweir 		LocaleItem* pLocaleItem = getItemForLocale( aDefaultLocale, false );
1802cdf0e10cSrcweir 		if( pLocaleItem )
1803cdf0e10cSrcweir 		{
1804cdf0e10cSrcweir 			m_pDefaultLocaleItem = pLocaleItem;
1805cdf0e10cSrcweir 			m_bDefaultModified = false;
1806cdf0e10cSrcweir 		}
1807cdf0e10cSrcweir 	}
1808cdf0e10cSrcweir }
1809cdf0e10cSrcweir 
1810cdf0e10cSrcweir // Scan locale properties files
implScanLocales(void)1811cdf0e10cSrcweir void StringResourcePersistenceImpl::implScanLocales( void )
1812cdf0e10cSrcweir {
1813cdf0e10cSrcweir 	// Dummy implementation, method not called for this
1814cdf0e10cSrcweir 	// base class, but pure virtual not possible-
1815cdf0e10cSrcweir }
1816cdf0e10cSrcweir 
loadLocale(LocaleItem * pLocaleItem)1817cdf0e10cSrcweir bool StringResourcePersistenceImpl::loadLocale( LocaleItem* pLocaleItem )
1818cdf0e10cSrcweir {
1819cdf0e10cSrcweir 	bool bSuccess = false;
1820cdf0e10cSrcweir 
1821cdf0e10cSrcweir 	OSL_ENSURE( pLocaleItem, "StringResourcePersistenceImpl::loadLocale(): pLocaleItem == NULL" );
1822cdf0e10cSrcweir     if( pLocaleItem )
1823cdf0e10cSrcweir     {
1824cdf0e10cSrcweir 		if( pLocaleItem->m_bLoaded )
1825cdf0e10cSrcweir 		{
1826cdf0e10cSrcweir 			bSuccess = true;
1827cdf0e10cSrcweir 		}
1828cdf0e10cSrcweir 		else
1829cdf0e10cSrcweir 		{
1830cdf0e10cSrcweir 			bSuccess = implLoadLocale( pLocaleItem );
1831cdf0e10cSrcweir 			pLocaleItem->m_bLoaded = true;		// = bSuccess??? -> leads to more tries
1832cdf0e10cSrcweir 		}
1833cdf0e10cSrcweir 	}
1834cdf0e10cSrcweir 	return bSuccess;
1835cdf0e10cSrcweir }
1836cdf0e10cSrcweir 
implLoadLocale(LocaleItem *)1837cdf0e10cSrcweir bool StringResourcePersistenceImpl::implLoadLocale( LocaleItem* )
1838cdf0e10cSrcweir {
1839cdf0e10cSrcweir 	// Dummy implementation, method not called for this
1840cdf0e10cSrcweir 	// base class, but pure virtual not possible-
1841cdf0e10cSrcweir 	return false;
1842cdf0e10cSrcweir }
1843cdf0e10cSrcweir 
implGetNameScemeForLocaleItem(const LocaleItem * pLocaleItem)1844cdf0e10cSrcweir ::rtl::OUString implGetNameScemeForLocaleItem( const LocaleItem* pLocaleItem )
1845cdf0e10cSrcweir {
1846cdf0e10cSrcweir 	static ::rtl::OUString aUnder = ::rtl::OUString::createFromAscii( "_" );
1847cdf0e10cSrcweir 
1848cdf0e10cSrcweir 	OSL_ENSURE( pLocaleItem,
1849cdf0e10cSrcweir 		"StringResourcePersistenceImpl::implGetNameScemeForLocaleItem(): pLocaleItem == NULL" );
1850cdf0e10cSrcweir 	Locale aLocale = pLocaleItem->m_locale;
1851cdf0e10cSrcweir 
1852cdf0e10cSrcweir 	::rtl::OUString aRetStr = aUnder;
1853cdf0e10cSrcweir 	aRetStr += aLocale.Language;
1854cdf0e10cSrcweir 
1855cdf0e10cSrcweir 	::rtl::OUString aCountry  = aLocale.Country;
1856cdf0e10cSrcweir 	if( aCountry.getLength() )
1857cdf0e10cSrcweir 	{
1858cdf0e10cSrcweir 		aRetStr += aUnder;
1859cdf0e10cSrcweir 		aRetStr += aCountry;
1860cdf0e10cSrcweir 	}
1861cdf0e10cSrcweir 
1862cdf0e10cSrcweir 	::rtl::OUString aVariant  = aLocale.Variant;
1863cdf0e10cSrcweir 	if( aVariant.getLength() )
1864cdf0e10cSrcweir 	{
1865cdf0e10cSrcweir 		aRetStr += aUnder;
1866cdf0e10cSrcweir 		aRetStr += aVariant;
1867cdf0e10cSrcweir 	}
1868cdf0e10cSrcweir 	return aRetStr;
1869cdf0e10cSrcweir }
1870cdf0e10cSrcweir 
implGetFileNameForLocaleItem(LocaleItem * pLocaleItem,const::rtl::OUString & aNameBase)1871cdf0e10cSrcweir ::rtl::OUString StringResourcePersistenceImpl::implGetFileNameForLocaleItem
1872cdf0e10cSrcweir 	( LocaleItem* pLocaleItem, const ::rtl::OUString& aNameBase )
1873cdf0e10cSrcweir {
1874cdf0e10cSrcweir 	::rtl::OUString aFileName = aNameBase;
1875cdf0e10cSrcweir 	if( aFileName.getLength() == 0 )
1876cdf0e10cSrcweir 		aFileName = aNameBaseDefaultStr;
1877cdf0e10cSrcweir 
1878cdf0e10cSrcweir 	aFileName += implGetNameScemeForLocaleItem( pLocaleItem );
1879cdf0e10cSrcweir 	return aFileName;
1880cdf0e10cSrcweir }
1881cdf0e10cSrcweir 
implGetPathForLocaleItem(LocaleItem * pLocaleItem,const::rtl::OUString & aNameBase,const::rtl::OUString & aLocation,bool bDefaultFile)1882cdf0e10cSrcweir ::rtl::OUString StringResourcePersistenceImpl::implGetPathForLocaleItem
1883cdf0e10cSrcweir 	( LocaleItem* pLocaleItem, const ::rtl::OUString& aNameBase,
1884cdf0e10cSrcweir 	  const ::rtl::OUString& aLocation, bool bDefaultFile )
1885cdf0e10cSrcweir {
1886cdf0e10cSrcweir 	::rtl::OUString aFileName = implGetFileNameForLocaleItem( pLocaleItem, aNameBase );
1887cdf0e10cSrcweir 	INetURLObject aInetObj( aLocation );
1888cdf0e10cSrcweir 	aInetObj.insertName( aFileName, sal_True, INetURLObject::LAST_SEGMENT, sal_True, INetURLObject::ENCODE_ALL );
1889cdf0e10cSrcweir 	if( bDefaultFile )
1890cdf0e10cSrcweir 		aInetObj.setExtension( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("default") ) );
1891cdf0e10cSrcweir 	else
1892cdf0e10cSrcweir 		aInetObj.setExtension( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("properties") ) );
1893cdf0e10cSrcweir 	::rtl::OUString aCompleteFileName = aInetObj.GetMainURL( INetURLObject::NO_DECODE );
1894cdf0e10cSrcweir 	return aCompleteFileName;
1895cdf0e10cSrcweir }
1896cdf0e10cSrcweir 
1897cdf0e10cSrcweir // White space according to Java property files specification in
1898cdf0e10cSrcweir // http://java.sun.com/j2se/1.4.2/docs/api/java/util/Properties.html#load(java.io.InputStream)
isWhiteSpace(sal_Unicode c)1899cdf0e10cSrcweir inline bool isWhiteSpace( sal_Unicode c )
1900cdf0e10cSrcweir {
1901cdf0e10cSrcweir 	bool bWhite = (	c == 0x0020 ||		// space
1902cdf0e10cSrcweir 					c == 0x0009 ||		// tab
1903cdf0e10cSrcweir 					c == 0x000a ||		// line feed, not always handled by TextInputStream
1904cdf0e10cSrcweir 					c == 0x000d ||		// carriage return, not always handled by TextInputStream
1905cdf0e10cSrcweir 					c == 0x000C );		// form feed
1906cdf0e10cSrcweir 	return bWhite;
1907cdf0e10cSrcweir }
1908cdf0e10cSrcweir 
skipWhites(const sal_Unicode * pBuf,sal_Int32 nLen,sal_Int32 & ri)1909cdf0e10cSrcweir inline void skipWhites( const sal_Unicode* pBuf, sal_Int32 nLen, sal_Int32& ri )
1910cdf0e10cSrcweir {
1911cdf0e10cSrcweir 	while( ri < nLen )
1912cdf0e10cSrcweir 	{
1913cdf0e10cSrcweir 		if( !isWhiteSpace( pBuf[ri] ) )
1914cdf0e10cSrcweir 			break;
1915cdf0e10cSrcweir 		ri++;
1916cdf0e10cSrcweir 	}
1917cdf0e10cSrcweir }
1918cdf0e10cSrcweir 
isHexDigit(sal_Unicode c,sal_uInt16 & nDigitVal)1919cdf0e10cSrcweir inline bool isHexDigit( sal_Unicode c, sal_uInt16& nDigitVal )
1920cdf0e10cSrcweir {
1921cdf0e10cSrcweir 	bool bRet = true;
1922cdf0e10cSrcweir 	if( c >= '0' && c <= '9' )
1923cdf0e10cSrcweir 		nDigitVal = c - '0';
1924cdf0e10cSrcweir 	else if( c >= 'a' && c <= 'f' )
1925cdf0e10cSrcweir 		nDigitVal = c - 'a' + 10;
1926cdf0e10cSrcweir 	else if( c >= 'A' && c <= 'F' )
1927cdf0e10cSrcweir 		nDigitVal = c - 'A' + 10;
1928cdf0e10cSrcweir 	else
1929cdf0e10cSrcweir 		bRet = false;
1930cdf0e10cSrcweir 	return bRet;
1931cdf0e10cSrcweir }
1932cdf0e10cSrcweir 
getEscapeChar(const sal_Unicode * pBuf,sal_Int32 nLen,sal_Int32 & ri)1933cdf0e10cSrcweir sal_Unicode getEscapeChar( const sal_Unicode* pBuf, sal_Int32 nLen, sal_Int32& ri )
1934cdf0e10cSrcweir {
1935cdf0e10cSrcweir 	sal_Int32 i = ri;
1936cdf0e10cSrcweir 
1937cdf0e10cSrcweir 	sal_Unicode cRet = 0;
1938cdf0e10cSrcweir 	sal_Unicode c = pBuf[i];
1939cdf0e10cSrcweir 	switch( c )
1940cdf0e10cSrcweir 	{
1941cdf0e10cSrcweir 		case 't':
1942cdf0e10cSrcweir 			cRet = 0x0009;
1943cdf0e10cSrcweir 			break;
1944cdf0e10cSrcweir 		case 'n':
1945cdf0e10cSrcweir 			cRet = 0x000a;
1946cdf0e10cSrcweir 			break;
1947cdf0e10cSrcweir 		case 'f':
1948cdf0e10cSrcweir 			cRet = 0x000c;
1949cdf0e10cSrcweir 			break;
1950cdf0e10cSrcweir 		case 'r':
1951cdf0e10cSrcweir 			cRet = 0x000d;
1952cdf0e10cSrcweir 			break;
1953cdf0e10cSrcweir 		case '\\':
1954cdf0e10cSrcweir 			cRet = '\\';
1955cdf0e10cSrcweir 			break;
1956cdf0e10cSrcweir 		case 'u':
1957cdf0e10cSrcweir 		{
1958cdf0e10cSrcweir 			// Skip multiple u
1959cdf0e10cSrcweir 			i++;
1960cdf0e10cSrcweir 			while( i < nLen && pBuf[i] == 'u' )
1961cdf0e10cSrcweir 				i++;
1962cdf0e10cSrcweir 
1963cdf0e10cSrcweir 			// Process hex digits
1964cdf0e10cSrcweir 			sal_Int32 nDigitCount = 0;
1965cdf0e10cSrcweir 			sal_uInt16 nDigitVal;
1966cdf0e10cSrcweir 			while( i < nLen && isHexDigit( pBuf[i], nDigitVal ) )
1967cdf0e10cSrcweir 			{
1968cdf0e10cSrcweir 				cRet = 16 * cRet + nDigitVal;
1969cdf0e10cSrcweir 
1970cdf0e10cSrcweir 				nDigitCount++;
1971cdf0e10cSrcweir 				if( nDigitCount == 4 )
1972cdf0e10cSrcweir 				{
1973cdf0e10cSrcweir 					// Write back position
1974cdf0e10cSrcweir 					ri = i;
1975cdf0e10cSrcweir 					break;
1976cdf0e10cSrcweir 				}
1977cdf0e10cSrcweir 				i++;
1978cdf0e10cSrcweir 			}
1979cdf0e10cSrcweir 			break;
1980cdf0e10cSrcweir 		}
1981cdf0e10cSrcweir 		default:
1982cdf0e10cSrcweir 			cRet = c;
1983cdf0e10cSrcweir 	}
1984cdf0e10cSrcweir 
1985cdf0e10cSrcweir 	return cRet;
1986cdf0e10cSrcweir }
1987cdf0e10cSrcweir 
CheckContinueInNextLine(Reference<io::XTextInputStream> xTextInputStream,::rtl::OUString & aLine,bool & bEscapePending,const sal_Unicode * & pBuf,sal_Int32 & nLen,sal_Int32 & i)1988cdf0e10cSrcweir void CheckContinueInNextLine( Reference< io::XTextInputStream > xTextInputStream,
1989cdf0e10cSrcweir 	::rtl::OUString& aLine, bool& bEscapePending, const sal_Unicode*& pBuf,
1990cdf0e10cSrcweir 	sal_Int32& nLen, sal_Int32& i )
1991cdf0e10cSrcweir {
1992cdf0e10cSrcweir 	if( i == nLen && bEscapePending )
1993cdf0e10cSrcweir 	{
1994cdf0e10cSrcweir 		bEscapePending = false;
1995cdf0e10cSrcweir 
1996cdf0e10cSrcweir 		if( !xTextInputStream->isEOF() )
1997cdf0e10cSrcweir 		{
1998cdf0e10cSrcweir 			aLine = xTextInputStream->readLine();
1999cdf0e10cSrcweir 			nLen = aLine.getLength();
2000cdf0e10cSrcweir 			pBuf = aLine.getStr();
2001cdf0e10cSrcweir 			i = 0;
2002cdf0e10cSrcweir 
2003cdf0e10cSrcweir 			skipWhites( pBuf, nLen, i );
2004cdf0e10cSrcweir 		}
2005cdf0e10cSrcweir 	}
2006cdf0e10cSrcweir }
2007cdf0e10cSrcweir 
implReadPropertiesFile(LocaleItem * pLocaleItem,const Reference<io::XInputStream> & xInputStream)2008cdf0e10cSrcweir bool StringResourcePersistenceImpl::implReadPropertiesFile
2009cdf0e10cSrcweir 	( LocaleItem* pLocaleItem, const Reference< io::XInputStream >& xInputStream )
2010cdf0e10cSrcweir {
2011cdf0e10cSrcweir 	if( !xInputStream.is() || pLocaleItem == NULL )
2012cdf0e10cSrcweir 		return false;
2013cdf0e10cSrcweir 
2014cdf0e10cSrcweir 	bool bSuccess = false;
2015cdf0e10cSrcweir 	Reference< XMultiComponentFactory > xMCF = getMultiComponentFactory();
2016cdf0e10cSrcweir 	Reference< io::XTextInputStream > xTextInputStream( xMCF->createInstanceWithContext
2017cdf0e10cSrcweir 		( ::rtl::OUString::createFromAscii( "com.sun.star.io.TextInputStream" ), m_xContext ), UNO_QUERY );
2018cdf0e10cSrcweir 
2019cdf0e10cSrcweir 	if( xTextInputStream.is() )
2020cdf0e10cSrcweir 	{
2021cdf0e10cSrcweir 		Reference< io::XActiveDataSink> xActiveDataSink( xTextInputStream, UNO_QUERY );
2022cdf0e10cSrcweir 		if( xActiveDataSink.is() )
2023cdf0e10cSrcweir 		{
2024cdf0e10cSrcweir 			bSuccess = true;
2025cdf0e10cSrcweir 
2026cdf0e10cSrcweir 			xActiveDataSink->setInputStream( xInputStream );
2027cdf0e10cSrcweir 
2028cdf0e10cSrcweir 			::rtl::OUString aEncodingStr = ::rtl::OUString::createFromAscii
2029cdf0e10cSrcweir 				( rtl_getMimeCharsetFromTextEncoding( RTL_TEXTENCODING_ISO_8859_1 ) );
2030cdf0e10cSrcweir 			xTextInputStream->setEncoding( aEncodingStr );
2031cdf0e10cSrcweir 
2032cdf0e10cSrcweir 			::rtl::OUString aLine;
2033cdf0e10cSrcweir 			while( !xTextInputStream->isEOF() )
2034cdf0e10cSrcweir 			{
2035cdf0e10cSrcweir 				aLine = xTextInputStream->readLine();
2036cdf0e10cSrcweir 
2037cdf0e10cSrcweir 				sal_Int32 nLen = aLine.getLength();
2038cdf0e10cSrcweir 				if( 0 == nLen )
2039cdf0e10cSrcweir 					continue;
2040cdf0e10cSrcweir 				const sal_Unicode* pBuf = aLine.getStr();
2041cdf0e10cSrcweir 				::rtl::OUStringBuffer aBuf;
2042cdf0e10cSrcweir 				sal_Unicode c = 0;
2043cdf0e10cSrcweir 				sal_Int32 i = 0;
2044cdf0e10cSrcweir 
2045cdf0e10cSrcweir 				skipWhites( pBuf, nLen, i );
2046cdf0e10cSrcweir 				if( i == nLen )
2047cdf0e10cSrcweir 					continue;	// line contains only white spaces
2048cdf0e10cSrcweir 
2049cdf0e10cSrcweir 				// Comment?
2050cdf0e10cSrcweir 				c = pBuf[i];
2051cdf0e10cSrcweir 				if( c == '#' || c == '!' )
2052cdf0e10cSrcweir 					continue;
2053cdf0e10cSrcweir 
2054cdf0e10cSrcweir 				// Scan key
2055cdf0e10cSrcweir 				::rtl::OUString aResourceID;
2056cdf0e10cSrcweir 				bool bEscapePending = false;
2057cdf0e10cSrcweir 				bool bStrComplete = false;
2058cdf0e10cSrcweir 				while( i < nLen && !bStrComplete )
2059cdf0e10cSrcweir 				{
2060cdf0e10cSrcweir 					c = pBuf[i];
2061cdf0e10cSrcweir 					if( bEscapePending )
2062cdf0e10cSrcweir 					{
2063cdf0e10cSrcweir 						aBuf.append( getEscapeChar( pBuf, nLen, i ) );
2064cdf0e10cSrcweir 						bEscapePending = false;
2065cdf0e10cSrcweir 					}
2066cdf0e10cSrcweir 					else
2067cdf0e10cSrcweir 					{
2068cdf0e10cSrcweir 						if( c == '\\' )
2069cdf0e10cSrcweir 						{
2070cdf0e10cSrcweir 							bEscapePending = true;
2071cdf0e10cSrcweir 						}
2072cdf0e10cSrcweir 						else
2073cdf0e10cSrcweir 						{
2074cdf0e10cSrcweir 							if( c == ':' || c == '=' || isWhiteSpace( c ) )
2075cdf0e10cSrcweir 								bStrComplete = true;
2076cdf0e10cSrcweir 							else
2077cdf0e10cSrcweir 								aBuf.append( c );
2078cdf0e10cSrcweir 						}
2079cdf0e10cSrcweir 					}
2080cdf0e10cSrcweir 					i++;
2081cdf0e10cSrcweir 
2082cdf0e10cSrcweir 					CheckContinueInNextLine( xTextInputStream, aLine, bEscapePending, pBuf, nLen, i );
2083cdf0e10cSrcweir 					if( i == nLen )
2084cdf0e10cSrcweir 						bStrComplete = true;
2085cdf0e10cSrcweir 
2086cdf0e10cSrcweir 					if( bStrComplete )
2087cdf0e10cSrcweir 						aResourceID = aBuf.makeStringAndClear();
2088cdf0e10cSrcweir 				}
2089cdf0e10cSrcweir 
2090cdf0e10cSrcweir 				// Ignore lines with empty keys
2091cdf0e10cSrcweir 				if( 0 == aResourceID.getLength() )
2092cdf0e10cSrcweir 					continue;
2093cdf0e10cSrcweir 
2094cdf0e10cSrcweir 				// Scan value
2095cdf0e10cSrcweir 				skipWhites( pBuf, nLen, i );
2096cdf0e10cSrcweir 
2097cdf0e10cSrcweir 				::rtl::OUString aValueStr;
2098cdf0e10cSrcweir 				bEscapePending = false;
2099cdf0e10cSrcweir 				bStrComplete = false;
2100cdf0e10cSrcweir 				while( i < nLen && !bStrComplete )
2101cdf0e10cSrcweir 				{
2102cdf0e10cSrcweir 					c = pBuf[i];
2103cdf0e10cSrcweir 					if( c == 0x000a || c == 0x000d )	// line feed/carriage return, not always handled by TextInputStream
2104cdf0e10cSrcweir 					{
2105cdf0e10cSrcweir 						i++;
2106cdf0e10cSrcweir 					}
2107cdf0e10cSrcweir 					else
2108cdf0e10cSrcweir 					{
2109cdf0e10cSrcweir 						if( bEscapePending )
2110cdf0e10cSrcweir 						{
2111cdf0e10cSrcweir 							aBuf.append( getEscapeChar( pBuf, nLen, i ) );
2112cdf0e10cSrcweir 							bEscapePending = false;
2113cdf0e10cSrcweir 						}
2114cdf0e10cSrcweir 						else if( c == '\\' )
2115cdf0e10cSrcweir 							bEscapePending = true;
2116cdf0e10cSrcweir 						else
2117cdf0e10cSrcweir 							aBuf.append( c );
2118cdf0e10cSrcweir 						i++;
2119cdf0e10cSrcweir 
2120cdf0e10cSrcweir 						CheckContinueInNextLine( xTextInputStream, aLine, bEscapePending, pBuf, nLen, i );
2121cdf0e10cSrcweir 					}
2122cdf0e10cSrcweir 					if( i == nLen )
2123cdf0e10cSrcweir 						bStrComplete = true;
2124cdf0e10cSrcweir 
2125cdf0e10cSrcweir 					if( bStrComplete )
2126cdf0e10cSrcweir 						aValueStr = aBuf.makeStringAndClear();
2127cdf0e10cSrcweir 				}
2128cdf0e10cSrcweir 
2129cdf0e10cSrcweir 				// Push into table
2130cdf0e10cSrcweir 				pLocaleItem->m_aIdToStringMap[ aResourceID ] = aValueStr;
2131cdf0e10cSrcweir 				implScanIdForNumber( aResourceID );
2132cdf0e10cSrcweir 				IdToIndexMap& rIndexMap = pLocaleItem->m_aIdToIndexMap;
2133cdf0e10cSrcweir 				rIndexMap[ aResourceID ] = pLocaleItem->m_nNextIndex++;
2134cdf0e10cSrcweir 			}
2135cdf0e10cSrcweir 		}
2136cdf0e10cSrcweir 	}
2137cdf0e10cSrcweir 
2138cdf0e10cSrcweir 	return bSuccess;
2139cdf0e10cSrcweir }
2140cdf0e10cSrcweir 
2141cdf0e10cSrcweir 
getHexCharForDigit(sal_uInt16 nDigitVal)2142cdf0e10cSrcweir inline sal_Unicode getHexCharForDigit( sal_uInt16 nDigitVal )
2143cdf0e10cSrcweir {
2144cdf0e10cSrcweir 	sal_Unicode cRet = ( nDigitVal < 10 ) ? ('0' + nDigitVal) : ('a' + (nDigitVal-10));
2145cdf0e10cSrcweir 	return cRet;
2146cdf0e10cSrcweir }
2147cdf0e10cSrcweir 
implWriteCharToBuffer(::rtl::OUStringBuffer & aBuf,sal_Unicode cu,bool bKey)2148cdf0e10cSrcweir void implWriteCharToBuffer( ::rtl::OUStringBuffer& aBuf, sal_Unicode cu, bool bKey )
2149cdf0e10cSrcweir {
2150cdf0e10cSrcweir 	if( cu == '\\' )
2151cdf0e10cSrcweir 	{
2152cdf0e10cSrcweir 		aBuf.append( (sal_Unicode)'\\' );
2153cdf0e10cSrcweir 		aBuf.append( (sal_Unicode)'\\' );
2154cdf0e10cSrcweir 	}
2155cdf0e10cSrcweir 	else if( cu == 0x000a )
2156cdf0e10cSrcweir 	{
2157cdf0e10cSrcweir 		aBuf.append( (sal_Unicode)'\\' );
2158cdf0e10cSrcweir 		aBuf.append( (sal_Unicode)'n' );
2159cdf0e10cSrcweir 	}
2160cdf0e10cSrcweir 	else if( cu == 0x000d )
2161cdf0e10cSrcweir 	{
2162cdf0e10cSrcweir 		aBuf.append( (sal_Unicode)'\\' );
2163cdf0e10cSrcweir 		aBuf.append( (sal_Unicode)'r' );
2164cdf0e10cSrcweir 	}
2165cdf0e10cSrcweir 	else if( bKey && cu == '=' )
2166cdf0e10cSrcweir 	{
2167cdf0e10cSrcweir 		aBuf.append( (sal_Unicode)'\\' );
2168cdf0e10cSrcweir 		aBuf.append( (sal_Unicode)'=' );
2169cdf0e10cSrcweir 	}
2170cdf0e10cSrcweir 	else if( bKey && cu == ':' )
2171cdf0e10cSrcweir 	{
2172cdf0e10cSrcweir 		aBuf.append( (sal_Unicode)'\\' );
2173cdf0e10cSrcweir 		aBuf.append( (sal_Unicode)':' );
2174cdf0e10cSrcweir 	}
2175cdf0e10cSrcweir 	// ISO/IEC 8859-1 range according to:
2176cdf0e10cSrcweir 	// http://en.wikipedia.org/wiki/ISO/IEC_8859-1
2177cdf0e10cSrcweir 	else if( (cu >= 0x20 && cu <= 0x7e) )
2178cdf0e10cSrcweir 	//TODO: Check why (cu >= 0xa0 && cu <= 0xFF)
2179cdf0e10cSrcweir 	//is encoded in sample properties files
2180cdf0e10cSrcweir 	//else if( (cu >= 0x20 && cu <= 0x7e) ||
2181cdf0e10cSrcweir 	//		 (cu >= 0xa0 && cu <= 0xFF) )
2182cdf0e10cSrcweir 	{
2183cdf0e10cSrcweir 		aBuf.append( cu );
2184cdf0e10cSrcweir 	}
2185cdf0e10cSrcweir 	else
2186cdf0e10cSrcweir 	{
2187cdf0e10cSrcweir 		// Unicode encoding
2188cdf0e10cSrcweir 		aBuf.append( (sal_Unicode)'\\' );
2189cdf0e10cSrcweir 		aBuf.append( (sal_Unicode)'u' );
2190cdf0e10cSrcweir 
2191cdf0e10cSrcweir 		sal_uInt16 nVal = cu;
2192cdf0e10cSrcweir 		for( sal_uInt16 i = 0 ; i < 4 ; i++ )
2193cdf0e10cSrcweir 		{
2194cdf0e10cSrcweir 			sal_uInt16 nDigit = nVal / 0x1000;
2195cdf0e10cSrcweir 			nVal -= nDigit * 0x1000;
2196cdf0e10cSrcweir 			nVal *= 0x10;
2197cdf0e10cSrcweir 			aBuf.append( getHexCharForDigit( nDigit ) );
2198cdf0e10cSrcweir 		}
2199cdf0e10cSrcweir 	}
2200cdf0e10cSrcweir }
2201cdf0e10cSrcweir 
implWriteStringWithEncoding(const::rtl::OUString & aStr,Reference<io::XTextOutputStream> xTextOutputStream,bool bKey)2202cdf0e10cSrcweir void implWriteStringWithEncoding( const ::rtl::OUString& aStr,
2203cdf0e10cSrcweir 	Reference< io::XTextOutputStream > xTextOutputStream, bool bKey )
2204cdf0e10cSrcweir {
2205cdf0e10cSrcweir 	static sal_Unicode cLineFeed = 0xa;
2206cdf0e10cSrcweir 
2207cdf0e10cSrcweir 	(void)aStr;
2208cdf0e10cSrcweir 	(void)xTextOutputStream;
2209cdf0e10cSrcweir 
2210cdf0e10cSrcweir 	::rtl::OUStringBuffer aBuf;
2211cdf0e10cSrcweir 	sal_Int32 nLen = aStr.getLength();
2212cdf0e10cSrcweir 	const sal_Unicode* pSrc = aStr.getStr();
2213cdf0e10cSrcweir 	for( sal_Int32 i = 0 ; i < nLen ; i++ )
2214cdf0e10cSrcweir 	{
2215cdf0e10cSrcweir 		sal_Unicode cu = pSrc[i];
2216cdf0e10cSrcweir 		implWriteCharToBuffer( aBuf, cu, bKey );
2217cdf0e10cSrcweir 		// TODO?: split long lines
2218cdf0e10cSrcweir 	}
2219cdf0e10cSrcweir 	if( !bKey )
2220cdf0e10cSrcweir 		aBuf.append( cLineFeed );
2221cdf0e10cSrcweir 
2222cdf0e10cSrcweir 	::rtl::OUString aWriteStr = aBuf.makeStringAndClear();
2223cdf0e10cSrcweir 	xTextOutputStream->writeString( aWriteStr );
2224cdf0e10cSrcweir }
2225cdf0e10cSrcweir 
implWritePropertiesFile(LocaleItem * pLocaleItem,const Reference<io::XOutputStream> & xOutputStream,const::rtl::OUString & aComment)2226cdf0e10cSrcweir bool StringResourcePersistenceImpl::implWritePropertiesFile( LocaleItem* pLocaleItem,
2227cdf0e10cSrcweir 	const Reference< io::XOutputStream >& xOutputStream, const ::rtl::OUString& aComment )
2228cdf0e10cSrcweir {
2229cdf0e10cSrcweir 	static ::rtl::OUString aAssignmentStr = ::rtl::OUString::createFromAscii( "=" );
2230cdf0e10cSrcweir 	static ::rtl::OUString aLineFeedStr = ::rtl::OUString::createFromAscii( "\n" );
2231cdf0e10cSrcweir 
2232cdf0e10cSrcweir 	if( !xOutputStream.is() || pLocaleItem == NULL )
2233cdf0e10cSrcweir 		return false;
2234cdf0e10cSrcweir 
2235cdf0e10cSrcweir 	bool bSuccess = false;
2236cdf0e10cSrcweir 	Reference< XMultiComponentFactory > xMCF = getMultiComponentFactory();
2237cdf0e10cSrcweir 	Reference< io::XTextOutputStream > xTextOutputStream( xMCF->createInstanceWithContext
2238cdf0e10cSrcweir 		( ::rtl::OUString::createFromAscii( "com.sun.star.io.TextOutputStream" ), m_xContext ), UNO_QUERY );
2239cdf0e10cSrcweir 
2240cdf0e10cSrcweir 	if( xTextOutputStream.is() )
2241cdf0e10cSrcweir 	{
2242cdf0e10cSrcweir 		Reference< io::XActiveDataSource> xActiveDataSource( xTextOutputStream, UNO_QUERY );
2243cdf0e10cSrcweir 		if( xActiveDataSource.is() )
2244cdf0e10cSrcweir 		{
2245cdf0e10cSrcweir 			xActiveDataSource->setOutputStream( xOutputStream );
2246cdf0e10cSrcweir 
2247cdf0e10cSrcweir 			::rtl::OUString aEncodingStr = ::rtl::OUString::createFromAscii
2248cdf0e10cSrcweir 				( rtl_getMimeCharsetFromTextEncoding( RTL_TEXTENCODING_ISO_8859_1 ) );
2249cdf0e10cSrcweir 			xTextOutputStream->setEncoding( aEncodingStr );
2250cdf0e10cSrcweir 
2251cdf0e10cSrcweir 			xTextOutputStream->writeString( aComment );
2252cdf0e10cSrcweir 			xTextOutputStream->writeString( aLineFeedStr );
2253cdf0e10cSrcweir 
2254cdf0e10cSrcweir 			const IdToStringMap& rHashMap = pLocaleItem->m_aIdToStringMap;
2255cdf0e10cSrcweir 			if( rHashMap.size() > 0 )
2256cdf0e10cSrcweir 			{
2257cdf0e10cSrcweir 				// Sort ids according to read order
2258cdf0e10cSrcweir 				const IdToIndexMap& rIndexMap = pLocaleItem->m_aIdToIndexMap;
2259cdf0e10cSrcweir 				IdToIndexMap::const_iterator it_index;
2260cdf0e10cSrcweir 
2261cdf0e10cSrcweir 				// Find max/min index
2262cdf0e10cSrcweir 				sal_Int32 nMinIndex = -1;
2263cdf0e10cSrcweir 				sal_Int32 nMaxIndex = -1;
2264cdf0e10cSrcweir 				for( it_index = rIndexMap.begin(); it_index != rIndexMap.end(); it_index++ )
2265cdf0e10cSrcweir 				{
2266cdf0e10cSrcweir 					sal_Int32 nIndex = (*it_index).second;
2267cdf0e10cSrcweir 					if( nMinIndex > nIndex || nMinIndex == -1 )
2268cdf0e10cSrcweir 						nMinIndex = nIndex;
2269cdf0e10cSrcweir 					if( nMaxIndex < nIndex )
2270cdf0e10cSrcweir 						nMaxIndex = nIndex;
2271cdf0e10cSrcweir 				}
2272cdf0e10cSrcweir 				sal_Int32 nTabSize = nMaxIndex - nMinIndex + 1;
2273cdf0e10cSrcweir 
2274cdf0e10cSrcweir 				// Create sorted array of pointers to the id strings
2275cdf0e10cSrcweir 				const ::rtl::OUString** pIdPtrs = new const ::rtl::OUString*[nTabSize];
2276cdf0e10cSrcweir 				sal_Int32 i;
2277cdf0e10cSrcweir 				for( i = 0 ; i < nTabSize ; i++ )
2278cdf0e10cSrcweir 					pIdPtrs[i] = NULL;
2279cdf0e10cSrcweir 				for( it_index = rIndexMap.begin(); it_index != rIndexMap.end(); it_index++ )
2280cdf0e10cSrcweir 				{
2281cdf0e10cSrcweir 					sal_Int32 nIndex = (*it_index).second;
2282cdf0e10cSrcweir 					pIdPtrs[nIndex - nMinIndex] = &((*it_index).first);
2283cdf0e10cSrcweir 				}
2284cdf0e10cSrcweir 
2285cdf0e10cSrcweir 				// Write lines in correct order
2286cdf0e10cSrcweir 				for( i = 0 ; i < nTabSize ; i++ )
2287cdf0e10cSrcweir 				{
2288cdf0e10cSrcweir 					const ::rtl::OUString* pStr = pIdPtrs[i];
2289cdf0e10cSrcweir 					if( pStr != NULL )
2290cdf0e10cSrcweir 					{
2291cdf0e10cSrcweir 						::rtl::OUString aResourceID = *pStr;
2292cdf0e10cSrcweir 						IdToStringMap::const_iterator it = rHashMap.find( aResourceID );
2293cdf0e10cSrcweir 						if( !( it == rHashMap.end() ) )
2294cdf0e10cSrcweir 						{
2295cdf0e10cSrcweir 							implWriteStringWithEncoding( aResourceID, xTextOutputStream, true );
2296cdf0e10cSrcweir 							xTextOutputStream->writeString( aAssignmentStr );
2297cdf0e10cSrcweir 							::rtl::OUString aValStr = (*it).second;
2298cdf0e10cSrcweir 							implWriteStringWithEncoding( aValStr, xTextOutputStream, false );
2299cdf0e10cSrcweir 						}
2300cdf0e10cSrcweir 					}
2301cdf0e10cSrcweir 				}
2302cdf0e10cSrcweir 
2303*4078a611SDon Lewis 				delete[] pIdPtrs;
2304cdf0e10cSrcweir 			}
2305cdf0e10cSrcweir 
2306cdf0e10cSrcweir 			bSuccess = true;
2307cdf0e10cSrcweir 		}
2308cdf0e10cSrcweir 	}
2309cdf0e10cSrcweir 	return bSuccess;
2310cdf0e10cSrcweir }
2311cdf0e10cSrcweir 
2312cdf0e10cSrcweir 
2313cdf0e10cSrcweir // =============================================================================
2314cdf0e10cSrcweir // StringResourceWithStorageImpl
2315cdf0e10cSrcweir // =============================================================================
2316cdf0e10cSrcweir 
2317cdf0e10cSrcweir // component operations
getSupportedServiceNames_StringResourceWithStorageImpl()2318cdf0e10cSrcweir static Sequence< ::rtl::OUString > getSupportedServiceNames_StringResourceWithStorageImpl()
2319cdf0e10cSrcweir {
2320cdf0e10cSrcweir     Sequence< ::rtl::OUString > names(1);
2321cdf0e10cSrcweir     names[0] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.resource.StringResourceWithStorage") );
2322cdf0e10cSrcweir     return names;
2323cdf0e10cSrcweir }
2324cdf0e10cSrcweir 
getImplementationName_StringResourceWithStorageImpl()2325cdf0e10cSrcweir static ::rtl::OUString getImplementationName_StringResourceWithStorageImpl()
2326cdf0e10cSrcweir {
2327cdf0e10cSrcweir     return ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.scripting.StringResourceWithStorage") );
2328cdf0e10cSrcweir }
2329cdf0e10cSrcweir 
create_StringResourceWithStorageImpl(Reference<XComponentContext> const & xContext)2330cdf0e10cSrcweir static Reference< XInterface > SAL_CALL create_StringResourceWithStorageImpl(
2331cdf0e10cSrcweir     Reference< XComponentContext > const & xContext )
2332cdf0e10cSrcweir     SAL_THROW( () )
2333cdf0e10cSrcweir {
2334cdf0e10cSrcweir     return static_cast< ::cppu::OWeakObject * >( new StringResourceWithStorageImpl( xContext ) );
2335cdf0e10cSrcweir }
2336cdf0e10cSrcweir 
2337cdf0e10cSrcweir // -----------------------------------------------------------------------------
2338cdf0e10cSrcweir 
StringResourceWithStorageImpl(const Reference<XComponentContext> & rxContext)2339cdf0e10cSrcweir StringResourceWithStorageImpl::StringResourceWithStorageImpl( const Reference< XComponentContext >& rxContext )
2340cdf0e10cSrcweir     : StringResourceWithStorageImpl_BASE( rxContext )
2341cdf0e10cSrcweir 	, m_bStorageChanged( false )
2342cdf0e10cSrcweir {
2343cdf0e10cSrcweir }
2344cdf0e10cSrcweir 
2345cdf0e10cSrcweir // -----------------------------------------------------------------------------
2346cdf0e10cSrcweir 
~StringResourceWithStorageImpl()2347cdf0e10cSrcweir StringResourceWithStorageImpl::~StringResourceWithStorageImpl()
2348cdf0e10cSrcweir {
2349cdf0e10cSrcweir }
2350cdf0e10cSrcweir 
2351cdf0e10cSrcweir // -----------------------------------------------------------------------------
2352cdf0e10cSrcweir // XServiceInfo
2353cdf0e10cSrcweir // -----------------------------------------------------------------------------
2354cdf0e10cSrcweir 
getImplementationName()2355cdf0e10cSrcweir ::rtl::OUString StringResourceWithStorageImpl::getImplementationName(  ) throw (RuntimeException)
2356cdf0e10cSrcweir {
2357cdf0e10cSrcweir     return getImplementationName_StringResourceWithStorageImpl();
2358cdf0e10cSrcweir }
2359cdf0e10cSrcweir 
2360cdf0e10cSrcweir // -----------------------------------------------------------------------------
2361cdf0e10cSrcweir 
supportsService(const::rtl::OUString & rServiceName)2362cdf0e10cSrcweir sal_Bool StringResourceWithStorageImpl::supportsService( const ::rtl::OUString& rServiceName ) throw (RuntimeException)
2363cdf0e10cSrcweir {
2364cdf0e10cSrcweir 	Sequence< ::rtl::OUString > aNames( getSupportedServiceNames() );
2365cdf0e10cSrcweir 	const ::rtl::OUString* pNames = aNames.getConstArray();
2366cdf0e10cSrcweir 	const ::rtl::OUString* pEnd = pNames + aNames.getLength();
2367cdf0e10cSrcweir 	for ( ; pNames != pEnd && !pNames->equals( rServiceName ); ++pNames )
2368cdf0e10cSrcweir 		;
2369cdf0e10cSrcweir 
2370cdf0e10cSrcweir 	return pNames != pEnd;
2371cdf0e10cSrcweir }
2372cdf0e10cSrcweir 
2373cdf0e10cSrcweir // -----------------------------------------------------------------------------
2374cdf0e10cSrcweir 
getSupportedServiceNames()2375cdf0e10cSrcweir Sequence< ::rtl::OUString > StringResourceWithStorageImpl::getSupportedServiceNames(  ) throw (RuntimeException)
2376cdf0e10cSrcweir {
2377cdf0e10cSrcweir     return getSupportedServiceNames_StringResourceWithStorageImpl();
2378cdf0e10cSrcweir }
2379cdf0e10cSrcweir 
2380cdf0e10cSrcweir // -----------------------------------------------------------------------------
2381cdf0e10cSrcweir // XInitialization
2382cdf0e10cSrcweir // -----------------------------------------------------------------------------
2383cdf0e10cSrcweir 
initialize(const Sequence<Any> & aArguments)2384cdf0e10cSrcweir void StringResourceWithStorageImpl::initialize( const Sequence< Any >& aArguments )
2385cdf0e10cSrcweir 	throw (Exception, RuntimeException)
2386cdf0e10cSrcweir {
2387cdf0e10cSrcweir     ::osl::MutexGuard aGuard( getMutex() );
2388cdf0e10cSrcweir 
2389cdf0e10cSrcweir     if ( aArguments.getLength() != 5 )
2390cdf0e10cSrcweir     {
2391cdf0e10cSrcweir         throw RuntimeException(
2392cdf0e10cSrcweir             ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "StringResourceWithStorageImpl::initialize: invalid number of arguments!" ) ),
2393cdf0e10cSrcweir             Reference< XInterface >() );
2394cdf0e10cSrcweir     }
2395cdf0e10cSrcweir 
2396cdf0e10cSrcweir 	bool bOk = (aArguments[0] >>= m_xStorage);
2397cdf0e10cSrcweir 	if( bOk && !m_xStorage.is() )
2398cdf0e10cSrcweir 		bOk = false;
2399cdf0e10cSrcweir 
2400cdf0e10cSrcweir 	if( !bOk )
2401cdf0e10cSrcweir     {
2402cdf0e10cSrcweir         ::rtl::OUString errorMsg = ::rtl::OUString::createFromAscii( "StringResourceWithStorageImpl::initialize: invalid storage" );
2403cdf0e10cSrcweir         throw IllegalArgumentException( errorMsg, Reference< XInterface >(), 0 );
2404cdf0e10cSrcweir 	}
2405cdf0e10cSrcweir 
2406cdf0e10cSrcweir 	implInitializeCommonParameters( aArguments );
2407cdf0e10cSrcweir }
2408cdf0e10cSrcweir 
2409cdf0e10cSrcweir // -----------------------------------------------------------------------------
2410cdf0e10cSrcweir // Forwarding calls to base class
2411cdf0e10cSrcweir 
2412cdf0e10cSrcweir // XModifyBroadcaster
addModifyListener(const Reference<XModifyListener> & aListener)2413cdf0e10cSrcweir void StringResourceWithStorageImpl::addModifyListener( const Reference< XModifyListener >& aListener )
2414cdf0e10cSrcweir 	throw (RuntimeException)
2415cdf0e10cSrcweir {
2416cdf0e10cSrcweir 	StringResourceImpl::addModifyListener( aListener );
2417cdf0e10cSrcweir }
removeModifyListener(const Reference<XModifyListener> & aListener)2418cdf0e10cSrcweir void StringResourceWithStorageImpl::removeModifyListener( const Reference< XModifyListener >& aListener )
2419cdf0e10cSrcweir 	throw (RuntimeException)
2420cdf0e10cSrcweir {
2421cdf0e10cSrcweir 	StringResourceImpl::removeModifyListener( aListener );
2422cdf0e10cSrcweir }
2423cdf0e10cSrcweir 
2424cdf0e10cSrcweir // XStringResourceResolver
resolveString(const::rtl::OUString & ResourceID)2425cdf0e10cSrcweir ::rtl::OUString StringResourceWithStorageImpl::resolveString( const ::rtl::OUString& ResourceID )
2426cdf0e10cSrcweir 	throw (::com::sun::star::resource::MissingResourceException, RuntimeException)
2427cdf0e10cSrcweir {
2428cdf0e10cSrcweir 	return StringResourceImpl::resolveString( ResourceID ) ;
2429cdf0e10cSrcweir }
resolveStringForLocale(const::rtl::OUString & ResourceID,const Locale & locale)2430cdf0e10cSrcweir ::rtl::OUString StringResourceWithStorageImpl::resolveStringForLocale( const ::rtl::OUString& ResourceID, const Locale& locale )
2431cdf0e10cSrcweir 	throw ( ::com::sun::star::resource::MissingResourceException, RuntimeException)
2432cdf0e10cSrcweir {
2433cdf0e10cSrcweir 	return StringResourceImpl::resolveStringForLocale( ResourceID, locale );
2434cdf0e10cSrcweir }
hasEntryForId(const::rtl::OUString & ResourceID)2435cdf0e10cSrcweir sal_Bool StringResourceWithStorageImpl::hasEntryForId( const ::rtl::OUString& ResourceID )
2436cdf0e10cSrcweir 	throw (RuntimeException)
2437cdf0e10cSrcweir {
2438cdf0e10cSrcweir 	return StringResourceImpl::hasEntryForId( ResourceID ) ;
2439cdf0e10cSrcweir }
hasEntryForIdAndLocale(const::rtl::OUString & ResourceID,const Locale & locale)2440cdf0e10cSrcweir sal_Bool StringResourceWithStorageImpl::hasEntryForIdAndLocale( const ::rtl::OUString& ResourceID,
2441cdf0e10cSrcweir 	const Locale& locale )
2442cdf0e10cSrcweir 		throw (RuntimeException)
2443cdf0e10cSrcweir {
2444cdf0e10cSrcweir 	return StringResourceImpl::hasEntryForIdAndLocale( ResourceID, locale );
2445cdf0e10cSrcweir }
getResourceIDs()2446cdf0e10cSrcweir Sequence< ::rtl::OUString > StringResourceWithStorageImpl::getResourceIDs(  )
2447cdf0e10cSrcweir 	throw (RuntimeException)
2448cdf0e10cSrcweir {
2449cdf0e10cSrcweir 	return StringResourceImpl::getResourceIDs();
2450cdf0e10cSrcweir }
getResourceIDsForLocale(const Locale & locale)2451cdf0e10cSrcweir Sequence< ::rtl::OUString > StringResourceWithStorageImpl::getResourceIDsForLocale
2452cdf0e10cSrcweir 	( const Locale& locale ) throw (::com::sun::star::uno::RuntimeException)
2453cdf0e10cSrcweir {
2454cdf0e10cSrcweir 	return StringResourceImpl::getResourceIDsForLocale( locale );
2455cdf0e10cSrcweir }
getCurrentLocale()2456cdf0e10cSrcweir Locale StringResourceWithStorageImpl::getCurrentLocale()
2457cdf0e10cSrcweir 	throw (RuntimeException)
2458cdf0e10cSrcweir {
2459cdf0e10cSrcweir 	return StringResourceImpl::getCurrentLocale();
2460cdf0e10cSrcweir }
getDefaultLocale()2461cdf0e10cSrcweir Locale StringResourceWithStorageImpl::getDefaultLocale(  )
2462cdf0e10cSrcweir 	throw (RuntimeException)
2463cdf0e10cSrcweir {
2464cdf0e10cSrcweir 	return StringResourceImpl::getDefaultLocale();
2465cdf0e10cSrcweir }
getLocales()2466cdf0e10cSrcweir Sequence< Locale > StringResourceWithStorageImpl::getLocales(  )
2467cdf0e10cSrcweir 	throw (RuntimeException)
2468cdf0e10cSrcweir {
2469cdf0e10cSrcweir 	return StringResourceImpl::getLocales();
2470cdf0e10cSrcweir }
2471cdf0e10cSrcweir 
2472cdf0e10cSrcweir // XStringResourceManager
isReadOnly()2473cdf0e10cSrcweir sal_Bool StringResourceWithStorageImpl::isReadOnly()
2474cdf0e10cSrcweir 	throw (RuntimeException)
2475cdf0e10cSrcweir {
2476cdf0e10cSrcweir 	return StringResourceImpl::isReadOnly();
2477cdf0e10cSrcweir }
setCurrentLocale(const Locale & locale,sal_Bool FindClosestMatch)2478cdf0e10cSrcweir void StringResourceWithStorageImpl::setCurrentLocale( const Locale& locale, sal_Bool FindClosestMatch )
2479cdf0e10cSrcweir 	throw (IllegalArgumentException, RuntimeException)
2480cdf0e10cSrcweir {
2481cdf0e10cSrcweir 	StringResourceImpl::setCurrentLocale( locale, FindClosestMatch );
2482cdf0e10cSrcweir }
setDefaultLocale(const Locale & locale)2483cdf0e10cSrcweir void StringResourceWithStorageImpl::setDefaultLocale( const Locale& locale )
2484cdf0e10cSrcweir 	throw (IllegalArgumentException, RuntimeException,NoSupportException)
2485cdf0e10cSrcweir {
2486cdf0e10cSrcweir 	StringResourceImpl::setDefaultLocale( locale );
2487cdf0e10cSrcweir }
setString(const::rtl::OUString & ResourceID,const::rtl::OUString & Str)2488cdf0e10cSrcweir void StringResourceWithStorageImpl::setString( const ::rtl::OUString& ResourceID, const ::rtl::OUString& Str )
2489cdf0e10cSrcweir 	throw (NoSupportException, RuntimeException)
2490cdf0e10cSrcweir {
2491cdf0e10cSrcweir 	StringResourceImpl::setString( ResourceID, Str );
2492cdf0e10cSrcweir }
setStringForLocale(const::rtl::OUString & ResourceID,const::rtl::OUString & Str,const Locale & locale)2493cdf0e10cSrcweir void StringResourceWithStorageImpl::setStringForLocale
2494cdf0e10cSrcweir 	( const ::rtl::OUString& ResourceID, const ::rtl::OUString& Str, const Locale& locale )
2495cdf0e10cSrcweir 		throw (NoSupportException, RuntimeException)
2496cdf0e10cSrcweir {
2497cdf0e10cSrcweir 	StringResourceImpl::setStringForLocale( ResourceID, Str, locale );
2498cdf0e10cSrcweir }
removeId(const::rtl::OUString & ResourceID)2499cdf0e10cSrcweir void StringResourceWithStorageImpl::removeId( const ::rtl::OUString& ResourceID )
2500cdf0e10cSrcweir 	throw (::com::sun::star::resource::MissingResourceException, RuntimeException, NoSupportException)
2501cdf0e10cSrcweir {
2502cdf0e10cSrcweir 	StringResourceImpl::removeId( ResourceID );
2503cdf0e10cSrcweir }
removeIdForLocale(const::rtl::OUString & ResourceID,const Locale & locale)2504cdf0e10cSrcweir void StringResourceWithStorageImpl::removeIdForLocale( const ::rtl::OUString& ResourceID, const Locale& locale )
2505cdf0e10cSrcweir 	throw (::com::sun::star::resource::MissingResourceException, RuntimeException, NoSupportException)
2506cdf0e10cSrcweir {
2507cdf0e10cSrcweir 	StringResourceImpl::removeIdForLocale( ResourceID, locale );
2508cdf0e10cSrcweir }
newLocale(const Locale & locale)2509cdf0e10cSrcweir void StringResourceWithStorageImpl::newLocale( const Locale& locale )
2510cdf0e10cSrcweir 	throw (ElementExistException, IllegalArgumentException, RuntimeException, NoSupportException)
2511cdf0e10cSrcweir {
2512cdf0e10cSrcweir 	StringResourceImpl::newLocale( locale );
2513cdf0e10cSrcweir }
removeLocale(const Locale & locale)2514cdf0e10cSrcweir void StringResourceWithStorageImpl::removeLocale( const Locale& locale )
2515cdf0e10cSrcweir 	throw (IllegalArgumentException, RuntimeException, NoSupportException)
2516cdf0e10cSrcweir {
2517cdf0e10cSrcweir 	StringResourceImpl::removeLocale( locale );
2518cdf0e10cSrcweir }
getUniqueNumericId()2519cdf0e10cSrcweir sal_Int32 StringResourceWithStorageImpl::getUniqueNumericId(  )
2520cdf0e10cSrcweir 	throw (RuntimeException, NoSupportException)
2521cdf0e10cSrcweir {
2522cdf0e10cSrcweir 	return StringResourceImpl::getUniqueNumericId();
2523cdf0e10cSrcweir }
2524cdf0e10cSrcweir 
2525cdf0e10cSrcweir // XStringResourcePersistence
store()2526cdf0e10cSrcweir void StringResourceWithStorageImpl::store()
2527cdf0e10cSrcweir 	throw (NoSupportException, Exception, RuntimeException)
2528cdf0e10cSrcweir {
2529cdf0e10cSrcweir     ::osl::MutexGuard aGuard( getMutex() );
2530cdf0e10cSrcweir 	implCheckReadOnly( "StringResourceWithStorageImpl::store(): Read only" );
2531cdf0e10cSrcweir 
2532cdf0e10cSrcweir 	bool bUsedForStore = true;
2533cdf0e10cSrcweir 	bool bStoreAll = m_bStorageChanged;
2534cdf0e10cSrcweir 	m_bStorageChanged = false;
2535cdf0e10cSrcweir 	if( !m_bModified && !bStoreAll )
2536cdf0e10cSrcweir 		return;
2537cdf0e10cSrcweir 
2538cdf0e10cSrcweir 	implStoreAtStorage( m_aNameBase, m_aComment, m_xStorage, bUsedForStore, bStoreAll );
2539cdf0e10cSrcweir 	m_bModified = false;
2540cdf0e10cSrcweir }
2541cdf0e10cSrcweir 
isModified()2542cdf0e10cSrcweir sal_Bool StringResourceWithStorageImpl::isModified(  )
2543cdf0e10cSrcweir 	throw (RuntimeException)
2544cdf0e10cSrcweir {
2545cdf0e10cSrcweir 	return StringResourcePersistenceImpl::isModified();
2546cdf0e10cSrcweir }
setComment(const::rtl::OUString & Comment)2547cdf0e10cSrcweir void StringResourceWithStorageImpl::setComment( const ::rtl::OUString& Comment )
2548cdf0e10cSrcweir 	throw (::com::sun::star::uno::RuntimeException)
2549cdf0e10cSrcweir {
2550cdf0e10cSrcweir 	StringResourcePersistenceImpl::setComment( Comment );
2551cdf0e10cSrcweir }
storeToStorage(const Reference<XStorage> & Storage,const::rtl::OUString & NameBase,const::rtl::OUString & Comment)2552cdf0e10cSrcweir void StringResourceWithStorageImpl::storeToStorage( const Reference< XStorage >& Storage,
2553cdf0e10cSrcweir 	const ::rtl::OUString& NameBase, const ::rtl::OUString& Comment )
2554cdf0e10cSrcweir 		throw (Exception, RuntimeException)
2555cdf0e10cSrcweir {
2556cdf0e10cSrcweir 	StringResourcePersistenceImpl::storeToStorage( Storage, NameBase, Comment );
2557cdf0e10cSrcweir }
storeToURL(const::rtl::OUString & URL,const::rtl::OUString & NameBase,const::rtl::OUString & Comment,const Reference<::com::sun::star::task::XInteractionHandler> & Handler)2558cdf0e10cSrcweir void StringResourceWithStorageImpl::storeToURL( const ::rtl::OUString& URL,
2559cdf0e10cSrcweir 	const ::rtl::OUString& NameBase, const ::rtl::OUString& Comment,
2560cdf0e10cSrcweir 	const Reference< ::com::sun::star::task::XInteractionHandler >& Handler )
2561cdf0e10cSrcweir 		throw (Exception, RuntimeException)
2562cdf0e10cSrcweir {
2563cdf0e10cSrcweir 	StringResourcePersistenceImpl::storeToURL( URL, NameBase, Comment, Handler );
2564cdf0e10cSrcweir }
exportBinary()2565cdf0e10cSrcweir Sequence< ::sal_Int8 > StringResourceWithStorageImpl::exportBinary(  )
2566cdf0e10cSrcweir 	throw (RuntimeException)
2567cdf0e10cSrcweir {
2568cdf0e10cSrcweir 	return StringResourcePersistenceImpl::exportBinary();
2569cdf0e10cSrcweir }
importBinary(const Sequence<::sal_Int8> & Data)2570cdf0e10cSrcweir void StringResourceWithStorageImpl::importBinary( const Sequence< ::sal_Int8 >& Data )
2571cdf0e10cSrcweir 	throw (IllegalArgumentException, RuntimeException)
2572cdf0e10cSrcweir {
2573cdf0e10cSrcweir 	StringResourcePersistenceImpl::importBinary( Data );
2574cdf0e10cSrcweir }
2575cdf0e10cSrcweir 
2576cdf0e10cSrcweir // -----------------------------------------------------------------------------
2577cdf0e10cSrcweir // XStringResourceWithStorage
2578cdf0e10cSrcweir 
storeAsStorage(const Reference<XStorage> & Storage)2579cdf0e10cSrcweir void StringResourceWithStorageImpl::storeAsStorage( const Reference< XStorage >& Storage )
2580cdf0e10cSrcweir 	throw (Exception, RuntimeException)
2581cdf0e10cSrcweir {
2582cdf0e10cSrcweir 	setStorage( Storage );
2583cdf0e10cSrcweir 	store();
2584cdf0e10cSrcweir }
2585cdf0e10cSrcweir 
setStorage(const Reference<XStorage> & Storage)2586cdf0e10cSrcweir void StringResourceWithStorageImpl::setStorage( const Reference< XStorage >& Storage )
2587cdf0e10cSrcweir 	throw (IllegalArgumentException, RuntimeException)
2588cdf0e10cSrcweir {
2589cdf0e10cSrcweir     ::osl::MutexGuard aGuard( getMutex() );
2590cdf0e10cSrcweir 
2591cdf0e10cSrcweir 	if( !Storage.is() )
2592cdf0e10cSrcweir     {
2593cdf0e10cSrcweir         ::rtl::OUString errorMsg = ::rtl::OUString::createFromAscii
2594cdf0e10cSrcweir 			( "StringResourceWithStorageImpl::setStorage: invalid storage" );
2595cdf0e10cSrcweir         throw IllegalArgumentException( errorMsg, Reference< XInterface >(), 0 );
2596cdf0e10cSrcweir 	}
2597cdf0e10cSrcweir 
2598cdf0e10cSrcweir 	implLoadAllLocales();
2599cdf0e10cSrcweir 
2600cdf0e10cSrcweir 	m_xStorage = Storage;
2601cdf0e10cSrcweir 	m_bStorageChanged = true;
2602cdf0e10cSrcweir }
2603cdf0e10cSrcweir 
2604cdf0e10cSrcweir 
2605cdf0e10cSrcweir // =============================================================================
2606cdf0e10cSrcweir // Private helper methods
2607cdf0e10cSrcweir // =============================================================================
2608cdf0e10cSrcweir 
2609cdf0e10cSrcweir // Scan locale properties files
implScanLocales(void)2610cdf0e10cSrcweir void StringResourceWithStorageImpl::implScanLocales( void )
2611cdf0e10cSrcweir {
2612cdf0e10cSrcweir 	Reference< container::XNameAccess > xNameAccess( m_xStorage, UNO_QUERY );
2613cdf0e10cSrcweir     if( xNameAccess.is() )
2614cdf0e10cSrcweir     {
2615cdf0e10cSrcweir 		Sequence< ::rtl::OUString > aContentSeq = xNameAccess->getElementNames();
2616cdf0e10cSrcweir 		implScanLocaleNames( aContentSeq );
2617cdf0e10cSrcweir 	}
2618cdf0e10cSrcweir 
2619cdf0e10cSrcweir 	implLoadAllLocales();
2620cdf0e10cSrcweir }
2621cdf0e10cSrcweir 
2622cdf0e10cSrcweir // Loading
implLoadLocale(LocaleItem * pLocaleItem)2623cdf0e10cSrcweir bool StringResourceWithStorageImpl::implLoadLocale( LocaleItem* pLocaleItem )
2624cdf0e10cSrcweir {
2625cdf0e10cSrcweir 	bool bSuccess = false;
2626cdf0e10cSrcweir 	try
2627cdf0e10cSrcweir 	{
2628cdf0e10cSrcweir 		::rtl::OUString aStreamName = implGetFileNameForLocaleItem( pLocaleItem, m_aNameBase );
2629cdf0e10cSrcweir 		aStreamName += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(".properties") );
2630cdf0e10cSrcweir 
2631cdf0e10cSrcweir 		Reference< io::XStream > xElementStream =
2632cdf0e10cSrcweir 			m_xStorage->openStreamElement( aStreamName, ElementModes::READ );
2633cdf0e10cSrcweir 
2634cdf0e10cSrcweir 		if( xElementStream.is() )
2635cdf0e10cSrcweir 		{
2636cdf0e10cSrcweir 			Reference< io::XInputStream > xInputStream = xElementStream->getInputStream();
2637cdf0e10cSrcweir 			if( xInputStream.is() )
2638cdf0e10cSrcweir 			{
2639cdf0e10cSrcweir 				bSuccess = StringResourcePersistenceImpl::implReadPropertiesFile( pLocaleItem, xInputStream );
2640cdf0e10cSrcweir 				xInputStream->closeInput();
2641cdf0e10cSrcweir 			}
2642cdf0e10cSrcweir 		}
2643cdf0e10cSrcweir 	}
2644cdf0e10cSrcweir 	catch( uno::Exception& )
2645cdf0e10cSrcweir 	{}
2646cdf0e10cSrcweir 
2647cdf0e10cSrcweir 	return bSuccess;
2648cdf0e10cSrcweir }
2649cdf0e10cSrcweir 
2650cdf0e10cSrcweir 
2651cdf0e10cSrcweir // =============================================================================
2652cdf0e10cSrcweir // StringResourceWithLocationImpl
2653cdf0e10cSrcweir // =============================================================================
2654cdf0e10cSrcweir 
2655cdf0e10cSrcweir // component operations
getSupportedServiceNames_StringResourceWithLocationImpl()2656cdf0e10cSrcweir static Sequence< ::rtl::OUString > getSupportedServiceNames_StringResourceWithLocationImpl()
2657cdf0e10cSrcweir {
2658cdf0e10cSrcweir     Sequence< ::rtl::OUString > names(1);
2659cdf0e10cSrcweir     names[0] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.resource.StringResourceWithLocation") );
2660cdf0e10cSrcweir     return names;
2661cdf0e10cSrcweir }
2662cdf0e10cSrcweir 
getImplementationName_StringResourceWithLocationImpl()2663cdf0e10cSrcweir static ::rtl::OUString getImplementationName_StringResourceWithLocationImpl()
2664cdf0e10cSrcweir {
2665cdf0e10cSrcweir     return ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.scripting.StringResourceWithLocation") );
2666cdf0e10cSrcweir }
2667cdf0e10cSrcweir 
create_StringResourceWithLocationImpl(Reference<XComponentContext> const & xContext)2668cdf0e10cSrcweir static Reference< XInterface > SAL_CALL create_StringResourceWithLocationImpl(
2669cdf0e10cSrcweir     Reference< XComponentContext > const & xContext )
2670cdf0e10cSrcweir     SAL_THROW( () )
2671cdf0e10cSrcweir {
2672cdf0e10cSrcweir     return static_cast< ::cppu::OWeakObject * >( new StringResourceWithLocationImpl( xContext ) );
2673cdf0e10cSrcweir }
2674cdf0e10cSrcweir 
2675cdf0e10cSrcweir // -----------------------------------------------------------------------------
2676cdf0e10cSrcweir 
StringResourceWithLocationImpl(const Reference<XComponentContext> & rxContext)2677cdf0e10cSrcweir StringResourceWithLocationImpl::StringResourceWithLocationImpl( const Reference< XComponentContext >& rxContext )
2678cdf0e10cSrcweir     : StringResourceWithLocationImpl_BASE( rxContext )
2679cdf0e10cSrcweir 	, m_bLocationChanged( false )
2680cdf0e10cSrcweir {
2681cdf0e10cSrcweir }
2682cdf0e10cSrcweir 
2683cdf0e10cSrcweir // -----------------------------------------------------------------------------
2684cdf0e10cSrcweir 
~StringResourceWithLocationImpl()2685cdf0e10cSrcweir StringResourceWithLocationImpl::~StringResourceWithLocationImpl()
2686cdf0e10cSrcweir {
2687cdf0e10cSrcweir }
2688cdf0e10cSrcweir 
2689cdf0e10cSrcweir // -----------------------------------------------------------------------------
2690cdf0e10cSrcweir // XServiceInfo
2691cdf0e10cSrcweir // -----------------------------------------------------------------------------
2692cdf0e10cSrcweir 
getImplementationName()2693cdf0e10cSrcweir ::rtl::OUString StringResourceWithLocationImpl::getImplementationName(  ) throw (RuntimeException)
2694cdf0e10cSrcweir {
2695cdf0e10cSrcweir     return getImplementationName_StringResourceWithLocationImpl();
2696cdf0e10cSrcweir }
2697cdf0e10cSrcweir 
2698cdf0e10cSrcweir // -----------------------------------------------------------------------------
2699cdf0e10cSrcweir 
supportsService(const::rtl::OUString & rServiceName)2700cdf0e10cSrcweir sal_Bool StringResourceWithLocationImpl::supportsService( const ::rtl::OUString& rServiceName ) throw (RuntimeException)
2701cdf0e10cSrcweir {
2702cdf0e10cSrcweir 	Sequence< ::rtl::OUString > aNames( getSupportedServiceNames() );
2703cdf0e10cSrcweir 	const ::rtl::OUString* pNames = aNames.getConstArray();
2704cdf0e10cSrcweir 	const ::rtl::OUString* pEnd = pNames + aNames.getLength();
2705cdf0e10cSrcweir 	for ( ; pNames != pEnd && !pNames->equals( rServiceName ); ++pNames )
2706cdf0e10cSrcweir 		;
2707cdf0e10cSrcweir 
2708cdf0e10cSrcweir 	return pNames != pEnd;
2709cdf0e10cSrcweir }
2710cdf0e10cSrcweir 
2711cdf0e10cSrcweir // -----------------------------------------------------------------------------
2712cdf0e10cSrcweir 
getSupportedServiceNames()2713cdf0e10cSrcweir Sequence< ::rtl::OUString > StringResourceWithLocationImpl::getSupportedServiceNames(  ) throw (RuntimeException)
2714cdf0e10cSrcweir {
2715cdf0e10cSrcweir     return getSupportedServiceNames_StringResourceWithLocationImpl();
2716cdf0e10cSrcweir }
2717cdf0e10cSrcweir 
2718cdf0e10cSrcweir // -----------------------------------------------------------------------------
2719cdf0e10cSrcweir // XInitialization
2720cdf0e10cSrcweir // -----------------------------------------------------------------------------
2721cdf0e10cSrcweir 
initialize(const Sequence<Any> & aArguments)2722cdf0e10cSrcweir void StringResourceWithLocationImpl::initialize( const Sequence< Any >& aArguments )
2723cdf0e10cSrcweir 	throw (Exception, RuntimeException)
2724cdf0e10cSrcweir {
2725cdf0e10cSrcweir     ::osl::MutexGuard aGuard( getMutex() );
2726cdf0e10cSrcweir 
2727cdf0e10cSrcweir     if ( aArguments.getLength() != 6 )
2728cdf0e10cSrcweir     {
2729cdf0e10cSrcweir         throw RuntimeException(
2730cdf0e10cSrcweir             ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM
2731cdf0e10cSrcweir 				( "XInitialization::initialize: invalid number of arguments!" ) ),
2732cdf0e10cSrcweir             Reference< XInterface >() );
2733cdf0e10cSrcweir     }
2734cdf0e10cSrcweir 
2735cdf0e10cSrcweir 	bool bOk = (aArguments[0] >>= m_aLocation);
2736cdf0e10cSrcweir 	sal_Int32 nLen = m_aLocation.getLength();
2737cdf0e10cSrcweir 	if( bOk && nLen == 0 )
2738cdf0e10cSrcweir 	{
2739cdf0e10cSrcweir 		bOk = false;
2740cdf0e10cSrcweir 	}
2741cdf0e10cSrcweir 	else
2742cdf0e10cSrcweir 	{
2743cdf0e10cSrcweir 		if( m_aLocation.getStr()[nLen - 1] != '/' )
2744cdf0e10cSrcweir 			m_aLocation += ::rtl::OUString::createFromAscii( "/" );
2745cdf0e10cSrcweir 	}
2746cdf0e10cSrcweir 
2747cdf0e10cSrcweir 	if( !bOk )
2748cdf0e10cSrcweir     {
2749cdf0e10cSrcweir 		::rtl::OUString errorMsg = ::rtl::OUString::createFromAscii( "XInitialization::initialize: invalid URL" );
2750cdf0e10cSrcweir 		throw IllegalArgumentException( errorMsg, Reference< XInterface >(), 0 );
2751cdf0e10cSrcweir 	}
2752cdf0e10cSrcweir 
2753cdf0e10cSrcweir 
2754cdf0e10cSrcweir 	bOk = (aArguments[5] >>= m_xInteractionHandler);
2755cdf0e10cSrcweir 	if( !bOk )
2756cdf0e10cSrcweir     {
2757cdf0e10cSrcweir         ::rtl::OUString errorMsg = ::rtl::OUString::createFromAscii( "StringResourceWithStorageImpl::initialize: invalid type" );
2758cdf0e10cSrcweir         throw IllegalArgumentException( errorMsg, Reference< XInterface >(), 5 );
2759cdf0e10cSrcweir 	}
2760cdf0e10cSrcweir 
2761cdf0e10cSrcweir 	implInitializeCommonParameters( aArguments );
2762cdf0e10cSrcweir }
2763cdf0e10cSrcweir 
2764cdf0e10cSrcweir // -----------------------------------------------------------------------------
2765cdf0e10cSrcweir // Forwarding calls to base class
2766cdf0e10cSrcweir 
2767cdf0e10cSrcweir // XModifyBroadcaster
addModifyListener(const Reference<XModifyListener> & aListener)2768cdf0e10cSrcweir void StringResourceWithLocationImpl::addModifyListener( const Reference< XModifyListener >& aListener )
2769cdf0e10cSrcweir 	throw (RuntimeException)
2770cdf0e10cSrcweir {
2771cdf0e10cSrcweir 	StringResourceImpl::addModifyListener( aListener );
2772cdf0e10cSrcweir }
removeModifyListener(const Reference<XModifyListener> & aListener)2773cdf0e10cSrcweir void StringResourceWithLocationImpl::removeModifyListener( const Reference< XModifyListener >& aListener )
2774cdf0e10cSrcweir 	throw (RuntimeException)
2775cdf0e10cSrcweir {
2776cdf0e10cSrcweir 	StringResourceImpl::removeModifyListener( aListener );
2777cdf0e10cSrcweir }
2778cdf0e10cSrcweir 
2779cdf0e10cSrcweir // XStringResourceResolver
resolveString(const::rtl::OUString & ResourceID)2780cdf0e10cSrcweir ::rtl::OUString StringResourceWithLocationImpl::resolveString( const ::rtl::OUString& ResourceID )
2781cdf0e10cSrcweir 	throw (::com::sun::star::resource::MissingResourceException, RuntimeException)
2782cdf0e10cSrcweir {
2783cdf0e10cSrcweir 	return StringResourceImpl::resolveString( ResourceID ) ;
2784cdf0e10cSrcweir }
resolveStringForLocale(const::rtl::OUString & ResourceID,const Locale & locale)2785cdf0e10cSrcweir ::rtl::OUString StringResourceWithLocationImpl::resolveStringForLocale( const ::rtl::OUString& ResourceID, const Locale& locale )
2786cdf0e10cSrcweir 	throw ( ::com::sun::star::resource::MissingResourceException, RuntimeException)
2787cdf0e10cSrcweir {
2788cdf0e10cSrcweir 	return StringResourceImpl::resolveStringForLocale( ResourceID, locale );
2789cdf0e10cSrcweir }
hasEntryForId(const::rtl::OUString & ResourceID)2790cdf0e10cSrcweir sal_Bool StringResourceWithLocationImpl::hasEntryForId( const ::rtl::OUString& ResourceID )
2791cdf0e10cSrcweir 	throw (RuntimeException)
2792cdf0e10cSrcweir {
2793cdf0e10cSrcweir 	return StringResourceImpl::hasEntryForId( ResourceID ) ;
2794cdf0e10cSrcweir }
hasEntryForIdAndLocale(const::rtl::OUString & ResourceID,const Locale & locale)2795cdf0e10cSrcweir sal_Bool StringResourceWithLocationImpl::hasEntryForIdAndLocale( const ::rtl::OUString& ResourceID,
2796cdf0e10cSrcweir 	const Locale& locale )
2797cdf0e10cSrcweir 		throw (RuntimeException)
2798cdf0e10cSrcweir {
2799cdf0e10cSrcweir 	return StringResourceImpl::hasEntryForIdAndLocale( ResourceID, locale );
2800cdf0e10cSrcweir }
getResourceIDs()2801cdf0e10cSrcweir Sequence< ::rtl::OUString > StringResourceWithLocationImpl::getResourceIDs(  )
2802cdf0e10cSrcweir 	throw (RuntimeException)
2803cdf0e10cSrcweir {
2804cdf0e10cSrcweir 	return StringResourceImpl::getResourceIDs();
2805cdf0e10cSrcweir }
getResourceIDsForLocale(const Locale & locale)2806cdf0e10cSrcweir Sequence< ::rtl::OUString > StringResourceWithLocationImpl::getResourceIDsForLocale
2807cdf0e10cSrcweir 	( const Locale& locale ) throw (::com::sun::star::uno::RuntimeException)
2808cdf0e10cSrcweir {
2809cdf0e10cSrcweir 	return StringResourceImpl::getResourceIDsForLocale( locale );
2810cdf0e10cSrcweir }
getCurrentLocale()2811cdf0e10cSrcweir Locale StringResourceWithLocationImpl::getCurrentLocale()
2812cdf0e10cSrcweir 	throw (RuntimeException)
2813cdf0e10cSrcweir {
2814cdf0e10cSrcweir 	return StringResourceImpl::getCurrentLocale();
2815cdf0e10cSrcweir }
getDefaultLocale()2816cdf0e10cSrcweir Locale StringResourceWithLocationImpl::getDefaultLocale(  )
2817cdf0e10cSrcweir 	throw (RuntimeException)
2818cdf0e10cSrcweir {
2819cdf0e10cSrcweir 	return StringResourceImpl::getDefaultLocale();
2820cdf0e10cSrcweir }
getLocales()2821cdf0e10cSrcweir Sequence< Locale > StringResourceWithLocationImpl::getLocales(  )
2822cdf0e10cSrcweir 	throw (RuntimeException)
2823cdf0e10cSrcweir {
2824cdf0e10cSrcweir 	return StringResourceImpl::getLocales();
2825cdf0e10cSrcweir }
2826cdf0e10cSrcweir 
2827cdf0e10cSrcweir // XStringResourceManager
isReadOnly()2828cdf0e10cSrcweir sal_Bool StringResourceWithLocationImpl::isReadOnly()
2829cdf0e10cSrcweir 	throw (RuntimeException)
2830cdf0e10cSrcweir {
2831cdf0e10cSrcweir 	return StringResourceImpl::isReadOnly();
2832cdf0e10cSrcweir }
setCurrentLocale(const Locale & locale,sal_Bool FindClosestMatch)2833cdf0e10cSrcweir void StringResourceWithLocationImpl::setCurrentLocale( const Locale& locale, sal_Bool FindClosestMatch )
2834cdf0e10cSrcweir 	throw (IllegalArgumentException, RuntimeException)
2835cdf0e10cSrcweir {
2836cdf0e10cSrcweir 	StringResourceImpl::setCurrentLocale( locale, FindClosestMatch );
2837cdf0e10cSrcweir }
setDefaultLocale(const Locale & locale)2838cdf0e10cSrcweir void StringResourceWithLocationImpl::setDefaultLocale( const Locale& locale )
2839cdf0e10cSrcweir 	throw (IllegalArgumentException, RuntimeException,NoSupportException)
2840cdf0e10cSrcweir {
2841cdf0e10cSrcweir 	StringResourceImpl::setDefaultLocale( locale );
2842cdf0e10cSrcweir }
setString(const::rtl::OUString & ResourceID,const::rtl::OUString & Str)2843cdf0e10cSrcweir void StringResourceWithLocationImpl::setString( const ::rtl::OUString& ResourceID, const ::rtl::OUString& Str )
2844cdf0e10cSrcweir 	throw (NoSupportException, RuntimeException)
2845cdf0e10cSrcweir {
2846cdf0e10cSrcweir 	StringResourceImpl::setString( ResourceID, Str );
2847cdf0e10cSrcweir }
setStringForLocale(const::rtl::OUString & ResourceID,const::rtl::OUString & Str,const Locale & locale)2848cdf0e10cSrcweir void StringResourceWithLocationImpl::setStringForLocale
2849cdf0e10cSrcweir 	( const ::rtl::OUString& ResourceID, const ::rtl::OUString& Str, const Locale& locale )
2850cdf0e10cSrcweir 		throw (NoSupportException, RuntimeException)
2851cdf0e10cSrcweir {
2852cdf0e10cSrcweir 	StringResourceImpl::setStringForLocale( ResourceID, Str, locale );
2853cdf0e10cSrcweir }
removeId(const::rtl::OUString & ResourceID)2854cdf0e10cSrcweir void StringResourceWithLocationImpl::removeId( const ::rtl::OUString& ResourceID )
2855cdf0e10cSrcweir 	throw (::com::sun::star::resource::MissingResourceException, RuntimeException, NoSupportException)
2856cdf0e10cSrcweir {
2857cdf0e10cSrcweir 	StringResourceImpl::removeId( ResourceID );
2858cdf0e10cSrcweir }
removeIdForLocale(const::rtl::OUString & ResourceID,const Locale & locale)2859cdf0e10cSrcweir void StringResourceWithLocationImpl::removeIdForLocale( const ::rtl::OUString& ResourceID, const Locale& locale )
2860cdf0e10cSrcweir 	throw (::com::sun::star::resource::MissingResourceException, RuntimeException, NoSupportException)
2861cdf0e10cSrcweir {
2862cdf0e10cSrcweir 	StringResourceImpl::removeIdForLocale( ResourceID, locale );
2863cdf0e10cSrcweir }
newLocale(const Locale & locale)2864cdf0e10cSrcweir void StringResourceWithLocationImpl::newLocale( const Locale& locale )
2865cdf0e10cSrcweir 	throw (ElementExistException, IllegalArgumentException, RuntimeException, NoSupportException)
2866cdf0e10cSrcweir {
2867cdf0e10cSrcweir 	StringResourceImpl::newLocale( locale );
2868cdf0e10cSrcweir }
removeLocale(const Locale & locale)2869cdf0e10cSrcweir void StringResourceWithLocationImpl::removeLocale( const Locale& locale )
2870cdf0e10cSrcweir 	throw (IllegalArgumentException, RuntimeException, NoSupportException)
2871cdf0e10cSrcweir {
2872cdf0e10cSrcweir 	StringResourceImpl::removeLocale( locale );
2873cdf0e10cSrcweir }
getUniqueNumericId()2874cdf0e10cSrcweir sal_Int32 StringResourceWithLocationImpl::getUniqueNumericId(  )
2875cdf0e10cSrcweir 	throw (RuntimeException, NoSupportException)
2876cdf0e10cSrcweir {
2877cdf0e10cSrcweir 	return StringResourceImpl::getUniqueNumericId();
2878cdf0e10cSrcweir }
2879cdf0e10cSrcweir 
2880cdf0e10cSrcweir // XStringResourcePersistence
store()2881cdf0e10cSrcweir void StringResourceWithLocationImpl::store()
2882cdf0e10cSrcweir 	throw (NoSupportException, Exception, RuntimeException)
2883cdf0e10cSrcweir {
2884cdf0e10cSrcweir     ::osl::MutexGuard aGuard( getMutex() );
2885cdf0e10cSrcweir 	implCheckReadOnly( "StringResourceWithLocationImpl::store(): Read only" );
2886cdf0e10cSrcweir 
2887cdf0e10cSrcweir 	bool bUsedForStore = true;
2888cdf0e10cSrcweir 	bool bStoreAll = m_bLocationChanged;
2889cdf0e10cSrcweir 	m_bLocationChanged = false;
2890cdf0e10cSrcweir 	if( !m_bModified && !bStoreAll )
2891cdf0e10cSrcweir 		return;
2892cdf0e10cSrcweir 
2893cdf0e10cSrcweir 	Reference< ucb::XSimpleFileAccess > xFileAccess = getFileAccess();
2894cdf0e10cSrcweir 	implStoreAtLocation( m_aLocation, m_aNameBase, m_aComment,
2895cdf0e10cSrcweir 		xFileAccess, bUsedForStore, bStoreAll );
2896cdf0e10cSrcweir 	m_bModified = false;
2897cdf0e10cSrcweir }
2898cdf0e10cSrcweir 
isModified()2899cdf0e10cSrcweir sal_Bool StringResourceWithLocationImpl::isModified(  )
2900cdf0e10cSrcweir 	throw (RuntimeException)
2901cdf0e10cSrcweir {
2902cdf0e10cSrcweir 	return StringResourcePersistenceImpl::isModified();
2903cdf0e10cSrcweir }
setComment(const::rtl::OUString & Comment)2904cdf0e10cSrcweir void StringResourceWithLocationImpl::setComment( const ::rtl::OUString& Comment )
2905cdf0e10cSrcweir 	throw (::com::sun::star::uno::RuntimeException)
2906cdf0e10cSrcweir {
2907cdf0e10cSrcweir 	StringResourcePersistenceImpl::setComment( Comment );
2908cdf0e10cSrcweir }
storeToStorage(const Reference<XStorage> & Storage,const::rtl::OUString & NameBase,const::rtl::OUString & Comment)2909cdf0e10cSrcweir void StringResourceWithLocationImpl::storeToStorage( const Reference< XStorage >& Storage,
2910cdf0e10cSrcweir 	const ::rtl::OUString& NameBase, const ::rtl::OUString& Comment )
2911cdf0e10cSrcweir 		throw (Exception, RuntimeException)
2912cdf0e10cSrcweir {
2913cdf0e10cSrcweir 	StringResourcePersistenceImpl::storeToStorage( Storage, NameBase, Comment );
2914cdf0e10cSrcweir }
storeToURL(const::rtl::OUString & URL,const::rtl::OUString & NameBase,const::rtl::OUString & Comment,const Reference<::com::sun::star::task::XInteractionHandler> & Handler)2915cdf0e10cSrcweir void StringResourceWithLocationImpl::storeToURL( const ::rtl::OUString& URL,
2916cdf0e10cSrcweir 	const ::rtl::OUString& NameBase, const ::rtl::OUString& Comment,
2917cdf0e10cSrcweir 	const Reference< ::com::sun::star::task::XInteractionHandler >& Handler )
2918cdf0e10cSrcweir 		throw (Exception, RuntimeException)
2919cdf0e10cSrcweir {
2920cdf0e10cSrcweir 	StringResourcePersistenceImpl::storeToURL( URL, NameBase, Comment, Handler );
2921cdf0e10cSrcweir }
exportBinary()2922cdf0e10cSrcweir Sequence< ::sal_Int8 > StringResourceWithLocationImpl::exportBinary(  )
2923cdf0e10cSrcweir 	throw (RuntimeException)
2924cdf0e10cSrcweir {
2925cdf0e10cSrcweir 	return StringResourcePersistenceImpl::exportBinary();
2926cdf0e10cSrcweir }
importBinary(const Sequence<::sal_Int8> & Data)2927cdf0e10cSrcweir void StringResourceWithLocationImpl::importBinary( const Sequence< ::sal_Int8 >& Data )
2928cdf0e10cSrcweir 	throw (IllegalArgumentException, RuntimeException)
2929cdf0e10cSrcweir {
2930cdf0e10cSrcweir 	StringResourcePersistenceImpl::importBinary( Data );
2931cdf0e10cSrcweir }
2932cdf0e10cSrcweir 
2933cdf0e10cSrcweir // -----------------------------------------------------------------------------
2934cdf0e10cSrcweir // XStringResourceWithLocation
2935cdf0e10cSrcweir 
2936cdf0e10cSrcweir // XStringResourceWithLocation
storeAsURL(const::rtl::OUString & URL)2937cdf0e10cSrcweir void StringResourceWithLocationImpl::storeAsURL( const ::rtl::OUString& URL )
2938cdf0e10cSrcweir 	throw (::com::sun::star::uno::Exception, ::com::sun::star::uno::RuntimeException)
2939cdf0e10cSrcweir {
2940cdf0e10cSrcweir 	setURL( URL );
2941cdf0e10cSrcweir 	store();
2942cdf0e10cSrcweir }
2943cdf0e10cSrcweir 
setURL(const::rtl::OUString & URL)2944cdf0e10cSrcweir void StringResourceWithLocationImpl::setURL( const ::rtl::OUString& URL )
2945cdf0e10cSrcweir 	throw (::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException)
2946cdf0e10cSrcweir {
2947cdf0e10cSrcweir     ::osl::MutexGuard aGuard( getMutex() );
2948cdf0e10cSrcweir 	implCheckReadOnly( "StringResourceWithLocationImpl::setURL(): Read only" );
2949cdf0e10cSrcweir 
2950cdf0e10cSrcweir 	sal_Int32 nLen = URL.getLength();
2951cdf0e10cSrcweir 	if( nLen == 0 )
2952cdf0e10cSrcweir     {
2953cdf0e10cSrcweir 		::rtl::OUString errorMsg = ::rtl::OUString::createFromAscii
2954cdf0e10cSrcweir 			( "StringResourceWithLocationImpl::setURL: invalid URL" );
2955cdf0e10cSrcweir 		throw IllegalArgumentException( errorMsg, Reference< XInterface >(), 0 );
2956cdf0e10cSrcweir 	}
2957cdf0e10cSrcweir 
2958cdf0e10cSrcweir 	implLoadAllLocales();
2959cdf0e10cSrcweir 
2960cdf0e10cSrcweir 	// Delete files at old location
2961cdf0e10cSrcweir 	bool bUsedForStore = false;
2962cdf0e10cSrcweir 	bool bStoreAll = false;
2963cdf0e10cSrcweir 	bool bKillAll = true;
2964cdf0e10cSrcweir 	implStoreAtLocation( m_aLocation, m_aNameBase, m_aComment,
2965cdf0e10cSrcweir 		getFileAccess(), bUsedForStore, bStoreAll, bKillAll );
2966cdf0e10cSrcweir 
2967cdf0e10cSrcweir 	m_aLocation = URL;
2968cdf0e10cSrcweir 	m_bLocationChanged = true;
2969cdf0e10cSrcweir }
2970cdf0e10cSrcweir 
2971cdf0e10cSrcweir 
2972cdf0e10cSrcweir // =============================================================================
2973cdf0e10cSrcweir // Private helper methods
2974cdf0e10cSrcweir // =============================================================================
2975cdf0e10cSrcweir 
2976cdf0e10cSrcweir // Scan locale properties files
implScanLocales(void)2977cdf0e10cSrcweir void StringResourceWithLocationImpl::implScanLocales( void )
2978cdf0e10cSrcweir {
2979cdf0e10cSrcweir 	const Reference< ucb::XSimpleFileAccess > xFileAccess = getFileAccess();
2980cdf0e10cSrcweir     if( xFileAccess.is() && xFileAccess->isFolder( m_aLocation ) )
2981cdf0e10cSrcweir     {
2982cdf0e10cSrcweir 		Sequence< ::rtl::OUString > aContentSeq = xFileAccess->getFolderContents( m_aLocation, false );
2983cdf0e10cSrcweir 		implScanLocaleNames( aContentSeq );
2984cdf0e10cSrcweir 	}
2985cdf0e10cSrcweir }
2986cdf0e10cSrcweir 
2987cdf0e10cSrcweir // Loading
implLoadLocale(LocaleItem * pLocaleItem)2988cdf0e10cSrcweir bool StringResourceWithLocationImpl::implLoadLocale( LocaleItem* pLocaleItem )
2989cdf0e10cSrcweir {
2990cdf0e10cSrcweir 	bool bSuccess = false;
2991cdf0e10cSrcweir 
2992cdf0e10cSrcweir 	const Reference< ucb::XSimpleFileAccess > xFileAccess = getFileAccess();
2993cdf0e10cSrcweir 	if( xFileAccess.is() )
2994cdf0e10cSrcweir 	{
2995cdf0e10cSrcweir 		::rtl::OUString aCompleteFileName =
2996cdf0e10cSrcweir 			implGetPathForLocaleItem( pLocaleItem, m_aNameBase, m_aLocation );
2997cdf0e10cSrcweir 
2998cdf0e10cSrcweir 		Reference< io::XInputStream > xInputStream;
2999cdf0e10cSrcweir 		try
3000cdf0e10cSrcweir 		{
3001cdf0e10cSrcweir 			xInputStream = xFileAccess->openFileRead( aCompleteFileName );
3002cdf0e10cSrcweir 		}
3003cdf0e10cSrcweir 		catch( Exception& )
3004cdf0e10cSrcweir 		{}
3005cdf0e10cSrcweir 		if( xInputStream.is() )
3006cdf0e10cSrcweir 		{
3007cdf0e10cSrcweir 			bSuccess = StringResourcePersistenceImpl::implReadPropertiesFile( pLocaleItem, xInputStream );
3008cdf0e10cSrcweir 			xInputStream->closeInput();
3009cdf0e10cSrcweir 		}
3010cdf0e10cSrcweir 	}
3011cdf0e10cSrcweir 
3012cdf0e10cSrcweir 	return bSuccess;
3013cdf0e10cSrcweir }
3014cdf0e10cSrcweir 
getFileAccess(void)3015cdf0e10cSrcweir const Reference< ucb::XSimpleFileAccess > StringResourceWithLocationImpl::getFileAccess( void )
3016cdf0e10cSrcweir {
3017cdf0e10cSrcweir     ::osl::MutexGuard aGuard( getMutex() );
3018cdf0e10cSrcweir 
3019cdf0e10cSrcweir 	if( !m_xSFI.is() )
3020cdf0e10cSrcweir 	{
3021cdf0e10cSrcweir 		Reference< XMultiComponentFactory > xMCF = getMultiComponentFactory();
3022cdf0e10cSrcweir 		m_xSFI = Reference< ucb::XSimpleFileAccess >( xMCF->createInstanceWithContext
3023cdf0e10cSrcweir 			( ::rtl::OUString::createFromAscii( "com.sun.star.ucb.SimpleFileAccess" ), m_xContext ), UNO_QUERY );
3024cdf0e10cSrcweir 
3025cdf0e10cSrcweir 		if( m_xSFI.is() && m_xInteractionHandler.is() )
3026cdf0e10cSrcweir 			m_xSFI->setInteractionHandler( m_xInteractionHandler );
3027cdf0e10cSrcweir 	}
3028cdf0e10cSrcweir 	return m_xSFI;
3029cdf0e10cSrcweir }
3030cdf0e10cSrcweir 
3031cdf0e10cSrcweir 
3032cdf0e10cSrcweir // =============================================================================
3033cdf0e10cSrcweir // component export operations
3034cdf0e10cSrcweir // =============================================================================
3035cdf0e10cSrcweir 
3036cdf0e10cSrcweir static struct ::cppu::ImplementationEntry s_component_entries [] =
3037cdf0e10cSrcweir {
3038cdf0e10cSrcweir     {
3039cdf0e10cSrcweir         create_StringResourceImpl, getImplementationName_StringResourceImpl,
3040cdf0e10cSrcweir         getSupportedServiceNames_StringResourceImpl,
3041cdf0e10cSrcweir 		::cppu::createSingleComponentFactory,
3042cdf0e10cSrcweir         0, 0
3043cdf0e10cSrcweir     },
3044cdf0e10cSrcweir     {
3045cdf0e10cSrcweir         create_StringResourceWithLocationImpl, getImplementationName_StringResourceWithLocationImpl,
3046cdf0e10cSrcweir         getSupportedServiceNames_StringResourceWithLocationImpl,
3047cdf0e10cSrcweir         ::cppu::createSingleComponentFactory,
3048cdf0e10cSrcweir         0, 0
3049cdf0e10cSrcweir     },
3050cdf0e10cSrcweir     {
3051cdf0e10cSrcweir         create_StringResourceWithStorageImpl, getImplementationName_StringResourceWithStorageImpl,
3052cdf0e10cSrcweir         getSupportedServiceNames_StringResourceWithStorageImpl,
3053cdf0e10cSrcweir         ::cppu::createSingleComponentFactory,
3054cdf0e10cSrcweir         0, 0
3055cdf0e10cSrcweir     },
3056cdf0e10cSrcweir     { 0, 0, 0, 0, 0, 0 }
3057cdf0e10cSrcweir };
3058cdf0e10cSrcweir 
3059cdf0e10cSrcweir 
3060cdf0e10cSrcweir //.........................................................................
3061cdf0e10cSrcweir }	// namespace dlgprov
3062cdf0e10cSrcweir //.........................................................................
3063cdf0e10cSrcweir 
3064cdf0e10cSrcweir 
3065cdf0e10cSrcweir // =============================================================================
3066cdf0e10cSrcweir // component exports
3067cdf0e10cSrcweir // =============================================================================
3068cdf0e10cSrcweir 
3069cdf0e10cSrcweir extern "C"
3070cdf0e10cSrcweir {
component_getImplementationEnvironment(const sal_Char ** ppEnvTypeName,uno_Environment ** ppEnv)3071cdf0e10cSrcweir     void SAL_CALL component_getImplementationEnvironment(
3072cdf0e10cSrcweir         const sal_Char ** ppEnvTypeName, uno_Environment ** ppEnv )
3073cdf0e10cSrcweir     {
3074cdf0e10cSrcweir 		(void)ppEnv;
3075cdf0e10cSrcweir 
3076cdf0e10cSrcweir         *ppEnvTypeName = CPPU_CURRENT_LANGUAGE_BINDING_NAME;
3077cdf0e10cSrcweir     }
3078cdf0e10cSrcweir 
component_getFactory(const sal_Char * pImplName,lang::XMultiServiceFactory * pServiceManager,registry::XRegistryKey * pRegistryKey)3079cdf0e10cSrcweir     void * SAL_CALL component_getFactory(
3080cdf0e10cSrcweir         const sal_Char * pImplName, lang::XMultiServiceFactory * pServiceManager,
3081cdf0e10cSrcweir         registry::XRegistryKey * pRegistryKey )
3082cdf0e10cSrcweir     {
3083cdf0e10cSrcweir         return ::cppu::component_getFactoryHelper(
3084cdf0e10cSrcweir             pImplName, pServiceManager, pRegistryKey, ::stringresource::s_component_entries );
3085cdf0e10cSrcweir     }
3086cdf0e10cSrcweir }
3087