sysstatemgmt/ssmutilityplugins/ssmlocaleobserversup/src/ssmlocaleobserversup.cpp
branchRCL_3
changeset 22 8cb079868133
parent 21 ccb4f6b3db21
equal deleted inserted replaced
21:ccb4f6b3db21 22:8cb079868133
     1 /*
     1 /*
     2 * Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
     2 * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
     3 * All rights reserved.
     3 * All rights reserved.
     4 * This component and the accompanying materials are made available
     4 * This component and the accompanying materials are made available
     5 * under the terms of "Eclipse Public License v1.0"
     5 * under the terms of "Eclipse Public License v1.0"
     6 * which accompanies this distribution, and is available
     6 * which accompanies this distribution, and is available
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
    17 
    17 
    18 #include <bacntf.h>
    18 #include <bacntf.h>
    19 #include <bautils.h>
    19 #include <bautils.h>
    20 #include <connect/sbdefs.h>
    20 #include <connect/sbdefs.h>
    21 #include <s32file.h>
    21 #include <s32file.h>
    22 #include <e32reg.h>
       
    23 
    22 
    24 #include "ssmmapperutilitystatic.h"
    23 #include "ssmmapperutilitystatic.h"
    25 #include "ssmlocaleobserversup.h"
    24 #include "ssmlocaleobserversup.h"
    26 #include "trace.h"
    25 #include "trace.h"
    27 
    26 
    29 * Directory to store user-specific locale data files.
    28 * Directory to store user-specific locale data files.
    30 * Private directory of SSM Utility Server.
    29 * Private directory of SSM Utility Server.
    31 */
    30 */
    32 _LIT( KLocaleDataDir, "\\private\\2000d766\\localedata\\" );
    31 _LIT( KLocaleDataDir, "\\private\\2000d766\\localedata\\" );
    33 
    32 
    34 /** Name is RegionData.Dnn */
    33 /** Name is LocaleData.Dnn or CommonData.D00 */
    35 _LIT( KFileName, "RegionData.D" );
    34 _LIT( KFileName, "LocaleData.D" );
       
    35 _LIT( KCommonFileName, "CommonData.D" );
    36 
    36 
    37 /**
    37 /**
    38 * Version number from 1..255 to indicate data
    38 * Version number from 1..255 to indicate data
    39 * format of the file. To make dynamic data format fixes possible we need
    39 * format of the file. To make dynamic data format fixes possible we need
    40 * version ID.
    40 * version ID.
    41 */
    41 */
    42 const TInt KCurrentVersionNumber = 2; // For fixing TChar r/w
    42 const TInt KCurrentVersionNumber = 2; // For fixing TChar r/w
    43 
    43 
    44 /** The maximum number of regions to be appended to the hash set. */
       
    45 const TInt KMaxNumberOfRegions = 56;
       
    46 
       
    47 // ======== LOCAL FUNCTIONS ========
    44 // ======== LOCAL FUNCTIONS ========
    48 
    45 
    49 // ---------------------------------------------------------------------------
    46 // ---------------------------------------------------------------------------
    50 // EnvChangeNotifierCallbackL
    47 // EnvChangeNotifierCallbackL
    51 // ---------------------------------------------------------------------------
    48 // ---------------------------------------------------------------------------
    65 // ---------------------------------------------------------------------------
    62 // ---------------------------------------------------------------------------
    66 //
    63 //
    67 static HBufC* MakeFileNameL( const TDesC& aPath, const TDesC& aName, const TInt aCode )
    64 static HBufC* MakeFileNameL( const TDesC& aPath, const TDesC& aName, const TInt aCode )
    68     {
    65     {
    69     FUNC_LOG;
    66     FUNC_LOG;
    70     INFO_3( "Region data dir: %S, file name base: %S, region code: %d", &aPath, &aName, aCode );
    67     INFO_3( "Locale data dir: %S, file name base: %S, lang code: %d", &aPath, &aName, aCode );
    71 
    68 
    72     TInt length = aPath.Length();
    69     TInt length = aPath.Length();
    73 
    70 
    74     // Reserve spave for language code also
    71     // Reserve spave for language code also
    75     HBufC* buffer = HBufC::NewL( length + aName.Length() + 10 );
    72     HBufC* buffer = HBufC::NewL( length + aName.Length() + 10 );
    85         {
    82         {
    86         ptr.AppendNum( 0 ); // add leading zero to the extention
    83         ptr.AppendNum( 0 ); // add leading zero to the extention
    87         }
    84         }
    88     ptr.AppendNum( aCode );
    85     ptr.AppendNum( aCode );
    89 
    86 
    90     INFO_1( "Region data file: %S", buffer );
    87     INFO_1( "Locale data file: %S", buffer );
    91 
    88 
    92     return buffer;
    89     return buffer;
    93     }
    90     }
    94 
    91 
    95 inline TUint32 HashLangRegionMappingFunction(const TLanguageRegion& aMapping)
       
    96     {
       
    97     return aMapping.iLanguage;
       
    98     }
       
    99 
       
   100 inline TBool HashLangRegionMappingIdentityRelation(const TLanguageRegion& aMapping1,
       
   101     const TLanguageRegion& aMapping2)
       
   102     {
       
   103     return (aMapping1.iLanguage == aMapping2.iLanguage);
       
   104     }
       
   105 
    92 
   106 // ======== MEMBER FUNCTIONS ========
    93 // ======== MEMBER FUNCTIONS ========
   107 
    94 
   108 // ---------------------------------------------------------------------------
    95 // ---------------------------------------------------------------------------
   109 // CSsmLocaleObserverSup::NewL
    96 // CSsmLocaleObserverSup::NewL
   123 CSsmLocaleObserverSup::~CSsmLocaleObserverSup()
   110 CSsmLocaleObserverSup::~CSsmLocaleObserverSup()
   124     {
   111     {
   125     FUNC_LOG;
   112     FUNC_LOG;
   126 
   113 
   127     Cancel();
   114     Cancel();
   128     iLangRegionMappingHashSet.Close();
       
   129     delete iEnvChangeNotifier;
   115     delete iEnvChangeNotifier;
   130     iFs.Close();
   116     iFs.Close();
   131     iProperty.Close();
   117     iProperty.Close();
   132     }
   118     }
   133 
   119 
   145         changes, iRestoreActive );
   131         changes, iRestoreActive );
   146 
   132 
   147     if ( !iRestoreActive && ( changes & EChangesLocale ) )
   133     if ( !iRestoreActive && ( changes & EChangesLocale ) )
   148         {
   134         {
   149         TParsePtrC parse( KLocaleDataDir );
   135         TParsePtrC parse( KLocaleDataDir );
   150         SaveRegionL( parse.FullName() );
   136         SaveLocaleL( parse.FullName() );
   151         }
   137         }
   152 
   138 
   153     if( changes & EChangesSystemTime )
   139     if( changes & EChangesSystemTime )
   154         {
   140         {
   155         INFO( "Persisting HAL settings" );
   141         INFO( "Persisting HAL settings" );
   197                 INFO( "Restore finished" );
   183                 INFO( "Restore finished" );
   198 
   184 
   199                 iRestoreActive = EFalse;
   185                 iRestoreActive = EFalse;
   200 
   186 
   201                 TParsePtrC parse( KLocaleDataDir );
   187                 TParsePtrC parse( KLocaleDataDir );
   202                 TRAP( err, LoadRegionL( parse.FullName() ) );
   188                 TRAP( err, LoadLocaleL( parse.FullName() ) );
   203                 ERROR( err, "Failed to load locale" );
   189                 ERROR( err, "Failed to load locale" );
   204                 // Cannot do anything about the error - just continue.
   190                 // Can not do anything about the error - just continue.
   205                 }
   191                 }
   206             }
   192             }
   207         }
   193         }
   208     }
   194     }
   209 
   195 
   230 
   216 
   231     TInt err = iFs.Connect();
   217     TInt err = iFs.Connect();
   232     ERROR( err, "Failed to connect to file server" );
   218     ERROR( err, "Failed to connect to file server" );
   233     User::LeaveIfError( err );
   219     User::LeaveIfError( err );
   234 
   220 
   235     InitializeRegionMappingL();
       
   236     
       
   237     TRAP( err, iEnvChangeNotifier = CEnvironmentChangeNotifier::NewL(
   221     TRAP( err, iEnvChangeNotifier = CEnvironmentChangeNotifier::NewL(
   238         CActive::EPriorityStandard,
   222         CActive::EPriorityStandard,
   239         TCallBack( EnvChangeNotifierCallback, this ) ) );
   223         TCallBack( EnvChangeNotifierCallback, this ) ) );
   240     ERROR( err, "Failed to create environment change notifier" );
   224     ERROR( err, "Failed to create environment change notifier" );
   241     User::LeaveIfError( err );
   225     User::LeaveIfError( err );
   249 void CSsmLocaleObserverSup::StartL()
   233 void CSsmLocaleObserverSup::StartL()
   250     {
   234     {
   251     FUNC_LOG;
   235     FUNC_LOG;
   252 
   236 
   253     TParsePtrC parse( KLocaleDataDir );
   237     TParsePtrC parse( KLocaleDataDir );
   254     TRAPD_ERR( err, LoadRegionL( parse.FullName() ) );
   238     TRAPD_ERR( err, LoadLocaleL( parse.FullName() ) );
   255     ERROR( err, "Failed to load region data the first time" );
   239     ERROR( err, "Failed to load locale data the first time" );
   256 
   240 
   257     if ( iEnvChangeNotifier )
   241     if ( iEnvChangeNotifier )
   258         {
   242         {
   259         iEnvChangeNotifier->Start();
   243         iEnvChangeNotifier->Start();
   260         }
   244         }
   282 // CSsmLocaleObserverSup::CSsmLocaleObserverSup
   266 // CSsmLocaleObserverSup::CSsmLocaleObserverSup
   283 // ---------------------------------------------------------------------------
   267 // ---------------------------------------------------------------------------
   284 //
   268 //
   285 CSsmLocaleObserverSup::CSsmLocaleObserverSup()
   269 CSsmLocaleObserverSup::CSsmLocaleObserverSup()
   286   : CActive( EPriorityNormal ),
   270   : CActive( EPriorityNormal ),
   287     iRestoreActive( EFalse ),
   271     iRestoreActive( EFalse )
   288     iLangRegionMappingHashSet( &::HashLangRegionMappingFunction, &::HashLangRegionMappingIdentityRelation )
       
   289     {
   272     {
   290     FUNC_LOG;
   273     FUNC_LOG;
   291 
   274 
   292     CActiveScheduler::Add( this );
   275     CActiveScheduler::Add( this );
   293     }
   276     }
   306     SetActive();
   289     SetActive();
   307     }
   290     }
   308 
   291 
   309 
   292 
   310 // ---------------------------------------------------------------------------
   293 // ---------------------------------------------------------------------------
   311 // CSsmLocaleObserverSup::SaveRegionL
   294 // CSsmLocaleObserverSup::SaveLocaleL
   312 // ---------------------------------------------------------------------------
   295 // ---------------------------------------------------------------------------
   313 //
   296 //
   314 void CSsmLocaleObserverSup::SaveRegionL( const TDesC& aPath )
   297 void CSsmLocaleObserverSup::SaveLocaleL( const TDesC& aPath )
   315     {
   298     {
   316     FUNC_LOG;
   299     FUNC_LOG;
   317     INFO( "Saving region data" );
   300     INFO( "Saving locale data" );
   318     
   301 
   319     TInt region = MappedRegionL(User::Language());
   302     HBufC* fName = MakeFileNameL( aPath, KFileName, User::Language() );
   320     HBufC* fName = MakeFileNameL( aPath, KFileName, region);
       
   321     CleanupStack::PushL( fName );
   303     CleanupStack::PushL( fName );
   322 
   304 
   323     RFileWriteStream fStream;
   305     RFileWriteStream fStream;
   324     CleanupClosePushL( fStream );
   306     CleanupClosePushL( fStream );
   325     // According to documentation RFileWriteStream
   307     // According to documentation RFileWriteStream
   381     fStream.WriteInt8L( locale.NegativeCurrencyFormat() );
   363     fStream.WriteInt8L( locale.NegativeCurrencyFormat() );
   382     fStream.WriteInt8L( locale.NegativeLoseSpace() );
   364     fStream.WriteInt8L( locale.NegativeLoseSpace() );
   383     fStream.WriteInt8L( locale.NegativeCurrencySymbolOpposite() );
   365     fStream.WriteInt8L( locale.NegativeCurrencySymbolOpposite() );
   384     fStream.WriteInt16L( locale.DigitType() );
   366     fStream.WriteInt16L( locale.DigitType() );
   385 
   367 
       
   368     // Then save display language independent data
       
   369     SaveIndependentDataL( locale, aPath );
       
   370 
   386     // If CommitL leaves it means probably full disk.
   371     // If CommitL leaves it means probably full disk.
   387     // It is here assumed that data has not been changed if this leaves.
   372     // It is here assumed that data has not been changed if this leaves.
   388     fStream.CommitL();
   373     fStream.CommitL();
   389 
   374 
   390     CleanupStack::PopAndDestroy( &fStream );
   375     CleanupStack::PopAndDestroy( &fStream );
   391     CleanupStack::PopAndDestroy( fName );
   376     CleanupStack::PopAndDestroy( fName );
   392     }
   377     }
   393 
   378 
   394 
   379 
   395 // ---------------------------------------------------------------------------
   380 // ---------------------------------------------------------------------------
   396 // CSsmLocaleObserverSup::LoadRegionL
   381 // CSsmLocaleObserverSup::LoadLocaleL
   397 // ---------------------------------------------------------------------------
   382 // ---------------------------------------------------------------------------
   398 //
   383 //
   399 void CSsmLocaleObserverSup::LoadRegionL( const TDesC& aPath )
   384 void CSsmLocaleObserverSup::LoadLocaleL( const TDesC& aPath )
   400     {
   385     {
   401     FUNC_LOG;
   386     FUNC_LOG;
   402     INFO( "Loading region data" );
   387     INFO( "Loading locale data" );
   403 
   388 
   404     TInt region = MappedRegionL(User::Language());
   389     HBufC* fName = MakeFileNameL( aPath, KFileName, User::Language() );
   405     HBufC* fName = MakeFileNameL( aPath, KFileName, region);
       
   406     CleanupStack::PushL( fName );
   390     CleanupStack::PushL( fName );
   407 
   391 
   408     TLocale locale; // copy current values
   392     TLocale locale; // copy current values
   409 
   393 
   410     RFileReadStream fStream;
   394     RFileReadStream fStream;
   418         }
   402         }
   419 
   403 
   420     if ( err == KErrNone  )
   404     if ( err == KErrNone  )
   421         {
   405         {
   422         TInt version = fStream.ReadInt8L();
   406         TInt version = fStream.ReadInt8L();
   423         INFO_1( "Region file version: %d", version );
   407         INFO_1( "Locale file version: %d", version );
   424 
   408 
   425         locale.SetCountryCode( fStream.ReadInt16L() );
   409         locale.SetCountryCode( fStream.ReadInt16L() );
   426         fStream.ReadInt16L(); // obsolete
   410         fStream.ReadInt16L(); // obsolete
   427         locale.SetDateFormat( static_cast< TDateFormat >( fStream.ReadInt8L() ) );
   411         locale.SetDateFormat( static_cast< TDateFormat >( fStream.ReadInt8L() ) );
   428         locale.SetTimeFormat( static_cast< TTimeFormat >( fStream.ReadInt8L() ) );
   412         locale.SetTimeFormat( static_cast< TTimeFormat >( fStream.ReadInt8L() ) );
   464         locale.SetNegativeLoseSpace( fStream.ReadInt8L() );
   448         locale.SetNegativeLoseSpace( fStream.ReadInt8L() );
   465         locale.SetNegativeCurrencySymbolOpposite( fStream.ReadInt8L() );
   449         locale.SetNegativeCurrencySymbolOpposite( fStream.ReadInt8L() );
   466         locale.SetDigitType( static_cast< TDigitType >( fStream.ReadInt16L() ) );
   450         locale.SetDigitType( static_cast< TDigitType >( fStream.ReadInt16L() ) );
   467         }
   451         }
   468 
   452 
       
   453     // Then patch data with locale independent data (code 00)
       
   454     // No changes to locale if no independent data can be found (the very first boot)
       
   455     LoadIndependentDataL( locale, aPath );
       
   456 
   469     // Save changes to the system.
   457     // Save changes to the system.
   470     locale.Set();
   458     locale.Set();
   471 
   459 
   472     CleanupStack::PopAndDestroy( &fStream );
   460     CleanupStack::PopAndDestroy( &fStream );
   473     CleanupStack::PopAndDestroy( fName );
   461     CleanupStack::PopAndDestroy( fName );
   474     }
   462     }
   475 
   463 
   476 void CSsmLocaleObserverSup::InitializeRegionMappingL()
   464 
   477     {
   465 // ---------------------------------------------------------------------------
   478     //Reserve the memory for the number of mappings to be appended
   466 // CSsmLocaleObserverSup::SaveIndependentDataL
   479     iLangRegionMappingHashSet.ReserveL( KMaxNumberOfRegions );
   467 // ---------------------------------------------------------------------------
   480     
   468 //
   481     //Insert the Language - Region mapping
   469 void CSsmLocaleObserverSup::SaveIndependentDataL(
   482     iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangEnglish,             ERegGBR ) );
   470     const TLocale& aLocale,
   483     iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangFrench,              ERegFRA ) );
   471     const TDesC& aPath )
   484     iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangGerman,              ERegDEU ) );
   472     {
   485     iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangSpanish,             ERegESP ) );
   473     FUNC_LOG;
   486     iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangItalian,             ERegITA ) );
   474 
   487     iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangSwedish,             ERegSWE ) );
   475     // Get old independent data, if any.
   488     iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangDanish,              ERegDNK ) );
   476     TLocale savedLoc;
   489     iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangNorwegian,           ERegNOR ) );
   477     TRAPD( err, LoadIndependentDataL( savedLoc, aPath ) );
   490     iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangFinnish,             ERegFIN ) );
   478     ERROR( err, "Failed to load locale independent data" );
   491     iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangAmerican,            ERegUSA ) );
   479 
   492     iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangPortuguese,          ERegPRT ) );
   480     HBufC* fName = MakeFileNameL( aPath, KCommonFileName, 0 );
   493     iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangTurkish,             ERegTUR ) );
   481     CleanupStack::PushL( fName );
   494     iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangIcelandic,           ERegISL ) );
   482     RFileWriteStream fStream;
   495     iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangRussian,             ERegRUS ) );
   483     CleanupClosePushL( fStream );
   496     iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangHungarian,           ERegHUN ) );
   484 
   497     iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangDutch,               ERegNLD ) );
   485     err = iFs.MkDirAll( *fName ); // Ignore errors
   498     iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangBelgianFlemish,      ERegBEL ) );
   486     err = fStream.Create( iFs, *fName, EFileWrite );
   499     iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangCzech,               ERegCZE ) );
   487     if ( err == KErrAlreadyExists )
   500     iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangSlovak,              ERegSVK ) );
   488         {
   501     iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangPolish,              ERegPOL ) );
   489         // Override
   502     iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangSlovenian,           ERegSVN ) );
   490         err = fStream.Open( iFs, *fName, EFileWrite );
   503     iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangTaiwanChinese,       ERegTWN ) );
   491         ERROR_1( err, "Failed to create stream %S", fName );
   504     iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangHongKongChinese,     ERegHKG ) );
   492         }
   505     iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangPrcChinese,          ERegCHN ) );
   493     User::LeaveIfError( err );
   506     iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangJapanese,            ERegJPN ) );
   494 
   507     iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangThai,                ERegTHA ) );
   495     // Write first the version number to enable support for file format changes.
   508     iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangArabic,              ERegARE ) );
   496     fStream.WriteInt8L( KCurrentVersionNumber );
   509     iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangTagalog,             ERegPHL ) );
   497     fStream.WriteInt32L( 0 ); // Universal time offset is not part of TLocale
   510     iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangBulgarian,           ERegBGR ) );
   498                               // any more. Write zero here to keep file structure.
   511     iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangCatalan,             ERegESP ) );
   499     // Clock format is also common.
   512     iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangCroatian,            ERegHRV ) );
   500     fStream.WriteUint32L( aLocale.ClockFormat() );
   513     iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangEstonian,            ERegEST ) );
   501     fStream.WriteUint32L( 0 );  // reserved 2
   514     iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangFarsi,               ERegIRN ) );
   502     fStream.WriteUint32L( 0 );  // reserved 3
   515     iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangCanadianFrench,      ERegCAN ) );
   503 
   516     iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangGreek,               ERegGRC ) );
   504     fStream.CommitL();
   517     iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangHebrew,              ERegISR ) );
   505 
   518     iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangHindi,               ERegIND ) );
   506     CleanupStack::PopAndDestroy( &fStream );
   519     iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangIndonesian,          ERegIDN ) );
   507     CleanupStack::PopAndDestroy( fName );
   520     iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangLatvian,             ERegLVA ) );
   508     }
   521     iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangLithuanian,          ERegLTU ) );
   509 
   522     iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangMalay,               ERegMYS ) );
   510 
   523     iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangBrazilianPortuguese, ERegBRA ) );
   511 // ---------------------------------------------------------------------------
   524     iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangRomanian,            ERegROU ) );
   512 // CSsmLocaleObserverSup::LoadIndependentDataL
   525     iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangSerbian,             ERegSCG ) );
   513 // ---------------------------------------------------------------------------
   526     iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangLatinAmericanSpanish, ERegMEX ));
   514 //
   527     iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangUkrainian,           ERegUKR ) );
   515 void CSsmLocaleObserverSup::LoadIndependentDataL(
   528     iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangUrdu,                ERegPAK ) );
   516     TLocale& aLocale,
   529     iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangVietnamese,          ERegVNM ) );
   517     const TDesC& aPath )
   530 #ifdef __E32LANG_H__
   518     {
   531     // 5.0
   519     FUNC_LOG;
   532     iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangBasque,              ERegESP ) );
   520 
   533     iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangGalician,            ERegESP ) );
   521     HBufC* fName = MakeFileNameL( aPath, KCommonFileName, 0 );
   534 #endif //__E32LANG_H__
   522     CleanupStack::PushL( fName );
   535 #if !defined(__SERIES60_31__)
   523 
   536     iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangEnglish_Apac,        ERegGBR ) );
   524     RFileReadStream fStream;
   537     iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangEnglish_Taiwan,      ERegTWN ) );
   525     CleanupClosePushL( fStream );
   538     iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangEnglish_HongKong,    ERegHKG ) );
   526     TInt err = fStream.Open( iFs, *fName, EFileRead );
   539     iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangEnglish_Prc,         ERegCHN ) );
   527     if ( err != KErrNotFound && err != KErrPathNotFound )
   540     iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangEnglish_Japan,       ERegJPN ) );
   528         {
   541     iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangEnglish_Thailand,    ERegTHA ) );
   529         ERROR_1( err, "Failed to open stream %S", fName );
   542     iLangRegionMappingHashSet.InsertL( TLanguageRegion( ELangMalay_Apac,          ERegMYS ) );
   530         // Data file is missing upon the first boot or when switching into a
   543 #endif //!defined(__SERIES60_31__)
   531         // language for the first time
   544     }
   532         }
   545 
   533 
   546 // ---------------------------------------------------------------------------
   534     if ( err == KErrNotFound || err == KErrPathNotFound )
   547 // CSsmLocaleObserverSup::MappedRegionL
   535         {
   548 // ---------------------------------------------------------------------------
   536         // File not found --> Not an error because
   549 //
   537         // this is a new file and older builds do not have this file.
   550 TInt CSsmLocaleObserverSup::MappedRegionL(const TInt aLanguage)
   538         INFO( "No locale data found" );
   551     {
   539         }
   552     FUNC_LOG;
   540     else
   553     TLanguageRegion langRegion = iLangRegionMappingHashSet.FindL(TLanguageRegion(aLanguage));
   541         {
   554     return langRegion.iRegion;
   542         User::LeaveIfError( err );
   555     }    
   543 
       
   544         fStream.ReadInt8L();    // Version.
       
   545         fStream.ReadInt32L();   // Universal time offset was stored here.
       
   546         aLocale.SetClockFormat( ( TClockFormat ) fStream.ReadUint32L() );
       
   547         fStream.ReadUint32L(); // reserved 2
       
   548         fStream.ReadUint32L(); // reserved 3
       
   549         }
       
   550 
       
   551     CleanupStack::PopAndDestroy( &fStream );
       
   552     CleanupStack::PopAndDestroy( fName );
       
   553     }