diff -r cad71a31b7fc -r e36f3802f733 srsf/ttscontrollerplugin/src/ttsplugindataloader.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/srsf/ttscontrollerplugin/src/ttsplugindataloader.cpp Wed Sep 01 12:29:17 2010 +0100 @@ -0,0 +1,483 @@ +/* +* Copyright (c) 2004-2006 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: Data buffer loader for TTPHwDevice test executable +* +*/ + + +// INCLUDE FILES +#include "ttsplugindataloader.h" + + + + +// CONSTANTS + +_LIT( KDriveZ, "z:" ); + +// Assuming language data file name is something like SRSF_2_x[y|yz].bin +const TInt KBeginningOfLanguageId = 7; +#ifdef __SIND_AUTOCONF_LID +const TUint32 KTtpAutoConfLidPackageType = 1; +const TUint32 KTtpAutoConfLidPackageID = 1; +const TInt KLidBufGranularity = 1000; +#endif // __SIND_AUTOCONF_LID + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CTTSDataLoaderLoader::CTTSDataLoader +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CTTSDataLoader::CTTSDataLoader( RFs& aFs, + TFileName& aGeneralFileName, + TFileName& aPrefixOfTTPFileName, + TFileName& aPostfixOfTTPFileName, + TFileName& aTTSFilename, + TFileName& aPostfixOfTTSFilename ) : + iGeneralFileName( aGeneralFileName ), + iPrefixOfTTPFileName( aPrefixOfTTPFileName ), + iPostfixOfTTPFileName( aPostfixOfTTPFileName ), + iTTSFileName( aTTSFilename ), + iPostfixOfTTSFileName( aPostfixOfTTSFilename ), + iFs( aFs ) + { + // Nothing + } + +// ----------------------------------------------------------------------------- +// CTTSDataLoader::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CTTSDataLoader::ConstructL() + { + // Nothing + } + +// ----------------------------------------------------------------------------- +// CTTSDataLoader::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CTTSDataLoader* CTTSDataLoader::NewL( RFs& aFs, + TFileName& aGeneralFileName, + TFileName& aPrefixOfTTPFileName, + TFileName& aPostfixOfTTPFileName, + TFileName& aTTSFilename, + TFileName& aPostfixOfTTSFilename ) + { + CTTSDataLoader* self = new ( ELeave ) CTTSDataLoader( aFs, + aGeneralFileName, + aPrefixOfTTPFileName, + aPostfixOfTTPFileName, + aTTSFilename, + aPostfixOfTTSFilename ); + + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + + return self; + } + +// ----------------------------------------------------------------------------- +// CTTSDataLoader::~CTTSDataLoader +// Destructor. +// ----------------------------------------------------------------------------- +// +CTTSDataLoader::~CTTSDataLoader() + { + } + +// ----------------------------------------------------------------------------- +// CTTSDataLoader::LoadGeneralData +// Load general TTP data +// ----------------------------------------------------------------------------- +// +HBufC8* CTTSDataLoader::LoadGeneralData( const TInt aPackageType, + const TInt aDataID, + TUint32 aStartPosition, + TUint32 aEndPosition ) + { + TFileName fileName( iGeneralFileName ); + fileName.AppendNum( aPackageType ); + fileName.Append( _L( "_" ) ); + fileName.AppendNum( aDataID ); + fileName.Append( iPostfixOfTTPFileName ); + + 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 && + aDataID == KTtpAutoConfLidPackageID ) + { + TRAPD( err, buffer = ConstructLidDataL() ); + if ( !err ) + { + return buffer; + } + } + +#endif // __SIND_AUTOCONF_LID + TRAPD( error, buffer = DoLoadL( fileName, aStartPosition, aEndPosition ) ); + if ( error == KErrNone ) + { + return buffer; + } + else + { + return NULL; + } + } + +// ----------------------------------------------------------------------------- +// CTTSDataLoader::LoadLanguageData +// Load TTP language data +// ----------------------------------------------------------------------------- +// +HBufC8* CTTSDataLoader::LoadLanguageData( const TInt aPackageType, + TLanguage aLanguage, + TUint32 aStartPosition, + TUint32 aEndPosition ) + { + TFileName fileName( iPrefixOfTTPFileName ); + fileName.AppendNum( aPackageType ); + fileName.Append( _L( "_" ) ); + fileName.AppendNum( ( TInt ) aLanguage ); + fileName.Append( iPostfixOfTTPFileName ); + + HBufC8* buffer( NULL ); + TRAPD( error, buffer = DoLoadL( fileName, aStartPosition, aEndPosition ) ); + if ( error == KErrNone ) + { + return buffer; + } + else + { + return NULL; + } + } + +// ----------------------------------------------------------------------------- +// CTTSDataLoader::LoadTtsData +// Load TTS general/language data +// ----------------------------------------------------------------------------- +// +HBufC8* CTTSDataLoader::LoadTtsData( const TInt aPackageType, + const TInt aDataID, + TUint32 aStartPosition, + TUint32 aEndPosition ) + { + TFileName fileName( iTTSFileName ); + fileName.AppendNum( aPackageType ); + fileName.Append( _L( "_" ) ); + fileName.AppendNum( aDataID ); + fileName.Append( iPostfixOfTTSFileName ); + + 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 && + aDataID == KTtpAutoConfLidPackageID ) + { + TRAPD( err, buffer = ConstructLidDataL() ); + if ( !err ) + { + return buffer; + } + } +#endif // __SIND_AUTOCONF_LID + + + TRAPD( error, buffer = DoLoadL( fileName, aStartPosition, aEndPosition ) ); + if ( error == KErrNone ) + { + return buffer; + } + else + { + return NULL; + } + } + +// ----------------------------------------------------------------------------- +// CTTSDataLoader::GetSupportedLanguagesL +// Fill aLanguages with supported language ids +// ----------------------------------------------------------------------------- +// +void CTTSDataLoader::GetSupportedLanguagesL( RArray& aLanguages ) + { + // Get pts languages + TFileName mask; + mask.Append( KDriveZ ); + mask.Append( iTTSFileName ); + mask.Append( _L( "2_*" ) ); + + DoGetSupportedLanguagesL( aLanguages, mask); + + // Get ttp languages + RArray ttpLanguages; + CleanupClosePushL( ttpLanguages ); + + mask.Zero(); + mask.Append( KDriveZ ); + mask.Append( iTTSFileName ); + mask.Append( _L( "0_*" ) ); + + DoGetSupportedLanguagesL( ttpLanguages, mask); + + // remove languages which are not supported in ttp + for ( TInt i(0); i < aLanguages.Count(); i++ ) + { + if ( ttpLanguages.Find( aLanguages[i] ) == KErrNotFound ) + { + aLanguages.Remove( i ); + } + } + CleanupStack::PopAndDestroy( &ttpLanguages ); + } + +// ----------------------------------------------------------------------------- +// CTTSDataLoader::DoLoadL +// Loads the given file. +// ----------------------------------------------------------------------------- +// +HBufC8* CTTSDataLoader::DoLoadL( TFileName& iFile, + TUint32 aStartPosition, + TUint32 aEndPosition ) + { + TInt fileSize( 0 ); + RFile dataFile; + TInt readLength; + + TFileName completeFile; + completeFile.Append( KDriveZ ); + completeFile.Append( iFile ); + + + // Try to open file from Z drive + TInt err = dataFile.Open( iFs, completeFile, EFileRead ); + + if ( err != KErrNone ) + { + return NULL; + } + + + // Try to resolve how much should be read + readLength = aEndPosition - aStartPosition; + if ( dataFile.Size( fileSize ) != KErrNone ) + { + dataFile.Close(); + return NULL; + } + if ( fileSize == 0 ) + { + dataFile.Close(); + return NULL; + } + + 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::NewL( readLength ); + + TPtr8 bufferPtr( fileBuffer->Des() ); + + err = dataFile.Read( bufferPtr ); + + dataFile.Close(); + + if ( err != KErrNone ) + { + delete fileBuffer; + return NULL; + } + + return fileBuffer; + } + +// ----------------------------------------------------------------------------- +// CTTSDataLoader::DoGetSupportedLanguagesL +// Fill aLanguages with supported language ids +// ----------------------------------------------------------------------------- +// +void CTTSDataLoader::DoGetSupportedLanguagesL( RArray& aLanguages, + TFileName& aMask ) + { + CDir *directoryList( NULL ); + TInt error = iFs.GetDir( aMask, KEntryAttDir, ESortByName, directoryList ); + CleanupStack::PushL( directoryList ); + + if ( !error ) + { + TInt count = directoryList->Count(); + + for ( TInt i( 0 ); i < count; i++ ) + { + TPtrC tmp = (*directoryList)[i].iName; + + TInt64 id; + TLex parser( tmp.Mid( KBeginningOfLanguageId , + tmp.Find( _L(".") ) - KBeginningOfLanguageId ) ); + + User::LeaveIfError( parser.Val( id) ); + + TLanguage lang( (TLanguage)id ); + + if ( aLanguages.Find( lang ) == KErrNotFound ) + { + aLanguages.AppendL( lang ); + } + } + } + + CleanupStack::PopAndDestroy( directoryList ); + } + +// ----------------------------------------------------------------------------- +// CTTSDataLoader::PackageName +// Construct filename for requested package +// ----------------------------------------------------------------------------- +// +void CTTSDataLoader::PackageName (TFileName &aFileName, TUint32 aPackageType, TUint32 aPackageID) +{ + // Resolve the name of the file + // filename is __ + + aFileName.Copy( iPrefixOfTTPFileName ); // path/SRSF_ + aFileName.AppendNumUC( aPackageType ); // path/SRSF_1 + aFileName.Append( _L( "_" ) ); // path/SRSF_1_ + aFileName.AppendNumUC( aPackageID ); // path/SRSF_1_326 + aFileName.Append( iPostfixOfTTPFileName ); // path/SRSF_1_326.bin +} + +#ifdef __SIND_AUTOCONF_LID +// ----------------------------------------------------------------------------- +// CTTSDataLoader::AppendLoadL +// Load language package file to the end of buffer +// ----------------------------------------------------------------------------- +// +void CTTSDataLoader::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 + } +} + + + +// ----------------------------------------------------------------------------- +// CTTSDataLoader::LoadSysLangPackagesL +// Load LID language data to a buffer according to installed system languages +// ----------------------------------------------------------------------------- +// +void CTTSDataLoader::SysLangPackagesToBufferL( CBufBase *aBuffer ) + { + + // Get installed languages + RArray languages; + CleanupClosePushL( languages ); + + TFileName mask; + mask.Append( KDriveZ ); + mask.Append( iTTSFileName ); + mask.Append( _L( "1_*" ) ); + DoGetSupportedLanguagesL( languages, mask); + + // Loop over installed languages + for ( TInt i = 0 ; i < languages.Count(); i++ ) + { + AppendLoadL(aBuffer, KTtpAutoConfLidPackageType, languages[i] ); + }// next language + + CleanupStack::PopAndDestroy( &languages ); + } + +// ----------------------------------------------------------------------------- +// CTTSDataLoader::ConstructLidDataL +// Load LID language data to a buffer according to installed system languages +// ----------------------------------------------------------------------------- +// +HBufC8* CTTSDataLoader::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 + +// End of File