diff -r 890b5dd735f8 -r f15ac8e65a02 vtuis/lcvtplugin/src/base/clcvtcmdexecutor.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtuis/lcvtplugin/src/base/clcvtcmdexecutor.cpp Tue Aug 31 15:16:10 2010 +0300 @@ -0,0 +1,360 @@ +/* +* 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 +#include + +// 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