--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vtengines/videoteleng/Src/Base/cvtengmdtrmessagelistener.cpp Mon Nov 23 14:47:47 2009 +0200
@@ -0,0 +1,321 @@
+/*
+* 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 event listener implementation
+*
+*/
+
+
+
+// INCLUDE FILES
+#include "cvtengmdtrmessagelistener.h"
+#include "VtEngUtils.h"
+#include "CVtEngSettings.h"
+#include "CVtEngEventManager.h"
+#include "cvtengmediatorservice.h"
+
+#include <cvtlogger.h>
+#include <videotelcontrolmediatorapi.h>
+#include <mediatorcommandresponder.h>
+#include <mediatordomainuids.h>
+#include <mediatoreventsfromtelephonyapi.h>
+#include <vtinternalmediatorapi.h>
+
+// CONSTANTS
+
+// mediator command timeout
+static const TInt KVtEngMdtrCmdTimeout = 500000;
+
+// array granularity is 2 (enable mic, disable mic commands)
+static const TInt KVtEngMdtrCmdArrayGranularity = 2;
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CVtEngMdtrMessageListener::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CVtEngMdtrMessageListener* CVtEngMdtrMessageListener::NewL(
+ CVtEngUtility& aUtils )
+ {
+ __VTPRINTENTER( "CVtEngMdtrMessageListener.NewL" )
+ CVtEngMdtrMessageListener* self = new( ELeave )
+ CVtEngMdtrMessageListener( aUtils );
+ CleanupStack::PushL( self );
+ self->ConstructL( );
+ CleanupStack::Pop();
+ __VTPRINTEXIT( "CVtEngMdtrMessageListener.NewL" )
+ return self;
+ }
+
+// Destructor
+CVtEngMdtrMessageListener::~CVtEngMdtrMessageListener()
+ {
+ // ignore error in unregistering
+ if ( iMediatorResponder )
+ {
+ iMediatorResponder->UnregisterCommand(
+ KMediatorVideoTelephonyDomain,
+ KCatPhoneToVideotelCommands,
+ iCommandList );
+ iCommandList.Close();
+ iMediatorResponder->UnregisterCommand(
+ KMediatorVideoTelephonyDomain,
+ KCatVideotelInternalCommands,
+ EVtMediatorReleaseDataport );
+
+ delete iMediatorResponder;
+ }
+
+
+ // ignore error in unregistering
+ if ( iMediatorEvents )
+ {
+ iMediatorEvents->UnsubscribeEvent( KMediatorVideoTelephonyDomain,
+ KCatVideotelInternalEvents,
+ EVtMediatorEventVideoCallInformation );
+ delete iMediatorEvents;
+ }
+
+ }
+
+// -----------------------------------------------------------------------------
+// CVtEngMdtrMessageListener::MediatorCommandL
+// Receives mediator command and passes it to service object
+// -----------------------------------------------------------------------------
+//
+void CVtEngMdtrMessageListener::MediatorCommandL(
+ TUid /*aDomain*/,
+ TUid aCategory,
+ TInt aCommandId,
+ TVersion /*aVersion*/,
+ const TDesC8& /*aData*/ )
+ {
+ __VTPRINTENTER( "CVtEngMdtrMessageListener.MediatorCommandL" )
+ // service object destroys itself after sending command response
+ CVtEngMediatorService::StartLD( *iMediatorResponder, iUtils, aCategory, aCommandId );
+ __VTPRINTEXIT( "CVtEngMdtrMessageListener.MediatorCommandL" )
+ }
+
+// -----------------------------------------------------------------------------
+// CVtEngMdtrMessageListener::CancelMediatorCommand
+// Cancallation of mediator command. no-op, just returns response.
+// -----------------------------------------------------------------------------
+//
+void CVtEngMdtrMessageListener::CancelMediatorCommand(
+ TUid /*aDomain*/,
+ TUid /*aCategory*/,
+ TInt /*aCommandId*/ )
+ {
+ __VTPRINTENTER( "CVtEngMdtrMessageListener.CancelMediatorCommand" )
+ // No-op
+ __VTPRINTEXIT( "CVtEngMdtrMessageListener.CancelMediatorCommand" )
+ }
+
+// -----------------------------------------------------------------------------
+// CVtEngMdtrEventListener::MediatorEventL
+// Receives mediator event from VT Mediator Plugin. The event
+// contains CLI and/or Dataport name.
+// -----------------------------------------------------------------------------
+//
+void CVtEngMdtrMessageListener::MediatorEventL( TUid /*aDomain*/,
+ TUid aCategory,
+ TInt aEventId,
+ const TDesC8& aData )
+ {
+ __VTPRINTENTER( "CVtEngMdtrMessageListener.MediatorEventL" )
+ if ( aCategory == KCatVideotelInternalEvents &&
+ aEventId == EVtMediatorEventVideoCallInformation )
+ {
+ TVtMediatorInfoPackage package;
+ package.Copy( aData );
+ TVtVideoTelephonyCallInformation data = package();
+ __VTPRINT2( DEBUG_GEN, " VT call info data validity value=%d",
+ data.iEventDataValidity)
+ // if message contains dataport name save it
+ CVtEngSettings& settings = iUtils.Settings();
+ if ( data.iEventDataValidity &
+ TVtVideoTelephonyCallInformation::EDataportValid )
+ {
+ //__VTPRINT(DEBUG_GEN, " Dataport is ready")
+ settings.SetDataportInfoL( data.iDataport );
+ }
+ // if message contains CLI info handle it (save and notify if state
+ // allows)
+ if ( data.iEventDataValidity &
+ TVtVideoTelephonyCallInformation::EDisplayTextValid )
+ {
+ MVtEngSessionInfo::TCLI cli;
+ cli.iCallId = data.iCallId;
+ cli.iName = data.iDisplayText.Left( cli.iName.MaxLength() );
+ cli.iVoiceCallPossible = data.iVoiceCallPossible;
+ settings.SetCLI( cli );
+
+ // ready == call is answered (allows setting app to foreground)
+ if ( IsReadyForCLIEvent() )
+ {
+ // send event about CLI availability
+ CVtEngEventManager::NotifyEvent( KVtEngCLIAvailable );
+ }
+ else
+ {
+ // Wait until connected state is reached (see HandleVtEventL)
+ __VTPRINT( DEBUG_GEN,
+ "CVtEngMdtrMessageListener defer CLI event" )
+ iUtils.EventManager().AddObserverL( this );
+ }
+ }
+ }
+ __VTPRINTEXIT( "CVtEngMdtrMessageListener.MediatorEventL" )
+ }
+
+// -----------------------------------------------------------------------------
+// CVtEngMdtrMessageListener::HandleVtEventL
+//
+// Handles defered CLI event dispatching (to UI). CLI event was defered because
+// engine state was not suitable in MediatorEventL which then started observing
+// state changes.
+// -----------------------------------------------------------------------------
+//
+void CVtEngMdtrMessageListener::HandleVtEventL( TInt aEvent )
+ {
+ __VTPRINTENTER( "CVtEngMdtrMessageListener.HandleVtEventL" )
+ if ( aEvent == KVtEngSessionStateChanged &&
+ IsReadyForCLIEvent() ) // <- ready == call is answered
+ {
+ iUtils.EventManager().RemoveObserver( this );
+ __VTPRINT( DEBUG_GEN,
+ "CVtEngMdtrMessageListener dispatch defered CLI event" )
+ CVtEngEventManager::NotifyEvent( KVtEngCLIAvailable );
+ }
+
+ __VTPRINTEXIT( "CVtEngMdtrMessageListener.HandleVtEventL" )
+ }
+
+
+// -----------------------------------------------------------------------------
+// CVtEngMdtrMessageListener::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CVtEngMdtrMessageListener::ConstructL()
+ {
+ __VTPRINTENTER( "CVtEngMdtrMessageListener.ConstructL" )
+
+ // for sending command responses
+ iMediatorResponder = CMediatorCommandResponder::NewL( this );
+
+ // for receiving events from VT Mediator Plugin (dataport/CLI info)
+ iMediatorEvents = CMediatorEventConsumer::NewL( this );
+
+ TCapabilitySet capSet;
+ capSet.SetEmpty();
+ // for audio control
+ capSet.AddCapability( ECapabilityWriteDeviceData );
+
+ // define common attributes for all commands that engine is responsible for
+ MediatorService::TCommand command;
+ command.iCaps = capSet;
+ command.iVersion = TVersion(
+ KPhoneToVideotelCmdVersionMajor,
+ KPhoneToVideotelCmdVersionMinor,
+ KPhoneToVideotelCmdVersionBuild );
+ command.iTimeout = KVtEngMdtrCmdTimeout;
+
+ // enable microphone command
+ command.iCommandId = EVtCmdUnmute;
+ iCommandList.Append( command );
+
+ // disable microphone command
+ command.iCommandId = EVtCmdMute;
+ iCommandList.Append( command );
+
+ // register VT events that are raised by VT Mediator Plugin.
+ // !!! Note !!!!
+ // event subscription must be done before command registration because
+ // command registration triggers raising the event in the plugin. Different
+ // order would cause the engine to miss the event.
+ const TVersion commandVersion(
+ KVideotelMdtrCommandsVersionMajor,
+ KVideotelMdtrCommandsVersionMinor,
+ KVideotelMdtrCommandsVersionBuild );
+ //capSet.SetEmpty();
+ //capSet.AddCapability( ECapabilityPowerMgmt );
+
+ iMediatorResponder->RegisterCommand(
+ KMediatorVideoTelephonyDomain,
+ KCatVideotelInternalCommands,
+ EVtMediatorReleaseDataport,
+ commandVersion,
+ capSet,
+ KVtEngMdtrCmdTimeout );
+
+ const TVersion eventVersion(
+ KTelephonyEventsVersionMajor,
+ KTelephonyEventsVersionMinor,
+ KTelephonyEventsVersionBuild );
+
+ TInt res = iMediatorEvents->SubscribeEvent( KMediatorVideoTelephonyDomain,
+ KCatVideotelInternalEvents,
+ EVtMediatorEventVideoCallInformation,
+ eventVersion );
+
+ if ( res == KErrNone )
+ {
+ // register Mediator commands that we handle
+ res = iMediatorResponder->RegisterCommand(
+ KMediatorVideoTelephonyDomain,
+ KCatPhoneToVideotelCommands,
+ iCommandList );
+
+ }
+ __VTPRINTEXITR( "CVtEngMdtrMessageListener.ConstructL res=%d",res )
+ // registering must not fail
+ User::LeaveIfError( res );
+ }
+
+// -----------------------------------------------------------------------------
+// CVtEngMdtrMessageListener::CVtEngMdtrMessageListener
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CVtEngMdtrMessageListener::CVtEngMdtrMessageListener( CVtEngUtility& aUtils)
+ : iUtils( aUtils ), iCommandList( KVtEngMdtrCmdArrayGranularity )
+ {
+ __VTPRINTENTER( "CVtEngMdtrMessageListener.CVtEngMdtrMessageListener" )
+ __VTPRINTEXIT( "CVtEngMdtrMessageListener.CVtEngMdtrMessageListener" )
+ }
+
+// -----------------------------------------------------------------------------
+// CVtEngMdtrMessageListener::IsReadyForCLIEvent
+// Checks if engine state is appropriate to send CLI event.
+// -----------------------------------------------------------------------------
+//
+TBool CVtEngMdtrMessageListener::IsReadyForCLIEvent() const
+ {
+ __VTPRINTENTER( "CVtEngMdtrMessageListener.IsReadyForCLIEvent" )
+ const MVtEngSessionInfo::TSessionState state =
+ iUtils.StateManager()->SessionState();
+ const TBool isReady =
+ ( state == MVtEngSessionInfo::EConnected ||
+ state == MVtEngSessionInfo::ENegotiating ||
+ state == MVtEngSessionInfo::EOpen );
+ __VTPRINTEXITR( "CVtEngMdtrMessageListener.IsReadyForCLIEvent %d>",
+ isReady )
+ return isReady;
+ }
+
+// End of File
+