--- /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 <e32std.h>
+#include "CVtEngCommandHandler.h"
+#include "CVtEngHandlerContainer.h"
+#include "MVtEngCommandObserver.h"
+#include "CVtEngOperation.h"
+#include <cvtlogger.h>
+#include "CVtEngStateManager.h"
+#include <videotelephonyvariant.hrh>
+#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<CVtEngOperation>( 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