vtengines/videoteleng/Src/Base/cvtengmediatorservice.cpp
changeset 27 dcbddbbaf8fd
--- /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
+