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 10cdf0e10cSrcweir * 112c696243SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12cdf0e10cSrcweir * 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. 19cdf0e10cSrcweir * 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 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 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 92cdf0e10cSrcweir static ::rtl::OUString getImplementationName_StringResourceImpl() 93cdf0e10cSrcweir { 94cdf0e10cSrcweir return ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.scripting.StringResource") ); 95cdf0e10cSrcweir } 96cdf0e10cSrcweir 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 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 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 140cdf0e10cSrcweir ::rtl::OUString StringResourceImpl::getImplementationName( ) throw (RuntimeException) 141cdf0e10cSrcweir { 142cdf0e10cSrcweir return getImplementationName_StringResourceImpl(); 143cdf0e10cSrcweir } 144cdf0e10cSrcweir 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 156cdf0e10cSrcweir Sequence< ::rtl::OUString > StringResourceImpl::getSupportedServiceNames( ) throw (RuntimeException) 157cdf0e10cSrcweir { 158cdf0e10cSrcweir return getSupportedServiceNames_StringResourceImpl(); 159cdf0e10cSrcweir } 160cdf0e10cSrcweir 161cdf0e10cSrcweir 162cdf0e10cSrcweir // ============================================================================= 163cdf0e10cSrcweir // XModifyBroadcaster 164cdf0e10cSrcweir 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 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 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 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 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 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 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 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 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 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 288cdf0e10cSrcweir Sequence< ::rtl::OUString > StringResourceImpl::getResourceIDs( ) 289cdf0e10cSrcweir throw (RuntimeException) 290cdf0e10cSrcweir { 291cdf0e10cSrcweir ::osl::MutexGuard aGuard( getMutex() ); 292cdf0e10cSrcweir return implGetResourceIDs( m_pCurrentLocaleItem ); 293cdf0e10cSrcweir } 294cdf0e10cSrcweir 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 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 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 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 349cdf0e10cSrcweir sal_Bool StringResourceImpl::isReadOnly() 350cdf0e10cSrcweir throw (RuntimeException) 351cdf0e10cSrcweir { 352cdf0e10cSrcweir return m_bReadOnly; 353cdf0e10cSrcweir } 354cdf0e10cSrcweir 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 721cdf0e10cSrcweir void StringResourceImpl::implModified( void ) 722cdf0e10cSrcweir { 723cdf0e10cSrcweir m_bModified = true; 724cdf0e10cSrcweir implNotifyListeners(); 725cdf0e10cSrcweir } 726cdf0e10cSrcweir 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 752cdf0e10cSrcweir bool StringResourceImpl::loadLocale( LocaleItem* pLocaleItem ) 753cdf0e10cSrcweir { 754cdf0e10cSrcweir // Base implementation has nothing to load 755cdf0e10cSrcweir (void)pLocaleItem; 756cdf0e10cSrcweir return true; 757cdf0e10cSrcweir } 758cdf0e10cSrcweir 759cdf0e10cSrcweir void StringResourceImpl::implLoadAllLocales( void ) 760cdf0e10cSrcweir { 761cdf0e10cSrcweir // Base implementation has nothing to load 762cdf0e10cSrcweir } 763cdf0e10cSrcweir 764cdf0e10cSrcweir 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 788cdf0e10cSrcweir StringResourcePersistenceImpl::StringResourcePersistenceImpl( const Reference< XComponentContext >& rxContext ) 789cdf0e10cSrcweir : StringResourcePersistenceImpl_BASE( rxContext ) 790cdf0e10cSrcweir { 791cdf0e10cSrcweir } 792cdf0e10cSrcweir 793cdf0e10cSrcweir // ----------------------------------------------------------------------------- 794cdf0e10cSrcweir 795cdf0e10cSrcweir StringResourcePersistenceImpl::~StringResourcePersistenceImpl() 796cdf0e10cSrcweir { 797cdf0e10cSrcweir } 798cdf0e10cSrcweir 799cdf0e10cSrcweir // ----------------------------------------------------------------------------- 800cdf0e10cSrcweir // XServiceInfo 801cdf0e10cSrcweir // ----------------------------------------------------------------------------- 802cdf0e10cSrcweir 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 812cdf0e10cSrcweir sal_Bool StringResourcePersistenceImpl::supportsService( const ::rtl::OUString& rServiceName ) 813cdf0e10cSrcweir throw (RuntimeException) 814cdf0e10cSrcweir { 815cdf0e10cSrcweir return StringResourceImpl::supportsService( rServiceName ); 816cdf0e10cSrcweir } 817cdf0e10cSrcweir 818cdf0e10cSrcweir // ----------------------------------------------------------------------------- 819cdf0e10cSrcweir 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 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 878cdf0e10cSrcweir void StringResourcePersistenceImpl::addModifyListener( const Reference< XModifyListener >& aListener ) 879cdf0e10cSrcweir throw (RuntimeException) 880cdf0e10cSrcweir { 881cdf0e10cSrcweir StringResourceImpl::addModifyListener( aListener ); 882cdf0e10cSrcweir } 883cdf0e10cSrcweir void StringResourcePersistenceImpl::removeModifyListener( const Reference< XModifyListener >& aListener ) 884cdf0e10cSrcweir throw (RuntimeException) 885cdf0e10cSrcweir { 886cdf0e10cSrcweir StringResourceImpl::removeModifyListener( aListener ); 887cdf0e10cSrcweir } 888cdf0e10cSrcweir 889cdf0e10cSrcweir // XStringResourceResolver 890cdf0e10cSrcweir ::rtl::OUString StringResourcePersistenceImpl::resolveString( const ::rtl::OUString& ResourceID ) 891cdf0e10cSrcweir throw (::com::sun::star::resource::MissingResourceException, RuntimeException) 892cdf0e10cSrcweir { 893cdf0e10cSrcweir return StringResourceImpl::resolveString( ResourceID ) ; 894cdf0e10cSrcweir } 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 } 900cdf0e10cSrcweir sal_Bool StringResourcePersistenceImpl::hasEntryForId( const ::rtl::OUString& ResourceID ) 901cdf0e10cSrcweir throw (RuntimeException) 902cdf0e10cSrcweir { 903cdf0e10cSrcweir return StringResourceImpl::hasEntryForId( ResourceID ) ; 904cdf0e10cSrcweir } 905cdf0e10cSrcweir sal_Bool StringResourcePersistenceImpl::hasEntryForIdAndLocale( const ::rtl::OUString& ResourceID, 906cdf0e10cSrcweir const Locale& locale ) 907cdf0e10cSrcweir throw (RuntimeException) 908cdf0e10cSrcweir { 909cdf0e10cSrcweir return StringResourceImpl::hasEntryForIdAndLocale( ResourceID, locale ); 910cdf0e10cSrcweir } 911cdf0e10cSrcweir Locale StringResourcePersistenceImpl::getCurrentLocale() 912cdf0e10cSrcweir throw (RuntimeException) 913cdf0e10cSrcweir { 914cdf0e10cSrcweir return StringResourceImpl::getCurrentLocale(); 915cdf0e10cSrcweir } 916cdf0e10cSrcweir Locale StringResourcePersistenceImpl::getDefaultLocale( ) 917cdf0e10cSrcweir throw (RuntimeException) 918cdf0e10cSrcweir { 919cdf0e10cSrcweir return StringResourceImpl::getDefaultLocale(); 920cdf0e10cSrcweir } 921cdf0e10cSrcweir Sequence< Locale > StringResourcePersistenceImpl::getLocales( ) 922cdf0e10cSrcweir throw (RuntimeException) 923cdf0e10cSrcweir { 924cdf0e10cSrcweir return StringResourceImpl::getLocales(); 925cdf0e10cSrcweir } 926cdf0e10cSrcweir 927cdf0e10cSrcweir // XStringResourceManager 928cdf0e10cSrcweir sal_Bool StringResourcePersistenceImpl::isReadOnly() 929cdf0e10cSrcweir throw (RuntimeException) 930cdf0e10cSrcweir { 931cdf0e10cSrcweir return StringResourceImpl::isReadOnly(); 932cdf0e10cSrcweir } 933cdf0e10cSrcweir void StringResourcePersistenceImpl::setCurrentLocale( const Locale& locale, sal_Bool FindClosestMatch ) 934cdf0e10cSrcweir throw (IllegalArgumentException, RuntimeException) 935cdf0e10cSrcweir { 936cdf0e10cSrcweir StringResourceImpl::setCurrentLocale( locale, FindClosestMatch ); 937cdf0e10cSrcweir } 938cdf0e10cSrcweir void StringResourcePersistenceImpl::setDefaultLocale( const Locale& locale ) 939cdf0e10cSrcweir throw (IllegalArgumentException, RuntimeException,NoSupportException) 940cdf0e10cSrcweir { 941cdf0e10cSrcweir StringResourceImpl::setDefaultLocale( locale ); 942cdf0e10cSrcweir } 943cdf0e10cSrcweir Sequence< ::rtl::OUString > StringResourcePersistenceImpl::getResourceIDs( ) 944cdf0e10cSrcweir throw (RuntimeException) 945cdf0e10cSrcweir { 946cdf0e10cSrcweir return StringResourceImpl::getResourceIDs(); 947cdf0e10cSrcweir } 948cdf0e10cSrcweir void StringResourcePersistenceImpl::setString( const ::rtl::OUString& ResourceID, const ::rtl::OUString& Str ) 949cdf0e10cSrcweir throw (NoSupportException, RuntimeException) 950cdf0e10cSrcweir { 951cdf0e10cSrcweir StringResourceImpl::setString( ResourceID, Str ); 952cdf0e10cSrcweir } 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 } 959cdf0e10cSrcweir Sequence< ::rtl::OUString > StringResourcePersistenceImpl::getResourceIDsForLocale 960cdf0e10cSrcweir ( const Locale& locale ) throw (::com::sun::star::uno::RuntimeException) 961cdf0e10cSrcweir { 962cdf0e10cSrcweir return StringResourceImpl::getResourceIDsForLocale( locale ); 963cdf0e10cSrcweir } 964cdf0e10cSrcweir void StringResourcePersistenceImpl::removeId( const ::rtl::OUString& ResourceID ) 965cdf0e10cSrcweir throw (::com::sun::star::resource::MissingResourceException, RuntimeException, NoSupportException) 966cdf0e10cSrcweir { 967cdf0e10cSrcweir StringResourceImpl::removeId( ResourceID ); 968cdf0e10cSrcweir } 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 } 974cdf0e10cSrcweir void StringResourcePersistenceImpl::newLocale( const Locale& locale ) 975cdf0e10cSrcweir throw (ElementExistException, IllegalArgumentException, RuntimeException, NoSupportException) 976cdf0e10cSrcweir { 977cdf0e10cSrcweir StringResourceImpl::newLocale( locale ); 978cdf0e10cSrcweir } 979cdf0e10cSrcweir void StringResourcePersistenceImpl::removeLocale( const Locale& locale ) 980cdf0e10cSrcweir throw (IllegalArgumentException, RuntimeException, NoSupportException) 981cdf0e10cSrcweir { 982cdf0e10cSrcweir StringResourceImpl::removeLocale( locale ); 983cdf0e10cSrcweir } 984cdf0e10cSrcweir sal_Int32 StringResourcePersistenceImpl::getUniqueNumericId( ) 985cdf0e10cSrcweir throw (RuntimeException, NoSupportException) 986cdf0e10cSrcweir { 987cdf0e10cSrcweir return StringResourceImpl::getUniqueNumericId(); 988cdf0e10cSrcweir } 989cdf0e10cSrcweir 990cdf0e10cSrcweir // ----------------------------------------------------------------------------- 991cdf0e10cSrcweir // XStringResourcePersistence 992cdf0e10cSrcweir 993cdf0e10cSrcweir void StringResourcePersistenceImpl::store() 994cdf0e10cSrcweir throw (NoSupportException, Exception, RuntimeException) 995cdf0e10cSrcweir { 996cdf0e10cSrcweir } 997cdf0e10cSrcweir 998cdf0e10cSrcweir sal_Bool StringResourcePersistenceImpl::isModified( ) 999cdf0e10cSrcweir throw (RuntimeException) 1000cdf0e10cSrcweir { 1001cdf0e10cSrcweir ::osl::MutexGuard aGuard( getMutex() ); 1002cdf0e10cSrcweir 1003cdf0e10cSrcweir return m_bModified; 1004cdf0e10cSrcweir } 1005cdf0e10cSrcweir 1006cdf0e10cSrcweir void StringResourcePersistenceImpl::setComment( const ::rtl::OUString& Comment ) 1007cdf0e10cSrcweir throw (::com::sun::star::uno::RuntimeException) 1008cdf0e10cSrcweir { 1009cdf0e10cSrcweir m_aComment = Comment; 1010cdf0e10cSrcweir } 1011cdf0e10cSrcweir 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 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 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 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 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 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 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 ); 1302cdf0e10cSrcweir void writeInt16( sal_Int16 n ) 1303cdf0e10cSrcweir { write16BitInt( 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 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 > 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 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 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 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 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 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 ); 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 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 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 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 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 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 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 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 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 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 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 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 1811cdf0e10cSrcweir void StringResourcePersistenceImpl::implScanLocales( void ) 1812cdf0e10cSrcweir { 1813cdf0e10cSrcweir // Dummy implementation, method not called for this 1814cdf0e10cSrcweir // base class, but pure virtual not possible- 1815cdf0e10cSrcweir } 1816cdf0e10cSrcweir 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 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 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 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 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) 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 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 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 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 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 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 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 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 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 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 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 2325cdf0e10cSrcweir static ::rtl::OUString getImplementationName_StringResourceWithStorageImpl() 2326cdf0e10cSrcweir { 2327cdf0e10cSrcweir return ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.scripting.StringResourceWithStorage") ); 2328cdf0e10cSrcweir } 2329cdf0e10cSrcweir 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 2339cdf0e10cSrcweir StringResourceWithStorageImpl::StringResourceWithStorageImpl( const Reference< XComponentContext >& rxContext ) 2340cdf0e10cSrcweir : StringResourceWithStorageImpl_BASE( rxContext ) 2341cdf0e10cSrcweir , m_bStorageChanged( false ) 2342cdf0e10cSrcweir { 2343cdf0e10cSrcweir } 2344cdf0e10cSrcweir 2345cdf0e10cSrcweir // ----------------------------------------------------------------------------- 2346cdf0e10cSrcweir 2347cdf0e10cSrcweir StringResourceWithStorageImpl::~StringResourceWithStorageImpl() 2348cdf0e10cSrcweir { 2349cdf0e10cSrcweir } 2350cdf0e10cSrcweir 2351cdf0e10cSrcweir // ----------------------------------------------------------------------------- 2352cdf0e10cSrcweir // XServiceInfo 2353cdf0e10cSrcweir // ----------------------------------------------------------------------------- 2354cdf0e10cSrcweir 2355cdf0e10cSrcweir ::rtl::OUString StringResourceWithStorageImpl::getImplementationName( ) throw (RuntimeException) 2356cdf0e10cSrcweir { 2357cdf0e10cSrcweir return getImplementationName_StringResourceWithStorageImpl(); 2358cdf0e10cSrcweir } 2359cdf0e10cSrcweir 2360cdf0e10cSrcweir // ----------------------------------------------------------------------------- 2361cdf0e10cSrcweir 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 2375cdf0e10cSrcweir Sequence< ::rtl::OUString > StringResourceWithStorageImpl::getSupportedServiceNames( ) throw (RuntimeException) 2376cdf0e10cSrcweir { 2377cdf0e10cSrcweir return getSupportedServiceNames_StringResourceWithStorageImpl(); 2378cdf0e10cSrcweir } 2379cdf0e10cSrcweir 2380cdf0e10cSrcweir // ----------------------------------------------------------------------------- 2381cdf0e10cSrcweir // XInitialization 2382cdf0e10cSrcweir // ----------------------------------------------------------------------------- 2383cdf0e10cSrcweir 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 2413cdf0e10cSrcweir void StringResourceWithStorageImpl::addModifyListener( const Reference< XModifyListener >& aListener ) 2414cdf0e10cSrcweir throw (RuntimeException) 2415cdf0e10cSrcweir { 2416cdf0e10cSrcweir StringResourceImpl::addModifyListener( aListener ); 2417cdf0e10cSrcweir } 2418cdf0e10cSrcweir void StringResourceWithStorageImpl::removeModifyListener( const Reference< XModifyListener >& aListener ) 2419cdf0e10cSrcweir throw (RuntimeException) 2420cdf0e10cSrcweir { 2421cdf0e10cSrcweir StringResourceImpl::removeModifyListener( aListener ); 2422cdf0e10cSrcweir } 2423cdf0e10cSrcweir 2424cdf0e10cSrcweir // XStringResourceResolver 2425cdf0e10cSrcweir ::rtl::OUString StringResourceWithStorageImpl::resolveString( const ::rtl::OUString& ResourceID ) 2426cdf0e10cSrcweir throw (::com::sun::star::resource::MissingResourceException, RuntimeException) 2427cdf0e10cSrcweir { 2428cdf0e10cSrcweir return StringResourceImpl::resolveString( ResourceID ) ; 2429cdf0e10cSrcweir } 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 } 2435cdf0e10cSrcweir sal_Bool StringResourceWithStorageImpl::hasEntryForId( const ::rtl::OUString& ResourceID ) 2436cdf0e10cSrcweir throw (RuntimeException) 2437cdf0e10cSrcweir { 2438cdf0e10cSrcweir return StringResourceImpl::hasEntryForId( ResourceID ) ; 2439cdf0e10cSrcweir } 2440cdf0e10cSrcweir sal_Bool StringResourceWithStorageImpl::hasEntryForIdAndLocale( const ::rtl::OUString& ResourceID, 2441cdf0e10cSrcweir const Locale& locale ) 2442cdf0e10cSrcweir throw (RuntimeException) 2443cdf0e10cSrcweir { 2444cdf0e10cSrcweir return StringResourceImpl::hasEntryForIdAndLocale( ResourceID, locale ); 2445cdf0e10cSrcweir } 2446cdf0e10cSrcweir Sequence< ::rtl::OUString > StringResourceWithStorageImpl::getResourceIDs( ) 2447cdf0e10cSrcweir throw (RuntimeException) 2448cdf0e10cSrcweir { 2449cdf0e10cSrcweir return StringResourceImpl::getResourceIDs(); 2450cdf0e10cSrcweir } 2451cdf0e10cSrcweir Sequence< ::rtl::OUString > StringResourceWithStorageImpl::getResourceIDsForLocale 2452cdf0e10cSrcweir ( const Locale& locale ) throw (::com::sun::star::uno::RuntimeException) 2453cdf0e10cSrcweir { 2454cdf0e10cSrcweir return StringResourceImpl::getResourceIDsForLocale( locale ); 2455cdf0e10cSrcweir } 2456cdf0e10cSrcweir Locale StringResourceWithStorageImpl::getCurrentLocale() 2457cdf0e10cSrcweir throw (RuntimeException) 2458cdf0e10cSrcweir { 2459cdf0e10cSrcweir return StringResourceImpl::getCurrentLocale(); 2460cdf0e10cSrcweir } 2461cdf0e10cSrcweir Locale StringResourceWithStorageImpl::getDefaultLocale( ) 2462cdf0e10cSrcweir throw (RuntimeException) 2463cdf0e10cSrcweir { 2464cdf0e10cSrcweir return StringResourceImpl::getDefaultLocale(); 2465cdf0e10cSrcweir } 2466cdf0e10cSrcweir Sequence< Locale > StringResourceWithStorageImpl::getLocales( ) 2467cdf0e10cSrcweir throw (RuntimeException) 2468cdf0e10cSrcweir { 2469cdf0e10cSrcweir return StringResourceImpl::getLocales(); 2470cdf0e10cSrcweir } 2471cdf0e10cSrcweir 2472cdf0e10cSrcweir // XStringResourceManager 2473cdf0e10cSrcweir sal_Bool StringResourceWithStorageImpl::isReadOnly() 2474cdf0e10cSrcweir throw (RuntimeException) 2475cdf0e10cSrcweir { 2476cdf0e10cSrcweir return StringResourceImpl::isReadOnly(); 2477cdf0e10cSrcweir } 2478cdf0e10cSrcweir void StringResourceWithStorageImpl::setCurrentLocale( const Locale& locale, sal_Bool FindClosestMatch ) 2479cdf0e10cSrcweir throw (IllegalArgumentException, RuntimeException) 2480cdf0e10cSrcweir { 2481cdf0e10cSrcweir StringResourceImpl::setCurrentLocale( locale, FindClosestMatch ); 2482cdf0e10cSrcweir } 2483cdf0e10cSrcweir void StringResourceWithStorageImpl::setDefaultLocale( const Locale& locale ) 2484cdf0e10cSrcweir throw (IllegalArgumentException, RuntimeException,NoSupportException) 2485cdf0e10cSrcweir { 2486cdf0e10cSrcweir StringResourceImpl::setDefaultLocale( locale ); 2487cdf0e10cSrcweir } 2488cdf0e10cSrcweir void StringResourceWithStorageImpl::setString( const ::rtl::OUString& ResourceID, const ::rtl::OUString& Str ) 2489cdf0e10cSrcweir throw (NoSupportException, RuntimeException) 2490cdf0e10cSrcweir { 2491cdf0e10cSrcweir StringResourceImpl::setString( ResourceID, Str ); 2492cdf0e10cSrcweir } 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 } 2499cdf0e10cSrcweir void StringResourceWithStorageImpl::removeId( const ::rtl::OUString& ResourceID ) 2500cdf0e10cSrcweir throw (::com::sun::star::resource::MissingResourceException, RuntimeException, NoSupportException) 2501cdf0e10cSrcweir { 2502cdf0e10cSrcweir StringResourceImpl::removeId( ResourceID ); 2503cdf0e10cSrcweir } 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 } 2509cdf0e10cSrcweir void StringResourceWithStorageImpl::newLocale( const Locale& locale ) 2510cdf0e10cSrcweir throw (ElementExistException, IllegalArgumentException, RuntimeException, NoSupportException) 2511cdf0e10cSrcweir { 2512cdf0e10cSrcweir StringResourceImpl::newLocale( locale ); 2513cdf0e10cSrcweir } 2514cdf0e10cSrcweir void StringResourceWithStorageImpl::removeLocale( const Locale& locale ) 2515cdf0e10cSrcweir throw (IllegalArgumentException, RuntimeException, NoSupportException) 2516cdf0e10cSrcweir { 2517cdf0e10cSrcweir StringResourceImpl::removeLocale( locale ); 2518cdf0e10cSrcweir } 2519cdf0e10cSrcweir sal_Int32 StringResourceWithStorageImpl::getUniqueNumericId( ) 2520cdf0e10cSrcweir throw (RuntimeException, NoSupportException) 2521cdf0e10cSrcweir { 2522cdf0e10cSrcweir return StringResourceImpl::getUniqueNumericId(); 2523cdf0e10cSrcweir } 2524cdf0e10cSrcweir 2525cdf0e10cSrcweir // XStringResourcePersistence 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 2542cdf0e10cSrcweir sal_Bool StringResourceWithStorageImpl::isModified( ) 2543cdf0e10cSrcweir throw (RuntimeException) 2544cdf0e10cSrcweir { 2545cdf0e10cSrcweir return StringResourcePersistenceImpl::isModified(); 2546cdf0e10cSrcweir } 2547cdf0e10cSrcweir void StringResourceWithStorageImpl::setComment( const ::rtl::OUString& Comment ) 2548cdf0e10cSrcweir throw (::com::sun::star::uno::RuntimeException) 2549cdf0e10cSrcweir { 2550cdf0e10cSrcweir StringResourcePersistenceImpl::setComment( Comment ); 2551cdf0e10cSrcweir } 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 } 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 } 2565cdf0e10cSrcweir Sequence< ::sal_Int8 > StringResourceWithStorageImpl::exportBinary( ) 2566cdf0e10cSrcweir throw (RuntimeException) 2567cdf0e10cSrcweir { 2568cdf0e10cSrcweir return StringResourcePersistenceImpl::exportBinary(); 2569cdf0e10cSrcweir } 2570cdf0e10cSrcweir void StringResourceWithStorageImpl::importBinary( const Sequence< ::sal_Int8 >& Data ) 2571cdf0e10cSrcweir throw (IllegalArgumentException, RuntimeException) 2572cdf0e10cSrcweir { 2573cdf0e10cSrcweir StringResourcePersistenceImpl::importBinary( Data ); 2574cdf0e10cSrcweir } 2575cdf0e10cSrcweir 2576cdf0e10cSrcweir // ----------------------------------------------------------------------------- 2577cdf0e10cSrcweir // XStringResourceWithStorage 2578cdf0e10cSrcweir 2579cdf0e10cSrcweir void StringResourceWithStorageImpl::storeAsStorage( const Reference< XStorage >& Storage ) 2580cdf0e10cSrcweir throw (Exception, RuntimeException) 2581cdf0e10cSrcweir { 2582cdf0e10cSrcweir setStorage( Storage ); 2583cdf0e10cSrcweir store(); 2584cdf0e10cSrcweir } 2585cdf0e10cSrcweir 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 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 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 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 2663cdf0e10cSrcweir static ::rtl::OUString getImplementationName_StringResourceWithLocationImpl() 2664cdf0e10cSrcweir { 2665cdf0e10cSrcweir return ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.scripting.StringResourceWithLocation") ); 2666cdf0e10cSrcweir } 2667cdf0e10cSrcweir 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 2677cdf0e10cSrcweir StringResourceWithLocationImpl::StringResourceWithLocationImpl( const Reference< XComponentContext >& rxContext ) 2678cdf0e10cSrcweir : StringResourceWithLocationImpl_BASE( rxContext ) 2679cdf0e10cSrcweir , m_bLocationChanged( false ) 2680cdf0e10cSrcweir { 2681cdf0e10cSrcweir } 2682cdf0e10cSrcweir 2683cdf0e10cSrcweir // ----------------------------------------------------------------------------- 2684cdf0e10cSrcweir 2685cdf0e10cSrcweir StringResourceWithLocationImpl::~StringResourceWithLocationImpl() 2686cdf0e10cSrcweir { 2687cdf0e10cSrcweir } 2688cdf0e10cSrcweir 2689cdf0e10cSrcweir // ----------------------------------------------------------------------------- 2690cdf0e10cSrcweir // XServiceInfo 2691cdf0e10cSrcweir // ----------------------------------------------------------------------------- 2692cdf0e10cSrcweir 2693cdf0e10cSrcweir ::rtl::OUString StringResourceWithLocationImpl::getImplementationName( ) throw (RuntimeException) 2694cdf0e10cSrcweir { 2695cdf0e10cSrcweir return getImplementationName_StringResourceWithLocationImpl(); 2696cdf0e10cSrcweir } 2697cdf0e10cSrcweir 2698cdf0e10cSrcweir // ----------------------------------------------------------------------------- 2699cdf0e10cSrcweir 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 2713cdf0e10cSrcweir Sequence< ::rtl::OUString > StringResourceWithLocationImpl::getSupportedServiceNames( ) throw (RuntimeException) 2714cdf0e10cSrcweir { 2715cdf0e10cSrcweir return getSupportedServiceNames_StringResourceWithLocationImpl(); 2716cdf0e10cSrcweir } 2717cdf0e10cSrcweir 2718cdf0e10cSrcweir // ----------------------------------------------------------------------------- 2719cdf0e10cSrcweir // XInitialization 2720cdf0e10cSrcweir // ----------------------------------------------------------------------------- 2721cdf0e10cSrcweir 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 2768cdf0e10cSrcweir void StringResourceWithLocationImpl::addModifyListener( const Reference< XModifyListener >& aListener ) 2769cdf0e10cSrcweir throw (RuntimeException) 2770cdf0e10cSrcweir { 2771cdf0e10cSrcweir StringResourceImpl::addModifyListener( aListener ); 2772cdf0e10cSrcweir } 2773cdf0e10cSrcweir void StringResourceWithLocationImpl::removeModifyListener( const Reference< XModifyListener >& aListener ) 2774cdf0e10cSrcweir throw (RuntimeException) 2775cdf0e10cSrcweir { 2776cdf0e10cSrcweir StringResourceImpl::removeModifyListener( aListener ); 2777cdf0e10cSrcweir } 2778cdf0e10cSrcweir 2779cdf0e10cSrcweir // XStringResourceResolver 2780cdf0e10cSrcweir ::rtl::OUString StringResourceWithLocationImpl::resolveString( const ::rtl::OUString& ResourceID ) 2781cdf0e10cSrcweir throw (::com::sun::star::resource::MissingResourceException, RuntimeException) 2782cdf0e10cSrcweir { 2783cdf0e10cSrcweir return StringResourceImpl::resolveString( ResourceID ) ; 2784cdf0e10cSrcweir } 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 } 2790cdf0e10cSrcweir sal_Bool StringResourceWithLocationImpl::hasEntryForId( const ::rtl::OUString& ResourceID ) 2791cdf0e10cSrcweir throw (RuntimeException) 2792cdf0e10cSrcweir { 2793cdf0e10cSrcweir return StringResourceImpl::hasEntryForId( ResourceID ) ; 2794cdf0e10cSrcweir } 2795cdf0e10cSrcweir sal_Bool StringResourceWithLocationImpl::hasEntryForIdAndLocale( const ::rtl::OUString& ResourceID, 2796cdf0e10cSrcweir const Locale& locale ) 2797cdf0e10cSrcweir throw (RuntimeException) 2798cdf0e10cSrcweir { 2799cdf0e10cSrcweir return StringResourceImpl::hasEntryForIdAndLocale( ResourceID, locale ); 2800cdf0e10cSrcweir } 2801cdf0e10cSrcweir Sequence< ::rtl::OUString > StringResourceWithLocationImpl::getResourceIDs( ) 2802cdf0e10cSrcweir throw (RuntimeException) 2803cdf0e10cSrcweir { 2804cdf0e10cSrcweir return StringResourceImpl::getResourceIDs(); 2805cdf0e10cSrcweir } 2806cdf0e10cSrcweir Sequence< ::rtl::OUString > StringResourceWithLocationImpl::getResourceIDsForLocale 2807cdf0e10cSrcweir ( const Locale& locale ) throw (::com::sun::star::uno::RuntimeException) 2808cdf0e10cSrcweir { 2809cdf0e10cSrcweir return StringResourceImpl::getResourceIDsForLocale( locale ); 2810cdf0e10cSrcweir } 2811cdf0e10cSrcweir Locale StringResourceWithLocationImpl::getCurrentLocale() 2812cdf0e10cSrcweir throw (RuntimeException) 2813cdf0e10cSrcweir { 2814cdf0e10cSrcweir return StringResourceImpl::getCurrentLocale(); 2815cdf0e10cSrcweir } 2816cdf0e10cSrcweir Locale StringResourceWithLocationImpl::getDefaultLocale( ) 2817cdf0e10cSrcweir throw (RuntimeException) 2818cdf0e10cSrcweir { 2819cdf0e10cSrcweir return StringResourceImpl::getDefaultLocale(); 2820cdf0e10cSrcweir } 2821cdf0e10cSrcweir Sequence< Locale > StringResourceWithLocationImpl::getLocales( ) 2822cdf0e10cSrcweir throw (RuntimeException) 2823cdf0e10cSrcweir { 2824cdf0e10cSrcweir return StringResourceImpl::getLocales(); 2825cdf0e10cSrcweir } 2826cdf0e10cSrcweir 2827cdf0e10cSrcweir // XStringResourceManager 2828cdf0e10cSrcweir sal_Bool StringResourceWithLocationImpl::isReadOnly() 2829cdf0e10cSrcweir throw (RuntimeException) 2830cdf0e10cSrcweir { 2831cdf0e10cSrcweir return StringResourceImpl::isReadOnly(); 2832cdf0e10cSrcweir } 2833cdf0e10cSrcweir void StringResourceWithLocationImpl::setCurrentLocale( const Locale& locale, sal_Bool FindClosestMatch ) 2834cdf0e10cSrcweir throw (IllegalArgumentException, RuntimeException) 2835cdf0e10cSrcweir { 2836cdf0e10cSrcweir StringResourceImpl::setCurrentLocale( locale, FindClosestMatch ); 2837cdf0e10cSrcweir } 2838cdf0e10cSrcweir void StringResourceWithLocationImpl::setDefaultLocale( const Locale& locale ) 2839cdf0e10cSrcweir throw (IllegalArgumentException, RuntimeException,NoSupportException) 2840cdf0e10cSrcweir { 2841cdf0e10cSrcweir StringResourceImpl::setDefaultLocale( locale ); 2842cdf0e10cSrcweir } 2843cdf0e10cSrcweir void StringResourceWithLocationImpl::setString( const ::rtl::OUString& ResourceID, const ::rtl::OUString& Str ) 2844cdf0e10cSrcweir throw (NoSupportException, RuntimeException) 2845cdf0e10cSrcweir { 2846cdf0e10cSrcweir StringResourceImpl::setString( ResourceID, Str ); 2847cdf0e10cSrcweir } 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 } 2854cdf0e10cSrcweir void StringResourceWithLocationImpl::removeId( const ::rtl::OUString& ResourceID ) 2855cdf0e10cSrcweir throw (::com::sun::star::resource::MissingResourceException, RuntimeException, NoSupportException) 2856cdf0e10cSrcweir { 2857cdf0e10cSrcweir StringResourceImpl::removeId( ResourceID ); 2858cdf0e10cSrcweir } 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 } 2864cdf0e10cSrcweir void StringResourceWithLocationImpl::newLocale( const Locale& locale ) 2865cdf0e10cSrcweir throw (ElementExistException, IllegalArgumentException, RuntimeException, NoSupportException) 2866cdf0e10cSrcweir { 2867cdf0e10cSrcweir StringResourceImpl::newLocale( locale ); 2868cdf0e10cSrcweir } 2869cdf0e10cSrcweir void StringResourceWithLocationImpl::removeLocale( const Locale& locale ) 2870cdf0e10cSrcweir throw (IllegalArgumentException, RuntimeException, NoSupportException) 2871cdf0e10cSrcweir { 2872cdf0e10cSrcweir StringResourceImpl::removeLocale( locale ); 2873cdf0e10cSrcweir } 2874cdf0e10cSrcweir sal_Int32 StringResourceWithLocationImpl::getUniqueNumericId( ) 2875cdf0e10cSrcweir throw (RuntimeException, NoSupportException) 2876cdf0e10cSrcweir { 2877cdf0e10cSrcweir return StringResourceImpl::getUniqueNumericId(); 2878cdf0e10cSrcweir } 2879cdf0e10cSrcweir 2880cdf0e10cSrcweir // XStringResourcePersistence 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 2899cdf0e10cSrcweir sal_Bool StringResourceWithLocationImpl::isModified( ) 2900cdf0e10cSrcweir throw (RuntimeException) 2901cdf0e10cSrcweir { 2902cdf0e10cSrcweir return StringResourcePersistenceImpl::isModified(); 2903cdf0e10cSrcweir } 2904cdf0e10cSrcweir void StringResourceWithLocationImpl::setComment( const ::rtl::OUString& Comment ) 2905cdf0e10cSrcweir throw (::com::sun::star::uno::RuntimeException) 2906cdf0e10cSrcweir { 2907cdf0e10cSrcweir StringResourcePersistenceImpl::setComment( Comment ); 2908cdf0e10cSrcweir } 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 } 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 } 2922cdf0e10cSrcweir Sequence< ::sal_Int8 > StringResourceWithLocationImpl::exportBinary( ) 2923cdf0e10cSrcweir throw (RuntimeException) 2924cdf0e10cSrcweir { 2925cdf0e10cSrcweir return StringResourcePersistenceImpl::exportBinary(); 2926cdf0e10cSrcweir } 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 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 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 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 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 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 { 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 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