diff -r 000000000000 -r 1bce908db942 multimediacommsengine/mmcesrv/mmceserver/src/mcenatsipsession.cpp --- /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 +#include +#include +#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& 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& 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