vtuis/lcvtplugin/src/base/clcvtcmdexecutor.cpp
author hgs
Fri, 09 Jul 2010 15:04:41 +0300
changeset 41 f65a18712d2e
parent 27 dcbddbbaf8fd
permissions -rw-r--r--
201027

/*
* Copyright (c) 2008 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:  Implementation of the CLcVtCmdExecutor class.
*
*/


// INCLUDE FILES
#include    "clcvtcmdexecutor.h"
#include    "mlcvtenginecommandmanager.h"
#include    <mvtengcommandhandler.h>
#include    <cvtlogger.h>

// MODULE DATA STRUCTURES

/**
* Active object to perform asynchronous commands.
* @since Series 60 2.6
*/
class CLcVtCmdExecutor::CActiveCmd
    : public CActive
    {
    public: // Constructors and destructor

        /**
        * Constructor.
        */
        CActiveCmd(
            CLcVtCmdExecutor& aDialog,
            MVtEngCommandHandler& aCommandHandler,
            TVtEngCommandId aCommand,
            TDesC8* aParams );

        /**
        * Destructor.
        */
        ~CActiveCmd();

    public: // New functions

        /**
        * Starts active object. Command will be performed in RunL.
        */
        void Start();

        /**
        * Checks if command has been performed.
        * @return ETrue if command has been performed.
        */
        TBool CommandPerformed() const;

    private:

        /**
        * @see CActive::RunL
        */
        void RunL();

        /**
        * @see CActive::DoCancel.
        */
        void DoCancel();

        /**
        * @see CActive::RunError.
        */
        TInt RunError( TInt aResult );

    private:

        // Ref to dialog.
        CLcVtCmdExecutor& iExecutor;

        // Ref to command handler.
        MVtEngCommandHandler& iCommandHandler;

        // Command to be executed.
        TVtEngCommandId iCommand;

        // Owned parameters.
        TDesC8* iCommandParams;

        // ETrue if command has been performed.
        TBool iCommandPerformed;

    };

// ============================ MEMBER FUNCTIONS ===============================

// -----------------------------------------------------------------------------
// CLcVtCmdExecutor::CLcVtCmdExecutor
// -----------------------------------------------------------------------------
//
CLcVtCmdExecutor::CLcVtCmdExecutor(
        CLcVtCmdExecutor** aSelfPtr,
        MVtEngCommandHandler& aCommandHandler,
        MLcVtEngineCommandManager& aCommandManager )
    : iSelfPtr( aSelfPtr ),
      iCommandHandler( aCommandHandler ),
      iCommandManager( aCommandManager )
    {
    iRequest = NULL;
    __VTPRINT2( DEBUG_GEN, "CLcVtCmdExecutor.Ctor this=%d", (TInt)this )
    }

// -----------------------------------------------------------------------------
// CLcVtCmdExecutor::~CLcVtCmdExecutor
// -----------------------------------------------------------------------------
//
CLcVtCmdExecutor::~CLcVtCmdExecutor()
    {
    __VTPRINTENTER( "CLcVtCmdExecutor.~" )
    __VTPRINT2( DEBUG_GEN, "CLcVtCmdExecutor.~ this=%d", (TInt)this )
    if ( iActiveCmd )
        {
        if ( !iCommandCompleted && iActiveCmd->CommandPerformed() )
            {
            iCommandHandler.CancelCommand( iCommand ); // ignore error
            }
        }
    delete iCommandParams;
    delete iActiveCmd;

    iCommandManager.RemoveObserver( *this );
    
    if ( iSelfPtr )
        {
        *iSelfPtr = NULL;
        iSelfPtr = NULL;
        }

    if ( iRequest )
        {
        __VTPRINT(DEBUG_GEN, "CLcVtCmdExecutor::~CLcVtCmdExecutor RequestComplete")
        User::RequestComplete( iRequest, KErrCancel );
        iRequest = NULL;
        }
    else
        {
        if ( iWait.IsStarted())
            {
            __VTPRINT(DEBUG_GEN, "CLcVtCmdExecutor::~CLcVtCmdExecutor AsyncStop")
            iWait.AsyncStop();
            }           
        }
    
    
    __VTPRINTEXIT( "CLcVtCmdExecutor.~" )
    }

// -----------------------------------------------------------------------------
// CLcVtCmdExecutor::ExecuteCmdL
// -----------------------------------------------------------------------------
//
void CLcVtCmdExecutor::ExecuteCmdL(
        const TVtEngCommandId aCommandId,
        TDesC8* aParams,
        TRequestStatus* aRequest )
    {
    __VTPRINTENTER( "CLcVtCmdExecutor.ExecuteCmdL" )
    __VTPRINT2( DEBUG_GEN, "CLcVtCmdExecutor.ExecuteCmdL this=%d", (TInt)this )
    iCommand = aCommandId;
    CleanupStack::PushL( this );
    if ( aParams )
        {
        iCommandParams = aParams->AllocL();
        }

    iCommandManager.AddObserverL( *this );
    CleanupStack::Pop( this );

    iActiveCmd =
        new ( ELeave ) CActiveCmd(
            *this, iCommandHandler, iCommand, iCommandParams );
    iActiveCmd->Start();    
    
    if ( !aRequest )
        {
        TInt error = KErrNone;
        iError = &error;
        //Start Active Schedule
        iWait.Start();
        User::LeaveIfError( error );
        }
    else
        {
        *aRequest = KRequestPending;        
        iRequest = aRequest; 
        } 
       
    __VTPRINTEXIT( "CLcVtCmdExecutor.ExecuteCmdL" )
    }


// -----------------------------------------------------------------------------
// CLcVtCmdExecutor::Complete
// -----------------------------------------------------------------------------
//
void CLcVtCmdExecutor::Complete( const TInt aError )
    {
    if ( iError )
        {
        *iError = aError;
        }

    if ( iRequest )
        {
        User::RequestComplete( iRequest, aError );
        iRequest = NULL;
        }

    delete this;
    }

// -----------------------------------------------------------------------------
// CLcVtCmdExecutor::HandleVTCommandPerformedL
// -----------------------------------------------------------------------------
//
void CLcVtCmdExecutor::HandleVTCommandPerformedL(
        TVtEngCommandId aCommand,
        const TInt aError )
    {
    __VTPRINTENTER( "CLcVtCmdExecutor.HandleVTCommandPerformed" )
    __VTPRINT2( DEBUG_GEN, "CLcVtCmdExecutor.HandleVTCommandPerformed.cmd.%d", aCommand )
    __VTPRINT2( DEBUG_GEN, "CLcVtCmdExecutor.HandleVTCommandPerformed.err.%d", aError )
    if ( iActiveCmd && ( aCommand == iCommand ) )
        {
        if ( iActiveCmd->CommandPerformed() && !iCommandCompleted )
            {
            __VTPRINT( DEBUG_GEN, "CLcVtCmdExecutor.match" )
            iCommandCompleted = ETrue;
            // Corrupted images may leave during initialization, thus we have
            // to mask out errors when they happen during share initialize.
            // Error code is handled correctly in CVtUiAppUi::CEventObserver::
            // HandleVTCommandPerformedL() method, thus it will not be ignored.
            if ( aCommand == KVtEngInitializeShareImage )
                {
                Complete( KErrNone );
                }
            else
                {
                Complete( aError );
                }
            }
        }
    __VTPRINTEXIT( "CLcVtCmdExecutor.HandleVTCommandPerformed" )
    }

// -----------------------------------------------------------------------------
// CLcVtCmdExecutor::HandleExecuteFailed
// -----------------------------------------------------------------------------
//
void CLcVtCmdExecutor::HandleExecuteFailed( TInt aResult )
    {
    __VTPRINT3( DEBUG_GEN, "CLcVtCmdExecutor.Fail this=%d res=%d",
        (TInt)this, aResult )
    Complete( aResult );
    }

// Implementation of CLcVtCmdExecutor::CActiveCmd:

// -----------------------------------------------------------------------------
// CLcVtCmdExecutor::CActiveCmd::CActiveCmd
// -----------------------------------------------------------------------------
//
CLcVtCmdExecutor::CActiveCmd::CActiveCmd(
        CLcVtCmdExecutor& aExecutor,
        MVtEngCommandHandler& aCommandHandler,
        TVtEngCommandId aCommand,
        TDesC8* aParams)
    : CActive( CActive::EPriorityHigh ),
      iExecutor( aExecutor ),
      iCommandHandler( aCommandHandler ),
      iCommand( aCommand ),
      iCommandParams( aParams )
    {
    CActiveScheduler::Add( this );
    }

// -----------------------------------------------------------------------------
// CLcVtCmdExecutor::CActiveCmd::~CActiveCmd
// -----------------------------------------------------------------------------
//
CLcVtCmdExecutor::CActiveCmd::~CActiveCmd()
    {
    __VTPRINT2( DEBUG_GEN, "CLcVtCmdExecutor.CActiveCmd.Dtor this=%d", (TInt)this )
    Cancel();
    }

// -----------------------------------------------------------------------------
// CLcVtCmdExecutor::CActiveCmd::Start
// -----------------------------------------------------------------------------
//
void CLcVtCmdExecutor::CActiveCmd::Start()
    {
    __VTPRINTENTER( "CLcVtCmdExecutor.CActiveCmd.Start" )
    TRequestStatus* status = &iStatus;
    User::RequestComplete( status, KErrNone );
    SetActive();
    __VTPRINTEXITR( "CLcVtCmdExecutor.CActiveCmd.Start this=%d", (TInt)this )
    }

// -----------------------------------------------------------------------------
// CLcVtCmdExecutor::CActiveCmd::CommandPerformed
// -----------------------------------------------------------------------------
//
TBool CLcVtCmdExecutor::CActiveCmd::CommandPerformed() const
    {
    __VTPRINT3( DEBUG_GEN, "CLcVtCmdExecutor.CActiveCmd.Perf this=%d,cmd=%d",
        (TInt)this, iCommandPerformed )
    return iCommandPerformed;
    }

// -----------------------------------------------------------------------------
// CLcVtCmdExecutor::CActiveCmd::RunL
// -----------------------------------------------------------------------------
//
void CLcVtCmdExecutor::CActiveCmd::RunL()
    {
    __VTPRINTENTER( "CLcVtCmdExecutor.CActiveCmd.RunL" )
    iCommandHandler.ExecuteL( iCommand, iCommandParams );
    iCommandPerformed = ETrue;
    __VTPRINTEXITR( "CLcVtCmdExecutor.CActiveCmd.RunL this=%d", (TInt)this )
    }

// -----------------------------------------------------------------------------
// CLcVtCmdExecutor::CActiveCmd::DoCancel
// -----------------------------------------------------------------------------
//
void CLcVtCmdExecutor::CActiveCmd::DoCancel()
    {
    __VTPRINT2( DEBUG_GEN, "CLcVtCmdExecutor.CActiveCmd.DoCnl this=%d", (TInt)this )
    // Request is completed immediately.
    }

// -----------------------------------------------------------------------------
// CVtUiExecuteCmdDialog::CActiveCmd::RunError
// -----------------------------------------------------------------------------
//
TInt CLcVtCmdExecutor::CActiveCmd::RunError( TInt aResult )
    {
    __VTPRINTENTER( "CLcVtCmdExecutor.CActiveCmd.RunError" )
    // Exception was raised in RunL. Inform the dialog to close itself.
    iExecutor.HandleExecuteFailed( aResult );
    __VTPRINTEXITR( "CLcVtCmdExecutor.CActiveCmd.RunError this=%d", (TInt)this )
    return KErrNone;
    }

//  End of File