camerauis/cameraapp/generic/src/CamZoomModel.cpp
branchRCL_3
changeset 24 bac7acad7cb3
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/camerauis/cameraapp/generic/src/CamZoomModel.cpp	Wed Sep 01 12:30:54 2010 +0100
@@ -0,0 +1,1538 @@
+/*
+* Copyright (c) 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:  Controls the state of the zoom*
+*/
+
+
+// Defining this will reduce the wait period between repeated
+// zoom in/out events being sent.  This is just a development
+// test feature.
+
+// INCLUDE FILES
+#include    "CamZoomModel.h"
+#include    "CamZoomPane.h"
+#include    "CamPSI.h"
+#include    "CamUtility.h"
+#include    "CamAppUi.h"
+
+// CONSTANTS
+
+// MACROS
+
+// LOCAL CONSTANTS AND MACROS
+
+// MODULE DATA STRUCTURES
+
+// LOCAL FUNCTION PROTOTYPES
+
+// FORWARD DECLARATIONS
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CCamZoomModel::CCamZoomModel
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CCamZoomModel::CCamZoomModel( CCamAppController& aController, 
+                              CCamZoomPane*      aPane ) 
+  : iCurrentResolution( KErrNotReady ),
+    iController( aController ),
+    iPane( aPane )
+  {
+  }
+
+// -----------------------------------------------------------------------------
+// CCamZoomModel::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CCamZoomModel::ConstructL()
+    {    
+    PRINT( _L( "Camera => CCamZoomModel::ConstructL " ) );
+    
+    // Retrieve the max digital zoom levels
+    TPckgBuf <TCamMaxZoomSteps> pckg;
+    CamUtility::GetPsiAnyL( ECamPsiMaxZoomSteps, &pckg );
+    iDigZoomSteps = pckg();
+
+    // Retrieve the max EXTENDED zoom levels
+    TPckgBuf <TCamMaxZoomSteps> pckg2;
+    CamUtility::GetPsiAnyL( ECamPsiMaxExtendedZoomSteps, &pckg2 );
+    iExtZoomSteps = pckg2();
+        
+    // Retrieve the max OPTICAL zoom levels
+    TPckgBuf <TCamMaxZoomSteps> pckg3;
+    CamUtility::GetPsiAnyL( ECamPsiMaxOpticalZoomSteps, &pckg3 );
+    iOptZoomSteps = pckg3();
+
+    // Retrieve the timing and step values for each of the zoom bar 
+    // modes for Optical/Digital/Extended    
+    TPckgBuf <TCamZoomLAF> pckg4;
+    CamUtility::GetPsiAnyL( ECamPsiZoomBarLAF, &pckg4);
+    iZoomLAF = pckg4();
+    
+    // Setting up initial internal values for zoom levels
+    iCurZoomStepOptical = 0;
+    iCurZoomStepDigital = 0;        
+
+    // Default zoom jump multiplier
+    iZoomStepMultiplier = 1;
+
+    // Timer used to give smooth zooming    
+    iZoomTimer = CPeriodic::NewL( CActive::EPriorityHigh );          
+    
+    // Register for controller events
+    iController.AddControllerObserverL( this );
+    
+    // Create Zoom Update manager, which is used to 
+    // minimize the amount of times we send updates to
+    // the camera driver.
+    iCamZoomUpdateManager = CCamZoomUpdateManager::NewL( iController );
+    
+    // This class and zoom pane are created on application start.
+    // On app start, we should be setting the zoom to 1x, to 
+    // tidy up incase a previous app has not reset to defaults.
+    ResetZoomTo1x();
+    
+    PRINT( _L( "Camera <= CCamZoomModel::ConstructL " ) );
+    }
+
+// -----------------------------------------------------------------------------
+// CCamZoomModel::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CCamZoomModel* CCamZoomModel::NewL( CCamAppController& aController, CCamZoomPane* aPane )
+    {
+    CCamZoomModel* self = new( ELeave ) CCamZoomModel( aController, aPane );
+    
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop();
+
+    return self;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCamZoomModel::~CCamZoomModel
+// Destructor.
+// -----------------------------------------------------------------------------
+//
+CCamZoomModel::~CCamZoomModel()
+  {
+  PRINT( _L("Camera => ~CCamZoomModel" ))  
+  
+  iController.RemoveControllerObserver( this );
+  if ( iZoomTimer && iZoomTimer->IsActive() )
+    {    
+    iZoomTimer->Cancel();
+    }
+  delete iZoomTimer;    
+  
+  if ( iCamZoomUpdateManager && iCamZoomUpdateManager->IsActive() )
+    {    
+    iCamZoomUpdateManager->Cancel();
+    }
+  delete iCamZoomUpdateManager;    
+    
+  iPane = NULL;   // Not owned
+  PRINT( _L("Camera <= ~CCamZoomModel" ))  
+  }
+
+// -----------------------------------------------------------------------------
+// CCamZoomModel::ZoomTo
+// Attempts to zoom to a specified value.
+// -----------------------------------------------------------------------------
+//
+void CCamZoomModel::ZoomTo( TInt aValue )
+    {    
+    PRINT( _L( "Camera => CCamZoomModel::ZoomTo " ) );
+    // Note: The following code only supports digital or 
+    // digital+extended zoom combinations.  
+    // Optical zoom is not taken into consideration.
+    
+    // avoid mixups between button and touch presses
+    if ( ZoomingState() != ECamZoomModelStateZoomNone )
+        {
+        PRINT( _L( "Camera <> CCamZoomModel::ZoomTo stopping keypress zoom" ) );
+        StopZoom();
+        }
+    
+    // Start the zoom state
+    iState = ECamZoomModelStateZoomTo;
+    
+    // We don't support pausing between boundaries.  If the 
+    // user experience so requires, it should be implemented here.
+     
+    // Update the zoom values
+    // Note: Both digital and extended zoom are represented by iCurZoomStepDigital.
+    // We assume the maximum value is already checked 
+    // in CCamZoomPane::StartTouchZoomL
+    PRINT1( _L( "Camera <> CCamZoomModel::ZoomTo iMaxZoomStepDig=%d" ), iMaxZoomStepDig ); 
+    PRINT1( _L( "Camera <> CCamZoomModel::ZoomTo iMaxZoomStepExt=%d" ), iMaxZoomStepExt ); 
+    PRINT1( _L( "Camera <> CCamZoomModel::ZoomTo iCurZoomStepDigital=%d" ), iCurZoomStepDigital ); 
+    iCurZoomStepDigital = aValue;
+    if ( iCurZoomStepDigital < iMaxZoomStepDig )
+        {
+        CheckZoomMode( ECamZoomModeExtended );
+        }
+    else
+        {
+        CheckZoomMode( ECamZoomModeDigital );
+        }
+            
+    // Notify the camera driver
+    PRINT1( _L( "Camera <> CCamZoomModel::ZoomTo to (aValue) %d" ), aValue );
+    iCamZoomUpdateManager->SetZoomValue( iCurZoomStepDigital );
+    
+    // Tell the zoom pane the value to show.
+    PRINT1( _L( "CCamZoomModel::ZoomTo set zoom pane %d" ), CurrentZoom() );
+    iPane->SetZoomValue( CurrentZoom() );
+        
+    // Clear the zoom state
+    iState = ECamZoomModelStateZoomNone; 
+                    
+    PRINT( _L( "Camera <= CCamZoomModel::ZoomTo " ) );
+    }
+    
+// -----------------------------------------------------------------------------
+// CCamZoomModel::ZoomIn
+// Attempts to zoom in one step (if one more step available).
+// -----------------------------------------------------------------------------
+//
+void CCamZoomModel::ZoomIn( TBool aOneClick )
+    {    
+    PRINT( _L( "Camera => CCamZoomModel::ZoomIn " ) );
+    iState = ECamZoomModelStateZoomIn;
+    TInt optZoomJump = 0;
+    TInt digZoomJump = 0;    
+    TInt extZoomJump = 0;
+    
+    ZoomStepsToJump( optZoomJump, digZoomJump, extZoomJump );
+    PRINT3( _L( "CCamZoomModel::ZoomIn steps opt(%d) dig(%d) ext(%d) " ), optZoomJump, digZoomJump, extZoomJump );
+    
+    // First of all, check what the current boundary condition is
+    // then check if we need to pause at that boundary.
+    PRINT( _L( "ZoomIn boundary check start" ) );
+    
+    TCamZoomBoundary boundary = CheckBoundary();
+    if ( PauseAtBoundary( boundary ) )
+        {        
+        if ( iPauseState == EPauseStateNone )
+            {
+            PRINT( _L( "ZoomIn at boundary EPauseStateNone return" ) );
+            // If this is a new pause, update the state and return
+            // (no zoom allowed until release)
+            iPauseState = EPauseStatePaused;
+            return;
+            }
+        else if ( iPauseState == EPauseStatePaused )
+            {
+            PRINT( _L( "ZoomIn at boundary EPauseStatePaused return" ) );
+            // If still paused, return (no zoom allowed until release)
+            return;
+            }
+        else // EPauseStateReleased
+            {
+            PRINT( _L( "ZoomIn at boundary EPauseStateReleased allow" ) );
+            // If released, allow the zoom, but set the state
+            // back to none.  
+            iPauseState = EPauseStateNone;
+            }
+        }
+        
+    PRINT( _L( "ZoomIn at boundary EPauseStateNone boundary check end" ) );
+        
+    if ( optZoomJump )        
+        {
+        CheckZoomMode( ECamZoomModeOptical );
+        iCurZoomStepOptical += optZoomJump;
+        PRINT1( _L( "Camera => CCamZoomModel::ZoomIn opt to %d" ), iCurZoomStepOptical );
+        //iController.SetZoomValue( iCurZoomStepOptical );            
+        iCamZoomUpdateManager->SetZoomValue( iCurZoomStepOptical );
+        }
+        
+    if ( digZoomJump )        
+        {
+        CheckZoomMode( ECamZoomModeDigital );
+        iCurZoomStepDigital += digZoomJump;
+        PRINT1( _L( "Camera => CCamZoomModel::ZoomIn dig to %d" ), iCurZoomStepDigital );
+        //iController.SetZoomValue( iCurZoomStepDigital );              
+        iCamZoomUpdateManager->SetZoomValue( iCurZoomStepDigital );
+        }
+        
+    if ( extZoomJump )
+        {
+        CheckZoomMode( ECamZoomModeExtended );
+        iCurZoomStepDigital += extZoomJump;
+        PRINT1( _L( "Camera => CCamZoomModel::ZoomIn ext to %d" ), iCurZoomStepDigital );
+        //iController.SetZoomValue( iCurZoomStepDigital );              
+        iCamZoomUpdateManager->SetZoomValue( iCurZoomStepDigital );
+        }
+
+    // Tell the zoom pane the value to show.
+    PRINT1( _L( "CCamZoomModel::ZoomIn set zoom pane %d" ), CurrentZoom() );
+    iPane->SetZoomValue( CurrentZoom() );
+                    
+    if ( aOneClick )
+        {
+        // Do not start zoom timer
+        PRINT( _L( "CCamZoomModel::ZoomIn one click" ) );
+        iState = ECamZoomModelStateZoomNone;
+        }
+    else
+        {
+        // Don't restart timer (Auto-stop) timer when no zoom was done
+        if( optZoomJump || digZoomJump || extZoomJump )
+            {
+            // Start the timer to zoom-in again when timer expires
+            PRINT( _L( "CCamZoomModel::ZoomIn start zoom timer" ) );
+            StartZoomTimer();
+            }
+        else
+            {
+            PRINT( _L("Camera <> CCamZoomModel::ZoomOut - stopping zoom at boundary") );
+            StopZoom();
+            }
+        }
+    
+    PRINT( _L( "Camera <= CCamZoomModel::ZoomIn " ) );
+    }
+
+// ---------------------------------------------------------------------------
+// CCamZoomModel::CheckBoundary
+// Checks whether the next zoom operation will cross a zoom mode boundary.
+// For example from Optical to Digital or from Digital to Extended
+// ---------------------------------------------------------------------------
+//    
+CCamZoomModel::TCamZoomBoundary CCamZoomModel::CheckBoundary() const
+    {
+    PRINT( _L( "Camera => CCamZoomModel::CheckBoundary " ) );
+    
+    TCamZoomBoundary retVal = ECamZoomBoundaryNone;        
+    
+    TCamZoomMode modeBefore = CurrentZoomType();
+    TCamZoomMode modeAfter  = CurrentZoomType( ZoomStepsToJump() );
+    
+    if ( modeBefore != modeAfter )
+        {
+        if ( modeBefore == ECamZoomModeOptical && modeAfter  == ECamZoomModeDigital ||
+             modeBefore == ECamZoomModeDigital && modeAfter  == ECamZoomModeOptical )
+            {
+            PRINT( _L( "Camera <> CCamZoomModel::CheckBoundary ECamZoomBoundaryOptDig" ) );
+            retVal = ECamZoomBoundaryOptDig;
+            }
+        else if ( modeBefore == ECamZoomModeExtended && modeAfter  == ECamZoomModeDigital ||
+                  modeBefore == ECamZoomModeDigital && modeAfter  == ECamZoomModeExtended )
+            {
+            PRINT( _L( "Camera <> CCamZoomModel::CheckBoundary ECamZoomBoundaryDigExt" ) );
+            retVal = ECamZoomBoundaryDigExt;
+            }        
+        else
+            {
+            // Undefined boundary, should not allow further zooming
+            PRINT( _L( "Camera <> CCamZoomModel::CheckBoundary ECamZoomBoundaryUndefined" ) );
+            retVal = ECamZoomBoundaryUndefined;
+            }
+        }
+     else
+        {
+        PRINT( _L( "Camera <> CCamZoomModel::CheckBoundary ECamZoomBoundaryNone" ) );
+        retVal = ECamZoomBoundaryNone;
+        }
+    
+    PRINT( _L( "Camera <= CCamZoomModel::CheckBoundary " ) );
+    return retVal;   
+    }
+    
+    
+// ---------------------------------------------------------------------------
+// CCamZoomModel::ZoomStepsToJump
+// Returns the total number of zoom steps to jump based on the current 
+// zoom mode (opt/dig/ext). Does not break these steps into optical/digital
+// steps to jump, as may be the case on a boundary.
+// ---------------------------------------------------------------------------
+//      
+TInt CCamZoomModel::ZoomStepsToJump() const
+    {      
+    PRINT( _L( "Camera => CCamZoomModel::ZoomStepsToJump " ) );
+    
+    TInt steps = 0;
+    
+    if ( iController.ActiveCamera() == ECamActiveCameraPrimary )    
+        {            
+        // Works out the current zoom mode (opt/dig/ext)
+        TCamZoomMode mode = CurrentZoomType();    
+        PRINT1( _L( "Camera <> CCamZoomModel::ZoomStepsToJump mode = %d" ), mode );
+        
+        if ( mode == ECamZoomModeOptical )
+            {        
+            steps = iZoomLAF.iZoomStepsOpt;
+            PRINT1( _L( "Camera <> CCamZoomModel::ZoomStepsToJump ECamZoomModeOptical steps = %d" ), steps );
+            }
+        else if ( mode == ECamZoomModeDigital )
+            {
+            steps = iZoomLAF.iZoomStepsDig;
+            PRINT1( _L( "Camera <> CCamZoomModel::ZoomStepsToJump ECamZoomModeDigital steps = %d" ), steps );
+            }
+        else if ( mode == ECamZoomModeExtended )    
+            {
+            steps = iZoomLAF.iZoomStepsExt;
+            PRINT1( _L( "Camera <> CCamZoomModel::ZoomStepsToJump ECamZoomModeExtended steps = %d" ), steps );
+            }    
+        else
+            {
+            steps = 0;            
+            }   
+        }
+    else if ( iController.ActiveCamera() == ECamActiveCameraSecondary )
+        {
+        //steps = K2ndCamZoomStepSize;
+        steps = iZoomLAF.iSecondCameraZoomSteps;
+        PRINT1( _L( "Camera <> CCamZoomModel::ZoomStepsToJump K2ndCamZoomStepSize steps = %d" ), steps );
+        }
+    else
+        {            
+        }
+        
+        
+    if ( iState == ECamZoomModelStateZoomOut )        
+        {
+        steps = -steps;    
+        PRINT1( _L( "Camera <> CCamZoomModel::ZoomStepsToJump Inverse, since ZoomOut: steps = %d" ), steps );
+        }
+        
+    PRINT( _L( "Camera <= CCamZoomModel::ZoomStepsToJump " ) );
+    return steps;                           
+    }
+
+// ---------------------------------------------------------------------------
+// CCamZoomModel::ZoomStepsToJump
+// Returns the number of Optical, Digital and Extended zoom steps to jump
+// ---------------------------------------------------------------------------
+//  
+void CCamZoomModel::ZoomStepsToJump( TInt& aOpt, TInt& aDig, TInt& aExt ) const
+    {  
+    PRINT( _L( "Camera => CCamZoomModel::ZoomStepsToJump (by reference)" ) );
+    
+    TInt steps = iZoomStepMultiplier * ZoomStepsToJump();
+
+    TCamZoomBoundary boundary = CheckBoundary();
+    
+    // If jumping this number of steps will make us cross the boundary, 
+    // we need to split the steps up into the composite opt/dig steps.
+    // Depending on if we are pausing or not, we may not want to cross
+    // the boundary yet
+    if ( boundary == ECamZoomBoundaryOptDig )
+        {
+        if ( iState == ECamZoomModelStateZoomIn )
+            {
+            // Zooming in, then assign what we can to Optical, to get to max step
+            // any remainder then goes to digital
+            TInt optJumpMax = iMaxZoomStepOpt - iCurZoomStepOptical;
+            aOpt = optJumpMax;
+            aDig = steps - optJumpMax;
+            
+            // If the zoom in was going to take the digital zoom beyond the max
+            // allowed, clip it
+            if ( aDig > iMaxZoomStepDig )
+                aDig = iMaxZoomStepDig;
+            }
+        else if ( iState == ECamZoomModelStateZoomOut )        
+            {
+            // Zooming out, then assign what we can to Digital, to get to min step
+            // any remainder then goes to optical            
+            aDig = -iCurZoomStepDigital;                
+            aOpt = steps + iCurZoomStepDigital; // zooming out, steps is -ve
+            }
+		else
+			{
+			// Lint
+			}
+        }
+    else if ( boundary == ECamZoomBoundaryDigExt )
+        {
+        if ( iState == ECamZoomModelStateZoomIn )
+            {
+            // Zooming in, then assign what we can to Optical, to get to max step
+            // any remainder then goes to digital
+            TInt digJumpMax = iMaxZoomStepDig - iCurZoomStepDigital;
+            aDig = digJumpMax;
+            aExt = steps - digJumpMax;
+            
+            // If the zoom in was going to take the digital zoom beyond the max
+            // allowed, clip it
+            if ( aExt > iMaxZoomStepExt )
+                aExt = iMaxZoomStepExt;            
+            }
+        else if ( iState == ECamZoomModelStateZoomOut )        
+            {
+            // Zooming out, then assign what we can to Digital, to get to min step
+            // any remainder then goes to optical            
+            //aDig = iCurZoomStepDigital;
+            aDig = steps;
+            //aExt = steps - iCurZoomStepDigital;                            
+            }
+        else
+        	{
+        	// Lint
+        	}
+        }        
+    else if ( boundary == ECamZoomBoundaryNone )
+        {
+        // No boundary crossed.  Can assign the steps to the current
+        // mode        
+        TCamZoomMode mode = CurrentZoomType();
+        
+        if ( iState == ECamZoomModelStateZoomIn )
+            {           
+            if ( mode == ECamZoomModeOptical && AllowOptZoom() )
+                {
+                aOpt = steps;
+                if ( iCurZoomStepOptical + aOpt > iMaxZoomStepOpt )
+                    {
+                    aOpt = iMaxZoomStepOpt - iCurZoomStepOptical;                            
+                    }                    
+                }
+            else if ( mode == ECamZoomModeDigital && AllowDigZoom() )
+                {
+                aDig = steps;    
+                if ( iCurZoomStepDigital + aDig > iMaxZoomStepDig )
+                    {
+                    aDig = iMaxZoomStepDig - iCurZoomStepDigital;                
+                    }                    
+                }
+            else if ( mode == ECamZoomModeExtended && AllowExtZoom() )
+                {
+                aExt = steps;                        
+                if ( iCurZoomStepDigital + aExt > iMaxZoomStepExt )
+                    {
+                    aExt = iMaxZoomStepExt - iCurZoomStepDigital;    
+                    }                    
+                }               
+            else
+                {
+                // Do nothing (as invalid state)
+                }                                             
+            }
+        else if ( iState == ECamZoomModelStateZoomOut ) 
+            {                
+            if ( mode == ECamZoomModeOptical && AllowOptZoom() )
+                {
+                aOpt = steps;
+                if ( iCurZoomStepOptical + aOpt < 0 )
+                    {
+                    aOpt = -iCurZoomStepOptical;                            
+                    }                    
+                }
+            else if ( mode == ECamZoomModeDigital && AllowDigZoom() )
+                {
+                aDig = steps;    
+                if ( iCurZoomStepDigital + aDig < 0 )
+                    {
+                    aDig = -iCurZoomStepDigital;                
+                    }                    
+                }
+            else if ( mode == ECamZoomModeExtended && AllowExtZoom() )
+                {
+                aExt = steps;                        
+                if ( iCurZoomStepDigital + aExt < iMaxZoomStepDig )
+					{
+                    aExt = iMaxZoomStepDig - iCurZoomStepDigital;
+					}
+                }        
+            else
+                {
+                // Do nothing (as invalid state)
+                }                        
+            }
+		else
+			{
+			// Lint
+			}            
+        }       
+    else // ECamZoomBoundaryUndefined
+        {
+        // If undefined boundary, this would result in an invalid
+        // zoom valid if we zoom, so set all steps to zero.        
+        // This will stop any zoom operation from changing state.
+        aOpt = 0;
+        aDig = 0;
+        aExt = 0;
+        }
+        
+    PRINT( _L( "Camera <= CCamZoomModel::ZoomStepsToJump " ) );
+    }
+    
+    
+// ---------------------------------------------------------------------------
+// CCamZoomModel::CurrentZoomType
+// Returns the zoom type (opt/dig/ext) based on current zoom levels modified
+// by the specified optical/digital valies
+// ---------------------------------------------------------------------------
+//   
+TCamZoomMode CCamZoomModel::CurrentZoomType( TInt aStepModifier ) const
+    {
+    PRINT( _L( "Camera => CCamZoomModel::CurrentZoomType " ) );
+    
+    TInt maxOptZoomStep = ( iMaxZoomStepOpt == KErrNotSupported || !AllowOptZoom() )? 0 : iMaxZoomStepOpt;
+    TInt maxStdZoomStep = ( iMaxZoomStepDig == KErrNotSupported || !AllowDigZoom() )? maxOptZoomStep : maxOptZoomStep + iMaxZoomStepDig;
+    TInt maxExtZoomStep = ( iMaxZoomStepExt == KErrNotSupported || !AllowExtZoom() )? maxStdZoomStep : maxStdZoomStep + iMaxZoomStepExt;   
+    
+    // 
+    TInt step = CurrentZoom() + aStepModifier;    
+        
+    // Optical runs from step 0 to maxOptZoomStep
+    if ( step <= maxOptZoomStep && // Not at max opt zoom level        
+         AllowOptZoom() )          // ... and optical zoom is allowed        
+        {
+        PRINT( _L( "Camera <= CCamZoomModel::CurrentZoomType ECamZoomModeOptical" ) );
+        return ECamZoomModeOptical;
+        }
+    // Digital runs from maxOptZoomStep to maxOptZoomStep+maxStdZoomStep
+    else if ( step >= maxOptZoomStep &&
+              step <= maxStdZoomStep && // Inside std zoom step limits
+              AllowDigZoom() )          // ...and is allowed by user setting
+        {
+        PRINT( _L( "Camera <= CCamZoomModel::CurrentZoomType ECamZoomModeDigital" ) );
+        return ECamZoomModeDigital;
+        }
+    // Extended runs from maxOptZoomStep+maxStdZoomStep to maxOptZoomStep+maxStdZoomStep        
+    else if ( step >= maxStdZoomStep &&
+              step <= maxExtZoomStep &&   // Inside ext zoom step limits
+              AllowExtZoom() )            // ...and ext zoom is allowed by user
+        {
+        PRINT( _L( "Camera <= CCamZoomModel::CurrentZoomType ECamZoomModeExtended" ) );
+        return ECamZoomModeExtended;
+        }
+    else
+        {
+        PRINT( _L( "Camera <= CCamZoomModel::CurrentZoomType ECamZoomModeUndefined" ) );
+        return ECamZoomModeUndefined;
+        }                   
+    }
+
+// -----------------------------------------------------------------------------
+// CCamZoomModel::ZoomOut
+// Attempts to zoom out one step (if one more step available).
+// -----------------------------------------------------------------------------
+//
+void CCamZoomModel::ZoomOut( TBool aOneClick )
+    {        
+    PRINT( _L( "Camera => CCamZoomModel::ZoomOut " ) );
+    iState = ECamZoomModelStateZoomOut;
+    TInt optZoomJump = 0;
+    TInt digZoomJump = 0;    
+    TInt extZoomJump = 0; 
+    
+    ZoomStepsToJump( optZoomJump, digZoomJump, extZoomJump );
+    PRINT3( _L( "CCamZoomModel::ZoomOut steps opt(%d) dig(%d) ext(%d) " ), optZoomJump, digZoomJump, extZoomJump );
+    
+    if ( optZoomJump )        
+        {
+        CheckZoomMode( ECamZoomModeOptical );
+        iCurZoomStepOptical += optZoomJump;
+        PRINT1( _L( "Camera => CCamZoomModel::ZoomOut opt to %d" ), iCurZoomStepOptical );
+        //iController.SetZoomValue( iCurZoomStepOptical );            
+        iCamZoomUpdateManager->SetZoomValue( iCurZoomStepOptical );
+        }
+        
+    if ( digZoomJump )        
+        {
+        CheckZoomMode( ECamZoomModeDigital );
+        iCurZoomStepDigital += digZoomJump;
+        PRINT1( _L( "Camera => CCamZoomModel::ZoomOut dig to %d" ), iCurZoomStepDigital );
+        //iController.SetZoomValue( iCurZoomStepDigital );              
+        iCamZoomUpdateManager->SetZoomValue( iCurZoomStepDigital );
+        }
+        
+    if ( extZoomJump )
+        {
+        CheckZoomMode( ECamZoomModeExtended );
+        iCurZoomStepDigital += extZoomJump;
+        PRINT1( _L( "Camera => CCamZoomModel::ZoomOut ext to %d" ), iCurZoomStepDigital );
+        //iController.SetZoomValue( iCurZoomStepDigital );           
+        iCamZoomUpdateManager->SetZoomValue( iCurZoomStepDigital );   
+        }    
+
+    // Tell the zoom pane the value to show.
+    PRINT1( _L( "ZoomOut set zoom pane %d" ), CurrentZoom() );
+    iPane->SetZoomValue( CurrentZoom() );    
+
+    if ( aOneClick )
+        {
+        // Do not start zoom timer
+        PRINT( _L( "CCamZoomModel::ZoomIn one click" ) );
+        iState = ECamZoomModelStateZoomNone;
+        }
+    else
+        {
+        // Don't restart timer (auto-stop) timer when no zoom was done
+        if( optZoomJump || digZoomJump || extZoomJump )
+            {
+            // Start the timer to zoom-in again when timer expires
+            PRINT( _L( "CCamZoomModel::ZoomIn start zoom timer" ) );
+            StartZoomTimer();
+            }
+        else
+            {
+            PRINT( _L("Camera <> CCamZoomModel::ZoomOut - stopping zoom at boundary") );
+            StopZoom();
+            }
+        }
+    
+    PRINT( _L( "Camera <= CCamZoomModel::ZoomOut " ) );
+    }
+
+// -----------------------------------------------------------------------------
+// CCamZoomModel::CheckZoomMode
+// Checks to see if the zoom mode needs to be changed.
+// The purpose is to avoid unneccessary calls to SetZoomMode where possible
+// -----------------------------------------------------------------------------
+//
+void CCamZoomModel::CheckZoomMode( TCamZoomMode aMode )
+  {
+  PRINT( _L( "Camera => CCamZoomModel::CheckZoomMode " ) );
+  if ( iZoomMode             != aMode 
+    && ECamZoomModeUndefined != aMode )
+    {
+    //iController.SetZoomMode( aMode );
+    PRINT2( _L( "Camera <> CCamZoomModel::CheckZoomMode iZoomMode changed (%d) -> (%d) " ), aMode, iZoomMode );
+    iZoomMode = aMode;
+    }
+  PRINT( _L( "Camera <= CCamZoomModel::CheckZoomMode " ) );  
+  }
+
+// -----------------------------------------------------------------------------
+// CCamZoomModel::RefreshSettings
+// Checks the current state of the Camera application, and adjusts the min/max
+// range of the zoom pane accordingly.
+// -----------------------------------------------------------------------------
+//
+void CCamZoomModel::RefreshSettings()
+  {
+  PRINT( _L("Camera => CCamZoomModel::RefreshSettings") );
+  // If there is no active camera yet, or engine is not 
+  // in a prepared state yet, do not try to refresh settings
+  // as we can't work out what to base it on.
+
+  // <CAMERAAPP_CAPI_V2_MIGRATION/>
+  if( iController.ActiveCamera() == ECamActiveCameraNone 
+   || !( iCameraState & (ECamImageOn|ECamVideoOn) ) 
+    ) 
+    {
+    return;
+    }        
+
+  // Cache the current resolution to be used when 
+  // determining zoom limits and steps.
+  ReadCurrentResolution();      
+
+  // Read settings to update internal state        
+  ReadOpticalZoomSetting();
+  ReadDigitalZoomSetting();
+
+  iMaxZoomStepOpt = MaxZoomStep( iOptZoomSteps );
+  iMaxZoomStepDig = MaxZoomStep( iDigZoomSteps );
+  iMaxZoomStepExt = MaxZoomStep( iExtZoomSteps );
+      
+  iMaxZoomStep = 0;
+
+  PRINT3( _L("Camera <> CCamZoomModel: max steps opt:%d dig:%d ext:%d"), iMaxZoomStepOpt, iMaxZoomStepDig, iMaxZoomStepExt );
+
+  if ( AllowOptZoom() )
+    {        
+    iMaxZoomStep += iMaxZoomStepOpt;        
+    }
+    
+  // Check if Digital zoom is allowed
+  if ( AllowDigZoom() )
+    {                
+    // Check if EXTENDED zoom is allowed by user setting
+    // and the value is valid.  For secondary camera, it may
+    // be that it is not supported.
+    if ( AllowExtZoom() ) // done in AllowExtZoom: && iMaxZoomStepExt != KErrNotSupported)
+      {                                        
+      iMaxZoomStep += iMaxZoomStepExt;        
+      }
+    else
+      {            
+      iMaxZoomStep += iMaxZoomStepDig;        
+      }
+    }
+
+  TInt optSteps = ( AllowOptZoom() ) ? iMaxZoomStepOpt : 0; 
+  TInt stdSteps = ( AllowDigZoom() ) ? iMaxZoomStepDig : 0;
+  TInt extSteps = ( AllowExtZoom() ) ? Max( (iMaxZoomStepExt - iMaxZoomStepDig), 0 ) : 0;
+          
+  // Check that the max zoom is within (possibly new) limits
+  CheckZoomLimit();
+  
+  if ( iPane )
+    {
+    // Inform the zoom pane of the new range of zoom steps
+    iPane->SetZoomRange( 0, iMaxZoomStep ); 
+    iPane->SetZoomSteps( optSteps, stdSteps, extSteps );        
+    iPane->SetZoomValue( CurrentZoom() );
+    }
+
+  PRINT( _L("Camera <= CCamZoomModel::RefreshSettings") );
+  }
+    
+    
+// -----------------------------------------------------------------------------
+// CCamZoomModel::ReadDigitalZoomSetting
+// Updates the setting for digital/extended zoom or not depending if user 
+// setting for it is on AND we have a valid setting for it.
+// -----------------------------------------------------------------------------
+//    
+void CCamZoomModel::ReadDigitalZoomSetting()
+    {        
+    iZoomSetting = static_cast<TCamSettingsDigitalZoom>(
+        iController.IntegerSettingValue( ECamSettingItemPhotoDigitalZoom ) );    
+    }
+
+
+
+// -----------------------------------------------------------------------------
+// CCamZoomModel::ReadOpticalZoomSetting
+// Reads whether optical zoom is allowed
+// -----------------------------------------------------------------------------
+//    
+void CCamZoomModel::ReadOpticalZoomSetting()
+    {     
+    }    
+    
+    
+// -----------------------------------------------------------------------------
+// CCamZoomModel::CheckZoomLimit
+// Checks whether the current zoom level is too great for the limits.
+// This can happen if the resolution is changed, as this may result in new limits
+// The zoom level should be cropped to where appropriate
+// -----------------------------------------------------------------------------
+//      
+void CCamZoomModel::CheckZoomLimit()
+    {    
+    TInt maxOptZoomStep = MaxZoomStep( iOptZoomSteps );
+    TInt maxStdZoomStep = MaxZoomStep( iDigZoomSteps );
+    TInt maxExtZoomStep = MaxZoomStep( iExtZoomSteps );
+
+    if ( AllowOptZoom() &&                      // If settings allow optical zoom, 
+         iCurZoomStepOptical > maxOptZoomStep ) // ...and value now too high
+        {
+        iCurZoomStepOptical = maxOptZoomStep;
+        // iController.SetZoomMode ( ECamZoomModeOptical );
+        iController.SetZoomValue( iCurZoomStepOptical );                                         
+        }
+
+    if ( AllowDigZoom()                        // If digital zoom is allowed
+      && iCurZoomStepDigital > maxStdZoomStep  // and value now too high
+      && !AllowExtZoom() )                     // and extended not allowed
+        {
+        // If we get here, digital zoom IS allowed, but extended isn't
+        // and the digital zoom is too high.
+        iCurZoomStepDigital = maxStdZoomStep;
+        //iController.SetZoomMode ( ECamZoomModeDigital );
+        iController.SetZoomValue( iCurZoomStepDigital );                                                        
+        }
+    else if ( AllowExtZoom()                         // If extended digitial zoom is allowed
+           && iCurZoomStepDigital > maxExtZoomStep ) // but over the max extended range
+        {        
+        iCurZoomStepDigital = maxExtZoomStep;
+        // iController.SetZoomMode ( ECamZoomModeDigital );
+        iController.SetZoomValue( iCurZoomStepDigital );                                                                    
+        }
+    // otherwise, do nothing
+    else
+        {
+        // empty statement to remove Lint error.
+        }
+        
+    // If we have had to manually set the mode and value of zoom, 
+    // make sure that the zoom mode is still set to what internal state
+    // dictates it should be.    
+
+    /*
+    if ( iZoomMode == ECamZoomModeOptical )
+        {
+        iController.SetZoomMode( ECamZoomModeOptical );
+        }
+    else if ( iZoomMode == ECamZoomModeDigital ||
+              iZoomMode == ECamZoomModeExtended )
+        {
+        iController.SetZoomMode( ECamZoomModeDigital );
+        }            
+    // otherwise, do nothing
+    else
+        {
+        // empty statement to remove Lint error.
+    */
+    }
+ 
+// -----------------------------------------------------------------------------
+// CCamZoomModel::ResetZoomTo1x
+// Resets the zoom level to 1x.
+// -----------------------------------------------------------------------------
+//    
+void CCamZoomModel::ResetZoomTo1x()
+  {
+  PRINT( _L( "Camera => CCamZoomModel::ResetZoomTo1x " ) );
+  // Recalculates the min/max values for the zoom pane and
+  // forwards them to the control.
+  RefreshSettings();        
+  
+  // Reset the actual values used by the engine
+  iCurZoomStepOptical = 0;
+  iCurZoomStepDigital = 0;
+  
+  iZoomMode = ECamZoomModeUndefined;
+  
+  // Only digital mode supported for now.        
+  //iController.SetZoomMode( ECamZoomModeDigital );
+  iController.SetZoomValue( iCurZoomStepDigital );                                
+  if ( iPane )
+    {
+    iPane->SetZoomValue( 0 );
+    iPane->MakeVisible( EFalse, EFalse );
+    }
+    
+  PRINT( _L( "Camera <= CCamZoomModel::ResetZoomTo1x " ) );
+  }        
+        
+
+// -----------------------------------------------------------------------------
+// CCamZoomModel::MaxZoomStep
+// Returns the maximum zoom step for the supplied step array 
+// (optical/digital/extended), based on current camera state.
+// -----------------------------------------------------------------------------
+//
+TInt CCamZoomModel::MaxZoomStep( const TCamMaxZoomSteps& aStepArray ) const
+    {        
+    PRINT( _L( "Camera => CCamZoomModel::MaxZoomStep " ) );
+    
+    TInt maxStep = KErrNotSupported;
+    if ( iCameraState & ECamImageOn )
+        {                
+        // TCamPhotoSizeId  sizeId = iController.GetCurrentImageResolution();
+        TCamActiveCamera camera = iController.ActiveCamera();
+        if ( ECamActiveCameraPrimary == camera )
+            {
+            // switch ( sizeId )
+            switch ( iCurrentResolution )
+                {
+                case ECamPhotoSizeVGA:       // 640 x 480
+                    maxStep = aStepArray.iMaxPhotoStepVGA;
+                    break;
+                case ECamPhotoSizeXGA: 	// 0.8MegaPixel (1024 x 768 )
+                    maxStep = aStepArray.iMaxPhotoStep0_8MP;
+                    break;
+                case ECamPhotoSize1MP:
+                    maxStep = aStepArray.iMaxPhotoStep1MP;
+                    break;
+                case ECamPhotoSize1_3MP:     // 1280x960
+                    maxStep = aStepArray.iMaxPhotoStep1_3MP;
+                    break;
+                case ECamPhotoSize2MP:       // 1600x1200
+                    maxStep = aStepArray.iMaxPhotoStep2MP;
+                    break;
+                case ECamPhotoSize3MP:       // 
+                    maxStep = aStepArray.iMaxPhotoStep3MP;
+                    break;  
+                case ECamPhotoSize5MP:
+                    maxStep = aStepArray.iMaxPhotoStep5MP;
+                    break;
+                case ECamPhotoSize8MP:
+                    maxStep = aStepArray.iMaxPhotoStep8MP;
+                    break;                    
+                case ECamPhotoSize12MP:
+                    maxStep = aStepArray.iMaxPhotoStep12MP;
+                    break;
+                case ECamPhotoSizeW6MP: // 3264x1832
+                    maxStep = aStepArray.iMaxPhotoStepW6MP;
+                    break;                    
+                case ECamPhotoSizeW9MP: // 4000x2248
+                    maxStep = aStepArray.iMaxPhotoStepW9MP;
+                    break;                    
+                default: 
+                    break;
+                }                
+            }
+        else if ( ECamActiveCameraSecondary == camera  )
+            {
+            maxStep = aStepArray.iMax2ndCamPhotoStep;
+            }  
+        // otherwise, do nothing
+        else
+            {
+            // empty statement to remove Lint error.
+            }      
+        }
+    else if ( iCameraState & ECamVideoOn )
+        {
+        // TCamVideoResolution resId = iController.GetCurrentVideoResolution();        
+
+        if ( iController.ActiveCamera() == ECamActiveCameraPrimary )
+            {        
+            // switch ( resId )
+            switch ( iCurrentResolution )            
+                {
+                case ECamVideoResolutionSubQCIF:     // Small (128 x 96)
+                    maxStep = aStepArray.iMaxVideoStepSQCIF;
+                    break;
+                case ECamVideoResolutionQCIF:        // Medium (176 x 144)
+                    maxStep = aStepArray.iMaxVideoStepQCIF;
+                    break;
+                case ECamVideoResolutionCIF:         // Large (352 x 288) (Default)
+                    maxStep = aStepArray.iMaxVideoStepCIF;
+                    break;            
+                case ECamVideoResolutionVGA:         // VGA (640 x 480)
+                    maxStep = aStepArray.iMaxVideoStepVGA;            
+                    break;            
+                case ECamVideoResolutionQVGA:         // QVGA ( 320 x 240 )
+                    maxStep = aStepArray.iMaxVideoStepQVGA;
+                    break;                                        
+                case ECamVideoResolutionNHD:         // NHD ( 640 x 352 )
+                    maxStep = aStepArray.iMaxVideoStepNHD;
+                    break;                                            
+                case ECamVideoResolutionWVGA:         // WVGA ( 864 x 480 )
+                    maxStep = aStepArray.iMaxVideoStepWVGA;
+                    break;                                                
+                case ECamVideoResolutionHD:           // HD ( 1280 x 720 )
+                    maxStep = aStepArray.iMaxVideoStepHD;
+                    break;                                                
+                default: 
+                    break;
+                }
+            }
+        else if ( iController.ActiveCamera() == ECamActiveCameraSecondary )
+            {
+            switch ( iCurrentResolution )
+                {
+                case ECamVideoResolutionCIF:         // Large (352 x 288) (Default)
+                    maxStep = aStepArray.iMax2ndCamVideoStepCIF;
+                    break;
+                case ECamVideoResolutionQCIF:        // Medium (176 x 144)
+                    maxStep = aStepArray.iMax2ndCamVideoStepQCIF;
+                    break;
+                case ECamVideoResolutionSubQCIF:     // Small (128 x 96)
+                    maxStep = aStepArray.iMax2ndCamVideoStepSQCIF;
+                    break;
+                default:
+                    break;
+                }                        
+            }  
+        // otherwise, do nothing
+        else
+            {
+            // empty statement to remove Lint error.
+            }      
+        }                
+    // otherwise, do nothing
+    else
+        {
+        // empty statement to remove Lint error.
+        }
+
+    PRINT1( _L( "Camera <= CCamZoomModel::MaxZoomStep maxStep=%d" ), maxStep );
+    return maxStep;
+    }
+
+
+    
+
+// -----------------------------------------------------------------------------
+// CCamZoomModel::StopZoom
+// Called when the user releases the zoom key to stop an ongoing zoom operation.
+// -----------------------------------------------------------------------------
+//
+void CCamZoomModel::StopZoom()
+    {    
+    PRINT( _L( "Camera => CCamZoomModel::StopZoom " ) );
+    
+    if ( iZoomTimer->IsActive() )
+        {
+        iZoomTimer->Cancel();
+        }
+
+    // Clear the zoom state
+    iState = ECamZoomModelStateZoomNone;
+
+    // Reset zoom multiplier
+    iZoomStepMultiplier = 1;
+
+    if ( iPauseState == EPauseStatePaused )
+        {
+        iPauseState = EPauseStateReleased;
+        }
+    else
+        {
+        iPauseState = EPauseStateNone;
+        }
+        
+    PRINT( _L( "Camera <= CCamZoomModel::StopZoom " ) );
+    }
+
+// -----------------------------------------------------------------------------
+// CCamZoomModel::HandleControllerEventL
+// Called when a controller event occurs
+// -----------------------------------------------------------------------------
+//
+void CCamZoomModel::HandleControllerEventL( TCamControllerEvent aEvent, 
+                                            TInt /*aError*/ )
+  {
+  PRINT( _L( "Camera => CCamZoomModel::HandleControllerEventL " ) );
+  switch( aEvent )
+    {
+    // -----------------------------------------
+    case ECamEventEngineStateChanged:
+      {
+      iCameraState = iController.CameraControllerState();  
+      
+      // If a reset is waiting. This happens if the application 'pretends to exit' 
+      // but this occurred when the engine was not prepared e.g. in standby.
+      // The zoom needs to be set back to default when prepared, and the engine has
+      // now entered a prepared state
+      if ( iResetPending 
+        && ( iCameraState & (ECamImageOn|ECamVideoOn) ) )
+          {
+          // The zoom pane will not be redrawn while the iResetPending flag is on.
+          // This calls RefreshSettings()
+          ResetZoomTo1x();
+          // In this situation the zoom pane should not be shown.
+          /*if ( iPane->IsVisible() )
+              {
+              iPane->MakeVisible( EFalse, ETrue );
+              }*/
+          iResetPending = EFalse;                
+          }     
+      else
+          {
+          // If state changes (video <-> photo) refresh settings
+          RefreshSettings();
+          }
+      }
+      break;
+    // -----------------------------------------
+    case ECamEventCameraChanged:
+      {        
+      // If state changes (camera change) refresh settings
+      RefreshSettings();
+      
+      ResetZoomTo1x();
+      }       
+      break;
+    // -----------------------------------------
+    // Zoom settings now involve basic digital zoom too.
+    // Event name changed ECamEventExtZoomStateChanged => ECamEventZoomSetupChanged
+    case ECamEventImageQualityChanged:
+    case ECamEventZoomSetupChanged:    // Digital/Extended zoom turned on/off/paused/continuous
+      {
+      // If image quality has changed, this may update zoom levels.
+      RefreshSettings();
+      }
+      break;
+    // -----------------------------------------
+    case ECamEventOperationStateChanged:
+      {
+      // As the iRecordingVideo state has changed, need to update
+      // the settings, as this may disable the optical zoom 
+      RefreshSettings();                                            
+      }
+      break;
+    // -----------------------------------------
+    // otherwise, do nothing
+    default:
+      break;
+    } // switch
+    
+  PRINT( _L( "Camera <= CCamZoomModel::HandleControllerEventL " ) );
+  }
+
+// ---------------------------------------------------------------------------
+// CCamZoomModel::ZoomTimerCallback
+// Callback for Zoom Pane timer, used to give smooth zooming
+// ---------------------------------------------------------------------------
+//
+TInt CCamZoomModel::ZoomTimerCallback( TAny* aObject )
+    {    
+    CCamZoomModel* model = static_cast< CCamZoomModel* >( aObject );
+    model->ZoomTimerTick();
+    return KErrNone;
+    }
+
+// ---------------------------------------------------------------------------
+// CCamZoomModel::ZoomTimerTick
+// Called each timer period while the zoom in/out key is held down.
+// ---------------------------------------------------------------------------
+//
+void CCamZoomModel::ZoomTimerTick()
+    {        
+    PRINT( _L("Camera => CCamZoomModel::ZoomTimerTick") );
+    TCamZoomMode modeBefore = iZoomMode;
+                   
+    // Continue the ongoing zoom operation
+    if ( iState == ECamZoomModelStateZoomIn )
+        {
+        ZoomIn();
+        }
+    else if ( iState == ECamZoomModelStateZoomOut )
+        {
+        ZoomOut();
+        }    
+    else
+        {
+        // Do nothing
+        }               
+    
+    // Check if we're currently on a boundary, in which case we need 
+    // to stop and re-initialise the timer for the (potentially) new
+    // interval.                            
+    TCamZoomMode modeAfter = iZoomMode;
+    
+    if ( modeBefore != modeAfter )
+        {
+        // Restart zoom;
+        if ( iZoomTimer->IsActive() )
+            {
+            iZoomTimer->Cancel();
+            }
+        StartZoomTimer();
+        }   
+    PRINT( _L("Camera <= CCamZoomModel::ZoomTimerTick") );
+    }        
+
+
+
+// ---------------------------------------------------------------------------
+// CCamZoomModel::StartZoomTimer
+// Called each timer period while the zoom in/out key is held down.
+// ---------------------------------------------------------------------------
+//
+void CCamZoomModel::StartZoomTimer()
+    {
+    PRINT( _L( "Camera => CCamZoomModel::StartZoomTimer " ) );
+    
+    if ( iZoomTimer->IsActive() )
+        {
+        return; // If only one speed, we're already running so just return.        
+        }
+          
+    TCamZoomMode mode = CurrentZoomType();                
+    
+    TInt stepPeriod = 0;
+    
+    switch ( mode )
+        {            
+        case ECamZoomModeOptical:
+            {
+            stepPeriod = iZoomLAF.iZoomSpeedOpt * 1000;
+            break;        
+            }
+        
+        case ECamZoomModeDigital:
+            {
+            if( iCameraState & ECamImageOn )
+                {    
+                stepPeriod = iZoomLAF.iZoomSpeedDig * 1000;
+                }
+            else
+                {
+                // use slower speed for videomode        
+                stepPeriod = iZoomLAF.iZoomSpeedDig * 2500;
+                }
+            break;        
+            }
+        
+        case ECamZoomModeExtended:
+            {
+            stepPeriod = iZoomLAF.iZoomSpeedExt * 1000;
+            break;        
+            }
+                    
+        case ECamZoomModeUndefined:
+        default:
+            {
+            stepPeriod = 1000000;
+            break;        
+            }        
+        }
+    
+    
+    iZoomTimer->Start( stepPeriod, stepPeriod, TCallBack( ZoomTimerCallback , this) );
+    iZoomMode = mode;
+    
+    PRINT( _L( "Camera <= CCamZoomModel::StartZoomTimer " ) );
+    }
+
+// ---------------------------------------------------------------------------
+// CCamZoomModel::AllowExtZoom
+// Returns whether extended zoom is allowed or not, based on current settings
+// ---------------------------------------------------------------------------
+//
+TBool CCamZoomModel::AllowExtZoom() const
+    {
+    PRINT( _L( "Camera => CCamZoomModel::AllowExtZoom " ) );
+    
+    TInt extendedStep = MaxZoomStep( iExtZoomSteps );    
+    
+    // Check there is a valid extended zoom step to allow to first, and that
+    // we are not in embedded mode (extended zoom not allowed in embedded)
+    if (  KErrNotSupported != extendedStep )
+        {
+        if ( iZoomSetting == ECamSettDigZoomExtendPause
+          || iZoomSetting == ECamSettDigZoomExtendCont )
+            {
+            // If setting allows extended zoom, return true
+            PRINT( _L( "Camera <= CCamZoomModel::AllowExtZoom ETrue" ) );
+            return ETrue;
+            }
+        else
+            {
+            // else user setting disallows it, so return false
+            PRINT( _L( "Camera <= CCamZoomModel::AllowExtZoom EFalse" ) );
+            return EFalse;
+            }
+        }
+    else
+        {
+        // No valid extended zoom, so not allowed even if user said so.
+        PRINT( _L( "Camera <= CCamZoomModel::AllowExtZoom EFalse" ) );
+        return EFalse;
+        }
+    }
+    
+// ---------------------------------------------------------------------------
+// CCamZoomModel::AllowOptZoom
+// Returns whether optical zoom is allowed
+// ---------------------------------------------------------------------------
+// 
+TBool CCamZoomModel::AllowOptZoom() const
+    {        
+    PRINT( _L( "Camera => CCamZoomModel::AllowOptZoom " ) ); 
+    TInt maxOptZoomStep = MaxZoomStep( iOptZoomSteps );
+    if ( KErrNotSupported == maxOptZoomStep // Zoom is NOT supported or
+      || ( !iAllowOptZoom                   // Settings dont allow zoom during recording 
+        && iRecordingVideo ) )              // ...and we're recording now
+        {
+        PRINT( _L( "Camera <= CCamZoomModel::AllowOptZoom EFalse" ) );
+        return EFalse;   
+        }
+    else
+        {
+        PRINT( _L( "Camera <= CCamZoomModel::AllowOptZoom ETrue" ) );
+        return ETrue;                 
+        }      
+    }
+
+// ---------------------------------------------------------------------------
+// CCamZoomModel::AllowDigZoom
+// Returns whether digital zoom is allowed
+// ---------------------------------------------------------------------------
+//
+TBool CCamZoomModel::AllowDigZoom() const
+    {         
+    PRINT( _L( "Camera => CCamZoomModel::AllowDigZoom " ) );
+    TInt maxStdZoomStep = MaxZoomStep( iDigZoomSteps );
+
+    if ( KErrNotSupported    != maxStdZoomStep   // Zoom is supported in current state         
+      && ECamSettDigZoomNone != iZoomSetting   ) // ...and is allowed by user setting
+        {
+        PRINT( _L( "Camera <= CCamZoomModel::AllowDigZoom ETrue" ) );
+        return ETrue;         
+        }
+    else
+        {
+        PRINT( _L( "Camera <= CCamZoomModel::AllowDigZoom False" ) );
+        return EFalse;   
+        }      
+    }
+
+
+// ---------------------------------------------------------------------------
+// CCamZoomModel::CurrentZoom
+// Returns the current zoom level, taking into account optical (if allowed)
+// *and* digital zooms.
+// ---------------------------------------------------------------------------
+//
+TInt CCamZoomModel::CurrentZoom() const
+    {
+    PRINT( _L( "Camera => CCamZoomModel::CurrentZoom" ) );
+    // If we are recording video, and optical isn't allowed while recording
+    // then we only need to represent the Digital zoom in the zoom pane.    
+    if ( iRecordingVideo && !iAllowOptZoom )
+        {
+        // Only use digital value if optical not allowed
+        PRINT( _L( "Camera <= CCamZoomModel::CurrentZoom digital" ) );
+        return iCurZoomStepDigital;
+        }
+    else
+        {
+        // Return the combined zoom value
+        PRINT( _L( "Camera <= CCamZoomModel::CurrentZoom optical+digital" ) );
+        return (iCurZoomStepOptical + iCurZoomStepDigital);
+        }
+    }
+
+
+// ---------------------------------------------------------------------------
+// CCamZoomModel::PauseAtBoundary
+// Returns whether to pause at the specified boundary
+// ---------------------------------------------------------------------------
+//
+TBool CCamZoomModel::PauseAtBoundary( TCamZoomBoundary aBoundary ) const
+  {
+  PRINT( _L( "Camera => CCamZoomModel::PauseAtBoundary" ) );
+  if ( iCameraState & ECamVideoOn )
+  	{
+    // Always return false for video, as we do not want to 
+    // force the zoom operation to pause at any boundary
+    // in video mode. 
+    PRINT( _L( "Camera <= CCamZoomModel::PauseAtBoundary EFalse" ) );  
+    return EFalse;
+    }
+  else
+  	{
+  	if ( ECamZoomBoundaryOptDig == aBoundary )
+      {
+      // Reason to *not* pause at the optical/digital boundary is if
+      // user set the "On (continuous)" or "Extended on (continuous) setting
+      if ( ECamSettDigZoomNormalCont == iZoomSetting
+        || ECamSettDigZoomExtendCont == iZoomSetting )
+        {
+        PRINT( _L( "Camera <= CCamZoomModel::PauseAtBoundary EFalse" ) );  
+        return EFalse;            
+        }
+      else 
+        {
+        PRINT( _L( "Camera <= CCamZoomModel::PauseAtBoundary ETrue" ) );  
+        return ETrue;
+        }
+      }
+    else if ( ECamZoomBoundaryDigExt == aBoundary ) 
+      {
+      // Only reason *not* to pause in digital/extended boundary is if
+      // user zoom setting states "extended on without pauses".
+      if ( ECamSettDigZoomExtendCont == iZoomSetting )
+        {
+        PRINT( _L( "Camera <= CCamZoomModel::PauseAtBoundary EFalse" ) );  
+        return EFalse;
+        }
+      else
+        {
+        PRINT( _L( "Camera <= CCamZoomModel::PauseAtBoundary ETrue" ) );  
+        return ETrue;    
+        }
+      }
+    else // No other boundaries known, return "no pause".
+      {
+      PRINT( _L( "Camera <= CCamZoomModel::PauseAtBoundary EFalse" ) );  
+      return EFalse;
+      }     
+    }	
+  }
+  
+    
+// -----------------------------------------------------------------------------
+// CCamZoomPane::IsCurrentlyZooming
+// Returns ETrue if the zoom model is currently zooming in/out,
+// else returns EFalse
+// -----------------------------------------------------------------------------
+//
+TBool CCamZoomModel::IsCurrentlyZooming() const
+    {    
+    PRINT( _L( "Camera => CCamZoomModel::IsCurrentlyZooming" ) );
+    if ( ECamZoomModelStateZoomIn  == iState 
+      || ECamZoomModelStateZoomOut == iState )
+        {
+        PRINT( _L( "Camera <= CCamZoomModel::IsCurrentlyZooming ETrue" ) );
+        return ETrue;
+        }
+    else
+        {
+        PRINT( _L( "Camera <= CCamZoomModel::IsCurrentlyZooming EFalse" ) );
+        return EFalse;
+        }
+    }
+    
+// -----------------------------------------------------------------------------
+// CCamZoomModel::ZoomingState
+// -----------------------------------------------------------------------------
+//
+CCamZoomModel::TCamZoomModelState CCamZoomModel::ZoomingState()
+    {    
+    return iState;  
+    }
+ 
+
+// -----------------------------------------------------------------------------
+// CCamZoomPane::ResetToDefaultAfterPrepare
+// Sets the zoompane to reset the zoom level to default values
+// next time the engine is prepared
+// -----------------------------------------------------------------------------
+//
+void CCamZoomModel::ResetToDefaultAfterPrepare( TBool aReset )
+    {
+    iResetPending = aReset;
+    }     
+
+// -----------------------------------------------------------------------------
+// CCamZoomPane::IsResetPending
+// Whether or not the zoom level is waiting to be reset to default
+// -----------------------------------------------------------------------------
+//
+TBool CCamZoomModel::IsResetPending() const
+    {
+    return iResetPending;
+    }
+
+// -----------------------------------------------------------------------------
+// ReadCurrentResolution
+// -----------------------------------------------------------------------------
+//
+void 
+CCamZoomModel::ReadCurrentResolution()
+  {
+  PRINT1( _L("Camera => CCamZoomModel::ReadCurrentResolution, now:%d"), iCurrentResolution );
+  if ( iCameraState & ECamImageOn )
+    {                
+    iCurrentResolution = iController.GetCurrentImageResolution();
+    }
+  else if( iCameraState & ECamVideoOn )
+    {
+    iCurrentResolution = iController.GetCurrentVideoResolution();
+    }
+  else
+    {
+    iCurrentResolution = KErrNotReady;
+    }
+  PRINT1( _L("Camera <= CCamZoomModel::ReadCurrentResolution, got:%d"), iCurrentResolution );
+  }
+
+// -----------------------------------------------------------------------------
+// SetZoomMultiplier
+// -----------------------------------------------------------------------------
+//
+void CCamZoomModel::SetZoomMultiplier( TInt aZoomStepMultiplier )
+    {
+    iZoomStepMultiplier = aZoomStepMultiplier;
+    if ( iCameraState & ECamVideoOn )
+        {
+        iZoomStepMultiplier *= 2;
+        }
+    }
+
+//  End of File