diff -r 000000000000 -r ed9695c8bcbe vtengines/videoteleng/Src/Commands/CVtEngCommandHandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Src/Commands/CVtEngCommandHandler.cpp Mon Nov 23 14:47:47 2009 +0200 @@ -0,0 +1,549 @@ +/* +* Copyright (c) 2006 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: Handles commands from user interface. +* +*/ + + + +// INCLUDE FILES + +#include +#include "CVtEngCommandHandler.h" +#include "CVtEngHandlerContainer.h" +#include "MVtEngCommandObserver.h" +#include "CVtEngOperation.h" +#include +#include "CVtEngStateManager.h" +#include +#include "VtEngUtils.h" + +#include "CVtEngStateIdle.h" +#include "CVtEngStateInitializing.h" +#include "CVtEngStateConnected.h" +#include "CVtEngStateRinging.h" +#include "CVtEngStateOpen.h" +#include "CVtEngStateNegotiating.h" +#include "CVtEngStateClearing.h" +#include "CVtEngStateAlerting.h" + +// CONSTANTS +const TInt KVtEngCommandPoolCommands = 1; + + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CVtEngCommandHandler::CVtEngCommandHandler +// C++ constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CVtEngCommandHandler::CVtEngCommandHandler( + CVtEngHandlerContainer& aHandlers ) : + iObservers( 1 ), + iHandlers( aHandlers ) + { + } + +// ----------------------------------------------------------------------------- +// CVtEngCommandHandler::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CVtEngCommandHandler::ConstructL() + { + __VTPRINTENTER( "CmdHlr.ConstructL" ) + iCommandPool = new ( ELeave ) CVtEngCmdPool( KVtEngCommandPoolCommands ); + + // session termination + AddToPoolL( KVtEngInitializeEngine ); + AddToPoolL( KVtEngInitializeEngineDiag ); + AddToPoolL( KVtEngInitializeEngineTest ); + AddToPoolL( KVtEngPrepareViewFinder ); + AddToPoolL( KVtEngPrepareRemoteRenderDSA ); + AddToPoolL( KVtEngPrepareRemoteRenderDP ); + AddToPoolL( KVtEngPrepareRemoteRenderNGA ); + AddToPoolL( KVtEngResetEngine ); + __VTPRINTEXIT( "CmdHlr.ConstructL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngCommandHandler::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CVtEngCommandHandler* CVtEngCommandHandler::NewL( CVtEngHandlerContainer& aHandlers ) + { + __VTPRINT( DEBUG_GEN | DEBUG_CONSTRUCT, "CmdHlr.New") + CVtEngCommandHandler* self = new( ELeave ) CVtEngCommandHandler( aHandlers ); + + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); + + return self; + } + + +// Destructor +CVtEngCommandHandler::~CVtEngCommandHandler() + { + __VTPRINTENTER( "CmdHlr.~" ) + iObservers.Close(); + if ( iActiveOp ) + { + if ( iCommandPool->Get( iActiveOp->Command() ) == NULL ) + { + delete iActiveOp; + } + } + delete iCommandPool; + __VTPRINTEXIT( "CmdHlr.~" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngCommandHandler::ExecuteL +// +// ----------------------------------------------------------------------------- +// +void CVtEngCommandHandler::ExecuteL( + const TVtEngCommandId aCommandId, + TDesC8* aParams ) + { + __VTPRINTENTER( "CmdHlr.ExecuteL" ) + + __VTPRINT2( DEBUG_GEN, "ComHlr:Exec cmdId=%d", aCommandId ) + ValidateL( aCommandId, aParams ); + CVtEngOperation* opFromPool = iCommandPool->Get( aCommandId ); + CVtEngOperation* op = opFromPool; + if ( op == NULL ) + { + op = CVtEngOperation::NewL( aCommandId, iHandlers, *this ); + CleanupStack::PushL( op ); + } + + switch ( aCommandId ) + { + case KVtEngInitializeEngine: + case KVtEngInitializeEngineTest: + case KVtEngInitializeEngineDiag: + case KVtEngResetEngine: + case KVtEngTerminateSession: + case KVtEngStartViewFinder: + case KVtEngStopViewFinder: + case KVtEngStartRenderRemote: + case KVtEngStopRenderRemote: + case KVtEngPauseRenderRemote: + case KVtEngMuteOutgoingAudio: + case KVtEngUnmuteOutgoingAudio: + case KVtEngStopDtmfTone: + case KVtEngRequestLastRemoteFrame: + // Handling of different UIIs + case KVtEngSetUIIDtmfSupport: + case KVtEngSetUIIBasicStringSupport: + case KVtEngSetUIIIA5StringSupport: + case KVtEngSetUIIGeneralStringSupport: + case KVtEngFreeze: + case KVtEngUnfreeze: + case KVtEngHandleLayoutChange: + + // Media object sharing (no parameters ) + case KVtEngStartShareImage: + case KVtEngStopShareImage: + op->ExecuteL( NULL ); + break; + // Media + case KVtEngSetUIForeground: + case KVtEngPrepareCamera: + case KVtEngPrepareViewFinder: + case KVtEngPrepareViewFinderDSA: + case KVtEngPrepareRemoteRenderDSA: + case KVtEngPrepareViewFinderDP: + case KVtEngPrepareRemoteRenderDP: + case KVtEngPrepareRemoteRenderNGA: + case KVtEngSetSource: + case KVtEngSetZoomStep: + case KVtEngSetAudioRouting: + case KVtEngSetAudioVolume: + case KVtEngIncreaseAudioVolume: + case KVtEngDecreaseAudioVolume: + case KVtEngSendDtmf: + case KVtEngStartDtmfTone: + case KVtEngSetVideoQuality: + case KVtEngSwitchToVoice: + // Extension commands + case KVtEngSetContrast: + case KVtEngSetBrightness: + case KVtEngSetWhiteBalance: + case KVtEngSetColorTone: +#if defined ( RD_VT_RTF ) + case KVtEngStartRecord: + case KVtEngStopRecord: +#endif + // Media object sharing (with parameters ) + case KVtEngInitializeShareImage: + // Flow through, ok to execute + op->ExecuteL( aParams ); + break; + default: + User::Leave( KErrNotSupported ); + } + if ( opFromPool == NULL ) + { + CleanupStack::Pop( ); // op (deletes itself) + } + CVtEngStateManager* states = CVtEngUtility::StateManager(); + states->Update(); + __VTPRINTEXIT( "CmdHlr.ExecuteL" ) + } + + +// ----------------------------------------------------------------------------- +// CVtEngCommandHandler::CancelCommand +// +// ----------------------------------------------------------------------------- +// +TInt CVtEngCommandHandler::CancelCommand( const TVtEngCommandId aCommandId ) + { + __VTPRINTENTER( "CmdHlr.CancelCommand" ) + + __VTPRINT2( DEBUG_GEN, "ComHlr.Cancel cmd=%d", aCommandId ) + TInt err( KErrGeneral ); + if ( iActiveOp && + iActiveOp->Command() == aCommandId && + aCommandId != KVtEngResetEngine && + aCommandId != KVtEngInitializeEngineTest && + aCommandId != KVtEngInitializeEngineDiag) + { + iActiveOp->Cancel(); + err = KErrNone; + } + __VTPRINT2( DEBUG_GEN | DEBUG_DETAIL, "ComHlr.Cancel res=%d",err ) + __VTPRINTEXIT( "CmdHlr.CancelCommand" ) + return err; + } + +// ----------------------------------------------------------------------------- +// CVtEngCommandHandler::GetCommandCaps +// +// ----------------------------------------------------------------------------- +// +TInt CVtEngCommandHandler::GetCommandCaps( + const TVtEngCommandId aCommand ) + { + TInt caps( 0 ); + CheckAsynchronity( aCommand, caps ); + CheckSupport( aCommand, caps ); + CheckState( aCommand, caps ); + return caps; + } + +// ----------------------------------------------------------------------------- +// CVtEngCommandHandler::PendingCommand +// +// ----------------------------------------------------------------------------- +// +TVtEngCommandId CVtEngCommandHandler::PendingCommand() + { + if ( iActiveOp ) + { + return iActiveOp->Command(); + } + return KVtEngCommandNone; + } + +// ----------------------------------------------------------------------------- +// CVtEngCommandHandler::AddObserverL +// +// ----------------------------------------------------------------------------- +// +void CVtEngCommandHandler::AddObserverL( + MVtEngCommandObserver& aObserver ) + { + User::LeaveIfError( iObservers.Append( &aObserver ) ); + } + +// ----------------------------------------------------------------------------- +// CVtEngCommandHandler::RemoveObserver +// +// ----------------------------------------------------------------------------- +// +void CVtEngCommandHandler::RemoveObserver( + MVtEngCommandObserver& aObserver ) + { + const TInt pos( iObservers.Find( &aObserver ) ); + if ( pos >= 0 ) + { + iObservers.Remove( pos ); + } + } + +// ----------------------------------------------------------------------------- +// CVtEngCommandHandler::CommandCompleteL +// +// ----------------------------------------------------------------------------- +// +void CVtEngCommandHandler::CommandCompleteL( + const TVtEngCommandId aCommand, + const TInt aResult ) + { + __VTPRINTENTER( "CmdHlr.CommandCompleteL" ) + __VTPRINT3( DEBUG_GEN, " completed cmd=%d,res=%d", aCommand, aResult ) + TInt count( iObservers.Count() ); + while ( count-- ) + { + MVtEngCommandObserver* observer = iObservers[ count ]; + observer->HandleVTCommandPerformedL( aCommand, aResult ); + } + __VTPRINTEXIT( "CmdHlr.CommandCompleteL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngCommandHandler::SetOperation +// Sets active operation +// +// ----------------------------------------------------------------------------- +// +void CVtEngCommandHandler::SetOperation( CVtEngOperation* aActiveOp ) + { + iActiveOp = aActiveOp; + } + +// ----------------------------------------------------------------------------- +// CVtEngCommandHandler::AddToPoolL +// Adds a command to command pool. Only commands without parameters and +// that don't delete themselfs can currently be added. +// +// ----------------------------------------------------------------------------- +// +void CVtEngCommandHandler::AddToPoolL( TVtEngCommandId aCommand ) + { + CVtEngOperation* op = CVtEngOperation::NewL( + aCommand, iHandlers, *this, EFalse ); + CleanupStack::PushL( op ); + iCommandPool->AppendL( op ); + CleanupStack::Pop(); // op + } + +// ----------------------------------------------------------------------------- +// CVtEngCommandHandler::ValidateL +// Checks if command can be performed. +// +// ----------------------------------------------------------------------------- +// +void CVtEngCommandHandler::ValidateL( + const TVtEngCommandId aCommandId, + TDesC8* /*aParams*/ ) + { + // check if async command is already pending and new + // command is async + TInt caps( 0 ); + CheckState( aCommandId, caps ); + if ( !(caps & EAttribEnabled ) ) + { + User::Leave( KErrNotReady ); + } + } + +// ----------------------------------------------------------------------------- +// CVtEngCommandHandler::CheckAsynchronity +// Checks if command is async +// +// ----------------------------------------------------------------------------- +// +void CVtEngCommandHandler::CheckAsynchronity( + const TVtEngCommandId aCommandId, + TInt& aCaps ) + { + switch ( aCommandId ) + { + case KVtEngInitializeEngine: + case KVtEngInitializeEngineTest: + case KVtEngInitializeEngineDiag: + case KVtEngResetEngine: + case KVtEngTerminateSession: + case KVtEngSetSource: + case KVtEngPrepareCamera: + case KVtEngSetAudioRouting: + case KVtEngMuteOutgoingAudio: + case KVtEngUnmuteOutgoingAudio: + case KVtEngSetAudioVolume: + case KVtEngHandleLayoutChange: + case KVtEngUnfreeze: + + // Media object sharing + case KVtEngInitializeShareImage: + case KVtEngStartShareImage: + case KVtEngStopShareImage: + case KVtEngSwitchToVoice: + aCaps |= EAttribAsync; + break; + default: + aCaps &= (~EAttribAsync); + break; + } + __VTPRINT3( DEBUG_GEN | DEBUG_RETURN, "ComHlr:capsA cmd=%d,caps=%d", aCommandId, aCaps ) + } + +// ----------------------------------------------------------------------------- +// CVtEngCommandHandler::CheckSupport +// Checks if command is supported +// +// ----------------------------------------------------------------------------- +// +void CVtEngCommandHandler::CheckSupport( + const TVtEngCommandId aCommandId, + TInt& aCaps ) + { + switch ( aCommandId ) + { + case KVtEngInitializeEngine: + case KVtEngInitializeEngineTest: + case KVtEngInitializeEngineDiag: + case KVtEngResetEngine: + case KVtEngTerminateSession: + case KVtEngStartViewFinder: + case KVtEngStopViewFinder: + case KVtEngPrepareViewFinder: + case KVtEngPrepareRemoteRenderDSA: + case KVtEngPrepareRemoteRenderDP: + case KVtEngPrepareRemoteRenderNGA: + case KVtEngStartRenderRemote: + case KVtEngStopRenderRemote: + case KVtEngSetAudioRouting: + case KVtEngSetAudioVolume: + case KVtEngIncreaseAudioVolume: + case KVtEngDecreaseAudioVolume: + case KVtEngPauseRenderRemote: + case KVtEngMuteOutgoingAudio: + case KVtEngUnmuteOutgoingAudio: + case KVtEngSetSource: + case KVtEngPrepareCamera: + case KVtEngStartDtmfTone: + case KVtEngStopDtmfTone: + case KVtEngFreeze: + case KVtEngUnfreeze: + case KVtEngSetVideoQuality: + case KVtEngHandleLayoutChange: + // Handling of different UIIs, support is there + case KVtEngSetUIIDtmfSupport: + case KVtEngSetUIIBasicStringSupport: + case KVtEngSetUIIIA5StringSupport: + case KVtEngSetUIIGeneralStringSupport: + case KVtEngSetUIForeground: + case KVtEngRequestLastRemoteFrame: + + // Media object sharing + case KVtEngInitializeShareImage: + case KVtEngStartShareImage: + case KVtEngStopShareImage: + case KVtEngSwitchToVoice: + aCaps |= EAttribSupported; + break; + + // Extension commands + case KVtEngSetContrast: + case KVtEngSetBrightness: + case KVtEngSetWhiteBalance: + case KVtEngSetColorTone: +#if defined ( RD_VT_RTF ) + case KVtEngStartRecord: + case KVtEngStopRecord: +#endif + aCaps |= EAttribSupported; + break; + + default: + aCaps &= (~EAttribSupported); + __VTPRINT( DEBUG_GEN, "ComHlr.NOT SUPPORTED" ) + break; + } + __VTPRINT3( DEBUG_GEN | DEBUG_DETAIL, " capsSupport cmd=%d,caps=%d", aCommandId, aCaps ) + } + +// ----------------------------------------------------------------------------- +// CVtEngCommandHandler::CheckState +// Checks if command is possible in current state. +// +// ----------------------------------------------------------------------------- +// +void CVtEngCommandHandler::CheckState( + const TVtEngCommandId aCommandId, + TInt& aCaps ) + { + aCaps &= (~EAttribEnabled); + if ( !(iActiveOp && ( aCaps & EAttribAsync ) ) ) + { + const CVtEngStateManager* states = CVtEngUtility::StateManager(); + if ( states->IsCommandPossible( aCommandId ) ) + { + aCaps |= EAttribEnabled; + } +#ifdef VTDEBUG + else + { + __VTPRINT( DEBUG_GEN, "ComHlr.ChkState INVALID" ) + } +#endif // VTDEBUG + } + __VTPRINT3( DEBUG_GEN | DEBUG_DETAIL, " capsState cmd=%d,caps=%d", aCommandId, aCaps ) + } + +// ----------------------------------------------------------------------------- +// CVtEngCommandHandler::CVtEngCmdPool::CVtEngCmdPool +// C++ constructor +// +// ----------------------------------------------------------------------------- +// +CVtEngCommandHandler::CVtEngCmdPool::CVtEngCmdPool( TInt aGranularity ) : + CArrayPtrFlat( aGranularity ) + { + } + +// ----------------------------------------------------------------------------- +// CVtEngCommandHandler::CVtEngCmdPool::CVtEngCmdPool +// Destructor - deletes operations in the pool. +// +// ----------------------------------------------------------------------------- +// +CVtEngCommandHandler::CVtEngCmdPool::~CVtEngCmdPool( ) + { + ResetAndDestroy(); + } + +// ----------------------------------------------------------------------------- +// CVtEngCommandHandler::CVtEngCmdPool::Get +// Returns pointer to an operation in the pool. +// +// ----------------------------------------------------------------------------- +// +CVtEngOperation* CVtEngCommandHandler::CVtEngCmdPool::Get( + const TVtEngCommandId aId ) + { + TInt count( Count() ); + CVtEngOperation* ret = NULL; + while ( count-- ) + { + CVtEngOperation* op = At( count ); + if ( op->Command() == aId ) + { + ret = op; + count = 0; // break + } + } + return ret; + } + +// End of File