natfw/tsrc/natfwtestconsoles/natfwtestconsole/src/stunudpmediatest.cpp
changeset 0 1bce908db942
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/natfw/tsrc/natfwtestconsoles/natfwtestconsole/src/stunudpmediatest.cpp	Tue Feb 02 01:04:58 2010 +0200
@@ -0,0 +1,462 @@
+/*
+* 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:    
+*
+*/
+
+
+
+
+// INCLUDES
+#include <e32debug.h>
+#include "natfwconnectivityapidefs.h"
+#include "natfwconnectivityapi.h"
+#include <mmccinterface.h>
+#include <mmcccodecinformation.h>
+#include "mnatfwsocketmediaconnwrapper.h"
+#include "natfwcandidate.h"
+#include "natfwcandidatepair.h"
+
+#include "mediateststubs.h"
+#include "stunudpmediatest.h"
+#include "testdefinitions.hrh"
+#include "natfwtestconsolelogs.h"
+#include <cnatfwsettingsapi.h>
+
+const TInt KAudioPrefVoipAudioUplink           = 0x05220001;
+const TInt KAudioPrefVoipAudioDownlink         = 0x05210001;
+const TInt KDefaultQos = 46;
+const TInt KRunningTime = 500000;
+
+// ======== MEMBER FUNCTIONS =================================================
+
+// ---------------------------------------------------------------------------
+// CStunUdpMediaTestInterface::CStunUdpMediaTestInterface
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// ---------------------------------------------------------------------------
+//
+CStunUdpMediaTest::CStunUdpMediaTest( CConsoleBase& aConsole,
+    CNATFWConnectivityApi& aNat, CMediaTestStubs& aIFStub, TUint aIapId,
+    TUint32 aDestAddr, TUint aDestPort ) :
+    iConsole( aConsole ), iNat( aNat ), iIfStub( aIFStub ), iIapId( aIapId ),
+    iDestAddr( aDestAddr ), iDestPort( aDestPort )
+    {
+    }
+    
+// ---------------------------------------------------------------------------
+// CStunUdpMediaTest::ConstructL
+// Symbian 2nd phase constructor can leave.
+// ---------------------------------------------------------------------------
+//
+void CStunUdpMediaTest::ConstructL( const TDesC8& aDomain )
+    {
+    iDomain = aDomain.AllocL();
+    RDebug::Print( _L("CStunUdpMediaTest::ConstructL IAP: %d"), iIapId );
+    }
+    
+// ---------------------------------------------------------------------------
+// CStunUdpMediaTest::NewL
+// Static constructor.
+// ---------------------------------------------------------------------------
+//   
+CStunUdpMediaTest* CStunUdpMediaTest::NewL( CConsoleBase& aConsole,
+    CNATFWConnectivityApi& aNat, CMediaTestStubs& aIFStub,
+    const TDesC8& aDomain, TUint aIapId, TUint32 aDestAddr, TUint aDestPort )
+    {
+    CStunUdpMediaTest* self 
+        = new ( ELeave ) CStunUdpMediaTest( aConsole, aNat, aIFStub, aIapId,
+            aDestAddr, aDestPort );
+
+    CleanupStack::PushL( self );
+    self->ConstructL( aDomain );
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// CStunUdpMediaTest::~CStunUdpMediaTest
+// Destructor.
+// ---------------------------------------------------------------------------
+//
+CStunUdpMediaTest::~CStunUdpMediaTest()
+    {
+    delete iMccInterface;
+    delete iDomain;
+    iNat.CloseStreamL( iSessionId, iStreamId );
+    iNat.CloseSessionL( iSessionId );
+    }
+
+
+// ---------------------------------------------------------------------------
+// CStunUdpMediaTest::PrintLocalAddressL
+// ---------------------------------------------------------------------------
+//
+void CStunUdpMediaTest::PrintLocalAddressL()
+    {
+    RDebug::Print( _L( "CStunUdpMediaTest::PrintLocalAddressL" ) );
+    
+    iConsole.Printf( _L( "Local address resolving started...\n" ) );
+    
+    TInt pluginId;
+    
+    CNATFWNatSettingsApi* settings = CNATFWNatSettingsApi::NewLC( iDomain->Des() );
+    
+    iSessionId = iNat.CreateSessionL( iIapId, iDomain->Des() );
+    iIfStub.StartActiveSchedulerL();
+    
+    // Load plug in
+    iNat.LoadPluginL( iSessionId, settings->AvailableNatProtocols(), pluginId);
+    iIfStub.StartActiveSchedulerL( 20000 );
+    CleanupStack::PopAndDestroy( settings );
+    
+    // STREAM
+    iStreamId = iNat.CreateStreamL( iSessionId, KProtocolInetUdp, KDefaultQos );
+    
+    // Get local IP
+    iNat.FetchCandidateL( iSessionId, iStreamId, KAfInet );
+    iIfStub.StartActiveSchedulerL();
+
+    TInetAddr localAddr;
+    TRAPD( err, localAddr = iIfStub.LocalCandidateL().TransportAddr() );
+    if ( KErrNone != err )
+        {
+        iNat.CloseStreamL( iSessionId, iStreamId );
+        iNat.CloseSessionL( iSessionId );
+        User::Leave( err );
+        }
+    
+    TBuf<40> buffer;
+    localAddr.Output( buffer );
+    _LIT( KPrintLocalAddFormat, "\nLOCAL ADDRESS: %S PORT: %d\n");
+    
+    RDebug::Print( KPrintLocalAddFormat, &buffer, localAddr.Port() );
+    iConsole.Printf( KPrintLocalAddFormat, &buffer, localAddr.Port() );
+    }
+
+
+// ---------------------------------------------------------------------------
+// CStunUdpMediaTest::GetLocalAddressL
+// ---------------------------------------------------------------------------
+//    
+TInt CStunUdpMediaTest::GetLocalAddress( TInetAddr& localAddr )
+    {
+    RDebug::Print( _L( "CStunUdpMediaTest::GetLocalAddress" ) );
+    
+    CNATFWCandidate* localCandidate = NULL;
+    
+    TRAPD( err, localCandidate = &iIfStub.LocalCandidateL() )
+    if ( KErrNone == err )
+        {
+        localAddr.SetAddress( localCandidate->TransportAddr().Address() );
+        localAddr.SetPort( localCandidate->TransportAddr().Port() );
+        return KErrNone;        
+        }
+    return err;
+    }
+    
+    
+// ---------------------------------------------------------------------------
+// CStunUdpMediaTest::TestUdpAudioL
+// ---------------------------------------------------------------------------
+//
+void CStunUdpMediaTest::TestUdpAudioStreamingL()
+    {
+    TUint sessionId( 0 );
+    TUint streamId( 0 );
+    TInt pluginId;
+    
+    // UDP SESSIO
+    RDebug::Print( _L("CStunUdpMediaTest::TestUdpAudioL - start") );
+     
+    iSessionId = iNat.CreateSessionL( iIapId, iDomain->Des() );
+    sessionId = iSessionId;
+    iIfStub.StartActiveSchedulerL();
+    
+    // load plug-in
+    CNATFWNatSettingsApi* settings = CNATFWNatSettingsApi::NewLC( iDomain->Des() );
+    iNat.LoadPluginL( iSessionId, settings->AvailableNatProtocols(), pluginId );
+    iIfStub.StartActiveSchedulerL( 20000 );
+    CleanupStack::PopAndDestroy( settings );    
+    
+    // STREAM
+    streamId = iNat.CreateStreamL( sessionId, KProtocolInetUdp, KDefaultQos );
+    iStreamId = streamId;
+    // Get local IP that receives media
+    iNat.FetchCandidateL( sessionId, streamId, KAfInet );
+    iIfStub.StartActiveSchedulerL();
+    
+    __NATFWTESTCONSOLE_ADDRLOG( "CStunUdpMediaTest::TestUdpAudioL- LOCAL ADDRESS: ", iReceiveMediaAddress )
+
+    // WRAPPER
+    MNATFWSocketMediaConnWrapper& mediaWrapper =
+        iNat.CreateWrapperL( sessionId, streamId );
+
+    TInetAddr destinationAddress;
+    mediaWrapper.OutgoingAddr( destinationAddress );
+
+    __NATFWTESTCONSOLE_ADDRLOG( "CStunUdpMediaTest::TestUdpAudioL- Wrapper LOCAL ADDRESS: ", destinationAddress )
+
+    // NET settings value
+    iNetsettings.iRemoteAddress.SetAddress( destinationAddress.Address() );
+    iNetsettings.iRemoteAddress.SetPort( destinationAddress.Port() );
+    iNetsettings.iRemoteRtcpPort = KDefaultRtcpPort;
+
+    iNetsettings.iLocalAddress.SetAddress( KInetAddrAny );
+    iNetsettings.iLocalAddress.SetPort( KDefaultRtpPort );
+
+    iNetsettings.iLocalPublicAddress.SetAddress( KInetAddrAny );
+    iNetsettings.iLocalRtcpPort = KDefaultRtcpPort;
+    iNetsettings.iLocalPublicRtcpPort = KDefaultRtcpPort;
+    iNetsettings.iMediaQosValue = KDefaultMediaQos;
+    iNetsettings.iIapId = iIapId;
+
+    TUint32 sessionId1;
+    iMccInterface = CMccInterface::NewL( iIfStub );     
+    User::LeaveIfError( iMccInterface->CreateSession( sessionId1 ) );
+
+    // Create MCC LINK
+    TUint32 linkId;
+    User::LeaveIfError( iMccInterface->CreateLink( sessionId1, KMccLinkGeneral, linkId, iNetsettings ) ); 
+
+    CActiveScheduler::Start();
+
+    iNetsettings.iRemoteAddress.SetAddress( destinationAddress.Address() );
+    iNetsettings.iRemoteAddress.SetPort( destinationAddress.Port() );
+ 
+    __NATFWTESTCONSOLE_ADDRLOG( "CStunUdpMediaTest::TestUdpAudioL- iNetsettings.iRemoteAddress: ", iIfStub.NetSettings().iRemoteAddress )
+    __NATFWTESTCONSOLE_ADDRLOG( "CStunUdpMediaTest::TestUdpAudioL- iNetsettings.iLocalAddress: ", iIfStub.NetSettings().iLocalAddress )
+
+    User::LeaveIfError( iMccInterface->SetRemoteAddress( sessionId1, linkId, iNetsettings.iRemoteAddress ) );
+    __NATFWTESTCONSOLE_ADDRLOG( "CStunUdpMediaTest::TestUdpAudioL- iNetsettings.iLocalAddress: ", iIfStub.NetSettings().iLocalAddress)
+
+
+    RPointerArray<CMccCodecInformation> codecArray;
+    CleanupResetAndDestroy< RPointerArray<CMccCodecInformation> >::PushL( codecArray );
+    User::LeaveIfError( iMccInterface->GetCapabilities( codecArray ) );
+
+    
+    // Create upstream
+    TUint32 upStream;
+    TUint32 dataSinkId1;
+    TUint32 dataSourceId1;
+    User::LeaveIfError( iMccInterface->AddDataSink( KMccRtpSinkUid, KNullDesC8, dataSinkId1 ) );
+    User::LeaveIfError( iMccInterface->AddDataSource( KUidMmfAudioInput, KNullDesC8, dataSourceId1 ) );
+    codecArray[0]->SetPriorityPreference( KAudioPrefVoipAudioUplink );
+    User::LeaveIfError( iMccInterface->CreateStream( sessionId1, linkId, upStream, 
+        KMccAudioUplinkStream, *codecArray[0] ) );
+    
+    
+    // Create downstream
+    TUint32 downStream;
+    TUint32 dataSinkId2;
+    TUint32 dataSourceId2;
+    User::LeaveIfError( iMccInterface->AddDataSink( KUidMmfAudioOutput, KNullDesC8, dataSinkId2 ) );
+    User::LeaveIfError( iMccInterface->AddDataSource( KMccRtpSourceUid, KNullDesC8, dataSourceId2 ) );
+    codecArray[0]->SetPriorityPreference( KAudioPrefVoipAudioDownlink );
+    User::LeaveIfError( iMccInterface->CreateStream( sessionId1, linkId, downStream,
+        KMccAudioDownlinkStream, *codecArray[0] ) );
+    
+    // Set destination address to wrapper
+    __NATFWTESTCONSOLE_ADDRLOG( "CStunUdpMediaTest::TestUdpAudioL- iNetsettings.iLocalAddress: ",
+        iIfStub.NetSettings().iLocalAddress )
+    mediaWrapper.SetIncomingAddrL( iIfStub.NetSettings().iLocalAddress);
+
+    mediaWrapper.SetReceivingStateL( EStreamingStateActive );
+    mediaWrapper.SetSendingStateL( EStreamingStateActive );  
+    
+    TInetAddr destAddr;
+    if( iDestAddr == 0 )
+        {
+        destAddr.SetAddress( destinationAddress.Address() );
+        destAddr.SetPort( 5000 );
+        }
+    else
+        {
+        destAddr.SetAddress( iDestAddr );
+        destAddr.SetPort( iDestPort );
+        }
+    
+    //iNat.SetReceivingStateL( iSessionId, KMediaConnection, EStreamingStateActive );
+    //iNat.SetSendingStateL( iSessionId, KMediaConnection, destAddr, EStreamingStateActive );
+
+    
+     // Prepare and start up and downstream  
+    User::LeaveIfError( iMccInterface->PrepareStream( sessionId1, linkId, downStream ) );
+    CActiveScheduler::Start();
+    CActiveScheduler::Start();
+    
+    User::LeaveIfError( iMccInterface->PrepareStream( sessionId1, linkId, upStream ) );
+    CActiveScheduler::Start();
+    CActiveScheduler::Start();   
+    
+    iNat.SetReceivingStateL( iIfStub.LocalCandidateL(), EStreamingStateActive );
+    iIfStub.StartActiveSchedulerL( KRunningTime );
+    
+    iNat.SetSendingStateL( iIfStub.LocalCandidateL(),
+        EStreamingStateActive, destAddr );
+    iIfStub.StartActiveSchedulerL( KRunningTime );
+    
+    User::LeaveIfError( iMccInterface->StartStream( sessionId1, linkId, downStream ) );
+    CActiveScheduler::Start();
+    CActiveScheduler::Start();
+    
+    User::LeaveIfError( iMccInterface->StartStream( sessionId1, linkId, upStream ) );
+    CActiveScheduler::Start();
+    CActiveScheduler::Start();
+     
+    CleanupStack::PopAndDestroy( &codecArray );
+    }
+
+
+// ---------------------------------------------------------------------------
+// CStunUdpMediaTest::PrepareAudioStreamingL
+// ---------------------------------------------------------------------------
+//
+void CStunUdpMediaTest::PrepareAudioStreamingL()
+    {
+    TUint sessionId( 0 );
+    TUint streamId( 0 );
+    
+    // UDP SESSIO
+    RDebug::Print( _L("CStunUdpMediaTest::PrepareAudioStreamingL - start") );
+    
+    //iSessionId = 
+    iNat.CreateSessionL( 6, iDomain->Des() );
+    //sessionId = iSessionId;
+    CActiveScheduler::Start();
+    
+    iSessionId = iNat.CreateSessionL( iIapId, iDomain->Des() );
+    sessionId = iSessionId;
+    iIfStub.StartActiveSchedulerL();
+       
+    // STREAM
+    streamId = iNat.CreateStreamL( sessionId, KProtocolInetUdp, KDefaultQos );
+    iStreamId = streamId;
+    // Get local IP that receives media
+    iNat.FetchCandidateL( sessionId, streamId, KAfInet );
+    iIfStub.StartActiveSchedulerL();
+    
+    __NATFWTESTCONSOLE_ADDRLOG( "CStunUdpMediaTest::TestUdpAudioL- LOCAL ADDRESS: ", iReceiveMediaAddress )
+
+    // WRAPPER
+    MNATFWSocketMediaConnWrapper& mediaWrapper =
+        iNat.CreateWrapperL( sessionId, streamId );
+
+    TInetAddr destinationAddress;
+    mediaWrapper.OutgoingAddr( destinationAddress );
+
+    __NATFWTESTCONSOLE_ADDRLOG( "CStunUdpMediaTest::TestUdpAudioL- Wrapper LOCAL ADDRESS: ", destinationAddress )
+
+    // NET settings value
+    iNetsettings.iRemoteAddress.SetAddress( destinationAddress.Address() );
+    iNetsettings.iRemoteAddress.SetPort( destinationAddress.Port() );
+    iNetsettings.iRemoteRtcpPort = KDefaultRtcpPort;
+
+    iNetsettings.iLocalAddress.SetAddress( KInetAddrAny );
+    iNetsettings.iLocalAddress.SetPort( KDefaultRtpPort );
+
+    iNetsettings.iLocalPublicAddress.SetAddress( KInetAddrAny );
+    iNetsettings.iLocalRtcpPort = KDefaultRtcpPort;
+    iNetsettings.iLocalPublicRtcpPort = KDefaultRtcpPort;
+    iNetsettings.iMediaQosValue = KDefaultMediaQos;
+    iNetsettings.iIapId = iIapId;
+
+    TUint32 sessionId1;
+    iMccInterface = CMccInterface::NewL( iIfStub );     
+    User::LeaveIfError( iMccInterface->CreateSession( sessionId1 ) );
+
+    // Create MCC LINK
+    TUint32 linkId;
+    User::LeaveIfError( iMccInterface->CreateLink( sessionId1, KMccLinkGeneral, linkId, iNetsettings ) ); 
+
+    CActiveScheduler::Start();
+
+    iNetsettings.iRemoteAddress.SetAddress( destinationAddress.Address() );
+    iNetsettings.iRemoteAddress.SetPort( destinationAddress.Port() );
+ 
+    __NATFWTESTCONSOLE_ADDRLOG( "CStunUdpMediaTest::TestUdpAudioL- iNetsettings.iRemoteAddress: ", iIfStub.NetSettings().iRemoteAddress )
+    __NATFWTESTCONSOLE_ADDRLOG( "CStunUdpMediaTest::TestUdpAudioL- iNetsettings.iLocalAddress: ", iIfStub.NetSettings().iLocalAddress )
+
+    User::LeaveIfError( iMccInterface->SetRemoteAddress( sessionId1, linkId, iNetsettings.iRemoteAddress ) );
+    __NATFWTESTCONSOLE_ADDRLOG( "CStunUdpMediaTest::TestUdpAudioL- iNetsettings.iLocalAddress: ", iIfStub.NetSettings().iLocalAddress)
+
+
+    RPointerArray<CMccCodecInformation> codecArray;
+    CleanupResetAndDestroy< RPointerArray<CMccCodecInformation> >::PushL( codecArray );
+    User::LeaveIfError( iMccInterface->GetCapabilities( codecArray ) );
+
+    
+    // Create upstream
+    TUint32 upStream;
+    TUint32 dataSinkId1;
+    TUint32 dataSourceId1;
+    User::LeaveIfError( iMccInterface->AddDataSink( KMccRtpSinkUid, KNullDesC8, dataSinkId1 ) );
+    User::LeaveIfError( iMccInterface->AddDataSource( KUidMmfAudioInput, KNullDesC8, dataSourceId1 ) );
+    codecArray[0]->SetPriorityPreference( KAudioPrefVoipAudioUplink );
+    User::LeaveIfError( iMccInterface->CreateStream( sessionId1, linkId, upStream, 
+        KMccAudioUplinkStream, *codecArray[0] ) );
+    
+    
+    // Create downstream
+    TUint32 downStream;
+    TUint32 dataSinkId2;
+    TUint32 dataSourceId2;
+    User::LeaveIfError( iMccInterface->AddDataSink( KUidMmfAudioOutput, KNullDesC8, dataSinkId2 ) );
+    User::LeaveIfError( iMccInterface->AddDataSource( KMccRtpSourceUid, KNullDesC8, dataSourceId2 ) );
+    codecArray[0]->SetPriorityPreference( KAudioPrefVoipAudioDownlink );
+    User::LeaveIfError( iMccInterface->CreateStream( sessionId1, linkId, downStream,
+        KMccAudioDownlinkStream, *codecArray[0] ) );
+    
+    // Set destination address to wrapper
+     __NATFWTESTCONSOLE_ADDRLOG( "CStunUdpMediaTest::TestUdpAudioL- iNetsettings.iLocalAddress: ", iIfStub.NetSettings().iLocalAddress )
+    mediaWrapper.SetIncomingAddrL( iIfStub.NetSettings().iLocalAddress);
+
+    TInetAddr destAddr;
+    if( iDestAddr == 0 )
+        {
+        destAddr.SetAddress( destinationAddress.Address() );
+        destAddr.SetPort( 5000 );
+        }
+    else
+        {
+        destAddr.SetAddress( iDestAddr );
+        destAddr.SetPort( iDestPort );
+        }
+    
+     // Prepare and start up and downstream  
+    User::LeaveIfError( iMccInterface->PrepareStream( sessionId1, linkId, downStream ) );
+    CActiveScheduler::Start();
+    CActiveScheduler::Start();
+    
+    User::LeaveIfError( iMccInterface->PrepareStream( sessionId1, linkId, upStream ) );
+    CActiveScheduler::Start();
+    CActiveScheduler::Start();   
+
+    User::LeaveIfError( iMccInterface->StartStream( sessionId1, linkId, downStream ) );
+    CActiveScheduler::Start();
+    CActiveScheduler::Start();
+    
+    User::LeaveIfError( iMccInterface->StartStream( sessionId1, linkId, upStream ) );
+    CActiveScheduler::Start();
+    CActiveScheduler::Start();
+    /*
+    iNat.SetReceivingStateL( iSessionId, streamId, EStreamingStateActive );
+    iNat.SetSendingStateL( iSessionId, streamId, destAddr, EStreamingStateActive );
+    */
+    CleanupStack::PopAndDestroy( &codecArray );
+    
+    RDebug::Print( _L("CStunUdpMediaTest::PrepareAudioStreamingL - stop") );
+    }
+