camappengine/Engine/Src/CaeEngineImpStillAndVf.cpp
branchRCL_3
changeset 34 27fe719c32e6
parent 0 9b3e960ffc8a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/camappengine/Engine/Src/CaeEngineImpStillAndVf.cpp	Wed Sep 01 12:23:23 2010 +0100
@@ -0,0 +1,3029 @@
+/*
+* Copyright (c) 2002-2007 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:  Camera Application Engine implementation still capturing, 
+*                settings, and view finder methods
+*
+*/
+
+
+
+// INCLUDE FILES
+
+#include <fbs.h>                            // For CFbsBitmap
+
+#include "CaeEngineImp.h"                   // Engine implementation header.
+#include "CaeStillQualityLevels.h"          // For still capturing quality levels.
+#include "CaeVideoQualityLevels.h"          // Needed just in destructor.
+#include "CaeVideoTimes.h"                  // Needed just in destructor.
+#include "CaeStillStatesActive.h"                
+
+#ifdef CAE_TEST_VERSION
+#include "CaeEngineImpTestErrors.h"         // For TEST_VERSION compilation only
+#endif
+
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "CaeEngineImpStillAndVfTraces.h"
+#endif
+
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+
+// -----------------------------------------------------------------------------
+// CCaeEngine::NewL
+// Two-phased constructor. Calls CCaeEngineImp's NewL().
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CCaeEngine* CCaeEngine::NewL()
+    {
+    return CCaeEngineImp::NewL();
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::CCaeEngineImp
+// Default constructor.
+// -----------------------------------------------------------------------------
+//
+CCaeEngineImp::CCaeEngineImp(): 
+    iZoomMode( EZoomModeDigital ), 
+    iExposureMode( CCamera::EExposureAuto ),
+    iWhiteBalanceMode( CCamera::EWBAuto ), 
+    iFlashMode( CCamera::EFlashNone ),
+    iVideoTimesInterval( KVideoTimesIntervalDefault ), 
+    iMaxClipSizeInBytes( KMMFNoMaxClipSize ), 
+    iMaxClipSizeInBytesPrep( KMMFNoMaxClipSize )
+    {
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::~CCaeEngineImp
+// Destructor.
+// -----------------------------------------------------------------------------
+//
+CCaeEngineImp::~CCaeEngineImp()
+    {
+    LOGTEXT( _L( "Cae: CCaeEngineImp::~CCaeEngineImp() entering" ) );
+
+    // Cancels/closes/stops still capturing, video recording, and view finding.
+    CancelAllActivities();
+
+    // Delete extension implementations
+	iExtension.ResetAndDestroy();
+
+    // Delete the state machine
+    // Note: This must be done after destroying extensions because there is some
+    // validity checking in the iStillStatesActive destructor.
+    delete( iStillStatesActive );
+
+    // Delete interface implementation lists. 
+	// Close for each iImplementations before closing 
+	// iExtInterfaceImplementationLists.
+	for ( TInt i = 0; i < iExtInterfaceImplementationLists.Count(); i++ )
+		{
+		iExtInterfaceImplementationLists[i].iImplementations->Close();
+		delete( iExtInterfaceImplementationLists[i].iImplementations );
+		}
+	iExtInterfaceImplementationLists.Close();
+
+    // Delete custom interface list items
+	iExtCustomInterfaceImplementations.Close();
+
+    delete iVideoType;
+    delete iVideoClipFileName;
+
+    // Turn camera power off first, then release camera.
+    if ( iCamera ) 
+        {
+        if ( iReserved ) 
+            {
+            if ( iPowerOn ) 
+                {
+                iCamera->PowerOff();
+                }
+            iCamera->Release();
+            }
+        }
+
+    delete iVideoFrameSizePrep;
+    delete iVideoFrameSize;
+
+    delete iVideoTimes;
+    delete iVideoTimesCallback;
+    delete iVideoRecorder;
+
+    delete iVideoQualityLevelsCont;
+    delete iStillQualityLevelsCont;
+    
+    delete iCallbackActive;
+
+    delete iInfo;
+
+    delete iCamera;
+
+	REComSession::FinalClose();
+
+    LOGTEXT( _L( "Cae: CCaeEngineImp::~CCaeEngineImp() returning" ) );
+
+    // For RTRT code coverage analysis.
+    // #pragma attol insert _ATCPQ_DUMP(0);
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::ConstructL
+// Symbian 2nd phase constructor that can leave.
+// -----------------------------------------------------------------------------
+//
+void CCaeEngineImp::ConstructL( TInt aCameraIndex, TInt aDisplayIndex )
+    {
+    LOGTEXT2( _L( "Cae: CCaeEngineImp::ConstructL() entering with camera index %d" ), 
+    	aCameraIndex );
+    
+    OstTrace0( CAMERASRV_PERFORMANCE, CCAEENGINEIMP_CONSTRUCTL, "e_CAM_ENG_INIT 1" );   //CAE_ENGINE_INIT_START
+        
+    if ( ( aCameraIndex < 0 ) || 
+         ( aCameraIndex >= CCamera::CamerasAvailable() ) )
+        {
+        LOGTEXT2( _L( "Cae: CCaeEngineImp::ConstructL leaving KErrHardwareNotAvailable, aCameraIndex=%d" ), aCameraIndex );
+        User::Leave( KErrHardwareNotAvailable );
+        }
+
+    // Create a new Camera API implementation object, if supported
+    TRAPD( err, iCamera = CCamera::New2L( static_cast<MCameraObserver2&>(*this), aCameraIndex, KCameraPriority ) );
+    if ( err )
+        {
+        LOGTEXT2( _L( "Cae: CCaeEngineImp::ConstructL() CCamera::New2L return code=%d" ), err ); 
+
+        // Create old Camera API implementation object.
+        iCamera = CCamera::NewL( static_cast<MCameraObserver&>(*this), aCameraIndex );
+        LOGTEXT( _L( "Cae: CCaeEngineImp::ConstructL() using MCameraObserver" )); 
+        }
+    else
+        {
+        LOGTEXT( _L( "Cae: CCaeEngineImp::ConstructL() using MCameraObserver2" )); 
+        }
+
+
+    // Get camera handle.
+    iCameraHandle = iCamera->Handle();
+
+    // Set display index
+    iDisplayIndex = aDisplayIndex;
+
+    // Create and initialize info object.
+    iInfo = new( ELeave ) TCamAppEngineInfo;
+    InitializeInfo( *iCamera );
+
+    // Create active object for calling methods from callbacks.
+    iCallbackActive = CCaeCallbackActive::NewL( *this );
+
+    // Create still quality levels container object.
+    iStillQualityLevelsCont = CCaeStillQualityLevelsCont::NewL();
+
+    // Set default value for video recording stopping 
+    iAsyncVideoStopEnabled = EFalse;
+    
+	// Create interface lists. 
+	// The order of interface lists in iExtInterfaceImplementationLists
+	// should not be changed later as the order must always match to 
+	// TCaeExtensionInterfaceIndexes enum.
+	for ( TInt i = 0; KCaeSupportedExtensionInterfaceUids[i].iUid != NULL; i++ )
+		{
+		TCaeExtensionInterfaceImplListItem listItem;
+
+		RArray<TCaeExtensionInterfaceImplItem>* emptyImplementationArray = 
+			new(ELeave) RArray<TCaeExtensionInterfaceImplItem>(
+			TCaeExtensionInterfaceImplItemGranularity );
+
+		listItem.iInterfaceUid = KCaeSupportedExtensionInterfaceUids[i];
+		listItem.iImplementations = emptyImplementationArray; 
+		
+		// Copy the list item to the end of the list.Give ownership of 
+        // emptyImplementationArray.
+        CleanupStack::PushL( emptyImplementationArray );
+		iExtInterfaceImplementationLists.AppendL( listItem ); 
+        CleanupStack::Pop( emptyImplementationArray );
+		}
+
+    // Create the state machine for still capturing
+    iStillStatesActive = CCaeStillStatesActive::NewL( *iCamera, *iInfo,
+        *( iExtInterfaceImplementationLists[KCaeExtProcessImageInterfaceIndex].iImplementations  ) );
+
+	// Create extensions and populate the extension array 
+	PopulateExtensionArrayL();
+    
+    OstTrace0( CAMERASRV_PERFORMANCE, DUP1_CCAEENGINEIMP_CONSTRUCTL, "e_CAM_ENG_INIT 0" );  //CAE_ENGINE_INIT_END
+    
+    LOGTEXT( _L( "Cae: CCaeEngineImp::ConstructL() returning" ) );
+    }
+
+
+
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CCaeEngineImp* CCaeEngineImp::NewL()
+    {
+    LOGTEXT( _L( "Cae: CCaeEngineImp::NewL() entering" ) );
+
+    CCaeEngineImp* self = new( ELeave ) CCaeEngineImp();
+
+    CleanupStack::PushL( self );
+    self->ConstructL( 0, 0 ); // Construct with default camera index 0 and display index 0
+    CleanupStack::Pop( self );
+
+    LOGTEXT( _L( "Cae: CCaeEngineImp::NewL() returning" ) );
+
+    return self;
+    }
+
+    
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::PopulateExtensionArrayL
+// Get a list of extension implementations via ECom, construct the extensions and 
+// add those the the array.
+// -----------------------------------------------------------------------------
+//
+void CCaeEngineImp::PopulateExtensionArrayL()
+	{
+	LOGTEXT( _L( "Cae: CCaeEngineImp::PopulateExtensionArrayL() entering" ) );
+
+	// Get a list of all extensions from ECom
+	TEComResolverParams resolverParams;
+	resolverParams.SetDataType ( KExtensionTypeStringDesc );
+	resolverParams.SetWildcardMatch ( EFalse );
+	RImplInfoPtrArray implInfoArray;
+	REComSession::ListImplementationsL( KExtensionInterfaceUid, resolverParams, 
+		implInfoArray );
+	// This should be called only after ListImplementationsL
+	CleanupResetAndDestroyPushL( implInfoArray ); 
+    
+	LOGTEXT2( _L( "Cae: CCaeEngineImp::PopulateExtensionArrayL: extension count: %d" ),
+		implInfoArray.Count());
+	
+	// Create each extension via ECom and add it to the list 
+	for ( TInt i = 0; i < implInfoArray.Count(); i++ )
+		{		
+		MExtension* extension = NULL;
+		
+		// Trap the construction as if one extension fails to construct it 
+		// should not stop others from constructing
+    	LOGTEXT2( _L( "Cae: CCaeEngineImp::PopulateExtensionArrayL: load extension uid=%x" ),
+	    	implInfoArray[i]->ImplementationUid().iUid);
+		
+		TRAPD( error, extension = MExtension::NewExtensionL( 
+			implInfoArray[i]->ImplementationUid(), 
+			(MExtensionCallbackInterface*) this ));
+
+		if ( error || !extension)
+			{
+			// If one extension is failing we skip that.
+			#ifdef _DEBUG
+			TBuf<256> text;
+			text.Format(_L( "Cae: CCaeEngineImp::PopulateExtensionArrayL: NewExtensionL leaved, uid=%x, error=%d, extension=%x" ),
+				implInfoArray[i]->ImplementationUid().iUid, error, extension );
+			LOGTEXT( text );
+			#endif
+
+			delete( extension );
+			}
+		else
+			{
+			iExtension.AppendL( extension );
+			}
+		}
+
+	CleanupStack::PopAndDestroy( &implInfoArray );
+
+	LOGTEXT( _L( "Cae: CCaeEngineImp::PopulateExtensionArrayL() returning" ) );
+	}
+
+
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::SetCamAppEngineObserver
+// -----------------------------------------------------------------------------
+//
+void CCaeEngineImp::SetCamAppEngineObserver( MCamAppEngineObserver& aObserver )
+    {
+    LOGTEXT( _L( "Cae: CCaeEngineImp::SetCamAppEngineObserver()" ) );
+
+    iCaeObserver = &aObserver;
+    iStillStatesActive->SetCamAppEngineObserver( aObserver );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::GetInfo
+// -----------------------------------------------------------------------------
+//
+void CCaeEngineImp::GetInfo( TCamAppEngineInfo& aInfo ) const
+    {
+    LOGTEXT( _L( "Cae: CCaeEngineImp::GetInfo()" ) );
+ 
+    aInfo = *iInfo;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::InitL
+// Initialise the engine for still image capturing using default parameters.
+// -----------------------------------------------------------------------------
+//
+void CCaeEngineImp::InitL( TBool aCreateSnapImage )
+    {
+    LOGTEXT( _L( "Cae: CCaeEngineImp::InitL() entering" ) );
+
+    iStillStatesActive->SetSnapImageCreation( aCreateSnapImage );
+
+    // To allow re-initialization, release the camera (first cancels possible 
+    // activities and turns camera power off).
+    Release();
+
+    // Init to default quality levels.
+    iInfo->iNumStillQualityLevelsSupported = 
+        iStillQualityLevelsCont->InitDefaultsL();
+
+    // Reserve camera (and after succesfull reserve, camera power will be 
+    // turned on).
+
+    iResetToPreviousSettings = ETrue; // This requests here to set the camera
+                                      // to default settings after power is on.
+    iCamera->Reserve();
+
+    LOGTEXT( _L( "Cae: CCaeEngineImp::InitL() returning" ) );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::InitL
+// Initialise the engine for still image capturing either using default 
+// parameters or parameters from ini-file.
+// -----------------------------------------------------------------------------
+//
+void CCaeEngineImp::InitL( 
+    TUid aSdUidStillQltyLevels, 
+    TBool aCreateSnapImage )
+    {
+    if( aSdUidStillQltyLevels == KNullUid )
+        {
+        InitL( aCreateSnapImage );
+        }
+    else
+        {
+        LOGTEXT( _L( "Cae: CCaeEngineImp::InitL(aSdUidStillQltyLevels): NOT SUPPORTED, leaving" ) );
+        User::Leave( KErrNotSupported );
+        }
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::Reserve
+// Calls Camera API Reserve().
+// -----------------------------------------------------------------------------
+//
+void CCaeEngineImp::Reserve()
+    {
+    LOGTEXT( _L( "Cae: CCaeEngineImp::Reserve() entering" ) );
+
+    if ( !iReserved ) 
+        {
+        iResetToPreviousSettings = ETrue;
+        iCamera->Reserve();
+        }
+    else if ( !iPowerOn ) // in case previous reserve ok, but poweron failed
+        {
+        PowerOn();
+        }
+
+
+    LOGTEXT( _L( "Cae: CCaeEngineImp::Reserve() returning" ) );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::Release
+// Calls Camera API Release().
+// -----------------------------------------------------------------------------
+//
+void CCaeEngineImp::Release()
+    {
+    LOGTEXT( _L( "Cae: CCaeEngineImp::Release() entering" ) );
+
+    if ( iReserved ) 
+        {
+        PowerOff();         // Cancel all activities (if any) and turn power off.
+        iCamera->Release(); // Release Camera HW.
+        iReserved = EFalse;
+        iStillPrepared = EFalse;
+        iVideoPrepared = EFalse;
+        iVideoOpened = EFalse;
+        }
+
+    LOGTEXT( _L( "Cae: CCaeEngineImp::Release() returning" ) );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::PowerOn
+// Calls Camera API PowerOn().
+// -----------------------------------------------------------------------------
+//
+void CCaeEngineImp::PowerOn()
+    {
+    LOGTEXT( _L( "Cae: CCaeEngineImp::PowerOn() entering" ) );
+
+    if ( iReserved && !iPowerOn ) 
+        {
+        iCamera->PowerOn();
+        }
+
+    LOGTEXT( _L( "Cae: CCaeEngineImp::PowerOn() returning" ) );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::PowerOff
+// Calls Camera API PowerOff().
+// -----------------------------------------------------------------------------
+//
+void CCaeEngineImp::PowerOff()
+    {
+    LOGTEXT( _L( "Cae: CCaeEngineImp::PowerOff() entering" ) );
+
+    if ( iPowerOn ) 
+        {
+        CancelAllActivities();
+        iCamera->PowerOff();
+        iPowerOn = EFalse;
+        }
+
+    LOGTEXT( _L( "Cae: CCaeEngineImp::PowerOff() returning" ) );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::SetZoomModeL
+// -----------------------------------------------------------------------------
+//
+void CCaeEngineImp::SetZoomModeL( 
+    TZoomMode aZoomMode )
+    {
+    LOGTEXT( _L( "Cae: CCaeEngineImp::SetZoomModeL() entering" ) );
+
+    // Currently supporting digital and optical zooms, not EZoomModeOpticalDigital.
+    if ( ( aZoomMode != EZoomModeDigital ) && ( aZoomMode != EZoomModeOptical ) )
+        {
+        LOGTEXT2( _L( "Cae: CCaeEngineImp::SetZoomModeL leaving KErrNotSupported, aZoomMode=%d" ), aZoomMode );
+        User::Leave( KErrNotSupported );
+        }
+
+    iZoomMode = aZoomMode;
+
+    LOGTEXT( _L( "Cae: CCaeEngineImp::SetZoomModeL() returning" ) );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::ZoomMode
+// -----------------------------------------------------------------------------
+//
+CCaeEngine::TZoomMode CCaeEngineImp::ZoomMode() const
+    {
+    LOGTEXT( _L( "Cae: CCaeEngineImp::ZoomMode()" ) );
+
+    return iZoomMode;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::SetZoomValueL
+// Calls Camera API SetDigitalZoomFactorL() or SetZoomFactorL().
+// -----------------------------------------------------------------------------
+//
+void CCaeEngineImp::SetZoomValueL( 
+    TInt aZoomValue )
+    {
+    LOGTEXT( _L( "Cae: CCaeEngineImp::SetZoomValueL() entering" ) );
+
+    CheckPowerL();
+
+    switch ( iZoomMode )
+        {
+        case EZoomModeDigital:
+            // Leave if zoom factor is out of range.
+            if ( ( aZoomValue < 0 ) || 
+                 ( aZoomValue > iInfo->iMaxDigitalZoom ) )
+                {
+                LOGTEXT2( _L( "Cae: CCaeEngineImp::SetZoomValueL leaving KErrArgument, aZoomValue=%d" ), aZoomValue );
+                User::Leave( KErrArgument );
+                }
+            // Set DIGITAL zoom value.
+            iCamera->SetDigitalZoomFactorL( aZoomValue );
+            iZoomValue = aZoomValue;
+            break;
+        case EZoomModeOptical:
+            // Leave if zoom factor is out of range.
+            if ( ( aZoomValue < iInfo->iMinZoom ) || 
+                 ( aZoomValue > iInfo->iMaxZoom ) )
+                {
+                LOGTEXT2( _L( "Cae: CCaeEngineImp::SetZoomValueL leaving KErrArgument, aZoomValue=%d" ), aZoomValue );
+                User::Leave( KErrArgument );
+                }
+            // Set OPTICAL zoom value.
+            iCamera->SetZoomFactorL( aZoomValue );
+            iZoomValue = aZoomValue;
+            break;
+        default:
+            // EZoomModeOpticalDigital not supported
+            LOGTEXT2( _L( "Cae: CCaeEngineImp::SetZoomValueL leaving KErrNotSupported, iZoomMode=%d" ), iZoomMode );
+            User::Leave( KErrNotSupported );
+            break;
+        }
+
+    LOGTEXT( _L( "Cae: CCaeEngineImp::SetZoomValueL() returning" ) );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::ZoomValue
+// Calls Camera API DigitalZoomFactor() or ZoomFactor().
+// -----------------------------------------------------------------------------
+//
+TInt CCaeEngineImp::ZoomValue() const
+    {
+    LOGTEXT( _L( "Cae: CCaeEngineImp::ZoomValue()" ) );
+
+    TInt zoomValue( 0 );
+    if ( iPowerOn )
+        {
+        switch ( iZoomMode )
+            {
+            case EZoomModeDigital:
+                zoomValue = iCamera->DigitalZoomFactor();
+                break;
+            case EZoomModeOptical:
+                zoomValue = iCamera->ZoomFactor();
+                break;
+            default:
+                // EZoomModeOpticalDigital not supported
+                break;
+            }
+        }
+    return zoomValue;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::SetBrightnessL
+// Calls Camera API SetBrightnessL().
+// -----------------------------------------------------------------------------
+//
+void CCaeEngineImp::SetBrightnessL( 
+    TInt aBrightness )
+    {
+    LOGTEXT( _L( "Cae: CCaeEngineImp::SetBrightnessL() entering" ) );
+
+    // Leave if not supported.
+    if ( !( iInfo->iOptionsSupported & TCameraInfo::EBrightnessSupported ) )
+        {
+        LOGTEXT2( _L( "Cae: CCaeEngineImp::SetBrightnessL leaving KErrNotSupported, aBrightness=%d" ), aBrightness );
+        User::Leave( KErrNotSupported );
+        }
+
+    CheckPowerL();
+
+    iCamera->SetBrightnessL( aBrightness );
+    iBrightness = aBrightness;
+
+    LOGTEXT( _L( "Cae: CCaeEngineImp::SetBrightnessL() returning" ) );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::Brightness
+// Calls Camera API Brightness().
+// -----------------------------------------------------------------------------
+//
+TInt CCaeEngineImp::Brightness() const
+    {
+    LOGTEXT( _L( "Cae: CCaeEngineImp::Brightness()" ) );
+
+    TInt brightness( 0 );
+    if ( iPowerOn && ( iInfo->iOptionsSupported & TCameraInfo::EBrightnessSupported ) )
+        {
+        brightness = iCamera->Brightness();
+        }
+    return brightness;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::SetContrastL
+// Calls Camera API SetContrastL().
+// -----------------------------------------------------------------------------
+//
+void CCaeEngineImp::SetContrastL( 
+    TInt aContrast )
+    {
+    LOGTEXT( _L( "Cae: CCaeEngineImp::SetContrastL() entering" ) );
+
+    // Leave if not supported.
+    if ( !( iInfo->iOptionsSupported & TCameraInfo::EContrastSupported ) )
+        {
+        LOGTEXT2( _L( "Cae: CCaeEngineImp::SetContrastL leaving KErrNotSupported, aContrast=%d" ), aContrast );
+        User::Leave( KErrNotSupported );
+        }
+
+    CheckPowerL();
+
+    iCamera->SetContrastL( aContrast );
+    iContrast = aContrast;
+
+    LOGTEXT( _L( "Cae: CCaeEngineImp::SetContrastL() returning" ) );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::Contrast
+// Calls Camera API Contrast().
+// -----------------------------------------------------------------------------
+//
+TInt CCaeEngineImp::Contrast() const
+    {
+    LOGTEXT( _L( "Cae: CCaeEngineImp::Contrast()" ) );
+
+    TInt contrast( 0 );
+    if ( iPowerOn && ( iInfo->iOptionsSupported & TCameraInfo::EContrastSupported ) )
+        {
+        contrast = iCamera->Contrast();
+        }
+    return contrast;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::SetExposureModeL
+// Calls Camera API SetExposureModeL().
+// -----------------------------------------------------------------------------
+//
+void CCaeEngineImp::SetExposureModeL( 
+    CCamera::TExposure aExposureMode )
+    {
+    LOGTEXT( _L( "Cae: CCaeEngineImp::SetExposureModeL() entering" ) );
+
+    // Leave is requested exposure mode is not supported, 
+    // EExposureAuto should be always supported.
+    if ( ( ( aExposureMode != CCamera::EExposureAuto ) && 
+          !( aExposureMode & iInfo->iExposureModesSupported ) ) ||
+           ( aExposureMode < 0 ) )
+        {
+        LOGTEXT2( _L( "Cae: CCaeEngineImp::SetExposureModeL leaving KErrNotSupported, aExposureMode=%d" ), aExposureMode );
+        User::Leave( KErrNotSupported );
+        }
+
+    CheckPowerL();
+
+    iCamera->SetExposureL( aExposureMode );
+    iExposureMode = aExposureMode;
+
+    LOGTEXT( _L( "Cae: CCaeEngineImp::SetExposureModeL() returning" ) );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::ExposureMode
+// Calls Camera API Exposure().
+// -----------------------------------------------------------------------------
+//
+CCamera::TExposure CCaeEngineImp::ExposureMode() const
+    {
+    LOGTEXT( _L( "Cae: CCaeEngineImp::ExposureMode()" ) );
+
+    CCamera::TExposure exposureMode( CCamera::EExposureAuto );
+    if ( iPowerOn )
+        {
+        exposureMode = iCamera->Exposure();
+        }
+    return exposureMode;
+    }
+
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::SetEvCompensationL
+// If the interface exists, calls Camera API SetEvCompensationL().
+// -----------------------------------------------------------------------------
+//
+void CCaeEngineImp::SetEvCompensationL( 
+    TInt /*aEvIndex*/ )
+    {
+    LOGTEXT( _L( "Cae: CCaeEngineImp::SetEvCompensationL() (not supported) leaving" ) );
+
+    User::Leave( KErrNotSupported );
+    }
+
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::EvCompensation
+// If the interface exists, calls Camera API EvCompensation().
+// -----------------------------------------------------------------------------
+//
+TInt CCaeEngineImp::EvCompensation() const
+    {
+    LOGTEXT( _L( "Cae: CCaeEngineImp::EvCompensation() (not supported!)" ) );
+
+    return( 0 );
+    }
+
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::SetWhiteBalanceModeL
+// Calls Camera API SetWhiteBalanceL().
+// -----------------------------------------------------------------------------
+//
+void CCaeEngineImp::SetWhiteBalanceModeL( 
+    CCamera::TWhiteBalance aWhiteBalanceMode )
+    {
+    LOGTEXT( _L( "Cae: CCaeEngineImp::SetWhiteBalanceModeL() entering" ) );
+
+    // Leave is requested WB mode is not supported. 
+    // EWBAuto is always supported.
+    if ( ( ( aWhiteBalanceMode != CCamera::EWBAuto ) && 
+          !( aWhiteBalanceMode & iInfo->iWhiteBalanceModesSupported ) ) ||
+           ( aWhiteBalanceMode < 0 ) )
+        {
+        LOGTEXT2( _L( "Cae: CCaeEngineImp::SetWhiteBalanceModeL leaving KErrNotSupported, aWhiteBalanceMode=%d" ), aWhiteBalanceMode );
+        User::Leave( KErrNotSupported );
+        }
+    
+    CheckPowerL();
+
+    iCamera->SetWhiteBalanceL( aWhiteBalanceMode );
+    iWhiteBalanceMode = aWhiteBalanceMode;
+
+    LOGTEXT( _L( "Cae: CCaeEngineImp::SetWhiteBalanceModeL() returning" ) );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::WhiteBalanceMode
+// Calls Camera API WhiteBalance().
+// -----------------------------------------------------------------------------
+//
+CCamera::TWhiteBalance CCaeEngineImp::WhiteBalanceMode() const
+    {
+    LOGTEXT( _L( "Cae: CCaeEngineImp::WhiteBalanceMode()" ) );
+
+    CCamera::TWhiteBalance whiteBalanceMode( CCamera::EWBAuto );
+    if ( iPowerOn )
+        {
+        whiteBalanceMode = iCamera->WhiteBalance();
+        }
+    return whiteBalanceMode;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::SetFlashModeL
+// Calls Camera API SetFlashL().
+// -----------------------------------------------------------------------------
+//
+void CCaeEngineImp::SetFlashModeL( 
+    CCamera::TFlash aFlashMode )
+    {
+    LOGTEXT2( _L( "Cae: CCaeEngineImp::SetFlashModeL() entering, mode=%d" ), aFlashMode );
+
+    // Leave is requested flash mode is not supported. 
+    // EFlashNone is always supported.
+    if ( ( ( aFlashMode != CCamera::EFlashNone ) && 
+          !( aFlashMode & iInfo->iFlashModesSupported ) ) || 
+           ( aFlashMode < 0 ) )
+        {
+        LOGTEXT2( _L( "Cae: CCaeEngineImp::SetFlashModeL leaving KErrNotSupported, aFlashMode=%d" ), aFlashMode );
+        User::Leave( KErrNotSupported );
+        }
+
+    CheckPowerL();
+
+    iCamera->SetFlashL( aFlashMode );
+    iFlashMode = aFlashMode;
+
+    LOGTEXT( _L( "Cae: CCaeEngineImp::SetFlashModeL() returning" ) );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::FlashMode
+// Calls Camera API Flash().
+// -----------------------------------------------------------------------------
+//
+CCamera::TFlash CCaeEngineImp::FlashMode() const
+    {
+    LOGTEXT( _L( "Cae: CCaeEngineImp::FlashMode()" ) );
+
+    CCamera::TFlash flashMode( CCamera::EFlashNone );
+    if ( iPowerOn )
+        {
+        flashMode = iCamera->Flash();
+        }
+    return flashMode;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::ResetToDefaultsL
+// Resets the following settings: exposure mode, white balance mode, 
+// zoom mode, zoom value, flash mode, brightness, and contrast.
+// -----------------------------------------------------------------------------
+//
+void CCaeEngineImp::ResetToDefaultsL()
+    {
+    LOGTEXT( _L( "Cae: CCaeEngineImp::ResetToDefaultsL() entering" ) );
+
+    SetExposureModeL();
+    SetWhiteBalanceModeL();
+    SetZoomModeL();
+    SetZoomValueL();
+    SetFlashModeL();
+
+    // Reset this setting only if it is supported by Camera API.
+    if ( iInfo->iOptionsSupported & TCameraInfo::EBrightnessSupported )
+        {
+        SetBrightnessL();
+        }
+
+    // Reset this setting only if it is supported by Camera API.
+    if ( iInfo->iOptionsSupported & TCameraInfo::EContrastSupported )
+        {
+        SetContrastL();
+        }
+
+ 	// Process extensions
+	RArray<TCaeExtensionInterfaceImplItem>* settingsImplementationList = 
+		iExtInterfaceImplementationLists[KCaeExtSettingsInterfaceIndex].iImplementations;
+
+	for ( TInt i = 0; i < settingsImplementationList->Count(); i++ )
+		{
+		TRAPD(err, STATIC_CAST( MCaeExtSettingsInterface*, 
+		(*settingsImplementationList)[i].iImplPtr )->ResetToDefaultsL() );
+
+	    #ifdef _DEBUG
+		if ( err )
+		    {
+			LOGTEXT3(_L("Cae: CCaeEngineImp::ResetToDefaultsL(). Error %d in ResetToDefaultsL() for Extension %x"),
+			    err, (*settingsImplementationList)[i].iImplUid.iUid );
+			}
+		#endif
+		
+		User::LeaveIfError( err ); 
+		}
+
+   LOGTEXT( _L( "Cae: CCaeEngineImp::ResetToDefaultsL() returning" ) );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::SetViewFinderMirrorL
+// Calls Camera API SetViewFinderMirrorL().
+// -----------------------------------------------------------------------------
+//
+void CCaeEngineImp::SetViewFinderMirrorL( 
+    TBool aMirror )
+    {
+    LOGTEXT( _L( "Cae: CCaeEngineImp::SetViewFinderMirrorL() entering" ) );
+
+    // Leave if not supported.
+    if ( !( iInfo->iOptionsSupported & TCameraInfo::EViewFinderMirrorSupported ) )
+        {
+        LOGTEXT2( _L( "Cae: CCaeEngineImp::SetViewFinderMirrorL leaving KErrNotSupported, aMirror=%d" ), aMirror );
+        User::Leave( KErrNotSupported );
+        }
+        
+    CheckPowerL();
+
+    iCamera->SetViewFinderMirrorL( aMirror );    
+
+    LOGTEXT( _L( "Cae: CCaeEngineImp::SetViewFinderMirrorL() returning" ) );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::ViewFinderMirror
+// Calls Camera API ViewFinderMirror().
+// -----------------------------------------------------------------------------
+//
+TBool CCaeEngineImp::ViewFinderMirror() const
+    {
+    LOGTEXT( _L( "Cae: CCaeEngineImp::ViewFinderMirror()" ) );
+
+    // If supported, query the setting from Camera API.
+    TBool viewFinderMirror( EFalse );
+    if ( iPowerOn && ( iInfo->iOptionsSupported & TCameraInfo::EViewFinderMirrorSupported ) )
+        {
+        viewFinderMirror = iCamera->ViewFinderMirror();
+        }
+    return viewFinderMirror;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::StartViewFinderBitmapsL
+// Calls Camera API StartViewFinderBitmapsL().
+// -----------------------------------------------------------------------------
+//
+void CCaeEngineImp::StartViewFinderBitmapsL( 
+    TSize& aVfFrameSize )
+    {
+    LOGTEXT3( _L( "Cae: CCaeEngineImp::StartViewFinderBitmapsL() entering aVfFrameSize wxh=%dx%d" ),
+            aVfFrameSize.iWidth, aVfFrameSize.iHeight );
+
+    // Leave if not supported.
+    if ( !( iInfo->iOptionsSupported & TCameraInfo::EViewFinderBitmapsSupported ) )
+        {
+        LOGTEXT( _L( "Cae: CCaeEngineImp::StartViewFinderBitmapsL leaving KErrNotSupported" ));
+        User::Leave( KErrNotSupported );
+        }
+
+    if ( iPowerOn ) 
+        {
+        if ( !iCamera->ViewFinderActive() ) 
+            {
+            iTrueViewFinderSize = aVfFrameSize;
+            iCamera->StartViewFinderBitmapsL( iTrueViewFinderSize );
+            iViewFinderRunning = ETrue;
+            iStillStatesActive->SetViewFinderMode( iViewFinderRunning );
+            }
+        }
+
+    if ( !iViewFinderRunning )
+        {
+        LOGTEXT( _L( "Cae: CCaeEngineImp::StartViewFinderBitmapsL leaving KErrNotReady (iViewFinderRunning)" ));
+        User::Leave( KErrNotReady );
+        }
+
+    LOGTEXT( _L( "Cae: CCaeEngineImp::StartViewFinderBitmapsL() returning" ) );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::StartViewFinderBitmapsL
+// Cropped version.
+// Calls Camera API StartViewFinderBitmapsL().
+// -----------------------------------------------------------------------------
+//
+void CCaeEngineImp::StartViewFinderBitmapsL( 
+    TSize& aVfFrameSize, 
+    TRect& aCropRect )
+    {
+    LOGTEXT3( _L( "Cae: CCaeEngineImp::StartViewFinderBitmapsL() entering aVfFrameSize wxh=%dx%d" ),
+            aVfFrameSize.iWidth, aVfFrameSize.iHeight );
+
+    // Leave if not supported.
+    if ( !( iInfo->iOptionsSupported & TCameraInfo::EViewFinderBitmapsSupported ) || 
+         !( iInfo->iOptionsSupported & TCameraInfo::EViewFinderClippingSupported )  )
+        {
+        LOGTEXT( _L( "Cae: CCaeEngineImp::StartViewFinderBitmapsL (cropped) leaving KErrNotSupported" ));
+        User::Leave( KErrNotSupported );
+        }
+
+    if ( iPowerOn ) 
+        {
+        if ( !iCamera->ViewFinderActive() ) 
+            {
+            iTrueViewFinderSize = aVfFrameSize;
+            iCamera->StartViewFinderBitmapsL( iTrueViewFinderSize, aCropRect );
+            iViewFinderRunning = ETrue;
+            iStillStatesActive->SetViewFinderMode( iViewFinderRunning );
+            }
+        }
+
+    if ( !iViewFinderRunning )
+        {
+        LOGTEXT( _L( "Cae: CCaeEngineImp::StartViewFinderBitmapsL (cropped) leaving KErrNotReady" ));
+        User::Leave( KErrNotReady );
+        }
+
+    LOGTEXT( _L( "Cae: CCaeEngineImp::StartViewFinderBitmapsL() returning" ) );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::StartViewFinderDirectL
+// Calls Camera API StartViewFinderDirectL().
+// -----------------------------------------------------------------------------
+//
+void CCaeEngineImp::StartViewFinderDirectL( 
+    RWsSession& aWs, 
+    CWsScreenDevice& aScreenDevice, 
+    RWindowBase& aWindow, 
+    TRect& aScreenRect )
+    {
+    LOGTEXT( _L( "Cae: CCaeEngineImp::StartViewFinderDirectL() entering" ) );
+
+    // Leave if not supported.
+    if ( !( iInfo->iOptionsSupported & TCameraInfo::EViewFinderDirectSupported ) )
+        {
+        LOGTEXT2( _L( "Cae: CCaeEngineImp::StartViewFinderDirectL leaving KErrNotSupported, iOptionsSupported=0x%x" ), iInfo->iOptionsSupported );
+        User::Leave( KErrNotSupported );
+        }
+
+    if ( iPowerOn )
+        {
+        if ( !iCamera->ViewFinderActive() )
+            {
+            iCamera->StartViewFinderDirectL( aWs, aScreenDevice, aWindow, aScreenRect );
+            iViewFinderRunning = ETrue;
+            iStillStatesActive->SetViewFinderMode( iViewFinderRunning );
+            }
+        }
+    
+    if ( !iViewFinderRunning )
+        {
+        LOGTEXT( _L( "Cae: CCaeEngineImp::StartViewFinderDirectL leaving KErrNotReady" ));
+        User::Leave( KErrNotReady );
+        }
+
+    LOGTEXT( _L( "Cae: CCaeEngineImp::StartViewFinderDirectL() returning" ) );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::StartViewFinderDirectL
+// Cropped version.
+// Calls Camera API StartViewFinderDirectL().
+// -----------------------------------------------------------------------------
+//
+void CCaeEngineImp::StartViewFinderDirectL( 
+    RWsSession& aWs,
+    CWsScreenDevice& aScreenDevice,
+    RWindowBase& aWindow,
+    TRect& aScreenRect,
+    TRect& aCropRect )
+    {
+    LOGTEXT( _L( "Cae: CCaeEngineImp::StartViewFinderDirectL() entering" ) );
+
+    // Leave if not supported.
+    if ( !( iInfo->iOptionsSupported & TCameraInfo::EViewFinderDirectSupported ) || 
+         !( iInfo->iOptionsSupported & TCameraInfo::EViewFinderClippingSupported ) )
+        {
+        LOGTEXT2( _L( "Cae: CCaeEngineImp::StartViewFinderDirectL (cropped) leaving KErrNotSupported, iOptionsSupported=0x%x" ), iInfo->iOptionsSupported );
+        User::Leave( KErrNotSupported );
+        }
+
+    if ( iPowerOn )
+        {
+        if ( !iCamera->ViewFinderActive() )
+            {
+            iCamera->StartViewFinderDirectL( aWs, aScreenDevice, aWindow, aScreenRect, aCropRect );
+            iViewFinderRunning = ETrue;
+            iStillStatesActive->SetViewFinderMode( iViewFinderRunning );
+           }
+        }
+
+    if ( !iViewFinderRunning )
+        {
+        LOGTEXT( _L( "Cae: CCaeEngineImp::StartViewFinderDirectL (cropped) leaving KErrNotReady" ));
+        User::Leave( KErrNotReady );
+        }
+
+    LOGTEXT( _L( "Cae: CCaeEngineImp::StartViewFinderDirectL() returning" ) );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::StopViewFinder
+// Calls Camera API ViewFinderActive() and StopViewFinder().
+// -----------------------------------------------------------------------------
+//
+void CCaeEngineImp::StopViewFinder()
+    {
+    LOGTEXT( _L( "Cae: CCaeEngineImp::StopViewFinder() entering" ) );
+
+    if ( iPowerOn )
+        {
+        if ( iCamera->ViewFinderActive() )
+            {
+            iCamera->StopViewFinder();
+            iViewFinderRunning = EFalse;
+            iStillStatesActive->SetViewFinderMode( iViewFinderRunning );
+            }
+        }
+
+    LOGTEXT( _L( "Cae: CCaeEngineImp::StopViewFinder() returning" ) );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::IsViewFinding
+// Calls Camera API ViewFinderActive().
+// -----------------------------------------------------------------------------
+//
+TBool CCaeEngineImp::IsViewFinding() const
+    {
+    LOGTEXT( _L( "Cae: CCaeEngineImp::IsViewFinding()" ) );
+
+    TBool isViewFinding( EFalse );
+    if ( iPowerOn ) 
+        {
+        isViewFinding = iCamera->ViewFinderActive();
+        }
+    return isViewFinding;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::GetViewFinderSize
+// -----------------------------------------------------------------------------
+//
+void CCaeEngineImp::GetViewFinderSize( 
+    TSize& aVfFrameSize )
+    {
+    LOGTEXT( _L( "Cae: CCaeEngineImp::GetViewFinderSize()" ) );
+
+    aVfFrameSize = iTrueViewFinderSize;
+    }
+
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::SetCaeStillBurstObserver
+// -----------------------------------------------------------------------------
+//
+void CCaeEngineImp::SetCaeStillBurstObserver( 
+    MCaeStillBurstObserver& aObserver )
+    {
+    iStillStatesActive->SetCaeStillBurstObserver( aObserver );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::SetStillCaptureImageCountL
+// -----------------------------------------------------------------------------
+//
+TInt CCaeEngineImp::SetStillCaptureImageCountL( 
+    TInt aImageCount )
+    {
+    return ( iStillStatesActive->SetStillCaptureImageCountL( aImageCount ) );
+    }
+
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::StillCaptureImageCount
+// -----------------------------------------------------------------------------
+//
+TInt CCaeEngineImp::StillCaptureImageCount() const
+    {
+    return ( iStillStatesActive->StillCaptureImageCount() );
+    }
+
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::SetStillBurstCaptureIntervalL
+// -----------------------------------------------------------------------------
+//
+void CCaeEngineImp::SetStillBurstCaptureIntervalL( 
+    TTimeIntervalMicroSeconds aInterval )
+    {
+    iStillStatesActive->SetStillBurstCaptureIntervalL( aInterval );
+    }
+
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::StillBurstCaptureInterval
+// -----------------------------------------------------------------------------
+//
+TTimeIntervalMicroSeconds CCaeEngineImp::StillBurstCaptureInterval() const 
+    {
+    return ( iStillStatesActive->StillBurstCaptureInterval() );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::StopStillBurstCapture
+// -----------------------------------------------------------------------------
+//
+void CCaeEngineImp::StopStillBurstCapture()
+    {
+    iStillStatesActive->StopStillBurstCapture();
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::StillBurstSupport()
+// Return option flag for still burst support.
+// -----------------------------------------------------------------------------
+//
+TCamAppEngineInfo::TOptions CCaeEngineImp::StillBurstSupport()
+    {
+    return TCamAppEngineInfo::EStillBurstSupported;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::PrepareStillCaptureL
+// Retrieves parameters for the specified quality level and calls 
+// overloading PrepareStillCaptureL().
+// -----------------------------------------------------------------------------
+//
+void CCaeEngineImp::PrepareStillCaptureL( 
+    TInt aStillQualityIndex )
+    {
+    TSize size = iStillStatesActive->SnapImageSize();
+    PrepareStillCaptureL( aStillQualityIndex, size);
+    }
+
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::PrepareStillCaptureL
+// Retrieves parameters for the specified quality level and calls 
+// overloading PrepareStillCaptureL().
+// -----------------------------------------------------------------------------
+//
+void CCaeEngineImp::PrepareStillCaptureL( 
+    TInt         aStillQualityIndex, 
+    TSize&       aSnapSize )
+    {
+    LOGTEXT3( _L( "Cae: CCaeEngineImp::PrepareStillCaptureL() entering aSnapSize wxh=%dx%d" ),
+            aSnapSize.iWidth, aSnapSize.iHeight );
+
+    if ( aStillQualityIndex < 0 || 
+         aStillQualityIndex >= iStillQualityLevelsCont->Count() ) 
+        {
+        LOGTEXT2( _L( "Cae: CCaeEngineImp::PrepareStillCaptureL leaving KErrArgument, aStillQualityIndex=%d" ), aStillQualityIndex );
+        User::Leave( KErrArgument );
+        }
+
+    TSize frameSize         = iStillQualityLevelsCont->At( aStillQualityIndex ).iFrameSize;
+    CCamera::TFormat format = iStillQualityLevelsCont->At( aStillQualityIndex ).iOutputFormat;
+    TInt compressionQuality = iStillQualityLevelsCont->At( aStillQualityIndex ).iCompressionQuality;
+    TRect fullRect( frameSize );
+    
+    PrepareStillCaptureL( frameSize, format, compressionQuality, fullRect, aSnapSize );
+    
+    iStillQualityIndex = aStillQualityIndex;
+
+    LOGTEXT( _L( "Cae: CCaeEngineImp::PrepareStillCaptureL() returning" ) );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::PrepareStillCaptureL
+// Cropped version.
+// Not supported.
+// -----------------------------------------------------------------------------
+//
+void CCaeEngineImp::PrepareStillCaptureL( 
+    TInt /*aStillQualityIndex*/, 
+    const TRect& /*aCropRect*/ )
+    {
+    LOGTEXT( _L( "Cae: CCaeEngineImp::PrepareStillCaptureL() cropped leaving KErrNotSupported" ) );
+
+    User::Leave( KErrNotSupported );
+    }
+
+
+
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::PrepareStillCaptureL
+// -----------------------------------------------------------------------------
+//
+void CCaeEngineImp::PrepareStillCaptureL( 
+    const TSize&      aFrameSize,
+    CCamera::TFormat  aFormat,  
+    TInt              aCompressionQuality )
+    {    
+    TRect fullRect( aFrameSize );
+    PrepareStillCaptureL( aFrameSize, aFormat, aCompressionQuality, fullRect );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::PrepareStillCaptureL
+// Cropped version. Using cropping only if supported by Camera API impl.
+// Calls RetrieveStillSizeIndex() that calls Camera API EnumerateCaptureSizes().
+// Calls Camera API PrepareImageCaptureL().
+// Optionally calls Camera API SetJpegQuality().
+// Finally calls McaeoStillPrepareComplete call-back.
+// -----------------------------------------------------------------------------
+//
+void CCaeEngineImp::PrepareStillCaptureL( 
+    const TSize&      aFrameSize, 
+    CCamera::TFormat  aFormat, 
+    TInt              aCompressionQuality, 
+    const TRect&      aCropRect )
+    {
+    TSize snapSize = iStillStatesActive->SnapImageSize();
+    PrepareStillCaptureL(aFrameSize, aFormat, aCompressionQuality, aCropRect, snapSize );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::PrepareStillCaptureL
+// Cropped version. Using cropping only if supported by Camera API impl.
+// Calls RetrieveStillSizeIndex() that calls Camera API EnumerateCaptureSizes().
+// Calls Camera API PrepareImageCaptureL().
+// Optionally calls Camera API SetJpegQuality().
+// Finally calls McaeoStillPrepareComplete call-back.
+// -----------------------------------------------------------------------------
+//
+void CCaeEngineImp::PrepareStillCaptureL( 
+    const TSize&      aFrameSize, 
+    CCamera::TFormat  aFormat, 
+    TInt              aCompressionQuality, 
+    const TRect&      aCropRect,
+    TSize&            aSnapSize )
+    {
+    LOGTEXT3( _L( "Cae: CCaeEngineImp::PrepareStillCaptureL() entering aFrameSize wxh=%dx%d" ),
+            aFrameSize.iWidth, aFrameSize.iHeight );
+
+    OstTrace0( CAMERASRV_PERFORMANCE, CCAEENGINEIMP_PREPARESTILLCAPTUREL, "e_CAM_ENG_STILL_INIT 1" );   //CAE_ENGINE_STILL_INIT_START
+
+    // Leave if not supported.
+    if ( !( iInfo->iOptionsSupported & TCameraInfo::EImageCaptureSupported ) )
+        {
+        LOGTEXT( _L( "Cae: CCaeEngineImp::PrepareStillCaptureL() leaving KErrNotSupported (EImageCaptureSupported)" ) );
+        User::Leave( KErrNotSupported );
+        }
+
+    CheckPowerL();
+
+    // Leave if still capturing or video recording is running.
+    if ( iStillStatesActive->IsRunning() || iVideoRecordingRunning ) 
+        {
+        LOGTEXT( _L( "Cae: CCaeEngineImp::PrepareStillCaptureL() leaving KErrNotReady (IsRunning)" ) );
+        User::Leave( KErrNotReady );
+        }
+
+    if ( ( aFormat == CCamera::EFormatJpeg ) || ( aFormat == CCamera::EFormatExif ) ) 
+        {
+    	SetJpegQuality( aCompressionQuality ); 
+        }
+    
+    iStillStatesActive->PrepareStillCaptureL( aFrameSize, aFormat, aCropRect, aSnapSize );
+
+    // Prepare ready now.
+    iStillPrepared = ETrue;
+
+    OstTrace0( CAMERASRV_PERFORMANCE, DUP1_CCAEENGINEIMP_PREPARESTILLCAPTUREL, "e_CAM_ENG_STILL_INIT 0" );  //CAE_ENGINE_STILL_INIT_END
+
+    // Inform client about the success.
+    iCaeObserver->McaeoStillPrepareComplete( KErrNone );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::StillQualityIndex
+// -----------------------------------------------------------------------------
+//
+TInt CCaeEngineImp::StillQualityIndex() const
+    {
+    LOGTEXT( _L( "Cae: CCaeEngineImp::StillQualityIndex()" ) );    
+
+    TInt qualityIndex( -1 );
+    if ( iStillPrepared )
+        {
+        qualityIndex = iStillQualityIndex;
+        }
+    return qualityIndex;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::GetStillFrameSize
+// -----------------------------------------------------------------------------
+//
+void CCaeEngineImp::GetStillFrameSize( 
+    TInt aStillQualityIndex, 
+    TSize& aFrameSize ) const
+    {
+    LOGTEXT( _L( "Cae: CCaeEngineImp::GetStillFrameSize()" ) );
+    
+    if ( aStillQualityIndex >= 0 &&  
+         aStillQualityIndex < iStillQualityLevelsCont->Count() )
+        {
+        aFrameSize = iStillQualityLevelsCont->At( aStillQualityIndex ).iFrameSize;
+        }
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::EstimatedStillSizeInBytes
+// -----------------------------------------------------------------------------
+//
+TInt CCaeEngineImp::EstimatedStillSizeInBytes( 
+    TInt aStillQualityIndex ) const
+    {
+    LOGTEXT( _L( "Cae: CCaeEngineImp::EstimatedStillSizeInBytes()" ) );
+
+    TInt byteSize( 0 );
+    if ( aStillQualityIndex >= 0 &&  
+         aStillQualityIndex < iStillQualityLevelsCont->Count() )
+        {
+        byteSize = iStillQualityLevelsCont->At( aStillQualityIndex ).iByteSize;
+        }
+    return byteSize;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::CaptureStill
+// Starts still capturing.
+// -----------------------------------------------------------------------------
+//
+void CCaeEngineImp::CaptureStill()
+    {
+    LOGTEXT( _L( "Cae: CCaeEngineImp::CaptureStill() entering" ) );
+
+    OstTrace0( CAMERASRV_PERFORMANCE, CCAEENGINEIMP_CAPTURESTILL, "e_CAM_ENG_SHOT_TO_STILL 1" );    //CAE_ENGINE_SHOT_TO_STILL_START
+
+    if ( !iStillStatesActive->IsRunning() ) 
+        {
+        if ( iStillPrepared && iPowerOn && !iVideoRecordingRunning ) 
+            {
+                // Call CAPI without active object delay (for perf reasons)
+                iStillStatesActive->StartQuickCapture();
+
+            }
+        else
+            {
+            // Handle error
+            iStillStatesActive->ErrorRecovery( KErrNotReady );
+            }    
+        }
+
+    LOGTEXT( _L( "Cae: CCaeEngineImp::CaptureStill() returning" ) );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::CancelCaptureStill
+// -----------------------------------------------------------------------------
+//
+void CCaeEngineImp::CancelCaptureStill()
+    {
+    LOGTEXT( _L( "Cae: CCaeEngineImp::CancelCaptureStill() entering" ) );
+
+    if ( iStillStatesActive ) 
+        {
+        iStillStatesActive->CancelCaptureStill();
+        }
+
+    if ( iCallbackActive ) 
+        {
+        iCallbackActive->Cancel();
+        }
+
+    if ( iCamera ) 
+        {
+        iCamera->CancelCaptureImage();
+        }
+
+    LOGTEXT( _L( "Cae: CCaeEngineImp::CancelCaptureStill() returning" ) );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::SetSnapImageCreation
+// Sets snap image creation on/off.
+// -----------------------------------------------------------------------------
+//
+void CCaeEngineImp::SetSnapImageCreation( 
+    TBool aCreateSnapImage )
+    {
+    iStillStatesActive->SetSnapImageCreation( aCreateSnapImage );
+    }
+
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::SetSnapImageSource
+// Sets snap image source.
+// -----------------------------------------------------------------------------
+//
+void CCaeEngineImp::SetSnapImageSourceL( 
+    CCaeEngine::TSnapImageSource aSnapImageSource )
+    {
+    iStillStatesActive->SetSnapImageSourceL( aSnapImageSource );
+    }
+
+
+// -----------------------------------------------------------------------------
+
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::SetSnapImageSizeL
+// Sets the size of the snap image.
+// -----------------------------------------------------------------------------
+//
+void CCaeEngineImp::SetSnapImageSizeL( 
+    TSize& aSize )
+    {
+    iStillStatesActive->SetSnapImageSizeL( aSize );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::SetSnapImageColorMode
+// Sets the color mode of the snap image.
+// -----------------------------------------------------------------------------
+//
+void CCaeEngineImp::SetSnapImageColorMode( 
+    TDisplayMode aMode )
+    {
+    iStillStatesActive->SetSnapImageColorMode( aMode );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCaeEngine::NewL
+// Two-phased constructor. Calls CCaeEngineImp's NewL() with camera index and
+// default display index 0.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CCaeEngine* CCaeEngine::NewL( 
+    TInt aCameraIndex )
+    {
+    return CCaeEngineImp::NewL( aCameraIndex, 0 );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCaeEngine::NewL
+// Two-phased constructor. Calls CCaeEngineImp's NewL() with camera index.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CCaeEngine* CCaeEngine::NewL( 
+    TInt aCameraIndex, TInt aDisplayIndex )
+    {
+    return CCaeEngineImp::NewL( aCameraIndex, aDisplayIndex );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCaeEngine::CamerasAvailable
+// Determines the number of cameras on the device.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CCaeEngine::CamerasAvailable()
+    {
+    LOGTEXT2( _L( "Cae: CCaeEngine::CamerasAvailable(): %d" ), CCamera::CamerasAvailable() );
+    return CCamera::CamerasAvailable();
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::NewL
+// Two-phased constructor. Inputs camera index.
+// -----------------------------------------------------------------------------
+//
+CCaeEngineImp* CCaeEngineImp::NewL( 
+    TInt aCameraIndex, TInt aDisplayIndex )
+    {
+    LOGTEXT2( _L( "Cae: CCaeEngineImp::NewL() entering with camera index %d" ), aCameraIndex );
+
+    CCaeEngineImp* self = new( ELeave ) CCaeEngineImp();
+
+    CleanupStack::PushL( self );
+    self->ConstructL( aCameraIndex, aDisplayIndex );
+    CleanupStack::Pop( self );
+
+    LOGTEXT( _L( "Cae: CCaeEngineImp::NewL() returning" ) );
+
+    return self;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::EnumerateStillCaptureSizes
+// Enumerates through the available image capture sizes.
+// Calls Camera API EnumerateCaptureSizes().
+// -----------------------------------------------------------------------------
+//
+void CCaeEngineImp::EnumerateStillCaptureSizes( 
+    TSize& aSize, 
+    TInt aSizeIndex, 
+    CCamera::TFormat aFormat ) const
+    {
+    LOGTEXT2( _L( "Cae: CCaeEngineImp::EnumerateStillCaptureSizes() entering aSizeIndex=%d" ), aSizeIndex );
+    iCamera->EnumerateCaptureSizes( aSize, aSizeIndex, aFormat );
+    LOGTEXT3( _L( "Cae: CCaeEngineImp::EnumerateStillCaptureSizes() returning aSize wxh=%dx%d" ),
+           aSize.iWidth, aSize.iHeight );
+   }
+
+
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::SetJpegQuality
+// Sets the compression quality value to use with JPEG and Exif image formats.
+// Calls Camera API SetJpegQuality() and the still state machine SetJpegQuality().
+// -----------------------------------------------------------------------------
+//
+void CCaeEngineImp::SetJpegQuality( 
+    TInt aCompressionQuality )
+    {
+    LOGTEXT2( _L( "Cae: CCaeEngineImp::SetJpegQuality() entering with %d" ), aCompressionQuality );
+    // Clamp and memorize the image compression quality.
+    if ( aCompressionQuality < 1 )
+        {
+        aCompressionQuality = 1;
+        }
+    if ( aCompressionQuality > 100 ) 
+        {
+        aCompressionQuality = 100;
+        }
+
+    // Set JPEG quality on Camera API.
+    iCamera->SetJpegQuality( aCompressionQuality );
+
+    // Set JPEG quality on the state machine
+    iStillStatesActive->SetJpegQuality( aCompressionQuality );
+
+    LOGTEXT2( _L( "Cae: CCaeEngineImp::SetJpegQuality() returning, memorized %d" ), aCompressionQuality );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::JpegQuality
+// Gets the current compression quality value setting for 
+// JPEG and Exif image formats.
+// -----------------------------------------------------------------------------
+//
+TInt CCaeEngineImp::JpegQuality() const
+    {
+    LOGTEXT2( _L( "Cae: CCaeEngineImp::JpegQuality(): %d" ), iStillStatesActive->JpegQuality() );
+    // Memorized image compression quality, set in  
+    // SetJpegQuality() or PrepareStillCaptureL().
+    return( iStillStatesActive->JpegQuality() );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::SetImageCodecsL
+// Sets the specific image codec implementation to be used in decoding and 
+// encoding.
+// -----------------------------------------------------------------------------
+//
+void CCaeEngineImp::SetImageCodecsL( 
+	TUid aDecoderUid, TUid aEncoderUid )
+    {
+    LOGTEXT3( _L( "Cae: CCaeEngineImp::SetImageCodecsL(): %x, %x" ), aDecoderUid, aEncoderUid );
+    iStillStatesActive->SetImageCodecsL( aDecoderUid, aEncoderUid );
+    }
+
+        
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::ReserveComplete
+// Camera reservation is complete. 
+// Called asynchronously when CCamera::Reserve() completes.
+// -----------------------------------------------------------------------------
+//
+void CCaeEngineImp::ReserveComplete(                                 
+    TInt aError )
+    {
+    LOGTEXT2( _L( "Cae: CCaeEngineImp::ReserveComplete() entering, aError=%d" ), aError );
+
+    #ifdef CAE_TEST_VERSION
+    // For simulating errors when compiled as special "test version".
+    CaeReserveCompleteError( aError );
+    #endif    
+
+    if ( aError == KErrNone )
+        {
+        iReserved = ETrue;
+        // Call the active object to switch the power on indirectly.
+        iCallbackActive->PowerOn();
+        }
+    else
+        {
+        iCaeObserver->McaeoInitComplete( aError );
+        }
+
+    LOGTEXT( _L( "Cae: CCaeEngineImp::ReserveComplete() returning" ) );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::PowerOnComplete
+// Indicates camera power on is complete.
+// Called on completion of CCamera:PowerOn().
+// -----------------------------------------------------------------------------
+//
+void CCaeEngineImp::PowerOnComplete( 
+    TInt aError )
+    {
+    LOGTEXT2( _L( "Cae: CCaeEngineImp::PowerOnComplete() entering, aError=%d" ), aError );
+
+    #ifdef CAE_TEST_VERSION
+    // For simulating errors when compiled as special "test version".
+    CaePowerOnCompleteError( aError );
+    #endif    
+
+    if ( aError == KErrNone ) 
+        {
+        iPowerOn = ETrue;
+        if ( iResetToPreviousSettings )
+            {
+            iResetToPreviousSettings = EFalse;
+            TRAP( aError, ResetToPreviousSettingsL() );
+            }
+        }
+    
+    iCaeObserver->McaeoInitComplete( aError );
+
+    LOGTEXT( _L( "Cae: CCaeEngineImp::PowerOnComplete() returning" ) );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::ViewFinderFrameReady
+// Transfers the current view finder image from the camera. The frame is 
+// first delivered to the extensions and then to the client.
+// Called periodically in response to the use of 
+// CCamera::StartViewFinderBitmapsL().
+// -----------------------------------------------------------------------------
+//
+void CCaeEngineImp::ViewFinderFrameReady( 
+    CFbsBitmap& aFrame )
+    {
+    //LOGTEXT( _L( "Cae: CCaeEngineImp::ViewFinderFrameReady() entering" ) );
+
+	// Process extensions
+	RArray<TCaeExtensionInterfaceImplItem>* processImageImplList = 
+		iExtInterfaceImplementationLists[KCaeExtProcessImageInterfaceIndex].iImplementations;
+
+	TInt extError = KErrNone;
+	for ( TInt i = 0; i < processImageImplList->Count() && !extError; i++ )
+		{
+		if ( (*processImageImplList)[i].iIsActive )
+		    {
+    		STATIC_CAST( MCaeExtProcessImageInterface*, 
+	    	(*processImageImplList)[i].iImplPtr )->ProcessViewFinderFrame( aFrame, extError );
+		    }
+		else
+		    {
+			// LOGTEXT2(_L("Cae: CCaeEngineImp::ViewFinderFrameReady(). Skipped extension %x"), (*processImageImplList)[i].iImplUid.iUid );
+		    }
+		
+	    #ifdef _DEBUG
+		if ( extError )
+		    {
+			LOGTEXT3(_L("Cae: CCaeEngineImp::ViewFinderFrameReady(). Error %d in extension processing for Extension %x"),
+			    extError, (*processImageImplList)[i].iImplUid.iUid );
+			}
+		#endif
+		}
+
+    iCaeObserver->McaeoViewFinderFrameReady( aFrame, extError );
+
+    iStillStatesActive->ViewFinderFrameReady();
+
+    //LOGTEXT( _L( "Cae: CCaeEngineImp::ViewFinderFrameReady() returning" ) );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::ImageReady
+// Transfers the current image from the camera. 
+// Called asynchronously when CCamera::CaptureImage() completes.
+// -----------------------------------------------------------------------------
+//
+void CCaeEngineImp::ImageReady( 
+    CFbsBitmap* aBitmap, 
+    HBufC8*     aImageData, 
+    TInt        aError )
+    {
+    iStillStatesActive->ImageReady( aBitmap, aImageData, aError );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::CheckPowerL
+// Leaves with KErrNotReady if power is off.
+// -----------------------------------------------------------------------------
+//
+void CCaeEngineImp::CheckPowerL()
+    {
+    if ( !iPowerOn ) 
+        {
+        LOGTEXT( _L( "Cae: CCaeEngineImp::CheckPowerL() leaving KErrNotReady (iPowerOn)" ) );
+        User::Leave( KErrNotReady );
+        }
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::CancelAllActivities()
+// Cancels/closes/stops still capturing, video recording, and view finding.
+// -----------------------------------------------------------------------------
+//
+void CCaeEngineImp::CancelAllActivities()
+    {
+    LOGTEXT( _L( "Cae: CCaeEngineImp::CancelAllActivities() entering" ) );
+
+    CancelCaptureStill();
+ 
+    CloseVideoRecording();
+
+    StopViewFinder();
+
+    LOGTEXT( _L( "Cae: CCaeEngineImp::CancelAllActivities() returning" ) );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::ResetToPreviousSettingsL
+// Resets the following settings to the previous values: 
+// exposure mode, white balance mode, 
+// zoom mode, zoom value, flash mode, brightness, and contrast.
+// -----------------------------------------------------------------------------
+//
+void CCaeEngineImp::ResetToPreviousSettingsL()
+    {
+    LOGTEXT( _L( "Cae: CCaeEngineImp::ResetToPreviousSettingsL() entering" ) );
+
+    SetExposureModeL( iExposureMode );
+    SetWhiteBalanceModeL( iWhiteBalanceMode );
+    SetZoomModeL( iZoomMode );
+    SetZoomValueL( iZoomValue );
+    SetFlashModeL( iFlashMode );
+
+    // Try to reset this setting only if it is supported by Camera API.
+    // Otherwise this could cause error when re-reserving camera.
+    if ( iInfo->iOptionsSupported & TCameraInfo::EBrightnessSupported )
+        {
+        SetBrightnessL( iBrightness );
+        }
+
+    // Try to reset this setting only if it is supported by Camera API.
+    // Otherwise this could cause error when re-reserving camera.
+    if ( iInfo->iOptionsSupported & TCameraInfo::EContrastSupported )
+        {
+        SetContrastL( iContrast );
+        }
+
+ 	// Process extensions
+	RArray<TCaeExtensionInterfaceImplItem>* settingsImplementationList = 
+		iExtInterfaceImplementationLists[KCaeExtSettingsInterfaceIndex].iImplementations;
+
+	for ( TInt i = 0; i < settingsImplementationList->Count(); i++ )
+		{
+		TRAPD( err,STATIC_CAST( MCaeExtSettingsInterface*, 
+		    (*settingsImplementationList)[i].iImplPtr )->ResetToPreviousSettingsL() );
+		    
+	    #ifdef _DEBUG
+		if ( err )
+		    {
+			LOGTEXT3(_L("Cae: CCaeEngineImp::ResetToDefaultsL(). Error %d in ResetToDefaultsL() for Extension %x"),
+			    err, (*settingsImplementationList)[i].iImplUid.iUid );
+			}
+		#endif
+		
+		User::LeaveIfError( err );
+		}
+
+    LOGTEXT( _L( "Cae: CCaeEngineImp::ResetToPreviousSettingsL() returning" ) );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::CustomInterface
+// Returns a custom interface  that matches to the given UID.
+// -----------------------------------------------------------------------------
+//
+TAny* CCaeEngineImp::CustomInterface( TUid aInterface )
+    {
+	LOGTEXT2(_L("Cae: CCaeEngineImp::CustomInterface() entering, aIterface=%x"),aInterface.iUid );
+	TAny* interfaceImp = NULL;
+
+	// At first, try to find the interface in CAE extesions
+	TCaeCustomInterfaceImplItem item;
+	item.iInterfaceUid = aInterface;
+	item.iImplPtr = NULL; // This is not used by FindInUnsignedKeyOrder()
+	TInt index = iExtCustomInterfaceImplementations.FindInUnsignedKeyOrder( item ); 
+	if ( index >= 0 )
+		{
+		interfaceImp = iExtCustomInterfaceImplementations[ index ].iImplPtr;
+		}
+
+	if ( !interfaceImp )
+		{
+		// Then, try to find the interface in Camera API
+        interfaceImp = iCamera->CustomInterface( aInterface );
+		}
+
+    // Check if View Finder is stopped during burst sequency to optimize speed of burst
+    // Detection of this feature is based to the fact that the CI UID (KUidBurstModeVFOptimization)
+    // is asked and found from the CAPI.
+    if ( aInterface == KUidBurstModeVFOptimization && interfaceImp )
+        {
+        iStillStatesActive->SetBurstModeVFOptimization( ETrue );
+        }
+        
+	LOGTEXT2(_L("Cae: CCaeEngineImp::CustomInterface() returning, interfaceImp=%x"),interfaceImp );
+    return interfaceImp;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::GetOrder
+// Populate feature array
+// -----------------------------------------------------------------------------
+//
+void CCaeEngineImp::GetOrderL( RCaeOrderedFeatureList& aOrderedFeatureList )
+    {
+    TCaeOrderedFeatureListItem tmpItem;
+    aOrderedFeatureList.Reset();
+    
+	// For all interface implementation lists
+    for ( TInt implListIndex = 0; 
+           implListIndex < iExtInterfaceImplementationLists.Count(); 
+          implListIndex++ )
+        {
+		TCaeExtensionInterfaceImplListItem* implListItem = 
+			&(iExtInterfaceImplementationLists[implListIndex]);
+		RArray<TCaeExtensionInterfaceImplItem>& implementations 
+		    = *(implListItem->iImplementations);
+
+		// For all implementations
+		for ( TInt implIndex = 0; implIndex < implementations.Count(); implIndex++ )
+			{
+
+			// Add to item to the feature array
+			tmpItem.iServiceUid = implListItem->iInterfaceUid;
+			tmpItem.iFeatureUid = implementations[implIndex].iImplUid;
+			aOrderedFeatureList.AppendL( tmpItem );
+			}
+        }
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::SetOrderL
+// The user must first call GetOrder() to get array. After that the user can 
+// change the order of items and call this function. The user shall not remove 
+// items or add new items to the array. 
+//
+// E.g. Typically the user finds two items from the array and switches
+// the positions of these items to get desired effect.
+// -----------------------------------------------------------------------------
+//
+void CCaeEngineImp::SetOrderL( const RCaeOrderedFeatureList& aOrderedFeatureList )
+    {
+	TInt status = KErrNone;
+
+	// Check that aOrderedFeatureList is valid
+	DoSetOrderL( aOrderedFeatureList, EFalse );
+	
+	// Check counts
+	
+	TInt totalImplCount = 0;
+
+	// For all interface implementation lists
+	for ( TInt implListIndex = 0; 
+	      implListIndex < iExtInterfaceImplementationLists.Count(); 
+	      implListIndex++ )
+		{
+		TCaeExtensionInterfaceImplListItem* implListItem = 
+			&(iExtInterfaceImplementationLists[implListIndex]);
+		RArray<TCaeExtensionInterfaceImplItem>& implementations 
+		    = *(implListItem->iImplementations);
+
+		totalImplCount += implementations.Count();
+		}
+
+	if ( totalImplCount != aOrderedFeatureList.Count() )
+		{
+		status = KErrArgument;
+		}
+	else
+		{
+		// Check duplicates
+		status = KErrNone;
+		for ( TInt i =  aOrderedFeatureList.Count() - 1; 
+		      ( i >= 0 ) && ( !status ); 
+		      i-- )
+			{
+			// Find always starts at index 0
+			TInt index = aOrderedFeatureList.Find( 
+				aOrderedFeatureList[i], CCaeEngineImp::Match ); 
+			if (index != i)
+				{
+				status = KErrAlreadyExists;
+				}
+			}
+		
+		// Finally, update internal array
+		if ( !status )
+			{
+			DoSetOrderL( aOrderedFeatureList, ETrue );
+			}
+		}
+
+	User::LeaveIfError( status );
+	}
+
+
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::DoSetOrderL
+//
+// For each item the old item is removed and the new appended to the end of 
+// iExtInterfaceImplementationLists[i].iImplementations.
+// -----------------------------------------------------------------------------
+//
+void CCaeEngineImp::DoSetOrderL( 
+	const RCaeOrderedFeatureList& aOrderedFeatureList, 
+	TBool iUpdate )
+    {
+	TInt status = KErrNone;
+
+	// For all items in given array
+    for (TInt i = 0; i < aOrderedFeatureList.Count() && !status; i++ )
+        {
+        TUid interfaceUid = aOrderedFeatureList[i].iServiceUid;
+        TUid itemImplUid = aOrderedFeatureList[i].iFeatureUid;
+
+		// Find correct interface list
+
+		TCaeExtensionInterfaceImplListItem listItem;
+		listItem.iInterfaceUid = interfaceUid;
+		listItem.iImplementations =  NULL;
+		TInt index = iExtInterfaceImplementationLists.Find( listItem );
+		if ( index < 0 )
+			{
+			status = index; // Invalid interface uid
+			}
+		else
+			{
+			
+			// Find implementation by uid
+
+			TCaeExtensionInterfaceImplItem item;
+			item.iInitialPriority = 0;
+			item.iImplUid.iUid = itemImplUid.iUid;
+			item.iImplPtr = 0;
+			item.iIsActive = ETrue;
+			RArray<TCaeExtensionInterfaceImplItem>& implementations = 
+				*( iExtInterfaceImplementationLists[index].iImplementations );
+
+			TInt itemIndex = implementations.Find( item, CCaeEngineImp::MatchEqualImplUid );
+			if ( itemIndex < 0 ) 
+				{
+				status = itemIndex; // Invalid feature/implementation uid
+				}
+			else
+				{
+				if ( iUpdate )
+					{
+					// Remove current item and add new implementation item to 
+					// end of the array
+
+					item = implementations[itemIndex];
+
+					implementations.Remove( itemIndex );
+
+					status = implementations.Append( item );
+					}
+				}
+			}
+        }
+
+    User::LeaveIfError( status );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::MatchEqualImplUid 
+// Compares two extension array items
+// -----------------------------------------------------------------------------
+//
+TBool CCaeEngineImp::MatchEqualImplUid( 
+    const TCaeExtensionInterfaceImplItem& aFirst, 
+    const TCaeExtensionInterfaceImplItem& aSecond )
+    {
+	return ( aFirst.iImplUid.iUid == aSecond.iImplUid.iUid ); 
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::MatchEqualImplPtr 
+// Compares two extension array items
+// -----------------------------------------------------------------------------
+//
+TBool CCaeEngineImp::MatchEqualImplPtr( 
+    const TCaeExtensionInterfaceImplItem& aFirst, 
+    const TCaeExtensionInterfaceImplItem& aSecond )
+    {
+	return ( aFirst.iImplPtr == aSecond.iImplPtr ); 
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::MatchSmallerInitialPriorityAndImplUid 
+// Compares two extension array items
+// -----------------------------------------------------------------------------
+//
+TBool CCaeEngineImp::MatchSmallerInitialPriorityAndImplUid( 
+    const TCaeExtensionInterfaceImplItem& aFirst, 
+    const TCaeExtensionInterfaceImplItem& aSecond )
+    {
+	if (  ( aSecond.iInitialPriority == aFirst.iInitialPriority )
+		  && ( aSecond.iImplUid.iUid < aFirst.iImplUid.iUid ) )
+		{
+		return ETrue;
+		}
+
+	else if ( aSecond.iInitialPriority < aFirst.iInitialPriority )
+		{
+		return ETrue;
+		}
+
+	else
+		{
+		return EFalse;
+		}
+    }
+
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::Match 
+// Compares two extension array items
+// -----------------------------------------------------------------------------
+//
+TBool CCaeEngineImp::Match( 
+    const TCaeOrderedFeatureListItem& aFirst, 
+    const TCaeOrderedFeatureListItem& aSecond )
+    {
+	return ( ( aFirst.iServiceUid == aSecond.iServiceUid ) 
+		     && ( aFirst.iFeatureUid == aSecond.iFeatureUid ) ); 
+    }
+
+
+// From MCaeExtEngineInfoCallbackInterface
+
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::McaeExtStillImageSize
+// Returns current still image size.
+// -----------------------------------------------------------------------------
+//
+TSize CCaeEngineImp::McaeExtStillImageSize()
+	{
+	return( iStillStatesActive->StillImageSize() );
+	}
+
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::McaeExtSnapImageSize
+// Returns current snap image size.
+// -----------------------------------------------------------------------------
+//
+TSize CCaeEngineImp::McaeExtSnapImageSize()
+	{
+	return( iStillStatesActive->SnapImageSize() );
+	}
+
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::McaeExtViewFinderSize
+// Returns current view finder size.
+// -----------------------------------------------------------------------------
+//
+TSize CCaeEngineImp::McaeExtViewFinderSize()
+	{
+	return( iTrueViewFinderSize );
+	}
+
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::McaeExtCheckPowerL
+// Check camera power.
+// -----------------------------------------------------------------------------
+//
+void CCaeEngineImp::McaeExtCheckPowerL()
+	{
+	CheckPowerL();
+	}
+
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::McaeExtDisplayIndex
+// Returns display index.
+// -----------------------------------------------------------------------------
+//
+TInt CCaeEngineImp::McaeExtDisplayIndex()
+	{
+    LOGTEXT2( _L( "Cae: CCaeEngineImp::McaeExtDisplayIndex() iDisplayIndex=%d" ), iDisplayIndex );
+	return( iDisplayIndex );
+	}
+
+// From MExtensionCallbackInterface
+
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::IsInterfaceSupported
+// Check that the interface is supported. 
+// -----------------------------------------------------------------------------
+//
+TBool CCaeEngineImp::IsInterfaceSupported( TUid aInterfaceUid )
+	{
+	TBool found = EFalse;
+	TInt i = 0;
+
+	TCaeExtensionInterfaceImplListItem listItem;
+	listItem.iInterfaceUid = aInterfaceUid;
+	listItem.iImplementations =  NULL;
+
+	// Check extension interface uids
+	if ( iExtInterfaceImplementationLists.Find( listItem ) >= 0 )
+		{
+		found = ETrue;
+		}
+
+	// Check callback interface uids
+	for ( i = 0; (KCaeSupportedCallbackInterfaceUids[i].iUid != NULL) && !found; i++ )
+		{
+		if ( KCaeSupportedCallbackInterfaceUids[i] == aInterfaceUid )
+			{
+			found = ETrue;
+			}
+		}
+
+	return found;
+	}
+
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::AddExtensionInterface
+// Add an extension implemented interface to the list.
+// Note: Returns KErrNotFound if the interface is not supported.
+// -----------------------------------------------------------------------------
+//
+TInt CCaeEngineImp::AddExtensionInterface( 
+	TUid aInterfaceUid, 
+	TUid aExtensionUid, 
+	TAny* aImplementationPtr, 
+	TInt aInitialPriority )
+	{
+    LOGTEXT3( _L( "Cae: CCaeEngineImp::AddExtensionInterface() entering: ifUid=%x, exUid=%x" ), aInterfaceUid.iUid, aExtensionUid.iUid );
+
+	TInt status = KErrNone;
+
+	// Check for invalid pointer
+	if ( !aImplementationPtr )
+		{
+		status = KErrArgument;
+		}
+	else
+		{
+
+		// Add implementation to the list
+
+		TCaeExtensionInterfaceImplListItem listItem;
+		listItem.iInterfaceUid = aInterfaceUid;
+		listItem.iImplementations =  NULL;
+
+		TInt index = iExtInterfaceImplementationLists.Find( listItem );
+		if ( index < 0 )
+			{
+			status = index; // Error code
+			}
+		else
+			{
+
+			// Add new implementation item to the array
+
+			RArray<TCaeExtensionInterfaceImplItem>& implementations = 
+				*( iExtInterfaceImplementationLists[index].iImplementations );
+
+			TCaeExtensionInterfaceImplItem item;
+			item.iInitialPriority = aInitialPriority;
+			item.iImplUid  = aExtensionUid;
+			item.iImplPtr  = aImplementationPtr;
+			item.iIsActive = ETrue;
+
+			// Check for duplicates
+			TInt itemIndex = implementations.Find( item, CCaeEngineImp::MatchEqualImplUid );
+			if ( itemIndex >= 0 ) 
+				{
+				status = KErrAlreadyExists; // Error code
+				}
+			else
+				{
+				itemIndex = implementations.Find( 
+				    item, CCaeEngineImp::MatchSmallerInitialPriorityAndImplUid );
+				if ( itemIndex < 0 ) 
+					{
+					// All have bigger or equal priority. Add to the end of list.
+					itemIndex = implementations.Count();
+					}
+
+				// Finally, add item to the list
+				status =  implementations.Insert( item, itemIndex ); 
+				}
+			}
+		}
+
+    LOGTEXT2( _L( "Cae: CCaeEngineImp::AddExtensionInterface() returning: status=%d" ), status );
+
+	return( status );
+	}
+
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::RemoveExtensionInterface
+// Remove an extension implemented interface from the list.
+// -----------------------------------------------------------------------------
+//
+TInt CCaeEngineImp::RemoveExtensionInterface( 
+	TUid aInterfaceUid, 
+	TAny* aImplementationPtr )
+	{
+    LOGTEXT3( _L( "Cae: CCaeEngineImp::RemoveExtensionInterface() entering: ifUid=%x, ptr=%d" ), aInterfaceUid.iUid, aImplementationPtr );
+	TInt status = KErrNone;
+
+	// Check for invalid pointer
+	if ( !aImplementationPtr )
+		{
+		status = KErrArgument;
+		}
+	else
+		{
+		// Remove implementation to the list
+		TCaeExtensionInterfaceImplListItem listItem;
+		listItem.iInterfaceUid = aInterfaceUid;
+		listItem.iImplementations =  NULL;
+
+		TInt index = iExtInterfaceImplementationLists.Find( listItem );
+
+		if ( index < 0 )
+			{
+			status = index; // Error code
+			}
+		else
+			{
+			TCaeExtensionInterfaceImplItem item;
+			item.iInitialPriority = 0;
+			item.iImplUid.iUid = 0;
+			item.iImplPtr = aImplementationPtr;
+			item.iIsActive = ETrue;
+			
+			RArray<TCaeExtensionInterfaceImplItem>& implementations = 
+				*( iExtInterfaceImplementationLists[index].iImplementations );
+
+			TInt itemIndex = implementations.Find( item, CCaeEngineImp::MatchEqualImplPtr );
+
+			if ( itemIndex < 0 ) 
+				{
+				status = itemIndex; // Return error
+				}
+			else
+				{
+				implementations.Remove( itemIndex );
+				}
+			}
+		}
+
+    LOGTEXT2( _L( "Cae: CCaeEngineImp::RemoveExtensionInterface() returning: status=%d" ), status );
+
+	return( status );
+	}
+
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::AddCustomInterface
+// Add an extension implemented custom interface to the list.
+// -----------------------------------------------------------------------------
+//
+TInt CCaeEngineImp::AddCustomInterface( 
+    TUid aInterfaceUid, 
+    TAny* aImplementationPtr )
+	{
+    LOGTEXT3( _L( "Cae: CCaeEngineImp::AddCustomInterface() entering: ifUid=%x, ptr=%d" ), aInterfaceUid.iUid, aImplementationPtr );
+
+	TInt status = KErrNone;
+
+	if ( !aImplementationPtr )
+		{
+		status = KErrArgument;
+		}
+	else
+		{
+		TCaeCustomInterfaceImplItem item;
+		item.iInterfaceUid = aInterfaceUid;
+		item.iImplPtr = aImplementationPtr;
+		
+	    // Do not allow duplicate uid's
+		status = iExtCustomInterfaceImplementations.InsertInUnsignedKeyOrder( item ); 	
+		}
+	
+    LOGTEXT2( _L( "Cae: CCaeEngineImp::AddCustomInterface() returning: status=%d" ), status );
+
+	return ( status );
+	}
+
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::GetCallbackInterface
+// Return an engine implemented callback interface.
+// -----------------------------------------------------------------------------
+//
+TAny* CCaeEngineImp::GetCallbackInterface( TUid aInterfaceUid )
+	{
+    LOGTEXT2( _L( "Cae: CCaeEngineImp::GetCallbackInterface() entering: ifUid=%x" ), aInterfaceUid.iUid );
+	TAny* callbackInterface =  NULL;
+
+	if ( aInterfaceUid == KCaeExtEngineInfoCallbackInterfaceUid )
+		{
+		callbackInterface = (MCaeExtEngineInfoCallbackInterface*) this;
+		}
+
+    LOGTEXT2( _L( "Cae: CCaeEngineImp::GetCallbackInterface() returning: callbackInterface=%d" ), callbackInterface );
+	return ( callbackInterface );
+	}
+
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::RegisterFlags
+// -----------------------------------------------------------------------------
+//
+void CCaeEngineImp::RegisterFlags( TUint32 aFlags )
+	{
+    LOGTEXT2( _L( "Cae: CCaeEngineImp::RegisterFlags() aFlags=%x" ), aFlags );
+    iStillStatesActive->RegisterFlags( aFlags );
+	}
+
+
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::DeregisterFlags
+// -----------------------------------------------------------------------------
+//
+void CCaeEngineImp::DeregisterFlags( TUint32 aFlags )
+    {
+    LOGTEXT2( _L( "Cae: CCaeEngineImp::DeregisterFlags() aFlags=%x" ), aFlags );
+    iStillStatesActive->DeregisterFlags( aFlags );    
+    }
+
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::CCameraHandle
+// Gets handle of camera object owned by the CCaeEngine.
+// -----------------------------------------------------------------------------
+//
+TInt CCaeEngineImp::CCameraHandle() const
+    {
+    LOGTEXT2( _L( "Cae: CCaeEngineImp::CCameraHandle(): %d" ), iCameraHandle );
+    return ( iCameraHandle );
+    }
+
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::SetCaeExtensionModeL
+// Sets CAE to Extension mode
+// -----------------------------------------------------------------------------
+//
+void CCaeEngineImp::SetCaeExtensionModeL( TBool aExtModeActive, TBool aCreateSnapImage )
+    {
+    LOGTEXT3( _L( "Cae: CCaeEngineImp::SetCaeExtensionModeL(): %d, %d" ), aExtModeActive, aCreateSnapImage );
+
+    iStillStatesActive->SetExtModeActiveL( aExtModeActive );
+    iStillStatesActive->SetSnapImageCreation( aCreateSnapImage );
+    }
+
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::ProcessExtViewFinderFrameReadyL
+// Process extension for view finder
+// -----------------------------------------------------------------------------
+//
+void CCaeEngineImp::ProcessExtViewFinderFrameReadyL( CFbsBitmap& aFrame )
+    {
+    LOGTEXT( _L( "Cae: CCaeEngineImp::ProcessExtViewFinderFrameReadyL()" ));
+
+    // Leave if not in extension mode.
+    if ( !iStillStatesActive->ExtModeActive() )
+        {
+        LOGTEXT( _L( "Cae: CCaeEngineImp::ProcessExtViewFinderFrameReadyL() leaving KErrPermissionDenied" ) );
+        User::Leave( KErrPermissionDenied );
+        }
+
+    ViewFinderFrameReady( aFrame );
+    }
+
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::ProcessExtSnapImageL
+// Process extension for snap image
+// -----------------------------------------------------------------------------
+//
+void CCaeEngineImp::ProcessExtSnapImageL( CFbsBitmap& aSnapImage )
+    {
+    TSize sizeEmpty;
+    CFbsBitmap* bitmapSave = NULL;
+    TSize snapSize = aSnapImage.SizeInPixels();
+    
+    LOGTEXT3( _L( "Cae: CCaeEngineImp::ProcessExtSnapImageL() size wxh=%dx%d" ),
+            snapSize.iWidth, snapSize.iHeight );
+        
+    // Leave if not in extension mode.
+    if ( !iStillStatesActive->ExtModeActive() )
+        {
+        LOGTEXT( _L( "Cae: CCaeEngineImp::ProcessExtSnapImageL() leaving KErrPermissionDenied" ) );
+        User::Leave( KErrPermissionDenied );
+        }
+
+    // Create a duplicate bitmap
+    if ( snapSize != sizeEmpty ) 
+        {
+        bitmapSave = new CFbsBitmap;
+        if ( bitmapSave )
+            {
+            TInt err = bitmapSave->Duplicate( aSnapImage.Handle() );
+            if ( err ) 
+                {
+                    LOGTEXT2( _L( "Cae: CCaeEngineImp::ProcessExtSnapImageL(): Duplicate error:%d, leaving" ), err);
+                    delete bitmapSave;
+                    bitmapSave = NULL;
+                    User::Leave( err );
+                 }
+            }
+        else
+            {
+            LOGTEXT( _L( "Cae: CCaeEngineImp::ProcessExtSnapImageL(): new CFbsBitmap failed, leaving KErrNoMemory" ));
+            User::Leave( KErrNoMemory );
+            }
+        }
+    else
+        {
+        LOGTEXT( _L( "Cae: CCaeEngineImp::ProcessExtSnapImageL(): got empty bitmap, ignore" ));
+        }
+        
+    if ( bitmapSave )
+        {
+        // Send bitmap for extension handling
+        TInt result = iStillStatesActive->ProcessExtSnapImage( bitmapSave );
+        if ( result )
+            {
+            LOGTEXT2( _L( "Cae: CCaeEngineImp::ProcessExtSnapImageL(): ProcessExtSnapImage failed %d, leaving" ), result);
+            delete bitmapSave;
+            bitmapSave = NULL;
+            User::Leave( result );
+            }
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::ProcessExtCapturedImageL
+// Process extension for captured image
+// -----------------------------------------------------------------------------
+//
+void CCaeEngineImp::ProcessExtCapturedImageL( CFbsBitmap& aBitmap, TBool aLastImage )
+    {
+    TSize sizeEmpty;
+    CFbsBitmap* bitmapSave = NULL;
+    TSize bitmapSize = aBitmap.SizeInPixels();
+    
+    LOGTEXT3( _L( "Cae: CCaeEngineImp::ProcessExtCapturedImageL() CFbsBitmap ExtMode=%d, last=%d" ), iStillStatesActive->ExtModeActive(), aLastImage);
+    LOGTEXT3( _L( "Cae: CCaeEngineImp::ProcessExtCapturedImageL() bitmap size WxH=%dx%d" ), bitmapSize.iWidth, bitmapSize.iHeight );
+        
+    // Leave if not in extension mode.
+    if ( !iStillStatesActive->ExtModeActive() )
+        {
+        LOGTEXT( _L( "Cae: CCaeEngineImp::ProcessExtCapturedImageL leaving KErrPermissionDenied" ));
+        User::Leave( KErrPermissionDenied );
+        }
+
+    // Create a duplicate bitmap
+    if ( bitmapSize != sizeEmpty )
+        {
+        bitmapSave = new CFbsBitmap;
+        if ( bitmapSave )
+            {
+            TInt err = bitmapSave->Duplicate( aBitmap.Handle() );
+            if ( err ) 
+                {
+                    LOGTEXT2( _L( "Cae: CCaeEngineImp::ProcessExtCapturedImageL(): Duplicate error:%d, leaving" ), err);
+                    delete bitmapSave;
+                    bitmapSave = NULL;
+                    User::Leave( err );
+                 }
+            }
+        else
+            {
+            LOGTEXT( _L( "Cae: CCaeEngineImp::ProcessExtCapturedImageL(): new CFbsBitmap failed, leaving KErrNoMemory" ));
+            User::Leave( KErrNoMemory );
+            }
+
+        }
+    else
+        {
+        LOGTEXT( _L( "Cae: CCaeEngineImp::ProcessExtCapturedImageL(): got empty bitmap, ignore" ));
+        }
+        
+    if ( bitmapSave )
+        {
+        // Send bitmap for extension handling
+        TInt result = iStillStatesActive->ProcessExtCapturedImage( bitmapSave, aLastImage );
+        if ( result )
+            {
+            LOGTEXT2( _L( "Cae: CCaeEngineImp::ProcessExtCapturedImageL(): ProcessExtCapturedImage failed %d, leaving" ), result);
+            delete bitmapSave;
+            bitmapSave = NULL;
+            User::Leave( result );
+            }
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::ProcessExtCapturedImageL
+// Process extension for captured image
+// -----------------------------------------------------------------------------
+//
+void CCaeEngineImp::ProcessExtCapturedImageL( HBufC8* aImageData, TBool aLastImage )
+    {
+    LOGTEXT3( _L( "Cae: CCaeEngineImp::ProcessExtCapturedImageL() HBufC8 ExtMode=%d, last=%d" ), iStillStatesActive->ExtModeActive(), aLastImage);
+    // Leave if not in extension mode.
+    if ( !iStillStatesActive->ExtModeActive() )
+        {
+        LOGTEXT( _L( "Cae: CCaeEngineImp::ProcessExtCapturedImageL leaving KErrPermissionDenied" ));
+        User::Leave( KErrPermissionDenied );
+        }
+    if ( aImageData )
+        {
+        LOGTEXT2( _L( "Cae: CCaeEngineImp::ProcessExtCapturedImageL() processing HBufC8 size=%d" ), aImageData->Size() );
+        TInt result = iStillStatesActive->ProcessExtCapturedImage( aImageData, aLastImage );
+        if ( result )
+            {
+            LOGTEXT2( _L( "Cae: CCaeEngineImp::ProcessExtCapturedImageL(): ProcessExtCapturedImage failed %d, leaving" ), result);
+            delete aImageData;
+            aImageData = NULL;
+            User::Leave( result );
+            }
+        }
+    else
+        {
+        LOGTEXT( _L( "Cae: CCaeEngineImp::ProcessExtCapturedImageL(): got empty HBufC8, ignore" ));
+        }
+    
+    }
+
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::ProcessExtCapturedImageL
+// Process extension for captured image
+// -----------------------------------------------------------------------------
+//
+void CCaeEngineImp::ProcessExtCapturedImageL( TDesC8& aImageDataDes, TBool aLastImage )
+    {
+    LOGTEXT3( _L( "Cae: CCaeEngineImp::ProcessExtCapturedImageL() TDesC8 ExtMode=%d, last=%d" ), iStillStatesActive->ExtModeActive(), aLastImage);
+    // Leave if not in extension mode.
+    if ( !iStillStatesActive->ExtModeActive() )
+        {
+        LOGTEXT( _L( "Cae: CCaeEngineImp::ProcessExtCapturedImageL leaving KErrPermissionDenied" ));
+        User::Leave( KErrPermissionDenied );
+        }
+    // TDesC8 is used with C-API V2 features
+    if ( aImageDataDes.Size() )
+        {
+        // Make a new HBufC8 copy from the TDesC8
+        HBufC8* tempImageData = aImageDataDes.AllocL();
+        // Do not delete aImageDataDes, it is part of the class MCameraBuffer
+        LOGTEXT2( _L( "Cae: CCaeEngineImp::ProcessExtCapturedImageL() New HBufC8 created, size=%d" ), tempImageData->Size() );
+        
+        TInt result = iStillStatesActive->ProcessExtCapturedImage( tempImageData, aLastImage );
+        if ( result )
+            {
+            LOGTEXT2( _L( "Cae: CCaeEngineImp::ProcessExtCapturedImageL(): ProcessExtCapturedImage failed %d, leaving" ), result);
+            delete tempImageData;
+            tempImageData = NULL;
+            User::Leave( result );
+            }
+        }
+    else
+        {
+        LOGTEXT( _L( "Cae: CCaeEngineImp::ProcessExtCapturedImageL(): got empty TDesC8, ignore" ));
+        }
+    
+    }
+
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::ProcessExtCancel
+// Cancels processing
+// -----------------------------------------------------------------------------
+//
+void CCaeEngineImp::ProcessExtCancel()
+    {
+    CancelCaptureStill();
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::SkippedExtensionListL
+// Get list of skipped extensions. Application may define which extensions are
+// skipped during image processing. Only installed and skipped are listed.
+// -----------------------------------------------------------------------------
+//
+void CCaeEngineImp::SkippedExtensionListL( RCaeOrderedFeatureList& aDisabledExtensions )
+    {
+    LOGTEXT( _L( "Cae: CCaeEngineImp::SkippedExtensionListL() entering" ) );
+    TCaeOrderedFeatureListItem tmpItem;
+    aDisabledExtensions.Reset();
+    
+	// For all interface implementation lists
+    for ( TInt implListIndex = 0; 
+           implListIndex < iExtInterfaceImplementationLists.Count(); 
+          implListIndex++ )
+        {
+		TCaeExtensionInterfaceImplListItem* implListItem = 
+			&(iExtInterfaceImplementationLists[implListIndex]);
+		RArray<TCaeExtensionInterfaceImplItem>& implementations 
+		    = *(implListItem->iImplementations);
+
+		// For all implementations
+		for ( TInt implIndex = 0; implIndex < implementations.Count(); implIndex++ )
+			{
+			// Add the item to the skipped array if it is not active
+			if ( !implementations[implIndex].iIsActive )
+			    {
+			    tmpItem.iServiceUid = implListItem->iInterfaceUid;
+			    tmpItem.iFeatureUid = implementations[implIndex].iImplUid;
+			    aDisabledExtensions.AppendL( tmpItem );
+                LOGTEXT3( _L( "Cae: CCaeEngineImp::SkippedExtensionListL(), serviceUid %x, featureUid %x" ),
+                    tmpItem.iServiceUid.iUid, tmpItem.iFeatureUid.iUid  );
+			    }
+			}
+        }
+    LOGTEXT2( _L( "Cae: CCaeEngineImp::SkippedExtensionListL() returning, count %d" ), aDisabledExtensions.Count() );
+    }
+
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::SetSkippedExtensionList
+// Set list of skipped extensions. Application may define which extensions are
+// skipped during image processing.
+// -----------------------------------------------------------------------------
+//
+void CCaeEngineImp::SetSkippedExtensionList( RCaeOrderedFeatureList& aDisabledExtensions )
+    {
+    LOGTEXT2( _L( "Cae: CCaeEngineImp::SetSkippedExtensionList() entering Count %d" ), aDisabledExtensions.Count() );
+
+	// Set all extensions first active
+
+	// For all interfaces
+    for ( TInt implListIndex = 0; 
+           implListIndex < iExtInterfaceImplementationLists.Count(); 
+          implListIndex++ )
+        {
+		TCaeExtensionInterfaceImplListItem* implListItem = 
+			&(iExtInterfaceImplementationLists[implListIndex]);
+		RArray<TCaeExtensionInterfaceImplItem>& implementations 
+		    = *(implListItem->iImplementations);
+
+		// For all implementations
+		for ( TInt implIndex = 0; implIndex < implementations.Count(); implIndex++ )
+			{
+			implementations[implIndex].iIsActive = ETrue;
+			}
+        }
+
+    // Disable wanted extensions
+    
+	// For all items in given array
+    for (TInt i = 0; i < aDisabledExtensions.Count(); i++ )
+        {
+        TUid interfaceUid = aDisabledExtensions[i].iServiceUid;
+        TUid itemImplUid = aDisabledExtensions[i].iFeatureUid;
+
+		// Find correct interface list
+
+		TCaeExtensionInterfaceImplListItem listItem;
+		listItem.iInterfaceUid = interfaceUid;
+		listItem.iImplementations =  NULL;
+		TInt index = iExtInterfaceImplementationLists.Find( listItem );
+		if ( index >= 0 ) // Interface was found
+			{
+			// Find implementation by uid
+
+			TCaeExtensionInterfaceImplItem item;
+			item.iInitialPriority = 0;
+			item.iImplUid.iUid = itemImplUid.iUid;
+			item.iImplPtr = 0;
+			item.iIsActive = ETrue;
+			RArray<TCaeExtensionInterfaceImplItem>& implementations = 
+				*( iExtInterfaceImplementationLists[index].iImplementations );
+
+			TInt itemIndex = implementations.Find( item, CCaeEngineImp::MatchEqualImplUid );
+			if ( itemIndex >= 0 ) 
+				{
+				implementations[itemIndex].iIsActive = EFalse;
+                LOGTEXT3( _L( "Cae: CCaeEngineImp::SetSkippedExtensionList(), serviceUid %x, featureUid %x" ),
+                    interfaceUid.iUid, itemImplUid.iUid  );
+				}
+			}
+        }
+
+    LOGTEXT( _L( "Cae: CCaeEngineImp::SetSkippedExtensionList() returning" ) );
+    }
+
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::EnableVideoRecording
+// Set CAE internal camera status flags.
+// -----------------------------------------------------------------------------
+//
+void CCaeEngineImp::EnableVideoRecording()
+    {
+    LOGTEXT( _L( "Cae: CCaeEngineImp::EnableVideoRecording() entering" ) );
+
+    // Set the flags to enable the video usage without InitL() call
+    iReserved = ETrue;
+    iPowerOn = ETrue;
+
+    LOGTEXT( _L( "Cae: CCaeEngineImp::EnableVideoRecording() returning" ) );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::DisableVideoRecording
+// Set CAE internal camera status flags.
+// -----------------------------------------------------------------------------
+//
+void CCaeEngineImp::DisableVideoRecording()
+    {
+    LOGTEXT( _L( "Cae: CCaeEngineImp::DisableVideoRecording() entering" ) );
+
+    if ( iReserved ) 
+        {
+        if ( iPowerOn ) 
+            {
+            CancelAllActivities();
+            iPowerOn = EFalse;
+            }
+        iReserved = EFalse;
+        iStillPrepared = EFalse;
+        iVideoPrepared = EFalse;
+        iVideoOpened = EFalse;
+        }
+
+    LOGTEXT( _L( "Cae: CCaeEngineImp::DisableVideoRecording() returning" ) );
+    }
+
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::HandleEvent
+// MCameraObserver2 call-back handler
+// -----------------------------------------------------------------------------
+//
+void CCaeEngineImp::HandleEvent( const TECAMEvent& aEvent)
+    {
+    LOGTEXT3( _L( "Cae: CCaeEngineImp::HandleEvent() entering, type=%x, err=%d" ), aEvent.iEventType.iUid, aEvent.iErrorCode );
+
+    if ( iStillStatesActive->ExtModeActive() )
+        {
+        LOGTEXT( _L( "Cae: CCaeEngineImp::HandleEvent() Extension mode active, skipping event handling" ) );
+        }
+    else
+        {
+        // Cae is in use when capturing images
+        if ( aEvent.iEventType == KUidECamEventCameraNoLongerReserved )
+            {
+            LOGTEXT( _L( "Cae: CCaeEngineImp::HandleEvent() KUidECamEventCameraNoLongerReserved" ) );
+            CancelAllActivities();
+            iPowerOn = EFalse;
+            iReserved = EFalse;
+            iStillPrepared = EFalse;
+            iVideoPrepared = EFalse;
+            iVideoOpened = EFalse;
+            iCaeObserver->McaeoInitComplete( KErrInUse ); // Tell the client that other application has taken the camera
+            }
+        else if ( aEvent.iEventType == KUidECamEventPowerOnComplete )
+    	    {
+            LOGTEXT( _L( "Cae: CCaeEngineImp::HandleEvent() KUidECamEventPowerOnComplete" ) );
+            PowerOnComplete( aEvent.iErrorCode );
+	        }
+    	else if ( aEvent.iEventType == KUidECamEventReserveComplete )
+    	    {
+            LOGTEXT( _L( "Cae: CCaeEngineImp::HandleEvent() KUidECamEventReserveComplete" ) );
+            ReserveComplete( aEvent.iErrorCode );
+    	    }
+        }
+
+    LOGTEXT( _L( "Cae: CCaeEngineImp::HandleEvent() returning" ) );
+    }
+
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::ViewFinderReady
+// MCameraObserver2 call-back handler
+// -----------------------------------------------------------------------------
+//
+void CCaeEngineImp::ViewFinderReady( MCameraBuffer& aCameraBuffer, TInt aError)
+    {
+    LOGTEXT3( _L( "Cae: CCaeEngineImp::ViewFinderReady() entering, err=%d, NumFrames=%d" ), aError, aCameraBuffer.NumFrames() );
+
+    if ( !aError )
+        {
+        if ( aCameraBuffer.NumFrames() > 0 )
+	        {
+            CFbsBitmap* bitmap = NULL;
+	        TRAPD( err, bitmap = &aCameraBuffer.BitmapL( 0 ) );
+	        if ( !err )
+	            {
+	            ViewFinderFrameReady( *bitmap );
+	            }
+	        else
+	            {
+                LOGTEXT2( _L( "Cae: CCaeEngineImp::ViewFinderReady() BitmapL failed err=%d" ), err );
+	            }
+	        }
+	    aCameraBuffer.Release();
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::ImageBufferReady
+// MCameraObserver2 call-back handler
+// -----------------------------------------------------------------------------
+//
+void CCaeEngineImp::ImageBufferReady( MCameraBuffer& aCameraBuffer, TInt aError)
+    {
+    LOGTEXT3( _L( "Cae: CCaeEngineImp::ImageBufferReady() entering, err=%d, NumFrames=%d" ), aError, aCameraBuffer.NumFrames() );
+	
+    if ( !aError )
+        {
+        TDesC8* data = NULL;
+        TRAPD( err, data = aCameraBuffer.DataL( 0 ) );
+        if ( err == KErrNotSupported )
+            {
+            // Got the image as a CFbsBitmap
+            CFbsBitmap* bitmap = NULL;
+
+            TRAP( err, bitmap = &aCameraBuffer.BitmapL( 0 ) );
+
+            if ( !err )
+                {
+                // Create a duplicate bitmap
+                CFbsBitmap* bitmapSave = NULL;
+                bitmapSave = new CFbsBitmap;
+                if ( bitmapSave )
+                    {
+                    err = bitmapSave->Duplicate( bitmap->Handle() );
+                    if ( !err ) 
+                        {
+                        // All OK, send duplicated bitmap to old observer interface
+                        ImageReady( bitmapSave, NULL, aError );
+                        }
+                    else
+                        {
+                        LOGTEXT2( _L( "Cae: CCaeEngineImp::ImageBufferReady(): Duplicate error:%d" ), err);
+                        delete bitmapSave;
+                        bitmapSave = NULL;
+                        ImageReady( NULL, NULL, err );
+                        }
+                    }
+                else
+                    {
+                    LOGTEXT( _L( "Cae: CCaeEngineImp::ImageBufferReady(): new CFbsBitmap failed" ));
+                    ImageReady( NULL, NULL, KErrNoMemory );
+                    }
+
+                }
+            else
+                {
+                LOGTEXT( _L( "Cae: CCaeEngineImp::ImageBufferReady(): BitmapL failed" ));
+                ImageReady( NULL, NULL, err );
+                }
+            }
+        else if ( !err )
+            {
+            // Got the image as a descriptor
+            // Make a new HBufC8 copy from the TDesC8
+            HBufC8* tempImageData = NULL;
+            tempImageData = data->Alloc();
+            
+            if ( tempImageData )
+                {
+                // All OK, send buffer to old observer interface
+                LOGTEXT2( _L( "Cae: CCaeEngineImp::ImageBufferReady() New HBufC8 created, size=%d" ), tempImageData->Size() );
+                ImageReady( NULL, tempImageData, aError );
+                }
+            else
+                {
+                LOGTEXT( _L( "Cae: CCaeEngineImp::ImageBufferReady() Alloc of HBufC8 failed" ) );
+                ImageReady( NULL, NULL, KErrNoMemory );
+                }
+            
+            
+            }
+        else
+            {
+            LOGTEXT2( _L( "Cae: CCaeEngineImp::ImageBufferReady() DataL returned error code=%d" ), err );
+            ImageReady( NULL, NULL, err );
+            }
+
+        // Release buffer only when no error
+	    aCameraBuffer.Release();
+        }
+    else
+        {
+        ImageReady( NULL, NULL, aError );
+        }
+    }
+    
+// -----------------------------------------------------------------------------
+// CCaeEngineImp::VideoBufferReady
+// MCameraObserver2 call-back handler
+// -----------------------------------------------------------------------------
+//
+void CCaeEngineImp::VideoBufferReady( MCameraBuffer& aCameraBuffer, TInt aError)
+    {
+    LOGTEXT2( _L( "Cae: CCaeEngineImp::VideoBufferReady() entering, err=%d" ), aError );
+	
+    if ( !aError )
+        {
+	    aCameraBuffer.Release();
+        }
+    }
+
+
+//  End of File