multimediacommsengine/mmcesrv/mmceserver/src/mcenatsipsession.cpp
changeset 0 1bce908db942
child 8 2a28ef775f15
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/multimediacommsengine/mmcesrv/mmceserver/src/mcenatsipsession.cpp	Tue Feb 02 01:04:58 2010 +0200
@@ -0,0 +1,876 @@
+/*
+* Copyright (c) 2005 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:  
+*
+*/
+
+
+
+#include <sipprofile.h>
+#include <sipinvitedialogassoc.h>
+#include <sdpdocument.h>
+#include "mcenatsipsession.h"
+#include "mcenatsipstatemachine.h"
+#include "mcemediamanager.h"
+#include "mcenatpluginmanager.h"
+#include "mcecssession.h"
+#include "mcesipconnection.h"
+#include "mceclient.pan"
+#include "mcesrvlogs.h"
+#include "mcecomsession.h"
+
+#define PANIC( aPanic ) User::Panic( KMceServerPanic, aPanic )
+#define DEBUG_PANIC( aPanic ) __ASSERT_DEBUG( EFalse, PANIC( aPanic ) )
+
+// ======== MEMBER FUNCTIONS ========
+// -----------------------------------------------------------------------------
+// CMceNatSipSession::NewL
+// -----------------------------------------------------------------------------
+//
+CMceNatSipSession* CMceNatSipSession::NewL( CMceCsSession& aClientSession, 
+                                            CMceSipConnection& aSIPConnection,
+								            CMceSipStateMachine& aStateMachine,
+								            CSIPProfile& aProfile,
+								            const CDesC8Array* aParams )
+	{
+    CMceNatSipSession* self = CMceNatSipSession::NewLC( aClientSession, 
+                                                        aSIPConnection, 
+                                                        aStateMachine,
+                                                        aProfile,
+                                                        aParams );
+    CleanupStack::Pop(self);
+    return self;
+	}
+
+// -----------------------------------------------------------------------------
+// CMceNatSipSession::NewL
+// -----------------------------------------------------------------------------
+//
+CMceNatSipSession* CMceNatSipSession::NewL( CMceCsSession& aClientSession, 
+                                            CMceSipConnection& aSIPConnection,
+								            CMceSipStateMachine& aStateMachine,
+								            const CDesC8Array* aParams )
+	{
+    CMceNatSipSession* self = CMceNatSipSession::NewLC( aClientSession, 
+                                                        aSIPConnection, 
+                                                        aStateMachine,
+                                                        aParams );
+    CleanupStack::Pop(self);
+    return self;
+	}
+
+
+// -----------------------------------------------------------------------------
+// CMceNatSipSession::NewLC
+// -----------------------------------------------------------------------------
+//
+CMceNatSipSession* CMceNatSipSession::NewLC( CMceCsSession& aClientSession, 
+                                             CMceSipConnection& aSIPConnection,
+ 								             CMceSipStateMachine& aStateMachine,
+ 								             CSIPProfile& aProfile,
+ 								             const CDesC8Array* aParams )
+	{
+    CMceNatSipSession* self = new (ELeave) CMceNatSipSession( aClientSession, 
+                                                              aSIPConnection, 
+                                                              aStateMachine,
+                                                              aProfile );
+    CleanupStack::PushL(self);
+    self->ConstructL( aClientSession, aSIPConnection, aParams );
+    return self;
+	}
+
+// -----------------------------------------------------------------------------
+// CMceNatSipSession::NewLC
+// -----------------------------------------------------------------------------
+//
+CMceNatSipSession* CMceNatSipSession::NewLC( CMceCsSession& aClientSession, 
+                                             CMceSipConnection& aSIPConnection,
+ 								             CMceSipStateMachine& aStateMachine,
+ 								             const CDesC8Array* aParams )
+	{
+    CMceNatSipSession* self = new (ELeave) CMceNatSipSession( aClientSession, 
+                                                              aSIPConnection, 
+                                                              aStateMachine );
+    CleanupStack::PushL(self);
+    self->ConstructL( aClientSession, aSIPConnection, aParams );
+    return self;
+	}
+
+// -----------------------------------------------------------------------------
+// CMceNatSipSession::CMceNatSipSession
+// -----------------------------------------------------------------------------
+//
+CMceNatSipSession::CMceNatSipSession( CMceCsSession& aClientSession, 
+								      CMceSipConnection& aSIPConnection,
+								      CMceSipStateMachine& aStateMachine,
+								      CSIPProfile& aProfile )
+    : CMceSipSession( aClientSession, aSIPConnection, aStateMachine, aProfile )
+	{
+	}
+
+// -----------------------------------------------------------------------------
+// CMceNatSipSession::CMceNatSipSession
+// -----------------------------------------------------------------------------
+//
+CMceNatSipSession::CMceNatSipSession( CMceCsSession& aClientSession, 
+								      CMceSipConnection& aSIPConnection,
+								      CMceSipStateMachine& aStateMachine )
+    : CMceSipSession( aClientSession, aSIPConnection, aStateMachine )
+	{
+	}
+
+// -----------------------------------------------------------------------------
+// CMceNatSipSession::ConstructL
+// -----------------------------------------------------------------------------
+//
+void CMceNatSipSession::ConstructL( CMceCsSession& aClientSession,
+                                    CMceSipConnection& aSIPConnection,
+                                    const CDesC8Array* aParams )
+	{
+    MCESRV_DEBUG( "*** CMceNatSipSession::ConstructL, Entry" )
+
+	CMceSipSession::ConstructL( aClientSession ); // base class
+
+    TRAPD( error, TryNatSessionL( aSIPConnection, aParams ) );
+
+    if ( KErrNone != error )
+        {
+        NatErrorOccurred( error );
+        }
+    else
+    	{
+    	iNatSession = ETrue;
+    	}
+    MCESRV_DEBUG( "*** CMceNatSipSession::ConstructL, Exit" )  
+	}
+
+// -----------------------------------------------------------------------------
+// CMceNatSipSession::TryNatSessionL
+// -----------------------------------------------------------------------------
+//
+void CMceNatSipSession::TryNatSessionL( CMceSipConnection& aSIPConnection,
+                                        const CDesC8Array* aParams )
+    {
+    iNatStateMachine = CMceNatSipStateMachine::NewL();
+    
+    TUint32 iapId = aSIPConnection.AccessPointId();
+    
+    const TDesC8* userAor = NULL;
+    TPtrC8 originator;
+    if ( ProfileConfigured() )
+        {
+        MCESRV_DEBUG( "*** CMceNatSipSession::TryNatSessionL, using profile" )
+        
+        CSIPProfile& profile = Profile();
+        User::LeaveIfError( profile.GetParameter( KSIPUserAor, userAor ) );
+        }
+    else
+        {
+        MCESRV_DEBUG( "*** CMceNatSipSession::TryNatSessionL, profile not used" )
+        
+        __ASSERT_ALWAYS( aParams && 
+                         aParams->MdcaCount() > KMceArrayIndexOriginator, 
+                         User::Leave( KErrArgument ) );
+        originator.Set( aParams->MdcaPoint( KMceArrayIndexOriginator ) );
+        userAor = &originator;
+        }
+    
+    TUriParser8 uri8Parser;
+    User::LeaveIfError( uri8Parser.Parse( *userAor ) );
+    CUri8* cUri8 = CUri8::NewLC( uri8Parser );
+    const TDesC8& domain = cUri8->Uri().Extract( EUriHost );
+    
+    CMceNatPluginManager& manager = Manager().MediaManager().NatPluginManager();
+    iSessionId = manager.NewSessionL( *this, iapId, domain );
+    
+    CleanupStack::PopAndDestroy( cUri8 );
+    
+    MCESRV_DEBUG( "*** CMceNatSipSession::TryNatSessionL, Exit" )
+    }
+
+// -----------------------------------------------------------------------------
+// CMceNatSipSession::~CMceNatSipSession
+// -----------------------------------------------------------------------------
+//
+CMceNatSipSession::~CMceNatSipSession()
+	{
+	MCESRV_DEBUG( "*** CMceNatSipSession::~CMceNatSipSession, Entry" )
+	
+    delete iNatStateMachine;
+    
+    CMceNatPluginManager& manager = Manager().MediaManager().NatPluginManager();
+    TRAP_IGNORE( manager.CloseSessionL( iSessionId ) )
+    
+    MCESRV_DEBUG( "*** CMceNatSipSession::~CMceNatSipSession, Exit" )
+  	}
+
+// -----------------------------------------------------------------------------
+// CMceNatSipSession::UpdateMediaL
+// -----------------------------------------------------------------------------
+//
+TMceReturnStatus CMceNatSipSession::UpdateMediaL()
+    {
+    MCESRV_DEBUG( "*** CMceNatSipSession::UpdateMediaL, Entry" )
+    
+    PrepareNatSessionUpdate();
+    
+    TMceReturnStatus status = CMceSipSession::UpdateMediaL();
+    if ( KMceReady == status )
+        {
+        TMceNatStateTransitionEvent event( NULL, *this, EMceNatUpdated, *this,
+        								   iSipEvent );
+        
+        if ( !iNatDisabled && iNatStateMachine->Accept( event ) )
+            {
+            MCESRV_DEBUG( "*** CMceNatSipSession::UpdateMediaL, processing" )
+            
+            iEntryPoint = ENatEntryUpdated;
+            event.ParamStatus() = KMceReady;
+            
+            TRAPD( error, iNatStateMachine->ProcessL( event ) )
+            
+            if ( error != KErrNone )
+                {
+                iEntryPoint = ENatEntryNone;
+                NatErrorOccurred( error );
+                }
+            else
+                {
+                status = event.ParamStatus();
+                }
+            }
+        }
+    
+    MCESRV_DEBUG( "*** CMceNatSipSession::UpdateMediaL, Exit" )
+    return status;
+    }
+
+// -----------------------------------------------------------------------------
+// CMceNatSipSession::ReserveL
+// -----------------------------------------------------------------------------
+//
+TMceReturnStatus CMceNatSipSession::ReserveL()
+    {
+    MCESRV_DEBUG("CMceNatSipSession::ReserveL, Entry")
+
+    iReserveStatus = CMceSipSession::ReserveL();
+    if ( iReserveStatus == KMceReady )
+    	{
+    	TMceReturnStatus async = 0;
+    	iReserveStatus =
+    		GetResourceReservationStatus() == async ? KMceAsync : KMceReady;
+    	}
+    
+    return iReserveStatus;
+    }
+
+// -----------------------------------------------------------------------------
+// CMceNatSipSession::Updated
+// -----------------------------------------------------------------------------
+//
+void CMceNatSipSession::Updated( CMceComSession& aSession )
+    {
+    MCESRV_DEBUG( "*** CMceNatSipSession::Updated, Entry" )
+    
+    TMceNatStateTransitionEvent event(
+            NULL, *this, EMceNatUpdated, *this, iSipEvent );
+    
+    if ( !iNatDisabled &&
+         iNatStateMachine->Accept( event ) )
+        {
+        MCESRV_DEBUG( "*** CMceNatSipSession::Updated, processing" )
+
+        iEntryPoint = ENatEntryUpdated;
+        event.ParamStatus() = KMceAsync;
+        
+        TRAPD( error, iNatStateMachine->ProcessL( event ) )
+        
+        if ( KErrNone != error )
+            {
+            iEntryPoint = ENatEntryNone;
+            CMceSipSession::Updated( aSession );
+            NatErrorOccurred( error );
+            }
+        }
+    else
+        {
+        MCESRV_DEBUG( "*** CMceNatSipSession::Updated, passing forward" )
+        CMceSipSession::Updated( aSession );
+        }
+		
+    MCESRV_DEBUG("*** CMceNatSipSession::Updated, Exit" )
+    }
+
+// -----------------------------------------------------------------------------
+// CMceNatSipSession::Offer
+// -----------------------------------------------------------------------------
+//
+CSdpDocument* CMceNatSipSession::Offer()
+    {
+    if ( KMceNatPrevOfferSdp == iOfferedSdp )
+        {
+        MCESRV_DEBUG("*** CMceNatSipSession::Offer, iPrevOffer" )
+        return iPrevOffer;        
+        }
+    else
+        {
+        return CMceSipSession::Offer();
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CMceNatSipSession::NatSession
+// -----------------------------------------------------------------------------
+//
+TBool CMceNatSipSession::NatSession() const
+    {
+    return ETrue;
+    }
+
+// -----------------------------------------------------------------------------
+// CMceNatSipSession::NatState
+// -----------------------------------------------------------------------------
+//
+TInt CMceNatSipSession::NatState() const
+    {
+    return iNatStateMachine->State();
+    }
+
+// -----------------------------------------------------------------------------
+// CMceNatSipSession::IsNatDisabled
+// -----------------------------------------------------------------------------
+//
+TBool CMceNatSipSession::IsNatDisabled() const
+	{
+	return iNatDisabled;
+	}
+
+// -----------------------------------------------------------------------------
+// CMceNatSipSession::Initialized
+// -----------------------------------------------------------------------------
+//
+void CMceNatSipSession::Initialized( TUint aSessionId )
+    {
+    MCESRV_DEBUG( "*** CMceNatSipSession::Initialized, Entry" )
+    
+    __ASSERT_DEBUG( aSessionId == iSessionId, PANIC( KErrArgument ) );
+    
+    TMceNatStateTransitionEvent event( 
+            NULL, *this, EMceNatInitialized, *this, iSipEvent );
+    
+    if ( !iNatDisabled &&
+         aSessionId == iSessionId &&
+         iNatStateMachine->Accept( event ) )
+        {
+        MCESRV_DEBUG( "*** CMceNatSipSession::Initialized, processing" )
+        
+        TRAPD( error, iNatStateMachine->ProcessL( event ) )
+            
+        if ( KErrNone != error )
+            {
+            NatErrorOccurred( error );
+            }        
+        }
+    else
+        {
+        DEBUG_PANIC( KErrNotReady );
+        }
+    
+    MCESRV_DEBUG( "*** CMceNatSipSession::Initialized, Entry" )
+    }
+
+// -----------------------------------------------------------------------------
+// CMceNatSipSession::OfferReady
+// -----------------------------------------------------------------------------
+//
+void CMceNatSipSession::OfferReady( TUint aSessionId, CSdpDocument* aOffer )
+    {
+    MCESRV_DEBUG("*** CMceNatSipSession::OfferReady, Entry" )
+    
+    __ASSERT_DEBUG( aSessionId == iSessionId, PANIC( KErrArgument ) );
+    
+    CMceNatPluginManager::WriteSdpToLog( _L("Offer"), aOffer );
+    
+    TMceNatStateTransitionEvent event(
+            aOffer, *this, EMceNatOffer, *this, iSipEvent );
+    
+    if ( !iNatDisabled &&
+         aSessionId == iSessionId &&
+         iNatStateMachine->Accept( event ) )
+        {
+        MCESRV_DEBUG( "*** CMceNatSipSession::OfferReady, processing" )
+        
+        TRAPD( error, iNatStateMachine->ProcessL( event ) )
+        
+        if ( KErrNone != error )
+            {
+            NatErrorOccurred( error );
+            }
+        }
+    else
+        {
+        SafeDelete( aOffer );
+        DEBUG_PANIC( KErrNotReady );
+        }
+    
+    MCESRV_DEBUG("*** CMceNatSipSession::OfferReady, Exit" )
+    }
+
+// -----------------------------------------------------------------------------
+// CMceNatSipSession::AnswerReady
+// -----------------------------------------------------------------------------
+//
+void CMceNatSipSession::AnswerReady( TUint aSessionId, CSdpDocument* aAnswer )
+    {
+    MCESRV_DEBUG("*** CMceNatSipSession::AnswerReady, Entry" )
+    
+    __ASSERT_DEBUG( aSessionId == iSessionId, PANIC( KErrArgument ) );
+    
+    CMceNatPluginManager::WriteSdpToLog( _L("Answer"), aAnswer );
+    
+    TMceNatStateTransitionEvent event(
+            aAnswer, *this, EMceNatAnswer, *this, iSipEvent );
+    
+    if ( !iNatDisabled &&
+         aSessionId == iSessionId &&
+         iNatStateMachine->Accept( event ) )
+        {
+        MCESRV_DEBUG( "*** CMceNatSipSession::AnswerReady, processing" )
+        
+        TRAPD( error, iNatStateMachine->ProcessL( event ) );
+        
+        if ( KErrNone != error )
+            {
+            NatErrorOccurred( error );
+            }
+        }
+    else
+        {
+        SafeDelete( aAnswer );
+        DEBUG_PANIC( KErrNotReady );
+        }
+    
+    MCESRV_DEBUG("*** CMceNatSipSession::AnswerReady, Exit" )
+    }
+    
+// -----------------------------------------------------------------------------
+// CMceNatSipSession::UpdateSdp
+// -----------------------------------------------------------------------------
+//
+void CMceNatSipSession::UpdateSdp( TUint aSessionId, CSdpDocument* aOffer )
+    {
+    MCESRV_DEBUG( "*** CMceNatSipSession::UpdateSdp, Entry" )
+
+    __ASSERT_DEBUG( aSessionId == iSessionId, PANIC( KErrArgument ) );
+    
+    TMceNatStateTransitionEvent event(
+            aOffer, *this, EMceNatUpdateSdp, *this, iSipEvent );
+    
+    if ( !iNatDisabled &&
+         aSessionId == iSessionId &&
+         iNatStateMachine->Accept( event ) )
+        {
+        MCESRV_DEBUG( "*** CMceNatSipSession::UpdateSdp, processing" )
+        
+        TRAPD( error, iNatStateMachine->ProcessL( event ) );
+        SafeDelete( aOffer );
+        if ( KErrNone != error )
+            {
+            NatErrorOccurred( error );
+            }
+        }
+    else
+        {
+        SafeDelete( aOffer );
+        DEBUG_PANIC( KErrNotReady );
+        }
+    
+    MCESRV_DEBUG( "*** CMceNatSipSession::UpdateSdp, Exit" )
+    }
+    
+// -----------------------------------------------------------------------------
+// CMceNatSipSession::ErrorOccurred
+// -----------------------------------------------------------------------------
+//
+void CMceNatSipSession::ErrorOccurred( TUint aSessionId, TInt aError )
+    {
+    MCESRV_DEBUG( "*** CMceNatSipSession::ErrorOccurred, Entry" )
+    MCESRV_DEBUG_DVALUE( "*** error", aError )
+    
+    __ASSERT_DEBUG( aSessionId == iSessionId, PANIC( KErrArgument ) );
+    
+    TMceNatStateTransitionEvent event(
+            NULL, *this, EMceNatError, *this, iSipEvent, aError );
+    
+    if ( !iNatDisabled &&
+         aSessionId == iSessionId &&
+         iNatStateMachine->Accept( event ) )
+        {
+        MCESRV_DEBUG( "*** CMceNatSipSession::ErrorOccurred, processing" )
+        
+        TRAPD( error, iNatStateMachine->ProcessL( event ) )
+        
+        if ( KErrNone != error )
+            {
+            NatErrorOccurred( error );
+            }
+        }
+    
+    MCESRV_DEBUG( "*** CMceNatSipSession::ErrorOccurred, Exit" )
+    }
+  
+// -----------------------------------------------------------------------------
+// CMceNatSipSession::IcmpErrorOccurred
+// -----------------------------------------------------------------------------
+//
+void CMceNatSipSession::IcmpErrorOccurred( TUint aSessionId, TInt aError )
+    {
+    MCESRV_DEBUG( "*** CMceNatSipSession::IcmpErrorOccurred, Entry" )
+    MCESRV_DEBUG_DVALUE( "*** error", aError )
+    
+    __ASSERT_DEBUG( aSessionId == iSessionId, PANIC( KErrArgument ) );
+       
+    TMceNatStateTransitionEvent event(
+            NULL, *this, EMceNatICMPError, *this, iSipEvent, aError );
+    
+    if ( !iNatDisabled &&
+         aSessionId == iSessionId &&
+         iNatStateMachine->Accept( event ) )
+        {
+        MCESRV_DEBUG( "*** CMceNatSipSession::IcmpErrorOccurred, processing" )
+        
+        TRAPD( error, iNatStateMachine->ProcessL( event ) )
+        
+        if ( KErrNone != error )
+            {
+            NatErrorOccurred( error );
+            }
+        }
+    
+    MCESRV_DEBUG( "*** CMceNatSipSession::IcmpErrorOccurred, Exit" )
+    }
+
+// -----------------------------------------------------------------------------
+// CMceNatSipSession::CreateOfferL
+// -----------------------------------------------------------------------------
+//
+TInt CMceNatSipSession::CreateOfferL()
+    {
+    SetMediaQosL();
+    
+    CSdpDocument* offer = Offer();
+    CMceNatPluginManager& manager = Manager().MediaManager().NatPluginManager();
+    return manager.CreateOfferL( iSessionId, offer );
+    }
+
+// -----------------------------------------------------------------------------
+// CMceNatSipSession::ResolveL
+// -----------------------------------------------------------------------------
+//
+TInt CMceNatSipSession::ResolveL()
+    {
+    SetMediaQosL();
+    
+    CSdpDocument* offer = PrevOffer();
+    CSdpDocument* answer = Offer();
+    CMceNatPluginManager& manager = Manager().MediaManager().NatPluginManager();
+    return manager.ResolveL( iSessionId, offer, answer );
+    }
+
+// -----------------------------------------------------------------------------
+// CMceNatSipSession::DecodeAnswerL
+// -----------------------------------------------------------------------------
+//
+TInt CMceNatSipSession::DecodeAnswerL()
+    {
+    CSdpDocument* answer = Offer();
+    CMceNatPluginManager& manager = Manager().MediaManager().NatPluginManager();
+    return manager.DecodeAnswerL( iSessionId, answer );
+    }
+
+// -----------------------------------------------------------------------------
+// CMceNatSipSession::UpdateL
+// -----------------------------------------------------------------------------
+//
+void CMceNatSipSession::UpdateL()
+    {
+    CSdpDocument* offer = Offer();
+    CMceNatPluginManager& manager = Manager().MediaManager().NatPluginManager();
+    manager.UpdateL( iSessionId, offer );
+    }
+
+// -----------------------------------------------------------------------------
+// CMceNatSipSession::UpdateRemoteAddressL
+// -----------------------------------------------------------------------------
+//
+void CMceNatSipSession::UpdateRemoteAddressL()
+    {    
+    CMceMediaManager& manager = Manager().MediaManager();
+    RPointerArray<CMceSrvStream>& streams = ActiveBody().MccStreams();
+    
+    for ( TInt i = 0; i < streams.Count(); i++ )
+        {
+        manager.SetRemoteAddressL( *streams[i] );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CMceNatSipSession::SetOffered
+// -----------------------------------------------------------------------------
+//
+void CMceNatSipSession::SetOffered( TMceNatOfferedSdp aOffered )
+    {
+    iOfferedSdp = aOffered;
+    }
+
+// -----------------------------------------------------------------------------
+// CMceNatSipSession::SdpCleanup
+// -----------------------------------------------------------------------------
+//
+void CMceNatSipSession::SdpCleanup( CSdpDocument* aPrev, CSdpDocument* aRep )
+    {
+    CMceSipSession::SdpCleanup( aPrev, aRep );
+    }
+
+// -----------------------------------------------------------------------------
+// CMceNatSipSession::Continue
+// -----------------------------------------------------------------------------
+//
+void CMceNatSipSession::Continue() 
+    {
+    switch( iEntryPoint )
+        {
+        case ENatEntryUpdated:
+            {
+            CMceSipSession::Updated( ActiveBody() );
+            break;
+            }
+        
+        case ENatEntryHandleSIPEvent:
+            {
+            CMceSipSession::HandleSIPEvent( iSipEvent, Dialog()->Dialog() );
+            break;
+            }
+        
+        default:
+            {
+            MCESRV_DEBUG( "*** CMceNatSipSession::Continue, default!" )
+            DEBUG_PANIC( KErrTotalLossOfPrecision );
+            }
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CMceNatSipSession::StateChanged
+// -----------------------------------------------------------------------------
+//
+void CMceNatSipSession::StateChangedL( TMceNatStateTransitionEvent& aEvent,
+                                       TUint aNewState )
+    {
+    iNatStateMachine->NewStateL( aEvent, aNewState );
+    }
+
+// -----------------------------------------------------------------------------
+// CMceNatSipSession::HandleSIPEvent
+// -----------------------------------------------------------------------------
+//
+void CMceNatSipSession::HandleSIPEvent( TMceSipEventCode aEventCode, CSIPDialog& aDialog )
+    {
+    MCESRV_DEBUG( "*** CMceNatSipSession::HandleSIPEvent, Entry" )
+    
+    TMceNatStateTransitionEvent event(
+            NULL, *this, EMceNatHandleSIP, *this, aEventCode );
+    
+    if ( !iNatDisabled && iNatStateMachine->Accept( event ) )
+        {
+        MCESRV_DEBUG( "*** CMceNatSipSession::HandleSIPEvent, processing" )
+
+        iEntryPoint = ENatEntryHandleSIPEvent;
+        iSipEvent = aEventCode;
+        event.ParamStatus() = KMceAsync;
+        
+        TRAPD( error, iNatStateMachine->ProcessL( event ) );
+        
+        if ( KErrNone != error )
+            {
+	        iEntryPoint = ENatEntryNone;
+            CMceSipSession::HandleSIPEvent( aEventCode, aDialog );
+            NatErrorOccurred( error );
+            }
+        }
+    else
+        {
+        MCESRV_DEBUG( "*** CMceNatSipSession::HandleSIPEvent, passing forward" )
+        CMceSipSession::HandleSIPEvent( aEventCode, aDialog );        
+        }
+    	
+    MCESRV_DEBUG( "*** CMceNatSipSession::HandleSIPEvent, Exit" )
+    }
+
+// -----------------------------------------------------------------------------
+// CMceNatSipSession::SafeDelete
+// -----------------------------------------------------------------------------
+//
+void CMceNatSipSession::SafeDelete( CSdpDocument* aDocument )
+    {
+    if ( iOffer != aDocument && iPrevOffer != aDocument )
+        {
+        delete aDocument;
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CMceNatSipSession::NatErrorOccurred
+// -----------------------------------------------------------------------------
+//
+void CMceNatSipSession::NatErrorOccurred( TInt /*aError*/ )
+    {
+    MCESRV_DEBUG( "*** CMceNatSipSession::NatErrorOccurred, Entry")
+
+    // Local handling
+    if ( iNatStateMachine )
+    	{
+    	// If error occurs during creation of NatStateMachine, iNatStateMachine
+    	// is NULL.
+    	iNatStateMachine->ErrorOccurred();	
+    	}
+    
+    iNatDisabled = ETrue;
+    // Free resources reserved by NAT Session
+    CMceNatPluginManager& manager = Manager().MediaManager().NatPluginManager();
+    TRAP_IGNORE( manager.CloseSessionL( iSessionId ) );
+    PrepareNatSessionUpdate();
+    }
+
+// -----------------------------------------------------------------------------
+// CMceNatSipSession::PrepareNatSessionUpdate
+// -----------------------------------------------------------------------------
+//
+void CMceNatSipSession::PrepareNatSessionUpdate()
+    {
+    MCESRV_DEBUG( "*** CMceNatSipSession::PrepareNatSessionUpdate, Entry" )
+    
+    CMceComSession* activeBody = &ActiveBody();
+    if ( activeBody )
+        {
+	    TBool ignorePortComparison( !iNatDisabled );
+	    RPointerArray<CMceComMediaStream>& streams = activeBody->Streams();
+	    for ( TInt i = 0; i < streams.Count(); i++ )
+	        {
+	        CMceComMediaStream* stream = streams[ i ];
+	        stream->SetIgnoreRemotePort( ignorePortComparison );
+	        if ( stream->BoundStream() )
+	            {
+	            stream->iLinkedStream->SetIgnoreRemotePort(
+	            	ignorePortComparison );
+	            }
+	        }
+        }
+    
+    MCESRV_DEBUG( "*** CMceNatSipSession::PrepareNatSessionUpdate, Exit" )
+    }
+
+// -----------------------------------------------------------------------------
+// CMceNatSipSession::SetMediaQosL
+// -----------------------------------------------------------------------------
+//
+void CMceNatSipSession::SetMediaQosL()
+    {
+    CMceComSession* activeBody = &ActiveBody();
+    __ASSERT_ALWAYS( activeBody, User::Leave( KErrTotalLossOfPrecision ) );
+    
+    CMceNatPluginManager& manager = Manager().MediaManager().NatPluginManager();
+    User::LeaveIfError( manager.SetSessionParam( iSessionId, 
+        CNSPPlugin::ENSPMediaTypeOfServiceKey,
+        activeBody->iServiceType ) );
+    }
+
+// -----------------------------------------------------------------------------
+// CMceNatSipSession::SetNeedtoReceive 
+// -----------------------------------------------------------------------------
+//
+void CMceNatSipSession::SetNeedtoReceive()
+	{
+	MCESRV_DEBUG( "*** CMceNatSipSession::SetNeedtoReceive, Entry" )	
+	iForceSDPSending = ETrue;
+	MCESRV_DEBUG( "*** CMceNatSipSession::SetNeedtoReceive, Exit" )		
+	}
+
+// -----------------------------------------------------------------------------
+// CMceNatSipSession::GetResourceReservationStatus 
+// -----------------------------------------------------------------------------
+//
+TInt CMceNatSipSession::GetResourceReservationStatus()
+	{
+	MCESRV_DEBUG( "*** CMceNatSipSession::GetResourceReservationStatus, Entry" )	
+
+	CMceNatPluginManager& manager = Manager().MediaManager().NatPluginManager();
+    TUint status = manager.GetSessionParam( iSessionId,
+    							CNSPPlugin::ENSPResourseReservationStatusKey );
+
+	MCESRV_DEBUG( "*** CMceNatSipSession::GetResourceReservationStatus, Exit" )		
+	return status;
+	}
+
+// -----------------------------------------------------------------------------
+// CMceNatSipSession::GetReservationStatus 
+// -----------------------------------------------------------------------------
+//
+TMceReturnStatus CMceNatSipSession::GetReservationStatus()
+	{
+	return iReserveStatus;
+	}
+
+// -----------------------------------------------------------------------------
+// CMceNatSipSession::SetReservationStatus 
+// -----------------------------------------------------------------------------
+//
+void CMceNatSipSession::SetReservationStatus( TMceReturnStatus aStatus )
+	{
+	iReserveStatus = aStatus;
+	}
+
+// -----------------------------------------------------------------------------
+// CMceNatSipSession::ResumeNatUpdated
+// -----------------------------------------------------------------------------
+//
+void CMceNatSipSession::ResumeNatUpdated()
+	{
+	MCESRV_DEBUG( "*** CMceNatSipSession::ResumeNatUpdated, Entry" )
+
+	if( !iNatDisabled )
+        {
+		TMceNatStateTransitionEvent event( NULL, *this, EMceNatUpdated, *this,
+										   iSipEvent );
+        iEntryPoint = ENatEntryUpdated;
+        // iComSession was already set in UpdateMediaL() or Updated()
+        event.ParamStatus() = KMceAsync;
+
+        TRAPD( error, iNatStateMachine->ProcessL( event ) );
+		if ( error != KErrNone )
+            {
+            iEntryPoint = ENatEntryNone;
+            CMceSipSession::Updated( ActiveBody() );
+            NatErrorOccurred( error );
+            }
+		}
+    else
+    	{
+        CMceSipSession::Updated( ActiveBody() );
+        }
+
+	MCESRV_DEBUG( "*** CMceNatSipSession::ResumeNatUpdated, Exit" )
+	}
+
+// End of File