stif/StifTFwIf/src/UIEngine.cpp
branchRCL_3
changeset 59 8ad140f3dd41
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stif/StifTFwIf/src/UIEngine.cpp	Wed Oct 13 16:17:58 2010 +0300
@@ -0,0 +1,1310 @@
+/*
+* 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: CUIEngine: This object executes test cases from 
+* STIF Test Framework.
+* 
+*/
+
+// INCLUDE FILES
+#include <e32base.h>
+#include <e32svr.h>
+#include <collate.h>
+#include "UIEngineEvent.h"
+#include <stifinternal/UIEngineContainer.h>
+#include "UIEngineError.h"
+#include <stifinternal/UIEngine.h>
+#include "Logging.h"
+
+// EXTERNAL DATA STRUCTURES
+// None
+
+// EXTERNAL FUNCTION PROTOTYPES
+// None
+
+// CONSTANTS
+_LIT( KUIEngine, "CUIEngine" );
+
+// MACROS
+#ifdef LOGGER
+#undef LOGGER
+#endif
+#define LOGGER iLogger
+
+// LOCAL CONSTANTS AND MACROS
+// None
+
+// MODULE DATA STRUCTURES
+// None
+
+// LOCAL FUNCTION PROTOTYPES
+// None
+
+// FORWARD DECLARATIONS
+// None
+
+// ==================== LOCAL FUNCTIONS ======================================= 
+
+// ================= MEMBER FUNCTIONS =========================================
+
+/*
+-------------------------------------------------------------------------------
+
+    Class: CUIEngine
+
+    Method: CUIEngine
+
+    Description: Default constructor
+
+    C++ default constructor can NOT contain any code, that
+    might leave.
+    
+    Parameters: None
+    
+    Return Values: None
+
+    Errors/Exceptions: None
+
+    Status: Draft
+
+-------------------------------------------------------------------------------
+*/
+CUIEngine::CUIEngine( CUIIf* aUi  ):
+    iUi( aUi )
+    {
+
+    __RDEBUG( _L( "CUIEngine::CUIEngine()" ) );
+    
+    }
+
+/*
+-------------------------------------------------------------------------------
+
+    Class: CUIEngine
+
+    Method: ConstructL
+
+    Description: Symbian OS second phase constructor
+
+    Symbian OS default constructor can leave.
+
+    Parameters: None
+
+    Return Values: None
+
+    Errors/Exceptions: Leaves if called Open method returns error
+
+    Status: Draft
+
+-------------------------------------------------------------------------------
+*/
+void CUIEngine::ConstructL()
+    {
+    // Logger's setting definitions
+    TLoggerSettings loggerSettings;
+    loggerSettings.iCreateLogDirectories = EFalse;
+    loggerSettings.iOverwrite = ETrue;
+    loggerSettings.iTimeStamp = ETrue;
+    loggerSettings.iLineBreak = ETrue;
+    loggerSettings.iEventRanking = EFalse;
+    loggerSettings.iThreadId = EFalse;
+    loggerSettings.iHardwareFormat = CStifLogger::ETxt;
+    loggerSettings.iHardwareOutput = CStifLogger::EFile;
+    loggerSettings.iEmulatorFormat = CStifLogger::ETxt;
+    loggerSettings.iEmulatorOutput = CStifLogger::EFile;
+    loggerSettings.iUnicode = EFalse;
+    loggerSettings.iAddTestCaseTitle = EFalse;
+
+    // Create Logger, Note: Use protected NewL because initialization file not
+    // readed yet.
+    iLogger = CStifLogger::NewL( KUiLogDir, KUiLogFile, loggerSettings );
+    
+    // Initialize logger    
+    iUi->InitializeLogger( iLogger );
+
+    }
+
+
+/*
+-------------------------------------------------------------------------------
+
+    Class: CUIEngine
+
+    Method: NewL
+
+    Description: Two-phased constructor.
+    
+    Parameters: None
+    
+    Return Values: CUIEngine* : Pointer to created UI engine object
+
+    Errors/Exceptions: Leaves if memory allocation for CUIEngine fails
+                       Leaves if ConstructL leaves
+
+    Status: Draft
+
+-------------------------------------------------------------------------------
+*/
+CUIEngine* CUIEngine::NewL( CUIIf* aUi )
+    {
+    
+    CUIEngine* self =  
+        new ( ELeave ) CUIEngine( aUi );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop();
+    return self;
+    
+    }
+
+
+
+/*
+-------------------------------------------------------------------------------
+
+    Class: CUIEngine
+
+    Method: ~CUIEngine
+
+    Description: Destructor
+    
+    Parameters: None
+
+    Return Values: None
+
+    Errors/Exceptions: None
+
+    Status: Draft
+
+-------------------------------------------------------------------------------
+*/
+CUIEngine::~CUIEngine()
+    {
+    
+    __RDEBUG( _L( "CUIEngine::~CUIEngine()" ) );
+    
+    // Delete all containers, cannot use ResetAndDestroy,
+    // because destructor is private
+    TInt count = iContainerArray.Count();
+    for( TInt i=0; i< count; i++ )
+        {
+        delete iContainerArray[i];
+        }
+    iContainerArray.Reset();    
+    iContainerArray.Close();
+
+    delete iLogger;
+    iLogger = NULL;
+    
+    delete iError;
+    iError = 0;
+        
+    }
+
+
+/*
+-------------------------------------------------------------------------------
+
+    Class: VUIEngine
+
+    Method: Open
+
+    Description: Open test engine.
+
+    Parameters: TDesC& aTestFrameworkIni: in: Initialization file to Test Framework
+
+    Return Values: Symbian OS error: Error code
+
+    Errors/Exceptions: None
+
+    Status: Draft
+
+-------------------------------------------------------------------------------
+*/
+TInt CUIEngine::Open( const TDesC& aTestFrameworkIni )
+    {
+    
+    if( ( iTestEngine.SubSessionHandle() != 0 ) ||
+        ( iTestEngineServ.Handle() != 0 ) )
+        {
+        __TRACE( KError, ( CStifLogger::EError, _L( "CUIEngine::Open() Already open" ) ) );
+        return KErrInUse;     
+        }
+
+    // Check aTestFrameworkIni max length
+    if( aTestFrameworkIni.Length() > KMaxFileName )
+        {
+        __TRACE( KPrint, ( CStifLogger::EError, _L( "CUIEngine::Open() method's parameter length is incorrect" ) ) );
+        return KErrArgument;        
+        }
+
+    // Create Test Engine
+    TInt ret = iTestEngineServ.Connect();
+
+    if ( ret != KErrNone )
+        {
+        __TRACE( KPrint, ( _L( "CUIEngine::Open. Engine server open failed: ret = %d"), ret ) );
+
+        return ret;
+        }
+
+    ret = iTestEngine.Open( iTestEngineServ, aTestFrameworkIni );
+
+    if ( ret != KErrNone )
+        {
+        __TRACE( KPrint, ( _L( "CUIEngine::Open. Engine. Open failed: ret = %d"), ret ) );
+
+        return ret;
+        }
+
+    TErrorNotification error;
+    if( ErrorPrint( error ) != KErrNotSupported )
+        {
+        // Start printer
+        iError = CUIEngineErrorPrinter::NewL( this );
+        iError->StartL( iTestEngine );
+        }
+
+    return ret;
+    }
+
+
+/*
+-------------------------------------------------------------------------------
+
+    Class: CUIEngine
+
+    Method: Close
+
+    Description: Close test engine.
+
+    Parameters: None
+
+    Return Values: TInt KErrNone: Always returned KErrNone
+
+    Errors/Exceptions: None
+
+    Status: Draft
+
+-------------------------------------------------------------------------------
+*/
+TInt CUIEngine::Close()
+    {
+    
+    delete iError;
+    iError = 0;
+    
+    // Delete all containers, cannot use ResetAndDestroy,
+    // because destructor is private
+    TInt count = iContainerArray.Count();
+    for( TInt i=0; i< count; i++ )
+        {
+        delete iContainerArray[i];
+		iContainerArray[i] = NULL;
+        }
+    iContainerArray.Reset();
+    
+    iTestEngine.Close();
+    iTestEngineServ.Close();
+
+    __TRACE( KPrint, ( _L( "CUIEngine::Close." ) ) );
+
+    return KErrNone;
+    }
+
+/*
+-------------------------------------------------------------------------------
+
+    Class: CUIEngine
+
+    Method: AddTestModule
+
+    Description: Add test module to module list of test engine
+
+    Parameters: TDesC& aModuleName: in: Testmodule, which is added to module list
+                TDesC& aIniFile: in: Initialization file to the test module
+
+    Return Values: Symbian OS error: Error code
+
+    Errors/Exceptions: None
+
+    Status: Draft
+
+-------------------------------------------------------------------------------
+*/
+TInt CUIEngine::AddTestModule( const TDesC& aModuleName, 
+                               const TDesC& aIniFile )
+    {
+    // Check aModuleName max length
+    if( aModuleName.Length() > KMaxName )
+        {
+        __TRACE( KPrint, ( CStifLogger::EError, _L( "CUIEngine::AddTestModule() method's first parameter length is incorrect" ) ) );
+        return KErrArgument;        
+        }
+    // Check aIniFile max length
+    if( aIniFile.Length() > KMaxFileName )
+        {
+        __TRACE( KPrint, ( CStifLogger::EError, _L( "CUIEngine::AddTestModule() method's second parameter length is incorrect" ) ) );
+        return KErrArgument;        
+        }    
+
+
+    TInt ret = iTestEngine.AddTestModule( aModuleName, aIniFile );
+
+    if ( ret != KErrNone && ret != KErrAlreadyExists )
+        {
+		__TRACE( KPrint, ( _L( "CUIEngine::AddTestModule. Add module failed: ret = %d" ), ret  ) );
+
+        return ret;
+        }
+
+    return KErrNone;
+    
+    }
+
+
+/*
+-------------------------------------------------------------------------------
+
+    Class: CUIEngine
+
+    Method: RemoveTestModule
+
+    Description: Remove test module from test engine
+
+    Parameters: TDesC& aModuleName: in: Testmodule, which is removed of module list
+
+    Return Values: Symbian OS error: Error code
+
+    Errors/Exceptions: None
+
+    Status: Draft
+
+-------------------------------------------------------------------------------
+*/
+TInt CUIEngine::RemoveTestModule( const TDesC& aModuleName )
+    {
+    // Remove test module of module list of test engine
+    TInt ret = iTestEngine.RemoveTestModule( aModuleName );
+
+    if ( ret != KErrNone )
+        {
+        __TRACE( KPrint, ( _L( "CUIEngine::RemoveTestModule. Remove module failed: ret = %d"), ret  ) );
+
+        return ret;
+        }
+
+    return ret;
+    }
+
+
+/*
+-------------------------------------------------------------------------------
+
+    Class: CUIEngine
+
+    Method: AddTestCaseFile
+
+    Description: Add test case file to test case file list of test engine
+
+    Parameters: TDesC& aModuleName: in: Testmodule, which own test cases of test case list.
+                TDesC& aCaseFile: in: Test case list, which is added to test case list
+
+    Return Values: Symbian OS error: Error code
+
+    Errors/Exceptions: None
+
+    Status: Draft
+
+-------------------------------------------------------------------------------
+*/
+TInt CUIEngine::AddTestCaseFile( const TDesC& aModuleName, 
+                                 const TDesC& aCaseFile )
+    {
+    // Check aModuleName max length
+    if( aModuleName.Length() > KMaxName )
+        {
+        __TRACE( KPrint, ( CStifLogger::EError, _L( "CUIEngine::AddTestCaseFile() method's first parameter length is incorrect" ) ) );
+        return KErrArgument;        
+        }
+    // Check aCaseFile max length
+    if( aCaseFile.Length() > KMaxFileName )
+        {
+        __TRACE( KPrint, ( CStifLogger::EError, _L( "CUIEngine::AddTestCaseFile() method's second parameter length is incorrect" ) ) );
+        return KErrArgument;        
+        }
+    
+    TInt ret( KErrNone );
+
+    // Add given test case file to test module
+    if ( aCaseFile.Length() == 0 )
+        {
+        ret = KErrArgument;
+        __TRACE( KPrint, (  _L( "CUIEngine::AddTestCaseFile. Test case file not defined: ret = %d"), ret  ) );
+        }
+    else
+        {
+        // Add test case file to test case file list of test engine 
+        ret = iTestEngine.AddConfigFile( aModuleName, aCaseFile );
+
+        if ( ret != KErrNone && ret != KErrAlreadyExists )
+            {
+            __TRACE( KPrint, ( _L( "CUIEngine::AddTestCaseFile. Add test case file failed: ret = %d"), ret  ) );
+            }
+        }
+
+    return ret;
+    }
+
+
+/*
+-------------------------------------------------------------------------------
+
+    Class: CUIEngine
+
+    Method: RemoveTestCaseFile
+
+    Description: Remove test case file of test case file list of test engine
+
+    Parameters: TDesC& aModuleName: in: Testmodule, which own test cases of test case list
+                TDesC& aCaseFile: in: Test case list, which is removed of test case list
+
+    Return Values: Symbian OS error: Error code
+
+    Errors/Exceptions: None
+
+    Status: Draft
+
+-------------------------------------------------------------------------------
+*/
+TInt CUIEngine::RemoveTestCaseFile( const TDesC& aModuleName, 
+                                    const TDesC& aCaseFile )
+    {   
+    
+    TInt ret( KErrNone );
+
+    // Remove given test case file from test module
+    if ( aCaseFile.Length() == 0 )
+        {
+        ret = KErrArgument;
+        __TRACE( KPrint, (  _L( "CUIEngine::RemoveTestCaseFile. Test case file not defined: ret = %d"), ret  ) );
+        }
+    else
+        {
+        // Remove test case file  
+        ret = iTestEngine.RemoveConfigFile( aModuleName, aCaseFile );
+
+        if ( ret != KErrNone )
+            {
+            __TRACE( KPrint, ( _L( "CUIEngine::RemoveTestCaseFile. Remove test case file failed: ret = %d"), ret  ) );
+            }
+        }
+
+    return ret;
+
+    }
+
+
+/*
+-------------------------------------------------------------------------------
+
+    Class: CUIEngine
+
+    Method: GetTestCases
+
+    Description: Get test cases of enumerated list of test engine. Method is copied 
+                 list of test cases to aTestCaseInfo. Copied tests are test cases 
+                 of test module (aTestModule) and defined
+                 in test case file (aTestCaseFile), which are given as argument
+
+                 Method copied all enumerated test cases if aTestModule
+                 and aTestCaseFile are not defined
+    
+    Parameters: RPointerArray<CTestInfo>& aTestCaseInfo: inout: List of test cases
+                TDesC& aModuleName: in: Testmodule, which own test cases of test case list
+                TDesC& aTestCaseFile: in: Test case list, which is got of test case list
+
+    Return Values: Symbian OS error: Error code
+
+    Errors/Exceptions: None
+
+    Status: Draft
+
+-------------------------------------------------------------------------------
+*/
+TInt CUIEngine::GetTestCasesL( RPointerArray<CTestInfo>& aTestCaseInfo,
+                               const TDesC& aTestModule, 
+                               const TDesC& aTestCaseFile )
+    { 
+	__TRACE( KPrint, (  _L( "GetTestCasesL()") ) );
+
+    TInt ret(KErrNone);
+    TInt count(0);
+
+    // Enumerate test cases
+    TCaseCount caseCount;
+
+    TRequestStatus status;
+    iTestEngine.EnumerateTestCases( caseCount, status );
+    User::WaitForRequest( status );
+    ret = status.Int();
+
+    // Check that enumerate succeeded
+    if ( ret != KErrNone )
+        {
+        __TRACE( KPrint, (  _L( "CUIEngine::GetTestCases. Test case enumerate failed: ret = %d"), ret ) );
+        TErrorNotification error;
+        error.iText = _L("Can't get test cases");
+        iUi->ErrorPrint ( error );  
+        return ret;
+        }
+
+    CFixedFlatArray<TTestInfo>* testCases = NULL;
+
+    // Create test cases to buffer
+    TRAPD( err, testCases = CFixedFlatArray<TTestInfo>::NewL( caseCount() ) );
+    if( err != KErrNone )
+        {        
+        if( err == KErrNoMemory )
+            {
+            _LIT( KNotEnoughHeapMemory, 
+                "Not enough heap memory available. Either reduce the test case count or increase UI's heap size in mmp file using EPOCHEAPSIZE.");
+            RDebug::Print( KNotEnoughHeapMemory );
+        	__TRACE( KError, ( KNotEnoughHeapMemory ) );        
+        	}
+        else
+           {
+            _LIT( KGeneralError,
+                "CUIEngine::GetTestCasesL: CFixedFlatArray<TTestInfo>::NewL fails with value: %d");
+            RDebug::Print( KGeneralError, err );
+        	__TRACE( KError, ( KGeneralError, err ) );                   
+           }        	
+        User::Leave( err );
+        }    
+            
+    CleanupStack::PushL( testCases );
+
+    // Get test cases from Engine.
+    ret = iTestEngine.GetTestCases( *testCases );
+
+    if ( ret != KErrNone )
+        {
+        __TRACE( KPrint, (  _L( "CUIEngine::GetTestCases. Get test cases failed: ret = %d"), ret ) );
+
+        CleanupStack::PopAndDestroy( testCases );
+        return ret;
+        }
+
+    // count of test cases.
+    count = caseCount();
+
+    __TRACE( KPrint, (  _L( "Test case count: %d"), count ) );
+    
+    HBufC* moduleNameBuf = aTestModule.AllocLC();
+    TPtr moduleName( moduleNameBuf->Des() );
+    TCollationMethod method = 
+        *Mem::CollationMethodByIndex(0); // get the standard method
+    method.iFlags |= TCollationMethod::EFoldCase; // ignore case
+
+    moduleName.LowerCase();
+
+    // Remove optional '.DLL' from test module file name
+    TParse parse;
+    parse.Set( moduleName, NULL, NULL );
+    
+    if( !parse.Ext().CompareC(  _L(".dll"), 3, &method ) )
+        {
+        const TInt len = parse.Ext().Length();
+        moduleName.Delete ( moduleName.Length()-len, len );
+        }
+        
+    TBool found = EFalse;
+    // Update iTestCaseTable.
+    for (TInt j=0;j<count;j++, found = EFalse)
+        {
+        // Check, if module defined.
+        if ( aTestModule.Length() > 0 )
+            {
+            // Check, if test case defined.
+            if ( aTestCaseFile.Length() > 0)
+                {
+                if( moduleName == KTestScripterName )
+                    {
+                    if( !( *testCases )[j].iConfig.CompareC( aTestCaseFile, 3, &method ) )
+                        {
+                        found = ETrue;
+                        }
+                    }
+                if( !( *testCases )[j].iModuleName.CompareC( moduleName, 3, &method )
+                    && !( *testCases )[j].iConfig.CompareC( aTestCaseFile, 3, &method ) )
+                    {
+                    found = ETrue;
+                    }
+                }
+            else
+                {
+                if( moduleName == KTestScripterName )
+                    {
+                    // Test Module is TestScripter
+                    if( ( *testCases )[j].iModuleName.Find( KTestScripterName ) != KErrNotFound )
+                        {
+                        // iModuleName name is in 'testscripter_testcasefile'
+                        // format => Find()
+                        found = ETrue;
+                        }
+                    }
+                if( !( *testCases )[j].iModuleName.CompareC( 
+                                            moduleName, 3, &method ) )
+                    {
+                    found = ETrue;
+                    }
+                }
+            }
+        else
+            {
+            found = ETrue;
+            }
+        
+        if( found )
+            {
+            // Create tmpTestInfo.
+            CTestInfo *tmpTestInfo = CTestInfo::NewL();
+             
+            CleanupStack::PushL( tmpTestInfo );            
+
+            // Copy TTestInfo to CTestInfo.
+            tmpTestInfo->SetModuleName( ( *testCases )[j].iModuleName );
+            tmpTestInfo->SetTestCaseTitle( ( *testCases )[j].iTestCaseInfo.iTitle );
+            tmpTestInfo->SetTestCaseNumber( ( *testCases )[j].iTestCaseInfo.iCaseNumber );
+            tmpTestInfo->SetPriority( ( *testCases )[j].iTestCaseInfo.iPriority );
+            tmpTestInfo->SetTimeout( ( *testCases )[j].iTestCaseInfo.iTimeout );
+            tmpTestInfo->SetTestCaseFile( ( *testCases )[j].iConfig );
+            ret = aTestCaseInfo.Append(tmpTestInfo);
+            if( ret != KErrNone )
+                {
+                CleanupStack::PopAndDestroy( tmpTestInfo );
+                }
+            else
+                {
+                CleanupStack::Pop( tmpTestInfo );
+                }
+            }
+        }
+    
+    CleanupStack::PopAndDestroy( moduleNameBuf );
+
+    CleanupStack::PopAndDestroy( testCases );
+
+    return ret;
+    }
+
+
+/*
+-------------------------------------------------------------------------------
+
+    Class: CUIEngine
+
+    Method: StartTestCase
+
+    Description: Start test case execution.
+
+    Parameters: TInt& aTestId: in: ID for test case. Test ID given of address of
+                current UIEngineContainer.
+
+                const CTestInfo& aTestInfo: in: Test case information
+
+    Return Values: Symbian OS error: Error code
+
+    Errors/Exceptions: None
+
+    Status: Draft
+
+-------------------------------------------------------------------------------
+*/
+TInt CUIEngine::StartTestCase( CUIEngineContainer*& aContainer,
+                              const CTestInfo& aTestInfo )
+    {
+    TInt ret( KErrNone );
+
+    // Copy CTestInfo to TTestInfo.
+    TTestInfo testCase; 
+    testCase.iModuleName = aTestInfo.ModuleName();
+    testCase.iTestCaseInfo.iTitle = aTestInfo.TestCaseTitle();
+    testCase.iTestCaseInfo.iCaseNumber = aTestInfo.TestCaseNum();
+    testCase.iTestCaseInfo.iPriority = aTestInfo.Priority();
+    testCase.iTestCaseInfo.iTimeout = aTestInfo.Timeout();
+    testCase.iConfig = aTestInfo.TestCaseFile();
+
+    CUIEngineContainer* container = NULL;
+    TRAP( ret,
+        // Create container.
+        container = 
+            CUIEngineContainer::NewL( this, testCase, iTestEngineServ, iTestEngine );
+    );
+    if( ret != KErrNone )
+        {
+        return ret;
+        }
+    
+    ret = iContainerArray.Append( container );
+    if( ret != KErrNone )
+        {
+        __TRACE( KError, ( CStifLogger::EError, 
+            _L( "CUIEngine::StartTestCase() Append failed, cannot start test case" ) ) );
+        delete container;
+        return ret;
+        }
+        
+    // Call Container to starting test case execution.
+    TRAPD( trapError,
+    // Call Container to starting test case execution.
+    ret = container->StartContainerL();
+    );
+
+    if(trapError != KErrNone)
+        {
+        __TRACE( KPrint, (  _L( "CUIEngine::StartTestCase. Test case starting failed: trapError = %d"), ret ) );
+        delete container;
+        return trapError;
+        }
+        
+    aContainer = container;
+
+    return ret;
+    
+    }
+    
+/*
+-------------------------------------------------------------------------------
+
+    Class: CUIEngine
+
+    Method: AbortStartedTestCase
+
+    Description: Abort started test case execution.
+
+    Parameters: CUIEngineContainer* aContainer: in: Container running testcase
+
+    Return Values: Symbian OS error: Error code
+
+    Errors/Exceptions: Panics if test case is not found or is already executed
+
+    Status: Draft
+
+-------------------------------------------------------------------------------
+*/
+void CUIEngine::AbortStartedTestCase( CUIEngineContainer* aContainer )
+    {
+    
+    // Locate container from array
+    TInt index = iContainerArray.Find( aContainer );
+    
+    if( ( index < 0) ||
+        ( aContainer->State() == CUIEngineContainer::EExecuted ) )
+        {
+        __TRACE( KError, ( CStifLogger::EError, 
+            _L( "CUIEngine::AbortStartedTestCase() Testcase executed" ) ) );
+        User::Panic( KUIEngine, KErrAccessDenied );
+        }
+        
+    // Remove and delete container
+    iContainerArray.Remove( index );
+    delete aContainer;
+    
+    }
+
+    
+/*
+-------------------------------------------------------------------------------
+
+    Class: CUIEngine
+
+    Method: TestExecuted
+
+    Description: 
+
+    Parameters: CUIEngineContainer* aUIEngineContainer: Address of current
+                CUIEngineContainer is test case ID.
+
+                TFullTestResult& aFullTestResult: in: Test result of executed test case
+
+    Return Values: TInt KErrNone: Always returned KErrNone
+
+    Errors/Exceptions: None
+
+    Status: Draft
+
+-------------------------------------------------------------------------------
+*/
+void CUIEngine::TestExecuted( CUIEngineContainer* aContainer, 
+                               TFullTestResult& aFullTestResult )
+    {
+     // Locate container from array
+    TInt index = iContainerArray.Find( aContainer );
+    
+    if( index < 0 )
+        {
+        __TRACE( KError, ( CStifLogger::EError, 
+            _L( "CUIEngine::TestExecuted() Testcase not found" ) ) );
+        User::Panic( KUIEngine, KErrNotFound );
+        }
+    
+    iUi->TestExecuted( aContainer, aFullTestResult );
+    
+    // Remove and delete container.
+    // It is safe to do here,
+    // because container and runner does not have any code after
+    // this function returns.
+    iContainerArray.Remove( index );
+    delete aContainer;
+   
+    }
+
+
+/*
+-------------------------------------------------------------------------------
+
+    Class: CUIEngine
+
+    Method: PrintProg
+
+    Description: 
+
+    Parameters: CUIEngineContainer* aContainer: in: Address of current
+                CUIEngineContainer is test case ID
+
+                TTestProgress& aProgress: in: Progress information from test case
+
+    Return Values: SymbianOS error code
+
+    Errors/Exceptions: None
+
+    Status: Draft
+
+-------------------------------------------------------------------------------
+*/
+TInt CUIEngine::PrintProg( CUIEngineContainer* aContainer, 
+                          TTestProgress& aProgress )
+    {
+
+    return iUi->PrintProg( aContainer, aProgress );
+        
+    }
+
+/*
+-------------------------------------------------------------------------------
+
+    Class: CUIEngine
+
+    Method: ErrorPrint
+
+    Description: 
+
+    Parameters: TErrorNotification& aError: in: Error information from framework
+
+    Return Values: SymbianOS error code
+
+    Errors/Exceptions: None
+
+    Status: Draft
+
+-------------------------------------------------------------------------------
+*/
+TInt CUIEngine::ErrorPrint( TErrorNotification& aError )
+    {
+
+    return iUi->ErrorPrint( aError );
+        
+    }
+   
+/*
+-------------------------------------------------------------------------------
+
+    Class: CUIEngine
+
+    Method: RemoteMsg
+
+    Description: Forward Ats send.
+
+    Parameters: const TDesC& aMessage: in: message
+    
+    Return Values: SymbianOS error code
+
+    Errors/Exceptions: None
+
+    Status: Draft
+
+-------------------------------------------------------------------------------
+*/
+TInt CUIEngine::RemoteMsg( CUIEngineContainer* aContainer, 
+                           const TDesC& aMessage )
+    {
+
+    return iUi->RemoteMsg( aContainer, aMessage );
+        
+    }
+
+/*
+-------------------------------------------------------------------------------
+
+    Class: CUIEngine
+
+    Method: GoingToReboot
+
+    Description: Forward reboot indication.
+
+    Parameters: None
+    
+    Return Values: SymbianOS error code
+
+    Errors/Exceptions: None
+
+    Status: Draft
+
+-------------------------------------------------------------------------------
+*/
+TInt CUIEngine::GoingToReboot( CUIEngineContainer* aContainer,
+                               TRequestStatus& aStatus )
+    {
+
+    return iUi->GoingToReboot( aContainer, aStatus );
+        
+    }
+
+
+/*
+-------------------------------------------------------------------------------
+
+    DESCRIPTION
+
+    CTestInfo: This object contains test case information.
+
+-------------------------------------------------------------------------------
+*/
+
+// ================= MEMBER FUNCTIONS =========================================
+
+
+/*
+-------------------------------------------------------------------------------
+
+    Class: CTestInfo
+
+    Method: NewL
+
+    Description:
+
+    Parameters: None
+
+    Return Values: None
+
+    Errors/Exceptions: None
+
+    Status: Draft
+
+-------------------------------------------------------------------------------
+*/
+EXPORT_C CTestInfo* CTestInfo::NewL()
+    {
+    
+    //RDebug::Print(_L("CTestInfo::NewL()"));
+    CTestInfo* self =  
+        new ( ELeave ) CTestInfo();
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop();
+    return self;
+    
+    }
+
+/*
+-------------------------------------------------------------------------------
+
+    Class: CTestInfo
+
+    Method: CTestInfo
+
+    Description: Default constructor
+
+    C++ default constructor can NOT contain any code, that
+    might leave.
+    
+    Parameters: None
+    
+    Return Values: None
+
+    Errors/Exceptions: None
+
+    Status: Draft
+
+-------------------------------------------------------------------------------
+*/
+CTestInfo::CTestInfo()
+    {
+    }
+
+/*
+-------------------------------------------------------------------------------
+
+    Class: CTestInfo
+
+    Method: ConstructL
+
+    Description: Symbian OS second phase constructor
+
+    Symbian OS default constructor can leave.
+
+    Parameters: None
+
+    Return Values: None
+
+    Errors/Exceptions: Leaves if called Open method returns error
+
+    Status: Draft
+
+-------------------------------------------------------------------------------
+*/
+void CTestInfo::ConstructL()
+    {   
+    }
+    
+/*
+-------------------------------------------------------------------------------
+
+    Class: CTestInfo
+
+    Method: ~CTestInfo
+
+    Description: Destructor
+    
+    Parameters: None
+
+    Return Values: None
+
+    Errors/Exceptions: None
+
+    Status: Draft
+
+-------------------------------------------------------------------------------
+*/
+CTestInfo::~CTestInfo()
+    {
+    
+    delete iModuleNameBuf;
+    delete iTitleBuf;
+    delete iTestCaseFileBuf;
+    iModuleNameBuf = 0;
+    iTitleBuf = 0;
+    iTestCaseFileBuf = 0;
+    
+    }
+
+/*
+-------------------------------------------------------------------------------
+
+    Class: CTestInfo
+
+    Method: SetModuleName
+
+    Description: Set module name.
+    
+    Parameters: None
+
+    Return Values: Symbian OS error code
+
+    Errors/Exceptions: None
+
+    Status: Draft
+
+-------------------------------------------------------------------------------
+*/
+TInt CTestInfo::SetModuleName ( const TDesC& aModuleName ) 
+    {
+    
+    iModuleName.Set(0,0); 
+    delete iModuleNameBuf;
+
+    if( aModuleName.Length() < KTestScripterNameLength )
+		{
+		iModuleNameBuf = aModuleName.Alloc();
+		}
+    else
+        {
+        // Check is TestScripter
+	    TPtrC check( aModuleName.Mid( 0, KTestScripterNameLength ) );
+	    TInt ret = check.Compare( KTestScripterName );
+	    if( ret == KErrNone )
+		    {
+            iModuleNameBuf = ( aModuleName.Mid( 0, KTestScripterNameLength ) ).Alloc();
+		    }
+	    else
+		    {
+		    iModuleNameBuf = aModuleName.Alloc();
+		    }
+        }
+
+    if( iModuleNameBuf == NULL )
+        {
+        return KErrNoMemory;
+        }
+    
+    iModuleName.Set( iModuleNameBuf->Des() ); 
+    
+    return KErrNone;
+    
+    }
+    
+/*
+-------------------------------------------------------------------------------
+
+    Class: CTestInfo
+
+    Method: SetTestCaseTitle
+
+    Description: Set module name.
+    
+    Parameters: None
+
+    Return Values: Symbian OS error code
+
+    Errors/Exceptions: None
+
+    Status: Draft
+
+-------------------------------------------------------------------------------
+*/
+TInt CTestInfo::SetTestCaseTitle ( const TDesC& aTitle )
+    { 
+    
+    iTitle.Set(0,0); 
+    delete iTitleBuf;
+    iTitleBuf = aTitle.Alloc();
+    if( iTitleBuf == NULL )
+        {
+        return KErrNoMemory;
+        }
+    
+    iTitle.Set( iTitleBuf->Des() ); 
+    
+    return KErrNone;
+    
+    };
+    
+/*
+-------------------------------------------------------------------------------
+
+    Class: CTestInfo
+
+    Method: SetTestCaseFile
+
+    Description: Set test case file name.
+    
+    Parameters: None
+
+    Return Values: Symbian OS error code
+
+    Errors/Exceptions: None
+
+    Status: Draft
+
+-------------------------------------------------------------------------------
+*/
+TInt CTestInfo::SetTestCaseFile ( const TDesC& aTestCaseFile )
+    { 
+    iTestCaseFile.Set(0,0); 
+    delete iTestCaseFileBuf;
+    iTestCaseFileBuf = aTestCaseFile.Alloc();
+    if( iTestCaseFileBuf == NULL )
+        {
+        return KErrNoMemory;
+        }
+    
+    iTestCaseFile.Set( iTestCaseFileBuf->Des() );
+    
+    return KErrNone;
+     
+    };
+
+
+/*
+-------------------------------------------------------------------------------
+
+    Class: CTestInfo
+
+    Method: CopyL
+
+    Description: Copy existing CTestInfo.
+    
+    Parameters: None
+
+    Return Values: None
+
+    Errors/Exceptions: Leaves on error
+
+    Status: Draft
+
+-------------------------------------------------------------------------------
+*/
+void CTestInfo::CopyL( const CTestInfo& aTestInfo )
+    {
+
+    User::LeaveIfError( SetModuleName( aTestInfo.ModuleName() ));
+    User::LeaveIfError( SetTestCaseTitle( aTestInfo.TestCaseTitle() ));
+    User::LeaveIfError( SetTestCaseFile( aTestInfo.TestCaseFile() ));
+    
+    iCaseNumber = aTestInfo.TestCaseNum();
+    iPriority = aTestInfo.Priority();
+    iTimeout = aTestInfo.Timeout();
+    iExpectedResult = aTestInfo.ExpectedResult();
+    
+    }
+    
+/*
+-------------------------------------------------------------------------------
+
+    Class: CTestInfo
+
+    Method: SetTestCaseFile
+
+    Description: Set test case file name.
+    
+    Parameters: None
+
+    Return Values: Symbian OS error code
+
+    Errors/Exceptions: None
+
+    Status: Draft
+
+-------------------------------------------------------------------------------
+*/
+TBool CTestInfo::operator== ( const CTestInfo& aTestInfo ) const
+    {
+    
+    if( ( aTestInfo.ModuleName() == ModuleName() ) &&
+        ( aTestInfo.Priority() == Priority() ) &&
+        ( aTestInfo.TestCaseFile() == TestCaseFile() ) &&
+        ( aTestInfo.TestCaseNum() == TestCaseNum() ) &&
+        ( aTestInfo.Timeout() == Timeout() ) )
+        {
+        return ETrue;
+        }
+        
+             
+    return EFalse;
+    
+    }
+    
+// ================= OTHER EXPORTED FUNCTIONS ================================= 
+
+// End of File