--- 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 );
- }
- }
-