adaptationlayer/tsy/simatktsy_dll/internal/test/simatktsy_testtool/simatk/src/simatkblocks.cpp
author <dalarub>
Fri, 06 Nov 2009 17:28:23 +0000
changeset 0 63b37f68c1ce
permissions -rw-r--r--
First Contribution. Vanilla as it came from Nokia

/*
* Copyright (c) 2002-2006 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of the License "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:   Specific class for SIM ATK TSY tests
*
*/




// INCLUDE FILES
#include <stifparser.h>
#include "simatk.h"
#include "saticon.h"
#include "saterrors.h"

#include "commandgetinkey.h"
#include "commanddisplaytext.h"
#include "commandgetinput.h"
#include "commandsendss.h"
#include "commandsendsm.h"
#include "commandsetupcall.h"
#include "commandplaytone.h"
#include "commandsetupmenu.h"
#include "commandselectitem.h"
#include "satcallcontrol.h"
#include "satmosmscontrol.h"
#include "commandrefresh.h"
#include "commandsendussd.h"
#include "commandlocalinfo.h"
#include "commandsetupeventlist.h"
#include "commandsetupidlemodetext.h"
#include "commandopenchannel.h"
#include "commandsenddata.h"
#include "commandlaunchbrowser.h"
#include "commandsenddtmf.h"
#include "commandlanguagenotification.h"
#include "commandclosechannel.h"
#include "commandreceivedata.h"
#include "commandgetchannelstatus.h"


// CONSTANTS
_LIT( KCommandType, "CommandType" );

// Commands can omit SessionEnd procedure from script by setting this flag to 0
_LIT( KSessionEnd, "SessionEnd" );


// -----------------------------------------------------------------------------
// CSimAtk::Delete
// Delete here all resources allocated and opened from test methods. 
// Called from destructor. 
// -----------------------------------------------------------------------------
//
void CSimAtk::Delete() 
    {
    iCoreLog->Log( _L( "CSimAtk::Delete" ) );    
    // No implementation required
    }
    
// -----------------------------------------------------------------------------
// CSimAtk::RunMethodL
// Run specified method. Contains also table of test methods and their names.
// -----------------------------------------------------------------------------
//
TInt CSimAtk::RunMethodL
        ( 
        CStifItemParser& aItem
        )
    {
    iCoreLog->Log( _L( "CSimAtk::RunMethodL" ) ); 
    
    // Store parser
    if ( !iParser )   
        {
        iParser = &aItem;
        }
   
    static TStifFunctionInfo const KFunctions[] =
        {  
        // Copy this line for every implemented function.
        // First string is the function name used in TestScripter script file.
        // Second is the actual implementation member function. 
    
        // Generic    
        ENTRY( "Open", CSimAtk::Open ),
        ENTRY( "Close", CSimAtk::Close ),
        ENTRY( "WaitForRequest", CSimAtk::WaitForRequest ),
        ENTRY( "Delay", CSimAtk::Delay ),
        // ISC Control
        ENTRY( "LoadIscTests", CSimAtk::LoadIscTests ),
        ENTRY( "RunIscTestCase", CSimAtk::RunIscTestCase ),
        ENTRY( "SyncIscTestCase", CSimAtk::SyncIscTestCase ),
        ENTRY( "CancelTestCase", CSimAtk::CancelTestCase ),

        ENTRY( "CheckData", CSimAtk::CheckData ),
        ENTRY( "CheckProactiveCommand", CSimAtk::CheckData ),
        ENTRY( "CheckIcon", CSimAtk::CheckIcon ),
        
        ENTRY( "SendResponse", CSimAtk::SendResponse ),
        ENTRY( "SendEnvelope", CSimAtk::SendResponse ),
        ENTRY( "SendTerminalResponse", CSimAtk::SendResponse )
        };

    const TInt count = sizeof( KFunctions ) / 
                        sizeof( TStifFunctionInfo );

    return RunInternalL( KFunctions, count, aItem );
    }
    
// -----------------------------------------------------------------------------
// CSimAtk::Open
// Open method function.
// -----------------------------------------------------------------------------
// 
TInt CSimAtk::Open
        (
        CStifItemParser& aItem
        )
	{
    iCoreLog->Log( _L( "CSimAtk::Open" ) );    
	   
    TInt ret( KErrNotFound );
	TPtrC string;
    aItem.GetString ( _L( "Open" ), string );    
    
    if ( _L( "SAT" ) == string )
        {
        ret = iSat.Open( iRphone );
        iCoreLog->Log( _L( "CSimAtk::Open: SAT, return %d" ), ret );
        }
    else if ( _L( "IscControl" ) == string )
        {
        ret = iRIscTestControl.Connect();
        iCoreLog->Log( _L( "CSimAtk::Open: IscControl, return %d" ), ret );
        }
    else if ( _L( "SmsMessaging" ) == string )
        {
        ret = iSmsMessaging.Open( iRphone );
        iCoreLog->Log( _L( "CSimAtk::Open: SmsMessaging, return %d" ), ret );
        }
    else
        {           
        // If any Open item not found in SimAtk,then checks Core.
    	CSimAtkCore::SetString( string );
    	ret = CSimAtkCore::Open( aItem );
        }
        
	return ret;	
    }
    
// -----------------------------------------------------------------------------
// CSimAtk::Close
// Close method function.
// -----------------------------------------------------------------------------
// 
TInt CSimAtk::Close
        (
        CStifItemParser& aItem
        )
	{    
    iCoreLog->Log( _L( "CSimAtk::Close" ) );    
    TInt ret( KErrNotFound );
	TPtrC string;
    aItem.GetString ( _L( "Close" ), string );
    
    if ( _L( "SAT" ) == string)
        {
        iSat.Close(); 
        ret = KErrNone;
        }
    else if ( _L( "IscControl" ) == string)
        {
        iRIscTestControl.Close();
        ret = KErrNone;
        }
    else if ( _L( "SmsMessaging" ) == string)
        {
        iSmsMessaging.Close();
        ret = KErrNone;
        }
    else
        {          
        // If any Close item not found in SimAtk, then checks Core.
    	CSimAtkCore::SetString( string );
    	ret = CSimAtkCore::Close( aItem );
        }
        
	return ret;	
    }

// -----------------------------------------------------------------------------
// CSimAtk::NotifySimAtkL
// Activates the notify
// (other items were commented in a header).
// -----------------------------------------------------------------------------       
//
TInt CSimAtk::NotifySimAtkL
        (
        TRequestStatus& aReqStatus,
        const TSatIpc& aNotifyIpc
        )
    {
    iCoreLog->Log( _L( "CSimAtk::NotifySimAtk" ) );    
    
    TInt ret( KErrNone );
    
    CSatBase* command = NULL;
    
    TPtrC notifyName( MapIpcToString( aNotifyIpc ) );    
    
    TInt index ( 0 );
    
    // Create test class only if it does not already exist
    if ( KErrNotFound == FindIndex ( aNotifyIpc, index ) )
        {
        switch ( aNotifyIpc )
            {
            case ESatNotifyDisplayTextPCmd:
        	    {
        	    command = new (ELeave) CCommandDisplayText( aNotifyIpc, iSat,
        	        *iParser, *iCoreLog );
        		break;     
                }
            case ESatNotifyGetInkeyPCmd:
                {
        	    command = new (ELeave) CCommandGetInkey( aNotifyIpc, iSat,
        	        *iParser, *iCoreLog );
                break;
                }
            case ESatNotifyGetInputPCmd:
                {
        	    command = new (ELeave) CCommandGetInput( aNotifyIpc, iSat,
        	        *iParser, *iCoreLog );           
                break;
                }
            case ESatNotifyPlayTonePCmd:
                {
                command = new (ELeave) CCommandPlayTone( aNotifyIpc, iSat,
                    *iParser, *iCoreLog );
                break;
                }
            case ESatNotifyRefreshPCmd:
                {
                command = new (ELeave) CCommandRefresh( aNotifyIpc, iSat,
                    *iParser, *iCoreLog );
                break;
                }
            case ESatNotifyRefreshRequiredParam:
                {
                command = new (ELeave) CCommandRefresh( aNotifyIpc, iSat,
                    *iParser, *iCoreLog );
                break;
                }
            case ESatNotifySendSsPCmd:
                {
                command = new (ELeave) CCommandSendSs( aNotifyIpc, iSat,
                    *iParser, *iCoreLog );
                
                // Set Cc pointer    
                CCommandSendUssd* ss 
                    = static_cast<CCommandSendUssd*> ( command );
                ss->SetCallControl( &iCallControl );
                break;
                }
            case ESatNotifySendSmPCmd:
                {
                command = new (ELeave) CCommandSendSm( aNotifyIpc, iSat,
                    *iParser, *iCoreLog );
                break;
                }
            case ESatNotifySetUpCallPCmd:
                {
                command = new (ELeave) CCommandSetUpCall( aNotifyIpc, iSat,
                    *iParser, *iCoreLog );
                
                // Set Cc pointer    
                CCommandSendUssd* call 
                    = static_cast<CCommandSendUssd*> ( command );
                call->SetCallControl( &iCallControl );
                break;
                }
            case ESatNotifySetUpMenuPCmd:
                {
                command = new (ELeave) CCommandSetUpMenu( aNotifyIpc, iSat,
                    *iParser, *iCoreLog );
                break;
                }
            case ESatNotifySelectItemPCmd:
                {
                command = new (ELeave) CCommandSelectItem( aNotifyIpc, iSat,
                    *iParser, *iCoreLog );
                break;
                }
            case ESatNotifySendUssdPCmd:
                {
                command = new (ELeave) CCommandSendUssd( aNotifyIpc, iSat,
                    *iParser, *iCoreLog );
                
                // Set Cc pointer    
                CCommandSendUssd* ussd 
                    = static_cast<CCommandSendUssd*> ( command );
                ussd->SetCallControl( &iCallControl );

                break;
                }
            case ESatNotifyLocalInfoPCmd:
                {
                command = new (ELeave) CCommandLocalInfo( aNotifyIpc, iSat,
                    *iParser, *iCoreLog );
                break;
                }
            case ESatNotifySetUpEventListPCmd:
                {
                command = new (ELeave) CCommandSetUpEventList( aNotifyIpc,
                    iSat, *iParser, *iCoreLog );
                break;
                }
            case ESatNotifySetUpIdleModeTextPCmd:
                {
                command = new (ELeave) CCommandSetUpIdleModeText( aNotifyIpc, 
                    iSat, *iParser, *iCoreLog );
                break;
                }
            case ESatNotifyOpenChannelPCmd:
                {
                command = new (ELeave) CCommandOpenChannel( aNotifyIpc, iSat,
                    *iParser, *iCoreLog );
                break;
                }
            case ESatNotifySendDataPCmd:
                {
                command = new (ELeave) CCommandSendData( aNotifyIpc, iSat,
                    *iParser, *iCoreLog );
                break;
                }
            case ESatNotifyLaunchBrowserPCmd:
                {
                command = new (ELeave) CCommandLaunchBrowser( aNotifyIpc, iSat,
                    *iParser, *iCoreLog );
                break;
                }
            case ESatNotifySendDtmfPCmd:
                {
                command = new (ELeave) CCommandSendDtmf( aNotifyIpc, iSat,
                    *iParser, *iCoreLog );
                break;
                }
            case ESatNotifyLanguageNotificationPCmd:
                {
                command = new (ELeave) CCommandLanguageNotification(
                    aNotifyIpc, iSat, *iParser, *iCoreLog );
                break;
                }
            case ESatNotifyCloseChannelPCmd:
                {
                command = new (ELeave) CCommandCloseChannel( aNotifyIpc, iSat,
                    *iParser, *iCoreLog );
                break;
                }
            case ESatNotifyReceiveDataPCmd:
                {
                command = new (ELeave) CCommandReceiveData( aNotifyIpc, iSat,
                    *iParser, *iCoreLog );
                break;
                }
            case ESatNotifyGetChannelStatusPCmd:
                {
                command = new (ELeave) CCommandGetChannelStatus( aNotifyIpc,
                iSat, *iParser, *iCoreLog );
                break;
                }
            case ESatNotifyCallControlRequest:
                {
                command = new (ELeave) CSatCallControl( aNotifyIpc, iSat,
                    *iParser, *iCoreLog );

                // Store pointer for SendSs/Ussd & Setup Call commands
                iCallControl = command;
                break;
                }
            case ESatNotifyMoSmControlRequest:
                {
                command = new (ELeave) CSatMoSmsControl( aNotifyIpc, iSat,
                    *iParser, *iCoreLog );
                break;
                }                
            case ESatNotifyProactiveSimSessionEnd:
                {
                // None. SimSessionEnd is notified automatically.
                break;
                }                
            default:
        		{
        		iCoreLog->Log( _L( "CSimAtk::NotifySimAtk  %S not supported! \
        		    Aborting..." ), &notifyName );
        		ret = KErrNotSupported;
        		CancelTestCase( ret );
        		break;
        		}
            }
            
        if ( KErrNone == ret )
            {
            // Put command to array
    	    iArray->AppendL( command );
            }
	    
        }
    else
        {
        // Reusing existing test class
        command = iArray->At( index );
        }
            
    
    // If command was created, notify SAT
    if ( NULL != command )
        {
        // Notify the SAT about command and SimSessionEnd
		iCoreLog->Log( _L( "CSimAtk::NotifySimAtk \
		    %S async method activated" ), &notifyName );

        command->NotifySat( aReqStatus );
        }

    return ret;
    }

// -----------------------------------------------------------------------------
// CSimAtk::NotifySimAtkCancel
// Cancels notifys
// (other items were commented in a header).
// -----------------------------------------------------------------------------       
//
TInt CSimAtk::NotifySimAtkCancel
        (
        const TSatIpc& aNotify
        )
    {
    iCoreLog->Log( _L( "CSimAtk::NotifySimAtkCancel" ) );
    
    TInt ret( KErrNone );
    TInt index ( 0 );
    
    ret = FindIndex( aNotify, index );
    
    if ( KErrNone == ret )
        {
        iArray->At( index )->CancelRequest();
        
        iArray->Delete( index );
        
        if ( ESatNotifyCallControlRequest == aNotify )
            {
            iCallControl = NULL;
            }
    	
    	iCoreLog->Log( _L( "CSimAtk::NotifySimAtkCancel \
    	    Async method cancelled" ) ); 
        }
    else
        {
    	iCoreLog->Log( _L( "CSimAtk::NotifySimAtkCancel \
    	    Cancellation requested but command not found! Aborting..." ) );

        CancelTestCase( ret );
        }
    
    return ret;
    }
   
// -----------------------------------------------------------------------------
// CSimAtk::LoadIscTests
// Connects to ISC test control and loads XML file
// (other items were commented in a header).
// -----------------------------------------------------------------------------       
//
TInt CSimAtk::LoadIscTests
        (
        CStifItemParser& aItem
        )
    {
    iCoreLog->Log( _L( "CSimAtk::LoadIscTests" ) );    

    TPtrC string;
    aItem.GetString ( _L( "LoadIscTests" ), string );    
    TInt ret( iRIscTestControl.LoadTestCases( string ) );   
 
    if ( KErrNone == ret )
        {
        iCoreLog->Log( _L( "CSimAtk::LoadIscTests:\
            %S loaded successfully." ), &string );
        }
    else
        {
        iCoreLog->Log( _L( "CSimAtk::LoadIscTests \
            Loading failed: %S " ), &string );
            
        TPtrC errorString = MapErrorCodeToString( ret );
        
        iCoreLog->Log( _L( "CSimAtk::LoadIscTests \
            %S" ), &errorString );
        }
    
    return ret;
    } 

// -----------------------------------------------------------------------------
// CSimAtk::RunIscTestCase
// Starts the test procedure
// (other items were commented in a header).
// -----------------------------------------------------------------------------       
//
TInt CSimAtk::RunIscTestCase
        (
        CStifItemParser& aItem
        )
    {
    iCoreLog->Log( _L( "CSimAtk::RunIscTestCase" ) );
    
    TInt ret( KErrNone );
    
    // XML file ID
    TInt xmlId(0);    
    if ( KErrNone == ( ret = aItem.GetInt( _L( "RunIscTestCase" ), xmlId ) ) )
        {
        // Test case ID
        TInt testId(0);
        if ( KErrNone == ( ret = aItem.GetNextInt( testId ) ) )
            {
            iCoreLog->Log( _L( "CSimAtk::RunIscTestCase: Id: %d" ), testId );
            TInt test =  ( xmlId << 20 ) | testId;
            iRIscTestControl.RunTestCase( test, iIscStatus );
            }
        }
    if ( KErrNone != ret )
        {
        iCoreLog->Log( _L( "CSimAtk::RunIscTestCase Running failed!" ) );
        CancelTestCase( ret );
        }
   
    return ret; 
    }

// -----------------------------------------------------------------------------
// CSimAtk::WaitForStatus
// Halts the execution until an async req is completed.
// (other items were commented in a header).
// -----------------------------------------------------------------------------       
//
TInt CSimAtk::WaitForRequest
        (
        CStifItemParser& /*aItem*/
        )
    {
    iCoreLog->Log( _L( "CSimAtk::WaitForRequest" ) );    

    User::WaitForRequest( iIscStatus );
    
    TInt errorStatus( iIscStatus.Int() );
    
    if ( KErrNone == errorStatus && iNeedSessionEnd && iSessionEnd.TimedOut() )
        {
        errorStatus = KErrTimedOut;            
        }
        
    if ( KErrNone != errorStatus )
        {
        CancelTestCase( errorStatus );        
        }
       
    return errorStatus; 
    }

// -----------------------------------------------------------------------------
// CSimAtk::SyncIscTestCase
// Connects to ISC test control and loads XML file
// (other items were commented in a header).
// -----------------------------------------------------------------------------       
//
TInt CSimAtk::SyncIscTestCase
        (
        CStifItemParser& /*aItem*/
        )
    {
    TInt ret ( KErrNone );
    
    iCoreLog->Log( _L( "CSimAtk::SyncIscTestCase" ) );    
    
    ret = iRIscTestControl.SyncTestCase();
    
    iCoreLog->Log( _L( "CSimAtk::SyncIscTestCase \
        Synch complete. Status: %d" ), ret );
        
    if ( KErrNone != ret )
        {
        CancelTestCase( ret );
        }
    
    return ret;
    }
    
// -----------------------------------------------------------------------------
// CSimAtk::CancelTestCase
// Test client originated test cancellation
// (other items were commented in a header).
// -----------------------------------------------------------------------------       
//
TInt CSimAtk::CancelTestCase
        (
        const TInt aReason
        )
    {
    TPtrC error( MapErrorCodeToString( aReason ) );
    
    iCoreLog->Log( _L( "CSimAtk::CancelTestCase: %S" ), &error );

    if ( iArray )
        {
        // Cancel all notifys and empty the array
        for ( TInt i = 0 ; i < iArray->Count() ; i ++ )
            {
            iArray->At( i )->CancelRequest();
            }
        iArray->Reset();

        iCallControl = NULL;
        }
        
    iSessionEnd.Cancel();

    iRIscTestControl.CancelTestCase();
    
    
    return KErrNone;
    }
    
// -----------------------------------------------------------------------------
// CSimAtk::CancelTestCase
// Script originated test cancellation
// (other items were commented in a header).
// -----------------------------------------------------------------------------       
//
TInt CSimAtk::CancelTestCase
        (
        CStifItemParser& /*aItem*/
        )
    {
    iCoreLog->Log( _L( "CSimAtk::CancelTestCase" ) );    

    if ( iArray )
        {
        // Cancel all notifys and empty the array
        for ( TInt i = 0 ; i < iArray->Count() ; i ++ )
            {
            iArray->At( i )->CancelRequest();
            }
        iArray->Reset();

        iCallControl = NULL;
        }

    iRIscTestControl.CancelTestCase();
    
    return KErrNone;
    }

// -----------------------------------------------------------------------------
// CSimAtk::Delay
// Halt script execution for given time
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
TInt CSimAtk::Delay
        (
        CStifItemParser& aItem
        )
    {
    iCoreLog->Log( _L( "CSimAtk::Delay" ) );
    
    TInt delay(0);
    aItem.GetNextInt( delay );
    User::After( delay );
    return KErrNone;
    }
    
// -----------------------------------------------------------------------------
// CSimAtk::CheckData
// Verifies the validity of received data
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
TInt CSimAtk::CheckData
        (
        CStifItemParser& aItem
        )
    {
    iCoreLog->Log( _L( "CSimAtk::CheckData" ) );    

    TInt ret( KErrNone );
    TInt commandIndex;
    
    if ( KErrNone == FindIndex( aItem, commandIndex ) )
        {
        ret = iArray->At( commandIndex )->CheckData();
        }
    else
        {
		iCoreLog->Log( _L( "CSimAtk::CheckData Unidentified command" ) );
		ret = KErrGeneral;
        }
    
    // Proactive command data was invalid or unexpected command received
    if (KErrNone != ret)
        {
        iCoreLog->Log( _L( "CSimAtk::CheckData \
            Checking of data failed, aborting." ) );
        CancelTestCase( ret );
        }
    
    return ret;    
    }
    
// -----------------------------------------------------------------------------
// CSimAtk::SendResponse
// Creates data packet from a script and sends it to Sim
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
TInt CSimAtk::SendResponse
        (
        CStifItemParser& aItem
        )
    {
    iCoreLog->Log( _L( "CSimAtk::SendResponse" ) );    

    TInt ret( KErrNone );
    TInt commandIndex;
    
    if ( KErrNone == FindIndex( aItem, commandIndex ) )
        {
        // Find command from array
        CSatCommandBase* proactiveCommand = 
            static_cast<CSatCommandBase*>(iArray->At( commandIndex ) );
            
        // Check if notifying of SessionEnd is omitted from script. Needed
        // by default
        iNeedSessionEnd = ETrue;
        aItem.GetInt( KSessionEnd, iNeedSessionEnd );
        
        // In case of sending envelopes, SessionEnd has to be notified here
        if ( iNeedSessionEnd && KRequestPending != iSessionEnd.Status() )
            {
            iSessionEnd.NotifySat(); 
            }        

        ret = proactiveCommand->SendResponse();
        
        if ( iNeedSessionEnd && KErrNone == ret )
            {
            // Sending OK, wait for a while for session end
            ret = iSessionEnd.WaitSessionEnd();
            }
        
        switch ( ret )
            {
            case KErrNone:
                {
        		iCoreLog->Log( _L( "CSimAtk::SendResponse \
        		    Response sent successfully" ), ret );
                break;
                }
            case KErrTimedOut:
                {
                // When there's data coming from SIM, SessionEnd is not
                // completed and time out occurs. This is not error however,
                // final check for SessionEnd status is made in WaitForRequest
                ret = KErrNone;
                
        		iCoreLog->Log( _L( "CSimAtk::SendResponse \
        		    SessionEnd Timed out" ) );
                break;
                }
            default:
                {
        		iCoreLog->Log( _L( "CSimAtk::SendResponse \
        		    Command returned an error code %d!" ), ret );
                break;
                }
            }
        }
    else
        {
		iCoreLog->Log( _L( "CSimAtk::SendResponse \
		    Unidentified command" ) );
		ret = KErrGeneral;
        }

    if ( KErrNone != ret )
        {
        CancelTestCase( ret );
        }

    return ret;
    }
    
// -----------------------------------------------------------------------------
// CSimAtk::CheckIcon
// Verifies the validity of provided icon info
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
TInt CSimAtk::CheckIcon
        (
        CStifItemParser& aItem
        )
    {
    TInt ret( KErrNone );

    // Try to load mandatory SimType parameter from script
    TPtrC simType;
    
    if ( KErrNone == aItem.GetString( KLoadIcon, simType ) )
        {
        TInt instanceNumber( 0 );
        TInt recordId( 0 );
        
        // Get instance number identifier
        if ( KErrNone != aItem.GetNextInt( instanceNumber ) )
            {
            ret = KErrArgument;
            }
        // Get record id.
        else if ( KErrNone != aItem.GetNextInt( recordId ) )
            {
            ret = KErrArgument;
            }
        else
            {
            CSatIcon satIcon( iSat, simType, recordId );
            ret = satIcon.CheckIcon( iCoreLog, instanceNumber );
            }
        }
    else
        {
        ret = KErrArgument;
        }
        
    if ( KErrNone != ret )
        {
        CancelTestCase( ret );
        }        
    
    return ret;
    }
    
// -----------------------------------------------------------------------------
// CSimAtk::FindIndex
// Finds the index of command in array based on the script parameter
// (other items were commented in a header).
// -----------------------------------------------------------------------------       
//
TInt CSimAtk::FindIndex
        (
        CStifItemParser& aItem, // Reference to parser
        TInt& aIndex // Index output
        )
    {
    iCoreLog->Log( _L( "CSimAtk::FindIndex (by name)") );
                
    TInt ret ( KErrNotFound );
    TPtrC cmdName;
    
    if ( iArray )
        {
        if ( KErrNone != aItem.GetString( KCommandType, cmdName ) )
            {
            // Script did not provide command type.
            // Return index 0 (first element) as a default.
            if ( 0 < iArray->Count() )
                {
                aIndex = 0;
                ret = KErrNone;
                }
            }
        else
            {
            // Script provided a command type. For example:
            // "CommandType ESatNotifyDisplayTextPCmd"
            // Loop throught the array and look for matching command type.
            // If array contains several commands of same type, latest is.
            // returned            
            TBool requestPending( EFalse ); // Not used
            TSatIpc requestedCommand = 
                MapStringToIpc( cmdName, requestPending );
            
            // Find command based on type
            ret = FindIndex( requestedCommand, aIndex );
            }
        } // if (iArray)
    else
        {
        // iArray is NULL
        ret = KErrCorrupt;
        }
        
    return ret;
    }
    
// -----------------------------------------------------------------------------
// CSimAtk::FindIndex
// Finds the index of command in array based on the ipc of the command
// (other items were commented in a header).
// -----------------------------------------------------------------------------       
//
TInt CSimAtk::FindIndex
        (
        const TSatIpc& aRequestedIpc, // Requested type
        TInt& aIndex // Index output
        )
    {
    iCoreLog->Log( _L( "CSimAtk::FindIndex (by IPC)") );
    TInt ret ( KErrNotFound );
    
    if ( iArray )
        {
        TInt i = iArray->Count() - 1;
        
        for ( ; KErrNotFound == ret && i >= 0 ; i-- )
            {
            if ( iArray->At( i )->MatchIpc( aRequestedIpc ) )
                {
                aIndex = i;
                ret = KErrNone;
                }
            }
        }
        
    if ( KErrNone != ret )        
        {
        TPtrC cmdName( MapIpcToString( aRequestedIpc ) );
        iCoreLog->Log( _L( "CSimAtk::FindIndex \
            %S not found!"), &cmdName );
        }        
        
    return ret;
    }
    
// -----------------------------------------------------------------------------
// CSimAtk::MapErrorCodeToString
// 
// (other items were commented in a header).
// -----------------------------------------------------------------------------       
//
const TPtrC CSimAtk::MapErrorCodeToString( const TInt& aErrorCode )
    {
    TPtrC errorString( KNullDesC );
    
    for ( TUint8 i( 0 ) ; errorString == KNullDesC 
          && i < KSatErrorListSize ; i++ )
        {
        if ( KSatErrorList[i].iErrorCode == aErrorCode )
            {
            errorString.Set( KSatErrorList[i].iErrorString );
            }
        }
        
    if ( errorString == KNullDesC )
        {
        errorString.Set( _L( "Unidentified error code" ) );

        iCoreLog->Log( _L( "CSimAtk::MapErrorCodeToString \
            Error code %d" ), aErrorCode );
        }

    return errorString;
    }
    
//  End of File