obex/obexprotocol/obex/test/tobex/TOBEXCON.CPP
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 02 Feb 2010 01:11:40 +0200
changeset 0 d0791faffa3f
permissions -rw-r--r--
Revision: 201003 Kit: 201005

// Copyright (c) 1997-2009 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:
//

#include <es_sock.h>
#include <ir_sock.h>
#include <bautils.h>
#include <usbman.h>
#include <d32usbc.h>
#include <e32keys.h>
#include "TOBEXCON.H"
#include "clienthandler.h"
#include "serverhandlerbase.h"
#include "serverhandler.h"
#include "serverhandlerfile.h"
#include "btextnotifiers.h"

#ifdef EMPTY_HEADERS_TEST
#include "emptyheaderstest.h"
#endif //EMPTY_HEADERS_TEST

#define EPOCIDENT _L8("EPOC32 ER5")


CActiveConsole::CActiveConsole(CConsoleBase* aConsole) 
    : CActive(EPriorityNormal),
      iConsole(aConsole),
      iTestMode(E_Inactive),
      iDiscoverySlots(KObexIrdaDefaultDiscoverySlotsToUse),
      iDiscoveryAttempts(KObexIrdaDefaultDiscoveryAttempts),
      iRecvMTU(KObexPacketDefaultSize),
      iTransmitMTU(KObexPacketDefaultSize)
    {
#ifdef EMPTY_HEADERS_TEST
	iDisplayHeaders = ETrue;
#endif //EMPTY_HEADERS_TEST    
    }

CActiveConsole* CActiveConsole::NewLC(CConsoleBase* aConsole)
    {
    CActiveConsole* self = new (ELeave) CActiveConsole(aConsole);
	CleanupStack::PushL(self);
	self->ConstructL();
    return self;
    }

void CActiveConsole::ConstructL ()
    { 
    iRefHandler = CReferenceHandler::NewL();
    iConsole->Printf(_L("\r\n"));
    CActiveScheduler::Add(this);			// Add to active scheduler
    
    // Create private path and set default Inbox path
    RFs fs;
    User::LeaveIfError(fs.Connect());
	fs.CreatePrivatePath(EDriveC);
	fs.SetSessionToPrivate(EDriveC);	
	fs.SessionPath(iInboxRoot);
	fs.Close();
    }

CActiveConsole::~CActiveConsole()
	{
	// Make sure we're cancelled
	Cancel();

	// safe to delete NULL
	delete iObexClientHandler;
	delete iObexServerHandler;
	delete iObexServerHandlerFile;
	delete iRefHandler;
	}

void  CActiveConsole::DoCancel()
    {
    iConsole->ReadCancel();
    }

void  CActiveConsole::RunL()
    {
	// Save the current test mode in case the next action leaves
	TUint oldTestMode = iTestMode;
    TRAPD(err,ProcessKeyPressL(TChar(iConsole->KeyCode())));
	if(err != KErrNone)
		{
		iConsole->Printf(_L("Failed. Error: %d\r\n"),err);
		// Put the test mode back again
		iTestMode = oldTestMode;
		RequestCharacter();
		}
    }

void CActiveConsole::RequestCharacter()
    {
    // A request is issued to the CConsoleBase to accept a
    // character from the keyboard.
    if (iTestMode == E_Client)
		{
		iConsole->Printf(_L("Commands :- \r\n"));
		iConsole->Printf(_L(" A  -  IrObex Abort\r\n"));
		iConsole->Printf(_L(" 1  -  IrObex Connect Menu\r\n"));
		iConsole->Printf(_L(" 2  -  IrObex Disconnect\r\n"));
		iConsole->Printf(_L(" 3  -  IrObex Put obj 1 : %S\r\n"), &(iObexClientHandler->iFilename1));
		iConsole->Printf(_L(" 4  -  IrObex Put Obj 2 : %S\r\n"), &(iObexClientHandler->iFilename2));
		iConsole->Printf(_L(" z  -  IrObex Put Obj 3 : %S\r\n"), &(iObexClientHandler->iFilename3));
		iConsole->Printf(_L(" y  -  Enter HTTP/App param Test Menu\r\n")); //E_Client_HTTP_Menu
		iConsole->Printf(_L(" 5  -  IrObex Get by name\r\n"));
		iConsole->Printf(_L(" 6  -  IrObex Get by type\r\n"));
		iConsole->Printf(_L(" 7  -  IrObex SetPath\r\n"));
		iConsole->Printf(_L(" 8  -  IrObex Put reference object\r\n"));
		iConsole->Printf(_L(" 9  -  IrObex Get reference object\r\n"));
		iConsole->Printf(_L(" 0  -  IrObex Setup OBEX\r\n"));
		iConsole->Printf(_L(" h  -  Toggle display of object headers\r\n"));
#ifdef ERROR_RESOLUTION_EXTENSION
		iConsole->Printf(_L(" l  -  Display last error\r\n"));
#endif
#ifdef EMPTY_HEADERS_TEST
		iConsole->Printf(_L(" t  -  Empty headers test menu\r\n"));
#endif //EMPTY_HEADERS_TEST
		iConsole->Printf(_L(" s  -  kill the Obex Client\r\n"));
		}
	if ( iTestMode == E_Client_HTTP_Menu )
		{ 
		iConsole->Printf(_L(" 1  -  HTTP Multiple Packets, will all arrive\r\n"));
		iConsole->Printf(_L(" 2  -  HTTP Multiple Packets, too many arrive in two parts\r\n"));
		iConsole->Printf(_L(" 3  -  HTTP Single Packet too large, nothing will arrive\r\n"));
		iConsole->Printf(_L(" 4  -  HTTP Single Packet too large with several smaller packets which will arrive\r\n"));
		iConsole->Printf(_L(" 5  -  App parameters test\r\n"));
		iConsole->Printf(_L(" s  -  Back to Client Menu\r\n"));
		}
	if ( iTestMode == E_Client_Connect_Menu )
		{
		iConsole->Printf(_L(" 0  -  IrObex Disconnect\r\n"));
		iConsole->Printf(_L(" 1  -  IrObex Connect\r\n"));
		iConsole->Printf(_L(" 2  -  IrObex Connect with Authentication\r\n"));
		iConsole->Printf(_L(" 3  -  IrObex Connect with Target Header\r\n"));
		iConsole->Printf(_L(" 4  -  IrObex Connect with Authentication AND Target Header\r\n"));
		iConsole->Printf(_L(" 5  -  Get remote address\r\n"));
		iConsole->Printf(_L(" s  -  Back to Client Menu\r\n"));
		}
	if ( iTestMode == E_Client_Setup_Menu )
		{
		iConsole->Printf(_L(" 1  -  Change Put Object 1\r\n"));
		iConsole->Printf(_L(" 2  -  Change Put Object 2\r\n"));
		iConsole->Printf(_L(" 3  -  Change Obex Get Name : %S\r\n"), &(iObexClientHandler->iObexName));
		iConsole->Printf(_L(" 4  -  Change Obex Get Type : %S\r\n"), &(iObexClientHandler->iGetType));
		iConsole->Printf(_L(" 5  -  Enable password support (so they can challenge us)\r\n"));
		iConsole->Printf(_L(" 6  -  Set challenge password : %S\r\n"), &(iObexClientHandler->iChallengePassword));
		iConsole->Printf(_L(" 7  -  Change Authentication Challenge Header\r\n"));
		iConsole->Printf(_L(" 8  -  Set Command Time-out\r\n"));
		iConsole->Printf(_L(" s  -  Back to Client Menu\r\n"));
		iConsole->Printf(_L(" p  -  Set default file path : %S\r\n"), &iInboxRoot);
		}
	if ( iTestMode == E_Client_Authentication_Header_Menu )
		{
		iConsole->Printf(_L(" 1  -  Suppress Options Header\r\n"));
		iConsole->Printf(_L(" 2  -  Suppress Realm Header\r\n"));
		iConsole->Printf(_L(" 3  -  Suppress Options and Realm Headers\r\n"));
		iConsole->Printf(_L(" 4  -  Reset to Default Authentication Headers\r\n"));
		iConsole->Printf(_L(" 5  -  Attempt Invalid Authentication Headers Value (i)\r\n"));
		iConsole->Printf(_L(" s  -  Back to Client Menu\r\n"));
		}
	if (iTestMode == E_Server)
		{
		iConsole->Printf(_L(" 1  -  Make OBEX Challenge on all incoming connections\r\n"));
		iConsole->Printf(_L(" 2  -  Disable authentication\r\n"));
		iConsole->Printf(_L(" 3  -  Enable password support (so they can challenge us)\r\n"));
		iConsole->Printf(_L(" 4  -  Set FTP local who (insist on target header\r\n"));
		iConsole->Printf(_L(" 5  -  Change challenge password : %S\r\n"), &(iObexServerHandler->iChallengePassword));
		iConsole->Printf(_L(" 6  -  Get remote address\r\n"));
        iConsole->Printf(_L(" 7  -  Set Target Checking to NoChecking\r\n"));
        iConsole->Printf(_L(" 8  -  Set Target Checking to IfPresent\r\n"));
        iConsole->Printf(_L(" 9  -  Set Target Checking to Always\r\n"));
		iConsole->Printf(_L(" h  -  Toggle display of object headers\r\n"));
		iConsole->Printf(_L(" p  -  Set Inbox root directory : %S\r\n"), &iInboxRoot);
#ifdef PACKET_ACCESS_EXTENSION
		iConsole->Printf(_L(" a  -  Enable displaying of request packets\r\n"));
#endif // PACKET_ACCESS_EXTENSION
		if(iTransport == EIrda)
			{
			iConsole->Printf(_L(" o  -  start suppressing IrDA discovery requests\r\n"));
			iConsole->Printf(_L(" c  -  stop suppressing IrDA discovery requests\r\n"));
			}

		iConsole->Printf(_L("press 's' to stop the Obex Server\r\n"));
		iConsole->Printf(_L("press 'S' to start the Obex Server\r\n"));
		}
	if (iTestMode == E_Server_File)
		{
		iConsole->Printf(_L(" Started Obex server, receiving into file-backed buffer object\r\n"));
		iConsole->Printf(_L(" 1  -  Make OBEX Challenge on all incoming connections\r\n"));
		iConsole->Printf(_L(" 2  -  Disable authentication\r\n"));
		iConsole->Printf(_L(" 3  -  Enable password support (so they can challenge us)\r\n"));
		iConsole->Printf(_L(" 4  -  Set FTP local who (insist on target header\r\n"));
		iConsole->Printf(_L(" 5  -  Change challenge password : %S\r\n"), &(iObexServerHandlerFile->iChallengePassword));
		iConsole->Printf(_L(" 6  -  Get remote address\r\n"));
		iConsole->Printf(_L(" 7  -  Toggle buffered file writes\r\n"));
		iConsole->Printf(_L(" p  -  Set Inbox root directory : %S\r\n"), &iInboxRoot);
		iConsole->Printf(_L("s - Stop the Obex Server\r\n"));
		iConsole->Printf(_L("g - Start the Obex Server\r\n"));
		iConsole->Printf(_L("press 'k' to kill the Obex Server\r\n"));
		}

    if(iTestMode == E_Inactive)
		{
		iConsole->Printf(_L("press '1' to start the Obex Client over Bluetooth\r\n"));
		iConsole->Printf(_L("press '2' to start the Obex Server over Bluetooth\r\n"));
		iConsole->Printf(_L("press '3' to start the Obex Client over Irda\r\n"));
		iConsole->Printf(_L("press 'a' to set the number of discovery slots to use in Irda\r\n"));
 		iConsole->Printf(_L("press 'b' to set the number of discovery attempts to make in Irda\r\n"));
		iConsole->Printf(_L("press '4' to start the Obex Server over Irda\r\n"));
		iConsole->Printf(_L("press '5' to start the Obex Server over Irda (filename backed buffer object)\r\n"));
		iConsole->Printf(_L("press 'r' to start the Obex Server over Irda (RFile backed buffer object)\r\n"));
		iConsole->Printf(_L("press '6' to start the Obex Server over USB\r\n"));
		iConsole->Printf(_L("press '7' to start the Obex Client over USB\r\n"));
		iConsole->Printf(_L("press 'n' to set the IrDA Nickname\r\n"));
		iConsole->Printf(_L("press 'm' to set the Obex Recv MTU\r\n"));
		iConsole->Printf(_L("press 'M' to set the Obex Transmit MTU\r\n"));
		iConsole->Printf(_L("press 'p' to toggle performance logging\r\n"));
		}
#ifdef EMPTY_HEADERS_TEST
	if ( iTestMode == E_Empty_Headers_Accept_Test )
		{
		iConsole->Printf(_L(" 1  -  Sent a packet with NOT empty following headers:\n\t[ Name, Type, Description, Target, Application Parameters ]\r\n\n"));
		iConsole->Printf(_L(" 2  -  Sent a packet with existing but empty following headers:\n\t[ Name, Type, Description, Target, Application Parameters ]\r\n\n"));
		iConsole->Printf(_L(" s  -  Back to Client Menu\r\n"));
		}
#endif //EMPTY_HEADERS_TEST
	if(iTestMode == E_GetIrDANickname && iIrDANicknameBuffer.Length() == 0)
		{
		iConsole->Printf(_L("Enter new IrDA nickname: "));
		}
	if(iTestMode == E_EnterRecvMTU && iRecvMTU == 0)
		{
		iConsole->Printf(_L("Enter new Receive MTU value (m=max, d=default): "));
		}
	if(iTestMode == E_EnterTransmitMTU && iTransmitMTU == 0)
		{
		iConsole->Printf(_L("Enter new Transmit MTU value (m=max, d=default): "));
		}
	//if(E_SdpQuery) // no extra options

    if(iTestMode != E_GetIrDANickname &&
       iTestMode != E_EnterRecvMTU &&
       iTestMode != E_EnterTransmitMTU)
    	{
    	iConsole->Printf(_L("press Escape to quit\r\n\r\n"));
    	}
    iConsole->Read(iStatus); 
    SetActive();
    }

void CActiveConsole::ProcessKeyPressL(TChar aChar)
    {
    if (aChar == EKeyEscape)
		{
		CActiveScheduler::Stop();
		return;
		}

    if(iTestMode ==E_Inactive)
		{
		switch (aChar)
			{
		case '1': 
			iTestMode = E_SdpQuery;
			iTransport = EBluetooth;
			iObexClientHandler = CObexClientHandler::NewL(this, EBluetooth);
			break;
		case'3':
			iTestMode = E_Client;
			iTransport = EIrda;
			iObexClientHandler = CObexClientHandler::NewL(this, EIrda);
			break;
		case 'a':
 			SetNumber(iDiscoverySlots);
 			break;
 		case 'b':
 			SetNumber(iDiscoveryAttempts);
 			break;	
		case 'n':
			iTestMode = E_GetIrDANickname;
			iIrDANicknameBuffer.Zero();
			break;
		case 'p':
			// Toggle the internal state.
			iPerformanceLoggingEnabled = !iPerformanceLoggingEnabled;
			if(iPerformanceLoggingEnabled)
				{
				iConsole->Printf(_L("\r\nPerformance logging enabled.\r\n\r\n"));
				}
			else
				{
				iConsole->Printf(_L("\r\nPerformance logging disabled.\r\n\r\n"));
				}
			break;
		case '2':
			iTestMode = E_Server;
			iTransport = EBluetooth;
			iObexServerHandler = CObexServerHandler::NewL(this, EBluetooth);
			break;
		case '4':
			iTestMode = E_Server;
			iTransport = EIrda;
			iObexServerHandler = CObexServerHandler::NewL(this, EIrda);
			break;
		case '5':
			iTestMode = E_Server_File;	// Added test for file-backed buffer object receive
			iTransport = EIrda;
			iObexServerHandlerFile = CObexServerHandlerFile::NewL(this,EIrda);
			break;
		case 'r':
			iTestMode = E_Server_File;	// Added test for file-backed buffer object receive
			iTransport = EIrda;
			iObexServerHandlerFile = CObexServerHandlerFile::NewL(this,EIrda,ETrue);
			break;
		case '6':
			{
			iTestMode = E_Server;
			
#ifndef __WINS__
			iTransport = EUsb;

			// For USB, we unfortunately need to start it, then register our
			// interfaces, then do a soft connect.
			TInt err = User::LoadLogicalDevice(_L("EUSBC"));
			if (err != KErrNone && err != KErrAlreadyExists)
				{
				User::Leave(err);
				}
			
			RUsb usb;
			User::LeaveIfError(usb.Connect());
			TRequestStatus status;
			usb.TryStart(2, status);
			User::WaitForRequest(status);
			iConsole->Printf(_L("Starting USB returned %d\n"), status.Int());
            User::LeaveIfError(status.Int());
			usb.Close();
			
			RDevUsbcClient usbDriver;
			User::LeaveIfError(usbDriver.Open(0));
			User::LeaveIfError(usbDriver.DeviceDisconnectFromHost());
			
			iObexServerHandler = CObexServerHandler::NewL(this, EUsb);

			User::LeaveIfError(usbDriver.DeviceConnectToHost());
			usbDriver.Close();

#else

			iTransport = EWin32Usb;
			iObexServerHandler = CObexServerHandler::NewL(this, EWin32Usb);
#endif

			}
			break;
		case '7':
			{
			iTestMode = E_Client;
			
#ifdef __WINS__
			iTransport = EWin32Usb;
			iObexClientHandler = CObexClientHandler::NewL(this, EWin32Usb);
			
#else

			iTransport = EUsb;
			
			// For USB, we unfortunately need to start it, then register our
			// interfaces, then do a soft connect.
			TInt loaded = User::LoadLogicalDevice(_L("EUSBC"));
			iConsole->Printf(_L("Loading ldd returned %d\n"), loaded);
			
			RUsb usb;
			User::LeaveIfError(usb.Connect());
			iConsole->Printf(_L("Connected to USB\n"));
			TRequestStatus status;
			usb.TryStart(2,status);
			User::WaitForRequest(status);
			iConsole->Printf(_L("Starting USB returned %d\n"), status.Int());
		    User::LeaveIfError(status.Int());
			usb.Close();
			
			RDevUsbcClient usbDriver;
			User::LeaveIfError(usbDriver.Open(0));
			User::LeaveIfError(usbDriver.DeviceDisconnectFromHost());
			
			iObexClientHandler = CObexClientHandler::NewL(this, EUsb);

			User::LeaveIfError(usbDriver.DeviceConnectToHost());
			usbDriver.Close();
#endif

			}
			break;
		case 'm':
			// Reset MTU value.
			iRecvMTU = 0;
			iTestMode = E_EnterRecvMTU;
			break;

		case 'M':
			// Reset MTU value.
			iTransmitMTU = 0;
			iTestMode = E_EnterTransmitMTU;
			break;
			
		default:
			break;
			}
		}

    else if(iTestMode == E_Server)
		{
		switch (aChar)
			{
		case 's': 
			iObexServerHandler->Stop();
			break;
		case 'S':
			iObexServerHandler->Start();
			break;
		case 'g': case 'G':
			iObexServerHandler->Start();
			break;
		case 'h': case 'H':
			iDisplayHeaders = !iDisplayHeaders;
			break;
		case 'k': case 'K':
			delete iObexServerHandler;
			iObexServerHandler = NULL;
			iTestMode = E_Inactive;
			break;
		case 'o':
			if(iTransport == EIrda)
				{
				iSupp.Open();
				}
			break;
		case 'c':
			if(iTransport == EIrda)
				{
				iSupp.Close();
				}
			break;
		case '1':
			iObexServerHandler->EnableAuthentication();
			break;
		case '2':
			iObexServerHandler->DisableAuthentication();
			break;
		case '3':
			iObexServerHandler->EnablePassword();
			break;
		case '4':
			iObexServerHandler->SetLocalWho();
			break;
		case '5':
			iObexServerHandler->ChangeChallengePassword();
			break;
		case '6':
			iObexServerHandler->RemoteAddress();
			break;
        case '7':
			iObexServerHandler->SetTargetChecking(CObexServer::ENoChecking);
			break;
		case '8':
			iObexServerHandler->SetTargetChecking(CObexServer::EIfPresent);
			break;
		case '9':
            iObexServerHandler->SetTargetChecking(CObexServer::EAlways);
			break;
		case 'p':
			SetInboxRoot();
			break;
#ifdef PACKET_ACCESS_EXTENSION
		case 'a':
			iObexServerHandler->PacketAccessUiL(ETrue);
			break;
#endif // PACKET_ACCESS_EXTENSION
		default:
			iConsole->Printf(_L("\r\nUnknown Command\r\n\r\n"));
			break;
			}
		}

	else if(iTestMode == E_Server_File)
		{
		switch (aChar)
			{
		case 's': case 'S':
			iObexServerHandlerFile->Stop();
			delete iObexServerHandlerFile;
			iObexServerHandlerFile = NULL;
			iTestMode = E_Inactive;
			break;
		case '1':
			iObexServerHandlerFile->EnableAuthentication();
			break;
		case '2':
			iObexServerHandlerFile->DisableAuthentication();
			break;
		case '3':
			iObexServerHandlerFile->EnablePassword();
			break;
		case '4':
			iObexServerHandlerFile->SetLocalWho();
			break;
		case '5':
			iObexServerHandlerFile->ChangeChallengePassword();
			break;
		case '6':
			iObexServerHandlerFile->RemoteAddress();
			break;
		case '7':
			iObexServerHandlerFile->ToggleWriteBuffering();
			break;
		case 'p':
			SetInboxRoot();
			break;
		
		default:
			iConsole->Printf(_L("\r\nUnknown Command\r\n\r\n"));
			break;
			}
		}
	
	else if (iTestMode == E_Client_Connect_Menu )
		{
		switch (aChar)
			{
		case '0':
			iObexClientHandler->Disconnect();
			break;
		case '1':
			iObexClientHandler->Connect();
			break;
		case '2':
			iObexClientHandler->ConnectWithAuthenticationL();
			break;
		case '3':
			iObexClientHandler->ConnectWithTarget();
			break;
		case '4':
			iObexClientHandler->ConnectWithAuthenticationAndTargetL();
			break;
		case '5':
			iObexClientHandler->RemoteAddress();
			break;
		default:
			iTestMode = E_Client;
			break;
			}
		}
	else if ( iTestMode == E_Client_HTTP_Menu )
		{
		switch (aChar)	//tam
			{
		case '1':	//HTTP Multiple Packets;
			iObexClientHandler->HTTPTest1L();
			break;
		case '2':	//HTTP Multiple Packets, too many, will arrive in two parts
			iObexClientHandler->HTTPTest2L();
			break;
		case '3':	//HTTP Single Packet too large, nothing will arrive
			iObexClientHandler->HTTPTest3L();
			break;
		case '4':	//HTTP Single Packet too large
					//with several smaller packets which will arrive
			iObexClientHandler->HTTPTest4L();
			break;
		case '5':	//App parameters test
			iObexClientHandler->AppParamsTestL();
		default:
			iTestMode = E_Client;
			break;
			}

		}
	else if (iTestMode == E_Client_Setup_Menu )
		{
		switch (aChar)
			{
		case '1': 
			iObexClientHandler->SetName(iObexClientHandler->iFilename1);
			break;
		case '2':
			iObexClientHandler->SetName(iObexClientHandler->iFilename2);
			break;
		case '3':
			iObexClientHandler->SetObexName();
			break;
		case '4': 
			iObexClientHandler->SetType();
			break;
		case '5':
			iObexClientHandler->EnablePassword();
			break;
		case '6':
			iObexClientHandler->ChangeChallengePassword();
			break;
		case '7':
			iTestMode = E_Client_Authentication_Header_Menu;
			break;
		case '8':
			iObexClientHandler->SetCommandTimeout();
			break;
		case 'p':
			SetInboxRoot();
			break;
		default:
			iTestMode = E_Client;
			break;
			}
		}
	else if(iTestMode == E_Client)
		{
		switch (aChar)
			{
		case 'a': case 'A':
			iObexClientHandler->Abort();
			break;
		case '1': 
			iTestMode = E_Client_Connect_Menu;
			break;
		case '2':
			iObexClientHandler->Disconnect();
			break;
		case '3': 
			iObexClientHandler->Put(iObexClientHandler->iFilename1);
			break;
		case '4': 
			iObexClientHandler->Put(iObexClientHandler->iFilename2);
			break;
		case 'y':case 'Y':
			iTestMode = E_Client_HTTP_Menu;
			break;
		case 'z':case 'Z':
			iObexClientHandler->Put(iObexClientHandler->iFilename3);
			break;
		case '5':
			iObexClientHandler->GetByNameL();
			break;
		case '6':
			iObexClientHandler->GetByTypeL();
			break;
		case '7':
			iObexClientHandler->SetPath();
			break;
		case '8':
			iObexClientHandler->SetCurrentTestNumber(); 
			iObexClientHandler->PutReferenceL(10);
			break;
		case '9':
			iObexClientHandler->SetCurrentTestNumber(); 
			iObexClientHandler->GetReferenceL(8);
			break;
		case '0': 
			iTestMode = E_Client_Setup_Menu;
			break;
		case 'h': case 'H':
			iDisplayHeaders = !iDisplayHeaders;
			break;
#ifdef ERROR_RESOLUTION_EXTENSION
		case 'l': case 'L':
			iObexClientHandler->LastError();
			break;
#endif // ERROR_RESOLUTION_EXTENSION

#ifdef EMPTY_HEADERS_TEST
		case 't': 
			iTestMode = E_Empty_Headers_Accept_Test;
			break;
#endif //EMPTY_HEADERS_TEST

		case 's': case 'S':
			delete iObexClientHandler;
			iObexClientHandler = NULL;
			iTestMode = E_Inactive;
			break;
		default:
			iConsole->Printf(_L("\r\nUnknown Command\r\n\r\n"));
			break;
			}
		}
	else if(iTestMode == E_Client_Authentication_Header_Menu)
		{
		switch (aChar)
			{
		case '1':
		case '2':
		case '3':
		case '4':
		case '5':
			iObexClientHandler->ChangeAuthenticationChallengeHeaders(aChar);
			break;
		case 's': case 'S':
			iTestMode = E_Client_Setup_Menu;
			break;
		default:
			iConsole->Printf(_L("\r\nUnknown Command\r\n\r\n"));
			break;
			}
		}
	else if(iTestMode == E_GetIrDANickname)
		{
		if(aChar.IsControl() ||
		   iIrDANicknameBuffer.Length() == iIrDANicknameBuffer.MaxSize())
			{
			// Return to main menu.
			iTestMode = E_Inactive;
			iConsole->Printf(_L("\nNickname set to: %S\n\n"), &iIrDANicknameBuffer);
			}
		else
			{
			iConsole->Printf(_L("%c"), aChar.operator TUint());
			iIrDANicknameBuffer.Append(aChar);
			}
		}
	else if(iTestMode == E_EnterRecvMTU)
		{
		if(aChar.IsDigit())
			{
			iRecvMTU *= 10;
			iRecvMTU += aChar.GetNumericValue();
			iConsole->Printf(_L("%c"), aChar.operator TUint());			
			if(iRecvMTU >= KObexPacketMaxSize)
				{
				// Return to main menu.
				iTestMode = E_Inactive;
				}
			}
		else
			{
			if(aChar == 'm')
				{
				// Set max MTU
				iRecvMTU = KObexPacketMaxSize;
				// Return to main menu.
				iTestMode = E_Inactive;
				}
			else if(aChar == 'd')
				{
				// Set defualt MTU
				iRecvMTU = 4000;
				// Return to main menu.
				iTestMode = E_Inactive;
				}
			else if(aChar.IsControl())
				{
				// Return to main menu.
				iTestMode = E_Inactive;
				}

			iConsole->Printf(_L("\nReceive MTU set to: %d\n\n"), iRecvMTU);
			}
		}
	else if(iTestMode == E_EnterTransmitMTU)
		{
		if(aChar.IsDigit())
			{
			iTransmitMTU *= 10;
			iTransmitMTU += aChar.GetNumericValue();
			iConsole->Printf(_L("%c"), aChar.operator TUint());			
			if(iTransmitMTU >= KObexPacketMaxSize)
				{
				// Return to main menu.
				iTestMode = E_Inactive;
				}
			}
		else
			{
			if(aChar == 'm')
				{
				// Set max MTU
				iTransmitMTU = KObexPacketMaxSize;
				// Return to main menu.
				iTestMode = E_Inactive;
				}
			else if(aChar == 'd')
				{
				// Set defualt MTU
				iTransmitMTU = 4000;
				// Return to main menu.
				iTestMode = E_Inactive;
				}
			else if(aChar.IsControl())
				{
				// Return to main menu.
				iTestMode = E_Inactive;
				}

			iConsole->Printf(_L("\nTransmit MTU set to: %d\n\n"), iTransmitMTU);
			}
		}
#ifdef EMPTY_HEADERS_TEST
	else if ( iTestMode == E_Empty_Headers_Accept_Test )
		{
		switch (aChar)
			{
				case '1' : 
					iObexClientHandler->EmptyHeaderTestL(_L("Name header"), _L8("Type header"), _L("Description header"), _L8("Target header"), _L8("Application param header"));
				break;

				case '2': 
					iObexClientHandler->EmptyHeaderTestL(_L(""), _L8(""), _L(""), _L8(""), _L8(""));
				break;
				
				case 's': 
				 iTestMode = E_Client;
				break;
				
				default :
					iConsole->Printf(_L("\r\nUnknown Command\r\n\r\n"));
			}
		
		}
#endif	//EMPTY_HEADERS_TEST	

	else
		{
		CActiveScheduler::Stop();
		return;
		}
	RequestCharacter ();
	return;
    }

CConsoleBase* CActiveConsole::Console()
	{
	return iConsole;
	}

void CActiveConsole::SetPassword(TDes& aPassword)
    {
	iConsole->Printf(_L("\nEnter a password: %S"),&aPassword);

	GetString(aPassword);

	iConsole->Printf(_L("\n"));
	iConsole->Printf( _L("\n Password size = %d\n"),aPassword.Length());
    }


void CActiveConsole::SetInboxRoot()
	{
	iConsole->Printf(_L("\nEnter a path: %S"), &iInboxRoot);

	GetString(iInboxRoot);

	iConsole->Printf(_L("\n"));
	}


TBool CActiveConsole::DisplayHeaders()
	{
	return iDisplayHeaders;
	}
	
TBool CActiveConsole::SetNumber(TUint& aNumber)
 	{
 	TKeyCode code;
 	TBuf<1> ch;
 	TBuf<64> input;
 	TUint oldNumber = aNumber;
 
 	input.Num(aNumber);
 	iConsole->Printf(_L("\nEnter a number: %S"), &input);
 
 	FOREVER
 		{
 		code = iConsole->Getch();
 		ch.SetLength(0);
 		ch.Append(code);
 
 		iConsole->Printf(_L("%S"), &ch);
 
 		// If <CR> finish editing string.
 		if (code == EKeyEnter)
 			{
 			break;
 			}
 
 		// If <BS> remove last character.
 		if ((code == EKeyBackspace) && (input.Length() != 0))
 			{
 			input.SetLength((input.Length() - 1));
 			}
 		else
 			{
 			input.Append(code);
 			}
 		}
 	iConsole->Printf(_L("\n"));
 
 	TLex lex(input);
 	if (lex.Val(aNumber) != KErrNone)
 		{
 		iConsole->Printf(_L("\r\nError: You did not enter a number.\r\n"));
 		aNumber = oldNumber;
 		return EFalse;
 		}
 		
 	return ETrue;
	}
 
void CActiveConsole::GetString(TDes& aString)
	{
	TKeyCode code;
	TBuf<1> character;
	
	FOREVER
		{
		code = iConsole->Getch();
		character.SetLength(0);
		character.Append(code);

		iConsole->Printf(_L("%S"),&character);
	
		// If <CR> finish editing string
		if (code == EKeyEnter)
			break;
		
		// if <BS> remove last character
		if ((code == EKeyBackspace) && (aString.Length() != 0))
			{
			aString.SetLength((aString.Length()-1));
			}
		else if (aString.Length() < aString.MaxLength())
			{
			aString.Append(code);
			}
		}
	}

void CActiveConsole::ClientErrored()
	{
	iTestMode = E_Inactive;
	Cancel();
	RequestCharacter();
	delete iObexClientHandler;
	iObexClientHandler = 0;
	}

TBool CActiveConsole::UseIrdaNickname() const
	{
	return (iIrDANicknameBuffer.Length() != 0);
	}
	
const TDesC& CActiveConsole::GetIrdaNickname() const
	{
	return iIrDANicknameBuffer;
	}