diff -r 000000000000 -r 4e1aa6a622a0 sysstatemgmt/syslangutil/src/syslangutil.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sysstatemgmt/syslangutil/src/syslangutil.cpp Tue Feb 02 00:53:00 2010 +0200 @@ -0,0 +1,353 @@ +/* +* 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 SysLangUtil class. +* +*/ + + +#include +#include + +#include "syslangutil.h" +#include "syslangutiltrace.h" +#include "ssmmapperutilitystatic.h" +#include "syslangutilprivatecrkeys.h" + +const TInt KReadBufSize = 10; +const TInt KLangArraySize = 20; + +// R&D support: Use language file in Starters internal directory for module +// testing purposes. +#ifdef __STARTER_MODULE_TEST_SUPPORT__ + _LIT( KLanguagesIni, "C:\\private\\100059C9\\languages.txt" ); +#else // __STARTER_MODULE_TEST_SUPPORT__ + _LIT( KLanguagesIni, "z:\\resource\\bootdata\\languages.txt" ); +#endif // __STARTER_MODULE_TEST_SUPPORT__ + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// SysLangUtil::IsValidLanguage +// +// ----------------------------------------------------------------------------- +// +EXPORT_C TBool SysLangUtil::IsValidLanguage( + const TInt& aLanguage, + RFs* aFileServerSession ) + { + API_FUNC_ENTRY_TRACE; + + TBool hadFS; + TInt err; + aFileServerSession = CheckFS( aFileServerSession, hadFS, err ); + + if ( err ) + { + return EFalse; + } + + RFile file; + err = file.Open( + *aFileServerSession, + KLanguagesIni, + EFileStream | EFileRead | EFileShareReadersOnly ); + + if ( !err ) + { + // Prepare Reader + TFileText reader; + reader.Set(file); + if ( reader.Seek(ESeekStart) ) + { + file.Close(); + if ( !hadFS ) + { + aFileServerSession->Close(); + delete aFileServerSession; + aFileServerSession = NULL; + } + return EFalse; + } + + TBuf readBuf; + err = EFalse; // This solution is not very elegant but saves ROM :) + + while ( !reader.Read( readBuf ) && readBuf.Length() ) + { + if ( readBuf.Length() > 1 ) + { + TLex lex( readBuf ); + lex.SkipSpace(); + TInt language; + err = lex.Val( language ); + + if ( language == aLanguage ) + { + err = ETrue; + break; + } + } + } + file.Close(); + } + else + { + err = EFalse; + ERROR_TRACE_1( "ERROR: file '%S' is missing", &KLanguagesIni ); + } + + if ( !hadFS ) + { + aFileServerSession->Close(); + delete aFileServerSession; + aFileServerSession = NULL; + } + + FUNC_EXIT_RET_TRACE( err ); + return err; + } + + +// ----------------------------------------------------------------------------- +// SysLangUtil::GetDefaultLanguage +// +// ----------------------------------------------------------------------------- +// +EXPORT_C TInt SysLangUtil::GetDefaultLanguage( + TInt& aLanguage, + RFs* aFileServerSession ) + { + API_FUNC_ENTRY_TRACE; + + TBool hadFS; + TInt err; + aFileServerSession = CheckFS( aFileServerSession, hadFS, err ); + + if ( err ) + { + return err; + } + + RFile file; + err = file.Open( + *aFileServerSession, + KLanguagesIni, + EFileStream | EFileRead | EFileShareReadersOnly ); + + if ( !err ) + { + // Prepare Reader + TFileText reader; + reader.Set(file); + err = reader.Seek( ESeekStart ); + if ( !err ) + { + TBuf readBuf; + + while ( !reader.Read( readBuf ) && readBuf.Length() ) + { + if ( readBuf.Locate('d') != KErrNotFound ) + { + TLex lex( readBuf ); + lex.SkipSpace(); + err = lex.Val( aLanguage ); + break; + } + + readBuf.Zero(); + } + + if ( !readBuf.Length() ) + { + ERROR_TRACE_1( "ERROR: file '%S' is missing", &KLanguagesIni ); + file.Close(); + return KErrNotFound; + } + } + file.Close(); + } + + if ( !hadFS ) + { + aFileServerSession->Close(); + delete aFileServerSession; + aFileServerSession = NULL; + } + + FUNC_EXIT_RET_TRACE( err ); + return err; + } + + +// ----------------------------------------------------------------------------- +// SysLangUtil::GetInstalledLanguages +// +// ----------------------------------------------------------------------------- +// +EXPORT_C TInt SysLangUtil::GetInstalledLanguages( + CArrayFixFlat*& aLanguages, + RFs* aFileServerSession ) + { + API_FUNC_ENTRY_TRACE; + + if ( aLanguages ) + { + delete aLanguages; + } + + aLanguages = new CArrayFixFlat( KLangArraySize ); + + if ( !aLanguages ) + { + return KErrNoMemory; + } + + + TBool hadFS; + TInt err; + aFileServerSession = CheckFS( aFileServerSession, hadFS, err ); + + if ( err ) + { + return err; + } + + RFile file; + err = file.Open( + *aFileServerSession, + KLanguagesIni, + EFileStream | EFileRead | EFileShareReadersOnly ); + if ( !err ) + { + // Prepare Reader + TFileText reader; + reader.Set( file ); + err = reader.Seek( ESeekStart ); + if ( !err ) + { + TBuf readBuf; + + for ( TInt i = 0; !reader.Read( readBuf ) && readBuf.Length(); i++ ) + { + if ( readBuf.Length() > 0 ) + { + TLex lex( readBuf ); + lex.SkipSpace(); + TInt language; + err = lex.Val( language ); + if ( err ) break; + // Will not leave if array size (KLangArraySize) not exceeded + TRAP( err, aLanguages->AppendL( language ) ); + err = KErrNone; // Ignore. + } + readBuf.Zero(); + } + } + file.Close(); + } + else + { + ERROR_TRACE_1( "ERROR: file '%S' is missing", &KLanguagesIni ); + } + + if ( !hadFS ) + { + aFileServerSession->Close(); + delete aFileServerSession; + aFileServerSession = NULL; + } + + FUNC_EXIT_RET_TRACE( err ); + return err; + } + + +// ----------------------------------------------------------------------------- +// SysLangUtil::RestoreSIMLanguage +// +// ----------------------------------------------------------------------------- +// +EXPORT_C TInt SysLangUtil::RestoreSIMLanguage( + TInt &aLanguage, + RFs* /*aFileServerSession*/ ) + { + API_FUNC_ENTRY_TRACE; + + TUid mappedUid = SsmMapperUtility::CrUid( KCRUidSysLangUtil ); + + CRepository* repository = NULL; + TRAPD( errorCode, repository = CRepository::NewL( mappedUid ) ); + + if ( errorCode == KErrNone ) + { + errorCode = repository->Get( KSysLangUtilSimLanguage, aLanguage ); + + if ( errorCode != KErrNone ) + { + ERROR_TRACE_1( "Failed to get value from CentRep, error code %d.", errorCode ); + } + } + else + { + ERROR_TRACE_1( "Failed to open repository, error code %d.", errorCode ); + } + + delete repository; + + FUNC_EXIT_RET_TRACE( errorCode ); + return errorCode; + } + + +// ----------------------------------------------------------------------------- +// SysLangUtil::CheckFS +// +// ----------------------------------------------------------------------------- +// +RFs* SysLangUtil::CheckFS( RFs* aRFs, TBool& aExist, TInt& aErr ) + { + FUNC_ENTRY_TRACE; + + if ( !aRFs ) + { + aExist = EFalse; + aRFs = new RFs; + if ( aRFs ) + { + aErr = aRFs->Connect(); + if ( aErr != KErrNone) + { + delete aRFs; + return NULL; + } + } + else + { + aErr = KErrNoMemory; + return NULL; + } + } + else + { + // File server session given as argument MUST be already connected + ASSERT_TRACE( aRFs->Handle() ); + + aExist = ETrue; + } + + aErr = KErrNone; + + FUNC_EXIT_TRACE; + return aRFs; + }