vtengines/videoteleng/Src/Base/cvtengmdtrmessagelistener.cpp
changeset 0 ed9695c8bcbe
child 8 07d1685f0cd4
--- /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
+