sysstatemgmt/syslangutil/ssmlangselcmd/src/ssmlangselcmd.cpp
branchRCL_3
changeset 60 ccb4f6b3db21
parent 0 4e1aa6a622a0
child 61 8cb079868133
--- a/sysstatemgmt/syslangutil/ssmlangselcmd/src/ssmlangselcmd.cpp	Thu Aug 19 11:09:10 2010 +0300
+++ b/sysstatemgmt/syslangutil/ssmlangselcmd/src/ssmlangselcmd.cpp	Tue Aug 31 16:29:05 2010 +0300
@@ -1,8 +1,8 @@
 /*
-* 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"
+* under the terms of the License "Eclipse Public License v1.0"
 * which accompanies this distribution, and is available
 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
 *
@@ -22,6 +22,7 @@
 #include "ssmlanguageloader.h"
 #include "syslangutilprivatecrkeys.h"
 #include "trace.h"
+#include "ssmmapperutilityinternalpskeys.h"
 
 #include <syslangutil.h>
 #include <CommonEngineDomainCRKeys.h>
@@ -31,6 +32,55 @@
 /** Default granularity for list of installed languages. */
 const TInt KLanguageListGranularity( 4 );
 
+/** Any of the code set to zero means auto selection is enabled. */
+const TInt KSettingAutomatic = 0;
+
+/** The maximum number of regions to be appended to the hash set. */
+const TInt KMaxNumberOfRegions = 56;
+
+// ======== LOCAL FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// HashLangRegionMappingFunction
+// ---------------------------------------------------------------------------
+//
+inline TUint32 HashLangRegionMappingFunction(const TLanguageRegion& aMapping)
+    {
+    return aMapping.iLanguage;
+    }
+
+// ---------------------------------------------------------------------------
+// LangRegionMappingIdentityRelation
+// ---------------------------------------------------------------------------
+//
+inline TBool LangRegionMappingIdentityRelation(const TLanguageRegion& aMapping1,
+    const TLanguageRegion& aMapping2)
+    {
+    return (aMapping1.iLanguage == aMapping2.iLanguage);
+    }
+
+// ---------------------------------------------------------------------------
+// RegionLangMappingIdentityRelation
+// ---------------------------------------------------------------------------
+//
+inline TBool RegionLangMappingIdentityRelation(const TLanguageRegion& aMapping1,
+    const TLanguageRegion& aMapping2)
+    {
+    return (aMapping1.iRegion == aMapping2.iRegion);
+    }
+
+// ---------------------------------------------------------------------------
+// CompareLanguageMapping
+// ---------------------------------------------------------------------------
+//
+static TInt CompareLanguageMapping(TLanguageRegion const &aLanguage1, TLanguageRegion const &aLanguage2)
+    {
+    if( aLanguage1.iLanguage == aLanguage2.iLanguage )
+        {
+        return 0;
+        }
+    return ( aLanguage1.iLanguage < aLanguage2.iLanguage ) ? -1 : 1;
+    }
 
 // ======== MEMBER FUNCTIONS ========
 
@@ -48,6 +98,18 @@
 	return self;	
 	}
 
+// ---------------------------------------------------------------------------
+// CSsmLangSelCmd::CSsmLangSelCmd
+// ---------------------------------------------------------------------------
+//
+CSsmLangSelCmd::CSsmLangSelCmd() : CActive( EPriorityNormal ),
+    iState( EQueryListNone ),
+    iLangRegionMappingHashSet( &::HashLangRegionMappingFunction, &::LangRegionMappingIdentityRelation )
+    {
+    FUNC_LOG;
+
+    CActiveScheduler::Add( this );
+    }
 
 // ---------------------------------------------------------------------------
 // CSsmLangSelCmd::~CSsmLangSelCmd
@@ -56,11 +118,470 @@
 CSsmLangSelCmd::~CSsmLangSelCmd()
     {
     FUNC_LOG;
+    Cancel();
     delete iLangList;
     delete iMapperUtility;
     }
 
 // ---------------------------------------------------------------------------
+// CSsmLangSelCmd::ConstructL
+// ---------------------------------------------------------------------------
+//
+void CSsmLangSelCmd::ConstructL()
+    {
+    FUNC_LOG;
+    iMapperUtility = CSsmMapperUtility::NewL();
+    }
+
+// ---------------------------------------------------------------------------
+// CSsmLangSelCmd::Initialize
+// ---------------------------------------------------------------------------
+//
+ TInt CSsmLangSelCmd::Initialize( CSsmCustomCommandEnv* aCmdEnv )
+     {
+     FUNC_LOG;
+
+     iEnv = aCmdEnv;
+     TRAPD( errorCode, InitializeL() );
+     return errorCode;
+     }
+
+// ---------------------------------------------------------------------------
+// CSsmLangSelCmd::InitializeL
+// ---------------------------------------------------------------------------
+//
+void CSsmLangSelCmd::InitializeL()
+    {
+    FUNC_LOG;
+    ASSERT_TRACE( iEnv );
+
+    iValidLanguages = new ( ELeave ) CArrayFixFlat<TInt>( KLanguageListGranularity );
+    
+    RFs* fsSession = &( const_cast<RFs&>( iEnv->Rfs() ) );
+    
+    //Get the list of installed languages
+    TInt errorCode = SysLangUtil::GetInstalledLanguages( iValidLanguages,
+                                                         fsSession );
+
+    ERROR( errorCode, "Failed to get installed languages" );
+    User::LeaveIfError( errorCode );
+    
+    //Initialize the Language and Region mapping hash set
+    InitializeRegionMappingL();
+
+    //Get the number of installed languages
+    const TInt validLangCount = iValidLanguages->Count();
+    TLinearOrder<TLanguageRegion> order(&CompareLanguageMapping);
+    
+    //Get the mapped regions for the installed languages
+    for(TInt index = 0; index < validLangCount; ++index) 
+        {
+        TLanguageRegion region = iLangRegionMappingHashSet.FindL(TLanguageRegion(iValidLanguages->At(index)));
+        INFO_2( "Found Region code = %d for language %d", region.iRegion, region.iLanguage );
+        iRegionsArray.InsertInOrderL(region, order);
+        }
+
+    //Connect to Misc adaptation
+    errorCode = iAdaptation.Connect();
+    ERROR( errorCode, "Failed to connect to RSsmMiscAdaptation" );
+    User::LeaveIfError( errorCode );
+    }
+
+// ---------------------------------------------------------------------------
+// CSsmLangSelCmd::InitializeRegionMappingL
+// ---------------------------------------------------------------------------
+//
+void CSsmLangSelCmd::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__)
+    }
+
+// ---------------------------------------------------------------------------
+// CSsmLangSelCmd::Execute
+// ---------------------------------------------------------------------------
+//
+void CSsmLangSelCmd::Execute( const TDesC8& /*aParams*/, TRequestStatus& aRequest )
+    {
+    FUNC_LOG;
+    
+    ASSERT_TRACE( !iClientStatus );
+    ASSERT_TRACE( !IsActive() );
+    ASSERT_TRACE( iEnv );
+
+    aRequest = KRequestPending;
+    iClientStatus = &aRequest;
+
+    RFs* fsSession = &( const_cast<RFs&>( iEnv->Rfs() ) );
+    
+    //Get the default language
+    TInt errorCode = SysLangUtil::GetDefaultLanguage( iDefaultLanguage, fsSession );
+    ERROR( errorCode, "Failed to get default language" );
+
+    //Get the language selected
+    TInt lastSelectedLang = GetLastSelectedLang();
+    TInt lastSelectedRegion ( KErrNotFound );
+    TInt lastSelectedCollation ( KErrNotFound );
+    
+    //Reset error code to KErrNotFound
+    errorCode = KErrNotFound;
+    
+    if ( KSettingAutomatic == lastSelectedLang )
+        {
+        //Auto selection is enabled
+        SetIndividualSettingsToCentRep( KSettingAutomatic, KSettingAutomatic );
+        PrepareNextList();
+        }
+    else if ( ValidateAndGetSettings( lastSelectedLang, lastSelectedRegion, lastSelectedCollation ) )
+        {
+        //Validate and get the selected Language, Region and Collation code
+        errorCode = UseLocale( lastSelectedLang , lastSelectedRegion, lastSelectedCollation );
+        ERROR( errorCode, "Failed to load selected Language, Region and Collation" );
+        }
+
+    //Load the default Language, Region and Collation in case of loading selected codes failed 
+    //and auto selection is disabled.
+    if( KErrNone != errorCode && KSettingAutomatic != lastSelectedLang )
+        {
+        //Validate and use the default codes 
+        errorCode = ValidateAndUseDefaultLanguage();
+        ERROR( errorCode, "Failed to load default Language, Region and Collation" );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CSsmLangSelCmd::GetLastSelectedLang
+//
+// ---------------------------------------------------------------------------
+//
+TInt CSsmLangSelCmd::GetLastSelectedLang()
+    {
+    FUNC_LOG;
+
+    TInt value( 0 );
+    TInt errorCode = iMapperUtility->CrValue( KCRUidCommonEngineKeys, 
+                                              KGSDisplayTxtLang,
+                                              value );
+    ERROR( errorCode, "Failed read KGSDisplayTxtLang CenRep key with error= %d"  );       
+    
+    INFO_1( "Last selected language is %d", value );
+    return value;
+    }
+
+// ---------------------------------------------------------------------------
+// CSsmLangSelCmd::SetIndividualSettingsToCentRep
+//
+// ---------------------------------------------------------------------------
+//
+TInt CSsmLangSelCmd::SetIndividualSettingsToCentRep( const TInt aRegion, const TInt aCollation )
+    {
+    FUNC_LOG;
+    CRepository* cenrep = NULL;
+    TRAPD( errorCode, cenrep = CRepository::NewL( KCRUidCommonEngineKeys ) );
+  
+    if ( KErrNone == errorCode )
+        {
+        //Set the Region CR with the given value
+        errorCode = cenrep->Set( KGSRegion, aRegion );
+        ERROR( errorCode, "Failed to Set Region code to CentRep, %d"  );                
+        }
+    else
+        {
+        INFO_1( "Failed to initialize cen rep %d", errorCode );        
+        }
+
+    if ( KErrNone == errorCode )
+        {
+        //Set the Collation CR with the given value
+        errorCode = cenrep->Set( KGSCollation, aCollation );
+        ERROR( errorCode, "Failed to Set Collation code to CentRep, %d"  );               
+        }
+    delete cenrep;
+    return errorCode;
+    }
+
+// ---------------------------------------------------------------------------
+// CSsmLangSelCmd::ValidateAndGetSettings
+//
+// ---------------------------------------------------------------------------
+//
+TBool CSsmLangSelCmd::ValidateAndGetSettings( const TInt aLastSelectedLang, TInt& aLastSelectedRegion, TInt& aLastSelectedCollation )
+    {
+    TBool isValid( EFalse );
+    //Validate and get the selected settings
+	TInt errorCode = KErrNone;
+    TRAP( errorCode, isValid = ValidateAndGetSettingsL( aLastSelectedLang, aLastSelectedRegion, aLastSelectedCollation ) );
+    ERROR_1( errorCode, "Validation failed for the selected Language, region and Collation with error %d", errorCode );
+    return isValid;
+    }
+
+// ---------------------------------------------------------------------------
+// CSsmLangSelCmd::ValidateAndGetSettingsL
+//
+// ---------------------------------------------------------------------------
+//
+TBool CSsmLangSelCmd::ValidateAndGetSettingsL( const TInt aLastSelectedLang, TInt& aLastSelectedRegion, TInt& aLastSelectedCollation )
+    {
+    TBool isValid( EFalse );
+
+    //Get the selected Region and Collation 
+    GetIndividualSettingsFromCentRepL( aLastSelectedRegion, aLastSelectedCollation );
+
+    //Check whether the selected Language is valid or not
+    if( IsValid( aLastSelectedLang ) )
+        {
+         if (KSettingAutomatic >= aLastSelectedRegion )
+            {
+            //Selected Region is Automatic. Get the Region associated 
+            //with the Language being loaded
+            if( ValidateAndGetMappedRegion( aLastSelectedLang, aLastSelectedRegion ) )
+                {
+                isValid = ETrue;
+                }
+            }
+         else if( IsRegionValidL( aLastSelectedRegion ) )
+                {
+                //Selected Region is a valid Region
+                isValid = ETrue;
+                }
+            
+         if ( KSettingAutomatic >= aLastSelectedCollation )
+             {
+             //Collation is not set. Use the language code as the collation code
+             aLastSelectedCollation = aLastSelectedLang;
+             }
+        }
+    
+    return isValid;
+    }
+
+// ---------------------------------------------------------------------------
+// CSsmLangSelCmd::IsValid
+//
+// ---------------------------------------------------------------------------
+//
+TBool CSsmLangSelCmd::IsValid( const TInt aLanguage ) const
+    {
+    FUNC_LOG;
+    ASSERT_TRACE( iValidLanguages );
+
+    TBool valid( EFalse );
+    TKeyArrayFix keyProp( 0, ECmpTInt );
+    TInt index( KErrNotFound );
+    // Returns zero if element is found.
+    if ( 0 == iValidLanguages->Find( aLanguage, keyProp, index ) )
+        {
+        valid = ETrue;
+        }
+    
+    return valid;
+    }
+
+// ---------------------------------------------------------------------------
+// CSsmLangSelCmd::GetLanguageFromCentRep
+//
+// ---------------------------------------------------------------------------
+//
+TInt CSsmLangSelCmd::GetLanguageFromCentRep()
+    {
+    FUNC_LOG;
+
+    TInt lang = iDefaultLanguage;
+    TInt errorCode = iMapperUtility->CrValue( KCRUidSysLangUtil,
+                                              KSysLangUtilSimLanguage,
+                                              lang );
+    
+    ERROR_1( errorCode, "Failed to read language code from CenRep %d", 
+             errorCode );
+    return lang;
+    }
+
+// ---------------------------------------------------------------------------
+// CSsmLangSelCmd::IsRegionValidL
+//
+// ---------------------------------------------------------------------------
+//
+TBool CSsmLangSelCmd::IsRegionValidL( const TInt aRegion ) const
+    {
+    FUNC_LOG;
+    TInt index = iRegionsArray.FindL(TLanguageRegion(0, aRegion), &::RegionLangMappingIdentityRelation);
+
+    return ETrue;
+    }
+
+// ---------------------------------------------------------------------------
+// CSsmLangSelCmd::ValidRegionAndGetMappedLanguage
+//
+// ---------------------------------------------------------------------------
+//
+TBool CSsmLangSelCmd::ValidateAndGetMappedRegion( const TInt aLanguage, TInt& aRegion )
+    {
+    FUNC_LOG;
+
+    TBool valid( EFalse );
+    TLanguageRegion lang( aLanguage );
+
+    //Find the Language - Region mapping for the given Language
+    TInt index = iRegionsArray.Find( lang, &::LangRegionMappingIdentityRelation );
+    if( 0 <= index )
+        {
+        //Set the Region associated with the given Language
+        aRegion = iRegionsArray[index].iRegion;
+        INFO_1( "ValidRegionAndGetMappedLanguage:: Found region %d", aRegion);
+        valid = ETrue;
+        }
+    else
+        {
+        INFO_1( "ValidRegionAndGetMappedLanguage:: Not Found region for lang %d", aLanguage);    
+        }
+
+    return valid;
+    }
+
+// ---------------------------------------------------------------------------
+// CSsmLangSelCmd::GetIndividualSettingsFromCentRepL
+//
+// ---------------------------------------------------------------------------
+//
+void CSsmLangSelCmd::GetIndividualSettingsFromCentRepL( TInt& aRegion, TInt& aCollation )
+    {
+    FUNC_LOG;
+    CRepository* cenrep = CRepository::NewL( KCRUidCommonEngineKeys );
+    CleanupStack::PushL( cenrep );
+    
+    //Get the last selected Region from central repository
+    User::LeaveIfError(cenrep->Get( KGSRegion, aRegion));   
+        
+    //Get the last selected Collation from central repository
+    User::LeaveIfError(cenrep->Get( KGSCollation, aCollation));    
+    
+    INFO_2( "Last selected region %d and collation %d", aRegion, aCollation );
+    CleanupStack::PopAndDestroy( cenrep );
+    }
+
+// ---------------------------------------------------------------------------
+// CSsmLangSelCmd::ValidateAndUseDefaultLanguage
+//
+// ---------------------------------------------------------------------------
+//
+TInt CSsmLangSelCmd::ValidateAndUseDefaultLanguage()
+    {
+    FUNC_LOG;
+    TLanguageRegion langRegion;
+    
+    //Get the Region associated with default Language
+    TRAPD( error, langRegion = iLangRegionMappingHashSet.FindL( TLanguageRegion( iDefaultLanguage ) ) );
+    if( KErrNone == error )
+       {
+       //Load the settings for default Language
+       error = UseLocale( iDefaultLanguage, langRegion.iRegion, iDefaultLanguage );
+       ERROR_1( error, "Failed to load default language setting %d", error );
+       }
+    else
+        {
+        INFO_1( "Failed to find the Region associated with default Language %d", error );
+        }
+
+    if ( iClientStatus )
+        {
+        ERROR_1( error, "Language selection custom command completed with error %d", error );
+        User::RequestComplete( iClientStatus, error );
+        iClientStatus = NULL;
+        }
+
+    return error;
+    }
+
+// ---------------------------------------------------------------------------
+// CSsmLangSelCmd::UseLocale
+//
+// ---------------------------------------------------------------------------
+//
+TInt CSsmLangSelCmd::UseLocale( const TInt aLang, const TInt aRegion, const TInt aCollation )
+    {
+    FUNC_LOG;
+    TInt errorCode(KErrNotFound);
+
+    //Load the given Language, Region and Collation DLLs
+    errorCode = SsmLanguageLoader::LoadLocale( aLang, aRegion, aCollation );
+
+    if( KErrNone != errorCode )
+        {
+        INFO_1( "Loading failed with error  %d", errorCode);
+        }
+    else if ( iClientStatus )
+        {
+        User::RequestComplete( iClientStatus, errorCode );
+        iClientStatus = NULL;
+        }
+    return errorCode;
+    }
+
+// ---------------------------------------------------------------------------
 // CSsmLangSelCmd::RunL
 //
 // ---------------------------------------------------------------------------
@@ -86,74 +607,41 @@
         }
     }
 
-
 // ---------------------------------------------------------------------------
-// CSsmLangSelCmd::DoCancel
+// CSsmLangSelCmd::UseLanguage
 //
 // ---------------------------------------------------------------------------
 //
-void CSsmLangSelCmd::DoCancel()
-    {
-    FUNC_LOG;
-    }
-
-
-// ---------------------------------------------------------------------------
-// CSsmLangSelCmd::Initialize
-// ---------------------------------------------------------------------------
-//
-TInt CSsmLangSelCmd::Initialize( CSsmCustomCommandEnv* aCmdEnv )
+void CSsmLangSelCmd::UseLanguage( const TInt aLang )
     {
     FUNC_LOG;
-
-    iEnv = aCmdEnv;
-    TRAPD( errorCode, InitializeL() );
-    return errorCode;
-    }
-
-
-// ---------------------------------------------------------------------------
-// CSsmLangSelCmd::Execute
-// ---------------------------------------------------------------------------
-//
-void CSsmLangSelCmd::Execute(
-    const TDesC8& /*aParams*/,
-    TRequestStatus& aRequest )
-    {
-    FUNC_LOG;
-    
-    ASSERT_TRACE( !iClientStatus );
-    ASSERT_TRACE( !IsActive() );
-    ASSERT_TRACE( iEnv );
+    TInt errorCode = KErrNotFound;
+    TInt region = KErrNotFound;
 
-    aRequest = KRequestPending;
-    iClientStatus = &aRequest;
-    
-
-    RFs* fsSession = &( const_cast<RFs&>( iEnv->Rfs() ) );
-    TInt errorCode = SysLangUtil::GetDefaultLanguage( iDefaultLanguage,
-                                                      fsSession );
-    ERROR( errorCode, "Failed to get default language" );
-
-    TInt lastSelectedLang = GetLastSelectedLang();
-    // Revert to automatic selection if fetching last used language
-    // fails, last used language is not valid (and obviously when last
-    // selection is automatic).
-    if ( lastSelectedLang == 0 )
+    //Validate and get associated Region
+    if( ValidateAndGetMappedRegion( aLang, region ) )
         {
-        PrepareNextList();
-        }
-    else if ( IsValid( lastSelectedLang ) )
-        {
-        UseLanguage( lastSelectedLang );
+        errorCode = SsmLanguageLoader::LoadLocale( aLang, region, aLang );
         }
     else
         {
-        UseLanguage( iDefaultLanguage );
-        }    
+        INFO_1( "Validation failed for the language (auto) %d", aLang );
+        }
+
+    if( KErrNone != errorCode )
+        {
+        INFO_1( "Loading the auto settings failed with error %d", errorCode );
+        
+        //Use the default setting as the selected one failed
+        errorCode = ValidateAndUseDefaultLanguage();
+        }
+    else if ( iClientStatus )
+        {
+        User::RequestComplete( iClientStatus, errorCode );
+        iClientStatus = NULL;
+        }
     }
 
-
 // ---------------------------------------------------------------------------
 // CSsmLangSelCmd::ExecuteCancel
 // ---------------------------------------------------------------------------
@@ -165,6 +653,27 @@
     Cancel();
     }
 
+// ---------------------------------------------------------------------------
+// CSsmLangSelCmd::DoCancel
+//
+// ---------------------------------------------------------------------------
+//
+void CSsmLangSelCmd::DoCancel()
+    {
+    FUNC_LOG;
+    
+    //Cancel the pending request with misc adaptation
+    if( EQueryListNone != iState )
+        {
+        iAdaptation.Cancel();
+        }
+    
+    if ( iClientStatus )
+        {
+        User::RequestComplete( iClientStatus, KErrCancel );
+        iClientStatus = NULL;
+        }
+    }
 
 // ---------------------------------------------------------------------------
 // CSsmLangSelCmd::Close
@@ -175,7 +684,8 @@
     FUNC_LOG;
     delete iValidLanguages;
     iValidLanguages = NULL;
-    
+    iRegionsArray.Close();
+    iLangRegionMappingHashSet.Close();
     iAdaptation.Close();
     }
 
@@ -190,95 +700,6 @@
 
 	delete this;
     }
-// ---------------------------------------------------------------------------
-// CSsmLangSelCmd::CSsmLangSelCmd
-// ---------------------------------------------------------------------------
-//
-
-CSsmLangSelCmd::CSsmLangSelCmd()
-  : CActive( EPriorityNormal )
-    {
-    FUNC_LOG;
-
-    CActiveScheduler::Add( this );
-    }
-
-
-// ---------------------------------------------------------------------------
-// CSsmLangSelCmd::ConstructL
-// ---------------------------------------------------------------------------
-//
-void CSsmLangSelCmd::ConstructL()
-    {
-    iMapperUtility = CSsmMapperUtility::NewL();
-    }
-
-
-// ---------------------------------------------------------------------------
-// CSsmLangSelCmd::InitializeL
-// ---------------------------------------------------------------------------
-//
-void CSsmLangSelCmd::InitializeL()
-    {
-
-    FUNC_LOG;
-    ASSERT_TRACE( iEnv );
-    
-    iValidLanguages = new ( ELeave ) CArrayFixFlat<TInt>( 
-                                                    KLanguageListGranularity );
-    RFs* fsSession = &( const_cast<RFs&>( iEnv->Rfs() ) );
-    TInt errorCode = SysLangUtil::GetInstalledLanguages( iValidLanguages,
-                                                         fsSession );
-    
-    ERROR( errorCode, "Failed to get installed languages" );
-    User::LeaveIfError( errorCode );
-    
-    errorCode = iAdaptation.Connect();
-    ERROR( errorCode, "Failed to connect to RSsmMiscAdaptation" );
-    User::LeaveIfError( errorCode );
-    }
-
-// ---------------------------------------------------------------------------
-// CSsmLangSelCmd::GetLastSelectedLang
-//
-// ---------------------------------------------------------------------------
-//
-TInt CSsmLangSelCmd::GetLastSelectedLang()
-    {
-    FUNC_LOG;
-
-    TInt value( 0 );
-    TInt errorCode = iMapperUtility->CrValue( KCRUidCommonEngineKeys, 
-                                              KGSDisplayTxtLang,
-                                              value );
-    
-    ERROR( errorCode, "Failed read KGSDisplayTxtLang CenRep key" );
-    INFO_1( "Last selected language = %d", value );
-    return value;
-    }
-
-
-// ---------------------------------------------------------------------------
-// CSsmLangSelCmd::IsValid
-//
-// ---------------------------------------------------------------------------
-//
-TBool CSsmLangSelCmd::IsValid( const TInt aLanguage ) const
-    {
-    FUNC_LOG;
-    ASSERT_TRACE( iValidLanguages );
-
-    TBool valid( EFalse );
-    TKeyArrayFix keyProp( 0, ECmpTInt );
-    TInt index( KErrNotFound );
-    // Returns zero if element is found.
-    if ( 0 == iValidLanguages->Find( aLanguage, keyProp, index ) )
-        {
-        valid = ETrue;
-        }
-    return valid;
-    }
-
 
 // ---------------------------------------------------------------------------
 // CSsmLangSelCmd::PrepareNextList
@@ -329,7 +750,6 @@
         }
     }
 
-
 // ---------------------------------------------------------------------------
 // CSsmLangSelCmd::InterpretResult
 //
@@ -437,7 +857,6 @@
         }
     }
 
-
 // ---------------------------------------------------------------------------
 // CSsmLangSelCmd::StoreLanguageToCentRep
 //
@@ -459,49 +878,3 @@
         delete cenrep;
         }
     }
-
-
-// ---------------------------------------------------------------------------
-// CSsmLangSelCmd::GetLanguageFromCentRep
-//
-// ---------------------------------------------------------------------------
-//
-TInt CSsmLangSelCmd::GetLanguageFromCentRep()
-    {
-    FUNC_LOG;
-
-    TInt lang = iDefaultLanguage;
-    TInt errorCode = iMapperUtility->CrValue( KCRUidSysLangUtil,
-                                              KSysLangUtilSimLanguage,
-                                              lang );
-    
-    ERROR_1( errorCode, "Failed to read language code from CenRep %d", 
-             errorCode );
-    return lang;
-    }
-
-
-// ---------------------------------------------------------------------------
-// CSsmLangSelCmd::UseLanguage
-//
-// ---------------------------------------------------------------------------
-//
-void CSsmLangSelCmd::UseLanguage( const TInt aLang )
-    {
-    FUNC_LOG;
-
-    TInt errorCode = aLang;
-    if ( aLang > KErrNone )
-        {
-        errorCode = SsmLanguageLoader::LoadLanguage( aLang );
-        ERROR( errorCode, "Failed to load language" );
-        }
-
-    ERROR( errorCode, "Language selection failed" );
-
-    if ( iClientStatus )
-        {
-        User::RequestComplete( iClientStatus, errorCode );
-        }
-    }
-