camerasrv_plat/camera_application_engine_api/tsrc/src/CaeTestStatesClient.cpp
author Pat Downey <patd@symbian.org>
Wed, 01 Sep 2010 12:23:23 +0100
branchRCL_3
changeset 34 27fe719c32e6
parent 0 9b3e960ffc8a
permissions -rw-r--r--
Revert incorrect RCL_3 drop: Revision: 201031 Kit: 201035

/*
* 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: CaeTestStatesClient.cpp
*
*/
#include <fbs.h>
#include <w32std.h>

#include "CaeTestStatesClient.h"

//_LIT8(KVideoMimeType, "video/3gpp");
//_LIT(KVideoPreferredSupplier, "Nokia");
//_LIT8(KVideoType, "video/H263-2000");
//_LIT8(KVideoAudioType, " AMR");
_LIT8(KVideoAudioTypeInv, " TOYOTA");
const TUid KIllegalUidQltyLevels = {666};


CCaeTestStatesClient::CCaeTestStatesClient() 
    {
    }


CCaeTestStatesClient::~CCaeTestStatesClient()
    {
    }


CCaeTestStatesClient* CCaeTestStatesClient::NewL()
    {
    CCaeTestStatesClient* self = new(ELeave) CCaeTestStatesClient;
    CleanupStack::PushL( self );
    self->ConstructL();
    CleanupStack::Pop( self );
    return self;
    }


void CCaeTestStatesClient::ConstructL()
    {
    CCaeTestClient::ConstructL();

    iRunWithViewFinder = EFalse;
    }


void CCaeTestStatesClient::RunTestActionL( TestClientActions aAction )
    {

    iAction = aAction;

    iActionCycle = 0;

    // Initialize all state variables.
    InitStateVariables();

    #ifdef CAE_TEST_VERSION
    switch ( iAction )
		{
        case EEncodingError:
            CaeSetMcaeseoHBufC8ImageReadyError( KErrAbort );
            break;
        case EDecodingError:
            CaeSetMcaesdoCFbsBitmapImageReadyError( KErrAbort );
            break;
        case EPowerError:
            CaeSetPowerOnCompleteError( KErrAbort );
            break;
        case EReserveError:
            CaeSetReserveCompleteError( KErrAbort );
            break;
        case EStillCaptureError:
            CaeSetImageReadyError( KErrAbort );
            break;
        case EVideoRecorderOpenError:
            CaeSetMvruoOpenCompleteError( KErrAbort );
            break;
        case EVideoRecorderPrepareError:
            CaeSetMvruoPrepareCompleteError( KErrAbort );
            break;
        case EVideoRecordingCompleteError:
            CaeSetMvruoRecordCompleteError( KErrAbort );
            break;
        case EPrepareVideoSettingsError:
            CaeSetPrepareVideoSettingsError( KErrAbort );
            break;
        case ESnapImageError:
            CaeSetCreateAndDeliverSnapImageError( KErrAbort );
            break;
        case EStillImageError:
            CaeSetCreateAndDeliverStillImageError( KErrAbort );
            break;
        case EStillConvertError1:
            CaeSetConvertCFbsBitmapToHBufC8Error( KErrAbort );
            break;
        case EStillConvertError3:
            CaeSetConvertHBufC8ToCFbsBitmapError( KErrAbort );
            break;
        case EStillConvertError2:
            CaeSetStillConvertError( KErrAbort );
            break;
        default:
            break;
        }
    #endif // CAE_TEST_VERSION


    switch (iAction)
        {
    case ESetDisplayIndex:
        {
        delete iCamAppEngine;
        iCamAppEngine = NULL;
        iCamAppEngine = CCaeEngine::NewL( 0, iDisplayIndex );
        iCamAppEngine->SetCamAppEngineObserver( *this );
        iCamAppEngine->SetCaeStillBurstObserver( *this );
	    iCamAppEngine->GetInfo( iInfo );
        }
        break;
    case ESetCameraIndexLow:
        {
        delete iCamAppEngine;
        iCamAppEngine = NULL;
        iCamAppEngine = CCaeEngine::NewL( -1, iDisplayIndex );
        iCamAppEngine->SetCamAppEngineObserver( *this );
        iCamAppEngine->SetCaeStillBurstObserver( *this );
	    iCamAppEngine->GetInfo( iInfo );
        }
        break;
    case ESetCameraIndexHigh:
        {
        delete iCamAppEngine;
        iCamAppEngine = NULL;
        iCamAppEngine = CCaeEngine::NewL( 123456, iDisplayIndex );
        iCamAppEngine->SetCamAppEngineObserver( *this );
        iCamAppEngine->SetCaeStillBurstObserver( *this );
	    iCamAppEngine->GetInfo( iInfo );
        }
        break;
    case ESpecifiedPrepareAndCaptureStill2nd:
        {
        delete iCamAppEngine;
        iCamAppEngine = NULL;
        iCamAppEngine = CCaeEngine::NewL( 1 );
        iCamAppEngine->SetCamAppEngineObserver( *this );
        iCamAppEngine->SetCaeStillBurstObserver( *this );
	    iCamAppEngine->GetInfo( iInfo );
        }
 
    default:
        break;
        }

    
// If interface after S60 2.1.
#ifndef CAE_INTERFACE_21
    if ( iAction != ESpecifiedPrepareAndCaptureStill &&
        iAction != ESpecifiedPrepareAndRecordVideoNoInit )
        {
        // Normal case
        // This starts operations and state changes.
        if ( iCreateSnapImage ) 
            {
            iCamAppEngine->InitL();
            }
        else 
            {
            iCamAppEngine->InitL();
            iCamAppEngine->SetSnapImageCreation( EFalse );
            }
        }
    else if ( iAction == ESpecifiedPrepareAndCaptureStill ||
            iAction == ESpecifiedPrepareAndCaptureStill2nd )
        {
        // 
        // This starts operations and state changes.
        if ( iCreateSnapImage ) 
            {
            iCamAppEngine->InitL( EFalse );
            iCamAppEngine->SetSnapImageCreation( ETrue );
            }
        else 
            {
            iCamAppEngine->InitL( ETrue );
            iCamAppEngine->SetSnapImageCreation( EFalse );
            }
        }
    else if ( iAction == ESpecifiedPrepareAndRecordVideoNoInit )
        {
        // No CAE init here, used in 3.2 in case only CAE video features are used

    	#ifdef _DEBUG
        RDebug::Print( _L( "Cae: CCaeTestStatesClient::RunTestActionL() reading cameraHandle" ) );
        #endif

        TInt cameraHandle = iCamAppEngine->CCameraHandle();

    	#ifdef _DEBUG
        RDebug::Print( _L( "Cae: CCaeTestStatesClient::RunTestActionL() creating obs2 NewDuplicate2L cameraHandle=%d" ),cameraHandle );
        #endif

        // Create a new Camera API duplicate object, if supported
        TRAPD( err, iCameraDup = CCamera::NewDuplicate2L( static_cast<MCameraObserver2&>(*this), cameraHandle ) );
        if ( err )
            {
        	#ifdef _DEBUG
            RDebug::Print( _L( "Cae: CCaeTestStatesClient::RunTestActionL() CCamera::NewDuplicate2L return code=%d" ), err ); 
            #endif

            // Create old Camera API duplicate object.
            iCameraDup = CCamera::NewDuplicateL( static_cast<MCameraObserver&>(*this), cameraHandle );
            }
        else
            {
        	#ifdef _DEBUG
            RDebug::Print( ( _L( "Cae: CCaeTestStatesClient::RunTestActionL() using duplicated MCameraObserver2" )) ); 
            #endif
            }

    	#ifdef _DEBUG
        RDebug::Print( _L( "Cae: CCaeTestStatesClient::RunTestActionL() calling reserve iCameraDup=%x" ),iCameraDup );
        #endif

        iCameraDup->Reserve(); // Poweron called after this in reservecomplete

        // Give C-API time to complete operation
        User::After( 500000 );
        
    	#ifdef _DEBUG
        RDebug::Print( _L( "Cae: CCaeTestStatesClient::RunTestActionL() calling cae disable/enable videorecording" ) );
        #endif

        // Let CAE know that camera HW reservation is done,
        // this will initialize some CAE flags so that video mode can be used
        iCamAppEngine->DisableVideoRecording(); // Just to test release before reserve
        iCamAppEngine->EnableVideoRecording(); // 
        iCamAppEngine->DisableVideoRecording(); // test release 
        iCamAppEngine->EnableVideoRecording(); // reserve again
        iCamAppEngine->EnableVideoRecording(); // double reserve

        } 
#else   // CAE_INTERFACE_21
        // This starts operations and state changes.
        if ( iCreateSnapImage ) 
            {
            iCamAppEngine->InitL();
            }
        else 
            {
            iCamAppEngine->InitL( EFalse );
            }
#endif
        
	// Main part of program is a wait loop.
	// This function completes when the scheduler stops.
	CActiveScheduler::Start();
    
    if ( iError )
        {
    	#ifdef _DEBUG
        RDebug::Print( _L( "Cae: CCaeTestStatesClient::RunTestActionL() leaving (error detected)" ) );
        #endif
        User::Leave( iError );
        }
	
    #ifdef _DEBUG
    RDebug::Print( _L( "Cae: CCaeTestStatesClient::RunTestActionL() returning" ) );
    #endif
    }


void CCaeTestStatesClient::RunTrappedL()
    {
	#ifdef _DEBUG
    RDebug::Print( _L( "Cae: CCaeTestStatesClient::RunTrappedL() entering, iAction=%d" ),iAction );
    #endif

    // This is for timing critical cases
    TTime currentTime; 
    currentTime.HomeTime();
    if ( iNextRunLTime.MicroSecondsFrom( currentTime ) > TTimeIntervalMicroSeconds(0) )
        {
        CTimer::At( iNextRunLTime );
        return;
        }

    if ( iAction == ENone || iStop ) 
        {
        if ( iCamAppEngine->IsViewFinding() )
	        {
            iCamAppEngine->StopViewFinder();
            iViewFinderStarted = EFalse;
            }
        iCamAppEngine->CancelCaptureStill();
        iCancelCount++;
        iCamAppEngine->CloseVideoRecording();
        CActiveScheduler::Stop();
        }
    else if ( iInitReady ) 
		{
        iInitReady = EFalse;
        iViewFinderStarted = EFalse;        

        switch ( iAction )
		    {
            case EInit:
                iStop = ETrue;
                CTimer::After( KNormalTimingDelay );
                break;
            case ECCameraHandle:
                iStop = ETrue;
                iCameraHandle = iCamAppEngine->CCameraHandle();
                CTimer::After( KNormalTimingDelay );
                break;
            case EInitVideoRecorder:
                iCamAppEngine->InitVideoRecorderL();
                iStop = ETrue;
                CTimer::After( KNormalTimingDelay );
                break;
            case EInitVideoRecorderWithUid:
                iCamAppEngine->InitVideoRecorderL(KIllegalUidQltyLevels);
                iStop = ETrue;
                CTimer::After( KNormalTimingDelay );
                break;
            case ESwitchPowerOnWhenInitialized:
                if ( iStopWhenCompleted ) 
                    {
                    iStop = ETrue;
                    CTimer::After( KNormalTimingDelay );
                    }
                else 
                    {
                    iStopWhenCompleted = ETrue;
                    iInitReady = ETrue;
                    iCamAppEngine->PowerOn();
                    CTimer::After( KNormalTimingDelay );
                    }
                break;
            case ESwitchPowerOffAndOn:
                if ( iStopWhenCompleted ) 
                    {
                    iStop = ETrue;
                    CTimer::After( KNormalTimingDelay );
                    }
                else if ( iPowerOn ) 
                    {
                    iCamAppEngine->PowerOff();
                    iPowerOn = EFalse;
                    iInitReady = ETrue;
                    CTimer::After( KNormalTimingDelay );
                    }
                else 
                    {
                    iStopWhenCompleted = ETrue;
                    iCamAppEngine->PowerOn();
                    }
                break;
            case EPowerOffPowerOff:
                iCamAppEngine->PowerOff();
                iCamAppEngine->PowerOff();
                iStop = ETrue;
                CTimer::After( KNormalTimingDelay );
                break;
            case EStartVfWhenPowerOff:
                iCamAppEngine->PowerOff();
                iViewFindingUsed = ETrue;
                iCamAppEngine->StartViewFinderBitmapsL( iViewFinderSize );
                if( iCamAppEngine->IsViewFinding() )
                    {
                    User::Leave ( KErrGeneral );
                    }
                iStop = ETrue;
                CTimer::After( KNormalTimingDelay ); // Give some time for all Active objects to react to this command.
                break;
            case ERelease:
                iCamAppEngine->Release();
                iStop = ETrue;
                CTimer::After( KNormalTimingDelay );
                break;
            case EReleaseRelease:
                iCamAppEngine->Release();
                iCamAppEngine->Release();
                iStop = ETrue;
                CTimer::After( KNormalTimingDelay );
                break;
            case EReserveReserve:
                iCamAppEngine->Reserve();
                iStop = ETrue;
                CTimer::After( KNormalTimingDelay ); // needed because this Reserve after InitL does do nothing (no call-back)
                break;
            case EReleaseReserve:
                if ( iStopWhenCompleted ) 
                    {
                    iStop = ETrue;
                    CTimer::After( KNormalTimingDelay );
                    }
                else if ( iPowerOn ) 
                    {
                    iCamAppEngine->Release();
                    iPowerOn = EFalse;
                    iInitReady = ETrue;
                    CTimer::After( KNormalTimingDelay );
                    }
                else 
                    {
                    iStopWhenCompleted = ETrue;
                    iCamAppEngine->Reserve();
                    }
                break;
            case EReleaseReserveCapture:
                if ( iContinueWhenCompleted ) 
                    {
                    iStillPrepareReady = EFalse;
                    iVideoPrepareReady = EFalse;
                    iCamAppEngine->PrepareStillCaptureL( iStillQualityLevelIndex );
                    }
                else if ( iPowerOn ) 
                    {
                    iCamAppEngine->Release();
                    iPowerOn = EFalse;
                    iInitReady = ETrue;
                    CTimer::After( KNormalTimingDelay );
                    }
                else 
                    {
                    iContinueWhenCompleted = ETrue;
                    iCamAppEngine->Reserve();
                    }
                break;
            case EReleaseReserveRecord:
                if ( iContinueWhenCompleted ) 
                    {
                    iStillPrepareReady = EFalse;
                    iVideoPrepareReady = EFalse;
                    iCamAppEngine->InitVideoRecorderL();
                    iCamAppEngine->SetVideoRecordingFileNameL( iVideoFileName );
                    iCamAppEngine->PrepareVideoRecordingL( iVideoQualityLevelIndex );
                    }
                else if ( iPowerOn ) 
                    {
                    iCamAppEngine->Release();
                    iPowerOn = EFalse;
                    iInitReady = ETrue;
                    CTimer::After( KNormalTimingDelay );
                    }
                else 
                    {
                    iContinueWhenCompleted = ETrue;
                    iCamAppEngine->Reserve();
                    }
                break;
            case EStartVideoRecordingWhenInitialized:
                iCamAppEngine->StartVideoRecording();
                break;
            case EStopVideoRecordingWhenInitialized:
                iCamAppEngine->StopVideoRecording();
                break;
            case EGetStillQualityIndexWhenEngineInitialized:
                {
                TInt stillQualityIndex = iCamAppEngine->StillQualityIndex();
                if ( stillQualityIndex != -1 ) 
                    {
                    User::Leave( KErrGeneral );
                    }
                }
                iStop = ETrue;
                CTimer::After( KNormalTimingDelay );
                break;
            case EGetVideoQualityIndexWhenEngineInitialized:
                {
                TInt videoQualityIndex = iCamAppEngine->VideoQualityIndex();
                if ( videoQualityIndex != -1 ) 
                    {
                    User::Leave( KErrGeneral );
                    }
                }
                iStop = ETrue;
                CTimer::After( KNormalTimingDelay );
                break;
            case EEnumerateCaptureSizes:
                {
                TSize stillFrameSize;
                // Tests to get the largest image size (index value 0).
                iCamAppEngine->EnumerateStillCaptureSizes( stillFrameSize, 0, iStillDataFormat );
                if ( stillFrameSize != iStillFrameSize )
                    {
                    #ifdef _DEBUG
                    RDebug::Print( _L( "Cae: CCaeTestStatesClient::RunTrappedL() got stillFrameSize w=%d, h=%d, leaving -2" ), stillFrameSize.iWidth, stillFrameSize.iHeight );
                    #endif
                    
                    User::Leave( KErrGeneral );
                    }
                }
                iStop = ETrue;
                CTimer::After( KNormalTimingDelay );
                break;
            case EPrepareStillCapturing:
            case EPrepareStillCapturingWhenPrepared:
            case EPrepareAndCaptureStill:
            case EPrepareAndCaptureAndCancelStill:
            case EPrepareAndCaptureAndCancelStillAtSnap:
            // Burst
            case EPrepareAndCaptureStillBurst:
            case EPrepareAndCaptureStillBurstCaptureStill:
            case EPrepareAndCaptureAndCancelStillBurst:
            case EPrepareAndCaptureAndCancelStillBurstAtMoment:
            case EPrepareAndCaptureAndCancelStillBurstAtSnap:
            case EPrepareAndCaptureAndStopStillBurst:
            case EPrepareAndCaptureCaptureStillBurst:
            // 
            case EStartAndStopVfWhenStillPreparedAndCaptured:
            case ECaptureCapture:
            case ECaptureRecord:
            case ESwitchPowerOnWhenStillPrepared:
            case ESwitchPowerOffWhenStillPrepared:
            case EGetStillQualityIndexWhenPrepared:
            case EEncodingError:
            case EStillCaptureError:
            case EStillConvertError1:
            case EStillConvertError2:
            case EStillConvertError3:
                iStillPrepareReady = EFalse;
                iVideoPrepareReady = EFalse;
                iCamAppEngine->PrepareStillCaptureL( iStillQualityLevelIndex );
			    break;
            case EPrepareCroppedStillCapturing:
                iStillPrepareReady = EFalse;
                iVideoPrepareReady = EFalse;
                {
                TRect cropRect; 
                iCamAppEngine->PrepareStillCaptureL( iStillQualityLevelIndex, cropRect );
                }
			    break;
            case EPrepareStillCaptureWhenPowerOff:
                iCamAppEngine->PowerOff();
                iStillPrepareReady = EFalse;
                iVideoPrepareReady = EFalse;
                iCamAppEngine->PrepareStillCaptureL( iStillQualityLevelIndex );
			    break;
            case EPrepareVideoRecording:
            case EPrepareVideoRecordingWhenPrepared:
            case EPrepareAndRecordVideo:
            case EStartAndStopVfWhenVideoPreparedAndRecorded:
            case ERecordRecord:
            case ERecordCapture:
            case ERecordCaptureComplexSequence1:
            case ERecordCaptureComplexSequence2:
            case ESwitchPowerOnWhenVideoPrepared:
            case ESwitchPowerOffWhenVideoPrepared:
            case ESwitchPowerOnWhenRecordingVideo:
            case ESwitchPowerOffWhenRecordingVideo:
            case EStartVideoRecordingWhenRecording:
            case EStopVideoRecordingWhenPrepared:
            case EPauseVideoWhenPrepared:
            case EResumeVideoWhenPrepared:
            case EResumeVideoWhenNotPaused:
            case EPrepareRecordPauseStopVideo:
            case EPrepareRecordPauseResumeStopVideo:
            case EPrepareRecordPausePauseStopVideo:
            case EGetVideoQualityIndexWhenPrepared:
            case ERemainingTimeWhenVideoPrepared:
            case EVideoRecorderOpenError:
            case EVideoRecorderPrepareError:
            case EVideoRecordingCompleteError:
            case EPrepareVideoSettingsError:
            case EPrepareStillCaptureWhenRecording:
                iStillPrepareReady = EFalse;
                iVideoPrepareReady = EFalse;
                iCamAppEngine->InitVideoRecorderL();
                iCamAppEngine->SetVideoRecordingFileNameL( iVideoFileName );
                iCamAppEngine->PrepareVideoRecordingL( iVideoQualityLevelIndex );
			    break;
            case ESpecifiedPrepareStill:
            case ESpecPrepCaptureCapture:
            case ESpecifiedPrepareStillWhenPrepared:
            case ESpecifiedPrepareAndCaptureStill:
            case ESpecifiedPrepareAndCaptureStill2nd:
            case EPrepareAndCaptureStillBurstExif:
            case EPrepareAndCaptureAndCancelStillBurstExif:
            case EStartVfPrepareCaptureStillStartAndStopVfExif:
            case EStillImageError:
		    case ESetDisplayIndex:
            // Burst
            case ESpecPrepAndCaptureStillBurst:
            case ESpecPrepAndCaptureCaptureStillBurst:
            case ESpecPrepAndCaptureStillBurstCaptureStill:
            // "Destroy Engine"
            case EDestroyEngineWhenStillPrepareReady:
            case EDestroyEngineWhenSnapImageReady:
            case EDestroyEngineWhenStillCaptureReady:
            case EDestroyEngineWhenStillBurstReady:
            case EDestroyEngineWhenSnapImageReadyInStillBurst:
            case EDestroyEngineWhenStillImageReadyInStillBurst:
            case ECaptureStillSetSnapSizeExif:
            case ECaptureStillAfterPowerOff:
            case ECaptureStillAfterPowerOffOn:
            case ESnapImageError:
                iStillPrepareReady = EFalse;
                iVideoPrepareReady = EFalse;
                iCamAppEngine->PrepareStillCaptureL( iStillFrameSize, 
                                                     iStillDataFormat, 
                                                     iStillCompressionQuality );
			    break;
			case EStartVfPrepareCaptureStillStartAndStopVfSnapExif:
                iStillPrepareReady = EFalse;
                iVideoPrepareReady = EFalse;
                iCamAppEngine->PrepareStillCaptureL( iStillFrameSize, 
                                                     iStillDataFormat, 
                                                     iStillCompressionQuality,
													 iCropRect,
													 iSnapImageSize);
			    break;
            case ECaptureStillSetSnapColorModeExif:
                iStillPrepareReady = EFalse;
                iVideoPrepareReady = EFalse;
                iCamAppEngine->PrepareStillCaptureL( iStillFrameSize, 
                                                     iStillDataFormat, 
                                                     iStillCompressionQuality );
				iCamAppEngine->SetSnapImageColorMode( EColor16M );
			    break;
            case ESpecifiedPrepareVideo: 
            case ESpecifiedPrepareVideoWhenPrepared: 
            case ESpecifiedPrepareAndRecordVideo: 
            case ESpecifiedPrepareAndRecordVideoNoInit: 
            // "Destroy Engine"
            case EDestroyEngineWhenVideoPrepareReady:
            case EDestroyEngineWhenVideoRecordingOn:
            case EDestroyEngineWhenVideoRecordingPaused:
            case EDestroyEngineWhenVideoRecordingReady:
                iStillPrepareReady = EFalse;
                iVideoPrepareReady = EFalse;
                iCamAppEngine->InitVideoRecorderL();
                iCamAppEngine->SetVideoRecordingFileNameL( iVideoFileName );
                {
                iCamAppEngine->PrepareVideoRecordingL( iVideoFrameSize, 
                                                       iVideoFrameRate, 
                                                       iVideoBitRate, 
                                                       iVideoAudioEnabled, 
                                                       *iMimeTypeSet[iVideoCodecSet], 
                                                       *iPreferredSupplierSet[iVideoCodecSet],
                                                       *iVideoTypeSet[iVideoCodecSet], 
                                                       *iAudioTypeSet[iVideoCodecSet] );
                }
			    break;
            case ESpecifiedPrepareAudioBrAndRecordVideo:
                iStillPrepareReady = EFalse;
                iVideoPrepareReady = EFalse;
                iCamAppEngine->InitVideoRecorderL();
                iCamAppEngine->SetVideoRecordingFileNameL( iVideoFileName );
                {
                iCamAppEngine->PrepareVideoRecordingL( iVideoFrameSize, 
                                                       iVideoFrameRate, 
                                                       iVideoBitRate, 
                                                       iVideoAudioEnabled,
                                                       iAudioBitRate,
                                                       *iMimeTypeSet[iVideoCodecSet], 
                                                       *iPreferredSupplierSet[iVideoCodecSet],
                                                       *iVideoTypeSet[iVideoCodecSet], 
                                                       *iAudioTypeSet[iVideoCodecSet] );
                }
			    break;
            case ESpecifiedPrepareAudioBrAndRecordVideoAT0:
                iStillPrepareReady = EFalse;
                iVideoPrepareReady = EFalse;
                iCamAppEngine->InitVideoRecorderL();
                iCamAppEngine->SetVideoRecordingFileNameL( iVideoFileName );
                {
                const TDesC8& audioType = KNullDesC8;
                iCamAppEngine->PrepareVideoRecordingL( iVideoFrameSize, 
                                                       iVideoFrameRate, 
                                                       iVideoBitRate, 
                                                       iVideoAudioEnabled,
                                                       iAudioBitRate,
                                                       *iMimeTypeSet[iVideoCodecSet], 
                                                       *iPreferredSupplierSet[iVideoCodecSet],
                                                       *iVideoTypeSet[iVideoCodecSet], 
                                                       audioType );
                }
			    break;
            case ESpecifiedPrepareAudioBrAndRecordVideoATInv:
                iStillPrepareReady = EFalse;
                iVideoPrepareReady = EFalse;
                iCamAppEngine->InitVideoRecorderL();
                iCamAppEngine->SetVideoRecordingFileNameL( iVideoFileName );
                {
                const TDesC8& audioType = KVideoAudioTypeInv;
                iCamAppEngine->PrepareVideoRecordingL( iVideoFrameSize, 
                                                       iVideoFrameRate, 
                                                       iVideoBitRate, 
                                                       iVideoAudioEnabled,
                                                       iAudioBitRate,
                                                       *iMimeTypeSet[iVideoCodecSet], 
                                                       *iPreferredSupplierSet[iVideoCodecSet],
                                                       *iVideoTypeSet[iVideoCodecSet], 
                                                       audioType );
                }
			    break;
            case EStartAndStopVf:  
                iViewFindingUsed = ETrue;
                iCamAppEngine->StartViewFinderBitmapsL( iViewFinderSize );
                // Test IsViewFinding()
                if ( !iCamAppEngine->IsViewFinding() )
                    {
                    User::Leave( KErrGeneral );
                    }
                iStopViewFinder = ETrue;
                CTimer::After( iTimeout );
                break;
            case EStartAndStopCroppedVf:  
                iViewFindingUsed = ETrue;
                {
                TRect emptyRect;
                iCamAppEngine->StartViewFinderBitmapsL( iViewFinderSize, emptyRect );
                }
                // Test IsViewFinding()
                if ( !iCamAppEngine->IsViewFinding() )
                    {
                    User::Leave( KErrGeneral );
                    }
                iStopViewFinder = ETrue;
                CTimer::After( iTimeout );
                break;
            case EStartAndStopDirectVf:  
                iViewFindingUsed = ETrue;
                {
                RWsSession*      wsSession = NULL;
                CWsScreenDevice* wsScreenDevice = NULL;
                RWindowBase*     windowBase = NULL;
                TRect*           tRect = NULL;
                iCamAppEngine->StartViewFinderDirectL( *wsSession,
                                                       *wsScreenDevice,
                                                       *windowBase,
                                                       *tRect);
                }
                // Test IsViewFinding()
                if ( !iCamAppEngine->IsViewFinding() )
                    {
                    User::Leave( KErrGeneral );
                    }
                iStopViewFinder = ETrue;
                CTimer::After( iTimeout );
                break;
            case EStartAndStopCroppedDirectVf:  
                iViewFindingUsed = ETrue;
                {
                RWsSession*      wsSession = NULL;
                CWsScreenDevice* wsScreenDevice = NULL;
                RWindowBase*     windowBase = NULL;
                TRect*           screenRect = NULL;
                TRect*           cropRect = NULL;
                iCamAppEngine->StartViewFinderDirectL( *wsSession,
                                                       *wsScreenDevice,
                                                       *windowBase,
                                                       *screenRect,
                                                       *cropRect );
                }
                // Test IsViewFinding()
                if ( !iCamAppEngine->IsViewFinding() )
                    {
                    User::Leave( KErrGeneral );
                    }
                iStopViewFinder = ETrue;
                CTimer::After( iTimeout );
                break;
            case ESwitchPowerOffWhenVfRunning:
                iViewFindingUsed = ETrue;
                iCamAppEngine->StartViewFinderBitmapsL( iViewFinderSize );
                CTimer::After( iTimeout );
                break;
            case EStartVfPrepareCaptureStillStartAndStopVf:
            case EStartVfPrepareRecordVideoStartAndStopVf:
            case ESetColorToneVideoRecording:
                iViewFindingUsed = ETrue;
                iCamAppEngine->InitVideoRecorderL();
                iCamAppEngine->SetVideoRecordingFileNameL( iVideoFileName );
                iCamAppEngine->StartViewFinderBitmapsL( iViewFinderSize );
                CTimer::After( 500000 );
                break;
            case EIsVideoRecordingWhenPrepared:
                break;
            case ECaptureStillWhenEngineInitialized:
                iCamAppEngine->CaptureStill();
                break;
            case ECancelCaptureStillWhenInitialized:
                iCamAppEngine->CancelCaptureStill();
                iCancelCount++;
                iStop = ETrue;
                CTimer::After( KNormalTimingDelay );
                break;            
            case EStartVfStartVf:
                iViewFindingUsed = ETrue;
                iCamAppEngine->StartViewFinderBitmapsL( iViewFinderSize );
                iCamAppEngine->StartViewFinderBitmapsL( iViewFinderSize );
                iStopViewFinder = ETrue;
                CTimer::After( iTimeout );
                break;
                
// If interface after S60 2.1.
#ifndef CAE_INTERFACE_21
            case EGetCustomInterface:
                iCustomInterfacePointer = iCamAppEngine->CustomInterface( iCustomInterfaceUid );
                iStop = ETrue;
                CTimer::After( KNormalTimingDelay );
                break;
            case ESetColorTone:
            case ESetColorToneWrongParams:
            case ESetColorToneRelease:
                if ( iAction == ESetColorToneRelease && iReleaseDone )
                    {
                    // Do the Reserve, note that engine will call
                    // CCaeTestClient::McaeoInitComplete when camera is ready
                    iReleaseDone = EFalse;
                    iReserveDone = ETrue;
                    iInitReady   = ETrue; // continue in this case on next run
                    iCamAppEngine->Reserve();
                    // No timer call here, McaeoInitComplete does it
                    }
                else if ( iAction == ESetColorToneRelease && iReserveDone )
                    {
                    // state flags to defaults, release/reserve is done now
                    iReleaseDone = EFalse;
                    iReserveDone = EFalse;

                    // Verify that settings are reset to default after reserve
                    MCameraColorToneSettings* CTptr = NULL;
                    CTptr = static_cast<MCameraColorToneSettings*> ( iCustomInterfacePointer );
                    if ( CTptr->ColorTone() != MCameraColorToneSettings::ENormal )
                        {
                    	    #ifdef _DEBUG
                            RDebug::Print( _L( "Cae: CCaeTestStatesClient::RunTrappedL() Error:ColorTone settings not reset after release()" ));
                            #endif
                            iStop = ETrue;
                            CTimer::After( KNormalTimingDelay );
                        }
                    else
                        {
                        // all ok, capture a picture and verify manually normal settings
                        iCamAppEngine->PrepareStillCaptureL( iStillQualityLevelIndex );
                        }
                    }
                else
                    {
                    iCustomInterfacePointer = iCamAppEngine->CustomInterface( iCustomInterfaceUid );
                    if ( !iCustomInterfacePointer )
                        {               // Interface not supported, exit test case
                	    #ifdef _DEBUG
                        RDebug::Print( _L( "Cae: CCaeTestStatesClient::RunTrappedL() CustomInterface returns 0 for uid %x" ), iCustomInterfaceUid.iUid );
                        #endif
                        iStop = ETrue;
                        CTimer::After( KNormalTimingDelay );
                        }
                    else
                        {
                        MCameraColorToneSettings* CTptr = NULL;
                        TUint32 supportedCT = 0 ;

                        // cast the TAny pointer to the real color tone interface pointer and
                        // read the bitmap of supported color tones
                        CTptr = static_cast<MCameraColorToneSettings*> ( iCustomInterfacePointer );
                        supportedCT = CTptr->SupportedColorTones();

                        // Check that given parameter is supported by the interface
                        if ( (iColorToneValue & supportedCT) ||
                            iColorToneValue == MCameraColorToneSettings::ENormal ||
                            iAction == ESetColorToneWrongParams)
                            {
                            // then set the new color tone and verify that it has been set
                            CTptr->SetColorToneL( iColorToneValue );
                            if ( CTptr->ColorTone() == iColorToneValue )
                                {
                                if ( iAction == ESetColorToneRelease )
                                    {
                                    // Do now release and then on next run the reserve
                                    iCamAppEngine->Release();
                                    iReleaseDone = ETrue;
                                    iReserveDone = EFalse;
                                    iInitReady   = ETrue; // this keeps the same switch active
                                    CTimer::After( KNormalTimingDelay );
                                    }
                                else
                                    {
                                    // all ok, capture a picture and verify manually changes
                                    iCamAppEngine->PrepareStillCaptureL( iStillQualityLevelIndex );
                                    }
                                }
                            else // Value not set
                                {
                            	#ifdef _DEBUG
                                RDebug::Print( _L( "Cae: ESetColorTone: color iColorToneValue not set to: %d" ), iColorToneValue );
                                #endif
                                iStop = ETrue;
                                CTimer::After( KNormalTimingDelay );
                                }
                            }
                        else // Value not supported
                            {
                       	    #ifdef _DEBUG
                            RDebug::Print( _L( "Cae: ESetColorTone: color iColorToneValue not supported: %d" ), iColorToneValue );
                            #endif
                            iStop = ETrue;
                            CTimer::After( KNormalTimingDelay );
                            }
                        }
                    }
                break;
#endif
            case ERemainingTimeWhenVideoNotInitialized:
                {
                iAction = ENone;
                TTimeIntervalMicroSeconds zeroRemainingTime( 0 );
                TTimeIntervalMicroSeconds remainingTime( 1 );
                remainingTime = iCamAppEngine->RemainingVideoRecordingTime();
                if ( remainingTime != zeroRemainingTime )
                    {
                    User::Leave( KErrArgument );
                    }
                CTimer::After( KNormalTimingDelay );
                }
                break;
            default:
			    break;
		    }
		}
    else if ( iStillPrepareReady ) 
		{
        
        if ( iRunWithViewFinder && !iCamAppEngine->IsViewFinding() )
	        {
            iCamAppEngine->StartViewFinderBitmapsL( iViewFinderSize );
            User::After( 1000000 ); // Give some time for camera drivers to settle.
            }

        iStillPrepareReady = EFalse;

		TBool capture = EFalse;

		switch ( iAction )
			{
            case ESwitchPowerOnWhenStillPrepared:
                iAction = ENone;
                iCamAppEngine->PowerOn();
                CTimer::After( KNormalTimingDelay );
                break;
            case ESwitchPowerOffWhenStillPrepared:
                iAction = ENone;
                iCamAppEngine->PowerOff();
                CTimer::After( KNormalTimingDelay );
                break;
            case EGetStillQualityIndexWhenPrepared:
                {
                TInt stillQualityIndex = iCamAppEngine->StillQualityIndex();
                if ( stillQualityIndex != iStillQualityLevelIndex ) 
                    {
                    User::Leave( KErrGeneral );
                    }
                }
                iStop = ETrue;
                CTimer::After( KNormalTimingDelay );
                break;
            case EStartStillOpModeStopVf:
                iStopViewFinder = ETrue;
                CTimer::After( iTimeout );
                break;
            case ESpecifiedPrepareStill:
            case EPrepareStillCapturing:
                iAction = ENone;
                CTimer::After( KNormalTimingDelay );
                break;
            case EPrepareStillCapturingWhenPrepared:
                if ( iStopWhenCompleted ) 
                    {
                    iStop = ETrue;
                    CTimer::After( KNormalTimingDelay );
                    }
                else 
                    {
                    iStopWhenCompleted = ETrue;
                    iCamAppEngine->PrepareStillCaptureL( iStillQualityLevelIndex );
                    }
                break;
            case ESpecifiedPrepareStillWhenPrepared:
                if ( iStopWhenCompleted ) 
                    {
                    iStop = ETrue;
                    CTimer::After( KNormalTimingDelay );
                    }
                else 
                    {
                    iStopWhenCompleted = ETrue;
                    iCamAppEngine->PrepareStillCaptureL( iStillFrameSize, 
                                                         iStillDataFormat, 
                                                         iStillCompressionQuality );
                    }
                break;
            // Burst
            case EPrepareAndCaptureStillBurst:
            case EPrepareAndCaptureStillBurstExif:
            case EPrepareAndCaptureAndCancelStillBurstExif:
            case ESpecPrepAndCaptureStillBurst:
            case EPrepareAndCaptureAndCancelStillBurst:
            case EPrepareAndCaptureAndCancelStillBurstAtMoment:
            case EPrepareAndCaptureAndCancelStillBurstAtSnap:
            case EPrepareAndCaptureAndStopStillBurst:
            case EPrepareAndCaptureCaptureStillBurst:
            case ESpecPrepAndCaptureCaptureStillBurst:
            case EPrepareAndCaptureStillBurstCaptureStill:
            case ESpecPrepAndCaptureStillBurstCaptureStill:
            case EDestroyEngineWhenStillBurstReady:
            case EDestroyEngineWhenSnapImageReadyInStillBurst:
            case EDestroyEngineWhenStillImageReadyInStillBurst:
                if ( iImageCountToCapture == 1 ) 
                    {
                    iImageCountToCapture = iCamAppEngine->SetStillCaptureImageCountL( iStillBurstLength );
                    }
                if ( iSnapImageSource != CCaeEngine::ESnapImageSourceOriginal )
                    {
                    iCamAppEngine->SetSnapImageSourceL( iSnapImageSource );
                    }
                capture = ETrue;
                break;
			case ECaptureStillSetSnapSizeExif:
				iCamAppEngine->SetSnapImageSizeL( iSnapImageSize );
                capture = ETrue;
			    break;
            case ECaptureStillAfterPowerOff:
				iCamAppEngine->PowerOff();
                capture = ETrue;
                iStop = ETrue;  // Engine cancels capture if power is not on
                CTimer::After( KNormalTimingDelay );
			    break;
            case ECaptureStillAfterPowerOffOn:
                if ( iStopWhenCompleted ) 
                    {
                    if ( iCountStillPrepareComplete <= 1 )
                        {
                        iCamAppEngine->PrepareStillCaptureL( iStillFrameSize, 
                                                             iStillDataFormat, 
                                                             iStillCompressionQuality );
                        }
                    else
                        {
                        capture = ETrue;
                        }
                    //CTimer::After( KNormalTimingDelay );
                    }
                else if ( iPowerOn ) 
                    {
                    iCamAppEngine->PowerOff();
                    iPowerOn = EFalse;
                    iStillPrepareReady = ETrue; // come back here on next run
                    CTimer::After( KLongTimingDelay );
                    }
                else 
                    {
                    iStopWhenCompleted = ETrue;
                    iCamAppEngine->PowerOn();
                    iStillPrepareReady = ETrue; // come back here on next run
//                    CTimer::After( KLongTimingDelay*100 );
                    }
			    break;
			case EDestroyEngineWhenStillPrepareReady:
                delete iCamAppEngine;
                iCamAppEngine = NULL;
                CActiveScheduler::Stop();
			    break;
			default:
                capture = ETrue;
                break;
			}
        
        // Special treatments for some specific test actions:
        switch ( iAction ) 
            {
            case EPrepareAndCaptureAndStopStillBurst:
                iStopStillBurst = ETrue;
                break;
            case EPrepareAndCaptureAndCancelStillBurstAtMoment:
                iCancelStillBurst = ETrue;
                break;
            case EPrepareAndCaptureAndCancelStillBurstExif:
				// Cancel still burst after next view finder frame
                iCancelStillBurstAfterVfFrame = ETrue; 
                break;
            case EPrepareAndCaptureAndCancelStillAtSnap:
                iRunlForSnapImage = ETrue;
                // Added delay so that the encoder has always time to finish before the next RunTrappedL.
                // Before is was not so deterministic.
                iNextRunLTime.HomeTime();
                iNextRunLTime += TTimeIntervalMicroSeconds32(KLongTimingDelay*1000);
                break;  
            case EPrepareAndCaptureAndCancelStillBurstAtSnap:
            case EDestroyEngineWhenSnapImageReady:
            case EDestroyEngineWhenSnapImageReadyInStillBurst:
                iRunlForSnapImage = ETrue;
                break;
            case EDestroyEngineWhenStillImageReadyInStillBurst:
                iRunlForStillImage = ETrue; 
                break;
            default:
                break;               
            }
        
        // Capture still if requested for the test action.
        if ( capture )
			{
            iStillCaptureReady = EFalse;
            iStillCapturingOn = ETrue;
            iStillCaptured = ETrue;
	        #ifdef _DEBUG
            RDebug::Print( _L( "Cae: CCaeTestStatesClient: calling iCamAppEngine->CaptureStill()" ) );
            #endif
			iCamAppEngine->CaptureStill();
			}

        if ( iAction == EPrepareAndCaptureAndCancelStill || 
             iAction == EPrepareAndCaptureAndCancelStillBurst )
            {
            iCamAppEngine->CancelCaptureStill();
            iCancelCount++;
            iStop = ETrue;
            CTimer::After( KNormalTimingDelay );
            }

		}
    else if ( iVideoPrepareReady ) 
		{

        if ( iRunWithViewFinder && !iCamAppEngine->IsViewFinding() )
	        {
            iCamAppEngine->StartViewFinderBitmapsL( iViewFinderSize );
            User::After( 1000000 ); // Give some time for camera drivers to settle.
            }

        iVideoPrepareReady = EFalse;

        TBool record = EFalse;

		switch ( iAction )
			{
            case ESwitchPowerOnWhenVideoPrepared:
                iAction = ENone;
                iCamAppEngine->PowerOn();
                CTimer::After( KNormalTimingDelay );
                break;
            case ESwitchPowerOffWhenVideoPrepared:
                iAction = ENone;
                iCamAppEngine->PowerOff();
                CTimer::After( KNormalTimingDelay );
                break;
            case EGetVideoQualityIndexWhenPrepared:
                {
                TInt videoQualityIndex = iCamAppEngine->VideoQualityIndex();
                if ( videoQualityIndex != iVideoQualityLevelIndex ) 
                    {
                    User::Leave( KErrGeneral );
                    }
                }
                iStop = ETrue;
                CTimer::After( KNormalTimingDelay );
                break;
            case EPrepareVideoRecording:
            case ESpecifiedPrepareVideo:
                iAction = ENone;
                CTimer::After( KNormalTimingDelay );
                break;
            case EPrepareVideoRecordingWhenPrepared:
                if ( iStopWhenCompleted ) 
                    {
                    iStop = ETrue;
                    CTimer::After( KNormalTimingDelay );
                    }
                else 
                    {
                    iStopWhenCompleted = ETrue;
                    iCamAppEngine->PrepareVideoRecordingL( iVideoQualityLevelIndex );
                    }
                break;
            case ESpecifiedPrepareVideoWhenPrepared:
                if ( iStopWhenCompleted ) 
                    {
                    iStop = ETrue;
                    CTimer::After( KNormalTimingDelay );
                    }
                else 
                    {
                    iStopWhenCompleted = ETrue;
                    iCamAppEngine->PrepareVideoRecordingL( iVideoFrameSize, 
                                                           iVideoFrameRate, 
                                                           iVideoBitRate, 
                                                           iVideoAudioEnabled, 
                                                           *iMimeTypeSet[iVideoCodecSet], 
                                                           *iPreferredSupplierSet[iVideoCodecSet],
                                                           *iVideoTypeSet[iVideoCodecSet], 
                                                           *iAudioTypeSet[iVideoCodecSet] );
                    }
                break;
            case EPauseVideoWhenPrepared:
                iCamAppEngine->PauseVideoRecording();
                break;
            case EResumeVideoWhenPrepared:
                iCamAppEngine->ResumeVideoRecording();
                break;
            case EStopVideoRecordingWhenPrepared:
                iCamAppEngine->StopVideoRecording();
                break;
            case EStartVideoOpModeStopVf:
                iStopViewFinder = ETrue;
                CTimer::After( iTimeout );
                break;
            case EIsVideoRecordingWhenPrepared:
                iAction = ENone;
                {
                TBool isRecording = iCamAppEngine->IsVideoRecording();
                if ( isRecording ) 
                    {
                    User::Leave ( KErrGeneral );
                    }
                }
                break;
            case ERemainingTimeWhenVideoPrepared:
                {
                iAction = ENone;
                TTimeIntervalMicroSeconds remainingTime( 0 );
                remainingTime = iCamAppEngine->RemainingVideoRecordingTime();
                CTimer::After( KNormalTimingDelay );
                }
                break;
			case EDestroyEngineWhenVideoPrepareReady:
                delete iCamAppEngine;
                iCamAppEngine = NULL;
                CActiveScheduler::Stop();
			    break;
			    
// If interface after S60 2.1.
#ifndef CAE_INTERFACE_21
            case ESetColorToneVideoRecording:
                iCustomInterfacePointer = iCamAppEngine->CustomInterface( iCustomInterfaceUid );
                if ( !iCustomInterfacePointer )
                    {               // Interface not supported, exit test case
            	    #ifdef _DEBUG
                    RDebug::Print( _L( "Cae: CCaeTestStatesClient::RunTrappedL() CustomInterface returns 0 for uid %x" ), iCustomInterfaceUid.iUid );
                    #endif
                    iStop = ETrue;
                    CTimer::After( KNormalTimingDelay );
                    }
                else
                    {
                    MCameraColorToneSettings* CTptr = NULL;

                    // cast the TAny pointer to the real color tone interface pointer and
                    // read the bitfield of supported color tones. All of them are tested once.
                    CTptr = static_cast<MCameraColorToneSettings*> ( iCustomInterfacePointer );
                    iTestedColorTones = CTptr->SupportedColorTones();
                    record = ETrue;
                    }
				break;
#endif
            default:
                record = ETrue;
				break;
			}
        
        if ( record )
			{
            iVideoRecordingReady = EFalse;
            iVideoRecordingOn = EFalse;
            iVideoRecorded = ETrue;
	        #ifdef _DEBUG
            RDebug::Print( _L( "Cae: CCaeTestStatesClient: calling iCamAppEngine->StartVideoRecording()" ) );
            #endif
			iCamAppEngine->StartVideoRecording();
			}
		}
	else if ( iSnapImageReady )
	    {
	    iSnapImageReady = EFalse;

		switch ( iAction )
		    {
            case EPrepareAndCaptureAndCancelStillAtSnap: 
            case EPrepareAndCaptureAndCancelStillBurstAtSnap:
                iCamAppEngine->CancelCaptureStill();
                iCancelCount++;
                if ( iCancelCount == 1 )
                    {
                    iCountSnapImageReady--;
                    // To test that preparing does not ruin cancelling.
                    iCamAppEngine->PrepareStillCaptureL( iStillQualityLevelIndex ); 
                    }
                else 
                    {
                    iCountSnapImageReady++;
                    iStillCapturingOn = ETrue;
                    iStillCaptured = ETrue;
                    if ( iAction == EPrepareAndCaptureAndCancelStillAtSnap ) 
                        {
                        iRunlForStillImage = ETrue;
                        }
    			    iAction = ENone;
    			    iCamAppEngine->CaptureStill();
                    }
                break;
			case EDestroyEngineWhenSnapImageReady:
			case EDestroyEngineWhenSnapImageReadyInStillBurst:
			    iRunlForSnapImage = EFalse;
                delete iCamAppEngine;
                iCamAppEngine = NULL;
                CActiveScheduler::Stop();
			    break;
			default:
			    iRunlForSnapImage = EFalse;
			    break;
			}
	    }
	else if ( iStillCaptureReady )
	    {
	    iStillCaptureReady = EFalse;

		switch ( iAction )
		    {
            case EPrepareAndCaptureStill:
            case ESpecifiedPrepareAndCaptureStill:
            case ESpecifiedPrepareAndCaptureStill2nd:
            case ESetColorTone:
            case ESetColorToneWrongParams:
		    case ESetDisplayIndex:
                iAction = ENone;
                CTimer::After( KNormalTimingDelay );
			    break;
		    case ECaptureCapture:
		    case ESpecPrepCaptureCapture:
			    iAction = ENone;
                iStillCapturingOn = ETrue;
                iStillCaptured = ETrue;
			    iCamAppEngine->CaptureStill();
			    break;
            case ECaptureRecord:
                iStillPrepareReady = EFalse;
                iVideoPrepareReady = EFalse;
                iCamAppEngine->InitVideoRecorderL();
                iCamAppEngine->SetVideoRecordingFileNameL( iVideoFileName );
                iCamAppEngine->PrepareVideoRecordingL( iVideoQualityLevelIndex );
			    break;
		    case ERecordCaptureComplexSequence1:
		    case ERecordCaptureComplexSequence2:
                iVideoRecordingReady = ETrue;
                CTimer::After( KNormalTimingDelay );
                break;
            case EPrepareAndCaptureStillBurst:
            case EPrepareAndCaptureStillBurstExif:
            case EPrepareAndCaptureAndCancelStillBurstExif:
            case ESpecPrepAndCaptureStillBurst:
            case EPrepareAndCaptureAndCancelStillBurst:
            case EPrepareAndCaptureAndCancelStillBurstAtSnap:            
            case EPrepareAndCaptureAndStopStillBurst:
                break;
			case EDestroyEngineWhenStillCaptureReady:
			case EDestroyEngineWhenStillImageReadyInStillBurst:
                delete iCamAppEngine;
                iCamAppEngine = NULL;
                CActiveScheduler::Stop();
			    break;
		    default:
                iAction = ENone;
                iViewFindingUsed = ETrue;
	            #ifdef _DEBUG
                RDebug::Print( _L( "Cae: CCaeTestStatesClient: calling iCamAppEngine->StartViewFinderBitmapsL()" ) );
                #endif
                iCamAppEngine->StartViewFinderBitmapsL( iViewFinderSize );
                iStopViewFinder = ETrue;
                CTimer::After( iTimeout );
			    break;	
		    }
		    
		iRunlForStillImage = EFalse;
	    
	    }
	else if ( iStillBurstCaptureMoment ) 
        {
        iStillBurstCaptureMoment = EFalse;

		switch ( iAction )
		    {
            case EPrepareAndCaptureAndCancelStillBurstAtMoment:
                // Note: Cancelling is done in the callback.
                if ( iCancelCount == 1 )
                    {
                    // To test that preparing does not ruin cancelling.
                    // The burst emerging from this is also cancelled!
                    iCamAppEngine->PrepareStillCaptureL( iStillQualityLevelIndex ); 
                    }
                else 
                    {
    			    iAction = ENone;
                    iStillCapturingOn = ETrue;
                    iStillCaptured = ETrue;
                    // Do not cancel this burst!
                    iCancelStillBurst = EFalse;
    			    iCamAppEngine->CaptureStill();
                    }
                break;
			default:
			    break;
			}
        }
    else if ( iStillBurstReady )
	    {
        iStillBurstReady = EFalse;

		switch ( iAction )
		    {
            case EPrepareAndCaptureCaptureStillBurst:
            case ESpecPrepAndCaptureCaptureStillBurst:
			    iAction = ENone;
                iStillCapturingOn = ETrue;
                iStillCaptured = ETrue;
			    iCamAppEngine->CaptureStill();
			    break;
            case EPrepareAndCaptureStillBurstCaptureStill:
            case ESpecPrepAndCaptureStillBurstCaptureStill:
                // Re-set the image count to one to perform single image capture.
                iImageCountToCapture = iCamAppEngine->SetStillCaptureImageCountL( 1 );
                if ( iImageCountToCapture != 1 )
                    {
                    User::Leave( KErrGeneral );
                    }
			    iAction = ENone;
                iStillCapturingOn = ETrue;
                iStillCaptured = ETrue;
			    iCamAppEngine->CaptureStill();
			    break;
            case EPrepareAndCaptureStillBurst:
            case EPrepareAndCaptureStillBurstExif:
            case EPrepareAndCaptureAndCancelStillBurstExif:
            case ESpecPrepAndCaptureStillBurst:
            case EPrepareAndCaptureAndCancelStillBurst:
            case EPrepareAndCaptureAndStopStillBurst:
                iAction = ENone;
                iImageCountToCapture = iCamAppEngine->SetStillCaptureImageCountL( 1 );
                if ( iImageCountToCapture != 1 )
                    {
                    User::Leave( KErrGeneral );
                    }
                CTimer::After( KNormalTimingDelay );
			    break;	
		    case ERecordCaptureComplexSequence1:
		    case ERecordCaptureComplexSequence2:
                iVideoRecordingReady = ETrue;
                CTimer::After( KNormalTimingDelay );
                break;
			case EDestroyEngineWhenStillBurstReady:
                delete iCamAppEngine;
                iCamAppEngine = NULL;
                CActiveScheduler::Stop();
			    break;
		    default:
                iAction = ENone;
                iImageCountToCapture = iCamAppEngine->SetStillCaptureImageCountL( 1 );
                if ( iImageCountToCapture != 1 )
                    {
                    User::Leave( KErrGeneral );
                    }
                CTimer::After( KNormalTimingDelay );
			    break;	
		    }
        }
	else if ( iVideoRecordingOn )
	    {
	    
        switch ( iAction )
		    {
            case ESwitchPowerOnWhenRecordingVideo:
                iVideoRecordingOn = EFalse;
                iAction = ENone;
                iCamAppEngine->PowerOn();
                CTimer::After( KNormalTimingDelay );
                break;
            case ESwitchPowerOffWhenRecordingVideo:
                iVideoRecordingOn = EFalse;
                iAction = ENone;
                iCamAppEngine->PowerOff();
                CTimer::After( KNormalTimingDelay );
                break;
            case EPrepareRecordPauseStopVideo:
            case EPrepareRecordPauseResumeStopVideo:
                iVideoRecordingOn = EFalse;
                if ( !iVideoRecordingResumed ) 
                    {
                    iCamAppEngine->PauseVideoRecording();
                    }
                else 
                    {
                    iCamAppEngine->StopVideoRecording();
                    }
                break;
            case EPrepareRecordPausePauseStopVideo:
                iVideoRecordingOn = EFalse;
                if ( !iVideoRecordingResumed ) 
                    {
                    iCamAppEngine->PauseVideoRecording();
                    iCamAppEngine->PauseVideoRecording();
                    }
                else 
                    {
                    iCamAppEngine->StopVideoRecording();
                    }
                break;
            case EResumeVideoWhenNotPaused:
                iCamAppEngine->ResumeVideoRecording();
                break;
            case EStartVideoRecordingWhenRecording:
                iCamAppEngine->StartVideoRecording();
                break;
            case EIsVideoRecordingWhenRecording:
                iVideoRecordingOn = EFalse;
                iAction = ENone;
                {
                TBool isRecording = iCamAppEngine->IsVideoRecording();
                if ( !isRecording ) 
                    {
                    User::Leave ( KErrGeneral );
                    }
                }
                break;
            case EPrepareStillCaptureWhenRecording:
                iStillPrepareReady = EFalse;
                iVideoPrepareReady = EFalse;
                iCamAppEngine->PrepareStillCaptureL( iStillQualityLevelIndex );
                break;
			case EDestroyEngineWhenVideoRecordingOn:
                delete iCamAppEngine;
                iCamAppEngine = NULL;
                CActiveScheduler::Stop();
			    break;
            case EDestroyEngineWhenVideoRecordingPaused:
                iVideoRecordingOn = EFalse;
                iCamAppEngine->PauseVideoRecording();
                break;
                
// If interface after S60 2.1.
#ifndef CAE_INTERFACE_21
            case ESetColorToneVideoRecording:
                {
                    MCameraColorToneSettings* CTptr = NULL;

                    if ( iTestedColorTones == 0) // All colors tested?
                        {
                        //Set the default color tone and stop
                        CTptr = static_cast<MCameraColorToneSettings*> ( iCustomInterfacePointer );
                        CTptr->SetColorToneL( iColorToneValue );
                        iCamAppEngine->StopVideoRecording();
                        }
                    else
                        {
                        TInt i, nextColor;

                        // Find out next not tested color
                        for ( i = 0, nextColor = 0; i < 32; i++ )
                            {
                            nextColor = (1 << i);
                            if ( nextColor &  iTestedColorTones )
                                {
                                iTestedColorTones &= ~nextColor; // Remove this color (bit)
                                break;
                                }
                            }
                        // cast the TAny pointer to the real color tone interface pointer and
                        // then set the new color tone and verify that it has been set
                        CTptr = static_cast<MCameraColorToneSettings*> ( iCustomInterfacePointer );
                        CTptr->SetColorToneL( (MCameraColorToneSettings::TColorTone) nextColor );

                        if ( CTptr->ColorTone() == nextColor )
                            {
                            CTimer::After( iTimeout ); // all ok, continue video recording
                            }
                        else
                            {
                          	#ifdef _DEBUG
                            RDebug::Print( _L( "Cae: ESetColorToneVideoRecording: color not set to: %d" ), nextColor );
                            #endif
                            iStop = ETrue;
                            CTimer::After( KNormalTimingDelay );
                            }
                        }
                    break;
                }
#endif
            default:
                iCamAppEngine->StopVideoRecording();
			    break;	
		    }
	    }
	else if ( iVideoRecordingPaused )
	    {
        
        switch ( iAction )
		    {
            case EPrepareRecordPauseStopVideo:
            case EPrepareRecordPausePauseStopVideo:
                iStop = ETrue;
                iCamAppEngine->StopVideoRecording();
                break;
			case EDestroyEngineWhenVideoRecordingPaused:
                delete iCamAppEngine;
                iCamAppEngine = NULL;
                CActiveScheduler::Stop();
			    break;
		    default:
                iCamAppEngine->ResumeVideoRecording();
                iVideoRecordingResumed = ETrue;
			    break;	
		    }
	    }
	else if ( iVideoRecordingReady )
	    {
		switch ( iAction )
		    {
		    case ERecordRecord:
                iAction = EDefault;
			    iVideoRecordingReady = EFalse;
                iVideoRecordingOn = EFalse;
                iVideoRecorded = ETrue;
                // This leads to video prepare and then recording with the new name.
                iCamAppEngine->SetVideoRecordingFileNameL( iVideoFileName2 );
			    break;
            case ERecordCapture:
                iAction = EDefault;
                iStillPrepareReady = EFalse;
                iVideoPrepareReady = EFalse;
                iCamAppEngine->PrepareStillCaptureL( iStillQualityLevelIndex );
                break;
		    case ERecordCaptureComplexSequence1:
            	#ifdef _DEBUG
                RDebug::Print( _L( "Cae: ERecordCaptureComplexSequence1 case: %d" ), iActionCycle );
                #endif
			    iVideoRecordingReady = EFalse;
                iVideoRecordingOn = EFalse;
                iVideoRecorded = ETrue;
		        switch ( iActionCycle )
		            {
		            case 0:
                        // This leads to video prepare and then recording with the new name.
                        iCamAppEngine->SetVideoRecordingFileNameL( iVideoFileName2 );
                        break;
		            case 1:
                        // Accept video recording completion error because max clip size.
                        iAcceptVideoCompletionError = ETrue;
                        // This leads to video prepare and then recording with the previously given name.
                        iCamAppEngine->SetVideoClipMaxSizeL( iVideoMaxClipSizeInBytes );
                        break;
                    /*
		            case 2:
                        // This leads to video recording with the previous name.
                        iVideoPrepareReady = ETrue;
                        CTimer::After( KNormalTimingDelay );
                        break;
                    */
		            case 2:
                        // This leads to video prepare and then recording with the new name.
                        iCamAppEngine->SetVideoRecordingFileNameL( iVideoFileName3 );
                        break;
		            case 3:
		                // This leads to single still image capture.
                        iCamAppEngine->PrepareStillCaptureL( iStillQualityLevelIndex );
                        break;
		            case 4:
                        // Note, this is re-initialization of video recorder.
                        // Leads to video prepare and then recording with new name.
                        iAcceptVideoCompletionError = EFalse;
                        iCamAppEngine->InitVideoRecorderL();
                        iCamAppEngine->SetVideoRecordingFileNameL( iVideoFileName4 );
                        iCamAppEngine->PrepareVideoRecordingL( iVideoQualityLevelIndex );
                        break;
		            case 5:
		                // This leads to single still image capture.
                        iCamAppEngine->CloseVideoRecording();
                        iCamAppEngine->PrepareStillCaptureL( iStillQualityLevelIndex );
                        break;
		            case 6:
                        iCamAppEngine->SetVideoRecordingFileNameL( iVideoFileName );
                        // Accept video recording completion error because max clip size.
                        iAcceptVideoCompletionError = ETrue;
                        iCamAppEngine->SetVideoClipMaxSizeL( iVideoMaxClipSizeInBytes );
                        iCamAppEngine->PrepareVideoRecordingL( iVideoQualityLevelIndex );
                        break;
		            case 7:
                        // Note, this is re-initialization of the whole engine.
                        // Leads to video prepare and then recording with the original name.
                        iAcceptVideoCompletionError = EFalse;
                        iCamAppEngine->InitL();
                        break;
                    default:
                        iStop = ETrue;
                        CTimer::After( KNormalTimingDelay );
                        break;
                    }
                iActionCycle++;
                break;
		    case ERecordCaptureComplexSequence2:
            	#ifdef _DEBUG
                RDebug::Print( _L( "Cae: ERecordCaptureComplexSequence2 case: %d" ), iActionCycle );
                #endif
			    iVideoRecordingReady = EFalse;
                iVideoRecordingOn = EFalse;
                iVideoRecorded = ETrue;
		        switch ( iActionCycle )
		            {
		            case 0:
                        // This leads to still burst capture.
                        iImageCountToCapture = iCamAppEngine->SetStillCaptureImageCountL( iStillBurstLength );
                        iCamAppEngine->PrepareStillCaptureL( iStillQualityLevelIndex );
                        break;
		            case 1:
                        // This leads to single image capture.
                        iImageCountToCapture = iCamAppEngine->SetStillCaptureImageCountL( 1 );
                        iStillPrepareReady = ETrue;
                        CTimer::After( KNormalTimingDelay );
                        break;
		            case 2:
                        // This leads to single image capture.
                        iStillPrepareReady = ETrue;
                        CTimer::After( KNormalTimingDelay );
                        break;
		            case 3:
                        // This leads to still burst capture.
                        iImageCountToCapture = iCamAppEngine->SetStillCaptureImageCountL( iStillBurstLength );
                        iStillPrepareReady = ETrue;
                        CTimer::After( KNormalTimingDelay );
                        break;
		            case 4:
                        // This leads to video prepare and then recording with new name.
                        iCamAppEngine->SetVideoRecordingFileNameL( iVideoFileName2 );
                        break;
		            case 5:
		                // This leads to single image capture.
                        iCamAppEngine->CloseVideoRecording();
                        iImageCountToCapture = iCamAppEngine->SetStillCaptureImageCountL( 1 );
                        iCamAppEngine->PrepareStillCaptureL( iStillQualityLevelIndex );
                        break;
		            case 6:
		                // This leads to video prepare and then recording with new name.
                        iCamAppEngine->SetVideoRecordingFileNameL( iVideoFileName3 );
                        // Accept video recording completion error because max clip size.
                        iAcceptVideoCompletionError = ETrue;
                        iCamAppEngine->SetVideoClipMaxSizeL( iVideoMaxClipSizeInBytes );
                        iCamAppEngine->PrepareVideoRecordingL( iVideoQualityLevelIndex );
                        break;
		            case 7:
                        // This leads to video prepare and then recording with new name.
                        iCamAppEngine->SetVideoRecordingFileNameL( iVideoFileName4 );
                        break;
                    default:
                        iStop = ETrue;
                        CTimer::After( KNormalTimingDelay );
                        break;
                    }
                iActionCycle++;
                break;
			case EDestroyEngineWhenVideoRecordingReady:
                delete iCamAppEngine;
                iCamAppEngine = NULL;
                CActiveScheduler::Stop();
			    break;
		    default:
			    iAction = ENone;
                iVideoRecordingReady = EFalse;
                iStopViewFinder = ETrue;
                CTimer::After( KNormalTimingDelay );
			    break;	
		    }
	    }
    else if ( !iStillCaptured && !iVideoRecorded && !iVideoRecordingOn && !iStopViewFinder ) 
        {
        switch ( iAction )
		    {
            case EStartVfPrepareCaptureStillStartAndStopVf:
                if ( !iStillPrepareReady ) 
                    {
	                #ifdef _DEBUG
                    RDebug::Print( _L( "Cae: CCaeTestStatesClient: calling iCamAppEngine->PrepareStillCaptureL()" ) );
                    #endif
                    iCamAppEngine->PrepareStillCaptureL( iStillQualityLevelIndex );
                    }
                break;
            case EStartVfPrepareRecordVideoStartAndStopVf:
            case ESetColorToneVideoRecording:
                if ( !iVideoPrepareReady ) 
                    {
	                #ifdef _DEBUG
                    RDebug::Print( _L( "Cae: CCaeTestStatesClient: calling iCamAppEngine->PrepareVideoRecordingL()" ) );
                    #endif
                    iCamAppEngine->PrepareVideoRecordingL( iVideoQualityLevelIndex );
                    }
                break;
            case ESwitchPowerOffWhenVfRunning:
                iCamAppEngine->PowerOff();
                iStopViewFinder = ETrue;
                CTimer::After( KNormalTimingDelay );
                break;
            default:
			    break;
		    }
        }
	else if ( iStopViewFinder ) 
        {
	    #ifdef _DEBUG
        RDebug::Print( _L( "Cae: CCaeTestStatesClient: calling iCamAppEngine->StopViewFinder()" ) );
        #endif
        iCamAppEngine->StopViewFinder();
        // Test IsViewFinding()
        if ( iCamAppEngine->IsViewFinding() )
            {
            User::Leave( KErrGeneral );
            }
        // Test GetViewFinderSize()
        TSize sizeVF;
        iCamAppEngine->GetViewFinderSize( sizeVF );
        if ( sizeVF != iViewFinderSize )           
            {
            User::Leave ( KErrGetNotEqualToValuePreviouslySet );
            }

        iViewFinderStarted = EFalse;
        iAction = ENone;
        CTimer::After( KNormalTimingDelay );
        }

	#ifdef _DEBUG
    RDebug::Print( _L( "Cae: CCaeTestStatesClient::RunTrappedL() returning" ) );
    #endif
    }