linklayerprotocols/tundriver/te_tundriver/Dummy3rdPartyApp/src/Dummy3rdPartyApp.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Wed, 15 Sep 2010 00:18:51 +0300
branchRCL_3
changeset 63 425d8f4f7fa5
permissions -rw-r--r--
Revision: 201035 Kit: 201035

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