--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/natplugins/natpnatfwsdpprovider/src/nspactionset.cpp Tue Feb 02 01:04:58 2010 +0200
@@ -0,0 +1,420 @@
+/*
+* Copyright (c) 2007 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: State machine actions set implementation
+*
+*/
+
+#include <sdpdocument.h>
+#include "nspactionset.h"
+#include "nspcontentparser.h"
+#include "nspsession.h"
+#include "nspmediastreamcontainer.h"
+#include "nsputil.h"
+#include "nspdefs.h"
+
+#define MISMATCH( aData ) \
+ ( aData.SubState() == CNSPSessionData::ESubMismatch ||\
+ aData.SubState() == CNSPSessionData::ESubAll )
+#define REMOTELITE( aData ) \
+ ( aData.SubState() == CNSPSessionData::ESubRemoteLite ||\
+ aData.SubState() == CNSPSessionData::ESubAll )
+
+// ======== MEMBER FUNCTIONS ========
+// ---------------------------------------------------------------------------
+// TNSPActionSet::TNSPActionSet
+// ---------------------------------------------------------------------------
+//
+TNSPActionSet::TNSPActionSet( CNSPSession& aSession )
+ : iSession( aSession )
+ {
+ }
+
+
+// ---------------------------------------------------------------------------
+// TNSPActionSet::CreateStreamsL
+// ---------------------------------------------------------------------------
+//
+TNatReturnStatus TNSPActionSet::CreateStreamsL( CSdpDocument& aDoc )
+ {
+ NSPLOG_STR( "TNSPActionSet::CreateStreamsL, Entry" )
+
+ TNatReturnStatus status = iSession.Container().CreateStreamsL( aDoc );
+
+ NSPLOG_INT( "TNSPActionSet::CreateStreamsL, status:", status )
+ NSPLOG_STR( "TNSPActionSet::CreateStreamsL, Exit" )
+
+ return status;
+ }
+
+
+// ---------------------------------------------------------------------------
+// TNSPActionSet::RemoveStreams
+// ---------------------------------------------------------------------------
+//
+TNatReturnStatus TNSPActionSet::RemoveStreamsL( CSdpDocument& aDoc )
+ {
+ NSPLOG_STR( "TNSPActionSet::RemoveStreamsL, Entry" )
+
+ TNatReturnStatus status = iSession.Container().RemoveStreamsL( aDoc );
+
+ NSPLOG_INT( "TNSPActionSet::RemoveStreamsL, status:", status )
+ NSPLOG_STR( "TNSPActionSet::RemoveStreamsL, Exit" )
+
+ return status;
+ }
+
+// ---------------------------------------------------------------------------
+// TNSPActionSet::ControlMediaL
+// ---------------------------------------------------------------------------
+//
+TNatReturnStatus TNSPActionSet::ControlMediaL( TUint aStreamId,
+ MNATFWConnectivityObserver::TNATFWConnectivityEvent aEvent,
+ TInt aError, TAny* aData )
+ {
+ NSPLOG_STR( "TNSPActionSet::ControlMediaL, Entry" )
+
+ TNatReturnStatus status = iSession.Container().ControlMediaL(
+ aStreamId, aEvent, aError, aData );
+
+ NSPLOG_INT( "TNSPActionSet::ControlMediaL, status:", status )
+ NSPLOG_STR( "TNSPActionSet::ControlMediaL, Exit" )
+
+ return status;
+ }
+
+// ---------------------------------------------------------------------------
+// TNSPActionSet::FirstRoundL
+// ---------------------------------------------------------------------------
+//
+void TNSPActionSet::FirstRoundL( CSdpDocument& aDoc, TBool aStoreSdp )
+ {
+ NSPLOG_STR( "TNSPActionSet::FirstRoundL, Entry" )
+
+ iSession.Container().ModStunSolvedL( aDoc );
+
+ if ( aStoreSdp )
+ {
+ iSession.Data().SetUpdatedSdp( aDoc.CloneL() );
+ }
+
+ if ( iSession.Data().UseIce() )
+ {
+ iSession.Container().AddIceContentL( aDoc );
+ }
+
+ NSPLOG_STR( "TNSPActionSet::FirstRoundL, Exit" )
+ }
+
+
+// ---------------------------------------------------------------------------
+// TNSPActionSet::LatterRoundL
+// ---------------------------------------------------------------------------
+//
+void TNSPActionSet::LatterRoundL( CSdpDocument& aDoc )
+ {
+ NSPLOG_STR( "TNSPActionSet::LatterRoundL, Entry" )
+
+ if ( iSession.Data().UseIce() )
+ {
+ iSession.Container().ModIceSolvedL( aDoc );
+ }
+ else
+ {
+ iSession.Container().ModStunSolvedL( aDoc );
+ }
+
+ NSPLOG_STR( "TNSPActionSet::LatterRoundL, Exit" )
+ }
+
+
+// ---------------------------------------------------------------------------
+// TNSPActionSet::LocalRoundL
+// ---------------------------------------------------------------------------
+//
+void TNSPActionSet::LocalRoundL( CSdpDocument& aDoc )
+ {
+ NSPLOG_STR( "TNSPActionSet::LocalRoundL, Entry" )
+
+ iSession.Container().ModLocalSolvedL( aDoc );
+ iSession.Parser().RemoveIceContent( aDoc );
+
+ NSPLOG_STR( "TNSPActionSet::LocalRoundL, Exit" )
+ }
+
+
+// ---------------------------------------------------------------------------
+// TNSPActionSet::UpdateRoundL
+// ---------------------------------------------------------------------------
+//
+void TNSPActionSet::UpdateRoundL( CSdpDocument& aDoc )
+ {
+ NSPLOG_STR( "TNSPActionSet::UpdateRoundL, Entry" )
+
+ if ( iSession.Data().UseIce() &&
+ EIceRoleControlling == iSession.Data().Role() )
+ {
+ CSdpDocument* update = iSession.Container().CheckUpdateL( aDoc );
+
+ if ( update )
+ {
+ CleanupStack::PushL( update );
+ iSession.Parser().RemoveIceContent( *update );
+ iSession.Container().AddRemoteCandidatesL( *update );
+
+ CleanupStack::Pop( update );
+ iSession.UpdateSdpAsyncL( update ); // ownership changed
+ }
+ }
+
+ NSPLOG_STR( "TNSPActionSet::UpdateRoundL, Exit" )
+ }
+
+
+// ---------------------------------------------------------------------------
+// TNSPActionSet::GetCredentialsL
+// ---------------------------------------------------------------------------
+//
+TNatReturnStatus TNSPActionSet::GetCredentialsL( CSdpDocument& aDoc )
+ {
+ NSPLOG_STR( "TNSPActionSet::GetCredentialsL, Entry" )
+
+ TNatReturnStatus status = KNatReady;
+ CNATFWCredentials& credentials = iSession.Data().Credentials();
+
+ if ( iSession.Data().UseIce() )
+ {
+ status = iSession.Container().GetCredentialsL( aDoc, credentials );
+ }
+
+ NSPLOG_INT( "TNSPActionSet::GetCredentialsL, status:", status )
+ NSPLOG_STR( "TNSPActionSet::GetCredentialsL, Exit" )
+
+ return status;
+ }
+
+
+// ---------------------------------------------------------------------------
+// TNSPActionSet::GetCandidatesL
+// ---------------------------------------------------------------------------
+//
+TNatReturnStatus TNSPActionSet::GetCandidatesL( CSdpDocument& aDoc )
+ {
+ NSPLOG_STR( "TNSPActionSet::GetCandidatesL, Entry" )
+
+ TNatReturnStatus status = iSession.Container().GetCandidatesL( aDoc,
+ iSession.Data().RemoteCandidates() );
+
+ NSPLOG_INT( "TNSPActionSet::GetCandidatesL, status:", status )
+ NSPLOG_STR( "TNSPActionSet::GetCandidatesL, Exit" )
+
+ return status;
+ }
+
+
+// ---------------------------------------------------------------------------
+// TNSPActionSet::GetSessionModifiersL
+// ---------------------------------------------------------------------------
+//
+TNatReturnStatus TNSPActionSet::GetSessionModifiersL( CSdpDocument& aDoc,
+ CNSPSession::TSdpRole aRole )
+ {
+ NSPLOG_STR( "TNSPActionSet::GetSessionModifiersL, Entry" )
+
+ TNatReturnStatus status = KNatReady;
+ CNSPSessionData& data = iSession.Data();
+ CNSPSessionData::TSubState subState = data.SubState();
+ TBool isIce = data.UseIce();
+
+ TBool useIce = iSession.Parser().IsIceSupported( aDoc );
+ TBool mismatch = iSession.Parser().IsMismatchL( aDoc );
+ TBool lite = iSession.Parser().IsLiteAttribute( aDoc );
+
+ // # 1. Mismatch
+ data.SetSubState( mismatch ? CNSPSessionData::ESubMismatch : data.SubState() );
+ data.SetUseIce( isIce && useIce && !MISMATCH( data ) );
+
+ // # 2. Remote lite
+ data.SetSubState( lite ? CNSPSessionData::ESubRemoteLite : data.SubState() );
+
+ // # 3. Ice role
+ if ( CNSPSession::EUndefined != aRole )
+ {
+ data.SetRole( OFFERER( aRole ) || REMOTELITE( data ) ?
+ EIceRoleControlling : EIceRoleControlled );
+ }
+
+ status = ( ( data.SubState() == subState &&
+ isIce == data.UseIce() ) ? KNatReady : KNatAsync );
+
+ NSPLOG_INT( "TNSPActionSet::GetSessionModifiersL, status:", status )
+ NSPLOG_STR( "TNSPActionSet::GetSessionModifiersL, Exit" )
+
+ return status;
+ }
+
+
+// ---------------------------------------------------------------------------
+// TNSPActionSet::GetSessionConnInfoL
+// ---------------------------------------------------------------------------
+//
+TNatReturnStatus TNSPActionSet::GetSessionConnInfoL( CSdpDocument& aDoc )
+ {
+ NSPLOG_STR( "TNSPActionSet::GetSessionConnInfoL, Entry" )
+
+ TNatReturnStatus status = iSession.Container().GetSessionConnInfoL( aDoc );
+
+ NSPLOG_INT( "TNSPActionSet::GetSessionConnInfoL, status:", status )
+ NSPLOG_STR( "TNSPActionSet::GetSessionConnInfoL, Exit" )
+
+ return status;
+ }
+
+
+// ---------------------------------------------------------------------------
+// TNSPActionSet::RestartWithoutIce
+// ---------------------------------------------------------------------------
+//
+void TNSPActionSet::RestartWithoutIce()
+ {
+ iSession.Container().ResetAndDestroyCandidates();
+ iSession.RemoveIce( iSession.Plugins() );
+ }
+
+
+// ---------------------------------------------------------------------------
+// TNSPActionSet::LoadPluginL
+// ---------------------------------------------------------------------------
+//
+void TNSPActionSet::LoadPluginL()
+ {
+ NSPLOG_STR( "TNSPActionSet::LoadPluginL, Entry" )
+
+ __ASSERT_ALWAYS( iSession.Plugins().MdcaCount(), User::Leave( KErrNotFound ) );
+
+ TInt pluginIndex = 0;
+ iSession.Container().LoadPluginL( iSession.Plugins(), pluginIndex );
+
+ NSPLOG8_STR2( "TNSPActionSet::LoadPluginL, loaded:", iSession.Plugins()[pluginIndex] )
+ NSPLOG_INT( "TNSPActionSet::LoadPluginL, useIce:", iSession.Data().UseIce() )
+ NSPLOG_INT( "TNSPActionSet::LoadPluginL, pluginIndex:", pluginIndex )
+
+ TBool isIce = iSession.IsIce( iSession.Plugins().MdcaPoint( pluginIndex ) );
+ User::LeaveIfError( iSession.Data().UseIce() == isIce ? KErrNone : KErrNotFound );
+
+ NSPLOG_STR( "TNSPActionSet::LoadPluginL, Exit" )
+ }
+
+
+// ---------------------------------------------------------------------------
+// TNSPActionSet::ActivateL
+// ---------------------------------------------------------------------------
+//
+void TNSPActionSet::ActivateL( CSdpDocument& aDoc )
+ {
+ if ( iSession.Data().UseIce() )
+ {
+ iSession.Container().ActivateL();
+ }
+ else
+ {
+ iSession.Container().ActivateL( aDoc );
+ }
+ }
+
+
+// ---------------------------------------------------------------------------
+// TNSPActionSet::DeActivateL
+// ---------------------------------------------------------------------------
+//
+void TNSPActionSet::DeActivateL()
+ {
+ iSession.Container().DeActivateL();
+ }
+
+
+// ---------------------------------------------------------------------------
+// TNSPActionSet::FetchL
+// ---------------------------------------------------------------------------
+//
+void TNSPActionSet::FetchL()
+ {
+ if ( iSession.Data().UseIce() )
+ {
+ iSession.Container().FetchCandidatesL();
+ }
+ else
+ {
+ iSession.Container().FetchCandidateL();
+ }
+ }
+
+
+// ---------------------------------------------------------------------------
+// TNSPActionSet::SetRoleL
+// ---------------------------------------------------------------------------
+//
+void TNSPActionSet::SetRoleL()
+ {
+ __ASSERT_ALWAYS( iSession.Data().UseIce(), User::Leave( KErrGeneral ) );
+ iSession.Container().SetRoleL( iSession.Data().Role() );
+ }
+
+
+// ---------------------------------------------------------------------------
+// TNSPActionSet::SetInboundCredentialsL
+// ---------------------------------------------------------------------------
+//
+void TNSPActionSet::SetInboundCredentialsL()
+ {
+ if ( iSession.Data().UseIce() )
+ {
+ iSession.Container().SetInboundCredentialsL();
+ }
+ }
+
+
+// ---------------------------------------------------------------------------
+// TNSPActionSet::SetOutboundCredentialsL
+// ---------------------------------------------------------------------------
+//
+void TNSPActionSet::SetOutboundCredentialsL()
+ {
+ if ( iSession.Data().UseIce() )
+ {
+ iSession.Container().SetOutboundCredentialsL();
+ }
+ }
+
+
+// ---------------------------------------------------------------------------
+// TNSPActionSet::ConnChecksL
+// ---------------------------------------------------------------------------
+//
+void TNSPActionSet::ConnChecksL()
+ {
+ __ASSERT_ALWAYS( iSession.Data().UseIce(), User::Leave( KErrGeneral ) );
+ iSession.Container().PerformCandidateChecksL( iSession.Data().RemoteCandidates() );
+ }
+
+
+// ---------------------------------------------------------------------------
+// TNSPActionSet::UpdateL
+// ---------------------------------------------------------------------------
+//
+void TNSPActionSet::UpdateL()
+ {
+ __ASSERT_ALWAYS( iSession.Data().UseIce(), User::Leave( KErrGeneral ) );
+ iSession.Container().UpdateL( iSession.Data().RemoteCandidates() );
+ }
+