--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vtengines/videoteleng/Src/Base/cvtengmediatorservice.cpp Wed Jun 23 18:14:26 2010 +0300
@@ -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 <cvtlogger.h>
+#include <MediatorCommandResponder.h>
+#include <MediatorDomainUIDs.h>
+#include <videotelcontrolmediatorapi.h>
+#include <videoteltophonecommandsapi.h>
+#include <vtinternalmediatorapi.h>
+
+// 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
+