stif/TestServer/src/Testserversession.cpp
branchRCL_3
changeset 40 07b41fa8d1dd
parent 39 3406c99bc375
child 43 ca8a1b6995f6
--- a/stif/TestServer/src/Testserversession.cpp	Thu Jul 15 20:25:38 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1673 +0,0 @@
-/*
-* Copyright (c) 2009 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: This module contains implementation of CTestServer 
-* class member functions.
-*
-*/
-
-// INCLUDE FILES
-#include <e32std.h>
-#include <e32svr.h>
-#include "TestEngineClient.h"
-#include <StifTestModule.h>
-#include <stifinternal/TestServerClient.h>
-#include "TestServer.h"
-#include "TestServerCommon.h"
-#include "TestServerModuleIf.h"
-
-// EXTERNAL DATA STRUCTURES
-
-// EXTERNAL FUNCTION PROTOTYPES  
-
-// CONSTANTS
-
-// MACROS
-
-// LOCAL CONSTANTS AND MACROS
-
-// MODULE DATA STRUCTURES
-// Struct to pass parameters to server thread
-struct TThreadStartTestServerSession
-    {
-    RThread    iServerThread; // The server thread
-    RSemaphore iStarted;      // Startup syncronisation semaphore   
-    TInt       iStartupResult;// Start-up result
-    };
-
-// LOCAL FUNCTION PROTOTYPES
-
-// FORWARD DECLARATIONS
-
-// ==================== LOCAL FUNCTIONS =======================================
-
-// None
-
-// ================= MEMBER FUNCTIONS =========================================
-
-/*
--------------------------------------------------------------------------------
-
-    Class: CTestCasesList
-
-    Method: NewL
-
-    Description: Create new test cases list    
-
-    Parameters: const TDesC& aConfigFileName :in:  Config file name
-
-    Return Values: CTestCasesList* Pointer to new test cases list
-
-    Errors/Exceptions: Leaves if memory allocation fails or ConstructL leaves.
-
-    Status: Approved
-
--------------------------------------------------------------------------------
-*/
-CTestCasesList* CTestCasesList::NewL( const TDesC& aConfigFileName )
-    {    
-    CTestCasesList* self = new(ELeave)CTestCasesList;
-    CleanupStack::PushL( self );
-    self->ConstructL( aConfigFileName );
-    CleanupStack::Pop( self );
-    return self;
-    }
-
-/*
--------------------------------------------------------------------------------
-
-    Class: CTestCasesList
-
-    Method: ~CTestCasesList
-
-    Description: Destructor    
-
-    Parameters: 
-
-    Return Values: 
-
-    Errors/Exceptions: 
-
-    Status: Approved
-
--------------------------------------------------------------------------------
-*/
-CTestCasesList::~CTestCasesList()
-    {
-    delete iConfigFileName;
-    iConfigFileName = NULL;
-    iTestCases.ResetAndDestroy();
-    iTestCases.Close();
-    }
-
-/*
--------------------------------------------------------------------------------
-
-    Class: CTestCasesList
-
-    Method: AppendTestCaseL
-
-    Description: Appends test case.
-
-    Parameters: const TDesC& aTestCaseTitle  in: Test case title
-
-    Return Values: 
-
-    Errors/Exceptions: Leaves if memory allocation fails
-
-    Status: Approved
-
--------------------------------------------------------------------------------
-*/
-void CTestCasesList::AppendTestCaseL( const TDesC& aTestCaseTitle )
-    {
-    HBufC* testCaseTitle = aTestCaseTitle.AllocL();
-    CleanupStack::PushL( testCaseTitle );
-    iTestCases.AppendL( testCaseTitle );
-    CleanupStack::Pop( testCaseTitle );
-    }
-
-/*
--------------------------------------------------------------------------------
-
-    Class: CTestCasesList
-
-    Method: GetTestCaseTitleL
-
-    Description: Returns specified test case title  
-
-    Parameters: TInt aIndex: in: Requested test case index. 
-
-    Return Values: Test case title.
-
-    Errors/Exceptions: Leaves if test case index is invalid
-
-    Status: Approved
-
--------------------------------------------------------------------------------
-*/
-const TDesC& CTestCasesList::GetTestCaseTitleL( TInt aIndex ) const
-    {    
-    if ( ( aIndex < 0 ) || ( aIndex >= iTestCases.Count() ) )
-        {
-        User::Leave( KErrNotFound );
-        }
-    return *iTestCases[ aIndex ];
-    }
-
-/*
--------------------------------------------------------------------------------
-
-    Class: CTestCasesList
-
-    Method: GetConfigFileName
-
-    Description: Returns config file name  
-
-    Parameters: 
-
-    Return Values: Config file name.
-
-    Errors/Exceptions: 
-
-    Status: Approved
-
--------------------------------------------------------------------------------
-*/
-const TDesC& CTestCasesList::GetConfigFileName() const
-    {    
-    return *iConfigFileName;
-    }
-
-/*
--------------------------------------------------------------------------------
-
-    Class: CTestCasesList
-
-    Method: Count
-
-    Description: Returns count of test cases.    
-
-    Parameters: 
-
-    Return Values: Test cases count.
-
-    Errors/Exceptions: 
-
-    Status: Approved
-
--------------------------------------------------------------------------------
-*/
-TInt CTestCasesList::Count() const
-    {
-    return iTestCases.Count();
-    }
-
-/*
--------------------------------------------------------------------------------
-
-    Class: CTestCasesList
-
-    Method: ResetAndDestroy
-
-    Description: Resets list of test cases.    
-
-    Parameters: 
-
-    Return Values: 
-
-    Errors/Exceptions: 
-
-    Status: Approved
-
--------------------------------------------------------------------------------
-*/
-void CTestCasesList::ResetAndDestroy()
-    {    
-    iTestCases.ResetAndDestroy();
-    }
-
-/*
--------------------------------------------------------------------------------
-
-    Class: CTestCasesList
-
-    Method: ~CTestCasesList
-
-    Description: Destructor    
-
-    Parameters: 
-
-    Return Values: 
-
-    Errors/Exceptions: 
-
-    Status: Approved
-
--------------------------------------------------------------------------------
-*/
-CTestCasesList::CTestCasesList()
-    {
-    }
-
-/*
--------------------------------------------------------------------------------
-
-    Class: CTestCasesList
-
-    Method: ~CTestCasesList
-
-    Description: Destructor    
-
-    Parameters: 
-
-    Return Values: 
-
-    Errors/Exceptions: 
-
-    Status: Approved
-
--------------------------------------------------------------------------------
-*/
-void CTestCasesList::ConstructL( const TDesC& aConfigFileName )
-    {
-    iConfigFileName = aConfigFileName.AllocL();
-    }
-
-/*
--------------------------------------------------------------------------------
-
-    Class: CTestModule
-
-    Method: NewL
-
-    Description: Create new Test Module    
-
-    Parameters: RThread& aClient              :in:  Handle to client
-                CTestServer* aServer          :in:  Pointer to server
-
-    Return Values: CTestModule*                     Pointer to new test module
-
-    Errors/Exceptions: Leaves if memory allocation fails or ConstructL leaves.
-
-    Status: Approved
-
--------------------------------------------------------------------------------
-*/
-CTestModule* CTestModule::NewL( CTestServer* aServer )
-    {
-
-    CTestModule* self=new( ELeave ) CTestModule();
-    CleanupStack::PushL( self );
-    self->ConstructL( aServer );
-    CleanupStack::Pop();
-    return self;
-    }
-
-/*
--------------------------------------------------------------------------------
-
-    Class: CTestModule
-
-    Method: CTestModule
-
-    Description: Constructor.
-    Initialise base class.
-
-    Parameters: RThread& aClient              :in:  Handle to client
-
-    Return Values: None
-
-    Errors/Exceptions: None
-
-    Status: Approved
-
--------------------------------------------------------------------------------
-*/
-CTestModule::CTestModule() :
-    CSession2(),
-    iIni(0, 0)
-    {
-    }
-
-/*
--------------------------------------------------------------------------------
-
-    Class: CTestModule
-
-    Method: ~CTestModule
-
-    Description: Destructor.
-    Deallocate memory and close handles.
-
-    Parameters: None
-
-    Return Values: None
-
-    Errors/Exceptions: None.
-
-    Status: Proposal
-
--------------------------------------------------------------------------------
-*/
-CTestModule::~CTestModule()
-    {
-
-    __TRACE( KVerbose, ( _L( "Closing test module" ) ) );
-        
-    // Free test case related data. No error checking here, because if freeing
-    // fails, then nothing can be done in destructor.
-    FreeCaseData();
-
-    // Delete all test module instances.
-    // Cleanup all RTestExecution has been opened by client but not properly
-    // closed for example if timeout occurs and client died. This almost do
-    // same than CloseSession() in "if( iTestExecutionHandle )" branch.
-    if( iTestExecutionHandle )
-        {
-        TInt handle = 0;
-        CObject* theObj = NULL;
-        TInt count = iTestExecutionHandle->Count();
-
-        for( TInt i = 0 ; i < count; i++ )
-            {
-            // Get pointer to CTestExecution
-            theObj=iTestExecutionHandle->operator[]( i );
-            if( theObj )
-                {
-                handle=iTestExecutionHandle->At( theObj );
-
-                CTestExecution* testcase = (CTestExecution*) theObj;
-                // Cancels test(s) execution(timeout, exit, etc)
-                // For example TestCombiner is timeouted => TestCombiner's
-                // TestServer+TestModule(s) should cancel also.
-                testcase->CancelTestExecution();
-                // CTestExecution will panic if test case is ongoing!!! This
-                // should be stopped, client should handless this.
-                iTestExecutionHandle->Remove( handle );
-                }
-            }
-
-        delete iTestExecutionHandle;
-        iTestExecutionHandle = NULL;
-
-        }
-
-    // Delete all FREE Test Module instances.
-    if( iTestModuleInstances )
-        {
-        iTestModuleInstances->ResetAndDestroy();
-        delete iTestModuleInstances;
-        iTestModuleInstances = NULL;
-        }
-
-    // Delete ini file heap buffer
-    delete iIniBuffer;
-    iIniBuffer = NULL;
-
-    // Delete array of test case titles
-    iTestCaseTitlesMap.ResetAndDestroy();
-    iTestCaseTitlesMap.Close();
-    }
-
-/*
--------------------------------------------------------------------------------
-
-    Class: CTestModule
-
-    Method: ConstructL
-
-    Description: Second level constructor.
-    
-    Parameters: CTestServer* aServer          :in:  Server
-
-    Return Values: None
-
-    Errors/Exceptions: Leaves if:
-                       base class CreateL leaves
-                       Object index creation fails
-                       Object container creation fails
-                       Pointer array construction fails                       
-
-    Status: Approved
-
--------------------------------------------------------------------------------
-*/
-void CTestModule::ConstructL( CTestServer* aServer )
-    {
-
-	__TRACE( KVerbose, ( _L( "CTestModule::ConstructL - constructing server session" ) ) );
-
-    // second-phase construct base class
-    //CSession2::CreateL( /* *aServer */ );
-    iTestServer = aServer;
-
-    // create new object index
-    iTestExecutionHandle = CObjectIx::NewL();
-
-    // Initialize the object container using the object
-    // container index in the server.
-    iContainer = iTestServer->NewContainerL();
-
-    iTestModuleInstances = new( ELeave ) RPointerArray<CTestModuleContainer>;
-
-	__TRACE( KError, ( _L( "CTestModule::ConstructL - constructing server session done" ) ) );
-
-    }
-
-
-/*
--------------------------------------------------------------------------------
-
-    Class: CTestModule
-
-    Method: CountResources
-
-    Description: Resource counting
-
-    Parameters: None
-
-    Return Values: TInt                             Resource count
-
-    Errors/Exceptions: None
-
-    Status: Approved
-
--------------------------------------------------------------------------------
-*/
-TInt CTestModule::CountResources()
-    {
-
-    return iResourceCount;
-
-    }
-
-
-/*
--------------------------------------------------------------------------------
-
-    Class: CTestModule
-
-    Method: NumResources
-
-    Description: Get resources, writes to Message()
-
-    Parameters: None
-
-    Return Values: None
-
-    Errors/Exceptions: Panic client if result can't be written to descriptor.
-
-    Status: Approved
-
--------------------------------------------------------------------------------
-*/
-void CTestModule::NumResources( const RMessage2& aMessage )
-    {
-
-    TPckgBuf<TInt> countPckg( iResourceCount );
-
-    TRAPD( r, aMessage.WriteL( 0, countPckg ) );
-    if( r !=KErrNone )
-        {
-        PanicClient( EBadDescriptor, aMessage );
-        }
-
-    }
-
-/*
--------------------------------------------------------------------------------
-
-    Class: CTestModule
-
-    Method: PanicClient
-
-    Description: Panic clients.
-
-    Parameters: TInt aPanic                   :in:  Panic code
-
-    Return Values: None
-
-    Errors/Exceptions: None
-
-    Status: Approved
-
--------------------------------------------------------------------------------
-*/
-void CTestModule::PanicClient( const TInt aPanic, const RMessage2& aMessage ) const
-    {
-
-    __TRACE( KError,( _L( "CTestModule::PanicClient code = %d" ), aPanic ) );
-
-    _LIT( KTxtTestModule,"CTestModule" );
-
-    aMessage.Panic( KTxtTestModule, aPanic );
-    }
-
-
-/*
--------------------------------------------------------------------------------
-
-    Class: CTestModule
-
-    Method: CloseSession
-
-    Description: Close session
-
-    Parameters: None
-
-    Return Values: TInt: Symbian error code.
-
-    Errors/Exceptions: None
-
-    Status: Approved
-
--------------------------------------------------------------------------------
-*/
-TInt CTestModule::CloseSession( const RMessage2& aMessage )
-    {
-
-    __TRACE( KMessage,( _L( "CTestModule::CloseSession in" ) ) );
-
-    // Delete all unclosed subsession handle before closing session.
-    // Remove iTestExecutionHandle contents. iTestExecutionHandle countains
-    // CTestExecution that handles test case have been created.
-    if( iTestExecutionHandle )
-        {
-        TInt handle = 0;
-        CObject* theObj = NULL;
-        TInt count = iTestExecutionHandle->Count();        
-        for ( TInt i = count - 1; i >= 0; i-- )
-            {
-            theObj=iTestExecutionHandle->operator[]( i );
-            if( theObj )
-                {
-                handle=iTestExecutionHandle->At( theObj );
-                // CTestExecution will panic if test case is ongoing!!! This
-                // should be stopped, client should handle this.
-                iTestExecutionHandle->Remove( handle );
-                }
-            }
-
-        delete iTestExecutionHandle;
-        iTestExecutionHandle = NULL;
-        }
-
-    // Deletion must be done here, because the "CloseSession" message is 
-    // completed before execution continues from CActiveScheduler::Start 
-    // location, and the main thread can continue execution 
-    // and therefore shutdown itself and all threads in that process.
-    
-    // Delete the object container
-    iTestServer->DeleteContainer( iContainer );
-
-    // Free test case related data
-    TInt r = FreeCaseData();
-
-    // Delete all FREE Test Module instances
-    iTestModuleInstances->ResetAndDestroy();
-    delete iTestModuleInstances;
-    iTestModuleInstances = NULL;
-
-     // Inform server that session is closed
-    iTestServer->SessionClosed();
-
-	// Check for avoiding multiple complete, see CTestModule::ServiceL()
-    if( r != KErrNone )
-        {
-		// In error cases do not complete, just return
-        __TRACE( KMessage,( _L( "CTestModule::CloseSession out (1)" ) ) );
-        return r;
-        }
-
-    aMessage.Complete( KErrNone );
-
-    // After active scheduler shutdown is done, execution continues from
-    // CTestServer::ThreadFunction()
-
-    __TRACE( KMessage,( _L( "CTestModule::CloseSession out (2)" ) ) );
-    return r;
-    }
-
-
-/*
--------------------------------------------------------------------------------
-
-    Class: CTestModule
-
-    Method: ServiceL
-
-    Description: Trap harness for dispatcher
-
-    Parameters: const RMessage& aMessage  :inout:   Message
-
-    Return Values: None
-
-    Errors/Exceptions: None
-
-    Status: Proposal
-
--------------------------------------------------------------------------------
-*/
-void CTestModule::ServiceL( const RMessage2& aMessage )
-    {
-
-    // NOTE! HW testing slows down dramatically if adds commants here
-
-    //__TRACE( KMessage,( _L( "CTestModule::ServiceL in" ) ) );
-
-    TInt r = KErrNone;
-    TRAPD( ret, r = DispatchMessageL( aMessage ) );
-
-    if ( ret != KErrNone )
-        {
-        // Complete message on leaving cases with leave code.
-        __TRACE( KError, ( CStifLogger::ERed, _L( "CTestModule::DispatchMessageL leaved" ) ) );
-        aMessage.Complete( ret );
-        }
-
-    // Complete message with error code originating from message handling
-    // function.
-    if ( r != KErrNone )
-        {
-        __TRACE( KError, ( CStifLogger::ERed, _L( "CTestModule::DispatchMessageL returned error" ) ) );
-        aMessage.Complete( r );
-        }
-
-     // __TRACE( KMessage,( _L( "CTestModule::ServiceL out" ) ) );
-
-    }
-
-
-/*
--------------------------------------------------------------------------------
-
-    Class: CTestModule
-
-    Method: DispatchMessageL
-
-    Description: Dispatch message, calls corresponding function to do it.
-
-    Parameters: const RMessage& aMessage  :inout:   Message to be handled
-
-    Return Values: TInt                             Error code
-
-    Errors/Exceptions: Leaves if operation handling function leaves
-
-    Status: Proposal
-
--------------------------------------------------------------------------------
-*/
-TInt CTestModule::DispatchMessageL( const RMessage2& aMessage )
-    {
-
-    __TRACE( KMessage,( _L( "CTestModule::DispatchMessageL %d" ),
-        aMessage.Function()  ) );
-    switch( aMessage.Function() )
-    {
-    // Session specific
-    case ETestServerCloseSession:                // Close whole session
-        {
-		__TRACE( KError ,( _L( "Closing test module session" ) ) );
-        return CloseSession( aMessage );
-        }
-    case ETestServerGetServerThreadId:           // Get Server ThreadId
-        {
-		__TRACE( KError ,( _L( "Return server thread id" ) ) );
-        return GetServerThreadIdL( aMessage );
-        }
-
-    case ETestModuleCreateSubSession :           // Create new test module subsession
-        {
-		__TRACE( KError,( _L( "Creating test module session" ) ) );
-        return CreateModuleSessionL( aMessage );
-        }
-
-    case ETestModuleCloseSubSession:             // Close module subsession
-        {
-        // Nothing to do.
-        aMessage.Complete( KErrNone );
-        return KErrNone;
-        }
-
-    case ETestExecutionCreateSubSession:         // Create new test execution subsession
-        {
-        return NewTestExecutionL( aMessage );
-        }
- 
-    case ETestModuleEnumerateTestCases:          // Enumerate test cases
-        {
-		__TRACE( KError,( _L( "Enumerating test cases" ) ) );
-        return EnumerateTestCasesL( aMessage );
-        }
-        
-    case ETestModuleGetTestCases:                // Get test cases
-        {
-        return GetTestCasesL( aMessage );
-        }
-
-    case ETestModuleErrorNotification:           // Request error notification
-        {
-        return HandleErrorNotificationL( aMessage );
-        }
-
-    case ETestModuleCancelAsyncRequest:
-        {
-        return CancelAsyncRequestL( aMessage );
-        }
-  
-    // Subsession specific
-    case ETestExecutionRunTestCase:              // Run test case
-        {
-		__TRACE( KInit,( _L( "Running test case" ) ) );
-        CTestExecution* testCase=CaseFromHandle( aMessage.Int3(), aMessage );
-        return testCase->RunTestCase( aMessage );
-        }
-        
-    case ETestExecutionNotifyProgress:           // Test case prints
-        {
-        CTestExecution* testCase=CaseFromHandle( aMessage.Int3(), aMessage );
-        return testCase->NotifyPrint( aMessage );
-        }
-
-    case ETestExecutionNotifyEvent:              // Event notifications
-        {
-        CTestExecution* testCase=CaseFromHandle( aMessage.Int3(), aMessage );
-        return testCase->NotifyEvent( aMessage );
-        }
-        
-    case ETestExecutionNotifyRemoteCmd:          // RemoteCmd notifications
-        {
-        CTestExecution* testCase=CaseFromHandle( aMessage.Int3(), aMessage );
-        return testCase->NotifyRemoteCmd( aMessage );
-        }
-    case ETestExecutionReadRemoteCmdInfo:          // RemoteCmd reading
-        {
-        //CTestExecution* testCase=CaseFromHandle( aMessage.Int3() );
-        //return testCase->NotifyRemoteCmd( aMessage );
-        CTestExecution* testCase=CaseFromHandle( aMessage.Int3(), aMessage );
-        return testCase->ReadRemoteCmdInfo( aMessage );
-        }
-
-
-    case ETestExecutionResume:                   // Resume case execution
-        {
-		__TRACE( KVerbose,( _L( "Resuming test execution" ) ) );
-        CTestExecution* testCase=CaseFromHandle( aMessage.Int3(), aMessage );
-        return testCase->Resume( aMessage );
-        }
-        
-    case ETestExecutionPause:                    // Pause case execution
-        {
-		__TRACE( KVerbose,( _L( "Pausing test execution" ) ) );
-        CTestExecution* testCase=CaseFromHandle( aMessage.Int3(), aMessage );
-        return testCase->Pause( aMessage );
-        }
-            
-    case ETestExecutionCloseSubSession:          // Close execution subsession
-        {
-        CTestExecution* testCase=CaseFromHandle( aMessage.Int3(), aMessage );
-        return testCase->CloseTestExecution( aMessage );
-        }
-
-    case ETestExecutionCancelAsyncRequest:       // Cancel async request
-        {
-        CTestExecution* testCase=CaseFromHandle( aMessage.Int3(), aMessage );
-        return testCase->CancelRequestL( aMessage );
-        }
-    case ETestExecutionNotifyCommand:            // Command notifications
-        {
-        CTestExecution* testCase=CaseFromHandle( aMessage.Int3(), aMessage );
-        return testCase->NotifyCommand( aMessage );
-        }
-
-    default:                                     // Invalid request
-        {
-        PanicClient( EBadRequest, aMessage );
-        return KErrNotSupported;
-        }
-    }
-
-    }
-
-
-/*
--------------------------------------------------------------------------------
-
-    Class: CTestModule
-
-    Method: EnumerateTestCases
-
-    Description: Enumerates test cases and returns test case count by writing
-    result to client side package.
-
-    Function obtains a TestModule and calls EnumerateTestCases from it.
-    Test module will be released when calling GetTestCases function.
-
-    Parameters: const RMessage& aMessage  :inout:   Message to be handled
-
-    Return Values: TInt                             Operation result
-
-    Errors/Exceptions: None
-
-    Status: Proposal
-
--------------------------------------------------------------------------------
-*/
-TInt CTestModule::EnumerateTestCasesL( const RMessage2& aMessage )
-    {
-
-    __TRACE( KMessage,( _L( "CTestModule::EnumerateTestCasesL in" ) ) );
- 
-    // Get data from message
-    TFileName config;
-    TRAPD( res, aMessage.ReadL( 0, config ) );
-    if(res == KErrDied)
-        {
-        RDebug::Print(_L("CTestModule::EnumerateTestCasesL() Reading from RMessage ended with KErrDied. Client is not alive anymore and this request will be ignored"));
-        return res;
-        }
-    else if( res != KErrNone )
-        {
-        RDebug::Print(_L("CTestModule::EnumerateTestCasesL() #1 Panic client with [%d], res=[%d]"), EBadDescriptor, res);
-        PanicClient( EBadDescriptor, aMessage );
-        return res;
-        }
-
-    // Free old case data
-    User::LeaveIfError( FreeCaseData() );
-
-    // Get test cases from the test module
-    User::LeaveIfError( GetTestModule( iEnumerateModule, config ) );
-
-    // Enumerate test cases
-    iEnumerateModule->EnumerateTestCases( config );
-
-    // Something fatal?
-    TInt r = iEnumerateModule->OperationErrorResult();
-    if(  r != KErrNone )
-        {
-        // Enumeration module have crashed.
-        delete iEnumerateModule;
-        iEnumerateModule = NULL;
-
-        return r;
-        }
-
-    // Error from module?
-    if( iEnumerateModule->ModuleResult() != KErrNone )
-        {
-        return iEnumerateModule->ModuleResult();
-        }
-
-    // Write count to Ptr1()
-    const RPointerArray<TTestCaseInfo>* testCases = iEnumerateModule->TestCases();
-    
-    if( testCases == NULL )
-        {
-        User::Leave( KErrGeneral );
-        }
-    
-    CTestCasesList* testCasesList = NULL;
-    for ( TInt i = 0; i < iTestCaseTitlesMap.Count(); i++ )
-        {
-        if ( iTestCaseTitlesMap[ i ]->GetConfigFileName() == config )
-            {
-            testCasesList = iTestCaseTitlesMap[ i ];
-            break;
-            }
-        }
-    if ( testCasesList == NULL )
-        {
-        testCasesList = CTestCasesList::NewL( config );
-        CleanupStack::PushL( testCasesList );
-        iTestCaseTitlesMap.AppendL( testCasesList );
-        CleanupStack::Pop( testCasesList );
-        }
-    
-    // Store titles (for further use, i.e. when asked for title from the interface via CTestModuleIf->CTestThreadContainer->CTestModuleContainer)
-    testCasesList->ResetAndDestroy();
-    TInt i;
-    for(i = 0; i < testCases->Count(); i++)
-        {
-        //Handle situation when test cases are enumerated not as 0-based (testscripter, ...)
-        if(i == 0 && (*testCases)[i]->iCaseNumber > 0)
-            {
-            testCasesList->AppendTestCaseL( KNullDesC );
-            }
-        testCasesList->AppendTestCaseL( (*testCases)[i]->iTitle );
-        }
-    
-    TPckgBuf<TInt> countPckg( testCases->Count() );
-    TRAP( res, aMessage.WriteL( 1, countPckg ) );
-    if(res == KErrDied)
-        {
-        RDebug::Print(_L("CTestModule::EnumerateTestCasesL() Writing to RMessage ended with KErrDied. Client is not alive anymore and this request will be ignored"));
-        return res;
-        }
-    else if( res != KErrNone )
-        {
-        RDebug::Print(_L("CTestModule::EnumerateTestCasesL() #2 Panic client with [%d], res=[%d], config=[%S]"), EBadDescriptor, res, &config);
-        PanicClient( EBadDescriptor, aMessage );
-        return res;
-        }
-
-    // All ok, complete message
-    aMessage.Complete( KErrNone );
-
-    __TRACE( KMessage,( _L( "CTestModule::EnumerateTestCasesL out" ) ) );
-    
-    return KErrNone;
-
-    }
-
-
-/*
--------------------------------------------------------------------------------
-
-    Class: CTestModule
-
-    Method: GetTestCasesL
-
-    Description: Get test cases. Enumerate test cases must be called before
-    calling this function.
-
-    Function releases the test module reserved by EnumerateTestCase().
-
-    Parameters: const RMessage& aMessage  :inout:   Message to be handled
-
-    Return Values: TInt                             Operation result
-
-    Errors/Exceptions: Leaves if cases have not been enumerated.
-
-    Status: Proposal
-
--------------------------------------------------------------------------------
-*/
-TInt CTestModule::GetTestCasesL( const RMessage2& aMessage )
-    {
-
-    __TRACE( KMessage,( _L( "CTestModule::GetTestCasesL in" ) ) );
-
-    // Leave if cases have not been enumerated.
-    //User::LeaveIfNull(( TAny* ) iEnumerateModule->TestCases() );
-    if( ( TAny* ) iEnumerateModule->TestCases() == NULL )
-        {
-        User::Leave( KErrGeneral );
-        }
-
-    const TInt len = sizeof( TTestCaseInfo );
-    
-    // Get cases
-    const RPointerArray<TTestCaseInfo>& cases = *iEnumerateModule->TestCases();
-
-    // Get number of cases
-    const TInt Kcount = cases.Count();
-
-    // Loop through case and copy then to client's descriptor.
-    for( TInt i = 0; i < Kcount; i++ )
-        {
-
-        // Construct package for source data
-        TTestCaseInfoPckg tmpPackage( *cases[i] );
-
-        // Write to correct location
-        aMessage.WriteL( 0, tmpPackage, i *len );
-
-        }
-
-    // Free case data and the test module
-    User::LeaveIfError( FreeCaseData() );
-
-    // Finished
-    aMessage.Complete( KErrNone );
-
-    __TRACE( KMessage,( _L( "CTestModule::GetTestCasesL out" ) ) );
-
-    return KErrNone;
-
-    }
-
-
-/*
--------------------------------------------------------------------------------
-
-    Class: CTestModule
-
-    Method: HandleErrorNotification
-
-    Description: Request error notification.
-
-    Parameters: const RMessage& aMessage  :inout:   Message to be handled
-
-    Return Values: TInt                             Operation result
-
-    Errors/Exceptions: None
-
-    Status: Proposal
-
--------------------------------------------------------------------------------
-*/
-TInt CTestModule::HandleErrorNotificationL( const RMessage2& aMessage )
-    {
-    
-    iErrorMessage = aMessage;
-    iErrorMessageAvailable = ETrue;
-
-    return KErrNone;
-
-    }
-
-/*
--------------------------------------------------------------------------------
-
-    Class: CTestModule
-
-    Method: GetServerThreadId
-
-    Description: Request server state notification.
-
-    Parameters: const RMessage& aMessage :inout: Message to be handled
-
-    Return Values: TInt Operation result
-
-    Errors/Exceptions: None
-
-    Status: Proposal
-
--------------------------------------------------------------------------------
-*/
-TInt CTestModule::GetServerThreadIdL( const RMessage2& aMessage )
-    {
-      
-    TInt id( iTestServer->GetServerThreadId() );
-   
-    TPckg<TThreadId> threadIdPckg( id );
-   
-    TRAPD( res, aMessage.WriteL( 0, threadIdPckg ) );
-    
-      // Finished
-    aMessage.Complete( res );
-    
-    return KErrNone;
-
-    }      
-
-/*
--------------------------------------------------------------------------------
-
-    Class: CTestModule
-
-    Method: CancelAsyncRequest
-
-    Description: Cancels asynchronous request
-
-    Parameters: const RMessage& aMessage  :inout:   Message to be handled
-
-    Return Values: TInt                             Operation result
-
-    Errors/Exceptions: None
-
-    Status: Proposal
-
--------------------------------------------------------------------------------
-*/
-TInt CTestModule::CancelAsyncRequestL( const RMessage2& aMessage )
-    {
-    
-    switch ( aMessage.Int0() )
-        {
-        case ETestModuleErrorNotification:
-            {
-            if ( iErrorMessageAvailable )
-                {
-                iErrorMessage.Complete ( KErrCancel );
-                iErrorMessageAvailable = EFalse;
-                }
-            aMessage.Complete ( KErrNone );
-            break;
-            }
-
-        default:
-            {
-            PanicClient( EInvalidRequestCancel, aMessage );
-            break;
-            }
-        }
-
-    return KErrNone;
-
-    }
-
-/*
--------------------------------------------------------------------------------
-
-    Class: CTestModule
-
-    Method: ErrorPrint
-
-    Description: Prints error
-
-    Parameters: const TInt aPriority :in: Priority
-                TPtrC aError: in: Error
-
-    Return Values: None
-
-    Errors/Exceptions: None
-
-    Status: Proposal
-
--------------------------------------------------------------------------------
-*/
-void CTestModule::ErrorPrint( const TInt aPriority, 
-                              TPtrC aError )
-    {
-
-    if ( iErrorMessageAvailable )
-        {        
-        TErrorNotification error;
-        TErrorNotificationPckg errorPckg ( error );
-
-        error.iModule = _L("TestServer");
-        error.iPriority = aPriority;
-        error.iText = aError;
-
-        TRAPD( r, iErrorMessage.WriteL( 0, errorPckg ) );
-        
-        // Do not handle errors
-        iErrorMessageAvailable = EFalse;
-        iErrorMessage.Complete( r );
-
-        }
-    else
-        {
-        RDebug::Print (_L("Error message lost %d [%S]"), aPriority, &aError );
-        }
-    
-    }
-
-/*
--------------------------------------------------------------------------------
-
-    Class: CTestModule
-
-    Method: FreeCaseData
-
-    Description: Frees the test case data and test module that is used in
-    enumeration.
-
-    Parameters: None
-
-    Return Values: TInt                             Error code
-
-    Errors/Exceptions: None
-
-    Status: Proposal
-
--------------------------------------------------------------------------------
-*/
-TInt CTestModule::FreeCaseData()
-    {
-
-    __TRACE( KMessage,( _L( "CTestModule::FreeCaseData in" ) ) );
- 
-    TInt r = KErrNone;
-
-    if( iEnumerateModule )
-        {
-        
-        // Deallocate testcase memory
-        iEnumerateModule->FreeEnumerationData();
-
-        // Free the module
-        r = FreeTestModule( iEnumerateModule );
-
-        iEnumerateModule = NULL;
-
-        }
-
-    __TRACE( KMessage,( _L( "CTestModule::FreeCaseData out" ) ) );
-
-    return r;
-
-    }
-
-
-/*
--------------------------------------------------------------------------------
-
-    Class: CTestModule
-
-    Method: CreateModuleSessionL
-
-    Description: Creates a new module session.
-    Just take the initialisation file name from message.
-
-    Parameters: const RMessage& aMessage  :inout:   Message to be handled
-
-    Return Values: TInt                             Operation result
-
-    Errors/Exceptions: Leaves if memory allocation fails
-
-    Status: Proposal
-
--------------------------------------------------------------------------------
-*/
-TInt CTestModule::CreateModuleSessionL( const RMessage2& aMessage )
-    {
-
-    __TRACE( KMessage,( _L( "CTestModule::CreateModuleSession in" ) ) );
-
-    // Take parameters
-    TFileName ini;
-    TRAPD( res, aMessage.ReadL( 0, ini ) );
-    if( res != KErrNone )
-        {
-        PanicClient( EBadDescriptor, aMessage );
-        return res;
-        }
-
-    // Construct heap buffer for initialization file name
-    iIniBuffer = HBufC::NewL( ini.Length() );
-    iIni.Set ( iIniBuffer->Des() );
-    iIni.Copy ( ini );
-
-    aMessage.Complete( KErrNone );
-
-    __TRACE( KMessage,( _L( "CTestModule::CreateModuleSession out" ) ) );
-
-    return KErrNone;
-
-    }
-
-/*
--------------------------------------------------------------------------------
-
-    Class: CTestModule
-
-    Method: NewTestExecutionL
-
-    Description: Create new test execution subsession
-    
-    Parameters: const RMessage& aMessage  :inout:   Message to be handled
-    
-    Return Values: TInt                             Operation result
-
-    Errors/Exceptions: Function leaves if object can't be created or
-                       it can't be added to container.
-                       Function panics client if message contains invalid
-                       descriptor.
-
-    Status: Proposal
-    
--------------------------------------------------------------------------------
-*/
-TInt CTestModule::NewTestExecutionL( const RMessage2& aMessage )
-    {
-
-    __TRACE( KMessage,( _L( "CTestModule::NewTestExecutionL in" ) ) );
-
-    // Get data from message
-    TInt caseNumber = aMessage.Int0();
-    TFileName config;
-    
-    TRAPD( res, aMessage.ReadL( 1, config ) );
-    if( res != KErrNone )
-        {
-        PanicClient( EBadDescriptor, aMessage );
-        return res;
-        }
-
-    // Make new object
-    CTestExecution* execution=CTestExecution::NewL( this, caseNumber, config );
-
-    // add object to object container to generate unique id
-    iContainer->AddL( execution );
-
-    // add object to object index; this returns a unique handle so we can get it again
-    TInt handle=iTestExecutionHandle->AddL( execution );
-
-    // write the handle to client
-    TPckg<TInt> handlePckg( handle );
-    TRAP( res, aMessage.WriteL( 3, handlePckg ) );
-    if( res != KErrNone )
-        {
-        iTestExecutionHandle->Remove( handle );
-        PanicClient( EBadDescriptor, aMessage );
-        return res;
-        }
-
-    // notch up another resource
-    iResourceCount++;
-
-    // Complete message
-    aMessage.Complete( KErrNone );
-
-    __TRACE( KMessage,( _L( "CTestModule::NewTestExecutionL out" ) ) );
-
-    return KErrNone;
-    }
-
-/*
--------------------------------------------------------------------------------
-
-    Class: CTestModule
-
-    Method: DeleteTestExecution
-
-    Description: Deletes Test Execution by handle
-
-    Parameters: const TUint aHandle           :in:  Handle
-
-    Return Values: None
-
-    Errors/Exceptions: Panics client if invalid handle
-
-    Status: Proposal
-
--------------------------------------------------------------------------------
-*/
-void CTestModule::DeleteTestExecution( const TUint aHandle, const RMessage2& aMessage )
-    {
-
-    // Verify that handle is valid
-    CaseFromHandle( aHandle, aMessage );
-
-    // Remove object
-    iTestExecutionHandle->Remove( aHandle );
-
-    // Decrement resource count.
-    iResourceCount--;
-
-    }
-
-
-/*
--------------------------------------------------------------------------------
-
-    Class: CTestModule
-
-    Method: CaseFromHandle
-
-    Description: Return subsession from handle
-
-    Parameters: const TUint aHandle           :in:  Handle
-
-    Return Values: CTestExecution*                  Test Execution object
-
-    Errors/Exceptions: Function panics client if invalid handle.
-
-    Status: Approved
-    
--------------------------------------------------------------------------------
-*/
-CTestExecution* CTestModule::CaseFromHandle( const TUint aHandle, const RMessage2& aMessage ) const
-    {
-
-    CTestExecution* testcase =( CTestExecution* ) iTestExecutionHandle->At( aHandle );
-
-    if( testcase == NULL )
-        {
-        PanicClient( EBadSubsessionHandle, aMessage );
-        }
-
-    return testcase;
-
-    }
-
-
-/*
--------------------------------------------------------------------------------
-
-    Class: CTestModule
-
-    Method: GetTestModule
-
-    Description: Gets a CTestModuleBase*. If there is a free entry
-    in the free list, then it is returned. Otherwise a new one is created.
-
-    Parameters: CTestModuleContainer*& aContainer: out: container pointer.
-                const TDesC& aConfig: in: Test case (config) file name.
-
-    Return Values: Symbian OS error code
-    
-    Errors/Exceptions: None
-
-    Status: Proposal
-
--------------------------------------------------------------------------------
-*/
-TInt CTestModule::GetTestModule( CTestModuleContainer*& aContainer,
-                                    const TDesC& aConfig )
-    {
-    TInt ret = KErrNone;
-
-    if( iTestModuleInstances->Count() )
-        {
-        // Return an existing one        
-        aContainer =( *iTestModuleInstances )[0];
-        iTestModuleInstances->Remove( 0 );
-		__TRACE( KInit,( _L( "Reusing old test module container instance at 0x%x" ), (TUint32) aContainer ) );
-        }
-    else
-        {
-        // Create a new one    
-        __TRACE( KInit,( _L( "Creating new test module instance" ) ) );
-        TRAPD( err, aContainer = CTestModuleContainer::NewL( 
-                                                iTestServer->ModuleName(),
-                                                this,
-                                                aConfig ) );
-
-        // If module can't be created, then return NULL.
-        if( err )
-            {
-            __TRACE( KError,( _L( "Can't create new test module container instance" ) ) );
-            aContainer = NULL;
-            ret = err;
-            }
-		else
-			{
-			__TRACE( KInit,( _L( "Test module instance container created" ) ) );
-			}
-
-        if( aContainer )
-            {
-
-            // Initialise module
-            aContainer->Initialize( iTestServer->ModuleName(), iTestServer->FirstTime() );
-
-            if( aContainer->OperationErrorResult() != KErrNone )
-                {
-                // Can't initialise module, delete it
-                __TRACE( KError,( CStifLogger::ERed, _L( "Operation error, can't initialize test module container instance" ) ) );
-                ret = aContainer->OperationErrorResult();                    
-                delete aContainer;
-                aContainer = NULL;
-                }
-            else if( aContainer->ModuleResult() != KErrNone )
-                {
-                // Can't initialise module, delete it
-                __TRACE( KError,( CStifLogger::ERed, _L( "Module error, can't initialize test module container instance" ) ) );
-                ret = aContainer->ModuleResult();
-                delete aContainer;
-                aContainer = NULL;
-                }
-            else
-                {
-                // Module initialised properly, clear the first time flag.
-                iTestServer->ClearFirstTime();
-				__TRACE( KInit,( _L( "Test module container initialized at 0x%x" ), (TUint32) aContainer ) );
-                }
-            }
-        }
-
-    return ret;
-
-    }
-
-
-/*
--------------------------------------------------------------------------------
-
-    Class: CTestModule
-
-    Method: FreeTestModule
-
-    Description:Frees a CTestModuleContainer. This function can be called
-    from the context of the test execution thread.
-    
-    Parameters: CTestModuleContainer* aModule :in:  Module to be freed
-    
-    Return Values: TInt                             Error code
-
-    Errors/Exceptions: None
-
-    Status: Proposal
-    
--------------------------------------------------------------------------------
-*/
-TInt CTestModule::FreeTestModule( CTestModuleContainer* aModule )
-    {
-  
-    // Free the module
-    TInt r = iTestModuleInstances->Append( aModule );
-    if( r != KErrNone )
-        {
-        delete aModule;
-        aModule = NULL;
-        }
-
-    return r;
-
-    }
-
-/*
--------------------------------------------------------------------------------
-
-    Class: CTestModule
-
-    Method: IniName
-
-    Returns the initialisation file name
-    
-    Parameters: None
-    
-    Return Values: const TDesC&                     Initialisation file name
-
-    Errors/Exceptions: None
-
-    Status: Proposal
-    
--------------------------------------------------------------------------------
-*/
-
-const TDesC& CTestModule::IniName() const
-    {
-
-    return iIni;
-
-    }
-
-/*
--------------------------------------------------------------------------------
-
-    Class: CTestModule
-
-    Method: Name
-
-    Returns the module name
-    
-    Parameters: None
-    
-    Return Values: const TDesC&                     Initialisation file name
-
-    Errors/Exceptions: None
-
-    Status: Proposal
-    
--------------------------------------------------------------------------------
-*/
-const TDesC& CTestModule::Name() const
-    {
-
-    return iTestServer->ModuleName();
-
-    }
-
-/*
--------------------------------------------------------------------------------
-
-    Class: CTestModule
-
-    Method: GetTestCaseTitleL
-
-    Gets title of currently running test case
-    
-    Parameters: None
-    
-    Return Values: TInt aTestCaseNumber: in: index of currently running test case
-                   TDes& aTestCaseTitle: out: test case title
-
-    Errors/Exceptions: None
-
-    Status: Proposal
-    
--------------------------------------------------------------------------------
-*/
-void CTestModule::GetTestCaseTitleL(TInt aTestCaseNumber, const TDesC& aConfigFile,TDes& aTestCaseTitle)
-    {
-    CTestCasesList* testCasesList = NULL;
-    for ( TInt i = 0; i < iTestCaseTitlesMap.Count(); i++ )
-        {
-        if ( iTestCaseTitlesMap[ i ]->GetConfigFileName() == aConfigFile )
-            {
-            testCasesList = iTestCaseTitlesMap[ i ];
-            break;
-            }
-        }
-    if ( testCasesList == NULL )
-        {
-        User::Leave( KErrNotFound );
-        }
-    
-    RDebug::Print(_L("Trying to get test case title from module. Index=%d, count=%d"), aTestCaseNumber, testCasesList->Count() );
-    
-    aTestCaseTitle.Copy( testCasesList->GetTestCaseTitleL( aTestCaseNumber ) );
-    }
-
-
-/*
--------------------------------------------------------------------------------
-
-    Class: CTestModule
-
-    Method: GetTestServer
-
-    Gets pointer to TestServer
-    
-    Parameters: None
-    
-    Return Values: CTestServer : pointer to TestServer
-
-    Errors/Exceptions: None
-
-    Status: Proposal
-    
--------------------------------------------------------------------------------
-*/
-CTestServer* CTestModule::GetTestServer()
-    {
-    return iTestServer;
-    }
-
-// End of File