diff -r 000000000000 -r 4e1aa6a622a0 sysstatemgmt/syslangutil/ssmlangselcmd/src/ssmlanguageloader.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sysstatemgmt/syslangutil/ssmlangselcmd/src/ssmlanguageloader.cpp Tue Feb 02 00:53:00 2010 +0200 @@ -0,0 +1,137 @@ +/* +* Copyright (c) 2009 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" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* Implementation of SsmLanguageLoader class. +* +*/ + +#include +#include + +#include "ssmlanguageloader.h" +#include "trace.h" + +_LIT( KLocaleDllNameBase, "ELOCL" ); +_LIT( KLocaleDllExtensionFormat, ".%u" ); +_LIT( KLocaleDllExtensionPadding, "0" ); +_LIT( KDefaultLocaleDllNameExtension, ".LOC" ); +const TInt KMaxLocaleDllNameLength = 16; +const TInt KMaxLocaleDllExtensionLength = 6; +const TInt KMinLocaleDllExtensionLength = 3; +const TInt KLocaleDllExtensionPaddingPosition = 1; + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// SsmLanguageLoader::LoadLanguage +// +// --------------------------------------------------------------------------- +// +TInt SsmLanguageLoader::LoadLanguage( const TInt aLanguage ) + { + FUNC_LOG; + INFO_1( "Loading language %d", aLanguage ); + + TInt errorCode = StoreLanguageToHal( aLanguage ); + ERROR( errorCode, "Failed to store language code to HAL" ); + + errorCode = LoadLocaleDll( aLanguage ); + ERROR( errorCode, "Failed to load locale DLL" ); + + return errorCode; + } + + +// ----------------------------------------------------------------------------- +// SsmLanguageLoader::StoreLanguageToHal +// +// ----------------------------------------------------------------------------- +// +TInt SsmLanguageLoader::StoreLanguageToHal( const TInt aLanguage ) + { + FUNC_LOG; + + TInt errorCode = HAL::Set( HAL::ELanguageIndex, aLanguage ); + return errorCode; + } + + +// ----------------------------------------------------------------------------- +// SsmLanguageLoader::LoadLocaleDll +// +// ----------------------------------------------------------------------------- +// +TInt SsmLanguageLoader::LoadLocaleDll( const TInt aLanguage ) + { + FUNC_LOG; + + // Dot plus five digit locale + TBuf extension; + extension.Format( KLocaleDllExtensionFormat, aLanguage ); + + // Padd ".1" to ".01" for compatibility. + if ( extension.Length() < KMinLocaleDllExtensionLength ) + { + extension.Insert( KLocaleDllExtensionPaddingPosition, + KLocaleDllExtensionPadding ); + } + + TBuf localeDllName; + localeDllName = KLocaleDllNameBase; + localeDllName.Append( extension ); + + INFO_1( "Loading DLL named '%S'", &localeDllName ); + + TInt errorCode = ChangeLocale( localeDllName ); + + if ( errorCode == KErrNotFound ) // Try default locale + { + INFO( "SsmLanguageLoader: Loading default locale" ); + + localeDllName = KLocaleDllNameBase; + localeDllName.Append( KDefaultLocaleDllNameExtension ); + + errorCode = ChangeLocale( localeDllName ); + } + + if ( errorCode == KErrNone ) + { + TLocale().Set(); + } + + return errorCode; + } + + +// ----------------------------------------------------------------------------- +// SsmLanguageLoader::ChangeLocale +// +// ----------------------------------------------------------------------------- +// +TInt SsmLanguageLoader::ChangeLocale( const TDesC& aLocaleDllName ) + { + FUNC_LOG; + + TExtendedLocale extLocale; + TInt errorCode = extLocale.LoadLocale( aLocaleDllName ); + ERROR( errorCode, "Failed to load locale" ); + + if ( errorCode == KErrNone ) + { + errorCode = extLocale.SaveSystemSettings(); + ERROR( errorCode, "Failed to set locale" ); + } + + return errorCode; + }