camerauis/cameraapp/generic/inc/cameracontroller/camcameracontroller.h
branchRCL_3
changeset 24 bac7acad7cb3
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/camerauis/cameraapp/generic/inc/cameracontroller/camcameracontroller.h	Wed Sep 01 12:30:54 2010 +0100
@@ -0,0 +1,705 @@
+/*
+* Copyright (c) 2007-2010 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:  
+*
+*/
+
+
+#ifndef CAM_CAMERACONTROLLER_H
+#define CAM_CAMERACONTROLLER_H
+
+
+// ===========================================================================
+// Included headers
+#include "camcameracontrollerflags.hrh"
+
+#include <e32base.h>
+#include <ecam.h>
+#ifdef CAMERAAPP_CAE_FOR_VIDEO
+  #include <CaeEngine.h>
+#endif
+
+#include "camimageencoder.h"
+#include "camcameraevents.h"
+#include "camcamerarequests.h"
+#include "camcameracontrollertypes.h"
+#include "camcameracontrollersettings.h"
+#include "mcamcameraobserver.h"          // MCamCameraObservable, MCamCameraObserver
+
+// ===========================================================================
+// Forward declarations
+
+class MCameraBuffer;
+class MCamSettingProvider;
+class CIdle;
+class CFbsBitmap;
+
+class CCamSnapshotProvider;
+class CCamCameraControllerActive;
+class CCamAppController; 
+
+#ifdef CAMERAAPP_CAPI_EMULATOR
+  class CCamCamera;
+  #define CAMERA CCamCamera
+#else
+  #define CAMERA CCamera 
+#endif // CAMERAAPP_CAPI_EMULATOR
+
+#ifdef FORCE_DUMMY_ENGINE
+  class CCameraappDummyEngine;
+#endif // FORCE_DUMMY_ENGINE
+
+class MCameraOrientation;
+class MCameraFaceTracking;
+class MCameraUIOrientationOverride;
+class MCameraUseCaseHint;
+  
+
+#ifdef CAMERAAPP_PERFORMANCE_CONTROLLER
+  class CCamPerformanceLogger;
+#endif
+#ifdef CAMERAAPP_FLASH_SIMULATOR
+  class CCamFlashSimulator;
+#endif
+
+#ifdef CAMERAAPP_CAE_ERR_SIMULATION
+  class CCamTimer;
+#endif // CAMERAAPP_CAE_ERR_SIMULATION
+
+// ===========================================================================
+// Class declarations
+
+
+/**
+ * Camera controller class.
+ *
+ * If using MCameraObserver to receive callbacks from (old) Camera API,
+ * still use (new) MCameraObserver2 to receive thumbnails events.
+ */
+class CCamCameraController : public CBase,
+                             public MCamCameraObservable,
+#ifdef CAMERAAPP_CAE_FOR_VIDEO
+                             public MCamAppEngineObserver,
+#endif
+#if !defined( CAMERAAPP_CAPI_V2 )
+                             public MCameraObserver,
+#endif                             
+                             public MCameraObserver2,
+                             public MCamImageEncoderObserver
+  {
+  // =======================================================
+  // Friends
+  private:
+
+    friend class CCamCameraControllerActive;
+
+  // =======================================================
+  // Methods
+
+  // -------------------------------------------------------
+  // Public constructors and destructor
+  public:
+
+    static CCamCameraController* NewL( MCamSettingProvider& aProvider, 
+                                       CCamAppController& aAppController, 
+                                       TInt aCameraIndex = 0 );
+    virtual ~CCamCameraController();
+
+  // -------------------------------------------------------
+  // From MCamCameraObservable
+  public:
+    virtual void AttachObserverL( const MCamCameraObserver* aObserver,
+                                  const TUint&              aInterest );
+    virtual void DetachObserver ( const MCamCameraObserver* aObserver );
+
+  // -------------------------------------------------------
+  // From MCameraObserver2
+  public:
+    virtual void HandleEvent( const TECAMEvent& aEvent );
+    virtual void ViewFinderReady( MCameraBuffer& aCameraBuffer, TInt aError );
+    virtual void ImageBufferReady( MCameraBuffer& aCameraBuffer, TInt aError );
+    virtual void VideoBufferReady( MCameraBuffer& aCameraBuffer, TInt aError );
+
+#ifndef CAMERAAPP_CAPI_V2
+  // -------------------------------------------------------
+  // From MCameraObserver
+  public:
+    virtual void ReserveComplete( TInt aError );
+    virtual void PowerOnComplete( TInt aError );
+    virtual void ViewFinderFrameReady( CFbsBitmap& aFrame );
+    virtual void ImageReady( CFbsBitmap* aBitmap, HBufC8* aData, TInt aError );
+    virtual void FrameBufferReady( MFrameBuffer* aFrameBuffer, TInt aError );
+#endif // CAMERAAPP_CAPI_V2
+
+#ifdef CAMERAAPP_CAE_FOR_VIDEO
+  // -------------------------------------------------------
+  // From MCamAppEngineObserver
+  public:
+    virtual void McaeoInitComplete( TInt aError );
+    virtual void McaeoStillPrepareComplete( TInt aError );
+    virtual void McaeoVideoPrepareComplete( TInt aError );
+    virtual void McaeoViewFinderFrameReady( CFbsBitmap& aFrame, TInt aError );
+    virtual void McaeoSnapImageReady( const CFbsBitmap& aBitmap, TInt aError );
+    virtual void McaeoStillImageReady( CFbsBitmap* aBitmap, HBufC8* aData, TInt aError );
+    virtual void McaeoVideoRecordingOn( TInt aError );
+    virtual void McaeoVideoRecordingPaused( TInt aError );
+    virtual void McaeoVideoRecordingComplete( TInt aError );
+    virtual void McaeoVideoRecordingTimes( 
+        TTimeIntervalMicroSeconds aTimeElapsed, 
+        TTimeIntervalMicroSeconds aTimeRemaining, 
+        TInt aError );
+    virtual void McaeoVideoRecordingStopped();
+#endif // CAMERAAPP_CAE_FOR_VIDEO
+
+  // -------------------------------------------------------
+  // From MCamImageEncoderObserver
+  public:
+
+    virtual void ImageEncoded( TInt aStatus, HBufC8* aData );
+  
+  // -------------------------------------------------------
+  // New methods
+  public:
+    
+    /**
+    * Issue a request for one operation.
+    * Operation will be started synchronously.
+    * Observers will receive notification when the operation is ready.
+    */
+    void RequestL( const TCamCameraRequestId& aRequestId );
+
+    /**
+    * 
+    */
+    void DirectRequestL( const TCamCameraRequestId& aRequestId );
+
+    /**
+    * Issue a sequence of operation requests.
+    * This method will return immediately and the requests will be
+    * processed in the background by callbacks.
+    */
+    void RequestSequenceL( const RCamRequestArray& aSequence );
+
+    /**
+    * Request one or more settings to be set to camera.
+    * The settings to be processed are queried from Setting Provider.
+    * Also the values are queried from there.
+    * Settings are processed asynchronously and ECamCameraEventSettingsDone
+    * event is sent when the process is complete.
+    */
+    void RequestSettingsChangeL();
+
+    /**
+    * Request one setting to be set synchronously to camera.
+    * @param aSettingId  Id of the setting to change. Value to set
+    *                    is asked from Setting Provider.
+    * @see TCamCameraSettingId    
+    */
+    void DirectSettingsChangeL( 
+            const NCamCameraController::TCamCameraSettingId& aSettingId );
+
+    /**
+    * Cancel outstanding request sequence.
+    * Operations that have been already performed will not be rolled back.
+    * Observers have received notifications of such operations.
+    * If the sequence is not completed already (observers have not received
+    * ECamEngineEventSequenceEnd notification), once the sequence is cancelled,
+    * observers will receive ECamEngineEventSequenceEnd notification with 
+    * status KErrCancel.
+    */
+    void CancelSequence();
+    
+    void SwitchCameraL( TInt aCameraIndex );
+
+    void CompleteSwitchCameraL();
+    
+    void SetOrientationModeL( TInt aOrientation );
+    
+    /**
+    * Set viewfinder window for direct screen viewfinder. The handle must remain
+    * valid as long as viewfinder is running. 
+    * @since S60 v5.0
+    * @param aWindow Handle to viewfinder window. Must remain valid while
+    *                viewfinder is running. Ownership not transferred.
+    */
+    void SetViewfinderWindowHandle( RWindowBase* aWindow );
+
+    /**
+    * Notify that the viewfinder window is about to be deleted. Viewfinder
+    * will be stopped if this window handle is currently used for the
+    * viewfinder.
+    * @since S60 v5.0
+    * @param aWindow Handle to viewfinder window. Ownership not transferred.
+    */
+    void ViewfinderWindowDeleted( RWindowBase* aWindow );
+
+  // -------------------------------------------------------
+  // Info getters
+  public:
+
+    static TInt CamerasAvailable();
+
+    TInt CameraHandle(); // Calls CCamera::Handle which is not const
+
+    const TCameraInfo& CameraInfo() const;
+    const TCamControllerInfo& ControllerInfo() const;
+
+    TUint                State()           const;
+    TCamViewfinderMode   ViewfinderMode()  const;    
+    TCamCameraTriState   ViewfinderState() const;
+    TCamCameraTriState   SnapshotState()   const;
+    TCamCameraReadyState FlashState()      const;
+
+    /**
+    * Method to retrieve the Remaining recording time from
+    * CCaeEngine, this information is used in AppUi and
+    * AppController to handle or continue with Video Rec operation
+    */
+    TTimeIntervalMicroSeconds RemainingVideoRecordingTime();
+
+    void GetCameraSettingValueL( 
+            const NCamCameraController::TCamCameraSettingId& aSettingId,
+                  TAny*                                      aSettingData );
+
+    /**
+    * Checks whether setting value given by setting provider matches
+    * the value currently set for iCamera.
+    * @param aSettingId Setting id
+    * @return upToDate
+    */
+    TBool SettingValueUpToDateL( 
+            const NCamCameraController::TCamCameraSettingId& aSettingId );
+
+  // -------------------------------------------------------
+  // Private methods
+  private:
+
+    TInt ProcessNextRequestL();
+
+    TInt ProcessOneRequestL( const TCamCameraRequestId& aRequestId );
+
+    TInt ProcessSettingL( 
+            const NCamCameraController::TCamCameraSettingId& aSettingId );
+
+    // Helper methods used to divide ProcessOneRequestL to smaller portions.
+    TInt ProcessControlStartupRequestL( const TCamCameraRequestId& aRequestId );
+    TInt ProcessControlShutdownRequest( const TCamCameraRequestId& aRequestId ); // non-leaving
+    
+    TInt ProcessVfRequestL( const TCamCameraRequestId& aRequestId );
+    void InitViewfinderL( const TCamViewfinderMode& aMode );
+    void ProcessVfStartRequestL();
+    void ProcessVfStopRequestL();
+    void ProcessVfStopEcamRequest();
+    void ProcessVfRelaseRequest(); // non-leaving    
+
+    TInt ProcessSnapshotRequestL( const TCamCameraRequestId& aRequestId );
+    void ProcessSsStopRequest();    // non-leaving
+    void ProcessSsReleaseRequest(); // non-leaving
+    void InitSnapshotL();
+    
+    TInt ProcessImageRequestL( const TCamCameraRequestId& aRequestId );
+    TInt ProcessImageShutdownRequest( const TCamCameraRequestId& aRequestId );
+    
+    TInt ProcessVideoRequestL( const TCamCameraRequestId& aRequestId );
+
+    void ProcessAutofocusRequestL( const TCamCameraRequestId& aRequestId );
+
+    void ProcessCaptureLimitSettingL();
+    
+    void EndSequence( TInt aStatus );
+    void ClearRequestQueue();
+    void ClearSettingQueue();
+
+  // -------------------------------------------------------
+  // Event handlers
+
+    void HandlePowerOnEvent( TInt aStatus );
+    void HandleReserveGainEvent( TInt aStatus );
+    void HandleReserveLostEvent( TInt aStatus );
+    void HandleViewfinderEvent( MCameraBuffer* aBitmap, TInt aStatus );
+    void HandleImageCaptureEvent( MCameraBuffer* aBitmap, TInt aStatus );
+    void HandleImageCaptureEventL( MCameraBuffer*& aCameraBuffer );
+    void HandleSnapshotEvent( TInt aStatus );
+    void HandleSnapshotEventL( TBool aIgnore = EFalse  );
+
+    void HandleVideoEvent( const TCamCameraEventId& aEventId,
+                                 TInt               aStatus  );
+
+    void HandleVideoTimeEvent( TInt aStatus,
+                               TTimeIntervalMicroSeconds aTimeElapsed, 
+                               TTimeIntervalMicroSeconds aTimeRemaining );
+
+    void HandleAutoFocusEvent(       TInt  aStatus, 
+                               const TUid& aEventUid );
+
+    void HandleFlashStatusEvent(       TInt                aStatus,
+                                 const TCamCameraEventId& aEventId );
+
+    void HandleCallbackEvent( 
+                        TInt                    aStatus, 
+                  const TCamCameraEventId&      aEventId, 
+                  const TCamCameraEventClassId& aEventClass,
+                        TAny*                   aEventData = NULL );
+
+  // -------------------------------------------------------
+  // Helper methods
+    
+    void ReleaseCurrentCamera();
+    void ReleaseCustomInterfaces();
+
+    TBool HasCallback( const TCamCameraRequestId& aType );
+ 
+    TBool CurrentSettingHasCallback();
+
+    /**
+    * Sets viewfinder window ordinal position so that the window is visible.
+    * Window needs to visible when viewfinder is started. In addition,
+    * ordinal position can be set as a parameter, if original position needs to
+    * be returned back.
+    * @since S60 5.0
+    * @param aOrdinalPosition,viewfinder window ordinal position to set 
+    * @return TInt, DSA viewfinder window ordinal position or KErrUnknown
+    */   
+    TInt SetVfWindowOrdinal( TInt aOrdinalPosition = KErrUnknown ); 
+
+
+  // -------------------------------------------------------
+  // Notification of observers
+
+    void NotifyObservers( TInt                   aStatus, 
+                          TCamCameraEventId      aEventId,
+                          TCamCameraEventClassId aEventClass,
+                          TAny*                  aEventData = NULL );
+
+ 
+
+  // -------------------------------------------------------
+  // Getters for info on current camera
+  
+    TInt GetResolutionIndexL(       CCamera::TFormat& aFormat,
+                              const TSize&            aSize   );
+#ifdef CAMERAAPP_CAPI_V2_ADV
+    /**
+    * Get info related to advanced settings.
+    */
+    void GetAdvancedSettingsInfoL();
+    
+    /**
+    * Get closest supported EV compensation step to the given value.
+    * @aEvProposedStep The step for which the closest supported one
+    *                  is asked.
+    * @return Closest supported step to the given proposed step.
+    *         Always 0 if no supported EV steps available.
+    */
+    TInt ResolveEvStep( TInt aEvProposedStep ) const;
+
+    /**
+    * Helper method to check whether the given value is supported,
+    * based on the value array and value info.
+    * Depending on aValueInfo content, the aValueList may represent
+    * the supported values in completely different ways. This 
+    * method is used to help determining if single value is supported
+    * or not.
+    * @param aValue     The value to be checked if it's supported.
+    * @param aValueList Array describing the supported values. Actual meaning
+    *                   depends on aValueInfo value.
+    * @param aValueInfo Enumeration value describing the meaning of values in
+    *                   aValueList array.
+    * @see   TValueInfo
+    */
+    static TBool IsSupportedValue( const TInt&         aValue, 
+                                   const RArray<TInt>& aValueList, 
+                                   const TValueInfo&   aValueInfo );
+
+#endif // CAMERAAPP_CAPI_V2_ADV
+
+    /**
+    * Resolve the snapshot format to be used based on supported formats
+    * and the given preferred format.
+    *
+    * @aPreferredFormat Format to be preferably used, if available.
+    * @leave  KErrNotSupported No acceptable formats are supported.
+    * @leave  KErrNotReady     Snapshot provider not available.
+    * @return Best supported snapshot format.
+    */
+    CCamera::TFormat ResolveSnapshotFormatL( CCamera::TFormat aPreferredFormat ) const;
+
+
+  // -------------------------------------------------------
+  // Conversion methods between requests, events and event classes 
+
+    static TCamCameraEventId Request2Event( const TCamCameraRequestId& aType );
+
+    static TCamCameraEventClassId EventClass( const TCamCameraEventId& aEventId );
+
+    // Comparison function for searching for a matching resolution in
+    // an RArray<TSize>
+    static TBool CompareSize( const TSize& aA, const TSize& aB );
+
+  // -------------------------------------------------------
+  // Camera / engine construction
+  
+    CCaeEngine* NewCaeEngineL( TInt aCameraIndex );
+
+    CAMERA* NewCameraL( TInt aCameraIndex );
+  
+    CAMERA* NewDuplicateCameraL( TInt aCameraHandle );    
+
+  // -------------------------------------------------------
+  // Private constructors
+  private:
+
+    void ConstructL( TInt aCameraIndex );
+
+    CCamCameraController( MCamSettingProvider& aProvider, 
+                          CCamAppController& aAppController );
+
+  // -------------------------------------------------------
+  // Prints for debug builds
+#ifdef _DEBUG
+  private:
+
+    void PrintCameraInfo() const;
+
+  #ifdef CAMERAAPP_CAPI_V2_ADV
+    void PrintAdvancedSettingInfo() const;
+  #endif // CAMERAAPP_CAPI_V2_ADV
+
+    void PrintSnapshotInfo() const;
+
+#endif // _DEBUG
+
+
+    void SetFaceTrackingL();
+
+    /**
+    * Inform CAPI about the UseCase (still or video)
+    * before calling Reserve.
+    *
+    */
+    void HintUseCaseL();
+    
+  // =======================================================
+  // Data
+  private:
+
+  // -------------------------------------------------------
+  // Request queue and related
+    TInt                               iSequenceIndex;
+    RCamRequestArray                   iSequenceArray;
+    
+    TInt                               iReserveTryAgainCount;
+
+  // -------------------------------------------------------
+  // Settings queue and related
+    TInt                                              iSettingIndex;
+    RArray<NCamCameraController::TCamCameraSettingId> iSettingArray;
+
+    MCamSettingProvider&               iSettingProvider;   /** Entity providing settings.             */
+
+  // -------------------------------------------------------
+  // Active object thriving our asynchronous processes.
+
+    CCamCameraControllerActive*        iActive;            /** Own.                                   */
+
+  // -------------------------------------------------------
+  // Observers and their interests
+
+    RPointerArray<MCamCameraObserver>  iObservers;         /** Array of observers. Observers not own. */
+    RArray       <TUint>               iObserverInterests; /** Array of observer interests            */
+
+
+  // -------------------------------------------------------
+  // Info containers
+    TCameraInfo                        iCameraInfo;        /** Camera details                         */
+    TCamControllerInfo                 iInfo;              /** Our own details                        */
+
+    TCamCameraResolutionSupport        iResolutionSupport; /** Supported resolutions info             */
+#ifdef CAMERAAPP_CAPI_V2_ADV
+    TCamAdvancedSettingInfo            iAdvancedSettingInfo;  /** Info related to advanced settings   */
+#endif
+
+    TBool                              iAlternateFormatInUse; /** Encode jpeg from bitmap internally  */                                       
+
+  // -------------------------------------------------------
+  // ECam
+    CAMERA*                            iCamera;            /** Onboard camera instance. Own.          */
+    TBool                              iReleasedByUi;      /** Flag to distinguish own and external   */
+                                                           /** camera release.                        */
+
+#ifdef CAMERAAPP_CAPI_V2
+  #ifdef CAMERAAPP_CAPI_V2_DVF
+    CCamera::CCameraDirectViewFinder*  iDirectViewfinder;  /** Direct viewfinder. Own.                */
+  #endif
+  #ifdef CAMERAAPP_CAPI_V2_OL
+    CCamera::CCameraOverlay*           iOverlayProvider;   /** Overlay provider. Own.                 */
+  #endif
+  #ifdef CAMERAAPP_CAPI_V2_ADV
+    CCamera::CCameraAdvancedSettings*  iAdvancedSettings;  /** Advanced settings instance. Own.       */
+  #endif
+  #ifdef CAMERAAPP_CAPI_V2_HG
+    CCamera::CCameraHistogram*         iHistogramProvider; /** Histogram provider. Own.               */
+  #endif
+  #ifdef CAMERAAPP_CAPI_V2_IP
+    CCamera::CCameraImageProcessing*   iImageProcessor;    /** Image processor. Own.                  */
+  #endif
+#endif
+
+    CCamSnapshotProvider*              iSnapshotProvider;
+
+    CCamImageEncoder*                  iEncoder;
+
+    MCameraOrientation*                iCustomInterfaceOrientation;   /** Not own. */
+
+    MCameraFaceTracking*               iCustomInterfaceFaceTracking;   /** Not own. */
+    
+    MCameraUIOrientationOverride*      iCustomInterfaceUIOrientationOverride; /** Not own. */
+    
+    MCameraUseCaseHint*                iCustomInterfaceUseCaseHint; /** Not own. */
+
+  // -------------------------------------------------------
+  // CAE 
+#ifdef CAMERAAPP_CAE_FOR_VIDEO
+
+    CCaeEngine*                        iCaeEngine;         /** Camera app engine for video. Own.      */
+    TCamVideoRecordingTimes            iVideoTimes;
+    TBool                              iAsyncVideoStopModeSupported;
+
+  #ifdef CAMERAAPP_CAE_FIX
+    /** 
+    * Workaround for changing between video (CCaeEngine) and image (CCamera) modes
+    * Without the support for camera handle sharing in CAE.
+    */
+
+    TBool iCaeInUse;
+    
+    TInt ProceedModeSwitch();
+    TInt DoProceedModeSwitchL();
+
+    enum TCamModeChange
+      {
+      ECamModeChangeInactive,
+      ECamModeChangeVideo2Image,
+      ECamModeChangeImage2Video
+      };
+    enum TCamModeChangePhase
+      {
+      ECamModeChangePhaseIdle,
+      ECamModeChangePhase0,
+      ECamModeChangePhase1,
+      ECamModeChangePhase2,
+      ECamModeChangePhase3,
+      ECamModeChangePhase4
+      };
+
+    TCamModeChange      iModeChange;      
+    TInt                iModeChangePhase; // TCamModeChangePhase
+    TInt                iModeChangeStatus;
+  #endif // CAMERAAPP_CAE_FIX
+#endif
+
+    // This bool is used to determine whether current event is the first or second one.
+    TBool               iFirstAfEventReceived;
+	 
+    // This bool is used to determine whether AF operation is started 
+    TBool               iAfInProgress;
+	
+    // This bool is used to determine whether HyperFocal needs to be set 	
+    TBool               iAfHyperfocalPending;
+
+  // -------------------------------------------------------
+  // Flash simulation
+#ifdef CAMERAAPP_FLASH_SIMULATOR
+    CCamFlashSimulator*                iFlashSimulator;
+#endif 
+
+    // -------------------------------------------------------
+    // CAE error simulation
+#ifdef CAMERAAPP_CAE_ERR_SIMULATION
+    // Timer for delaying callbacks to simulate difficult/erroneous situations
+    CCamTimer* iCallbackTimer;
+    
+    TCamCameraEventId  iSimEventId;
+    TInt               iSimStatus;
+
+    static TInt DelayedCaeCallback( TAny* aController );
+    
+    void CallAppropriateCallback( const TCamCameraEventId aEventId = ECamCameraEventNone,
+                                        TInt              aStatus  = 0 );
+    
+#endif // CAMERAAPP_CAE_ERR_SIMULATION
+    
+  // -------------------------------------------------------    
+
+  // -------------------------------------------------------
+  // Performance logging related
+#ifdef CAMERAAPP_PERFORMANCE_CONTROLLER
+  public:
+    const CCamPerformanceLogger* PerformanceLogger() const;
+
+  private:
+    CCamPerformanceLogger*             iPerformanceLogger;
+    TBool                              iFirstVfFrameReceived;    
+#endif // CAMERAAPP_PERFORMANCE_CONTROLLER
+  // -------------------------------------------------------
+
+  public:
+     void SetBurstImagesRemaining( TInt aBurstImagesRemaining );
+    TBool AsyncVideoStopModeSupported();
+
+        
+    /**
+    * Used to recover lost resources. 
+    *
+    * @param aSelf pointer to CCamCameraController object
+    * @return N/A
+    */
+    static TInt IdleCallback( TAny* aSelf );   
+
+    /**
+    * Helper method for IdleCallback 
+    */
+    void DoIveRecovery();
+
+    /**
+    * Indicates resource recovery state.
+    * @return TBool, ETrue if resource recovering is initated
+    */
+    TBool IsWaitingIveResources();  
+    
+  private:
+    TInt iBurstImagesRemaining;
+
+    // not own
+    RWindowBase* iViewfinderWindow;
+    CIdle* iIdle;  
+
+    // Counts how many times lost resources are tried to recover 
+    // (KIveRecoveryCountMax).
+    TInt iIveRecoveryCount;  
+    TBool iIveRecoveryOngoing;
+    // ETrue if cancelling command sequence is in progress,
+    // due to lost resources, before recovering.
+    TBool iIveCancel;
+    // ETrue when first recovery command has got callback.  
+    TBool iIveSequenceActive;
+    
+    CCamAppController& iAppController;
+    TInt iCurrentCameraIndex;  
+
+  };
+
+#endif // CAM_CAMERACONTROLLER_H
+
+// end of file