diff -r cad71a31b7fc -r e36f3802f733 srsf/sisrscontrollerplugin/src/asrplugindataloader.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/srsf/sisrscontrollerplugin/src/asrplugindataloader.cpp Wed Sep 01 12:29:17 2010 +0100 @@ -0,0 +1,336 @@ +/* +* Copyright (c) 2004 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: Language package data file loader +* +*/ + + +// INCLUDE FILES +#include "asrplugindataloader.h" +#include "sysconfigprovider.h" + + +#ifdef __SIND_AUTOCONF_LID +#include +/* MSysConfigProvider is a wrapper for get syslangutil. This makes it easier to test without */ +/* dependency to the actual language configuration in the emulator environment. The test */ +/* class implements this interface. */ +class TDefaultConfig : public MSysConfigProvider { +public: + TDefaultConfig() {}; + ~TDefaultConfig() {}; + TInt GetInstalledLanguages( CArrayFixFlat*& aLanguages, RFs* aFileServerSession = NULL ) + { + return SysLangUtil::GetInstalledLanguages(aLanguages, aFileServerSession); + }; +}; +#endif // __SIND_AUTOCONF_LID + +// Local constants + +_LIT( KZDriveLetter, "z" ); + + +#ifdef __SIND_AUTOCONF_LID +const TUint32 KTtpAutoConfLidPackageType = 1; +const TUint32 KTtpAutoConfLidPackageID = 1; +const TInt KLidBufGranularity = 1000; +#endif // __SIND_AUTOCONF_LID + + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CDataLoaderLoader::CDataLoader +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CDataLoader::CDataLoader() + { + // Nothing + } + +// ----------------------------------------------------------------------------- +// CDataLoader::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CDataLoader::ConstructL( const TDesC& aPrefixOfFileName, + const TDesC& aSeparator, + const TDesC& aPostfixOfFileName, + MSysConfigProvider *aProvider ) + { + iPrefixOfFileName = HBufC::NewL( aPrefixOfFileName.Length() ); + (*iPrefixOfFileName) = aPrefixOfFileName; + iSeparator = HBufC::NewL( aSeparator.Length() ); + (*iSeparator) = aSeparator; + iPostfixOfFileName = HBufC::NewL( aPostfixOfFileName.Length() ); + (*iPostfixOfFileName) = aPostfixOfFileName; + + iProvider = aProvider; + + // Open file session + User::LeaveIfError( iFs.Connect() ); + } + +// ----------------------------------------------------------------------------- +// CDataLoader::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CDataLoader* CDataLoader::NewL( const TDesC& aPrefixOfFileName, + const TDesC& aSeparator, + const TDesC& aPostfixOfFileName, + MSysConfigProvider *aProvider ) + { + CDataLoader* self = new ( ELeave ) CDataLoader(); + + CleanupStack::PushL( self ); + self->ConstructL( aPrefixOfFileName, + aSeparator, + aPostfixOfFileName, + aProvider); + CleanupStack::Pop( self ); + + return self; + } + +// ----------------------------------------------------------------------------- +// CDataLoader::~CDataLoader +// Destructor. +// ----------------------------------------------------------------------------- +// +CDataLoader::~CDataLoader() + { + delete iPrefixOfFileName, + delete iSeparator, + delete iPostfixOfFileName; + + iFs.Close(); + } + +// ----------------------------------------------------------------------------- +// CDataLoader::PackageName +// Construct filename for requested package +// ----------------------------------------------------------------------------- +// +void CDataLoader::PackageName (TFileName &aFileName, TUint32 aPackageType, TUint32 aPackageID) +{ + // Resolve the name of the file + // filename is __ + + aFileName.Copy( iPrefixOfFileName->Des() ); // path/SRSF_ + aFileName.AppendNumUC( aPackageType ); // path/SRSF_1 + aFileName.Append( iSeparator->Des() ); // path/SRSF_1_ + aFileName.AppendNumUC( aPackageID ); // path/SRSF_1_326 + aFileName.Append( iPostfixOfFileName->Des() ); // path/SRSF_1_326.bin +} + +#ifdef __SIND_AUTOCONF_LID +// ----------------------------------------------------------------------------- +// CDataLoader::AppendLoadL +// Load language package file to the end of buffer +// ----------------------------------------------------------------------------- +// +void CDataLoader::AppendLoadL( CBufBase *aBuffer, + TUint32 aPackageType, + TUint32 aPackageID ) +{ + // Resolve filename + TFileName fileName; + PackageName (fileName, aPackageType, aPackageID); + + // Load data + HBufC8* buffer = NULL; + + TRAPD( err, buffer = DoLoadL( fileName, 0, KMaxTUint32 )); // IMPLICIT: LID packages are loaded completely + if( err == KErrNone && buffer ) + { + CleanupStack::PushL( buffer ); // ResizeL may leave below + + TInt prevSize = aBuffer->Size(); // size before resize + TInt newSize = aBuffer->Size() + buffer->Size(); // new size for lid data buffer + + aBuffer->ResizeL( newSize ); // resize lid data buffer + aBuffer->Write( prevSize, *buffer ); // append data from read buffer + + CleanupStack::PopAndDestroy(buffer); // buffer copied -> free + } +} + + + +// ----------------------------------------------------------------------------- +// CDataLoader::LoadSysLangPackagesL +// Load LID language data to a buffer according to installed system languages +// ----------------------------------------------------------------------------- +// +void CDataLoader::SysLangPackagesToBufferL( CBufBase *aBuffer ) +{ + MSysConfigProvider *config = iProvider; + TDefaultConfig defaultProvider; + if (!config) config = &defaultProvider; + + // Get installed languages + CArrayFixFlat* languages( NULL ); + + //User::LeaveIfError (SysLangUtil::GetInstalledLanguages(languages, &iFs)); + User::LeaveIfError (config->GetInstalledLanguages(languages, &iFs)); + CleanupStack::PushL( languages ) ; + + // Loop over installed languages + for ( TInt i = 0 ; i < languages->Count(); i++ ) + { + AppendLoadL(aBuffer, KTtpAutoConfLidPackageType, languages->At(i)); + }// next language + + CleanupStack::PopAndDestroy( languages ); +} + +// ----------------------------------------------------------------------------- +// CDataLoader::ConstructLidDataL +// Load LID language data to a buffer according to installed system languages +// ----------------------------------------------------------------------------- +// +HBufC8* CDataLoader::ConstructLidDataL() +{ + CBufBase* lidDataBuffer = CBufSeg::NewL( KLidBufGranularity ) ; // accumulates the binary data from lid model files + CleanupStack::PushL( lidDataBuffer ) ; + + SysLangPackagesToBufferL (lidDataBuffer); + + // Prepare returnable data + HBufC8* dataBuffer = NULL; + + if( lidDataBuffer->Size() > 0 ) + { + // If any data was loaded, create a buffer for it + dataBuffer = HBufC8::NewL( lidDataBuffer->Size() ); // create a returnable buffer + TPtr8 dataBufferPtr = dataBuffer->Des(); // get a modifiable pointer to it + lidDataBuffer->Read( 0, dataBufferPtr, lidDataBuffer->Size() ); // put the lid data into it + } + + CleanupStack::PopAndDestroy( lidDataBuffer ) ; + + return dataBuffer; +} +#endif // __SIND_AUTOCONF_LID + + +// ----------------------------------------------------------------------------- +// CDataLoader::LoadData +// Load language package file. It resolves the name of the language package +// ----------------------------------------------------------------------------- +// +HBufC8* CDataLoader::LoadData( TUint32 aPackageType, + TUint32 aPackageID, + TUint32 aStartPosition, + TUint32 aEndPosition ) { + + TInt err; + HBufC8* buffer = NULL; + +#ifdef __SIND_AUTOCONF_LID + // If LID data is requested, construct it from installed LID binary files + // Otherwise run normal data loading + + if( aPackageType == KTtpAutoConfLidPackageType && + aPackageID == KTtpAutoConfLidPackageID ) + { + TRAP( err, buffer = ConstructLidDataL() ); + } +#endif // __SIND_AUTOCONF_LID + + if (!buffer) { + TFileName fileName; + PackageName (fileName, aPackageType, aPackageID); + + // Load data + TRAP( err, buffer = DoLoadL( fileName, aStartPosition, aEndPosition ) ); + } + + if ( err == KErrNone ) + { + return buffer; + } + else + { + return NULL; + } +} + + + +// ----------------------------------------------------------------------------- +// CDataLoader::DoLoadL +// Actual file loading function +// ----------------------------------------------------------------------------- +// +HBufC8* CDataLoader::DoLoadL( TFileName& aFileName, + TUint32 aStartPosition, + TUint32 aEndPosition ) + { + TInt fileSize( 0 ); + RFile dataFile; + TInt readLength; + + // Open file + TInt err = dataFile.Open( iFs, aFileName, EFileRead); + + if ( err != KErrNone ) + { + aFileName.Replace(0,1,KZDriveLetter); // "z:\" + TInt err = dataFile.Open( iFs, aFileName, EFileRead); + if ( err != KErrNone ) + { + return NULL; + } + } + + CleanupClosePushL( dataFile ); + // Try to resolve how much should be read + readLength = aEndPosition - aStartPosition; + User::LeaveIfError( dataFile.Size( fileSize ) ); + + if ( aEndPosition != KMaxTUint32 ) + { + // Cannot read more than filesize + if ( ( readLength > fileSize ) || ( readLength < 0 ) ) + { + readLength = fileSize; + } + } + else + { + readLength = fileSize; + } + + // Seek the starting point + // Casting needed to convert from uint to int which is needed by Seek() + TInt startPosition = ( TInt ) aStartPosition; + dataFile.Seek( ESeekStart, startPosition ); + + // Reserve enough memory for the data + HBufC8* fileBuffer = HBufC8::NewLC( readLength ); + TPtr8 bufferPtr( fileBuffer->Des() ); + + User::LeaveIfError( dataFile.Read( bufferPtr ) ); + + CleanupStack::Pop( fileBuffer ); + CleanupStack::PopAndDestroy( &dataFile ); + return fileBuffer; + } + +// End of File