natfw/natfwsocketmediaconnwrapper/src/natfwsockethandler.cpp
changeset 0 1bce908db942
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/natfw/natfwsocketmediaconnwrapper/src/natfwsockethandler.cpp	Tue Feb 02 01:04:58 2010 +0200
@@ -0,0 +1,413 @@
+/*
+* Copyright (c) 2007-2008 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:    Handles socket connecting
+*
+*/
+
+
+
+
+#include "natfwconnectivityapidefs.h"
+
+#include "natfwsockethandler.h"
+#include "natfwsocketsender.h"
+#include "natfwsocketmediaconnwrapperlogs.h"
+
+
+// ======== MEMBER FUNCTIONS ========
+
+
+// ---------------------------------------------------------------------------
+// CNATFWSocketHandler::CNATFWSocketHandler
+// ---------------------------------------------------------------------------
+//
+CNATFWSocketHandler::CNATFWSocketHandler( TUint aPort ) : 
+    CActive(EPriorityStandard), iPort( aPort ), iSendState ( EUnitialized ),
+    iReceiveState( ENotReceiving )
+    {   
+    CActiveScheduler::Add(this);
+    }
+
+
+// ---------------------------------------------------------------------------
+// CNATFWSocketHandler::ConstructL
+// ---------------------------------------------------------------------------
+//
+void CNATFWSocketHandler::ConstructL(
+    MNATFWSocketReceiverObserver& aRecObs,
+    MNATFWSocketSenderObserver& aSendObs, TUint aProtocol )
+    {
+    __SOCKETMEDIACONNWRAPPER( "CNATFWSocketHandler::ConstructL" )
+
+    __ASSERT_ALWAYS( KProtocolInetTcp == aProtocol || 
+        KProtocolInetUdp == aProtocol, User::Leave( KErrArgument ) );
+    
+    iProtocol = aProtocol;
+    iSender = CNATFWSocketSender::NewL( aSendObs, iProtocol );
+    iReceiver = CNATFWSocketReceiver::NewL( aRecObs, iProtocol );
+    }
+
+
+// ---------------------------------------------------------------------------
+// CNATFWSocketHandler* CNATFWSocketHandler::NewL
+// ---------------------------------------------------------------------------
+//
+CNATFWSocketHandler* CNATFWSocketHandler::NewL( 
+    MNATFWSocketReceiverObserver& aRecObs,
+    MNATFWSocketSenderObserver& aSendObs, TUint aProtocol, TUint aPort )
+    {
+    CNATFWSocketHandler* self = CNATFWSocketHandler::NewLC( aRecObs, aSendObs,
+        aProtocol, aPort );
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CNATFWSocketHandler* CNATFWSocketHandler::NewLC
+// ---------------------------------------------------------------------------
+//
+CNATFWSocketHandler* CNATFWSocketHandler::NewLC( 
+    MNATFWSocketReceiverObserver& aRecObs, 
+    MNATFWSocketSenderObserver& aSendObs, TUint aProtocol, TUint aPort )
+    {
+    CNATFWSocketHandler* self 
+            = new( ELeave ) CNATFWSocketHandler( aPort );
+    CleanupStack::PushL( self );
+    self->ConstructL( aRecObs, aSendObs, aProtocol );
+    return self;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CNATFWSocketHandler::~CNATFWSocketHandler()
+// ---------------------------------------------------------------------------
+//
+CNATFWSocketHandler::~CNATFWSocketHandler()
+    {
+    __SOCKETMEDIACONNWRAPPER( "CNATFWSocketHandler::~CNATFWSocketHandler" )   
+    
+    iMediaObserver = NULL;
+    iTcpConnectionObserver = NULL;
+    Cancel();    
+    delete iSender;
+    delete iReceiver;
+    iSocket.Close();
+    iListeningSocket.Close();
+    }
+
+
+// ---------------------------------------------------------------------------
+// CNATFWSocketHandler::RunL( )
+// ---------------------------------------------------------------------------
+//
+void CNATFWSocketHandler::RunL( )
+    {
+    __SOCKETMEDIACONNWRAPPER_INT1( 
+        "CNATFWSocketHandler::RunL iStatus:", iStatus.Int() ) 
+     
+    if ( KErrNone == iStatus.Int() )
+        {
+        iSendState = EConnected;        
+        }
+    else
+        {
+        iSendState = EUnitialized;
+        }
+    iTcpConnectionObserver->ConnectingCompleted( iStatus.Int() );
+    }
+    
+    
+// ---------------------------------------------------------------------------
+// CNATFWSocketHandler::DoCancel( )
+// ---------------------------------------------------------------------------
+//
+void CNATFWSocketHandler::DoCancel( )
+    {
+    __SOCKETMEDIACONNWRAPPER( "CNATFWSocketHandler::DoCancel" )
+
+    iSocket.CancelAll();
+    if ( ETcpSetupPassive == iTcpConnectionType )
+        {
+        iListeningSocket.CancelAll();
+        }
+    }
+
+
+// ---------------------------------------------------------------------------
+// CNATFWSocketHandler::LocalAddress( )
+// ---------------------------------------------------------------------------
+//
+void CNATFWSocketHandler::LocalAddress( TSockAddr& aSocketToSendForPeer )
+    {
+    __SOCKETMEDIACONNWRAPPER_ADDRLOG(
+    "CNATFWSocketHandler::LocalAddress - Local IP Address: ", iLocalAddress )
+    
+    aSocketToSendForPeer = iLocalAddress;
+    }
+
+// ---------------------------------------------------------------------------
+// CNATFWSocketHandler::GetRemoteAddress( )
+// ---------------------------------------------------------------------------
+//
+void CNATFWSocketHandler::GetRemoteAddress( TSockAddr& aRemoteAddress )
+    {
+    __SOCKETMEDIACONNWRAPPER_ADDRLOG(
+    "CNATFWSocketHandler::GetRemoteAddress - Remote IP Address: ", iRemoteAddress )
+    
+    aRemoteAddress = iRemoteAddress;
+    }
+    
+// ---------------------------------------------------------------------------
+// CNATFWSocketHandler::SetAddrL( )
+// ---------------------------------------------------------------------------
+//
+void CNATFWSocketHandler::SetAddrL( const TSockAddr& aSocketToSendForPeer )
+    {
+    __SOCKETMEDIACONNWRAPPER( "CNATFWSocketHandler::SetAddrL" )
+    
+    __ASSERT_ALWAYS( EUnitialized == iSendState, User::Leave( KErrArgument ) );
+    
+    if ( KAfInet6 == aSocketToSendForPeer.Family() )
+        {
+        iRemoteAddress.SetAddress( KInet6AddrLoop );
+        }
+    else
+        {
+        iRemoteAddress.SetAddress( INET_ADDR( 127, 0, 0, 1 ) );
+        }
+    
+    iRemoteAddress.SetPort( aSocketToSendForPeer.Port() );
+    
+    TBool requiredPortOpen( EFalse );
+    TInt error( KErrNone );
+    
+    if ( KProtocolInetTcp == iProtocol )
+        {
+        User::LeaveIfError( iSocket.Open( iSocketServer,
+        KAfInet, KSockStream, KProtocolInetTcp ));
+        }
+    else if ( KProtocolInetUdp == iProtocol )
+        {
+        User::LeaveIfError( iSocket.Open( iSocketServer,
+        KAfInet, KSockDatagram, KProtocolInetUdp ));
+        }
+    else
+        {
+        // Nothing to do here
+        }
+
+    while ( !requiredPortOpen )
+        {
+        if ( KProtocolInetUdp == iProtocol )
+            {
+            error = iSocket.SetLocalPort( iLocalAddress.Port() );
+            }
+        if ( KProtocolInetTcp == iProtocol )
+            {
+            error = iSocket.Bind( iLocalAddress );
+            }
+
+        if ( KErrNone != error )
+            {
+            TUint port( 0 );
+            iMediaObserver->GetNewFreePort( port );
+            iLocalAddress.SetPort( port );
+            }
+        else
+            {
+            requiredPortOpen = ETrue; 
+            }
+        }
+        
+    if ( KProtocolInetUdp == iProtocol )
+        {
+        iSendState = EConnected;
+        }
+    __SOCKETMEDIACONNWRAPPER_ADDRLOG( "Remote IP Address: ", iRemoteAddress )
+    __SOCKETMEDIACONNWRAPPER_ADDRLOG( "Local IP Address: ", iLocalAddress )
+    }
+
+
+// ---------------------------------------------------------------------------
+// CNATFWSocketHandler::SetReceivingStateL( )
+// ---------------------------------------------------------------------------
+//
+void CNATFWSocketHandler::SetReceivingStateL( )
+    {
+    __SOCKETMEDIACONNWRAPPER( "CNATFWSocketHandler::SetReceivingStateL" )
+    
+    __ASSERT_ALWAYS( EConnected == iSendState || ESending == iSendState,
+        User::Leave( KErrArgument ) );
+    __ASSERT_ALWAYS( iReceiveState == ENotReceiving,
+        User::Leave( KErrInUse ) );    
+    
+    if ( ETcpSetupPassive == iTcpConnectionType )
+        {
+        iReceiver->StartListening( iListeningSocket );
+        }
+    else
+        {
+        iReceiver->StartListening( iSocket );
+        }
+        
+    iReceiveState = EReceiving;         
+    }     
+    
+     
+// ---------------------------------------------------------------------------
+// CNATFWSocketHandler::SetSendingStateL( )
+// ---------------------------------------------------------------------------
+//
+void CNATFWSocketHandler::SetSendingStateL( )
+    {
+    __SOCKETMEDIACONNWRAPPER( "CNATFWSocketHandler::SetSendingStateL" )
+    
+    __ASSERT_ALWAYS( EConnected == iSendState, User::Leave( KErrNotReady ) );
+
+    if ( ETcpSetupPassive == iTcpConnectionType )
+        {
+        iSender->SetRemoteAddress( iRemoteAddress, iListeningSocket );
+        }
+    else
+        {
+        iSender->SetRemoteAddress( iRemoteAddress, iSocket );
+        } 
+        
+    iSendState = ESending;
+    }  
+
+
+// ---------------------------------------------------------------------------
+// CNATFWSocketHandler::SetReceivingStateForMuxWrapper( )
+// ---------------------------------------------------------------------------
+//
+void CNATFWSocketHandler::SetReceivingStateForMuxWrapper(
+    TNATFWStreamingState aState )
+    {
+    __SOCKETMEDIACONNWRAPPER(
+        "CNATFWSocketHandler::SetReceivingStateForMuxWrapper" )
+
+    iReceiver->SetReceivingStateForMuxWrapper( aState );
+    }    
+
+
+// ---------------------------------------------------------------------------
+// CNATFWSocketHandler::SendL( )
+// ---------------------------------------------------------------------------
+//
+void CNATFWSocketHandler::SendL( const TDesC8& aStreamPortion )
+    {
+    __SOCKETMEDIACONNWRAPPER( "CNATFWSocketHandler::SendL" )
+    
+    __ASSERT_ALWAYS( ESending == iSendState, User::Leave( KErrNotReady ) );
+        
+    iSender->SendL( aStreamPortion );
+    } 
+
+
+// ---------------------------------------------------------------------------
+// CNATFWSocketHandler::SetLocalAddress( )
+// ---------------------------------------------------------------------------
+//    
+void CNATFWSocketHandler::SetLocalAddress( 
+    const RSocketServ& aSocketServer, const TSockAddr& /*aLocalAddress*/ )
+    {
+    iSocketServer = aSocketServer;  
+    
+    iLocalAddress.SetAddress( INET_ADDR( 127, 0, 0, 1 ) );
+    iLocalAddress.SetPort( iPort );
+    }
+
+// ---------------------------------------------------------------------------
+// CNATFWSocketHandler::SetMediaObserverL( )
+// ---------------------------------------------------------------------------
+//    
+void CNATFWSocketHandler::SetMediaObserverL( 
+    MNATFWMediaWrapperObserver* aMediaObserver )
+    {
+    __ASSERT_ALWAYS( aMediaObserver, User::Leave( KErrNotReady ) );
+    
+    iMediaObserver = aMediaObserver;
+    }
+    
+// ---------------------------------------------------------------------------
+// CNATFWSocketHandler::DeactivateSending(  )
+// ---------------------------------------------------------------------------
+//
+void CNATFWSocketHandler::DeactivateSending(  )
+    {
+    __SOCKETMEDIACONNWRAPPER( "CNATFWSocketHandler::DeactivateSending" )
+    
+    iSender->Cancel();
+    iSendState = EConnected;
+    }
+    
+    
+// ---------------------------------------------------------------------------
+// CNATFWSocketHandler::DeactivateReceiving(  )
+// ---------------------------------------------------------------------------
+//
+void CNATFWSocketHandler::DeactivateReceiving(  )
+    {
+    __SOCKETMEDIACONNWRAPPER( "CNATFWSocketHandler::DeactivateReceiving" )
+    
+    iReceiver->Cancel();
+    iReceiveState = ENotReceiving;
+    }
+    
+    
+// ---------------------------------------------------------------------------
+// CNATFWSocketHandler::OpenTcpConnectionL()
+// ---------------------------------------------------------------------------
+//
+void CNATFWSocketHandler::OpenTcpConnectionL(
+    TNATFWTcpConnectionSetup aSetup, MNsmcwTcpConnectionObserver& aObserver )
+    {
+    __SOCKETMEDIACONNWRAPPER( "CNATFWSocketHandler::OpenTcpConnectionL" )
+    
+    __ASSERT_ALWAYS( EUnitialized == iSendState, User::Leave( KErrInUse ) );
+    
+    iTcpConnectionType = aSetup;
+    iTcpConnectionObserver = &aObserver;
+    
+    if ( ETcpSetupActive == iTcpConnectionType )  
+        {
+        iSocket.Connect( iRemoteAddress, iStatus );
+        }
+    if ( ETcpSetupPassive == iTcpConnectionType ) 
+        {        
+        User::LeaveIfError( iSocket.Listen( 1 ) );
+        User::LeaveIfError( iListeningSocket.Open( iSocketServer ) );
+        iSocket.Accept( iListeningSocket, iStatus );
+        }
+    iSendState = EGettingConnection;
+    SetActive();  
+    }
+
+
+// ---------------------------------------------------------------------------
+// CNATFWSocketHandler::CloseTcpConnection()
+// ---------------------------------------------------------------------------
+//
+void CNATFWSocketHandler::CloseTcpConnection()
+    {
+    __SOCKETMEDIACONNWRAPPER(
+        "CNATFWSocketHandler::CloseTcpConnection" )
+
+    Cancel();
+    iSendState = EUnitialized;
+    iTcpConnectionObserver->ConnectingCompleted( KErrCancel );
+    }
+