natplugins/natpnatfwsdpprovider/src/nspactionset.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 31 Aug 2010 15:35:13 +0300
branchRCL_3
changeset 45 3f7c7e6eea8a
parent 0 1bce908db942
permissions -rw-r--r--
Revision: 201032 Kit: 201035

/*
* 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() );
    }