telephonyserverplugins/multimodetsy/hayes/ATIO.CPP
branchopencode
changeset 24 6638e7f4bd8f
parent 0 3553901f7fa8
--- a/telephonyserverplugins/multimodetsy/hayes/ATIO.CPP	Mon May 03 13:37:20 2010 +0300
+++ b/telephonyserverplugins/multimodetsy/hayes/ATIO.CPP	Thu May 06 15:10:38 2010 +0100
@@ -1,534 +1,534 @@
-// 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:
-// Serial IO Functions
-// 
-//
-
-#include "ATIO.H"
-#include "mSLOGGER.H"
-#include "ATERROR.H"
-
-//
-// CCompletionEntry
-//
-CCompletionEntry* CCompletionEntry::NewL(CCommChatString* aCs,	CATBase* aAtCommand)
-	{
-	return new(ELeave) CCompletionEntry(aCs,aAtCommand);
-	}
-
-CCompletionEntry::CCompletionEntry(CCommChatString* aCs, CATBase* aAtCommand) : iCs(aCs), iAtCommand(aAtCommand)
-	{}
-
-CCompletionEntry::~CCompletionEntry()
-	{}
-
-//
-// CATIo
-//
-CATIO* CATIO::NewL(TFileName& aCsy, TName& aPort,TPortAccess& aPortAccess)
-	{
-	CATIO* atIo=new(ELeave) CATIO(aPortAccess);
-	CleanupStack::PushL(atIo);
-	atIo->ConstructL(aCsy,aPort);
-	CleanupStack::Pop();
-	LOGTEXT2(_L8("CATIO::NewL returns 0x%x"),atIo);
-	return atIo;
-	}
-
-CATIO::CATIO(TPortAccess& aPortAccess)
-	: iPortAccess(aPortAccess)
-	{
-	iExpectList.SetOffset(_FOFF(CCompletionEntry,iLink));
-	}
-
-void CATIO::ConstructL(TFileName& aCsy, TName& aPort)
-	{
-	iCsy=aCsy;
-	CommConstructL(KCommReadPriority,KCommWritePriority);
-	iChat = new (ELeave) CCommChatter(this, KChatterPriority);
-	iChat->CreateL(KChatBufferSize);
-	
-	{		// Braces scope the lifetime of tmpCsy and tmpPort
-	TBuf8<KMaxFileName> tmpCsy;
-	TBuf8<KMaxName> tmpPort;
-	tmpCsy.Copy(aCsy);		// Convert parameter to 8 bit string
-	tmpPort.Copy(aPort);	// Convert parameter to 8 bit string
-	LOGTEXTREL3(_L8("CATIO::ConstructL Attempting open csy:%S port:%S"),&tmpCsy,&tmpPort);
-	}
-	TInt ret = CommOpen(aCsy, aPort, ECommShared);
-	if(ret == KErrAccessDenied || ret == KErrInUse)
-		iPortAccess=EPortAccessDenied;
-	else
-		(void)User::LeaveIfError(ret);
-	LOGTEXTREL(_L8("CATIO::ConstructL Open successful"));
-
-	iChatStringFound= new(ELeave) CArrayFixFlat<CCommChatString*>(5);
-	}
-
-CATIO::~CATIO()
-	{
-	delete iChatStringFound;
-	delete iChat;
-	}
-
-TInt CATIO::ConfigurePort(TCommConfig aConfiguration)
-	{
-	if (iPortAccess==EPortAccessAllowed)
-		{
-		TInt ret;
-		TCommConfig cbuf;
-		TCommConfigV01 &cfg=cbuf();
-		iCommPort.Config(cbuf);							// Get the Configuration
-	
-		TCommConfigV01 &newCfg=aConfiguration();
-		cfg.iRate=newCfg.iRate;
-		cfg.iDataBits=newCfg.iDataBits;
-		cfg.iStopBits=newCfg.iStopBits;
-		cfg.iParity=newCfg.iParity;
-		cfg.iHandshake=newCfg.iHandshake;
-		ret = iCommPort.SetConfig(cbuf);				// Set the Configuration
-		if(ret!=KErrNone)
-			{
-			LOGTEXT2(_L8("CATIO:\tError %d configuring port"),ret);
-			return ret;
-			}
-		}
-	return KErrNone;
-	}
-
-TInt CATIO::GetPortShutdownTimeout()
-	{
-	if (iPortAccess==EPortAccessAllowed)
-		{
-		TCommConfig2 cbuf;
-		TCommConfigV02& cfg=cbuf();
-		iCommPort.Config(cbuf);				// Get the Configuration
-
-		return (cfg.iTxShutdownTimeout);
-		}
-	else
-		return (0);
-	}
-
-TInt CATIO::SetPortShutdownTimeout(TInt aTimeout)
-	{
-	if (iPortAccess==EPortAccessAllowed)
-		{
-		TCommConfig2 cbuf;
-		TCommConfigV02 &cfg=cbuf();
-		iCommPort.Config(cbuf);				// Get the Configuration
-	
-		cfg.iTxShutdownTimeout = aTimeout;
-		return (iCommPort.SetConfig(cbuf));	// Set the Configuration
-		}
-	else
-		return KErrAccessDenied;
-	}
-
-void CATIO::Start(CATBase* aCompletionClass)
-	{
-	CommReadReady();
-	StartWrite(aCompletionClass);
-	}
-
-void CATIO::StartWrite(CATBase* aCompletionClass)
-	{
-	if (iPortAccess==EPortAccessAllowed)
-		{
-		iWriteCommand=aCompletionClass;
-		CommWriteReady();
-		iWritePending=ETrue;
-		}
-	}
-
-TPtrC8 CATIO::Buffer() const
-	{
-	return iChat->Buffer();
-	}
-
-TInt CATIO::BufferFindF(const TDesC8& aDes) const
-	{
-	return iChat->Buffer().FindF(aDes);
-	}
-
-TPtrC8 CATIO::CurrentLine() const
-	{
-	return iChat->CurrentLine();
-	}
-
-void CATIO::ClearBuffer()
-	{
-	if(!iPreserveBuffer)
-		iChat->ClearBuffer();
-	}
-
-void CATIO::ClearCurrentLine()
-	{
-	iChat->ClearCurrentLine();
-	}
-
-void CATIO::CommReadComplete(TInt aStatus)
-	{
-	LOGTEXT(_L8("Read Completion"));
-	__ASSERT_ALWAYS(iReadPending,Panic(EATCommand_IllegalCompletionReadNotExpected));
-	if (aStatus==KErrCommsLineFail)
-		{
-		if (iSecondChanceForCommsError++!=1)	
-			aStatus=KErrNone;		// only signal error if get 2 KErrCommsLineFail's in succession
-		else
-			iSecondChanceForCommsError=0;
-		}
-	if (aStatus!=KErrNone)
-		{
-		SignalCommandsWithError(aStatus);
-		return;
-		}
-	iReadPending = EFalse;
-	TRAPD(ret,ProcessReadCharsL());
-	if(ret!=KErrNone)
-		{
-		Cancel();	// This error cannot be related to a command - so they'll all be cleaned up.
-		iChat->DeleteAllAndStop();
-		}
-	}
-
-void CATIO::SignalCommandsWithError(TInt aStatus)
-//
-//	Complete all current AT commands with the error and call the error handler
-//
-	{	
-	LOGTEXT2(_L8("Received an error of %d"),aStatus);
-	Cancel();
-	CCompletionEntry* ce;
-	TDblQueIter<CCompletionEntry> iter(iExpectList);
-	while (ce = iter, ce!=NULL)
-		{
-		ce->iAtCommand->GenericEventSignal(EReadCompletion,aStatus);
-		iter.SetToLast();
-		CCompletionEntry* removeSimilar;
-		while (removeSimilar=iter--, removeSimilar!=ce)
-			{
-			if(removeSimilar && removeSimilar->iAtCommand==ce->iAtCommand)
-				{
-				iChat->RemoveString(removeSimilar->iCs);
-				delete removeSimilar->iCs;
-				removeSimilar->iLink.Deque();
-				delete removeSimilar;
-				}
-			}
-		iChat->RemoveString(ce->iCs);
-		delete ce->iCs;
-		ce->iLink.Deque();
-		delete ce;
-		iter.SetToFirst();
-		}
-	// Reset TSY status, complete notifications and re-add some expect strings
-	iErrorHandler->CleanUp(aStatus);
-	}
-
-void CATIO::ProcessReadCharsL()
-	{
-	LOGTEXT2(_L8("Received %d"),iRxBuf.Length());
-	LOGTEXTREL2(_L8("Rx:\t%S"),&iRxBuf);
-
-	TBool hitFlag=EFalse;
-	TInt len;
-
-	for (iRxBufOffset=0; iRxBufOffset<iRxBuf.Length(); iRxBufOffset++)
-		{
-		iChat->AddCharL(iRxBuf[iRxBufOffset]);
-// Check for hits and one up-call per hit NOW
-		if((len=iChatStringFound->Count())>0)
-			{
-			for(TInt i=0;i<len;i++)
-				{
-				hitFlag=ETrue;
-// Find the AT Command to complete
-				CCompletionEntry* ce;
-				TDblQueIter<CCompletionEntry> iter(iExpectList);
-				TBool aFoundFlag=EFalse;
-				while (ce = iter++, ce!=NULL)
-					{
-					if(ce->iCs==iChatStringFound->At(i))
-						{
-						iCurrentFoundChatString=ce->iCs;
-						ce->iAtCommand->GenericEventSignal(EReadCompletion,KErrNone);
-						aFoundFlag=ETrue;
-						break;
-						}
-					}
-				if(!aFoundFlag)
-					{
-					LOGTEXT(_L8("Internal Error - Chat String signalled, but not found"));
-					User::Leave(KErrGeneral);
-					}
-				}
-			iChatStringFound->Delete(0,iChatStringFound->Count());
-			}
-		}
-	if(hitFlag)
-		{
-		//iReadPending=EFalse;
-		Read();							// Queue Another...
-		}
-	else
-		{
-		iReadPending = ETrue;
-		CommReadOneOrMore(iRxBuf);
-		}
-	}
-
-void CATIO::SetPreserveBufferFlag(TBool aFlg)
-//
-// Set Preserve Buffer Flag
-//
-	{
-	iPreserveBuffer=aFlg;
-	}
-
-CCommChatString* CATIO::FoundChatString()
-	{
-	return iCurrentFoundChatString;
-	}
-
-CCommChatString* CATIO::AddExpectString(CATBase* aATBase, const TDesC8& aString, TBool aPartLine)
-	{
-	CCommChatString* cs=NULL;
-
-	TRAPD(err,cs=DoAddExpectStringL(aATBase,aString,aPartLine));
-	if(err==KErrNone)
-		LOGTEXT2(_L8("CATIO::AddExpectString added %S"),&aString);
-	else
-		{
-		cs=NULL;
-		LOGTEXT2(_L8("CATIO::AddExpectString FAILED TO ADD %S"),&aString);
-		}
-	return cs;
-	}
-
-CCommChatString* CATIO::DoAddExpectStringL(CATBase* aATBase, const TDesC8& aString, TBool aPartLine)
-	{
-	CCommChatString* cs=iChat->AddStringL(aString, aPartLine);		
-	CCompletionEntry* completionEntry=CCompletionEntry::NewL(cs,aATBase);
-	iExpectList.AddLast(*completionEntry);
-	return cs;
-	}
-
-
-void CATIO::RemoveExpectString(CCommChatString* aExpectString)
-	{
-// Find the AT Command to complete
-	CCompletionEntry* ce;
-	TDblQueIter<CCompletionEntry> iter(iExpectList);
-	while (ce = iter++, ce!=NULL)
-		{
-		if(ce->iCs==aExpectString)
-			{
-			iChat->RemoveString(ce->iCs);
-			delete ce->iCs;
-			ce->iLink.Deque();
-			delete ce;
-			break;
-			}
-		}
-	}
-
-void CATIO::RemoveExpectStrings(CATBase* aATBase)
-	{
-// Find the AT Command to complete
-	CCompletionEntry* ce;
-	TDblQueIter<CCompletionEntry> iter(iExpectList);
-	while (ce = iter++, ce!=NULL)
-		{
-		if(ce->iAtCommand==aATBase)
-			{
-			iChat->RemoveString(ce->iCs);
-			delete ce->iCs;
-			ce->iLink.Deque();
-			delete ce;
-			}
-		}
-	}
-
-void CATIO::CommWriteComplete(TInt aStatus)
-	{
-	LOGTEXT(_L8("Comm Write Completion"));
-	iChat->StopTimer();
-	__ASSERT_ALWAYS(iWritePending,Panic(EATCommand_IllegalCompletionWriteNotExpected));
-//	if(!iWritePending)
-//		aStatus=KErrIllegalWriteComplete;						// No Write Queued!
-	iWritePending=EFalse;
-	iWriteCommand->GenericEventSignal(EWriteCompletion,aStatus);
-	}
-
-void CATIO::ChatStringMatchL(CCommChatString* aCs)
-	{
-	iStringFound=ETrue;
-	iChatStringFound->AppendL(aCs);
-	}
-
-void CATIO::ChatTimeout()
-	{
-	LOGTEXT(_L8("Chat Time-out Completion"));
-	if(iWaitTimerPending)
-		{
-		iWaitTimerPending=EFalse;
-		iTimeOutCommand->GenericEventSignal(ETimeOutCompletion,KErrNone);
-		}
-	else
-		Panic(EATCommand_IllegalWaitCompletion);
-	}
-
-void CATIO::SetTimeOut(CATBase* aCompletionClass, TUint aTimePeriodMillisec)
-	{
-	iTimeOutCommand=aCompletionClass;
-	iChat->StartTimer(aTimePeriodMillisec*1000);
-	iWaitTimerPending=ETrue;
-	}
-
-void CATIO::Read()
- 	{
-	if (iPortAccess==EPortAccessAllowed && iReadPending==FALSE)
-		{
- 		iReadPending=ETrue;
-		iStringFound=EFalse;
-		CommReadOneOrMore(iRxBuf);
-		iRxBufOffset = 0;
-		LOGTEXT(_L8("Queued a Read"));
-		}
-	}
-
-void CATIO::Write(CATBase* aCompletionClass, const TDesC8& aString)
-	{
-	if (iPortAccess==EPortAccessAllowed)
-		{
-		ClearBuffer();	// assume previous responses fully processed
-		iWriteCommand=aCompletionClass;
-		iWritePending=ETrue;
-		CommWrite(aString);
-		if (aString.Length() > 350)
-			{	
-			LOGTEXT2(_L8("CATIO:\taString too big! Length:%d"), aString.Length());
-			}	
-		else
-			{
-			LOGTEXTREL2(_L8("Tx:\t%S"),&aString);
-			}
-		LOGTEXT(_L8("Queued a Transmission"));
-		}
-	}
-
-TBool CATIO::ReadPending()
-	{
-	return iReadPending;
-	}
-
-void CATIO::Disconnect()
-	{
-	if (iPortAccess == EPortAccessAllowed)
-		{
-		TCommConfig cbuf;
-		TCommConfigV01 &cfg=cbuf();
-		iCommPort.Config(cbuf);
-		cfg.iHandshake = KConfigFreeRTS	| KConfigFreeDTR;
-		TInt ret=iCommPort.SetConfig(cbuf);
-		if (ret == KErrNone)
-			iCommPort.SetSignalsToSpace(KSignalRTS | KSignalDTR);
-		}
-
-	CommClose();
-
-	iPortAccess = EPortAccessDenied;
-	}
-
-void CATIO::Cancel()
-	{
-	LOGTEXT(_L8("CATIO:\tCancel called"));
-	CommCancel();
-	iReadPending = EFalse;
-	iWritePending = EFalse;
-	iChat->StopTimer();
-	}
-
-void CATIO::ReadCancel()
-	{
-	LOGTEXT(_L8("CATIO:\tReadCancel called"));
-	CommReadCancel();
-	iReadPending = EFalse;
-	}
-
-void CATIO::WriteAndTimerCancel(CATBase* aATBase)
-	{
-	if (aATBase==iWriteCommand)
-		{
-		CommWriteCancel();
-		}
-	if (aATBase==iTimeOutCommand)
-		{
-		iChat->StopTimer();
-		}
-	}
-
-
-void CATIO::DropDtr()
-	{
-	if (iPortAccess==EPortAccessAllowed)
-		{
-		LOGTEXT(_L8("CATIO::DropDtr Dropping DTR"));
-		iCommPort.SetSignals(0,KSignalDTR);
-		}
-	}
-
-
-void CATIO::RaiseDTR()
-	{
-	if (iPortAccess==EPortAccessAllowed)
-		{
-		LOGTEXT(_L8("CATIO::RaiseDTR Raising DTR"));
-		iCommPort.SetSignals(KSignalDTR,0);
-		}
-	}
-
-void CATIO::ResetReadAndWriteBuffers()
-	{
-	iCommPort.ResetBuffers();
-	}
-
-TInt CATIO::GetSizeOfRxBuffer()
-	{
-	return iCommPort.QueryReceiveBuffer();
-	}
-
-TUint CATIO::Signals()
-	{
-	return iCommPort.Signals();
-	}
-
-void CATIO::DropRTS()
-	{
-	if (iPortAccess==EPortAccessAllowed)
-		{
-		LOGTEXT(_L8("Dropping RTS"));
-		iCommPort.SetSignals(0,KSignalRTS);
-		}
-	}
-
-void CATIO::RaiseRTS()
-	{
-	if (iPortAccess==EPortAccessAllowed)
-		{
-		LOGTEXT(_L8("Raising RTS"));
-		iCommPort.SetSignals(KSignalRTS,0);
-		}
-	}
+// 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:
+// Serial IO Functions
+// 
+//
+
+#include "ATIO.H"
+#include "mSLOGGER.H"
+#include "ATERROR.H"
+
+//
+// CCompletionEntry
+//
+CCompletionEntry* CCompletionEntry::NewL(CCommChatString* aCs,	CATBase* aAtCommand)
+	{
+	return new(ELeave) CCompletionEntry(aCs,aAtCommand);
+	}
+
+CCompletionEntry::CCompletionEntry(CCommChatString* aCs, CATBase* aAtCommand) : iCs(aCs), iAtCommand(aAtCommand)
+	{}
+
+CCompletionEntry::~CCompletionEntry()
+	{}
+
+//
+// CATIo
+//
+CATIO* CATIO::NewL(TFileName& aCsy, TName& aPort,TPortAccess& aPortAccess)
+	{
+	CATIO* atIo=new(ELeave) CATIO(aPortAccess);
+	CleanupStack::PushL(atIo);
+	atIo->ConstructL(aCsy,aPort);
+	CleanupStack::Pop();
+	LOGTEXT2(_L8("CATIO::NewL returns 0x%x"),atIo);
+	return atIo;
+	}
+
+CATIO::CATIO(TPortAccess& aPortAccess)
+	: iPortAccess(aPortAccess)
+	{
+	iExpectList.SetOffset(_FOFF(CCompletionEntry,iLink));
+	}
+
+void CATIO::ConstructL(TFileName& aCsy, TName& aPort)
+	{
+	iCsy=aCsy;
+	CommConstructL(KCommReadPriority,KCommWritePriority);
+	iChat = new (ELeave) CCommChatter(this, KChatterPriority);
+	iChat->CreateL(KChatBufferSize);
+	
+	{		// Braces scope the lifetime of tmpCsy and tmpPort
+	TBuf8<KMaxFileName> tmpCsy;
+	TBuf8<KMaxName> tmpPort;
+	tmpCsy.Copy(aCsy);		// Convert parameter to 8 bit string
+	tmpPort.Copy(aPort);	// Convert parameter to 8 bit string
+	LOGTEXTREL3(_L8("CATIO::ConstructL Attempting open csy:%S port:%S"),&tmpCsy,&tmpPort);
+	}
+	TInt ret = CommOpen(aCsy, aPort, ECommShared);
+	if(ret == KErrAccessDenied || ret == KErrInUse)
+		iPortAccess=EPortAccessDenied;
+	else
+		(void)User::LeaveIfError(ret);
+	LOGTEXTREL(_L8("CATIO::ConstructL Open successful"));
+
+	iChatStringFound= new(ELeave) CArrayFixFlat<CCommChatString*>(5);
+	}
+
+CATIO::~CATIO()
+	{
+	delete iChatStringFound;
+	delete iChat;
+	}
+
+TInt CATIO::ConfigurePort(TCommConfig aConfiguration)
+	{
+	if (iPortAccess==EPortAccessAllowed)
+		{
+		TInt ret;
+		TCommConfig cbuf;
+		TCommConfigV01 &cfg=cbuf();
+		iCommPort.Config(cbuf);							// Get the Configuration
+	
+		TCommConfigV01 &newCfg=aConfiguration();
+		cfg.iRate=newCfg.iRate;
+		cfg.iDataBits=newCfg.iDataBits;
+		cfg.iStopBits=newCfg.iStopBits;
+		cfg.iParity=newCfg.iParity;
+		cfg.iHandshake=newCfg.iHandshake;
+		ret = iCommPort.SetConfig(cbuf);				// Set the Configuration
+		if(ret!=KErrNone)
+			{
+			LOGTEXT2(_L8("CATIO:\tError %d configuring port"),ret);
+			return ret;
+			}
+		}
+	return KErrNone;
+	}
+
+TInt CATIO::GetPortShutdownTimeout()
+	{
+	if (iPortAccess==EPortAccessAllowed)
+		{
+		TCommConfig2 cbuf;
+		TCommConfigV02& cfg=cbuf();
+		iCommPort.Config(cbuf);				// Get the Configuration
+
+		return (cfg.iTxShutdownTimeout);
+		}
+	else
+		return (0);
+	}
+
+TInt CATIO::SetPortShutdownTimeout(TInt aTimeout)
+	{
+	if (iPortAccess==EPortAccessAllowed)
+		{
+		TCommConfig2 cbuf;
+		TCommConfigV02 &cfg=cbuf();
+		iCommPort.Config(cbuf);				// Get the Configuration
+	
+		cfg.iTxShutdownTimeout = aTimeout;
+		return (iCommPort.SetConfig(cbuf));	// Set the Configuration
+		}
+	else
+		return KErrAccessDenied;
+	}
+
+void CATIO::Start(CATBase* aCompletionClass)
+	{
+	CommReadReady();
+	StartWrite(aCompletionClass);
+	}
+
+void CATIO::StartWrite(CATBase* aCompletionClass)
+	{
+	if (iPortAccess==EPortAccessAllowed)
+		{
+		iWriteCommand=aCompletionClass;
+		CommWriteReady();
+		iWritePending=ETrue;
+		}
+	}
+
+TPtrC8 CATIO::Buffer() const
+	{
+	return iChat->Buffer();
+	}
+
+TInt CATIO::BufferFindF(const TDesC8& aDes) const
+	{
+	return iChat->Buffer().FindF(aDes);
+	}
+
+TPtrC8 CATIO::CurrentLine() const
+	{
+	return iChat->CurrentLine();
+	}
+
+void CATIO::ClearBuffer()
+	{
+	if(!iPreserveBuffer)
+		iChat->ClearBuffer();
+	}
+
+void CATIO::ClearCurrentLine()
+	{
+	iChat->ClearCurrentLine();
+	}
+
+void CATIO::CommReadComplete(TInt aStatus)
+	{
+	LOGTEXT(_L8("Read Completion"));
+	__ASSERT_ALWAYS(iReadPending,Panic(EATCommand_IllegalCompletionReadNotExpected));
+	if (aStatus==KErrCommsLineFail)
+		{
+		if (iSecondChanceForCommsError++!=1)	
+			aStatus=KErrNone;		// only signal error if get 2 KErrCommsLineFail's in succession
+		else
+			iSecondChanceForCommsError=0;
+		}
+	if (aStatus!=KErrNone)
+		{
+		SignalCommandsWithError(aStatus);
+		return;
+		}
+	iReadPending = EFalse;
+	TRAPD(ret,ProcessReadCharsL());
+	if(ret!=KErrNone)
+		{
+		Cancel();	// This error cannot be related to a command - so they'll all be cleaned up.
+		iChat->DeleteAllAndStop();
+		}
+	}
+
+void CATIO::SignalCommandsWithError(TInt aStatus)
+//
+//	Complete all current AT commands with the error and call the error handler
+//
+	{	
+	LOGTEXT2(_L8("Received an error of %d"),aStatus);
+	Cancel();
+	CCompletionEntry* ce;
+	TDblQueIter<CCompletionEntry> iter(iExpectList);
+	while (ce = iter, ce!=NULL)
+		{
+		ce->iAtCommand->GenericEventSignal(EReadCompletion,aStatus);
+		iter.SetToLast();
+		CCompletionEntry* removeSimilar;
+		while (removeSimilar=iter--, removeSimilar!=ce)
+			{
+			if(removeSimilar && removeSimilar->iAtCommand==ce->iAtCommand)
+				{
+				iChat->RemoveString(removeSimilar->iCs);
+				delete removeSimilar->iCs;
+				removeSimilar->iLink.Deque();
+				delete removeSimilar;
+				}
+			}
+		iChat->RemoveString(ce->iCs);
+		delete ce->iCs;
+		ce->iLink.Deque();
+		delete ce;
+		iter.SetToFirst();
+		}
+	// Reset TSY status, complete notifications and re-add some expect strings
+	iErrorHandler->CleanUp(aStatus);
+	}
+
+void CATIO::ProcessReadCharsL()
+	{
+	LOGTEXT2(_L8("Received %d"),iRxBuf.Length());
+	LOGTEXTREL2(_L8("Rx:\t%S"),&iRxBuf);
+
+	TBool hitFlag=EFalse;
+	TInt len;
+
+	for (iRxBufOffset=0; iRxBufOffset<iRxBuf.Length(); iRxBufOffset++)
+		{
+		iChat->AddCharL(iRxBuf[iRxBufOffset]);
+// Check for hits and one up-call per hit NOW
+		if((len=iChatStringFound->Count())>0)
+			{
+			for(TInt i=0;i<len;i++)
+				{
+				hitFlag=ETrue;
+// Find the AT Command to complete
+				CCompletionEntry* ce;
+				TDblQueIter<CCompletionEntry> iter(iExpectList);
+				TBool aFoundFlag=EFalse;
+				while (ce = iter++, ce!=NULL)
+					{
+					if(ce->iCs==iChatStringFound->At(i))
+						{
+						iCurrentFoundChatString=ce->iCs;
+						ce->iAtCommand->GenericEventSignal(EReadCompletion,KErrNone);
+						aFoundFlag=ETrue;
+						break;
+						}
+					}
+				if(!aFoundFlag)
+					{
+					LOGTEXT(_L8("Internal Error - Chat String signalled, but not found"));
+					User::Leave(KErrGeneral);
+					}
+				}
+			iChatStringFound->Delete(0,iChatStringFound->Count());
+			}
+		}
+	if(hitFlag)
+		{
+		//iReadPending=EFalse;
+		Read();							// Queue Another...
+		}
+	else
+		{
+		iReadPending = ETrue;
+		CommReadOneOrMore(iRxBuf);
+		}
+	}
+
+void CATIO::SetPreserveBufferFlag(TBool aFlg)
+//
+// Set Preserve Buffer Flag
+//
+	{
+	iPreserveBuffer=aFlg;
+	}
+
+CCommChatString* CATIO::FoundChatString()
+	{
+	return iCurrentFoundChatString;
+	}
+
+CCommChatString* CATIO::AddExpectString(CATBase* aATBase, const TDesC8& aString, TBool aPartLine)
+	{
+	CCommChatString* cs=NULL;
+
+	TRAPD(err,cs=DoAddExpectStringL(aATBase,aString,aPartLine));
+	if(err==KErrNone)
+		LOGTEXT2(_L8("CATIO::AddExpectString added %S"),&aString);
+	else
+		{
+		cs=NULL;
+		LOGTEXT2(_L8("CATIO::AddExpectString FAILED TO ADD %S"),&aString);
+		}
+	return cs;
+	}
+
+CCommChatString* CATIO::DoAddExpectStringL(CATBase* aATBase, const TDesC8& aString, TBool aPartLine)
+	{
+	CCommChatString* cs=iChat->AddStringL(aString, aPartLine);		
+	CCompletionEntry* completionEntry=CCompletionEntry::NewL(cs,aATBase);
+	iExpectList.AddLast(*completionEntry);
+	return cs;
+	}
+
+
+void CATIO::RemoveExpectString(CCommChatString* aExpectString)
+	{
+// Find the AT Command to complete
+	CCompletionEntry* ce;
+	TDblQueIter<CCompletionEntry> iter(iExpectList);
+	while (ce = iter++, ce!=NULL)
+		{
+		if(ce->iCs==aExpectString)
+			{
+			iChat->RemoveString(ce->iCs);
+			delete ce->iCs;
+			ce->iLink.Deque();
+			delete ce;
+			break;
+			}
+		}
+	}
+
+void CATIO::RemoveExpectStrings(CATBase* aATBase)
+	{
+// Find the AT Command to complete
+	CCompletionEntry* ce;
+	TDblQueIter<CCompletionEntry> iter(iExpectList);
+	while (ce = iter++, ce!=NULL)
+		{
+		if(ce->iAtCommand==aATBase)
+			{
+			iChat->RemoveString(ce->iCs);
+			delete ce->iCs;
+			ce->iLink.Deque();
+			delete ce;
+			}
+		}
+	}
+
+void CATIO::CommWriteComplete(TInt aStatus)
+	{
+	LOGTEXT(_L8("Comm Write Completion"));
+	iChat->StopTimer();
+	__ASSERT_ALWAYS(iWritePending,Panic(EATCommand_IllegalCompletionWriteNotExpected));
+//	if(!iWritePending)
+//		aStatus=KErrIllegalWriteComplete;						// No Write Queued!
+	iWritePending=EFalse;
+	iWriteCommand->GenericEventSignal(EWriteCompletion,aStatus);
+	}
+
+void CATIO::ChatStringMatchL(CCommChatString* aCs)
+	{
+	iStringFound=ETrue;
+	iChatStringFound->AppendL(aCs);
+	}
+
+void CATIO::ChatTimeout()
+	{
+	LOGTEXT(_L8("Chat Time-out Completion"));
+	if(iWaitTimerPending)
+		{
+		iWaitTimerPending=EFalse;
+		iTimeOutCommand->GenericEventSignal(ETimeOutCompletion,KErrNone);
+		}
+	else
+		Panic(EATCommand_IllegalWaitCompletion);
+	}
+
+void CATIO::SetTimeOut(CATBase* aCompletionClass, TUint aTimePeriodMillisec)
+	{
+	iTimeOutCommand=aCompletionClass;
+	iChat->StartTimer(aTimePeriodMillisec*1000);
+	iWaitTimerPending=ETrue;
+	}
+
+void CATIO::Read()
+ 	{
+	if (iPortAccess==EPortAccessAllowed && iReadPending==FALSE)
+		{
+ 		iReadPending=ETrue;
+		iStringFound=EFalse;
+		CommReadOneOrMore(iRxBuf);
+		iRxBufOffset = 0;
+		LOGTEXT(_L8("Queued a Read"));
+		}
+	}
+
+void CATIO::Write(CATBase* aCompletionClass, const TDesC8& aString)
+	{
+	if (iPortAccess==EPortAccessAllowed)
+		{
+		ClearBuffer();	// assume previous responses fully processed
+		iWriteCommand=aCompletionClass;
+		iWritePending=ETrue;
+		CommWrite(aString);
+		if (aString.Length() > 350)
+			{	
+			LOGTEXT2(_L8("CATIO:\taString too big! Length:%d"), aString.Length());
+			}	
+		else
+			{
+			LOGTEXTREL2(_L8("Tx:\t%S"),&aString);
+			}
+		LOGTEXT(_L8("Queued a Transmission"));
+		}
+	}
+
+TBool CATIO::ReadPending()
+	{
+	return iReadPending;
+	}
+
+void CATIO::Disconnect()
+	{
+	if (iPortAccess == EPortAccessAllowed)
+		{
+		TCommConfig cbuf;
+		TCommConfigV01 &cfg=cbuf();
+		iCommPort.Config(cbuf);
+		cfg.iHandshake = KConfigFreeRTS	| KConfigFreeDTR;
+		TInt ret=iCommPort.SetConfig(cbuf);
+		if (ret == KErrNone)
+			iCommPort.SetSignalsToSpace(KSignalRTS | KSignalDTR);
+		}
+
+	CommClose();
+
+	iPortAccess = EPortAccessDenied;
+	}
+
+void CATIO::Cancel()
+	{
+	LOGTEXT(_L8("CATIO:\tCancel called"));
+	CommCancel();
+	iReadPending = EFalse;
+	iWritePending = EFalse;
+	iChat->StopTimer();
+	}
+
+void CATIO::ReadCancel()
+	{
+	LOGTEXT(_L8("CATIO:\tReadCancel called"));
+	CommReadCancel();
+	iReadPending = EFalse;
+	}
+
+void CATIO::WriteAndTimerCancel(CATBase* aATBase)
+	{
+	if (aATBase==iWriteCommand)
+		{
+		CommWriteCancel();
+		}
+	if (aATBase==iTimeOutCommand)
+		{
+		iChat->StopTimer();
+		}
+	}
+
+
+void CATIO::DropDtr()
+	{
+	if (iPortAccess==EPortAccessAllowed)
+		{
+		LOGTEXT(_L8("CATIO::DropDtr Dropping DTR"));
+		iCommPort.SetSignals(0,KSignalDTR);
+		}
+	}
+
+
+void CATIO::RaiseDTR()
+	{
+	if (iPortAccess==EPortAccessAllowed)
+		{
+		LOGTEXT(_L8("CATIO::RaiseDTR Raising DTR"));
+		iCommPort.SetSignals(KSignalDTR,0);
+		}
+	}
+
+void CATIO::ResetReadAndWriteBuffers()
+	{
+	iCommPort.ResetBuffers();
+	}
+
+TInt CATIO::GetSizeOfRxBuffer()
+	{
+	return iCommPort.QueryReceiveBuffer();
+	}
+
+TUint CATIO::Signals()
+	{
+	return iCommPort.Signals();
+	}
+
+void CATIO::DropRTS()
+	{
+	if (iPortAccess==EPortAccessAllowed)
+		{
+		LOGTEXT(_L8("Dropping RTS"));
+		iCommPort.SetSignals(0,KSignalRTS);
+		}
+	}
+
+void CATIO::RaiseRTS()
+	{
+	if (iPortAccess==EPortAccessAllowed)
+		{
+		LOGTEXT(_L8("Raising RTS"));
+		iCommPort.SetSignals(KSignalRTS,0);
+		}
+	}