linklayerprotocols/tundriver/te_tundriver/Dummy3rdPartyApp/src/Dummy3rdPartyApp.cpp
branchRCL_3
changeset 63 425d8f4f7fa5
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/linklayerprotocols/tundriver/te_tundriver/Dummy3rdPartyApp/src/Dummy3rdPartyApp.cpp	Wed Sep 15 00:18:51 2010 +0300
@@ -0,0 +1,242 @@
+/*
+ ============================================================================
+ Name		 : Dummy3rdPartyApp.cpp
+ Author	     : Gurpreet Singh Nagi
+ Copyright   : Your copyright notice
+ Description : Exe source file
+ ============================================================================
+ */
+
+//  Include Files  
+
+#include "Dummy3rdPartyApp.h"
+#include <e32base.h>
+#include <e32std.h>
+#include <e32cons.h>			// Console
+
+//  Constants
+_LIT(KTextConsoleTitle, "Dummy3rdPartyApp");
+_LIT(KTextFailed, " failed, leave code = %d");
+_LIT(KTextPressAnyKey, " [press any key]\n");
+
+#define BUF_SIZE 2048
+//  Global Variables
+LOCAL_D CConsoleBase* console; // write all messages to this
+
+
+//  Local Functions
+void Dummy3rdPartyApp::InitConn()
+    {
+    if((iStatus = iVirtSocketServ.Connect()) == KErrNone )
+        console->Printf(_L("Opening Socket Server on Virtual Interface.\n"));
+
+    if((iStatus = iRealSocketServ.Connect()) == KErrNone )
+        console->Printf(_L("Opening Socket Server on Real Interface.\n"));
+    
+    if((iStatus = iHookSocketServ.Connect()) == KErrNone )
+            console->Printf(_L("Opening Socket Server for Hook.\n"));
+
+    if((iStatus = iVirtConnection.Open(iVirtSocketServ, KAfInet)) == KErrNone )
+        console->Printf(_L("\nOpening Virtual Connection."));
+
+    if((iStatus = iRealConnection.Open(iRealSocketServ, KAfInet)) == KErrNone )
+        console->Printf(_L("\nOpening Real Connection.\n"));
+    
+    iHookSocket.Open(iHookSocketServ,_L("tun"));
+    
+    }
+
+void Dummy3rdPartyApp::StartConn()
+    {
+    iVirtCommDbPref.SetIapId(14);             // Dummy Interface
+    iVirtCommDbPref.SetBearerSet(KCommDbBearerVirtual);
+    iVirtCommDbPref.SetDialogPreference(ECommDbDialogPrefDoNotPrompt);
+
+    TInt err = KErrNone;
+    iVirtConnection.Start(iVirtCommDbPref, iStatus);
+    User::WaitForRequest(iStatus);
+    err = iStatus.Int();
+    if(iStatus == KErrNone)
+        console->Printf(_L("Connection Started on Virtual Interface.\n"));
+    User::LeaveIfError(err);
+    err = KErrNone;
+    //open socket on Virtual interface.
+    iStatus = iVirtSocket.Open(iVirtSocketServ, KAfInet, KSockDatagram, KProtocolInetUdp, iVirtConnection);
+    //if((iStatus = iVirtSocket.Open(iVirtSocketServ, KAfInet, KSockDatagram, KProtocolInetUdp, iVirtConnection)) == KErrNone )
+    if(iStatus == KErrNone)
+        console->Printf(_L("Socket Opened on Virtual Interface.\n"));
+
+    iRealCommDbPref.SetIapId(9);            //Real Interface i.e. ethernet
+    iRealCommDbPref.SetBearerSet(KCommDbBearerLAN);
+    iRealCommDbPref.SetDialogPreference(ECommDbDialogPrefDoNotPrompt);
+
+    iRealConnection.Start(iRealCommDbPref, iStatus);
+    User::WaitForRequest(iStatus);
+    if(iStatus == KErrNone)
+        console->Printf(_L("Connection Started on Real Interface.\n"));
+    err = iStatus.Int();
+    //open socket on real interface
+    if((iStatus = iRealSocket.Open(iRealSocketServ, KAfInet, KSockDatagram, KProtocolInetUdp, iRealConnection)) == KErrNone )
+        console->Printf(_L("Socket Opened on Real Interface.\n"));
+    User::LeaveIfError(err);
+
+    //set destination port and IP ie. OpenVPN gateway address
+    iRealAddr.SetV4MappedAddress(INET_ADDR(10,225,171,71));        
+    iRealAddr.SetPort(1194);
+    err = KErrNone;
+    //bind local port to socket
+    // To Get any available port from the kernel
+    
+    TInetAddr inetAddrBind;
+    inetAddrBind.SetPort(KInetPortAny);
+    inetAddrBind.SetAddress(KInetAddrAny);
+    iVirtSocket.Bind(inetAddrBind);
+    TUint port1  = iVirtSocket.LocalPort();
+      
+    TPckgC <TUint> portPckg (port1);
+    iHookSocket.SetOpt(KSolInetIp,KSoTunnelPort,portPckg);
+
+    console->Printf(_L("Socket bound on Virtual Interface.\n"), err);
+
+    err = iRealSocket.SetLocalPort(1194); 
+    console->Printf(_L("Socket bound on Real Interface.\n"), err);
+     
+    }
+
+
+void Dummy3rdPartyApp::ProcessData()
+    {
+    //Receive data from client on virtual interface
+    iVirtSocket.RecvFrom(iSendBuf, iVirtAddr, NULL, iStatus);
+    User::WaitForRequest(iStatus);
+
+    if(iStatus == KErrNone)
+        {
+        console->Printf(_L("\nData Received from Virtual Interface:  "));
+        //copy received data to temp buffer and print it
+        //TBuf<BUF_SIZE> buf;
+        //buf.Copy(iSendBuf);
+        //console->Printf(buf);
+        }
+    else
+        console->Printf(_L("\nData receive failed on Virtual Interface."));     
+
+    //Send data on real interface to OpenVPN Gateway.
+    iRealSocket.SendTo(iSendBuf, iRealAddr, NULL, iStatus);
+    User::WaitForRequest(iStatus);  
+
+    if( iStatus == KErrNone)
+        {
+        console->Printf(_L("\nData Sent on Real interface : "));
+
+        //display sent data
+        //TBuf<BUF_SIZE> buf;
+        //buf.Copy(iSendBuf);
+        //console->Printf(buf);
+        }
+    else
+        console->Printf(_L("\nData send failed on Real Interface"));   
+
+    //Receive data from from real interface
+    iRealSocket.RecvFrom(iRecvBuf, iRealAddr, NULL, iStatus);
+    User::WaitForRequest(iStatus);
+
+    if(iStatus == KErrNone)
+        {
+        console->Printf(_L("\nData Received from Real Interface:  "));
+        //copy received data to temp buffer and print it
+        //TBuf<BUF_SIZE> buf;
+        //buf.Copy(iRecvBuf);
+        //console->Printf(buf);
+        }
+    else
+        console->Printf(_L("\nData receive failed on Real Interface"));     
+
+    //Send data to virtual interface.
+    iVirtSocket.SendTo(iRecvBuf, iVirtAddr, NULL, iStatus);
+    User::WaitForRequest(iStatus);  
+
+    if( iStatus == KErrNone)
+        {
+        console->Printf(_L("\nData Sent on Virtual interface : "));
+
+        //display sent data
+        //TBuf<BUF_SIZE> buf;
+        //buf.Copy(iRecvBuf);
+        //console->Printf(buf);
+        }
+    else
+        console->Printf(_L("\nData send failed on Virtual Interface"));   
+    }
+
+void Dummy3rdPartyApp::CloseConn()
+    {
+    //Close all handles.
+    iVirtSocket.Close();
+    iRealSocket.Close();
+    iHookSocket.Close();
+
+    iVirtConnection.Close();
+    iRealConnection.Close();
+    iVirtSocketServ.Close();
+    iRealSocketServ.Close();
+    iHookSocketServ.Close();
+    }
+
+LOCAL_C void MainL()
+    {
+    Dummy3rdPartyApp obj;
+
+    //intializing connection and socket
+    obj.InitConn();
+    //start the connection
+    obj.StartConn();
+
+    while(1)
+        {
+        obj.ProcessData();
+        }
+    //close connection, subconnection, socket
+    //TODO: how to explicitly close the loop? 
+    // One possible solution is running a timer.
+    obj.CloseConn();
+    }
+
+LOCAL_C void DoStartL()
+    {
+    // Create active scheduler (to run active objects)
+    CActiveScheduler* scheduler = new (ELeave) CActiveScheduler();
+    CleanupStack::PushL(scheduler);
+    CActiveScheduler::Install(scheduler);
+
+    MainL();
+    // Delete active scheduler
+    CleanupStack::PopAndDestroy(scheduler);
+    }
+
+//  Global Functions
+
+GLDEF_C TInt E32Main()
+    {
+    // Create cleanup stack
+    __UHEAP_MARK;
+    CTrapCleanup* cleanup = CTrapCleanup::New();
+
+    // Create output console
+    TRAPD(createError, console = Console::NewL(KTextConsoleTitle, TSize(
+            KConsFullScreen, KConsFullScreen)));
+    if (createError)
+        return createError;
+
+    // Run application code inside TRAP harness, wait keypress when terminated
+    TRAPD(mainError, DoStartL());
+    if (mainError)
+        console->Printf(KTextFailed, mainError);
+    console->Printf(KTextPressAnyKey);
+    console->Getch();
+
+    delete console;
+    delete cleanup;
+    __UHEAP_MARKEND;
+    return KErrNone;
+    }