networkingtestandutils/networkingintegrationtest/NTRas/RASCON.CPP
changeset 0 af10295192d8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/networkingtestandutils/networkingintegrationtest/NTRas/RASCON.CPP	Tue Jan 26 15:23:49 2010 +0200
@@ -0,0 +1,266 @@
+// 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 "rasdef.h"
+#include <cdblen.h>
+
+CRasConnect::CRasConnect(CNtRas* aNtRas)
+	: iNtRas(aNtRas)
+	{
+	__DECLARE_NAME(_S("CRasConnect"));
+	}
+
+CRasConnect::~CRasConnect()
+	{
+
+	if(iCommOpen)
+		{
+		Disconnect();
+		CommClose();
+		}
+	CommDelete();
+	TimerDelete();
+	delete iChat;
+	}
+
+CRasConnect* CRasConnect::NewL(CNtRas* aRas)
+	{
+	CRasConnect* p = new (ELeave) CRasConnect(aRas);
+	CleanupStack::PushL(p);
+	p->ConstructL();
+	CleanupStack::Pop();
+	return p;
+	}
+
+void CRasConnect::ConstructL()
+	{
+
+	CommConstructL(KCommReadPriority,KCommWritePriority);
+	TimerConstructL(KCommTimerPrioiry);
+	iState = ERasConClosed;
+	iChat = new (ELeave) CCommChatter(this, KChatterPriority);
+	iChat->CreateL(KChatBufferSize);
+	iNtRas->ReadInt(NIF_IFSERVERMODE, iServerMode);
+
+	if(iServerMode)
+		iString=CCommChatString::NewL(_L8("CLIENT"), EFalse);
+	else
+		iString=CCommChatString::NewL(_L8("SERVER"), EFalse);
+
+	iChat->AddString(iString);
+	TFileName csy;
+	TName port;
+
+	TBuf<KCommsDbSvrMaxColumnNameLength> columnName=TPtrC(MODEM);
+	columnName.Append(TChar(KSlashChar));
+	columnName.Append(TPtrC(MODEM_CSY_NAME));
+	User::LeaveIfError(iNtRas->ReadDes(columnName, csy));
+
+	columnName.SetLength(0);
+	columnName=TPtrC(MODEM);
+	columnName.Append(TChar(KSlashChar));
+	columnName.Append(TPtrC(MODEM_PORT_NAME));
+	User::LeaveIfError(iNtRas->ReadDes(columnName, port));
+
+	TInt err;
+	err = CommOpen(csy, port, ECommShared);
+	if (err==KErrNotFound)
+		{
+		Util::CommInit();
+		err = CommOpen(csy, port, ECommShared);
+		}
+	User::LeaveIfError(err);
+	iCommOpen=ETrue;
+	StartL();
+	}
+
+void CRasConnect::StartL()
+	{
+	User::LeaveIfError(InitComm());
+	iCommPort.ResetBuffers();
+	Disconnect(); // Will drop the lines
+	TimerAfter(KCommLineDropTime);
+	iState = ERasConDropLines;
+	}
+
+TPtrC8 CRasConnect::ExcessData()
+	{
+	return TPtrC8(iRxBuf.Ptr()+iRxBufOffset, iRxBuf.Length()-iRxBufOffset);
+	}
+
+void CRasConnect::CommReadComplete(TInt aStatus)
+	{
+	if (aStatus!=KErrNone)
+		{
+		Complete(aStatus);
+		return;
+		}
+	for (iRxBufOffset=0; iRxBufOffset<iRxBuf.Length() && iState!=ERasConConnected; iRxBufOffset++)
+		iChat->AddChar(iRxBuf[iRxBufOffset]);
+	if (iState==ERasConConnected)
+		{
+		Complete(KErrNone);
+		}
+	else
+		{
+		CommReadOneOrMore(iRxBuf);
+		iRxBufOffset = 0;
+		}
+	}
+
+void CRasConnect::CommWriteComplete(TInt aStatus)
+	{
+	if (aStatus!=KErrNone)
+		{
+		Complete(aStatus);
+		return;
+		}
+	else if (iState==ERasConConnecting)
+		{
+		iTries = 0;
+		SendToken();
+		}
+	}
+
+void CRasConnect::TimerComplete(TInt /*aStatus */)
+	{
+	if (iState == ERasConDropLines)
+		{
+		TInt ret;
+		if (ret = InitComm(), ret!=KErrNone)
+			{
+			Complete(ret);
+			return;
+			}
+
+		iCommPort.SetSignalsToMark(KSignalRTS | KSignalDTR);
+
+		if(iServerMode)
+			{
+			CommReadOneOrMore(iRxBuf);
+			}
+		else
+			{
+		    CommWriteReady();
+		    TimerAfter(KCommTimeout);
+			}
+		iState = ERasConConnecting;
+		}
+	else
+		{
+		Complete(KErrTimedOut);
+		}
+	}
+
+void CRasConnect::ChatStringMatch(CCommChatString* /*aString */)
+	{
+	if(iState==ERasConTokenSent)
+		{
+	    iState = ERasConConnected;
+		if(iServerMode)
+			iRxBufOffset=0;
+		}
+	else if(iServerMode && iState!=ERasConTokenSent && !CommIsWriting())
+	    {
+		iChat->RemoveString(iString);
+		delete iString;
+        TRAPD(res, iString=CCommChatString::NewL(_L8("~"), EFalse);)
+		if(res!=KErrNone)  // Comment out here
+			{
+			Complete(res);
+			return;
+			}
+		CommWriteReady();
+		}
+	}
+
+void CRasConnect::ChatTimeout()
+	{
+	SendToken();
+	}
+
+void CRasConnect::SendToken()
+	{
+	
+	// Changed to work on PPPD machines, comment line below and uncomment block for
+	// NTRas to work
+	//iNtRas->ConnectComplete(KErrNone);
+	
+	iState = ERasConTokenSent;
+	if (iTries++>=KChatMaxTries)
+		{
+		Complete(KErrCouldNotConnect);
+		return;
+		}
+	if(iServerMode)
+		CommWrite(_L8("SERVER"));
+	else
+	    CommWrite(_L8("CLIENT"));
+
+	if(!CommIsReading())
+	    CommReadOneOrMore(iRxBuf);
+	iChat->StartTimer(KChatTimeout);
+	//*/
+	}
+
+void CRasConnect::Complete(TInt aStatus)
+	{
+	CommCancel();
+	TimerCancel();
+	iChat->StopTimer();
+	iNtRas->ConnectComplete(aStatus);
+	}
+
+void CRasConnect::Disconnect()
+	{
+
+	CommCancel();
+
+	//TInt ret;
+	TCommConfig cbuf;
+	TCommConfigV01 &cfg=cbuf();
+	iCommPort.Config(cbuf);
+	cfg.iHandshake = KConfigFreeRTS	| KConfigFreeDTR;
+	iCommPort.SetConfig(cbuf);
+	iCommPort.SetSignalsToSpace(KSignalRTS | KSignalDTR);
+	}
+
+TInt CRasConnect::InitComm()
+	{
+	TInt ret;
+	TCommConfig cbuf;
+	TCommConfigV01 &cfg=cbuf();
+	iCommPort.Config(cbuf);
+
+	TUint32 spd;
+	iNtRas->ReadInt(RAS_COMMSPEED, spd);
+	ret = Util::GetCommSpeed(spd, cfg.iRate);	
+	
+	TBuf<32> buf;
+	buf.SetMax();
+	iNtRas->ReadDes(RAS_COMMDATA, buf);
+	if (ret = Util::GetCommFormat(buf, cfg.iDataBits, cfg.iStopBits, cfg.iParity), ret!=KErrNone)
+		return ret;
+	
+	buf.SetMax();
+	iNtRas->ReadDes(RAS_COMMHANDSHAKE, buf);
+	if (ret = Util::GetCommHandshake(buf, cfg.iHandshake), ret!=KErrNone)
+		return ret;
+
+	if (ret = iCommPort.SetConfig(cbuf), ret!=KErrNone)
+		return ret;
+
+	return KErrNone;
+	}