--- a/sysstatemgmt/ssmutilityplugins/ssmlocaleobserversup/src/ssmlocaleobserversup.cpp Thu Aug 19 11:09:10 2010 +0300
+++ b/sysstatemgmt/ssmutilityplugins/ssmlocaleobserversup/src/ssmlocaleobserversup.cpp Tue Aug 31 16:29:05 2010 +0300
@@ -1,5 +1,5 @@
/*
-* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of "Eclipse Public License v1.0"
@@ -19,6 +19,7 @@
#include <bautils.h>
#include <connect/sbdefs.h>
#include <s32file.h>
+#include <e32reg.h>
#include "ssmmapperutilitystatic.h"
#include "ssmlocaleobserversup.h"
@@ -30,9 +31,8 @@
*/
_LIT( KLocaleDataDir, "\\private\\2000d766\\localedata\\" );
-/** Name is LocaleData.Dnn or CommonData.D00 */
-_LIT( KFileName, "LocaleData.D" );
-_LIT( KCommonFileName, "CommonData.D" );
+/** Name is RegionData.Dnn */
+_LIT( KFileName, "RegionData.D" );
/**
* Version number from 1..255 to indicate data
@@ -41,6 +41,9 @@
*/
const TInt KCurrentVersionNumber = 2; // For fixing TChar r/w
+/** The maximum number of regions to be appended to the hash set. */
+const TInt KMaxNumberOfRegions = 56;
+
// ======== LOCAL FUNCTIONS ========
// ---------------------------------------------------------------------------
@@ -64,7 +67,7 @@
static HBufC* MakeFileNameL( const TDesC& aPath, const TDesC& aName, const TInt aCode )
{
FUNC_LOG;
- INFO_3( "Locale data dir: %S, file name base: %S, lang code: %d", &aPath, &aName, aCode );
+ INFO_3( "Region data dir: %S, file name base: %S, region code: %d", &aPath, &aName, aCode );
TInt length = aPath.Length();
@@ -84,11 +87,21 @@
}
ptr.AppendNum( aCode );
- INFO_1( "Locale data file: %S", buffer );
+ INFO_1( "Region data file: %S", buffer );
return buffer;
}
+inline TUint32 HashLangRegionMappingFunction(const TLanguageRegion& aMapping)
+ {
+ return aMapping.iLanguage;
+ }
+
+inline TBool HashLangRegionMappingIdentityRelation(const TLanguageRegion& aMapping1,
+ const TLanguageRegion& aMapping2)
+ {
+ return (aMapping1.iLanguage == aMapping2.iLanguage);
+ }
// ======== MEMBER FUNCTIONS ========
@@ -112,6 +125,7 @@
FUNC_LOG;
Cancel();
+ iLangRegionMappingHashSet.Close();
delete iEnvChangeNotifier;
iFs.Close();
iProperty.Close();
@@ -133,7 +147,7 @@
if ( !iRestoreActive && ( changes & EChangesLocale ) )
{
TParsePtrC parse( KLocaleDataDir );
- SaveLocaleL( parse.FullName() );
+ SaveRegionL( parse.FullName() );
}
if( changes & EChangesSystemTime )
@@ -185,9 +199,9 @@
iRestoreActive = EFalse;
TParsePtrC parse( KLocaleDataDir );
- TRAP( err, LoadLocaleL( parse.FullName() ) );
+ TRAP( err, LoadRegionL( parse.FullName() ) );
ERROR( err, "Failed to load locale" );
- // Can not do anything about the error - just continue.
+ // Cannot do anything about the error - just continue.
}
}
}
@@ -218,6 +232,8 @@
ERROR( err, "Failed to connect to file server" );
User::LeaveIfError( err );
+ InitializeRegionMappingL();
+
TRAP( err, iEnvChangeNotifier = CEnvironmentChangeNotifier::NewL(
CActive::EPriorityStandard,
TCallBack( EnvChangeNotifierCallback, this ) ) );
@@ -235,8 +251,8 @@
FUNC_LOG;
TParsePtrC parse( KLocaleDataDir );
- TRAPD_ERR( err, LoadLocaleL( parse.FullName() ) );
- ERROR( err, "Failed to load locale data the first time" );
+ TRAPD_ERR( err, LoadRegionL( parse.FullName() ) );
+ ERROR( err, "Failed to load region data the first time" );
if ( iEnvChangeNotifier )
{
@@ -268,7 +284,8 @@
//
CSsmLocaleObserverSup::CSsmLocaleObserverSup()
: CActive( EPriorityNormal ),
- iRestoreActive( EFalse )
+ iRestoreActive( EFalse ),
+ iLangRegionMappingHashSet( &::HashLangRegionMappingFunction, &::HashLangRegionMappingIdentityRelation )
{
FUNC_LOG;
@@ -291,15 +308,16 @@
// ---------------------------------------------------------------------------
-// CSsmLocaleObserverSup::SaveLocaleL
+// CSsmLocaleObserverSup::SaveRegionL
// ---------------------------------------------------------------------------
//
-void CSsmLocaleObserverSup::SaveLocaleL( const TDesC& aPath )
+void CSsmLocaleObserverSup::SaveRegionL( const TDesC& aPath )
{
FUNC_LOG;
- INFO( "Saving locale data" );
-
- HBufC* fName = MakeFileNameL( aPath, KFileName, User::Language() );
+ INFO( "Saving region data" );
+
+ TInt region = MappedRegionL(User::Language());
+ HBufC* fName = MakeFileNameL( aPath, KFileName, region);
CleanupStack::PushL( fName );
RFileWriteStream fStream;
@@ -365,9 +383,6 @@
fStream.WriteInt8L( locale.NegativeCurrencySymbolOpposite() );
fStream.WriteInt16L( locale.DigitType() );
- // Then save display language independent data
- SaveIndependentDataL( locale, aPath );
-
// If CommitL leaves it means probably full disk.
// It is here assumed that data has not been changed if this leaves.
fStream.CommitL();
@@ -378,15 +393,16 @@
// ---------------------------------------------------------------------------
-// CSsmLocaleObserverSup::LoadLocaleL
+// CSsmLocaleObserverSup::LoadRegionL
// ---------------------------------------------------------------------------
//
-void CSsmLocaleObserverSup::LoadLocaleL( const TDesC& aPath )
+void CSsmLocaleObserverSup::LoadRegionL( const TDesC& aPath )
{
FUNC_LOG;
- INFO( "Loading locale data" );
+ INFO( "Loading region data" );
- HBufC* fName = MakeFileNameL( aPath, KFileName, User::Language() );
+ TInt region = MappedRegionL(User::Language());
+ HBufC* fName = MakeFileNameL( aPath, KFileName, region);
CleanupStack::PushL( fName );
TLocale locale; // copy current values
@@ -404,7 +420,7 @@
if ( err == KErrNone )
{
TInt version = fStream.ReadInt8L();
- INFO_1( "Locale file version: %d", version );
+ INFO_1( "Region file version: %d", version );
locale.SetCountryCode( fStream.ReadInt16L() );
fStream.ReadInt16L(); // obsolete
@@ -450,10 +466,6 @@
locale.SetDigitType( static_cast< TDigitType >( fStream.ReadInt16L() ) );
}
- // Then patch data with locale independent data (code 00)
- // No changes to locale if no independent data can be found (the very first boot)
- LoadIndependentDataL( locale, aPath );
-
// Save changes to the system.
locale.Set();
@@ -461,93 +473,83 @@
CleanupStack::PopAndDestroy( fName );
}
+void CSsmLocaleObserverSup::InitializeRegionMappingL()
+ {
+ //Reserve the memory for the number of mappings to be appended
+ iLangRegionMappingHashSet.ReserveL( KMaxNumberOfRegions );
+
+ //Insert the Language - Region mapping
+ iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangEnglish, ERegGBR ) );
+ iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangFrench, ERegFRA ) );
+ iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangGerman, ERegDEU ) );
+ iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangSpanish, ERegESP ) );
+ iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangItalian, ERegITA ) );
+ iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangSwedish, ERegSWE ) );
+ iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangDanish, ERegDNK ) );
+ iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangNorwegian, ERegNOR ) );
+ iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangFinnish, ERegFIN ) );
+ iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangAmerican, ERegUSA ) );
+ iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangPortuguese, ERegPRT ) );
+ iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangTurkish, ERegTUR ) );
+ iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangIcelandic, ERegISL ) );
+ iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangRussian, ERegRUS ) );
+ iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangHungarian, ERegHUN ) );
+ iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangDutch, ERegNLD ) );
+ iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangBelgianFlemish, ERegBEL ) );
+ iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangCzech, ERegCZE ) );
+ iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangSlovak, ERegSVK ) );
+ iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangPolish, ERegPOL ) );
+ iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangSlovenian, ERegSVN ) );
+ iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangTaiwanChinese, ERegTWN ) );
+ iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangHongKongChinese, ERegHKG ) );
+ iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangPrcChinese, ERegCHN ) );
+ iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangJapanese, ERegJPN ) );
+ iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangThai, ERegTHA ) );
+ iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangArabic, ERegARE ) );
+ iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangTagalog, ERegPHL ) );
+ iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangBulgarian, ERegBGR ) );
+ iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangCatalan, ERegESP ) );
+ iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangCroatian, ERegHRV ) );
+ iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangEstonian, ERegEST ) );
+ iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangFarsi, ERegIRN ) );
+ iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangCanadianFrench, ERegCAN ) );
+ iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangGreek, ERegGRC ) );
+ iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangHebrew, ERegISR ) );
+ iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangHindi, ERegIND ) );
+ iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangIndonesian, ERegIDN ) );
+ iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangLatvian, ERegLVA ) );
+ iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangLithuanian, ERegLTU ) );
+ iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangMalay, ERegMYS ) );
+ iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangBrazilianPortuguese, ERegBRA ) );
+ iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangRomanian, ERegROU ) );
+ iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangSerbian, ERegSCG ) );
+ iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangLatinAmericanSpanish, ERegMEX ));
+ iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangUkrainian, ERegUKR ) );
+ iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangUrdu, ERegPAK ) );
+ iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangVietnamese, ERegVNM ) );
+#ifdef __E32LANG_H__
+ // 5.0
+ iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangBasque, ERegESP ) );
+ iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangGalician, ERegESP ) );
+#endif //__E32LANG_H__
+#if !defined(__SERIES60_31__)
+ iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangEnglish_Apac, ERegGBR ) );
+ iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangEnglish_Taiwan, ERegTWN ) );
+ iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangEnglish_HongKong, ERegHKG ) );
+ iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangEnglish_Prc, ERegCHN ) );
+ iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangEnglish_Japan, ERegJPN ) );
+ iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangEnglish_Thailand, ERegTHA ) );
+ iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangMalay_Apac, ERegMYS ) );
+#endif //!defined(__SERIES60_31__)
+ }
// ---------------------------------------------------------------------------
-// CSsmLocaleObserverSup::SaveIndependentDataL
+// CSsmLocaleObserverSup::MappedRegionL
// ---------------------------------------------------------------------------
//
-void CSsmLocaleObserverSup::SaveIndependentDataL(
- const TLocale& aLocale,
- const TDesC& aPath )
+TInt CSsmLocaleObserverSup::MappedRegionL(const TInt aLanguage)
{
FUNC_LOG;
-
- // Get old independent data, if any.
- TLocale savedLoc;
- TRAPD( err, LoadIndependentDataL( savedLoc, aPath ) );
- ERROR( err, "Failed to load locale independent data" );
-
- HBufC* fName = MakeFileNameL( aPath, KCommonFileName, 0 );
- CleanupStack::PushL( fName );
- RFileWriteStream fStream;
- CleanupClosePushL( fStream );
-
- err = iFs.MkDirAll( *fName ); // Ignore errors
- err = fStream.Create( iFs, *fName, EFileWrite );
- if ( err == KErrAlreadyExists )
- {
- // Override
- err = fStream.Open( iFs, *fName, EFileWrite );
- ERROR_1( err, "Failed to create stream %S", fName );
- }
- User::LeaveIfError( err );
-
- // Write first the version number to enable support for file format changes.
- fStream.WriteInt8L( KCurrentVersionNumber );
- fStream.WriteInt32L( 0 ); // Universal time offset is not part of TLocale
- // any more. Write zero here to keep file structure.
- // Clock format is also common.
- fStream.WriteUint32L( aLocale.ClockFormat() );
- fStream.WriteUint32L( 0 ); // reserved 2
- fStream.WriteUint32L( 0 ); // reserved 3
-
- fStream.CommitL();
-
- CleanupStack::PopAndDestroy( &fStream );
- CleanupStack::PopAndDestroy( fName );
- }
-
-
-// ---------------------------------------------------------------------------
-// CSsmLocaleObserverSup::LoadIndependentDataL
-// ---------------------------------------------------------------------------
-//
-void CSsmLocaleObserverSup::LoadIndependentDataL(
- TLocale& aLocale,
- const TDesC& aPath )
- {
- FUNC_LOG;
-
- HBufC* fName = MakeFileNameL( aPath, KCommonFileName, 0 );
- CleanupStack::PushL( fName );
-
- RFileReadStream fStream;
- CleanupClosePushL( fStream );
- TInt err = fStream.Open( iFs, *fName, EFileRead );
- if ( err != KErrNotFound && err != KErrPathNotFound )
- {
- ERROR_1( err, "Failed to open stream %S", fName );
- // Data file is missing upon the first boot or when switching into a
- // language for the first time
- }
-
- if ( err == KErrNotFound || err == KErrPathNotFound )
- {
- // File not found --> Not an error because
- // this is a new file and older builds do not have this file.
- INFO( "No locale data found" );
- }
- else
- {
- User::LeaveIfError( err );
-
- fStream.ReadInt8L(); // Version.
- fStream.ReadInt32L(); // Universal time offset was stored here.
- aLocale.SetClockFormat( ( TClockFormat ) fStream.ReadUint32L() );
- fStream.ReadUint32L(); // reserved 2
- fStream.ReadUint32L(); // reserved 3
- }
-
- CleanupStack::PopAndDestroy( &fStream );
- CleanupStack::PopAndDestroy( fName );
- }
+ TLanguageRegion langRegion = iLangRegionMappingHashSet.FindL(TLanguageRegion(aLanguage));
+ return langRegion.iRegion;
+ }