stif/TestServer/src/TestModuleContainer.cpp
branchRCL_3
changeset 40 07b41fa8d1dd
parent 39 3406c99bc375
child 43 ca8a1b6995f6
--- a/stif/TestServer/src/TestModuleContainer.cpp	Thu Jul 15 20:25:38 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,2364 +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 
-* CTestModuleContainer class member functions. CTestModuleContainer 
-* class contains interface * to execute various functions in context 
-* of test execution thread.
-*
-* CTestModuleContainer is the owner of the test execution thread 
-* object and the owner of the test module instance.
-*
-*/
-
-// INCLUDE FILES
-#include <e32std.h>
-#include <e32svr.h>
-#include <e32uid.h>
-#include "TestEngineClient.h"
-#include <StifTestModule.h>
-#include <stifinternal/TestServerClient.h>
-#include "TestServer.h"
-#include "TestServerModuleIf.h"
-#include "TestServerCommon.h"
-#include "PrintQueue.h"
-#include "TestThreadContainer.h"
-//--PYTHON-- begin
-#include "StifPython.h"
-//--PYTHON-- end
-
-// EXTERNAL DATA STRUCTURES
-
-// EXTERNAL FUNCTION PROTOTYPES
-
-// The test module execution thread function
-TInt ExecutionThread( TAny* aParams );
-
-// CONSTANTS
-
-// MACROS
-
-// LOCAL CONSTANTS AND MACROS
-
-// MODULE DATA STRUCTURES
-
-// LOCAL FUNCTION PROTOTYPES
-typedef TInt( *CTestInterfaceFactoryTestModule )( CTestModuleParam*&, TUint32& );
-
-// FORWARD DECLARATIONS
-
-// ==================== LOCAL FUNCTIONS =======================================
-
-// ================= MEMBER FUNCTIONS =========================================
-
-
-/*
--------------------------------------------------------------------------------
-
-    Class: CTestModuleContainer
-
-    Method: NewL
-
-    Description: Returns new CTestModuleContainer instance.
-
-    Parameters: const TDesC& aName: in: Module name
-                CTestModule* aSession: in: "Parent"
-                const TDesC& aConfig: in: Test case (config) file name.
-
-    Return Values: CTestModuleContainer* New instance
-
-    Errors/Exceptions: Function leaves if memory allocation fails or
-                       CTestModuleContainer ConstructL leaves.
-                       Panics if aSession is NULL.
-
-    Status: Proposal
-
--------------------------------------------------------------------------------
-*/
-CTestModuleContainer* CTestModuleContainer::NewL( const TDesC& aName,
-                                                  CTestModule* aSession,
-                                                  const TDesC& aConfig )
-    {
-
-    __ASSERT_ALWAYS ( aSession, 
-                      CTestServer::PanicServer( ENullTestModule ) );
-
-    CTestModuleContainer* self = new ( ELeave ) CTestModuleContainer();
-    CleanupStack::PushL( self );
-    self->ConstructL( aName, aSession, aConfig );
-    CleanupStack::Pop( self );
-    return self;
-
-    }
-
-/*
--------------------------------------------------------------------------------
-
-    Class: CTestModuleContainer
-
-    Method: ConstructL
-
-    Description: Second level constructor.
-
-    Function creates the execution thread, creates exception
-    handler and the thread undertaker for it and then resumes the thread.
-
-    Parameters: const TDesC& aName: in: Module name
-                CTestModule* aSession: in: "Parent"
-                const TDesC& aConfig: in: Test case (config) file name.
-
-    Return Values: CTestModuleContainer* New instance
-
-    Errors/Exceptions: Function leaves if thread creation fails,
-                       memory allocation fails or undertaker creation leaves.
-
-    Status: Proposal
-    
--------------------------------------------------------------------------------
-*/
-void CTestModuleContainer::ConstructL( const TDesC& aName,
-                                       CTestModule* aSession,
-                                       const TDesC& aConfig )
-    {
-
-    RDebug::Print( aName );
-    
-    iNestedActiveScheduler = new (ELeave) CActiveSchedulerWait;
-    
-    iCTestModule = aSession;
-
-    // Create error print handler
-    iErrorPrintHandler = CErrorPrintHandler::NewL( *this );
-    User::LeaveIfError( iErrorPrintSem.CreateLocal( 0 ) );
-
-    // Construct unique thread name
-    const TInt KAddressLen = 8;
-    const TInt KMaxName = 50;  // Something smaller than max thread name
-    TInt len = aName.Length();
-    if ( KAddressLen + len > KMaxName )
-        {
-        len = KMaxName - KAddressLen;
-        }
-    
-    // Default heap and stack sizes that may configure by user.
-    TInt heapMinSize( KTestThreadMinHeap );
-    TInt heapMaxSize( KTestThreadMaxHeap );
-    TInt stackSize( KStackSize );
-
-    // Check is user give heap or stack sizes and verify sizes.
-    GetTestModuleParams( aName, aConfig, stackSize, heapMinSize, heapMaxSize );
-
-    // Create a new thread
-    TInt ret = KErrAlreadyExists;
-    for( TInt i = 0; ret == KErrAlreadyExists; i++ )
-        {
-        TName threadName = aName.Left( len );
-        threadName.AppendFormat( _L( "%x" ), ( TUint32 ) this );
-        threadName.AppendFormat( _L( "%x" ), i );
-        //RDebug::Print( threadName );
-
-		RDebug::Print(_L("CTestModuleContainer::ConstructL create thread=[%S] stackSize=(%d)"), &threadName, stackSize);
-
-		if ( iCTestModule->GetTestServer()->UiTesting() == false )
-			{
-	        ret = iThread.Create(
-	                    threadName,                 // name of thread
-	                    CTestThreadContainer::ExecutionThread,// thread function
-	                    stackSize,                  // Stack size
-	                    heapMinSize,                // Heap sizes
-	                    heapMaxSize,
-	                    this                        // Parameter to thread function
-	                    );
-			}
-		else
-			{
-	        ret = iThread.Create(
-                    threadName,                 // name of thread
-                    CTestThreadContainer::UIExecutionThread,// thread function
-                    stackSize,                  // Stack size
-                    heapMinSize,                // Heap sizes
-                    heapMaxSize,
-                    this                        // Parameter to thread function
-                    );
-			}
-
-        // If test execution thread exist try to create new one
-        if( ret == KErrAlreadyExists )
-            {
-            RDebug::Print( _L( "Thread[%S] allready exist, creating new one" ), &threadName );
-            __TRACE ( KInit, ( CStifLogger::ERed, _L( "Thread[%S] allready exist, creating new one" ), &threadName ) );
-            }
-
-        }
-
-    // If thread creation fails, leave here.
-    if( ret != KErrNone )
-        {
-        RDebug::Print( _L( "Execution thread creation fails with: [%d]" ), ret );
-        __TRACE ( KError, ( CStifLogger::ERed, _L( "Execution thread creation fails with: [%d]" ), ret ) );
-        User::Leave( ret );
-        }
-
-    // Doing nothing
-    // ChangeOperationNoError ( ESuspend, 0 );
-    // Thread suspends always first by default
-    
-    // Construct the undertaker to get notifications about the 
-    // thread death. 
-    // This must be trapped to allow to kill just created thread
-    // nicely without a mess in destructor.
-    TRAPD ( r, 
-        iUnderTaker = CUnderTaker::NewL ( this );
-        CActiveScheduler::Add( iUnderTaker );
-        iUnderTaker->StartL();
-        );    
-
-    // Can't create or start the undertaker. Kill the thread. 
-    // Undertaker will be deleted in destructor if needed.
-    if ( r != KErrNone )
-        {
-        iThread.Kill ( r );
-        iThread.Close();
-        User::Leave( r );
-        }
-
-    // Get server thread id ( i.e current thread id )
-    RThread tmpThread;
-    iServerThreadId = tmpThread.Id();
-    
-    // Resume the thread
-    iThread.Resume();                // Start the thread
-    iUpAndRunning = ETrue;           // Thread is created 
-
-    // Add "this" container to active scheduler
-    CActiveScheduler::Add ( this );
-
-    // Start error print handler
-    iErrorPrintHandler->StartL();
-
-    }
-
-/*
--------------------------------------------------------------------------------
-
-    Class: CTestModuleContainer
-
-    Method: CTestModuleContainer
-
-    Description: Constructor.
-
-    Initialise semaphores.
-
-    Parameters: None
-
-    Return Values: None
-
-    Errors/Exceptions: None
-
-    Status: Proposal
-    
--------------------------------------------------------------------------------
-*/
-CTestModuleContainer::CTestModuleContainer() :
-    CActive( CActive::EPriorityStandard ),
-    iOperationName ( 0, 0 ),
-    iIsPaused( EFalse )
-    {
-
-    // Create operation start semaphore
-    iOperationStartSemaphore.CreateLocal( 0 );
-
-    // Operation can be changed without first waiting.
-    iOperationChangeSemaphore.CreateLocal( 1 );
-
-    }
-
-/*
--------------------------------------------------------------------------------
-
-    Class: CTestModuleContainer
-
-    Method: ~CTestModuleContainer
-
-    Description: Destructor
-
-    Delete the test execution thread, if it is up and running. Delete
-    undertaker and close handles.
-
-    Parameters: None
-
-    Return Values: None
-
-    Errors/Exceptions: None
-
-    Status: Proposal
-
--------------------------------------------------------------------------------
-*/
-CTestModuleContainer::~CTestModuleContainer()
-    {
-
-    __TRACE ( KThreadOperation, ( _L( "CTestModuleContainer::~CTestModuleContainer in" ) ) );
-
-    if ( iUpAndRunning )
-        {
-		if( iUnderTaker != NULL )
-			{
-			iUnderTaker->Cancel();
-			}
-
-        // Set the operation
-        ChangeOperationNoError ( EExit, 0 );
-
-        // Do operation
-        StartAndWaitOperation();
-
-        }
-    
-    delete iErrorPrintHandler;
-	iErrorPrintHandler = NULL;
-
-    // Delete heap descriptor
-    delete iModuleNameBuffer;
-    iModuleNameBuffer = NULL;
-
-    // Delete undertaker
-    delete iUnderTaker;
-    iUnderTaker = NULL;
-
-    // Close error semaphore
-    if ( iErrorPrintSem.Handle() != 0 ) iErrorPrintSem.Close();
-
-    // Close the semaphores
-    iOperationStartSemaphore.Close();
-    iOperationChangeSemaphore.Close();
-
-    // Close handle to thread
-    iThread.Close();
-
-    Cancel();
-
-    delete iNestedActiveScheduler;
-    iNestedActiveScheduler = NULL;
-
-    __TRACE ( KThreadOperation, ( _L( "CTestModuleContainer::~CTestModuleContainer out" ) ) );
-
-    }
-
-/*
--------------------------------------------------------------------------------
-
-    Class: CTestModuleContainer
-
-    Method: StartAndWaitOperation
-
-    Description: Signals operation and waits until operation is completed.
-
-    Function executes active scheduler locally to handle both request
-    completion from execution thread and thread undertaker operations.    
-
-    Parameters: None
-
-    Return Values: None
-
-    Errors/Exceptions: None
-
-    Status: Proposal
-
--------------------------------------------------------------------------------
-*/
-TInt CTestModuleContainer::StartAndWaitOperation()
-    {
-
-    // Change undertaker mode to synchronous    
-    iUnderTaker->SetSynchronousMode( ETrue );
-
-    iStatus = KRequestPending;
-    // Get ready to handle operation completion
-    SetActive();
-
-    // Start operation
-    iOperationStartSemaphore.Signal();
-
-    // Start "nested" active scheduler "locally"
-    //CActiveScheduler::Start();
-    iNestedActiveScheduler->Start();
-
-    // Request completed or operation crashed, everything 
-    // is done in ModuleContainer's RunL function or in UnderTaker's RunL.
-
-    // Cancel the original request in case than it was the undertaker
-    // that stopped the active scheduler. Does not do anything if original
-    // request is already finished.
-    Cancel();
-    
-    // Undertaker back to "normal" mode
-    iUnderTaker->SetSynchronousMode ( EFalse );
-
-    return iModuleResult;
-
-    }
-
-
-
-/*
--------------------------------------------------------------------------------
-
-    Class: CTestModuleContainer
-
-    Method: Initialise
-
-    Description: Initialise the test module
-
-    Initialisation is done in context of test execution thread.
-
-    Parameters: const TDesC& aName            :in:  Module name
-                TBool aFirstTime              :in:  First init?
-
-
-    Return Values: TInt                             Result from init
-
-    Errors/Exceptions: None
-
-    Status: Proposal
-
--------------------------------------------------------------------------------
-*/
-TInt CTestModuleContainer::Initialize( const TFileName& aName,
-                                       TBool aFirstTime
-                                     )
-    {
-
-    __TRACE ( KInit, ( _L( "Initializing test module" ) ) );
-
-    // Set the operation
-    iErrorResult = ChangeOperation ( EInitializeModule, aName, aFirstTime );
-    iModuleResult = KErrNone;
-    
-    if ( iErrorResult == KErrNone )
-        {
-        // Wait until operation is completed
-        StartAndWaitOperation();
-        }
-    
-    if ( iErrorResult )
-        {
-        __TRACE ( KError, ( CStifLogger::ERed,  _L( "Initializing test module failed %d" ), iErrorResult ) );
-        }
-    else if ( iModuleResult )
-        {
-        __TRACE ( KError, ( CStifLogger::ERed, _L( "Initializing test module failed code from module = %d" ), iModuleResult ) );
-        } 
-    else
-        {
-        __TRACE ( KInit, ( CStifLogger::EBold, _L( "Test module initialization done" ) ) );
-        }
-
-    // Return result
-    return iModuleResult;
-
-    }
-
-/*
--------------------------------------------------------------------------------
-
-    Class: CTestModuleContainer
-
-    Method: EnumerateTestCases
-
-    Description: Enumerate test cases of the test module
-
-    Enumeration is done in context of test execution thread.
-
-    Parameters: const TDesC& aName            :in:  Configuration file
-
-    Return Values: TInt                             Result from enumeration
-
-    Errors/Exceptions: None
-
-    Status: Proposal
-
--------------------------------------------------------------------------------
-*/
-TInt CTestModuleContainer::EnumerateTestCases( const TFileName& aName )
-    {
-
-    __TRACE ( KInit, ( CStifLogger::EBold, _L( "Enumerating test cases from [%S] (might be empty)" ), &aName ) );
-
-    // Set the operation
-    iErrorResult = ChangeOperation( EEnumerateInThread, aName, 0 );
-    iModuleResult = KErrNone;
-
-    if ( iErrorResult == KErrNone )
-        {
-        // Wait until operation is completed
-        StartAndWaitOperation();
-        }
-
-    if ( iErrorResult )
-        {
-        __TRACE ( KError, ( CStifLogger::ERed, _L( "Enumerating test cases failed %d" ), iErrorResult ) );
-        }
-    else if ( iModuleResult )
-        {
-        __TRACE ( KError, ( CStifLogger::ERed, _L( "Enumerating test cases failed, code from module = %d" ), iModuleResult ) );
-        } 
-    else
-        {
-        __TRACE ( KInit, ( _L( "Enumerating test cases done" ) ) );
-        }
-
-    // Return result
-    return iModuleResult;
-
-    }
-
-
-
-/*
--------------------------------------------------------------------------------
-
-    Class: CTestModuleContainer
-
-    Method: FreeEnumerationData
-
-    Description: Frees the enumeration data
-
-    Memory deallocation is done in context of test execution thread.
-
-    Parameters: None
-
-    Return Values: TInt                             Result from operation
-
-    Errors/Exceptions: None
-
-    Status: Proposal
-    
--------------------------------------------------------------------------------
-*/
-
-TInt CTestModuleContainer::FreeEnumerationData()
-    {
-
-    // Set the operation
-    ChangeOperationNoError( EFreeEnumerationData, 0 );
-    
-    // Do the operation
-    StartAndWaitOperation();
-
-    // Return result
-    return iModuleResult;
-
-    }
-
-/*
--------------------------------------------------------------------------------
-
-    Class: CTestModuleContainer
-
-    Method: RunTestCase
-
-    Description: Run a test case
-
-    Running a test case is done in context of test execution thread. This
-    function is asynchronous ( i.e test is not finished when this function
-    returns ).
-
-    Parameters: const TFileName& aName        :in:  Configuration file
-                TInt aCaseNumber              :in:  Case number
-                const RMessage                :in:  Handle to test msg.
-
-    Return Values: None
-
-    Errors/Exceptions: None
-
-    Status: Proposal
-
--------------------------------------------------------------------------------
-*/
-void CTestModuleContainer::RunTestCase ( const TFileName& aName,
-                                         const TInt aCaseNumber,
-                                         const RMessage2& aMessage
-                                       )
-    {
-
-    __TRACE ( KInit, ( CStifLogger::EBold, _L( "Running test case [%S], case [%d]" ), &aName, aCaseNumber ) );
-
-    // Set the operation    
-    iErrorResult = ChangeOperation( EExecuteTestInThread, aName, aCaseNumber );
-
-    if ( iErrorResult != KErrNone )
-        {
-        aMessage.Complete ( iErrorResult );
-        return;
-        }    
-
-    // Set data
-    iMessage = aMessage;
-
-    iStatus = KRequestPending;
-    // Get ready to handle operation completion
-    SetActive();
-
-    // Do operation
-    iOperationStartSemaphore.Signal();    
-
-    // This is asynchronous operation, 
-    // do not wait until completed.    
-
-    }
-
-/*
--------------------------------------------------------------------------------
-
-    Class: CTestModuleContainer
-
-    Method: SetExecutionSubSession
-
-    Description: Set execution subsession
-
-    Sets module container test execution subsession. Execution subsession
-    is changed when a module container is reused to run another 
-    test case.
-
-    Parameters: CTestExecution* aExecution    :in:  Subsession pointer
-    
-    Return Values: None
-
-    Errors/Exceptions: None
-
-    Status: Proposal
-    
--------------------------------------------------------------------------------
-*/
-void CTestModuleContainer::SetExecutionSubSession( CTestExecution* aExecution )
-    {
-
-    iCTestExecution = aExecution;
-
-    }
-
-/*
--------------------------------------------------------------------------------
-
-    Class: CTestModuleContainer
-
-    Method: PauseThread
-
-    Description: Pauses the thread
-
-    Parameters: None
-    
-    Return Values: None
-
-    Errors/Exceptions: None
-
-    Status: Proposal
-    
--------------------------------------------------------------------------------
-*/
-TInt CTestModuleContainer::PauseThread()
-    {
-    
-    if( iThread.ExitType() != EExitPending )
-        {
-        // Thread is not alive anymore
-        return KErrDied;
-        }
-
-    if(iCTestExecution != NULL)
-    	{
-		RMutex printMutex;
-		printMutex.SetHandle( iCTestExecution->PrintMutexHandle() );
-		RMutex eventMutex;
-		eventMutex.SetHandle( iCTestExecution->EventMutexHandle() );
-		RMutex sndMutex;
-		sndMutex.SetHandle( iCTestExecution->SndMutexHandle() );
-		RMutex rcvMutex;
-		rcvMutex.SetHandle( iCTestExecution->RcvMutexHandle() );
-		
-		printMutex.Wait(); // wait that print operation is done
-		eventMutex.Wait(); // wait that event operation is done        
-		sndMutex.Wait(); // wait that and operation is done
-		rcvMutex.Wait(); // wait that event operation is done        
-			
-		iThread.Suspend();
-		
-		printMutex.Signal();
-		eventMutex.Signal();
-		sndMutex.Signal();
-		rcvMutex.Signal();
-    	}
-    else
-		{
-		__TRACE( KError,( _L( "STIF internal error - iCTestExecution is NULL in CTestModuleContainer::PauseThread" ) ) );
-		User::Panic(_L("NULL pointer exception"), KErrGeneral);
-		}
-    
-    iIsPaused = ETrue;
-
-    return KErrNone;
-
-    }
-
-/*
--------------------------------------------------------------------------------
-
-    Class: CTestModuleContainer
-
-    Method: ResumeThread
-
-    Description: Resumes the thread
-
-    Parameters: None
-    
-    Return Values: None
-
-    Errors/Exceptions: None
-
-    Status: Proposal
-    
--------------------------------------------------------------------------------
-*/
-TInt CTestModuleContainer::ResumeThread()
-    {
-
-    if( iThread.ExitType() != EExitPending )
-        {
-        // Thread is not alive anymore
-        return KErrDied;
-        }
-    
-    iThread.Resume();
-
-    // Pause() - Resume() operations done successfully. 
-    iIsPaused = EFalse;
-
-    return KErrNone;
-    
-    }
-
-/*
--------------------------------------------------------------------------------
-
-    Class: CTestModuleContainer
-
-    Method: KillThread
-
-    Description: Kills the thread
-
-    Parameters: const TInt aCode              :in:   Kill code
-
-    Return Values: None
-
-    Errors/Exceptions: None
-
-    Status: Proposal
-    
--------------------------------------------------------------------------------
-*/
-void CTestModuleContainer::KillThread( const TInt aCode )
-    {
-
-    iUpAndRunning = EFalse;
-    iUnderTaker->Cancel();
-    
-    if(iCTestExecution != NULL)
-    	{
-		RMutex printMutex;
-		printMutex.SetHandle( iCTestExecution->PrintMutexHandle() );
-		RMutex eventMutex;
-		eventMutex.SetHandle( iCTestExecution->EventMutexHandle() );
-		RMutex sndMutex;
-		sndMutex.SetHandle( iCTestExecution->SndMutexHandle() );
-		RMutex rcvMutex;
-		rcvMutex.SetHandle( iCTestExecution->RcvMutexHandle() );
-		
-		printMutex.Wait(); // wait that print operation is done
-		eventMutex.Wait(); // wait that event operation is done        
-		sndMutex.Wait(); // wait that snd operation is done
-		rcvMutex.Wait(); // wait that event operation is done        
-			
-		iThread.Kill ( aCode );
-		
-		printMutex.Signal();
-		eventMutex.Signal();
-		sndMutex.Signal();
-		rcvMutex.Signal();
-    	}
-    else
-		{
-		__TRACE( KError,( _L( "STIF internal error - iCTestExecution is NULL in CTestModuleContainer::KillThread" ) ) );
-		User::Panic(_L("NULL pointer exception"), KErrGeneral);
-		}
-
-    }
-
-/*
--------------------------------------------------------------------------------
-
-    Class: CTestModuleContainer
-
-    Method: ChangeOperation
-
-    Description: Multithread safe way to change operation
-
-    Parameters: const TOperation aOperation   :in:  Operation type
-                const TFileName* aNameBuffer  :in:  Filename ( or NULL )
-                const TInt aInt               :in:  Operation specific int
-    
-    Return Values: TInt                             Error code
-
-    Errors/Exceptions: None
-
-    Status: Proposal
-    
--------------------------------------------------------------------------------
-*/
-TInt CTestModuleContainer::ChangeOperation( const TOperation aOperation,
-                                            const TFileName& aNameBuffer,
-                                            const TInt aInt )
-    {
-
-    TInt ret = KErrNone;
-
-    iOperationChangeSemaphore.Wait();
-
-    iErrorResult  = KErrNone;
-    iModuleResult = KErrNone;
-
-    TFileName newNameBuffer;
-    // Check is TestScripter
-    TInt check = CheckModuleName( aNameBuffer, newNameBuffer );
-    delete iModuleNameBuffer;
-	iModuleNameBuffer = NULL;
-    if( check == KErrNone )
-        {
-        // Construct heap buffer for configuration file
-        TRAP( ret, iModuleNameBuffer = HBufC::NewL( newNameBuffer.Length() ) );
-
-        if( ret == KErrNone )
-            {
-            iOperationName.Set ( iModuleNameBuffer->Des() );
-            iOperationName.Copy ( newNameBuffer );
-        
-            iOperationIntBuffer = aInt;
-            iOperationType = aOperation;
-            }
-        else
-            {
-            __TRACE ( KError, ( CStifLogger::ERed, _L( "CTestModuleContainer::ChangeOperation NoMemory" ) ) );
-            }   
-        }
-    else
-        {
-        // Construct heap buffer for configuration file
-        TRAP( ret, iModuleNameBuffer = HBufC::NewL( aNameBuffer.Length() ) );
-
-        if( ret == KErrNone )
-            {
-            iOperationName.Set ( iModuleNameBuffer->Des() );
-            iOperationName.Copy ( aNameBuffer );
-        
-            iOperationIntBuffer = aInt;
-            iOperationType = aOperation;
-            }
-        else
-            {
-            __TRACE ( KError, ( CStifLogger::ERed, _L( "CTestModuleContainer::ChangeOperation NoMemory" ) ) );
-            }
-        }
-
-    iOperationChangeSemaphore.Signal();
-
-    return ret;
-
-    }
-
-/*
--------------------------------------------------------------------------------
-
-    Class: CTestModuleContainer
-
-    Method: ChangeOperationNoError
-
-    Description: Multithread safe way to change operation. This version
-    of function can't fail.
-
-    Parameters: const TOperation aOperation   :in:  Operation type
-                const TInt aInt               :in:  Operation specific int
-    
-    Return Values: None
-
-    Errors/Exceptions: None
-
-    Status: Proposal
-    
--------------------------------------------------------------------------------
-*/
-void CTestModuleContainer::ChangeOperationNoError( const TOperation aOperation,
-                                                   const TInt aInt
-                                                 )
-    {
-
-    iOperationChangeSemaphore.Wait();
-
-    iErrorResult  = KErrNone;
-    iModuleResult = KErrNone;
-    iOperationIntBuffer = aInt;
-    iOperationType = aOperation;
-    
-    iOperationChangeSemaphore.Signal();
-
-    }
-
-/*
--------------------------------------------------------------------------------
-
-    Class: CTestModuleContainer
-
-    Method: Operation
-
-    Description: Multithread safe way to obtain current operation.
-
-    Parameters: None
-
-    Return Values: TBool                            Operation
-
-    Errors/Exceptions: None
-
-    Status: Proposal
-
--------------------------------------------------------------------------------
-*/
-//@spe const CTestModuleContainer::TOperation CTestModuleContainer::Operation()
-CTestModuleContainer::TOperation CTestModuleContainer::Operation()
-    {
-    TOperation operation;
-    iOperationChangeSemaphore.Wait();
-    operation = iOperationType;
-    iOperationChangeSemaphore.Signal();
-
-    return operation;
-
-    }
-
-/*
--------------------------------------------------------------------------------
-
-    Class: CTestModuleContainer
-
-    Method: ModuleResult
-
-    Description: Returns error code from test module
-
-    Parameters: None
-
-    Return Values: TInt                             Result code from module
-
-    Errors/Exceptions: None
-
-    Status: Proposal
-
--------------------------------------------------------------------------------
-*/
-TInt& CTestModuleContainer::ModuleResult()
-    {
-
-    return iModuleResult;
-
-    }
-
-/*
--------------------------------------------------------------------------------
-
-    Class: CTestModuleContainer
-
-    Method: OperationErrorResult
-
-    Description: Returns error code from test module
-
-    Parameters: None
-
-    Return Values: TInt                             Result code from module
-
-    Errors/Exceptions: None
-
-    Status: Proposal
-
--------------------------------------------------------------------------------
-*/
-TInt& CTestModuleContainer::OperationErrorResult()
-    {
-
-    return iModuleResult;
-
-    }
-
-/*
--------------------------------------------------------------------------------
-
-    Class: CTestModuleContainer
-
-    Method: TestModuleName
-
-    Description: Returns test module name.
-
-    Parameters: None
-
-    Return Values: const TDesC&: test module name
-
-    Errors/Exceptions: None
-
-    Status: Proposal
-
--------------------------------------------------------------------------------
-*/
-const TDesC& CTestModuleContainer::TestModuleName()
-    {
-    
-    return iCTestModule->Name();
-    
-    }
-
-/*
--------------------------------------------------------------------------------
-
-    Class: CTestModuleContainer
-
-    Method: TestModuleName
-
-    Description: Returns test module name.
-
-    Parameters: None
-
-    Return Values: const TDesC&: test module name
-
-    Errors/Exceptions: None
-
-    Status: Proposal
-
--------------------------------------------------------------------------------
-*/
-const TDesC& CTestModuleContainer::TestModuleIniFile()
-    {
-    
-    return iCTestModule->IniName();
-    
-    }
-
-/*
--------------------------------------------------------------------------------
-
-    Class: CTestModuleContainer
-
-    Method: ModuleResult
-
-    Description: Returns constant pointer to test case array
-
-    Parameters: None
-    
-    Return Values: const RPointerArray<TTestCaseInfo>*  Test cases
-
-    Errors/Exceptions: None
-
-    Status: Proposal
-    
--------------------------------------------------------------------------------
-*/
-const RPointerArray<TTestCaseInfo>* CTestModuleContainer::TestCases() const
-    {
-    
-    if( !iUpAndRunning )
-        {
-        return NULL;
-        }
-        
-    if( iThreadContainer == NULL )
-        {
-        CTestServer::PanicServer( ENullTestThreadContainer );
-        }
-    return iThreadContainer->TestCases();
-
-    }
-
-/*
--------------------------------------------------------------------------------
-
-    Class: CTestModuleContainer
-
-    Method: Complete
-
-    Description: Completes operation from any thread
-
-    Parameters: const TInt aCompletionCode :in:     Completion code
-    
-    Return Values: None
-
-    Errors/Exceptions: Function panics if server's thread can't be opened.
-
-    Status: Proposal
-
--------------------------------------------------------------------------------
-*/
-void CTestModuleContainer::Complete( const TInt aCompletionCode )
-    {
-
-    TRequestStatus* req = &iStatus;
-    User::RequestComplete( req, aCompletionCode );
-    
-    }
-
-/*
--------------------------------------------------------------------------------
-
-    Class: CTestModuleContainer
-
-    Method: DoErrorPrint
-
-    Description: Handle error prints.
-        
-    Parameters: None
-    
-    Return Values: None
-
-    Errors/Exceptions: None
-
-    Status: Proposal
-    
--------------------------------------------------------------------------------
-*/
-void CTestModuleContainer::DoErrorPrint()
-    {    
-    
-    iCTestModule->ErrorPrint( iErrorPrint.iPriority, iErrorPrint.iText );
-    
-    }
- 
-/*
--------------------------------------------------------------------------------
-
-    Class: CTestModuleContainer
-
-    Method: KillTestinterferenceThread
-
-    Description: Make sure that any of the test interference thread's won't
-                 stay to run if test case is crashed of test interference
-                 object is not deleted.
-
-    Parameters: None
-    
-    Return Values: None
-
-    Errors/Exceptions: None
-
-    Status: Proposal
-    
--------------------------------------------------------------------------------
-*/
-void CTestModuleContainer::KillTestinterferenceThread()
-    {
-    if (iCTestExecution != NULL)
-    	{
-    	iCTestExecution->KillTestinterferenceThread();
-    	}
-    else
-    	{
-    	__TRACE( KError,( _L( "STIF internal error - iCTestExecution is NULL in CTestModuleContainer::KillTestinterferenceThread" ) ) );
-    	User::Panic(_L("NULL pointer exception"), KErrGeneral);
-    	}
-    }
-
-/*
--------------------------------------------------------------------------------
-
-    Class: CTestModuleContainer
-
-    Method: KillTestMeasurement
-
-    Description: Make sure that any of the test measurement process's won't
-                 stay to run if test case is crashed of test measurement object
-                 is not deleted.
-
-    Parameters: None
-    
-    Return Values: None
-
-    Errors/Exceptions: None
-
-    Status: Approved
-    
--------------------------------------------------------------------------------
-*/
-void CTestModuleContainer::KillTestMeasurement()
-    {    
-    if (iCTestExecution != NULL)
-    	{
-    	iCTestExecution->KillTestMeasurement();
-    	}
-    else
-    	{
-    	__TRACE( KError,( _L( "STIF internal error - iCTestExecution is NULL in CTestModuleContainer::KillTestMeasurement" ) ) );
-    	User::Panic(_L("NULL pointer exception"), KErrGeneral);
-    	}
-    }
-
-/*
--------------------------------------------------------------------------------
-
-    Class: CTestModuleContainer
-
-    Method: GetRequest
-
-    Description: Return status flags.
-        
-    Parameters: TRequestType aType: in: request type
-    
-    Return Values: TRequestStatus*: pointer to TRequestStatus
-
-    Errors/Exceptions: None
-
-    Status: Proposal
-    
--------------------------------------------------------------------------------
-*/
-TRequestStatus* CTestModuleContainer::GetRequest( TRequestType aType )
-    { 
-    
-    TRequestStatus* status = NULL;
-    
-    switch( aType )
-        {
-        case ERqTestCase:
-            status = &iStatus;
-            break;
-        case ERqErrorPrint:
-            status = &iErrorPrintHandler->iStatus;
-            break;
-        default: 
-            break;
-        }
-    
-    return status;
-
-    }
-    
-/*
--------------------------------------------------------------------------------
-
-    Class: CTestModuleContainer
-
-    Method: RunL
-
-    Description: Stops active scheduler when operation in another thread
-                 is completed.
-
-    Parameters: None
-
-    Return Values: None
-
-    Errors/Exceptions: None
-
-    Status: Proposal
-
--------------------------------------------------------------------------------
-*/
-void CTestModuleContainer::RunL()
-    {
-    
-    if( iOperationType == CTestModuleContainer::EExecuteTestInThread )
-        {
-        // Make sure that any of the test interference thread's won't stay
-        // to run.
-        KillTestinterferenceThread();
-
-        // Make sure that any of the test measurement process's won't stay
-        // to run.
-        KillTestMeasurement();
-
-        if(iCTestExecution == NULL)
-        	{
-        	__TRACE( KError,( _L( "STIF internal error - iCTestExecution is NULL in CTestModuleContainer::RunL" ) ) );
-        	User::Leave(KErrGeneral);
-        	}
-        else
-        	{
-			// Set the thread state
-			iCTestExecution->SetThreadState( CTestExecution::EFinished );
-	
-			 // If test print queue is empty, then complete request with KEof. If Queue
-			// is not empty, then do not complete. Queue will be emptied by UI.   
-			iCTestExecution->CompletePrintRequestIfQueueEmpty();
-	
-			// Event queue clean-up
-			iCTestExecution->CleanupEvents();
-			
-			// Complete the test request
-			iCTestExecution->CompleteTestExecution( iStatus.Int() );
-			
-			// Test case execution OK and test module thread's pause operation
-			// is not ongoing. Re-use old test module execution thread
-			if( iCTestExecution->TestThreadFailure() == CTestExecution::ETestThreadOk && !iIsPaused )
-				{
-				// Return this module to pool
-				__TRACE( KInit, ( _L("Freeing test module container at 0x%x"),  
-					(TUint32) this ) );
-				iCTestModule->FreeTestModule( this );
-				}
-			// Problems in test case execution. Delete this test module thread and
-			// start next test case in new test module thread.
-			else
-				{
-				if( iIsPaused )
-					{
-					// Test case is paused by user and this RunL is executed also.
-					// This RunL will make Resume() operation to fail because test
-					// case is finished. Next test case cannot complete and that is
-					// why next test case will start at the "clean table".
-					__TRACE( KInit, ( _L( "Delete test module container at 0x%x because test module thread is paused while test case is finished(Cannot Resume())" ), (TUint32) this ) );  
-					}
-				else
-					{
-					// delete test module thread if some thread problem has occurred 
-					__TRACE( KInit, ( _L("Delete test module container at 0x%x because of thread leak (0x%x)"),  
-						(TUint32) this,  iCTestExecution->TestThreadFailure() ) );
-					}
-				delete this;            
-				}
-        	}
-        }
-    else
-        {
-        // Synchronous operation is completed, stop "nested" active scheduler.
-        //CActiveScheduler::Stop();
-        iNestedActiveScheduler->AsyncStop();
-        // Execution continues from CTestModuleContainer::WaitOperation().
-        }
-    }
-
-
-/*
--------------------------------------------------------------------------------
-
-    Class: CTestModuleContainer
-
-    Method: DoCancel
-
-    Description: Cancel asyncronous request.
-
-    Parameters: None
-
-    Return Values: None
-
-    Errors/Exceptions: None
-
-    Status: Proposal
-
--------------------------------------------------------------------------------
-*/
-void CTestModuleContainer::DoCancel()
-    {
-
-    if ( iUpAndRunning == EFalse )
-        {
-        
-        // Before the completion check if the status was not already completed
-        // from other thread in CTestThreadContainer::TestComplete().
-        // For details see Jira STIF-564
-        if(iStatus == KRequestPending)
-            Complete ( KErrCancel ); 
-
-        }
-
-    }
-
-
-
-/*
--------------------------------------------------------------------------------
-
-    Class: CTestModuleContainer
-
-    Method: RunError
-
-    Description: Handle errors. 
-
-    Because RunL does not leave, one should never come here. Just forward
-    error code and let framework panic the server in case of error.
-
-    Parameters: TInt aError:                  :in:  Error code
-
-    Return Values:  TInt                            Error code
-
-    Errors/Exceptions: None
-
-    Status: Proposal
-
--------------------------------------------------------------------------------
-*/
-TInt CTestModuleContainer::RunError( TInt aError )
-    {
-
-    __TRACE( KError,( _L( "CTestModuleContainer::RunError %d" ), aError ) );
-
-    return aError;
-
-    }
-
-/*
--------------------------------------------------------------------------------
-
-    Class: CTestModuleContainer
-
-    Method: ReadParametersFromScriptFileL
-
-    Description: Read test class parameters from script file if parameter(s)
-                 are/is set(TestScripter and TestCombiner).
-
-    Parameters: const TDesC& aConfig: in: Test case (config) file name.
-                TUint32& aStackSize: inout: Stack size.
-                TUint32& aHeapMinSize: inout: Heap's minimum size.
-                TUint32& aHeapMaxSize: inout: Heap's maximum size.
-
-    Return Values: Symbian error code.
-
-    Errors/Exceptions: Leaves if User::LeaveIfError() leaves
-                       Leaves if User::LeaveIfNull() leaves
-
-    Status: Approved
-
--------------------------------------------------------------------------------
-*/
-TInt CTestModuleContainer::ReadParametersFromScriptFileL( 
-                                                const TDesC& aConfig,
-                                                TInt& aStackSize,
-                                                TInt& aHeapMinSize,
-                                                TInt& aHeapMaxSize )
-    {
-    // __UHEAP_MARK;
-
-    RFs fileServer;
-    RFile file;
-    TInt ret( KErrNone );
-
-    User::LeaveIfError( fileServer.Connect() );
-    CleanupClosePushL( fileServer );
-    
-    __TRACE( KInit, ( _L( "ReadParametersFromScriptFile(): Open configfile [%S]" ), &aConfig ) );
-
-    TParse parse;
-    parse.Set( aConfig, NULL, NULL );
-
-    User::LeaveIfError( fileServer.SetSessionPath( parse.DriveAndPath() ) );
-
-    User::LeaveIfError( file.Open( fileServer, aConfig, EFileRead | EFileShareAny ) );
-    CleanupClosePushL( file );
-
-    TInt size( 0 );
-    User::LeaveIfError( file.Size( size ) );
-
-    const TInt tmpSize = KMaxName; // 128
-    TInt offset( 0 ); // Offset value to parts reading
-
-    // Indications for tags
-    TBool start_tag_found( EFalse );
-    TBool end_tag_found( EFalse );
-    // Offset values for start and end position parsing
-    TInt offset_start( 0 );
-    TInt offset_end( 0 );
-
-    /* Search is combined to section that include tags. After this create new
-    combined section that include second buffer data and new buffer data.
-    Section:     1) 1+2
-                 2) 2+1
-                 2) 1+2 etc. This should ensure that all data is search.
-    */
-
-    // Construct modifiable heap-based descriptor. tmp1 to CleanupStack
-    // This for first data buffer
-    HBufC8* tmp1 = HBufC8::NewLC( tmpSize );            // 128
-    TPtr8 buf1 = tmp1->Des();
-
-    // Construct modifiable heap-based descriptor. tmp2 to CleanupStack
-    // This for second data buffer
-    HBufC8* tmp2 = HBufC8::NewLC( tmpSize );            // 128
-    TPtr8 buf2 = tmp2->Des();
-
-    // Construct modifiable heap-based descriptor. tmp3 to CleanupStack
-    // This includes both first and second data buffers
-    HBufC* tmp3 = HBufC::NewLC( tmpSize + tmpSize );    // 256
-    TPtr currentSection = tmp3->Des();
-
-    // Construct modifiable heap-based descriptor. tmp4 to CleanupStack
-    // This is for changing 8 bit to 16 bit
-    HBufC* tmp4 = HBufC::NewLC( tmpSize );              // 128
-    TPtr to16bit = tmp4->Des();
-
-    ret = KErrNone;
-
-    // Read data to buffer 1
-    // tmp4, tmp3, tmp2 and tmp1 are in CleanupStack => Leave OK
-    // CleanupClosePushL is used to fileServer and file => Leave OK
-    User::LeaveIfError( file.Read( offset, buf1, tmpSize ) );
-
-    // For next buffer reading
-    offset += tmpSize;
-
-    // Read data to buffer 2
-    // tmp4, tmp3, tmp2 and tmp1 are in CleanupStack => Leave OK
-    // CleanupClosePushL is used to fileServer and file => Leave OK
-    User::LeaveIfError( file.Read( offset, buf2, tmpSize ) );
-
-    // 8 bit to 16. Create first combined buffer 1 and buffer 2 that
-    // is used for searching.
-    to16bit.Copy( buf1 );
-    currentSection.Copy( to16bit );
-    to16bit.Copy( buf2 );
-    currentSection.Append( to16bit );
-
-    // Check if small files to be parsed(e.g. settings + one short case).
-    TInt bigsize( 0 );
-    // Check if parsed section is smaller than 256
-    if( size <  ( tmpSize + tmpSize ) )
-        {
-        bigsize = size;
-        }
-    else
-        {
-        bigsize = tmpSize + tmpSize;    // 256
-        }
-
-    do
-        {
-        // Start the next buffer reading
-        offset += tmpSize;
-
-        // Search the start tag
-        ret = currentSection.Find( KStifSettingsStartTag );
-        if( ret != KErrNotFound )
-            {
-            // Succesfully search, take the start offset
-            ret = file.Seek( ESeekCurrent, offset_start );
-            if( ret == KErrNone )
-                {
-                start_tag_found = ETrue;
-                // Current section is end so offset to beging of the 
-                // combined section.
-                offset_start = ( offset_start - ( bigsize ) );
-                }
-            }
-        // Search the end tag
-        ret = currentSection.Find( KStifSettingsEndTag );
-        if( ret != KErrNotFound )
-            {
-            // Succesfully search, take the end offset
-            ret = file.Seek( ESeekCurrent, offset_end );
-            if( ret == KErrNone )
-                {
-                end_tag_found = ETrue;
-                }
-            }
-
-        // Both start and end tags are founded, start parsing sizes.
-        if( start_tag_found && end_tag_found )
-            {
-            TInt length = ( offset_end - offset_start );
-
-            // Construct modifiable heap-based descriptor.
-            // setting_buf to CleanupStack
-            HBufC8* setting_buf = HBufC8::NewLC( length );// 8 bit for reading
-            TPtr8 setting8 = setting_buf->Des();
-
-            // Construct modifiable heap-based descriptor.
-            // setting_buf2 to CleanupStack
-            HBufC* setting_buf2 = HBufC::NewLC( length );// 16 bit for parsing
-            TPtr setting16 = setting_buf2->Des();
-
-            // Read data from the founded STIF settings sections
-            ret = KErrNone;
-            // HBufCs are in CleanupStack => Leave OK
-            // CleanupClosePushL is used to fileServer and file => Leave OK
-            User::LeaveIfError( file.Read( offset_start, setting8, length ) );
-
-            // Section 8 bit to 16.
-            setting16.Copy( setting8 );
-
-            // Start create parser for parsing heap and stack sizes.
-            // NOTE: Comments are parsed away from the section.
-            CStifParser* parser = NULL;
-            User::LeaveIfNull( parser = CStifParser::NewL( setting16,
-                                        CStifParser::ECStyleComments  ) );
-            CleanupStack::PushL(parser);
-
-            CStifSectionParser* section = NULL;
-            User::LeaveIfNull( section = parser->SectionL( KStifSettingsStartTag,
-                                                   KStifSettingsEndTag ) );
-            CleanupStack::PushL(section);
-            TInt lineRet( KErrNone );
-            TInt integer( 0 );
-
-            // Try to get stack size
-            CStifItemParser* itemLine = NULL;
-            TRAPD( parse_ret, itemLine = section->GetItemLineL(
-                                                        KUserDefStackSize ) );
-            if ( parse_ret == KErrNone && itemLine != NULL )
-                {
-                lineRet = itemLine->GetInt( KUserDefStackSize, integer );
-                if ( lineRet == KErrNone )
-                    {
-                    aStackSize = integer;
-                    }
-                }
-            delete itemLine;
-            itemLine = NULL;
-
-            // Try to get minimum heap size
-            TRAP( parse_ret, itemLine = section->GetItemLineL(
-                                                        KUserDefMinHeap ) );
-            if ( parse_ret == KErrNone && itemLine != NULL )
-                {
-                lineRet = itemLine->GetInt( KUserDefMinHeap, integer );
-                if ( lineRet == KErrNone )
-                    {
-                    aHeapMinSize = integer;
-                    }
-                }
-            delete itemLine;
-            itemLine = NULL;
-
-            // Try to get maximum heap size
-            TRAP( parse_ret, itemLine = section->GetItemLineL(
-                                                        KUserDefMaxHeap ) );
-            if ( parse_ret == KErrNone && itemLine != NULL )
-                {
-                lineRet = itemLine->GetInt( KUserDefMaxHeap, integer );
-                if ( lineRet == KErrNone )
-                    {
-                    aHeapMaxSize = integer;
-                    }
-                }
-            delete itemLine;
-
-            CleanupStack::Pop(section);
-            CleanupStack::Pop(parser);
-
-            CleanupStack::PopAndDestroy( setting_buf2 );
-            CleanupStack::PopAndDestroy( setting_buf );
-
-            delete section;
-            delete parser;
-
-            break; // Stop the do branch
-            }
-
-        // Start to create new section for search
-
-        // 8 bit to 16. Last buffer to first
-        to16bit.Copy( buf2 );
-        currentSection.Copy( to16bit );
-
-        // Read new data to buffer 1
-        ret = KErrNone;
-        User::LeaveIfError( file.Read( offset, buf1, tmpSize ) );
-
-        // 8 bit to 16. Append
-        to16bit.Copy( buf1 );
-        currentSection.Append( to16bit );
-
-        // Copy first buffer data to buffer 2. This is added to first
-        // in section in next run
-        buf2.Copy( buf1 );
-
-        } while( offset < size );
-
-    CleanupStack::PopAndDestroy( tmp4 );
-    CleanupStack::PopAndDestroy( tmp3 );
-    CleanupStack::PopAndDestroy( tmp2 );
-    CleanupStack::PopAndDestroy( tmp1 );
-
-    CleanupStack::PopAndDestroy( &file );
-    CleanupStack::PopAndDestroy( &fileServer );
-    file.Close();
-    fileServer.Close();
-
-    //__UHEAP_MARKEND;
-
-    return KErrNone;
-
-    }
-
-/*
--------------------------------------------------------------------------------
-
-    Class: CTestModuleContainer
-
-    Method: ReadParametersFromTestModule
-
-    Description: Loads dynamically testmodule and calls SetRequirements()-
-                 method for test module parameter handling.
-
-    Parameters: const TDesC& aModuleName: in: Test module name
-                CTestModuleParam*& aTestModuleParam: inout: Object for handling
-                test module parameters.
-
-    Return Values: TInt: Symbian error code.
-
-    Errors/Exceptions: None.
-
-    Status: Proposal
-
--------------------------------------------------------------------------------
-*/
-TInt CTestModuleContainer::ReadParametersFromTestModule(
-                                const TDesC& aModuleName,
-                                CTestModuleParam*& aTestModuleParam )
-    {
-    __TRACE( KInit, (  _L( "ReadParametersFromTestModule() [%S]" ), &aModuleName ) );
-    RLibrary testModule;
-    // Load the module
-    TPtrC dllName;
-    
-    // Remove optional index appended to module name
-    TFileName validModuleName;
-    RemoveOptionalIndex(aModuleName, validModuleName);
-    __TRACE(KInit, (_L( "Valid module name is [%S] (extracted from [%S])"), &validModuleName, &aModuleName));
-    dllName.Set(validModuleName);
-    
-    // Loading should work with and without '.dll' extension.
-    TInt r = testModule.Load( dllName );
-    if ( r != KErrNone )
-        {
-        __TRACE( KError, ( CStifLogger::EError, _L("Can't initialize test module[%S], code = %d"), &dllName, r ) );
-        return KErrNotFound;
-        }
-    else
-        {
-        // Print reset module name
-        __TRACE( KInit, (  _L("Loaded test module[%S]"), &dllName ) );
-        }
-
-    
-
-    CTestInterfaceFactoryTestModule libEntry = NULL;
-    
-#if defined( __ARMCC__ )
-        {
-        // In this environment the heap and stack feature may crash if
-        // test module not include a workaround for ARM RVCT(ARMv5) compiler
-        // error. For more information see STIF user guide.
-        __TRACE ( KInit, ( _L( "Workaround for ARM RVCT(ARMv5) compiler error should be included to TestModule." ) ) );
-        }
-#endif // #if defined(__ARMCC__)
-
-    // Get pointer to second exported function
-    // Verify that there is function
-    //CTestInterfaceFactoryTestModule libEntry;
-    libEntry = (CTestInterfaceFactoryTestModule) testModule.Lookup( 2 );
-    if ( libEntry == NULL )
-        {
-        // New instance can't be created
-        __TRACE( KInit, (_L( "Test module is old version and has not SetRequirements() feature." ) ) );
-        testModule.Close();
-        return KErrNotSupported;
-        }
-    else
-        {
-        __TRACE ( KInit, ( _L("Pointer to 2st exported received")));
-        }
-
-    // Calls dynamically loaded module's second method.
-    __TRACE ( KVerbose, (_L("Calling 2st exported at 0x%x"), (TUint32) libEntry ));
-    TUint32 check = 0;
-    TInt ret =  (*libEntry)( aTestModuleParam, check  );
-    if( check != KStifTestModuleParameterChanged  )
-        {
-        // Problems in def-file definitions. Test module is old wersion
-        // and has not SetRequirements feature.
-        RDebug::Print( ( _L( "STIF TF: Test module is old version and has not SetRequirements() feature." ) ) );
-        __TRACE( KInit, (_L( "Test module is old version and has not SetRequirements() feature." ) ) );
-        testModule.Close();
-        return KErrNotSupported;
-        }
-    if( ret != KErrNone )
-        {
-        __TRACE (KInit, (_L("ReadParametersFromTestModule; SetRequirements fails with error: %d"), ret ) );
-        testModule.Close();
-        return ret;
-        }
-
-    libEntry = NULL; 
-    testModule.Close(); // After close test module's pointer is not
-                        // valid anymore.
-
-    return KErrNone;
-
-    }
-
-/*
--------------------------------------------------------------------------------
-
-    Class: CTestModuleContainer
-
-    Method: GetTestModuleParams
-
-    Description: Load test module dynamically. If loading is done succesfully
-                 then set test module's parameters according to version.
-                 Verify received parameters.
-
-    Parameters: const TDesC& aModuleName: in: Test module name.
-                const TDesC& aConfig: in: Test case (config) file name.
-                TInt& aStackSize: inout: Stack size.
-                TInt& aHeapMinSize: inout: Heap's minimum size.
-                TInt& aHeapMaxSize: inout: Heap's maximum size.
-
-    Return Values: TInt: Symbian error code.
-
-    Errors/Exceptions: None
-
-    Status: Proposal
-
--------------------------------------------------------------------------------
-*/
-TInt CTestModuleContainer::GetTestModuleParams( const TDesC& aModuleName,
-                                                const TDesC& aConfig,
-                                                TInt& aStackSize,
-                                                TInt& aHeapMinSize,
-                                                TInt& aHeapMaxSize )
-    {
-    TInt r( KErrNone );
-
-    // There is lower case despite what is initialization file given.
-    // Module name is without dll extension.
-    // Check is TestScripter or TestCombiner and test case (config) file
-    // name is given.
-    if( ( aModuleName.Find( KTestScripterName ) != KErrNotFound ||
-          aModuleName == _L( "testcombiner" ) ) && aConfig != KNullDesC )
-        {
-        TRAPD( ret, r = ReadParametersFromScriptFileL( aConfig, aStackSize,
-                                          aHeapMinSize, aHeapMaxSize ) );
-        if( r != KErrNone )
-            {
-            __TRACE( KInit, ( CStifLogger::ERed, _L( "Cannot set Test Class's stack or heap sizes, fail with error: %d" ), r ) );
-            __TRACE( KInit, ( _L( "Default sizes will be use(See KTestThreadMinHeap, KTestThreadMinHeap and KStackSize)" ) ) );
-            return r;
-            }
-        if( ret != KErrNone )
-            {
-            __TRACE( KInit, ( CStifLogger::ERed, _L( "Cannot set Test Class's stack or heap sizes, leaves with error: %d" ), r ) );
-            __TRACE( KInit, ( _L( "Default sizes will be use(See KTestThreadMinHeap, KTestThreadMinHeap and KStackSize)" ) ) );
-            return ret;
-            }
-        }
-    else
-        {
-        CTestModuleParam* testModuleParam = NULL;
-        //--PYTHON-- begin
-        if(aModuleName.Find(KPythonScripter) != KErrNotFound)
-            {
-			RDebug::Print(_L("CTestModuleContainer::GetTestModuleParams reading params for PythonScripter, aModuleName=[%S]"), &aModuleName);
-            TName n;
-            n.Copy(KPythonScripter);
-            r = ReadParametersFromTestModule( n, testModuleParam );
-            }
-        else
-        //--PYTHON-- end
-            r = ReadParametersFromTestModule( aModuleName, testModuleParam );
-
-        if( r != KErrNone )
-            {
-            __TRACE( KInit, ( _L( "Cannot set Test Module's stack or heap sizes, fails with: %d" ), r ) );
-            __TRACE( KInit, ( _L( "Default sizes will be use(See KTestThreadMinHeap, KTestThreadMinHeap and KStackSize)" ) ) );
-            delete testModuleParam;
-            return r;
-            }
-
-        if ( testModuleParam->Version() == 1 )
-            {
-            // Casting
-            CTestModuleParamVer01* paramVer01 = ( CTestModuleParamVer01* ) testModuleParam;
-            aStackSize = paramVer01->iTestThreadStackSize;
-            aHeapMinSize = paramVer01->iTestThreadMinHeap;
-            aHeapMaxSize = paramVer01->iTestThreadMaxHeap;
-            }
-
-        delete testModuleParam;
-        }
-
-    // Verify that sizes are valid. If problems are notices then use default 
-    // value
-
-    // 1) "The panic occurs when the value of the stack size is negative."
-    if( aStackSize < 0 )
-        {
-        RDebug::Print( ( _L("STIF TF: GetTestModuleParams() fails because value of the stack size is negative, default value is taken into use") ) );
-        __TRACE( KInit, ( CStifLogger::ERed, _L("STIF TF: GetTestModuleParams() fails because value of the stack size is negative, default value is taken into use" ) ) );
-        // Use default value
-        aStackSize = KStackSize;
-        }
-    
-    // 2) "The panic occurs if the minimum heap size specified is less
-    // than KMinHeapSize".
-    // KMinHeapSize: "Functions that require a new heap to be allocated will
-    // either panic, or will reset the required heap size to this value if a
-    // smaller heap size is specified".
-    if( aHeapMinSize < KMinHeapSize )
-        {
-        RDebug::Print( _L( "STIF TF: GetTestModuleParams() fails because test module minimum heap size is less than KMinHeapSize:[%d], default value is taken into use" ), KMinHeapSize );
-        __TRACE( KInit, ( CStifLogger::ERed, _L("STIF TF: GetTestModuleParams() fails because test module minimum heap size is less than KMinHeapSize:[%d], default value is taken into use"), KMinHeapSize ) );
-        // Use default value(Note: This is used for now on)
-        aHeapMinSize = KTestThreadMinHeap;
-        }
-
-    // 3) "The panic occurs if the minimum heap size specified is greater than
-    // the maximum size to which the heap can grow".
-    // Check this last !
-    if( aHeapMinSize > aHeapMaxSize )
-        {
-        RDebug::Print( ( _L("STIF TF: GetTestModuleParams() fails because the maximum heap size is specified less than minimum heap size, default values is taken into use" ) ) );
-        __TRACE( KInit, ( CStifLogger::ERed, _L( "STIF TF: GetTestModuleParams() fails because the maximum heap size is specified less than minimum heap size, default values is taken into use" ) ) );
-        // Use default values
-        aHeapMinSize = KTestThreadMinHeap;
-        aHeapMaxSize = KTestThreadMaxHeap;
-        }
-
-    __TRACE( KInit, ( _L( "[%S] uses:" ), &aModuleName ) );
-    __TRACE( KInit, ( _L( "Stack size: [%d]" ), aStackSize ) );
-    __TRACE( KInit, ( _L( "Minimum heap size: [%d]" ), aHeapMinSize ) );
-    __TRACE( KInit, ( _L( "Maximum heap size: [%d]" ), aHeapMaxSize ) );
-
-    return KErrNone;
-
-    }
-
-/*
--------------------------------------------------------------------------------
-
-    Class: CTestModuleContainer
-
-    Method: GetTestCaseTitleL
-
-    Description: Gets title of currently running test case.
-
-    Parameters: TDes& aTestCaseTitle: out: Test case title.
-
-    Return Values: None
-
-    Errors/Exceptions: None
-
-    Status: Proposal
-
--------------------------------------------------------------------------------
-*/
-void CTestModuleContainer::GetTestCaseTitleL(TDes& aTestCaseTitle)
-    {
-    //currently run test case stored in the iOperationIntBuffer variable
-    iCTestModule->GetTestCaseTitleL( iOperationIntBuffer, 
-                                     iCTestExecution->GetConfigFileName(),
-                                    aTestCaseTitle);  
-    }
-
-
-/*
--------------------------------------------------------------------------------
-
-    Class: CTestModuleContainer
-
-    Method: GetTestModule
-
-    Description: Gets pointer to test module
-
-    Parameters: none
-
-    Return Values: CTestModule* : Pointer to test module
-
-    Errors/Exceptions: None
-
-    Status: Proposal
-
--------------------------------------------------------------------------------
-*/
-CTestModule* CTestModuleContainer::GetTestModule()
-    {
-    
-    return iCTestModule;
-    }
-
-
-/*
--------------------------------------------------------------------------------
-
-    DESCRIPTION
-
-    This module contains implementation of CPrintHandler class member functions.
-    CErrorPrintHandler listens print notifications from test thread.
-
--------------------------------------------------------------------------------
-*/
-
-// ================= MEMBER FUNCTIONS =========================================
-
-
-/*
--------------------------------------------------------------------------------
-
-    Class: CErrorPrintHandler
-
-    Method: NewL
-
-    Description: Constructs a new CErrorPrintHandler object.
-
-    Parameters: CTestExecution& aExecution: in: "Parent"
-
-    Return Values: CErrorPrintHandler*: New undertaker
-
-    Errors/Exceptions: Leaves if memory allocation or ConstructL leaves.
-
-    Status: Proposal
-
--------------------------------------------------------------------------------
-*/
-CErrorPrintHandler* CErrorPrintHandler::NewL( CTestModuleContainer& aContainer )
-    {
-
-    CErrorPrintHandler* self = new( ELeave ) CErrorPrintHandler( aContainer );
-    CleanupStack::PushL( self );
-    self->ConstructL();
-    CleanupStack::Pop( self );
-    return self;
-
-    }
-
-/*
--------------------------------------------------------------------------------
-
-    Class: CErrorPrintHandler
-
-    Method: ConstructL
-
-    Description: Second level constructor.
-
-    Parameters: None
-
-    Return Values: None
-
-    Errors/Exceptions: None
-
-    Status: Proposal
-
--------------------------------------------------------------------------------
-*/
-void CErrorPrintHandler::ConstructL()
-    {
-
-    }
-
-/*
--------------------------------------------------------------------------------
-
-    Class: CErrorPrintHandler
-
-    Method: CErrorPrintHandler
-
-    Description: Constructor
-
-    Parameters: CTestModuleContainer& aExecution :in:   "Parent"
-
-    Return Values: None
-
-    Errors/Exceptions: None
-
-    Status: Proposal
-    
--------------------------------------------------------------------------------
-*/
-CErrorPrintHandler::CErrorPrintHandler( CTestModuleContainer& aContainer ) :
-    CActive( CActive::EPriorityStandard ),
-    iContainer( aContainer )
-    {
-    
-    CActiveScheduler::Add ( this );
-        
-    }
-
-/*
--------------------------------------------------------------------------------
-
-    Class: CErrorPrintHandler
-
-    Method: ~CErrorPrintHandler
-
-    Description: Destructor. 
-    Cancels active request.
-
-    Parameters: None
-
-    Return Values: None
-
-    Errors/Exceptions: None
-
-    Status: Proposal
-    
--------------------------------------------------------------------------------
-*/
-CErrorPrintHandler::~CErrorPrintHandler()
-    {
-
-    Cancel();
-
-    }
-
-/*
--------------------------------------------------------------------------------
-
-    Class: CErrorPrintHandler
-
-    Method: StartL
-
-    Description: Starts to monitor thread.
-
-    Parameters: None
-
-    Return Values: TInt                             Always KErrNone
-
-    Errors/Exceptions: None
-
-    Status: Proposal
-    
--------------------------------------------------------------------------------
-*/
-void CErrorPrintHandler::StartL()
-    {
-    
-    __TRACE( KPrint, ( _L( "CErrorPrintHandler::StartL" ) ) );
-    
-    iStatus = KRequestPending;
-    SetActive();
-    
-    // Signal test thread
-    iContainer.iErrorPrintSem.Signal();
-
-    }
-
-/*
--------------------------------------------------------------------------------
-
-    Class: CErrorPrintHandler
-
-    Method: RunL
-
-    Description: Handles thread death.
-    Function does:
-    1 ) Stops monitoring thread
-    1 ) Marks thread death
-    2 ) Completes ongoing requests
-    3 ) Cleans the memory
-
-    Parameters: None
-
-    Return Values: None
-
-    Errors/Exceptions: None
-
-    Status: Proposal
-
--------------------------------------------------------------------------------
-*/
-void CErrorPrintHandler::RunL()
-    {
-
-    __TRACE( KPrint, ( _L( "CErrorPrintHandler::RunL [%d]" ), iStatus.Int() ) );
-    
-    iContainer.DoErrorPrint();    
-    
-    // enable error print request
-    iContainer.iErrorPrintHandler->StartL();
-       
-    }
-
-/*
--------------------------------------------------------------------------------
-
-    Class: CErrorPrintHandler
-
-    Method: DoCancel
-
-    Description: Stops print notification listening.
-
-    Parameters: None
-
-    Return Values: None
-
-    Errors/Exceptions: None
-
-    Status: Proposal
-    
--------------------------------------------------------------------------------
-*/
-
-void CErrorPrintHandler::DoCancel()
-    {
-
-    __TRACE( KPrint, ( _L( "CErrorPrintHandler::DoCancel" ) ) );
-
-    // Signal test thread
-    iContainer.iErrorPrintSem.Wait();
-
-    TRequestStatus* status = &iStatus;    
-    User::RequestComplete( status, KErrCancel );
-
-    }
-
-/*
--------------------------------------------------------------------------------
-
-    Class: CErrorPrintHandler
-
-    Method: RunError
-
-    Description: Handle errors. RunL function does not leave, so one should
-    never come here. 
-
-    Print trace and let framework handle error( i.e to do Panic )
-
-    Parameters: TInt aError:                  :in:  Error code
-
-    Return Values:  TInt                            Error code
-
-    Errors/Exceptions: None
-
-    Status: Proposal
-
--------------------------------------------------------------------------------
-*/
-TInt CErrorPrintHandler::RunError( TInt aError )
-    {
-    
-    __TRACE( KError,( _L( "CErrorPrintHandler::RunError" ) ) );
-
-    return aError;
-    
-    }
-
-/*
--------------------------------------------------------------------------------
-
-    Class: -
-
-    Method: CheckModuleName
-
-    Description: Check is module TestScripter. Does parsing and returns new
-                 module name and error codes(Needed operations when creating
-                 server sessions to TestScripter).
-
-    Parameters: TFileName aModuleName: in: Module name for checking.
-                TFileName& aNewModuleName: inout: Parsed module name.
-
-    Return Values: KErrNone if TestScripter releated module.
-                   KErrNotFound if not TestScripter releated module.
-
-    Errors/Exceptions: None
-
-    Status: Proposal
-
--------------------------------------------------------------------------------
-*/
-TInt CheckModuleName( TFileName aModuleName, TFileName& aNewModuleName )
-    {
-//--PYTHON-- old code has been replaced with the new one
-/*
-    // Check that length is greated than KTestScripterNameLength
-    if( aModuleName.Length() < KTestScripterNameLength )
-        {
-        return KErrNotFound;
-        }
-    // Check is TestScripter
-    TPtrC check( aModuleName.Mid( 0, KTestScripterNameLength ) );
-    TInt ret = check.Compare( KTestScripterName );
-    if( ret == KErrNone )
-        {
-        aNewModuleName.Copy( aModuleName.Mid( 0, KTestScripterNameLength ) );
-        }
-    else
-        {
-        return KErrNotFound;
-        }
-
-    return KErrNone;
-*/
-
-	// Check that length is greated than KTestScripterNameLength
-	if( aModuleName.Length() >= KTestScripterNameLength )
-		{
-		TPtrC check( aModuleName.Mid( 0, KTestScripterNameLength ) );
-		TInt ret = check.Compare( KTestScripterName );
-		if( ret == KErrNone )
-			{
-			aNewModuleName.Copy( aModuleName.Mid( 0, KTestScripterNameLength ) );
-			return KErrNone;
-			}
-		}
-
-	// Check that length is greated than KTestScripterNameLength
-	if( aModuleName.Length() >= KPythonScripterLength )
-		{
-		TPtrC check( aModuleName.Mid( 0, KPythonScripterLength ) );
-		TInt ret = check.Compare( KPythonScripter );
-		if( ret == KErrNone )
-			{
-			aNewModuleName.Copy( aModuleName.Mid( 0, KPythonScripterLength ) );
-			return KErrNone;
-			}
-		}
-
-    return KErrNotFound;
-    }
-
-/*
--------------------------------------------------------------------------------
-
-    Class: -
-
-    Method: RemoveOptionalIndex
-
-    Description: Remove optional index appended to module name.
-                 If it is found (@ char) then set new module name without it.
-                 This feature is used when iSeparateProcesses is set in
-                 TestEngine.
-
-    Parameters: TFileName aModuleName: in: Module name for checking.
-                TFileName& aNewModuleName: inout: Parsed module name.
-
-    Return Values: None
-
-    Errors/Exceptions: None
-
-    Status: Proposal
-
--------------------------------------------------------------------------------
-*/
-void RemoveOptionalIndex(const TDesC& aModuleName, TDes& aNewModuleName)
-    {
-    //Copy module name to destination buffer
-    aNewModuleName.Copy(aModuleName);
-    
-    //Search for @ char (it means that some index has been appended)
-    TInt index = aNewModuleName.Find(_L("@"));
-    
-    //Remove index form name (if found)
-    if(index != KErrNotFound)
-        {
-        aNewModuleName.Delete(index, aNewModuleName.Length() - index);
-        }
-    }
-
-// End of File