vtengines/videoteleng/Src/Base/cvtengmdtrmessagelistener.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Fri, 19 Feb 2010 22:53:04 +0200
branchRCL_3
changeset 8 07d1685f0cd4
parent 0 ed9695c8bcbe
child 24 f15ac8e65a02
permissions -rw-r--r--
Revision: 201002 Kit: 201007

/*
* 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