natplugins/natpnatfwsdpprovider/src/nspactionset.cpp
changeset 0 1bce908db942
--- /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() );
+    }
+