vtengines/videoteleng/Src/Base/cvtengmediatorservice.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 3 b1602a5ab0a3
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 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