ximpfw/tsrc/tsrcutils/testcaseutils/prfwtestfiletool.cpp
changeset 0 e6b17d312c8b
--- /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 <e32std.h>
+#include <f32file.h>
+#include <s32file.h>
+
+#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