sysstatemgmt/ssmutilityplugins/ssmlocaleobserversup/src/ssmlocaleobserversup.cpp
branchRCL_3
changeset 21 ccb4f6b3db21
parent 0 4e1aa6a622a0
child 22 8cb079868133
--- 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;
+    }