diff -r 000000000000 -r e6b17d312c8b ximpfw/tsrc/tsrcutils/testcaseutils/prfwtestfiletool.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ximpfw/tsrc/tsrcutils/testcaseutils/prfwtestfiletool.cpp Thu Dec 17 08:54:49 2009 +0200 @@ -0,0 +1,502 @@ +/* +* Copyright (c) 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: Test support file tool + * +*/ + + + +#include +#include +#include + +#include "prfwtestfiletool.h" +#include "prfwtestfilesrvmsg.h" +#include "ximpeventcodec.h" +#include "prfwtestfileobserver.h" + +/* Hierarchy under C:/temp/prfw/: + * /protocoluid/instancenumber/Plugin\ + * /protocoluid/instancenumber/SrvMsg\ + */ + +_LIT( KFileToolMainDirFull, "c:\\temp\\prfw" ); + +_LIT( KFileToolBackslash, "\\" ); +_LIT( KFileToolDirUid, "%d" ); +_LIT( KInstanceAsNumber, "%d" ); + +_LIT( KFileToolPluginDirBase, "Plugin" ); +_LIT( KFileToolSrvDirBase, "SrvMsg" ); + +_LIT( KFileToolWildcard, "file*.prfw" ); +_LIT( KFileToolFileBase, "file%d.prfw" ); + +// ======== LOCAL FUNCTIONS ======== + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// ?description_if_needed +// --------------------------------------------------------------------------- +// +CXIMPTestFileTool::CXIMPTestFileTool( TUint32 aUid ) : + iUid( aUid ) + { + iFs.Connect(); + } + +// --------------------------------------------------------------------------- +// ?description_if_needed +// --------------------------------------------------------------------------- +// +void CXIMPTestFileTool::ConstructL( const TDesC16& aInstanceId ) + { + iTimer = CPeriodic::NewL( CActive::EPriorityStandard ); + iInstance = aInstanceId.AllocL(); + } + +// --------------------------------------------------------------------------- +// ?description_if_needed +// --------------------------------------------------------------------------- +// +void CXIMPTestFileTool::ConstructL( TInt aInstanceIdAsNum ) + { + TInt instanceLength = NumLenInChars( aInstanceIdAsNum ); + HBufC* instance = HBufC::NewLC( instanceLength ); + instance->Des().AppendFormat( KInstanceAsNumber, aInstanceIdAsNum ); + ConstructL( *instance ); + CleanupStack::PopAndDestroy( instance ); + } + +// --------------------------------------------------------------------------- +// ?description_if_needed +// --------------------------------------------------------------------------- +// +EXPORT_C CXIMPTestFileTool* CXIMPTestFileTool::NewL( TUint32 aUid, const TDesC16& aInstanceId ) + { + CXIMPTestFileTool* self = new( ELeave ) CXIMPTestFileTool( aUid ); + CleanupStack::PushL( self ); + self->ConstructL( aInstanceId ); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// ?description_if_needed +// --------------------------------------------------------------------------- +// +EXPORT_C CXIMPTestFileTool* CXIMPTestFileTool::NewL( TUint32 aUid, TInt aInstanceIdAsNum ) + { + CXIMPTestFileTool* self = new( ELeave ) CXIMPTestFileTool( aUid ); + CleanupStack::PushL( self ); + self->ConstructL( aInstanceIdAsNum ); + CleanupStack::Pop( self ); + return self; + } + + +// --------------------------------------------------------------------------- +// ?description_if_needed +// --------------------------------------------------------------------------- +// +CXIMPTestFileTool::~CXIMPTestFileTool() + { + iFs.Close(); + if ( iTimer ) + { + iTimer->Deque(); + } + delete iTimer; + iObservers.Close(); + delete iInstance; + } + +// --------------------------------------------------------------------------- +// Remove the entire prfw directory +// --------------------------------------------------------------------------- +// +EXPORT_C void CXIMPTestFileTool::CleanAllL() + { + RFs fs; + fs.Connect(); + CleanupClosePushL( fs ); + + CFileMan* fileMan = CFileMan::NewL( fs ); + CleanupStack::PushL( fileMan ); + + // remove the files and the directory + fileMan->RmDir( KFileToolMainDirFull ); + + CleanupStack::PopAndDestroy( 2 ); // fileman, fs + } + +// --------------------------------------------------------------------------- +// Prepare everything, after this objects can be externalized and +// internalized +// --------------------------------------------------------------------------- +// +EXPORT_C void CXIMPTestFileTool::PrepareL() + { + // create the directory structure + HBufC* dirName = GetDirNameAndBackslashLC( KFileToolPluginDirBase ); + iFs.MkDirAll( *dirName ); + CleanupStack::PopAndDestroy( dirName ); + + dirName = GetDirNameAndBackslashLC( KFileToolSrvDirBase ); + iFs.MkDirAll( *dirName ); + CleanupStack::PopAndDestroy( dirName ); + } + +// --------------------------------------------------------------------------- +// Write the file to correct directory. +// --------------------------------------------------------------------------- +// +EXPORT_C void CXIMPTestFileTool::PluginStoreL( const TDesC8& aExternalizedObject ) + { + HBufC* fileName = GetFileNameLC( + KFileToolPluginDirBase, + iObjIndex ); + + RFileWriteStream out; + CleanupClosePushL( out ); + out.Create( iFs, *fileName, EFileWrite|EFileStream|EFileShareAny ); + + // write the file + TUint32 len = aExternalizedObject.Length(); + out.WriteUint32L( len ); + out.WriteL( aExternalizedObject ); + CleanupStack::PopAndDestroy(); // out + + CleanupStack::PopAndDestroy( fileName ); // fileName + + // next file will have a new index + iObjIndex++; + } + +// --------------------------------------------------------------------------- +// Restore the file from given directory and given index +// --------------------------------------------------------------------------- +// +EXPORT_C CXIMPApiEventBase* CXIMPTestFileTool::PluginRestoreLC( + TInt aObjIndex ) + { + HBufC* fileName = GetFileNameLC( + KFileToolPluginDirBase, + aObjIndex ); + + // try to instantiate it + RFileReadStream in; + CleanupClosePushL( in ); + + in.Open( iFs, *fileName, EFileStream ); + TInt len = in.ReadUint32L(); + HBufC8* buffer = HBufC8::NewLC( len ); + TPtr8 ptr = buffer->Des(); + in.ReadL( ptr ); + + // instantiate the object + TInt32 dummy = 0; + CXIMPApiEventBase* object = XIMPEventCodec::UnPackL( *buffer, dummy ); + + CleanupStack::PopAndDestroy( 2 ); // buffer, in + + // delete the just read object + iFs.Delete( *fileName ); + + CleanupStack::PopAndDestroy( fileName ); + + CleanupStack::PushL( object ); + return object; + } + +// --------------------------------------------------------------------------- +// Write the server message object to correct directory. +// --------------------------------------------------------------------------- +// +EXPORT_C void CXIMPTestFileTool::SrvMsgStoreL( + CXIMPTestFileSrvMsg* aSrvMsg ) + { + TInt nextObjIndex = NumSrvMsgL(); + HBufC* fileName = GetFileNameLC( + KFileToolSrvDirBase, + nextObjIndex); + + RFileWriteStream out; + CleanupClosePushL( out ); + TInt retVal = out.Create( iFs, *fileName, EFileWrite|EFileStream|EFileShareAny ); + User::LeaveIfError( retVal ); + + aSrvMsg->ExternalizeL( out ); + + CleanupStack::PopAndDestroy( 2, fileName ); // out, fileName + + // next file will have a new index + //iSrvObjIndex++; + } + +// --------------------------------------------------------------------------- +// Restore the file from given directory and given index +// --------------------------------------------------------------------------- +// +EXPORT_C CXIMPTestFileSrvMsg* CXIMPTestFileTool::SrvMsgRestoreLC( + TInt aObjIndex ) + { + CXIMPTestFileSrvMsg* msg = CXIMPTestFileSrvMsg::NewLC(); + + HBufC* fileName = GetFileNameLC( + KFileToolSrvDirBase, + aObjIndex ); + + // try to instantiate it + RFileReadStream in; + CleanupClosePushL( in ); + + in.Open( iFs, *fileName, EFileStream ); + + msg->InternalizeL( in ); + + CleanupStack::PopAndDestroy(); // in + + // delete the just read object + iFs.Delete( *fileName ); + + CleanupStack::PopAndDestroy( fileName ); // fileName + return msg; + } + +// --------------------------------------------------------------------------- +// Common file counting helper +// --------------------------------------------------------------------------- +// +TInt CXIMPTestFileTool::DoNumObjectsL( const TDesC& aTemplate ) + { + CDir* dir = GetDirListL( aTemplate ); + TInt count = dir->Count(); + delete dir; + return count; + } + +// --------------------------------------------------------------------------- +// Number of objects (files) in a given directory +// --------------------------------------------------------------------------- +// +EXPORT_C TInt CXIMPTestFileTool::NumObjectsL() + { + return DoNumObjectsL( KFileToolPluginDirBase ); + } + +// --------------------------------------------------------------------------- +// Number of server-originated objects (files) in a given directory +// --------------------------------------------------------------------------- +// +EXPORT_C TInt CXIMPTestFileTool::NumSrvMsgL() + { + // returns the number of objects in the directory + // get file listing and derive the count from that + return DoNumObjectsL( KFileToolSrvDirBase ); + } + +// --------------------------------------------------------------------------- +// Instace id +// --------------------------------------------------------------------------- +// +EXPORT_C const TDesC16& CXIMPTestFileTool::InstanceId() const + { + return *iInstance; + } + +// --------------------------------------------------------------------------- +// Length of number in characters (e.g. 501 --> 3) +// --------------------------------------------------------------------------- +// +TInt CXIMPTestFileTool::NumLenInChars( TInt aNum ) + { + TInt len = 0; + TInt tmp = aNum; + do + { + tmp /= 10; // number is base-10 + len++; + } + while ( tmp > 0 ); + return len; + } + +// --------------------------------------------------------------------------- +// Gets properly expanded directory name with backslash appended +// --------------------------------------------------------------------------- +// +HBufC* CXIMPTestFileTool::GetDirNameAndBackslashLC( + const TDesC& aTemplate ) + { + TInt uidLength = NumLenInChars( iUid ); + TInt instanceLength = iInstance->Length(); + + HBufC* dirName = HBufC::NewLC( + KFileToolMainDirFull().Length() + + KFileToolBackslash().Length() + + KFileToolDirUid().Length() + -2 // "%d" gets modified to be the number + + KFileToolBackslash().Length() + + uidLength + instanceLength + + KFileToolBackslash().Length() + + aTemplate.Length() + + KFileToolBackslash().Length() // added for later use by GetDirNameAndBackslashLC. + ); + + dirName->Des().Append( KFileToolMainDirFull ); + dirName->Des().Append( KFileToolBackslash ); + dirName->Des().AppendFormat( KFileToolDirUid, iUid ); + dirName->Des().Append( KFileToolBackslash ); + dirName->Des().Append( *iInstance ); + dirName->Des().Append( KFileToolBackslash ); + dirName->Des().Append( aTemplate ); + + dirName->Des().Append( KFileToolBackslash ); + iFs.MkDirAll( *dirName ); + return dirName; + } + +// --------------------------------------------------------------------------- +// Get full path wildcard for files residing in a directory +// with given index +// --------------------------------------------------------------------------- +// +HBufC* CXIMPTestFileTool::GetWildcardLC( + const TDesC& aDirTemplate ) + { + HBufC* dirName = GetDirNameAndBackslashLC( aDirTemplate ); + HBufC* wildcard = HBufC::NewLC( + dirName->Length() + KFileToolWildcard().Length() ); + wildcard->Des().Append( *dirName ); + wildcard->Des().Append( KFileToolWildcard ); + + CleanupStack::Pop( 2 ); // wildcard, dirName + delete dirName; + + CleanupStack::PushL( wildcard ); + return wildcard; + } + +// --------------------------------------------------------------------------- +// Get a list of files in a given directory +// --------------------------------------------------------------------------- +// +CDir* CXIMPTestFileTool::GetDirListL( const TDesC& aTemplate ) + { + HBufC* wildcard = GetWildcardLC( aTemplate ); + + CDir* dirList = NULL; + iFs.GetDir( *wildcard, KEntryAttNormal, ESortByName, dirList ); + CleanupStack::PopAndDestroy( wildcard ); + + return dirList; + } + +// --------------------------------------------------------------------------- +// Get fully qualified file name +// --------------------------------------------------------------------------- +// +HBufC* CXIMPTestFileTool::GetFileNameLC( + const TDesC& aDirTemplate, + TInt aObjIndex ) + { + // create file name + HBufC* dirName = GetDirNameAndBackslashLC( aDirTemplate ); + + TInt numLen = NumLenInChars( aObjIndex ); + HBufC* fileName = HBufC::NewLC( + dirName->Length() + + KFileToolFileBase().Length() + + numLen + - 2 // "%d" gets modified to be the number + ); + fileName->Des().Append( *dirName ); + fileName->Des().AppendFormat( KFileToolFileBase, aObjIndex ); + + CleanupStack::Pop( fileName ); + CleanupStack::PopAndDestroy( dirName ); + CleanupStack::PushL( fileName ); + + // now we have the filename + return fileName; + } + +const TInt KSecond = 1000000; + +// --------------------------------------------------------------------------- +// CXIMPTestFileTool::RegisterObserverL +// --------------------------------------------------------------------------- +// +void CXIMPTestFileTool::RegisterObserverL( MXIMPTestFileObserver* aObserver ) + { + iObservers.AppendL( aObserver ); + if( !iTimer->IsActive() ) + { + TCallBack callback( Process, this ); + iTimer->Start( KSecond, KSecond, callback ); + } + } + +// --------------------------------------------------------------------------- +// CXIMPTestFileTool::UnregisterObserver +// --------------------------------------------------------------------------- +// +void CXIMPTestFileTool::UnregisterObserver( MXIMPTestFileObserver* aObserver ) + { + TInt index = iObservers.Find( aObserver ); + if( index != KErrNotFound ) + { + iObservers.Remove( index ); + } + if( iObservers.Count() == 0 ) + { + iTimer->Cancel(); + } + } + + +// --------------------------------------------------------------------------- +// CXIMPTestFileTool::RunL +// --------------------------------------------------------------------------- +// +TInt CXIMPTestFileTool::Process( TAny* aMyself ) + { + TRAPD( ignore, ( static_cast< CXIMPTestFileTool* >( aMyself ) )->DoProcessL() ); + return 0; // ignored by CPeriodic + } + +// --------------------------------------------------------------------------- +// CXIMPTestFileTool::RunL +// --------------------------------------------------------------------------- +// +void CXIMPTestFileTool::DoProcessL() + { + TInt countOfSrvMsg = NumSrvMsgL(); + TInt countOfObservers = iObservers.Count(); + + for( TInt a = 0; a < countOfSrvMsg; ++a ) + { + CXIMPTestFileSrvMsg* newMsg = SrvMsgRestoreLC( a ); + for( TInt b = 0;b < countOfObservers; ++b ) + { + iObservers[ b ]->HandleL( newMsg->SrvMsgId(), newMsg->PayloadL() ); + } + CleanupStack::PopAndDestroy( newMsg ); + } + } + + +// End of file