diff -r 8ce15fced3a6 -r cad71a31b7fc srsf/sisrscontrollerplugin/src/asrplugindataloader.cpp --- a/srsf/sisrscontrollerplugin/src/asrplugindataloader.cpp Thu Aug 19 09:56:14 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,336 +0,0 @@ -/* -* 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