diff -r cad71a31b7fc -r e36f3802f733 srsf/vcommandmanager/src/vcresource.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/srsf/vcommandmanager/src/vcresource.cpp Wed Sep 01 12:29:17 2010 +0100 @@ -0,0 +1,273 @@ +/* +* Copyright (c) 2005 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: ?Description +* +*/ + + +// INCLUDE FILES +#include "vcresource.h" +#include "rubydebug.h" +#include +#include +#include +#include +#include +#include + +// CONSTANTS + +// File name extension for EngineeringEnglish resource file +_LIT( KDefaultLanguageExtension, ".rsc" ); + +// Drives where resource file will be searched +const TBuf<2> KResourceDrives = _L("cz"); + + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CVcResource::CVcResource +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CVcResource::CVcResource( RFs& aRFs ) + : iRFs( aRFs ) + { + // Nothing + } + +// ----------------------------------------------------------------------------- +// CVcResource::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CVcResource::ConstructL( const TDesC& aFileName ) + { + RUBY_DEBUG_BLOCKL( "CVcResource::ConstructL" ); + + ResolveResourceFileL( aFileName ); + } + +// ----------------------------------------------------------------------------- +// CVcResource::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CVcResource* CVcResource::NewL( RFs& aRFs, const TDesC& aFileName ) + { + CVcResource* self = new( ELeave ) CVcResource( aRFs ); + + CleanupStack::PushL( self ); + self->ConstructL( aFileName ); + CleanupStack::Pop( self ); + + return self; + } + +// ----------------------------------------------------------------------------- +// CVcResource::~CVcResource +// Destructor. +// ----------------------------------------------------------------------------- +// +CVcResource::~CVcResource() + { + iKeys.Close(); + iCommands.ResetAndDestroy(); + iCommands.Close(); + iIntegerKeys.Close(); + iIntegerValues.Close(); + } + +// ----------------------------------------------------------------------------- +// CVcResource::GetCommand +// Gets the localized string based on integer key +// ----------------------------------------------------------------------------- +// +HBufC& CVcResource::GetCommandL( TInt aKey ) + { + RUBY_DEBUG_BLOCKL( "CVcResource::GetCommandL(TInt)" ); + + TInt index = iKeys.Find( aKey ); + User::LeaveIfError( index ); + + return *iCommands[ index ]; + } + +// ----------------------------------------------------------------------------- +// CVcXmlParser::ReadValueFromLocFile +// Gets the localized string based on descriptor key +// ----------------------------------------------------------------------------- +// +HBufC& CVcResource::GetCommandL( const TDesC& aKey ) + { + RUBY_DEBUG_BLOCKL( "CVcResource::GetCommandL(TDesC)" ); + + TInt length( 0 ); + TInt result( 0 ); + TDigitType dt( EDigitTypeWestern ); + result = NumberConversion::ConvertFirstNumber( aKey, length, dt ); + + if ( length == 0 ) + { + User::Leave( KErrNotFound ); + } + + return GetCommandL( result ); + } + +// ----------------------------------------------------------------------------- +// CVcResource::GetValueL +// Gets the localized string based on integer key +// ----------------------------------------------------------------------------- +// +TInt CVcResource::GetValueL( TInt aKey ) + { + RUBY_DEBUG_BLOCKL( "CVcResource::GetValueL(TInt)" ); + + TInt index = iIntegerKeys.Find( aKey ); + User::LeaveIfError( index ); + + return iIntegerValues[ index ]; + } + +// ----------------------------------------------------------------------------- +// CVcXmlParser::ReadValueFromLocFile +// Gets the localized string based on descriptor key +// ----------------------------------------------------------------------------- +// +TInt CVcResource::GetValueL( const TDesC& aKey ) + { + RUBY_DEBUG_BLOCKL( "CVcResource::GetValueL(TDesC)" ); + + TInt length( 0 ); + TInt result( 0 ); + TDigitType dt( EDigitTypeWestern ); + result = NumberConversion::ConvertFirstNumber( aKey, length, dt ); + + if ( length == 0 ) + { + User::Leave( KErrNotFound ); + } + + return GetValueL( result ); + } + + +// ----------------------------------------------------------------------------- +// CVcResource::ResolveResourceFileL +// Resolves the correct localized resource file name +// ----------------------------------------------------------------------------- +// +void CVcResource::ResolveResourceFileL( const TDesC& aFileName ) + { + RUBY_DEBUG_BLOCKL( "CVcXmlParser::ResolveResourceFileL" ); + + // Resource file found/not found flag + TBool found( EFalse ); + + TFileName name; + + name.Append( 'a' ); // this will be replaced by real drive letter + name.Append( ':' ); + name.Append( KDC_RESOURCE_FILES_DIR ); + name.Append( aFileName ); + name.Append( KDefaultLanguageExtension ); + + TDriveList drivelist; + User::LeaveIfError( iRFs.DriveList( drivelist ) ); + TInt drive( EDriveA ); + + while ( !found && drive <= EDriveZ ) + { + if ( drivelist[drive] ) + { + TChar driveLetter; + User::LeaveIfError( iRFs.DriveToChar( drive, driveLetter ) ); + name[0] = driveLetter; + + BaflUtils::NearestLanguageFile( iRFs, name ); + + if ( BaflUtils::FileExists( iRFs, name ) ) + { + // Read resource + found = ETrue; + ReadResourceFileL( iRFs, name ); + } + } + drive++; + } + + } + +// ----------------------------------------------------------------------------- +// CVcResource::ReadResourceFileL +// Loads the resource file content +// ----------------------------------------------------------------------------- +// +void CVcResource::ReadResourceFileL( RFs& aRfs, const TDesC& aFileName ) + { + RUBY_DEBUG_BLOCKL( "CVcXmlParser::ReadResourceFileL" ); + + RResourceFile resourceFile; + + resourceFile.OpenL( aRfs, aFileName ); + CleanupClosePushL( resourceFile ); + + HBufC8* res = resourceFile.AllocReadLC( VOICECOMMANDS ); + + TResourceReader reader; + reader.SetBuffer( res ); + + TInt index( 0 ); + TInt number( 0 ); + + // The first WORD contains the number + // of structs within the resource + number = reader.ReadInt16(); + + for ( index = 0; index < number ; index++ ) + { + TInt key = reader.ReadInt16(); + iKeys.Append( key ); + HBufC* command = reader.ReadHBufCL(); + iCommands.Append( command ); + } + + CleanupStack::PopAndDestroy( res ); + + + res = resourceFile.AllocReadLC( VCOMMANDINTEGERS ); + + reader.SetBuffer( res ); + + index = 0; + number = 0; + + // The first WORD contains the number + // of structs within the resource + number = reader.ReadInt16(); + + for ( index = 0; index < number ; index++ ) + { + iIntegerKeys.Append( reader.ReadInt16() ); + iIntegerValues.Append( reader.ReadInt16() ); + } + + CleanupStack::PopAndDestroy( res ); + CleanupStack::PopAndDestroy( &resourceFile ); + } + +// End of File