diff -r 000000000000 -r ed9695c8bcbe vtengines/videoteleng/Src/Base/cvtengmediatorservice.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtengines/videoteleng/Src/Base/cvtengmediatorservice.cpp Mon Nov 23 14:47:47 2009 +0200 @@ -0,0 +1,301 @@ +/* +* 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: Mediator service implementation +* +*/ + + + +// INCLUDE FILES +#include "cvtengmediatorservice.h" +#include "cvtenginternaloperation.h" +#include "CVtEngStateManager.h" +#include "CVtEngEventManager.h" +#include "VtEngUtils.h" +#include "CVtEngSettings.h" +#include +#include +#include +#include +#include +#include + +// CONSTANTS + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CVtEngMediatorService::StartLD +// Mediator service starter. +// ----------------------------------------------------------------------------- +// +void CVtEngMediatorService::StartLD( + CMediatorCommandResponder& aResponder, + CVtEngUtility& aUtils, + const TUid aCategory, + const TInt aCommand ) + { + __VTPRINTENTER( "CVtEngMediatorService.StartLD" ) + CVtEngMediatorService* self = new ( ELeave ) CVtEngMediatorService( + aResponder, aUtils, aCategory, aCommand ); + CleanupStack::PushL( self ); + self->ConstructAndDoServiceL(); + CleanupStack::Pop(); + __VTPRINTEXIT( "CVtEngMediatorService.StartLD" ) + } + +// ----------------------------------------------------------------------------- +// Destructor +// ----------------------------------------------------------------------------- +// +CVtEngMediatorService::~CVtEngMediatorService() + { + // ensure this is removed + __VTPRINTENTER( "CVtEngMediatorService::~CVtEngMediatorService" ) + iUtils.EventManager().RemoveObserver( this ); + + // send response if destructed due to leave in ConstructAndDoServiceL + SendMediatorResponseD( EFalse ); + __VTPRINTEXIT( "CVtEngMediatorService::~CVtEngMediatorService" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngMediatorService::SetOperation +// ----------------------------------------------------------------------------- +// +void CVtEngMediatorService::SetOperation( CVtEngOperation* /*aActiveOp*/ ) + { + __VTPRINTENTER( "CVtEngMediatorService.SetOperation" ) + // no-op + __VTPRINTEXIT( "CVtEngMediatorService.SetOperation" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngMediatorService::CommandCompleteL +// callback to internal operation. +// ----------------------------------------------------------------------------- +// +void CVtEngMediatorService::CommandCompleteL( + const TVtEngCommandId /*aCommand*/, + const TInt aResult ) + { + __VTPRINTENTER( "CVtEngMediatorService.CommandCompleteL" ) + + iServiceStatus = aResult; + + // Sends response to Telephony if not already sent by + // HandleVtEventL -> SendMediatorResponseD + SendMediatorResponseD( ETrue ); + __VTPRINTEXITR( "CVtEngMediatorService.CommandCompleteL %d", aResult ) + } + +// ----------------------------------------------------------------------------- +// CVtEngMediatorService::HandleVtEventL +// ----------------------------------------------------------------------------- +// +void CVtEngMediatorService::HandleVtEventL( TInt aEvent ) + { + __VTPRINTENTER( "CVtEngMediatorService.HandleVtEventL" ) + + // This is registered event observer when shutdown mediator command was + // received. Now send response if state precondition is met + if ( aEvent == KVtEngSessionStateChanged && + IsShuttingDown() ) + { + // no interest on events any more, task fulfilled + iUtils.EventManager().RemoveObserver( this ); + + // iServiceStatus used for mediator response + iServiceStatus = KErrNone; + + SendMediatorResponseD( EFalse ); + } + __VTPRINTEXIT( "CVtEngMediatorService.HandleVtEventL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngMediatorService::CVtEngMediatorService +// ----------------------------------------------------------------------------- +// +CVtEngMediatorService::CVtEngMediatorService( + CMediatorCommandResponder& aResponder, + CVtEngUtility& aUtils, + const TUid aCategory, + const TInt aCommandId ) : + iResponder( aResponder ), + iUtils( aUtils ), + iCategory( aCategory ), + iCommandId( aCommandId ), + iServiceStatus( KErrNotReady ) + { + __VTPRINTENTER( "CVtEngMediatorService.CVtEngMediatorService" ) + __VTPRINTEXIT( "CVtEngMediatorService.CVtEngMediatorService" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngMediatorService::ConstructAndDoServiceL +// ----------------------------------------------------------------------------- +// +void CVtEngMediatorService::ConstructAndDoServiceL() + { + __VTPRINTENTER( "CVtEngMediatorService.ConstructAndDoServiceL" ) + __VTPRINT2( DEBUG_GEN, " CVtEngMediatorService.ConstructAndDoServiceL command id=%d", iCommandId ) + // if starting of any operation below fails (StartOperationL leaves), + // this object is deleted. Destructor sends mediator response. + // non-supported command leads to leave+destructor also (see default case) + if ( KCatVideotelInternalCommands == iCategory) + { + switch ( iCommandId ) + { + case EVtMediatorReleaseDataport: + if ( !IsShuttingDown() ) + { + // Mediator response is sent when state becomes appropriate, + // indicated by call to HandleVtEventL, or + // when operation callback CommandCompleteL is called, + // which ever comes first. However, this object is deleted + // only after operation callback is received. + iUtils.EventManager().AddObserverL( this ); + StartOperationL( KVtEngTerminateSession ); + } + // if already shutting down this is no op (and self destructed) + // if get this command because endactivecall from vt menu, do not do any op from here + else + { + SendMediatorResponseD(EFalse); + } + break; + default: + // requested command that is not supported, issue "failed" response + iServiceStatus = KErrNotSupported; + break; + } + } + else + { + switch ( iCommandId ) + { + case EVtCmdUnmute: + case EVtCmdMute: + { + TVtEngCommandId engineCmd = ( iCommandId == + EVtCmdUnmute ) ? KVtEngUnmuteOutgoingAudio : + KVtEngMuteOutgoingAudio; + if ( !IsShuttingDown() ) + { + StartOperationL( engineCmd ); + } + else + { + SendMediatorResponseD(EFalse); + } + } + break; + default: + // requested command that is not supported, issue "failed" response + iServiceStatus = KErrNotSupported; + break; + } + } + if ( iServiceStatus != KRequestPending && !IsShuttingDown() ) + { // results in destruction of this object and sending of mediator + // response with error + //__VTPRINT2( DEBUG_GEN, "CVtEngMediatorService.ConstructAndDoServiceL leave by iServiceStatus: %d", iServiceStatus ) + User::Leave( iServiceStatus ); + } + + __VTPRINTEXIT( "CVtEngMediatorService.ConstructAndDoServiceL" ) + } +// ----------------------------------------------------------------------------- +// CVtEngMediatorService::IsShuttingDown +// Checks if shutdown is ongoing +// ----------------------------------------------------------------------------- +// +TBool CVtEngMediatorService::IsShuttingDown() const + { + __VTPRINTENTER( "CVtEngMediatorService.IsShuttingDown" ) + const MVtEngSessionInfo::TSessionState state = + iUtils.StateManager()->SessionState(); + TBool isShuttingDown = EFalse; + + // consider shutdown true if clearing or idle + if ( state == MVtEngSessionInfo::EClearing || + state == MVtEngSessionInfo::EIdle ) + { + isShuttingDown = ETrue; + } + __VTPRINTEXITR( "CVtEngMediatorService.IsShuttingDown %d", + isShuttingDown ) + return isShuttingDown; + } + +// ----------------------------------------------------------------------------- +// CVtEngMediatorService::StartOperationL +// ----------------------------------------------------------------------------- +// +void CVtEngMediatorService::StartOperationL( const TVtEngCommandId aCommand ) + { + __VTPRINTENTER( "CVtEngMediatorService.StartOperationL" ) + iOperation = CVtEngInternalOperation::NewL( + aCommand, + iUtils.StateManager()->Handlers(), + *this ); + iOperation->ExecuteL(); + iServiceStatus = KRequestPending; + __VTPRINTEXIT( "CVtEngMediatorService.StartOperationL" ) + } + +// ----------------------------------------------------------------------------- +// CVtEngMediatorService::SendMediatorResponseD +// ----------------------------------------------------------------------------- +// +void CVtEngMediatorService::SendMediatorResponseD( const TBool aDeleteThis ) + { + __VTPRINTENTER( "CVtEngMediatorService.SendMediatorResponseD" ) + __VTPRINT2( DEBUG_GEN, "CVtEngMediatorService.SendMediatorResponseD command: %d", iCommandId ) + if ( iCommandId != KErrNotFound ) + { + if ( iCategory == KCatVideotelInternalCommands && iCommandId == EVtMediatorReleaseDataport ) + { + iResponder.IssueResponse( + KMediatorVideoTelephonyDomain, + KCatVideotelInternalCommands, + iCommandId, + iServiceStatus, + KNullDesC8() ); + } + else + { + iResponder.IssueResponse( + KMediatorVideoTelephonyDomain, + KCatPhoneToVideotelCommands, + iCommandId, + iServiceStatus, + KNullDesC8() ); + } + + // prevents further response because destructor also calls this method + iCommandId = KErrNotFound; + } + if ( aDeleteThis ) + { + // note! check above is mandatory because this method is called + // also from destructor. + delete this; + } + __VTPRINTEXIT( "CVtEngMediatorService.SendMediatorResponseD" ) + } + +// End of File +