telephonyprotocols/csdagt/script/SCOMMAND.CPP
branchopencode
changeset 24 6638e7f4bd8f
parent 0 3553901f7fa8
--- a/telephonyprotocols/csdagt/script/SCOMMAND.CPP	Mon May 03 13:37:20 2010 +0300
+++ b/telephonyprotocols/csdagt/script/SCOMMAND.CPP	Thu May 06 15:10:38 2010 +0100
@@ -1,1397 +1,1397 @@
-// Copyright (c) 2003-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:
-// NetDial Script Commands
-// 
-//
-
-/**
- @file Scommand.cpp 
-*/
-
-#include "SSCRREAD.H"
-#include "SSCREXEC.H"
-#include "SIO.H"
-#include "SLOGGER.H"
-
-// Command names
-
-_LIT(KSetCommand,"SET");
-_LIT(KSendCommand,"SEND");
-_LIT(KWaitCommand,"WAIT");
-_LIT(KLoopCommand,"LOOP");
-_LIT(KGotoCommand,"GOTO");
-_LIT(KExitCommand,"EXIT");
-_LIT(KDTRCommand,"DTR");
-_LIT(KDropDTRCommand,"RAISE");
-_LIT(KRaiseDTRCommand,"DROP");
-_LIT(KReadCommand,"READ");
-_LIT(KCharmapCommand,"CHARMAP");
-_LIT(KTempVarName,"$$TMPVAR$$%d");	//< Temporary variable name
-
-// Characters used in scripts
-
-const TText KCommentChar='!';	
-const TText KPlusChar='+';
-const TText KQuoteChar='\"';
-const TText KOpenChevronChar='<';
-const TText KCloseChevronChar='>';
-const TText KOpenExprChar='{';
-const TText KCloseExprChar='}';
-const TText KEqualsChar='=';
-const TText KTabChar='\t';
-const TText KSpaceChar=' ';
-const TText KColonChar=':';
-const TText KOpenSquareBracketChar='[';
-const TText KCloseSquareBracketChar=']';
-const TInt KLabelArrayGranularity=5;
-const TInt32 KMinScriptInteger=0;
-const TInt32 KMaxScriptInteger=500000;
-const TReal KMinScriptReal=0.0;
-const TReal KMaxScriptReal=500000.0;
-const TInt KMinLoopCounter=1;
-const TInt KMaxLoopCounter=10000;
-
-//
-// Glossary
-// ========
-// String				- a text string enclosed in ".."
-// Character			- a single character expressed numnerically enclosed in <..>
-// Variable				- named variable (preset or set in script) ending in $
-// Expression			- any one of the three above
-// Compound expression	- a number of expressions concatenated with +
-// Token				- an expression, compound expression, label or command
-//
-
-//
-// CScriptCommandBase definitions
-//
-
-CScriptCommandBase::CScriptCommandBase(TScriptStatus& aStatus,CScriptReader* aScriptReader,CScriptVarMan* aVarMan,CScriptCharacterConverter* aCharConv)
-	: iScriptReader(aScriptReader), iVarMan(aVarMan), iCharConv(aCharConv), iTempVarNum(0), iStatus(aStatus)
-/**
-Constructor for CScriptCharacterConverter.
-*/
-	{}
-
-CScriptCommandBase::~CScriptCommandBase()
-/**
-Destructor.
-*/
-	{}
-
-void CScriptCommandBase::ConstructL()
-/**
-Instantiates member variables.
-*/
-	{}
-
-void CScriptCommandBase::Cleanup()
-/**
-Cleanup.
-*/
-	{}
-
-TPtrC CScriptCommandBase::ParseCompoundExpressionL(TInt& aOffset)
-/**
-Parses a compound string expression starting at aOffset into a single string
-constant and returns it.
-*/
-	{
-	TPtrC wholeExpr;
-	wholeExpr.Set(ParseExpressionL(aOffset));
-	TBuf<KMaxVarNameLength> varName;
-	varName.Format(KTempVarName,iTempVarNum++);
-	iVarMan->AddVariableL(varName,wholeExpr);
-	HBufC* val=NULL;
-	HBufC* oldVal=NULL;
-	
-	FOREVER
-		{
-		EatSpaces(aOffset);
-		if (aOffset>=iStatus.iLine.Length())
-			break;
-		if (iStatus.iLine[aOffset]!=KPlusChar)
-			break;
-		TPtrC nextExpr;
-		nextExpr.Set(ParseExpressionL(++aOffset));
-		val=HBufC::NewLC(wholeExpr.Length()+nextExpr.Length());
-		TPtr currentExpr(val->Des());
-		currentExpr.Append(wholeExpr);
-		currentExpr.Append(nextExpr);
-		varName.Format(KTempVarName,iTempVarNum++);
-		iVarMan->AddVariableL(varName,val->Des());
-		CleanupStack::Pop();
-		wholeExpr.Set(val->Des());
-		delete oldVal;
-		oldVal=val;
-		}
-
-	delete val;
-	User::LeaveIfError(iVarMan->FindVariable(varName,wholeExpr));
-	return wholeExpr;
-	}
-
-TPtrC CScriptCommandBase::ParseExpressionL(TInt& aOffset)
-/**
-Parses string expression starting at aOffset according to starting character
-and returns value.
-*/
-	{
-	EatSpaces(aOffset);
-	if(iStatus.iLine.Length()<=aOffset)
-		User::Leave(KErrNoExpression);
-
-	switch(iStatus.iLine[aOffset])		//switch(iLine[aOffset+1])
-		{
-	case KQuoteChar:
-		aOffset++;							// skip quote char
-		return ParseStringL(aOffset);
-	case KOpenChevronChar:
-		aOffset++;							// skip chevron char
-		return ParseCharacterL(aOffset);
-	default:
-		return ParseVariableL(aOffset);
-		}
-	}
-
-TPtrC CScriptCommandBase::ParseStringL(TInt& aOffset)
-/**
-Parses a string constant enclosed in "" and returns its value.
-*/
-	{
-	return ParseEnclosedStringL(aOffset,KQuoteChar,KErrMissingQuote);
-	}
-
-TPtrC CScriptCommandBase::ParseCharacterL(TInt& aOffset)
-/**
-Parses a character enclosed in <> and returns its value.
-*/
-	{
-	TPtrC charString=ParseEnclosedStringL(aOffset,KCloseChevronChar,KErrMissingChevron);
-	TRadix radix=EDecimal;
-	TInt len=charString.Length();
-	if (len>2)
-		{
-		if(charString[0]=='0')
-			{
-			switch(charString[1])
-				{
-			case 'x':
-			case 'X':
-				len-=2;
-				radix=EHex;
-				break;
-			case 'd':
-			case 'D':
-				len-=2;
-				radix=EDecimal;
-				break;
-			case 'o':
-			case 'O':
-				len-=2;
-				radix=EOctal;
-				break;
-			case 'b':
-			case 'B':
-				len-=2;
-				radix=EBinary;
-				break;
-			default:
-				break;
-				}
-			}
-		}
-
-	TLex lex(charString.Right(len));
-	TUint val=0;
-	if (lex.Val(val,radix)!=KErrNone)
-		User::Leave(KErrInvalidNumber);
-	TBuf<1> character=(TText*)&val;
-	TBuf<KMaxVarNameLength> varName;
-	varName.Format(KTempVarName,iTempVarNum++);
-	iVarMan->AddVariableL(varName,character);
-	TPtrC temp;
-	iVarMan->FindVariable(varName,temp);
-	return temp;
-	}
-
-TPtrC CScriptCommandBase::ParseVariableL(TInt& aOffset)
-/**
-Parses a variable and returns its value.
-*/
-	{
-	TInt end=FindTokenEnd(aOffset);
-	TPtrC varName=iStatus.iLine.Mid(aOffset,end-aOffset);
-	aOffset=end;
-	TPtrC varValue;
-	if (iVarMan->FindVariable(varName,varValue)==KErrNotFound)
-		{
-		if(!iStatus.iSkip)
-			User::Leave(KErrVariableNotFound);
-		return TPtrC();
-		}
-	return varValue;
-	}
-
-TInt32 CScriptCommandBase::ParseIntegerL(TInt& aOffset)
-/**
-Parses an integer and returns its value.
-*/
-	{
-	EatSpaces(aOffset);
-	TLex lex(iStatus.iLine);
-	lex.Inc(aOffset);
-	TInt32 val=0;
-	
-	if (lex.Val(val)!=KErrNone)
-		{
-		User::Leave(KErrInvalidNumber);
-		return KMinScriptInteger;
-		}
-
-	if ((val<KMinScriptInteger) || (val>KMaxScriptInteger))
-		{
-		User::Leave(KErrNumberOutOfRange);
-		return KMinScriptInteger;
-		}
-
-	aOffset=lex.Offset();
-	return val;
-	}
-
-TReal CScriptCommandBase::ParseRealL(TInt& aOffset)
-/**
-Parses a real number and returns its value.
-*/
-	{
-	EatSpaces(aOffset);
-	TLex lex(iStatus.iLine);
-	lex.Inc(aOffset);
-	TReal val=0.0;
-
-	if (lex.Val(val)!=KErrNone)
-		{	
-		User::Leave(KErrInvalidNumber);
-		return KMinScriptReal;
-		}
-	if ((val<KMinScriptReal) || (val>KMaxScriptReal))
-		{
-		User::Leave(KErrNumberOutOfRange);
-		return KMinScriptReal;
-		}
-
-	aOffset=lex.Offset();
-	return val;
-	}
-
-TPtrC CScriptCommandBase::ParseCharacterTypeL(TInt& aOffset)
-/**
-Parses character type.
-*/
-	{
-	EatSpaces(aOffset);
-
-	if(iStatus.iLine.Length()<=aOffset)		// nothing specified so assume default
-		return TPtrC();
-
-	TInt startChar=aOffset;
-	if (iStatus.iLine[startChar++]!=KOpenSquareBracketChar)
-		return TPtrC();				// No open bracket so assume default
-
-	aOffset=startChar;
-	return ParseEnclosedStringL(aOffset,KCloseSquareBracketChar,KErrMissingBracket);
-	}
-
-HBufC8* CScriptCommandBase::ConvertLC(const TDesC& aString,TInt& aOffset)
-/**
-Converts to correct character set.
-*/
-	{
-	TBuf<KMaxCharacterTypeLength> type=ParseCharacterTypeL(aOffset);
-	return iCharConv->ConvertLC(aString,type);
-	}
-
-TInt CScriptCommandBase::FindTokenEnd(TInt aOffset)
-/**
-Finds end of string beginning at aOffset and returns length.
-*/
-	{
-	__ASSERT_DEBUG(aOffset<=iStatus.iLine.Length(), NetDialPanic(EOffsetExceedsLineLength));
-
-	if(aOffset==iStatus.iLine.Length())
-		return aOffset;
-
-	TInt end;
-	for (end=aOffset; IsValidChar(iStatus.iLine[end]); end++)
-		{
-		if (end>=(iStatus.iLine.Length()-1))
-			{
-			end++;
-			break;
-			}
-		}
-	return end;
-	}
-
-TBool CScriptCommandBase::IsValidChar(const TText& aChar)
-/**
-Checks if aChar is a valid character in a script command.
-*/
-	{
-	return TChar(aChar).IsAlphaDigit() || (aChar==KDollarChar) || (aChar==KUnderscoreChar) || (aChar==KCommentChar);
-	}
-
-void CScriptCommandBase::EatSpaces(TInt& aOffset)
-/**
-Ignores spaces, tabs, line feeds and carriage returns and sets aOffset to 
-next non-blank character, or end of line
-*/
-	{
-	if(aOffset>=iStatus.iLine.Length())
-		return;
-
-	while((iStatus.iLine[aOffset]==KSpaceChar) || (iStatus.iLine[aOffset]==KTabChar) || (iStatus.iLine[aOffset]==KLineFeed) || (iStatus.iLine[aOffset]==KCarriageReturn))
-		{
-		aOffset++;
-		if(aOffset>=iStatus.iLine.Length())
-			break;
-		}
-	}
-
-void CScriptCommandBase::EatSpacesAndLinesL()
-/**
-Ignores spaces and empty lines and sets aOffset to next non-blank character.
-*/
-	{
-	EatSpaces(iStatus.iOffset);
-	while(iStatus.iOffset>=iStatus.iLine.Length())
-		{
-		User::LeaveIfError(iScriptReader->GetNextLine());		// This also resets iStatus.iOffset
-		EatSpaces(iStatus.iOffset);
-		}	
-	}
-
-void CScriptCommandBase::EatSpacesAndLinesAndCommentsL()
-/**
-Ignores spaces, empty lines and comments and sets aOffset to next non-blank or 
-non-comment character
-*/
-	{
-	EatSpacesAndLinesL();
-	while (iStatus.iLine[iStatus.iOffset]==KCommentChar)
-		{
-		iStatus.iOffset=iStatus.iLine.Length();
-		EatSpacesAndLinesL();		// this will reset iStatus.iOffset if necessary
-		}
-	}	
-
-TPtrC CScriptCommandBase::ParseEnclosedStringL(TInt& aOffset,TText aChar,TInt aError)
-/**
-Parses enclosed string
-*/
-	{
-	if(aOffset>=iStatus.iLine.Length())
-		User::Leave(aError);			// no end character before EOL
-	
-	TInt end=aOffset;
-	while (end<iStatus.iLine.Length())
-		{
-		if (iStatus.iLine[end]==aChar)
-			break;
-		end++;
-		}
-
-	if (end>=iStatus.iLine.Length())
-		User::Leave(aError);			// no end character before EOL
-
-	TInt start=aOffset;
-	aOffset=end+1;
-	return iStatus.iLine.Mid(start,end-start);
-	}
-
-//
-// CSetCommand definitions
-//
-
-CSetCommand* CSetCommand::NewL(TScriptStatus& aScriptStatus,CScriptReader* aScriptReader,CScriptVarMan* aVarMan,CScriptCharacterConverter* aCharConv)
-/**
-2 phased constructor for CSetCommand, first phase.
-
-@param aScriptStatus is script status.
-@param aScriptReader a pointer to script reader.
-@param aVarMan a pointer to variable manager.
-@param aCharConv a pointer to script character converter.
-@exception Leaves if ConstructL() leaves, or not enough memory is available.
-@return a new CSetCommand object.
-*/
-	{
-	CSetCommand* c=new(ELeave) CSetCommand(aScriptStatus,aScriptReader,aVarMan,aCharConv);
-	CleanupStack::PushL(c);
-	c->ConstructL();
-	CleanupStack::Pop();
-	return c;
-	}
-
-CSetCommand::CSetCommand(TScriptStatus& aScriptStatus,CScriptReader* aScriptReader,CScriptVarMan* aVarMan,CScriptCharacterConverter* aCharConv)
-	: CScriptCommandBase(aScriptStatus,aScriptReader,aVarMan,aCharConv)
-/**
-Constructor for CSetCommand, used in the first phase of construction.
-
-@param aScriptStatus is script status.
-@param aScriptReader a pointer to script reader.
-@param aVarMan a pointer to variable manager.
-@param aCharConv a pointer to script character converter.
-*/
-	{}
-
-CSetCommand::~CSetCommand()
-/**
-Destructor.
-*/
-	{}
-
-TBool CSetCommand::ParseL()
-/**
-Parses a SET command. Determines variable name and value and adds to variable list.
-*/
-	{
-	EatSpacesAndLinesAndCommentsL();
-	TInt end=FindTokenEnd(iStatus.iOffset);
-	if (iStatus.iLine.Mid(iStatus.iOffset,end-iStatus.iOffset).CompareF(KSetCommand)==KErrNone)
-		{
-		if (!iStatus.iSkip)
-			{
-			__FLOG_STMT(_LIT8(KLogStringExecutingSet,"Script:\tExecuting Set");)
-			__FLOG_STATIC(KNetDialLogFolder(),KNetDialLogFile(),KLogStringExecutingSet());
-			}
-		iStatus.iOffset=end;
-		EatSpaces(iStatus.iOffset);
-		end=FindTokenEnd(iStatus.iOffset);
-		TPtrC varName=iStatus.iLine.Mid(iStatus.iOffset,end-iStatus.iOffset);
-		EatSpaces(end);
-		if (iStatus.iLine[end++]!=KEqualsChar)
-			User::Leave(KErrNoEquals);
-		EatSpaces(end);
-		TPtrC value=ParseCompoundExpressionL(end);
-		if (!iStatus.iSkip)
-			{
-			iVarMan->AddVariableL(varName,value);
-			__FLOG_STMT(_LIT(KLogStringSetVar,"Script:\tSet Var: %S  To %S"));
-			__FLOG_STATIC2(KNetDialLogFolder(),KNetDialLogFile(),TRefByValue<const TDesC>(KLogStringSetVar()),&varName,&value);
-			}
-		iStatus.iOffset=end;
-		return ETrue;		// Consumed
-		}
-	return EFalse;			// Not Consumed
-	}
-
-//
-// CSendCommand definitions
-//
-
-CSendCommand* CSendCommand::NewL(TScriptStatus& aScriptStatus,CScriptReader* aScriptReader,CScriptVarMan* aVarMan,CScriptCharacterConverter* aCharConv,CScriptIO* aScriptIO)
-/**
-2 phased constructor for CSendCommand, first phase.
-
-@param aScriptStatus is script status.
-@param aScriptReader a pointer to script reader.
-@param aVarMan a pointer to variable manager.
-@param aCharConv a pointer to script character converter.
-@param aScriptIO a pointer to serial comms I/O handler.
-@exception Leaves if ConstructL() leaves, or not enough memory is available.
-@return a new CSendCommand object.
-*/
-	{
-	CSendCommand* c=new(ELeave) CSendCommand(aScriptStatus,aScriptReader,aVarMan,aCharConv,aScriptIO);
-	CleanupStack::PushL(c);
-	c->ConstructL();
-	CleanupStack::Pop();
-	return c;
-	}
-
-CSendCommand::CSendCommand(TScriptStatus& aScriptStatus,CScriptReader* aScriptReader,CScriptVarMan* aVarMan,CScriptCharacterConverter* aCharConv,CScriptIO* aScriptIO)
-	: CScriptCommandBase(aScriptStatus,aScriptReader,aVarMan,aCharConv), iScriptIO(aScriptIO)
-/**
-Constructor for CSendCommand, used in the first phase of construction.
-
-@param aScriptStatus is script status.
-@param aScriptReader a pointer to script reader.
-@param aVarMan a pointer to variable manager.
-@param aCharConv a pointer to script character converter.
-@param aScriptIO a pointer to serial comms I/O handler.
-*/
-	{}
-
-CSendCommand::~CSendCommand()
-/**
-Destructor.
-*/
-	{}
-
-TBool CSendCommand::ParseL()
-/**
-Parses SEND command.  Parses expression to send and sends it.
-*/
-	{
-	EatSpacesAndLinesAndCommentsL();
-	TInt end=FindTokenEnd(iStatus.iOffset);
-	if(iStatus.iLine.Mid(iStatus.iOffset,end-iStatus.iOffset).CompareF(KSendCommand)==0)
-		{
-		if(!iStatus.iSkip)
-			{
-			__FLOG_STMT(_LIT8(KLogStringExecutingSend,"Script:\tExecuting Send");)
-			__FLOG_STATIC(KNetDialLogFolder(),KNetDialLogFile(),KLogStringExecutingSend());
-			}
-		iStatus.iOffset=end;
-		EatSpaces(iStatus.iOffset);
-		TPtrC temp;
-		temp.Set(ParseCompoundExpressionL(iStatus.iOffset));
-		HBufC8* buf=ConvertLC(temp,iStatus.iOffset);
-		iSendString.Set(buf->Des());
-		if(!iStatus.iSkip)
-			{
-			iScriptIO->Write(iSendString);
-#ifdef __FLOG_ACTIVE
-			_LIT(KLogStringSending,"Script:\tSending %S");
-			TBuf16<KLogBufferSize> temp;
-			temp.Copy(iSendString.Left(Min(iSendString.Length(),KLogBufferSize)));
-			__FLOG_STATIC1(KNetDialLogFolder(),KNetDialLogFile(),TRefByValue<const TDesC>(KLogStringSending()),&temp);
-#endif
-			}
-		CleanupStack::PopAndDestroy();
-		return ETrue;		// Consumed
-		}
-	return EFalse;			// Not Consumed
-	}
-
-//
-// CLabelSearch definitions
-//
-
-CLabelSearch* CLabelSearch::NewLC(const TDesC& aLabelName)
-/**
-2 phased constructor for CLabelSearch, first phase.
-
-@param aLabelName is label name.
-@exception Leaves if ConstructL() leaves, or not enough memory is available.
-@return a new CLabelSearch object.
-*/
-	{
-	CLabelSearch* label=new(ELeave) CLabelSearch();
-	CleanupStack::PushL(label);
-	label->ConstructL(aLabelName);
-	return label;
-	}
-
-CLabelSearch::CLabelSearch()
-	: iStatus(ENotFound), iPosition()
-/**
-Constructor for CLabelSearch, used in the first phase of construction.
-*/
-	{}
-
-void CLabelSearch::ConstructL(const TDesC& aLabelName)
-/**
-Instantiates member variables.
-*/
-	{
-	iChatString=NULL;
-	iLabelName=HBufC::NewL(aLabelName.Length());
-	(*iLabelName)=aLabelName;
-	}
-
-CLabelSearch::~CLabelSearch()
-/**
-Destructor.
-Don't delete iChatString - that is dealt with by CScriptIO.
-*/
-	{
-	delete iLabelName;
-	}
-
-void CLabelSearch::CreateCommChatStringL(const TDesC8& aDes,TBool aIsFolded)
-/**
-Creates CCommChatString object.
-*/
-	{
-	iChatString=CCommChatString::NewL(aDes,aIsFolded);
-	}
-
-//
-// CWaitCommand definitions
-//
-
-CWaitCommand* CWaitCommand::NewL(TScriptStatus& aScriptStatus,CScriptReader* aScriptReader,CScriptVarMan* aVarMan,CScriptCharacterConverter* aCharConv,CScriptIO* aScriptIO,CScriptLabelMan* aLabelMan, CScriptExecutor* aScriptExec)
-/**
-2 phased constructor for CWaitCommand, first phase.
-
-@param aScriptStatus is script status.
-@param aScriptReader a pointer to script reader.
-@param aVarMan a pointer to variable manager.
-@param aCharConv a pointer to script character converter.
-@param aScriptIO a pointer to serial comms I/O handler.
-@param aLabelMan a pointer to label manager.
-@exception Leaves if ConstructL() leaves, or not enough memory is available.
-@return a new CWaitCommand object.
-*/
-	{
-	CWaitCommand* c=new(ELeave) CWaitCommand(aScriptStatus,aScriptReader,aVarMan,aCharConv,aScriptIO,aLabelMan,aScriptExec);
-	CleanupStack::PushL(c);
-	c->ConstructL();
-	CleanupStack::Pop();
-	return c;
-	}
-
-CWaitCommand::CWaitCommand(TScriptStatus& aScriptStatus,CScriptReader* aScriptReader,CScriptVarMan* aVarMan,CScriptCharacterConverter* aCharConv,CScriptIO* aScriptIO,CScriptLabelMan* aLabelMan, CScriptExecutor* aScriptExec)
-	: CScriptCommandBase(aScriptStatus,aScriptReader,aVarMan,aCharConv), iScriptIO(aScriptIO), iLabelMan(aLabelMan), iScriptExec(aScriptExec)
-/**
-Constructor for CWaitCommand, used in the first phase of construction.
-
-@param aScriptStatus is script status.
-@param aScriptReader a pointer to script reader.
-@param aVarMan a pointer to variable manager.
-@param aCharConv a pointer to script character converter.
-@param aScriptIO a pointer to serial comms I/O handler.
-@param aLabelMan a pointer to label manager.
-*/
-	{}
-
-CWaitCommand::~CWaitCommand()
-/**
-Destructor.
-Clears label array.
-*/
-	{
-	DeleteLabelArray();
-	}
-
-TBool CWaitCommand::ParseL()
-/**
-Parses WAIT command. Parse according to whether in skip mode or not.
-*/
-	{
-	EatSpacesAndLinesAndCommentsL();
-	TInt end=FindTokenEnd(iStatus.iOffset);
-	if (iStatus.iLine.Mid(iStatus.iOffset,end-iStatus.iOffset).CompareF(KWaitCommand)==KErrNone)
-		{
-		iStatus.iOffset=end;
-		if (iStatus.iSkip)
-			ParseSkipL();
-		else
-			ParseActionL();
-		return ETrue;				// Consumed
-		}
-	return EFalse;					// Not Consumed
-	}
-
-void CWaitCommand::Cleanup()
-/**
-Cancels the read and clears out the labels
-*/
-	{
-	if (!iStatus.iSkip)
-		{
-		iScriptIO->Cancel();
-		DeleteLabelArray();
-		iLabelArray=NULL;
-		}
-	}
-
-void CWaitCommand::ParseActionL()
-/**
-Parses WAIT command when not in skip mode.  Parses wait period, strings and labels and 
-queue a read.
-*/
-	{
-	__FLOG_STMT(_LIT8(KLogStringExecutingWait,"Script:\tExecuting Wait");)
-	__FLOG_STATIC(KNetDialLogFolder(),KNetDialLogFile(),KLogStringExecutingWait());
-	EatSpaces(iStatus.iOffset);
-	TReal waitPeriod=ParseRealL(iStatus.iOffset);
-	EatSpacesAndLinesAndCommentsL();
-	if (iStatus.iLine[iStatus.iOffset++]!=KOpenExprChar)
-		User::Leave(KErrNoOpenExpression);
-
-	iLabelArray=new(ELeave) CLabelSearchArray(KLabelArrayGranularity);
-	TBool completed=EFalse;
-	while(!completed)
-		{
-		EatSpacesAndLinesAndCommentsL();
-		if (iStatus.iLine[iStatus.iOffset]==KCloseExprChar)
-			{
-			completed=ETrue;
-			iStatus.iOffset++;
-			}
-		else
-			{
-			TPtrC temp=ParseCompoundExpressionL(iStatus.iOffset);
-			HBufC8* buf=ConvertLC(temp,iStatus.iOffset);
-			CLabelSearch* label=ParseLabelLC();
-			TPtrC8 waitString(buf->Des());	
-			label->CreateCommChatStringL(waitString,EFalse);
-			iLabelArray->AppendL(label);
-			// for logging
-			TBuf<KLogBufferSize> labelName;
-			labelName.Copy(label->LabelName().Left(Min(KLogBufferSize,label->LabelName().Length())));
-			//
-#ifdef __FLOG_ACTIVE
-			_LIT(KLogStringGog,"Script:\tIf %S is found, Goto %S");
-			TBuf16<KLogBufferSize> string;
-			string.Copy(waitString.Left(Min(waitString.Length(),KLogBufferSize)));
-			__FLOG_STATIC2(KNetDialLogFolder(),KNetDialLogFile(),TRefByValue<const TDesC>(KLogStringGog()),&string,&labelName);
-#endif
-			CleanupStack::Pop();			// label - will be deleted from array
-			CleanupStack::PopAndDestroy();	// buf - will have been copied into label array
-			}			
-		}
-	// Tell the script executor how long we are going to wait since it
-	// may need to force the server to resend the login prompt and will
-	// need to know how long to wait the second time around
-	iScriptExec->SetRetransmittedLoginTimeout(waitPeriod);
-	iScriptIO->Read(iLabelArray,waitPeriod);
-	}
-
-void CWaitCommand::ParseSkipL()
-/**
-Parses a WAIT command when in skip mode. Parses expressions and labels but do not queue read.
-*/
-	{
-	EatSpaces(iStatus.iOffset);
-	ParseRealL(iStatus.iOffset);					// ignore the actual value returned
-	EatSpacesAndLinesAndCommentsL();
-	if (iStatus.iLine[iStatus.iOffset++]!=KOpenExprChar)
-		User::Leave(KErrNoOpenExpression);
-
-	TBool completed=EFalse;
-	while (!completed)
-		{
-		EatSpacesAndLinesAndCommentsL();
-		if (iStatus.iLine[iStatus.iOffset]==KCloseExprChar)
-			{
-			completed=ETrue;
-			iStatus.iOffset++;
-			}
-		else
-			{
-			ParseCompoundExpressionL(iStatus.iOffset);			// ignore the return value in skip mode
-			ParseLabelLC();
-			CleanupStack::PopAndDestroy();				// ignore the label returned
-			}
-		}
-	}
-
-CLabelSearch* CWaitCommand::ParseLabelLC()
-/**
-Parses label.  Parses label name and looks for it in the label list.
-Returns results of search.
-*/
-	{
-	EatSpaces(iStatus.iOffset);
-	TInt start=iStatus.iOffset;
-	iStatus.iOffset=FindTokenEnd(start);
-	TPtrC var=iStatus.iLine.Mid(start,iStatus.iOffset-start);
-	CLabelSearch* labelSearch=CLabelSearch::NewLC(var);
-	TLinePosition pos;
-	if(iLabelMan->FindLabel(var,pos)==KErrNotFound)
-		{
-		pos.Reset();
-		labelSearch->Set(CLabelSearch::ENotFound,pos);
-		}
-	else
-		labelSearch->Set(CLabelSearch::EResolved,pos);
-	return labelSearch;
-	}
-
-TPtrC CWaitCommand::LabelFromIndexL(TInt aIndex)
-/**
-Gets label from array by index.
-*/
-	{
-	if ((aIndex<0) && (aIndex>iLabelArray->Count()))
-		User::Leave(KErrIllegalWaitLabelIndex);
-	return (*iLabelArray)[aIndex]->LabelName();
-	}
-
-void CWaitCommand::DeleteLabelArray()
-/**
-Deletes label array.
-*/
-	{
-	if (iLabelArray!=NULL)
-		{
-		TInt count=iLabelArray->Count();
-		for(TInt i=0; i<count; i++)
-			{
-			delete (*iLabelArray)[i];
-			}
-		iLabelArray->Delete(0,count);
-		delete iLabelArray;
-		}
-	}
-	
-//
-// CLoopCommand definitions
-//
-
-CLoopCommand* CLoopCommand::NewL(TScriptStatus& aScriptStatus,CScriptReader* aScriptReader,CScriptVarMan* aVarMan,CScriptCharacterConverter* aCharConv)
-/**
-2 phased constructor for CLoopCommand, first phase.
-
-@param aScriptStatus is script status.
-@param aScriptReader a pointer to script reader.
-@param aVarMan a pointer to variable manager.
-@param aCharConv a pointer to script character converter.
-@exception Leaves if ConstructL() leaves, or not enough memory is available.
-@return a new CLoopCommand object.
-*/
-	{
-	CLoopCommand* c=new(ELeave) CLoopCommand(aScriptStatus,aScriptReader,aVarMan,aCharConv);
-	CleanupStack::PushL(c);
-	c->ConstructL();
-	CleanupStack::Pop();
-	return c;
-	}
-
-CLoopCommand::CLoopCommand(TScriptStatus& aScriptStatus,CScriptReader* aScriptReader,CScriptVarMan* aVarMan,CScriptCharacterConverter* aCharConv)
-	: CScriptCommandBase(aScriptStatus,aScriptReader,aVarMan,aCharConv), iLoop(EFalse)
-/**
-Constructor for CLoopCommand, used in the first phase of construction.
-
-@param aScriptStatus is script status.
-@param aScriptReader a pointer to script reader.
-@param aVarMan a pointer to variable manager.
-@param aCharConv a pointer to script character converter.
-*/
-	{}
-
-CLoopCommand::~CLoopCommand()
-/**
-Destructor.
-*/
-	{}
-
-TBool CLoopCommand::ParseL()
-/**
-Parses LOOP command. Checks how many times to loop and records position of beginning of loop.
-*/
-	{
-	EatSpacesAndLinesAndCommentsL();
-	TInt end=FindTokenEnd(iStatus.iOffset);
-	if (iStatus.iLine.Mid(iStatus.iOffset,end-iStatus.iOffset).CompareF(KLoopCommand)==KErrNone)
-		{
-		if (iLoop)
-			User::Leave(KErrNestedLoop);
-		if (!iStatus.iSkip)
-			{
-			__FLOG_STMT(_LIT8(KLogStringExecutingLoop,"Script:\tExecuting Loop");)
-			__FLOG_STATIC(KNetDialLogFolder(),KNetDialLogFile(),KLogStringExecutingLoop());
-			}
-		iStatus.iOffset=end;
-		EatSpaces(iStatus.iOffset);
-		iLoopCounter=ParseIntegerL(iStatus.iOffset);
-		if ((iLoopCounter<KMinLoopCounter) || (iLoopCounter>KMaxLoopCounter))
-			User::Leave(KErrLoopCounterOutOfRange);
-		EatSpacesAndLinesAndCommentsL();
-		if (iStatus.iLine[iStatus.iOffset++]!=KOpenExprChar)
-			User::Leave(KErrNoOpenExpression);
-		iLoop=ETrue;
-		iScriptReader->CurrentPos(iLoopPosition,iStatus.iOffset);
-		if (!iStatus.iSkip)
-			{
-			__FLOG_STMT(_LIT(KLogStringLoopCounter,"Script:\tLoop Counter %d");)
-			__FLOG_STATIC1(KNetDialLogFolder(),KNetDialLogFile(),KLogStringLoopCounter(),iLoopCounter);
-			}
-		return ETrue;		// Consumed
-		}
-	return EFalse;			// Not Consumed
-	}
-
-TBool CLoopCommand::CheckLoopL()
-/**
-Checks how many times loop has been executed and returns to beginning if necessary.
-*/
-	{
-	if (iLoop)
-		{
-		EatSpacesAndLinesAndCommentsL();
-		if(iStatus.iLine[iStatus.iOffset]==KCloseExprChar)
-			{
-			if((--iLoopCounter==0) || (iStatus.iSkip))
-				{
-				iLoop=EFalse;
-				iStatus.iOffset++;
-				}
-			else
-				{
-				iScriptReader->SetCurrentPos(iLoopPosition);
-				__FLOG_STMT(_LIT8(logString1,"Script:\tRepeat Loop");)
-				__FLOG_STATIC(KNetDialLogFolder(),KNetDialLogFile(),logString1());
-				__FLOG_STMT(_LIT8(logString2,"Script:\tLoop Counter %d");)
-				__FLOG_STATIC1(KNetDialLogFolder(),KNetDialLogFile(),logString2(),iLoopCounter);
-				}
-			return ETrue;				// Consumed Something
-			}
-		}
-	return EFalse;						// Nothing doing...
-	}
-
-//
-// CGotoCommand definitions
-//
-
-CGotoCommand* CGotoCommand::NewL(TScriptStatus& aScriptStatus,CScriptReader* aScriptReader,CScriptVarMan* aVarMan,CScriptCharacterConverter* aCharConv,CScriptLabelMan* aLabelMan)
-/**
-2 phased constructor for CGotoCommand, first phase.
-
-@param aScriptStatus is script status.
-@param aScriptReader a pointer to script reader.
-@param aVarMan a pointer to variable manager.
-@param aCharConv a pointer to script character converter.
-@param aLabelMan a pointer to label manager.
-@exception Leaves if ConstructL() leaves, or not enough memory is available.
-@return a new CGotoCommand object.
-*/	
-	{
-	CGotoCommand* c=new(ELeave) CGotoCommand(aScriptStatus,aScriptReader,aVarMan,aCharConv,aLabelMan);
-	CleanupStack::PushL(c);
-	c->ConstructL();
-	CleanupStack::Pop();
-	return c;
-	}
-
-CGotoCommand::CGotoCommand(TScriptStatus& aScriptStatus,CScriptReader* aScriptReader,CScriptVarMan* aVarMan,CScriptCharacterConverter* aCharConv,CScriptLabelMan* aLabelMan)
-	: CScriptCommandBase(aScriptStatus,aScriptReader,aVarMan,aCharConv), iLabelMan(aLabelMan)
-/**
-Constructor for CGotoCommand, used in the first phase of construction.
-
-@param aScriptStatus is script status.
-@param aScriptReader a pointer to script reader.
-@param aVarMan a pointer to variable manager.
-@param aCharConv a pointer to script character converter.
-@param aLabelMan a pointer to label manager.
-*/
-	{}
-
-CGotoCommand::~CGotoCommand()
-/**
-Destructor.
-*/
-	{}
-
-TBool CGotoCommand::ParseL()
-/**
-Parses GOTO command. Parses label and goto label.
-*/
-	{
-	EatSpacesAndLinesAndCommentsL();
-	TInt end=FindTokenEnd(iStatus.iOffset);
-	if (iStatus.iLine.Mid(iStatus.iOffset,end-iStatus.iOffset).CompareF(KGotoCommand)==KErrNone)
-		{
-		if(!iStatus.iSkip)
-			{
-			__FLOG_STMT(_LIT8(logString,"Script:\tExecuting Goto");)
-			__FLOG_STATIC(KNetDialLogFolder(),KNetDialLogFile(),logString());
-			}
-		iStatus.iOffset=end;
-		EatSpaces(iStatus.iOffset);
-		end=FindTokenEnd(iStatus.iOffset);
-		TPtrC var=iStatus.iLine.Mid(iStatus.iOffset,end-iStatus.iOffset);
-	//	HBufC* labelName=HBufC::NewLC(var.Length());
-	//	(*labelName)=var;
-	//	GotoL(labelName->Des());
-	//	CleanupStack::PopAndDestroy();
-		Goto(var);
-		iStatus.iOffset=end;
-		return ETrue;		// Consumed
-		}
-	return EFalse;			// Not Consumed
-	}
-
-void CGotoCommand::Goto(const TDesC& aLabelName)
-/**
-Finds label in those passed already, or skip lines until it is found.
-*/
-	{
-	TLinePosition pos;
-	if(!iStatus.iSkip)
-		{
-		if (iLabelMan->FindLabel(aLabelName,pos)==KErrNotFound)
-			{
-			iSearchName.Copy(aLabelName);
-			iStatus.iSkipModeToggleReq=ETrue;
-			__FLOG_STMT(_LIT(logString1,"Script:\tSearching for Label %S");)
-			__FLOG_STATIC1(KNetDialLogFolder(),KNetDialLogFile(),TRefByValue<const TDesC>(logString1()),&aLabelName);
-			__FLOG_STMT(_LIT8(logString2,"Script:\tEntering Skip Mode");)
-			__FLOG_STATIC(KNetDialLogFolder(),KNetDialLogFile(),logString2());
-			}
-		else
-			iScriptReader->SetCurrentPos(pos);
-		}
-	}
-
-TBool CGotoCommand::ParseLabelL()
-/**
-Parses label and adds it to label list. Compares label against one to be found.
-*/
-	{
-	EatSpacesAndLinesAndCommentsL();
-	TInt start=iStatus.iOffset;
-	TInt end=FindTokenEnd(start);
-	if ((iStatus.iLine.Length()>=(end+1)) && (iStatus.iLine[end]==KColonChar))
-		{
-		TLinePosition pos;
-		iScriptReader->CurrentPos(pos,end+1);
-		iLabelMan->AddLabelL(iStatus.iLine.Mid(start,end-start),pos);
-		iStatus.iOffset=++end;
-		TLinePosition dummyPos;
-		if (iStatus.iSkip && (iLabelMan->FindLabel(iSearchName,dummyPos)==KErrNone))
-			{
-			iStatus.iSkipModeToggleReq=ETrue;
-			__FLOG_STMT(_LIT8(logString,"Script:\tExiting Skip Mode");)
-			__FLOG_STATIC(KNetDialLogFolder(),KNetDialLogFile(),logString());
-			}
-		return ETrue;
-		}
-	return EFalse;
-	}
-
-void CGotoCommand::ServiceSkipReqs()
-/**
-Toggles skip mode.
-*/
-	{
-	if(iStatus.iSkipModeToggleReq)
-		{
-		iStatus.iSkipModeToggleReq=EFalse;
-		iStatus.iSkip=!iStatus.iSkip;
-		}
-	}
-
-//
-// CDTRCommand definitions
-//
-
-CDTRCommand* CDTRCommand::NewL(TScriptStatus& aScriptStatus,CScriptReader* aScriptReader,CScriptVarMan* aVarMan,CScriptCharacterConverter* aCharConv,CScriptIO* aScriptIO)
-/**
-2 phased constructor for CDTRCommand, first phase.
-
-@param aScriptStatus is script status.
-@param aScriptReader a pointer to script reader.
-@param aVarMan a pointer to variable manager.
-@param aCharConv a pointer to script character converter.
-@param aScriptIO a pointer to serial comms I/O handler.
-@exception Leaves if ConstructL() leaves, or not enough memory is available.
-@return a new CDTRCommand object.
-*/
-	{
-	CDTRCommand* c=new(ELeave) CDTRCommand(aScriptStatus,aScriptReader,aVarMan,aCharConv,aScriptIO);
-	CleanupStack::PushL(c);
-	c->ConstructL();
-	CleanupStack::Pop();
-	return c;
-	}
-
-CDTRCommand::CDTRCommand(TScriptStatus& aScriptStatus,CScriptReader* aScriptReader,CScriptVarMan* aVarMan,CScriptCharacterConverter* aCharConv,CScriptIO* aScriptIO)
-	: CScriptCommandBase(aScriptStatus,aScriptReader,aVarMan,aCharConv), iScriptIO(aScriptIO)
-/**
-Constructor for CDTRCommand, used in the first phase of construction.
-
-@param aScriptStatus is script status.
-@param aScriptReader a pointer to script reader.
-@param aVarMan a pointer to variable manager.
-@param aCharConv a pointer to script character converter.
-@param aScriptIO a pointer to serial comms I/O handler.
-*/
-	{}
-
-CDTRCommand::~CDTRCommand()
-/**
-Destructor.
-*/
-	{}
-
-TBool CDTRCommand::ParseL()
-/**
-Parses DTR command. Drops or raises appropriately.
-*/
-	{
-	EatSpacesAndLinesAndCommentsL();
-	TInt end=FindTokenEnd(iStatus.iOffset);
-	if (iStatus.iLine.Mid(iStatus.iOffset,end-iStatus.iOffset).CompareF(KDTRCommand)==KErrNone)
-		{
-		if(!iStatus.iSkip)
-			{
-			__FLOG_STMT(_LIT8(logString1,"Script:\tExecuting DTR");)
-			__FLOG_STATIC(KNetDialLogFolder(),KNetDialLogFile(),logString1());
-			}
-		iStatus.iOffset=end;
-		EatSpaces(iStatus.iOffset);
-		end=FindTokenEnd(iStatus.iOffset);
-		if (iStatus.iLine.Mid(iStatus.iOffset,end-iStatus.iOffset).CompareF(KRaiseDTRCommand)==KErrNone)
-			{
-			if(!iStatus.iSkip)
-				{
-				__FLOG_STMT(_LIT8(logString2,"Script:\tRaising DTR");)
-				__FLOG_STATIC(KNetDialLogFolder(),KNetDialLogFile(),logString2());
-				iScriptIO->RaiseDTR(NULL);
-				}	
-			}
-		else if (iStatus.iLine.Mid(iStatus.iOffset,end-iStatus.iOffset).CompareF(KDropDTRCommand)==KErrNone)
-			{
-			if(!iStatus.iSkip)
-				{
-				__FLOG_STMT(_LIT8(logString3,"Script:\tDropping DTR");)
-				__FLOG_STATIC(KNetDialLogFolder(),KNetDialLogFile(),logString3());
-				iScriptIO->DropDTR(NULL);
-				}	
-			}
-		else
-			User::Leave(KErrNoDropOrRaise);
-		iStatus.iOffset=end;
-		return ETrue;		// Consumed
-		}
-	return EFalse;			// Not Consumed
-	}
-
-//
-// CReadPCTCommand definitions
-//
-
-CReadPCTCommand* CReadPCTCommand::NewL(TScriptStatus& aScriptStatus,CScriptReader* aScriptReader,CScriptVarMan* aVarMan,CScriptCharacterConverter* aCharConv,CScriptExecutor* aScriptExec)
-/**
-2 phased constructor for CReadPCTCommand, first phase.
-
-@param aScriptStatus is script status.
-@param aScriptReader a pointer to script reader.
-@param aVarMan a pointer to variable manager.
-@param aCharConv a pointer to script character converter.
-@param aScriptExec a pointer to script executioner.
-@exception Leaves if ConstructL() leaves, or not enough memory is available.
-@return a new CReadPCTCommand object.
-*/
-	{
-	CReadPCTCommand* c=new(ELeave) CReadPCTCommand(aScriptStatus,aScriptReader,aVarMan,aCharConv,aScriptExec);
-	CleanupStack::PushL(c);
-	c->ConstructL();
-	CleanupStack::Pop();
-	return c;
-	}
-
-CReadPCTCommand::CReadPCTCommand(TScriptStatus& aScriptStatus,CScriptReader* aScriptReader,CScriptVarMan* aVarMan,CScriptCharacterConverter* aCharConv,CScriptExecutor* aScriptExec)
-	: CScriptCommandBase(aScriptStatus,aScriptReader,aVarMan,aCharConv), iScriptExec(aScriptExec)
-/**
-Constructor for CDTRCommand, used in the first phase of construction.
-
-@param aScriptStatus is script status.
-@param aScriptReader a pointer to script reader.
-@param aVarMan a pointer to variable manager.
-@param aCharConv a pointer to script character converter.
-@param aScriptExec a pointer to script executioner.
-*/
-	{}
-
-CReadPCTCommand::~CReadPCTCommand()
-/**
-Destructor.
-*/
-	{}
-
-TBool CReadPCTCommand::ParseL()
-/**
-Parses Read command.
-*/
-	{
-	EatSpacesAndLinesAndCommentsL();
-	TInt end=FindTokenEnd(iStatus.iOffset);
-	if (iStatus.iLine.Mid(iStatus.iOffset,end-iStatus.iOffset).CompareF(KReadCommand)==KErrNone)
-		{
-		if (!iStatus.iSkip)
-			{
-			__FLOG_STMT(_LIT8(logString,"Script:\tExecuting Read");)
-			__FLOG_STATIC(KNetDialLogFolder(),KNetDialLogFile(),logString());
-			iCharSet=ParseCharacterTypeL(iStatus.iOffset);
-			iScriptExec->ReadPct();
-			}
-		iStatus.iOffset=end;
-		return ETrue;		// Consumed
-		}
-	return EFalse;			// Not Consumed
-	}
-
-TBool CReadPCTCommand::CheckReadL()
-/**
-Checks Read.
-*/
-	{
-	EatSpacesAndLinesAndCommentsL();
-	TInt end=FindTokenEnd(iStatus.iOffset);
-	if (iStatus.iLine.Mid(iStatus.iOffset,end-iStatus.iOffset).CompareF(KReadCommand)==KErrNone)
-		return ETrue;
-	else
-		return EFalse;
-	}
-
-TPtrC CReadPCTCommand::CharSet()
-/**
-Returns used character set.
-*/
-	{
-	return iCharSet;
-	}
-
-//
-// CCharMapCommand definitions
-//
-
-CCharMapCommand* CCharMapCommand::NewL(TScriptStatus& aScriptStatus, CScriptReader* aScriptReader, CScriptVarMan* aVarMan,CScriptCharacterConverter* aCharConv)
-/**
-2 phased constructor for CCharMapCommand, first phase.
-
-@param aScriptStatus is script status.
-@param aScriptReader a pointer to script reader.
-@param aVarMan a pointer to variable manager.
-@param aCharConv a pointer to script character converter.
-@exception Leaves if ConstructL() leaves, or not enough memory is available.
-@return a new CCharMapCommand object.
-*/
-	{
-	CCharMapCommand* c=new(ELeave) CCharMapCommand(aScriptStatus,aScriptReader,aVarMan,aCharConv);
-	CleanupStack::PushL(c);
-	c->ConstructL();
-	CleanupStack::Pop();
-	return c;
-	}
-
-CCharMapCommand::CCharMapCommand(TScriptStatus& aScriptStatus, CScriptReader* aScriptReader, CScriptVarMan* aVarMan,CScriptCharacterConverter* aCharConv)
-	: CScriptCommandBase(aScriptStatus,aScriptReader,aVarMan,aCharConv)
-/**
-Constructor for CCharMapCommand, used in the first phase of construction.
-
-@param aScriptStatus is script status.
-@param aScriptReader a pointer to script reader.
-@param aVarMan a pointer to variable manager.
-@param aCharConv a pointer to script character converter.
-*/
-	{}
-
-CCharMapCommand::~CCharMapCommand()
-/**
-Destructor.
-*/
-	{}	
-
-TBool CCharMapCommand::ParseL()
-/**
-Parse.
-*/
-	{
-	EatSpacesAndLinesAndCommentsL();
-	TInt end=FindTokenEnd(iStatus.iOffset);
-	if (iStatus.iLine.Mid(iStatus.iOffset,end-iStatus.iOffset).CompareF(KCharmapCommand)==KErrNone)
-		{
-		iStatus.iOffset=end;
-		if (!iStatus.iSkip)
-			{
-			iCharConv->SetDefaultCharSet(ParseCharacterTypeL(iStatus.iOffset));
-			}
-		return ETrue;		// Consumed
-		}
-	return EFalse;			// Not Consumed
-	}
-
-//
-// CExitCommand definiton
-//
-
-CExitCommand* CExitCommand::NewL(TScriptStatus& aScriptStatus,CScriptReader* aScriptReader,CScriptVarMan* aVarMan,CScriptCharacterConverter* aCharConv)
-/**
-2 phased constructor for CExitCommand, first phase.
-
-@param aScriptStatus is script status.
-@param aScriptReader a pointer to script reader.
-@param aVarMan a pointer to variable manager.
-@param aCharConv a pointer to script character converter.
-@exception Leaves if ConstructL() leaves, or not enough memory is available.
-@return a new CExitCommand object.
-*/
-	{
-	CExitCommand* c=new(ELeave) CExitCommand(aScriptStatus,aScriptReader,aVarMan,aCharConv);
-	CleanupStack::PushL(c);
-	c->ConstructL();
-	CleanupStack::Pop();
-	return c;
-	}
-
-CExitCommand::CExitCommand(TScriptStatus& aScriptStatus,CScriptReader* aScriptReader,CScriptVarMan* aVarMan,CScriptCharacterConverter* aCharConv)
-	: CScriptCommandBase(aScriptStatus,aScriptReader,aVarMan,aCharConv)
-/**
-Constructor for CExitCommand, used in the first phase of construction.
-
-@param aScriptStatus is script status.
-@param aScriptReader a pointer to script reader.
-@param aVarMan a pointer to variable manager.
-@param aCharConv a pointer to script character converter.
-*/
-	{}
-
-CExitCommand::~CExitCommand()
-/**
-Destructor.
-*/
-	{}
-
-TBool CExitCommand::ParseL()
-/**
-Parses EXIT command. Parses number or variable and leaves with the appropriate value.
-*/
-	{
-	EatSpacesAndLinesAndCommentsL();
-	TInt end=FindTokenEnd(iStatus.iOffset);
-	if (iStatus.iLine.Mid(iStatus.iOffset,end-iStatus.iOffset).CompareF(KExitCommand)==KErrNone)
-		{
-		if (!iStatus.iSkip)
-			{
-			__FLOG_STMT(_LIT8(logString1,"Script:\tExecuting Exit");)
-			__FLOG_STATIC(KNetDialLogFolder(),KNetDialLogFile(),logString1());
-			}
-		iStatus.iOffset=end;
-		EatSpaces(iStatus.iOffset);
-		TPtrC exitStatus;
-		TRAPD(ret,(exitStatus.Set(ParseCompoundExpressionL(iStatus.iOffset))));
-		if (!iStatus.iSkip)
-			{
-			if (ret==KErrNone)
-				{
-				TInt32 val;
-				TLex lex(exitStatus);
-				if(lex.Val(val)!=KErrNone)
-					User::Leave(KErrInvalidNumber);
-				if(val>0)
-					User::Leave(KErrNumberOutOfRange);
-				if(val==0)
-					val=(TInt32)KErrScriptCompleted;
-				User::Leave(val);
-				}
-			else if (ret==KErrNoExpression)
-				User::Leave(KErrScriptCompleted);
-			else
-				{
-				__FLOG_STMT(_LIT8(logString2,"Script:\tExit With Error %d");)
-				__FLOG_STATIC1(KNetDialLogFolder(),KNetDialLogFile(),TRefByValue<const TDesC8>(logString2()),ret);
-				User::Leave(ret);
-				}
-			}
-		return ETrue;		// Consumed
-		}
-	return EFalse;			// Not Consumed
-	}
+// Copyright (c) 2003-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:
+// NetDial Script Commands
+// 
+//
+
+/**
+ @file Scommand.cpp 
+*/
+
+#include "SSCRREAD.H"
+#include "SSCREXEC.H"
+#include "SIO.H"
+#include "SLOGGER.H"
+
+// Command names
+
+_LIT(KSetCommand,"SET");
+_LIT(KSendCommand,"SEND");
+_LIT(KWaitCommand,"WAIT");
+_LIT(KLoopCommand,"LOOP");
+_LIT(KGotoCommand,"GOTO");
+_LIT(KExitCommand,"EXIT");
+_LIT(KDTRCommand,"DTR");
+_LIT(KDropDTRCommand,"RAISE");
+_LIT(KRaiseDTRCommand,"DROP");
+_LIT(KReadCommand,"READ");
+_LIT(KCharmapCommand,"CHARMAP");
+_LIT(KTempVarName,"$$TMPVAR$$%d");	//< Temporary variable name
+
+// Characters used in scripts
+
+const TText KCommentChar='!';	
+const TText KPlusChar='+';
+const TText KQuoteChar='\"';
+const TText KOpenChevronChar='<';
+const TText KCloseChevronChar='>';
+const TText KOpenExprChar='{';
+const TText KCloseExprChar='}';
+const TText KEqualsChar='=';
+const TText KTabChar='\t';
+const TText KSpaceChar=' ';
+const TText KColonChar=':';
+const TText KOpenSquareBracketChar='[';
+const TText KCloseSquareBracketChar=']';
+const TInt KLabelArrayGranularity=5;
+const TInt32 KMinScriptInteger=0;
+const TInt32 KMaxScriptInteger=500000;
+const TReal KMinScriptReal=0.0;
+const TReal KMaxScriptReal=500000.0;
+const TInt KMinLoopCounter=1;
+const TInt KMaxLoopCounter=10000;
+
+//
+// Glossary
+// ========
+// String				- a text string enclosed in ".."
+// Character			- a single character expressed numnerically enclosed in <..>
+// Variable				- named variable (preset or set in script) ending in $
+// Expression			- any one of the three above
+// Compound expression	- a number of expressions concatenated with +
+// Token				- an expression, compound expression, label or command
+//
+
+//
+// CScriptCommandBase definitions
+//
+
+CScriptCommandBase::CScriptCommandBase(TScriptStatus& aStatus,CScriptReader* aScriptReader,CScriptVarMan* aVarMan,CScriptCharacterConverter* aCharConv)
+	: iScriptReader(aScriptReader), iVarMan(aVarMan), iCharConv(aCharConv), iTempVarNum(0), iStatus(aStatus)
+/**
+Constructor for CScriptCharacterConverter.
+*/
+	{}
+
+CScriptCommandBase::~CScriptCommandBase()
+/**
+Destructor.
+*/
+	{}
+
+void CScriptCommandBase::ConstructL()
+/**
+Instantiates member variables.
+*/
+	{}
+
+void CScriptCommandBase::Cleanup()
+/**
+Cleanup.
+*/
+	{}
+
+TPtrC CScriptCommandBase::ParseCompoundExpressionL(TInt& aOffset)
+/**
+Parses a compound string expression starting at aOffset into a single string
+constant and returns it.
+*/
+	{
+	TPtrC wholeExpr;
+	wholeExpr.Set(ParseExpressionL(aOffset));
+	TBuf<KMaxVarNameLength> varName;
+	varName.Format(KTempVarName,iTempVarNum++);
+	iVarMan->AddVariableL(varName,wholeExpr);
+	HBufC* val=NULL;
+	HBufC* oldVal=NULL;
+	
+	FOREVER
+		{
+		EatSpaces(aOffset);
+		if (aOffset>=iStatus.iLine.Length())
+			break;
+		if (iStatus.iLine[aOffset]!=KPlusChar)
+			break;
+		TPtrC nextExpr;
+		nextExpr.Set(ParseExpressionL(++aOffset));
+		val=HBufC::NewLC(wholeExpr.Length()+nextExpr.Length());
+		TPtr currentExpr(val->Des());
+		currentExpr.Append(wholeExpr);
+		currentExpr.Append(nextExpr);
+		varName.Format(KTempVarName,iTempVarNum++);
+		iVarMan->AddVariableL(varName,val->Des());
+		CleanupStack::Pop();
+		wholeExpr.Set(val->Des());
+		delete oldVal;
+		oldVal=val;
+		}
+
+	delete val;
+	User::LeaveIfError(iVarMan->FindVariable(varName,wholeExpr));
+	return wholeExpr;
+	}
+
+TPtrC CScriptCommandBase::ParseExpressionL(TInt& aOffset)
+/**
+Parses string expression starting at aOffset according to starting character
+and returns value.
+*/
+	{
+	EatSpaces(aOffset);
+	if(iStatus.iLine.Length()<=aOffset)
+		User::Leave(KErrNoExpression);
+
+	switch(iStatus.iLine[aOffset])		//switch(iLine[aOffset+1])
+		{
+	case KQuoteChar:
+		aOffset++;							// skip quote char
+		return ParseStringL(aOffset);
+	case KOpenChevronChar:
+		aOffset++;							// skip chevron char
+		return ParseCharacterL(aOffset);
+	default:
+		return ParseVariableL(aOffset);
+		}
+	}
+
+TPtrC CScriptCommandBase::ParseStringL(TInt& aOffset)
+/**
+Parses a string constant enclosed in "" and returns its value.
+*/
+	{
+	return ParseEnclosedStringL(aOffset,KQuoteChar,KErrMissingQuote);
+	}
+
+TPtrC CScriptCommandBase::ParseCharacterL(TInt& aOffset)
+/**
+Parses a character enclosed in <> and returns its value.
+*/
+	{
+	TPtrC charString=ParseEnclosedStringL(aOffset,KCloseChevronChar,KErrMissingChevron);
+	TRadix radix=EDecimal;
+	TInt len=charString.Length();
+	if (len>2)
+		{
+		if(charString[0]=='0')
+			{
+			switch(charString[1])
+				{
+			case 'x':
+			case 'X':
+				len-=2;
+				radix=EHex;
+				break;
+			case 'd':
+			case 'D':
+				len-=2;
+				radix=EDecimal;
+				break;
+			case 'o':
+			case 'O':
+				len-=2;
+				radix=EOctal;
+				break;
+			case 'b':
+			case 'B':
+				len-=2;
+				radix=EBinary;
+				break;
+			default:
+				break;
+				}
+			}
+		}
+
+	TLex lex(charString.Right(len));
+	TUint val=0;
+	if (lex.Val(val,radix)!=KErrNone)
+		User::Leave(KErrInvalidNumber);
+	TBuf<1> character=(TText*)&val;
+	TBuf<KMaxVarNameLength> varName;
+	varName.Format(KTempVarName,iTempVarNum++);
+	iVarMan->AddVariableL(varName,character);
+	TPtrC temp;
+	iVarMan->FindVariable(varName,temp);
+	return temp;
+	}
+
+TPtrC CScriptCommandBase::ParseVariableL(TInt& aOffset)
+/**
+Parses a variable and returns its value.
+*/
+	{
+	TInt end=FindTokenEnd(aOffset);
+	TPtrC varName=iStatus.iLine.Mid(aOffset,end-aOffset);
+	aOffset=end;
+	TPtrC varValue;
+	if (iVarMan->FindVariable(varName,varValue)==KErrNotFound)
+		{
+		if(!iStatus.iSkip)
+			User::Leave(KErrVariableNotFound);
+		return TPtrC();
+		}
+	return varValue;
+	}
+
+TInt32 CScriptCommandBase::ParseIntegerL(TInt& aOffset)
+/**
+Parses an integer and returns its value.
+*/
+	{
+	EatSpaces(aOffset);
+	TLex lex(iStatus.iLine);
+	lex.Inc(aOffset);
+	TInt32 val=0;
+	
+	if (lex.Val(val)!=KErrNone)
+		{
+		User::Leave(KErrInvalidNumber);
+		return KMinScriptInteger;
+		}
+
+	if ((val<KMinScriptInteger) || (val>KMaxScriptInteger))
+		{
+		User::Leave(KErrNumberOutOfRange);
+		return KMinScriptInteger;
+		}
+
+	aOffset=lex.Offset();
+	return val;
+	}
+
+TReal CScriptCommandBase::ParseRealL(TInt& aOffset)
+/**
+Parses a real number and returns its value.
+*/
+	{
+	EatSpaces(aOffset);
+	TLex lex(iStatus.iLine);
+	lex.Inc(aOffset);
+	TReal val=0.0;
+
+	if (lex.Val(val)!=KErrNone)
+		{	
+		User::Leave(KErrInvalidNumber);
+		return KMinScriptReal;
+		}
+	if ((val<KMinScriptReal) || (val>KMaxScriptReal))
+		{
+		User::Leave(KErrNumberOutOfRange);
+		return KMinScriptReal;
+		}
+
+	aOffset=lex.Offset();
+	return val;
+	}
+
+TPtrC CScriptCommandBase::ParseCharacterTypeL(TInt& aOffset)
+/**
+Parses character type.
+*/
+	{
+	EatSpaces(aOffset);
+
+	if(iStatus.iLine.Length()<=aOffset)		// nothing specified so assume default
+		return TPtrC();
+
+	TInt startChar=aOffset;
+	if (iStatus.iLine[startChar++]!=KOpenSquareBracketChar)
+		return TPtrC();				// No open bracket so assume default
+
+	aOffset=startChar;
+	return ParseEnclosedStringL(aOffset,KCloseSquareBracketChar,KErrMissingBracket);
+	}
+
+HBufC8* CScriptCommandBase::ConvertLC(const TDesC& aString,TInt& aOffset)
+/**
+Converts to correct character set.
+*/
+	{
+	TBuf<KMaxCharacterTypeLength> type=ParseCharacterTypeL(aOffset);
+	return iCharConv->ConvertLC(aString,type);
+	}
+
+TInt CScriptCommandBase::FindTokenEnd(TInt aOffset)
+/**
+Finds end of string beginning at aOffset and returns length.
+*/
+	{
+	__ASSERT_DEBUG(aOffset<=iStatus.iLine.Length(), NetDialPanic(EOffsetExceedsLineLength));
+
+	if(aOffset==iStatus.iLine.Length())
+		return aOffset;
+
+	TInt end;
+	for (end=aOffset; IsValidChar(iStatus.iLine[end]); end++)
+		{
+		if (end>=(iStatus.iLine.Length()-1))
+			{
+			end++;
+			break;
+			}
+		}
+	return end;
+	}
+
+TBool CScriptCommandBase::IsValidChar(const TText& aChar)
+/**
+Checks if aChar is a valid character in a script command.
+*/
+	{
+	return TChar(aChar).IsAlphaDigit() || (aChar==KDollarChar) || (aChar==KUnderscoreChar) || (aChar==KCommentChar);
+	}
+
+void CScriptCommandBase::EatSpaces(TInt& aOffset)
+/**
+Ignores spaces, tabs, line feeds and carriage returns and sets aOffset to 
+next non-blank character, or end of line
+*/
+	{
+	if(aOffset>=iStatus.iLine.Length())
+		return;
+
+	while((iStatus.iLine[aOffset]==KSpaceChar) || (iStatus.iLine[aOffset]==KTabChar) || (iStatus.iLine[aOffset]==KLineFeed) || (iStatus.iLine[aOffset]==KCarriageReturn))
+		{
+		aOffset++;
+		if(aOffset>=iStatus.iLine.Length())
+			break;
+		}
+	}
+
+void CScriptCommandBase::EatSpacesAndLinesL()
+/**
+Ignores spaces and empty lines and sets aOffset to next non-blank character.
+*/
+	{
+	EatSpaces(iStatus.iOffset);
+	while(iStatus.iOffset>=iStatus.iLine.Length())
+		{
+		User::LeaveIfError(iScriptReader->GetNextLine());		// This also resets iStatus.iOffset
+		EatSpaces(iStatus.iOffset);
+		}	
+	}
+
+void CScriptCommandBase::EatSpacesAndLinesAndCommentsL()
+/**
+Ignores spaces, empty lines and comments and sets aOffset to next non-blank or 
+non-comment character
+*/
+	{
+	EatSpacesAndLinesL();
+	while (iStatus.iLine[iStatus.iOffset]==KCommentChar)
+		{
+		iStatus.iOffset=iStatus.iLine.Length();
+		EatSpacesAndLinesL();		// this will reset iStatus.iOffset if necessary
+		}
+	}	
+
+TPtrC CScriptCommandBase::ParseEnclosedStringL(TInt& aOffset,TText aChar,TInt aError)
+/**
+Parses enclosed string
+*/
+	{
+	if(aOffset>=iStatus.iLine.Length())
+		User::Leave(aError);			// no end character before EOL
+	
+	TInt end=aOffset;
+	while (end<iStatus.iLine.Length())
+		{
+		if (iStatus.iLine[end]==aChar)
+			break;
+		end++;
+		}
+
+	if (end>=iStatus.iLine.Length())
+		User::Leave(aError);			// no end character before EOL
+
+	TInt start=aOffset;
+	aOffset=end+1;
+	return iStatus.iLine.Mid(start,end-start);
+	}
+
+//
+// CSetCommand definitions
+//
+
+CSetCommand* CSetCommand::NewL(TScriptStatus& aScriptStatus,CScriptReader* aScriptReader,CScriptVarMan* aVarMan,CScriptCharacterConverter* aCharConv)
+/**
+2 phased constructor for CSetCommand, first phase.
+
+@param aScriptStatus is script status.
+@param aScriptReader a pointer to script reader.
+@param aVarMan a pointer to variable manager.
+@param aCharConv a pointer to script character converter.
+@exception Leaves if ConstructL() leaves, or not enough memory is available.
+@return a new CSetCommand object.
+*/
+	{
+	CSetCommand* c=new(ELeave) CSetCommand(aScriptStatus,aScriptReader,aVarMan,aCharConv);
+	CleanupStack::PushL(c);
+	c->ConstructL();
+	CleanupStack::Pop();
+	return c;
+	}
+
+CSetCommand::CSetCommand(TScriptStatus& aScriptStatus,CScriptReader* aScriptReader,CScriptVarMan* aVarMan,CScriptCharacterConverter* aCharConv)
+	: CScriptCommandBase(aScriptStatus,aScriptReader,aVarMan,aCharConv)
+/**
+Constructor for CSetCommand, used in the first phase of construction.
+
+@param aScriptStatus is script status.
+@param aScriptReader a pointer to script reader.
+@param aVarMan a pointer to variable manager.
+@param aCharConv a pointer to script character converter.
+*/
+	{}
+
+CSetCommand::~CSetCommand()
+/**
+Destructor.
+*/
+	{}
+
+TBool CSetCommand::ParseL()
+/**
+Parses a SET command. Determines variable name and value and adds to variable list.
+*/
+	{
+	EatSpacesAndLinesAndCommentsL();
+	TInt end=FindTokenEnd(iStatus.iOffset);
+	if (iStatus.iLine.Mid(iStatus.iOffset,end-iStatus.iOffset).CompareF(KSetCommand)==KErrNone)
+		{
+		if (!iStatus.iSkip)
+			{
+			__FLOG_STMT(_LIT8(KLogStringExecutingSet,"Script:\tExecuting Set");)
+			__FLOG_STATIC(KNetDialLogFolder(),KNetDialLogFile(),KLogStringExecutingSet());
+			}
+		iStatus.iOffset=end;
+		EatSpaces(iStatus.iOffset);
+		end=FindTokenEnd(iStatus.iOffset);
+		TPtrC varName=iStatus.iLine.Mid(iStatus.iOffset,end-iStatus.iOffset);
+		EatSpaces(end);
+		if (iStatus.iLine[end++]!=KEqualsChar)
+			User::Leave(KErrNoEquals);
+		EatSpaces(end);
+		TPtrC value=ParseCompoundExpressionL(end);
+		if (!iStatus.iSkip)
+			{
+			iVarMan->AddVariableL(varName,value);
+			__FLOG_STMT(_LIT(KLogStringSetVar,"Script:\tSet Var: %S  To %S"));
+			__FLOG_STATIC2(KNetDialLogFolder(),KNetDialLogFile(),TRefByValue<const TDesC>(KLogStringSetVar()),&varName,&value);
+			}
+		iStatus.iOffset=end;
+		return ETrue;		// Consumed
+		}
+	return EFalse;			// Not Consumed
+	}
+
+//
+// CSendCommand definitions
+//
+
+CSendCommand* CSendCommand::NewL(TScriptStatus& aScriptStatus,CScriptReader* aScriptReader,CScriptVarMan* aVarMan,CScriptCharacterConverter* aCharConv,CScriptIO* aScriptIO)
+/**
+2 phased constructor for CSendCommand, first phase.
+
+@param aScriptStatus is script status.
+@param aScriptReader a pointer to script reader.
+@param aVarMan a pointer to variable manager.
+@param aCharConv a pointer to script character converter.
+@param aScriptIO a pointer to serial comms I/O handler.
+@exception Leaves if ConstructL() leaves, or not enough memory is available.
+@return a new CSendCommand object.
+*/
+	{
+	CSendCommand* c=new(ELeave) CSendCommand(aScriptStatus,aScriptReader,aVarMan,aCharConv,aScriptIO);
+	CleanupStack::PushL(c);
+	c->ConstructL();
+	CleanupStack::Pop();
+	return c;
+	}
+
+CSendCommand::CSendCommand(TScriptStatus& aScriptStatus,CScriptReader* aScriptReader,CScriptVarMan* aVarMan,CScriptCharacterConverter* aCharConv,CScriptIO* aScriptIO)
+	: CScriptCommandBase(aScriptStatus,aScriptReader,aVarMan,aCharConv), iScriptIO(aScriptIO)
+/**
+Constructor for CSendCommand, used in the first phase of construction.
+
+@param aScriptStatus is script status.
+@param aScriptReader a pointer to script reader.
+@param aVarMan a pointer to variable manager.
+@param aCharConv a pointer to script character converter.
+@param aScriptIO a pointer to serial comms I/O handler.
+*/
+	{}
+
+CSendCommand::~CSendCommand()
+/**
+Destructor.
+*/
+	{}
+
+TBool CSendCommand::ParseL()
+/**
+Parses SEND command.  Parses expression to send and sends it.
+*/
+	{
+	EatSpacesAndLinesAndCommentsL();
+	TInt end=FindTokenEnd(iStatus.iOffset);
+	if(iStatus.iLine.Mid(iStatus.iOffset,end-iStatus.iOffset).CompareF(KSendCommand)==0)
+		{
+		if(!iStatus.iSkip)
+			{
+			__FLOG_STMT(_LIT8(KLogStringExecutingSend,"Script:\tExecuting Send");)
+			__FLOG_STATIC(KNetDialLogFolder(),KNetDialLogFile(),KLogStringExecutingSend());
+			}
+		iStatus.iOffset=end;
+		EatSpaces(iStatus.iOffset);
+		TPtrC temp;
+		temp.Set(ParseCompoundExpressionL(iStatus.iOffset));
+		HBufC8* buf=ConvertLC(temp,iStatus.iOffset);
+		iSendString.Set(buf->Des());
+		if(!iStatus.iSkip)
+			{
+			iScriptIO->Write(iSendString);
+#ifdef __FLOG_ACTIVE
+			_LIT(KLogStringSending,"Script:\tSending %S");
+			TBuf16<KLogBufferSize> temp;
+			temp.Copy(iSendString.Left(Min(iSendString.Length(),KLogBufferSize)));
+			__FLOG_STATIC1(KNetDialLogFolder(),KNetDialLogFile(),TRefByValue<const TDesC>(KLogStringSending()),&temp);
+#endif
+			}
+		CleanupStack::PopAndDestroy();
+		return ETrue;		// Consumed
+		}
+	return EFalse;			// Not Consumed
+	}
+
+//
+// CLabelSearch definitions
+//
+
+CLabelSearch* CLabelSearch::NewLC(const TDesC& aLabelName)
+/**
+2 phased constructor for CLabelSearch, first phase.
+
+@param aLabelName is label name.
+@exception Leaves if ConstructL() leaves, or not enough memory is available.
+@return a new CLabelSearch object.
+*/
+	{
+	CLabelSearch* label=new(ELeave) CLabelSearch();
+	CleanupStack::PushL(label);
+	label->ConstructL(aLabelName);
+	return label;
+	}
+
+CLabelSearch::CLabelSearch()
+	: iStatus(ENotFound), iPosition()
+/**
+Constructor for CLabelSearch, used in the first phase of construction.
+*/
+	{}
+
+void CLabelSearch::ConstructL(const TDesC& aLabelName)
+/**
+Instantiates member variables.
+*/
+	{
+	iChatString=NULL;
+	iLabelName=HBufC::NewL(aLabelName.Length());
+	(*iLabelName)=aLabelName;
+	}
+
+CLabelSearch::~CLabelSearch()
+/**
+Destructor.
+Don't delete iChatString - that is dealt with by CScriptIO.
+*/
+	{
+	delete iLabelName;
+	}
+
+void CLabelSearch::CreateCommChatStringL(const TDesC8& aDes,TBool aIsFolded)
+/**
+Creates CCommChatString object.
+*/
+	{
+	iChatString=CCommChatString::NewL(aDes,aIsFolded);
+	}
+
+//
+// CWaitCommand definitions
+//
+
+CWaitCommand* CWaitCommand::NewL(TScriptStatus& aScriptStatus,CScriptReader* aScriptReader,CScriptVarMan* aVarMan,CScriptCharacterConverter* aCharConv,CScriptIO* aScriptIO,CScriptLabelMan* aLabelMan, CScriptExecutor* aScriptExec)
+/**
+2 phased constructor for CWaitCommand, first phase.
+
+@param aScriptStatus is script status.
+@param aScriptReader a pointer to script reader.
+@param aVarMan a pointer to variable manager.
+@param aCharConv a pointer to script character converter.
+@param aScriptIO a pointer to serial comms I/O handler.
+@param aLabelMan a pointer to label manager.
+@exception Leaves if ConstructL() leaves, or not enough memory is available.
+@return a new CWaitCommand object.
+*/
+	{
+	CWaitCommand* c=new(ELeave) CWaitCommand(aScriptStatus,aScriptReader,aVarMan,aCharConv,aScriptIO,aLabelMan,aScriptExec);
+	CleanupStack::PushL(c);
+	c->ConstructL();
+	CleanupStack::Pop();
+	return c;
+	}
+
+CWaitCommand::CWaitCommand(TScriptStatus& aScriptStatus,CScriptReader* aScriptReader,CScriptVarMan* aVarMan,CScriptCharacterConverter* aCharConv,CScriptIO* aScriptIO,CScriptLabelMan* aLabelMan, CScriptExecutor* aScriptExec)
+	: CScriptCommandBase(aScriptStatus,aScriptReader,aVarMan,aCharConv), iScriptIO(aScriptIO), iLabelMan(aLabelMan), iScriptExec(aScriptExec)
+/**
+Constructor for CWaitCommand, used in the first phase of construction.
+
+@param aScriptStatus is script status.
+@param aScriptReader a pointer to script reader.
+@param aVarMan a pointer to variable manager.
+@param aCharConv a pointer to script character converter.
+@param aScriptIO a pointer to serial comms I/O handler.
+@param aLabelMan a pointer to label manager.
+*/
+	{}
+
+CWaitCommand::~CWaitCommand()
+/**
+Destructor.
+Clears label array.
+*/
+	{
+	DeleteLabelArray();
+	}
+
+TBool CWaitCommand::ParseL()
+/**
+Parses WAIT command. Parse according to whether in skip mode or not.
+*/
+	{
+	EatSpacesAndLinesAndCommentsL();
+	TInt end=FindTokenEnd(iStatus.iOffset);
+	if (iStatus.iLine.Mid(iStatus.iOffset,end-iStatus.iOffset).CompareF(KWaitCommand)==KErrNone)
+		{
+		iStatus.iOffset=end;
+		if (iStatus.iSkip)
+			ParseSkipL();
+		else
+			ParseActionL();
+		return ETrue;				// Consumed
+		}
+	return EFalse;					// Not Consumed
+	}
+
+void CWaitCommand::Cleanup()
+/**
+Cancels the read and clears out the labels
+*/
+	{
+	if (!iStatus.iSkip)
+		{
+		iScriptIO->Cancel();
+		DeleteLabelArray();
+		iLabelArray=NULL;
+		}
+	}
+
+void CWaitCommand::ParseActionL()
+/**
+Parses WAIT command when not in skip mode.  Parses wait period, strings and labels and 
+queue a read.
+*/
+	{
+	__FLOG_STMT(_LIT8(KLogStringExecutingWait,"Script:\tExecuting Wait");)
+	__FLOG_STATIC(KNetDialLogFolder(),KNetDialLogFile(),KLogStringExecutingWait());
+	EatSpaces(iStatus.iOffset);
+	TReal waitPeriod=ParseRealL(iStatus.iOffset);
+	EatSpacesAndLinesAndCommentsL();
+	if (iStatus.iLine[iStatus.iOffset++]!=KOpenExprChar)
+		User::Leave(KErrNoOpenExpression);
+
+	iLabelArray=new(ELeave) CLabelSearchArray(KLabelArrayGranularity);
+	TBool completed=EFalse;
+	while(!completed)
+		{
+		EatSpacesAndLinesAndCommentsL();
+		if (iStatus.iLine[iStatus.iOffset]==KCloseExprChar)
+			{
+			completed=ETrue;
+			iStatus.iOffset++;
+			}
+		else
+			{
+			TPtrC temp=ParseCompoundExpressionL(iStatus.iOffset);
+			HBufC8* buf=ConvertLC(temp,iStatus.iOffset);
+			CLabelSearch* label=ParseLabelLC();
+			TPtrC8 waitString(buf->Des());	
+			label->CreateCommChatStringL(waitString,EFalse);
+			iLabelArray->AppendL(label);
+			// for logging
+			TBuf<KLogBufferSize> labelName;
+			labelName.Copy(label->LabelName().Left(Min(KLogBufferSize,label->LabelName().Length())));
+			//
+#ifdef __FLOG_ACTIVE
+			_LIT(KLogStringGog,"Script:\tIf %S is found, Goto %S");
+			TBuf16<KLogBufferSize> string;
+			string.Copy(waitString.Left(Min(waitString.Length(),KLogBufferSize)));
+			__FLOG_STATIC2(KNetDialLogFolder(),KNetDialLogFile(),TRefByValue<const TDesC>(KLogStringGog()),&string,&labelName);
+#endif
+			CleanupStack::Pop();			// label - will be deleted from array
+			CleanupStack::PopAndDestroy();	// buf - will have been copied into label array
+			}			
+		}
+	// Tell the script executor how long we are going to wait since it
+	// may need to force the server to resend the login prompt and will
+	// need to know how long to wait the second time around
+	iScriptExec->SetRetransmittedLoginTimeout(waitPeriod);
+	iScriptIO->Read(iLabelArray,waitPeriod);
+	}
+
+void CWaitCommand::ParseSkipL()
+/**
+Parses a WAIT command when in skip mode. Parses expressions and labels but do not queue read.
+*/
+	{
+	EatSpaces(iStatus.iOffset);
+	ParseRealL(iStatus.iOffset);					// ignore the actual value returned
+	EatSpacesAndLinesAndCommentsL();
+	if (iStatus.iLine[iStatus.iOffset++]!=KOpenExprChar)
+		User::Leave(KErrNoOpenExpression);
+
+	TBool completed=EFalse;
+	while (!completed)
+		{
+		EatSpacesAndLinesAndCommentsL();
+		if (iStatus.iLine[iStatus.iOffset]==KCloseExprChar)
+			{
+			completed=ETrue;
+			iStatus.iOffset++;
+			}
+		else
+			{
+			ParseCompoundExpressionL(iStatus.iOffset);			// ignore the return value in skip mode
+			ParseLabelLC();
+			CleanupStack::PopAndDestroy();				// ignore the label returned
+			}
+		}
+	}
+
+CLabelSearch* CWaitCommand::ParseLabelLC()
+/**
+Parses label.  Parses label name and looks for it in the label list.
+Returns results of search.
+*/
+	{
+	EatSpaces(iStatus.iOffset);
+	TInt start=iStatus.iOffset;
+	iStatus.iOffset=FindTokenEnd(start);
+	TPtrC var=iStatus.iLine.Mid(start,iStatus.iOffset-start);
+	CLabelSearch* labelSearch=CLabelSearch::NewLC(var);
+	TLinePosition pos;
+	if(iLabelMan->FindLabel(var,pos)==KErrNotFound)
+		{
+		pos.Reset();
+		labelSearch->Set(CLabelSearch::ENotFound,pos);
+		}
+	else
+		labelSearch->Set(CLabelSearch::EResolved,pos);
+	return labelSearch;
+	}
+
+TPtrC CWaitCommand::LabelFromIndexL(TInt aIndex)
+/**
+Gets label from array by index.
+*/
+	{
+	if ((aIndex<0) && (aIndex>iLabelArray->Count()))
+		User::Leave(KErrIllegalWaitLabelIndex);
+	return (*iLabelArray)[aIndex]->LabelName();
+	}
+
+void CWaitCommand::DeleteLabelArray()
+/**
+Deletes label array.
+*/
+	{
+	if (iLabelArray!=NULL)
+		{
+		TInt count=iLabelArray->Count();
+		for(TInt i=0; i<count; i++)
+			{
+			delete (*iLabelArray)[i];
+			}
+		iLabelArray->Delete(0,count);
+		delete iLabelArray;
+		}
+	}
+	
+//
+// CLoopCommand definitions
+//
+
+CLoopCommand* CLoopCommand::NewL(TScriptStatus& aScriptStatus,CScriptReader* aScriptReader,CScriptVarMan* aVarMan,CScriptCharacterConverter* aCharConv)
+/**
+2 phased constructor for CLoopCommand, first phase.
+
+@param aScriptStatus is script status.
+@param aScriptReader a pointer to script reader.
+@param aVarMan a pointer to variable manager.
+@param aCharConv a pointer to script character converter.
+@exception Leaves if ConstructL() leaves, or not enough memory is available.
+@return a new CLoopCommand object.
+*/
+	{
+	CLoopCommand* c=new(ELeave) CLoopCommand(aScriptStatus,aScriptReader,aVarMan,aCharConv);
+	CleanupStack::PushL(c);
+	c->ConstructL();
+	CleanupStack::Pop();
+	return c;
+	}
+
+CLoopCommand::CLoopCommand(TScriptStatus& aScriptStatus,CScriptReader* aScriptReader,CScriptVarMan* aVarMan,CScriptCharacterConverter* aCharConv)
+	: CScriptCommandBase(aScriptStatus,aScriptReader,aVarMan,aCharConv), iLoop(EFalse)
+/**
+Constructor for CLoopCommand, used in the first phase of construction.
+
+@param aScriptStatus is script status.
+@param aScriptReader a pointer to script reader.
+@param aVarMan a pointer to variable manager.
+@param aCharConv a pointer to script character converter.
+*/
+	{}
+
+CLoopCommand::~CLoopCommand()
+/**
+Destructor.
+*/
+	{}
+
+TBool CLoopCommand::ParseL()
+/**
+Parses LOOP command. Checks how many times to loop and records position of beginning of loop.
+*/
+	{
+	EatSpacesAndLinesAndCommentsL();
+	TInt end=FindTokenEnd(iStatus.iOffset);
+	if (iStatus.iLine.Mid(iStatus.iOffset,end-iStatus.iOffset).CompareF(KLoopCommand)==KErrNone)
+		{
+		if (iLoop)
+			User::Leave(KErrNestedLoop);
+		if (!iStatus.iSkip)
+			{
+			__FLOG_STMT(_LIT8(KLogStringExecutingLoop,"Script:\tExecuting Loop");)
+			__FLOG_STATIC(KNetDialLogFolder(),KNetDialLogFile(),KLogStringExecutingLoop());
+			}
+		iStatus.iOffset=end;
+		EatSpaces(iStatus.iOffset);
+		iLoopCounter=ParseIntegerL(iStatus.iOffset);
+		if ((iLoopCounter<KMinLoopCounter) || (iLoopCounter>KMaxLoopCounter))
+			User::Leave(KErrLoopCounterOutOfRange);
+		EatSpacesAndLinesAndCommentsL();
+		if (iStatus.iLine[iStatus.iOffset++]!=KOpenExprChar)
+			User::Leave(KErrNoOpenExpression);
+		iLoop=ETrue;
+		iScriptReader->CurrentPos(iLoopPosition,iStatus.iOffset);
+		if (!iStatus.iSkip)
+			{
+			__FLOG_STMT(_LIT(KLogStringLoopCounter,"Script:\tLoop Counter %d");)
+			__FLOG_STATIC1(KNetDialLogFolder(),KNetDialLogFile(),KLogStringLoopCounter(),iLoopCounter);
+			}
+		return ETrue;		// Consumed
+		}
+	return EFalse;			// Not Consumed
+	}
+
+TBool CLoopCommand::CheckLoopL()
+/**
+Checks how many times loop has been executed and returns to beginning if necessary.
+*/
+	{
+	if (iLoop)
+		{
+		EatSpacesAndLinesAndCommentsL();
+		if(iStatus.iLine[iStatus.iOffset]==KCloseExprChar)
+			{
+			if((--iLoopCounter==0) || (iStatus.iSkip))
+				{
+				iLoop=EFalse;
+				iStatus.iOffset++;
+				}
+			else
+				{
+				iScriptReader->SetCurrentPos(iLoopPosition);
+				__FLOG_STMT(_LIT8(logString1,"Script:\tRepeat Loop");)
+				__FLOG_STATIC(KNetDialLogFolder(),KNetDialLogFile(),logString1());
+				__FLOG_STMT(_LIT8(logString2,"Script:\tLoop Counter %d");)
+				__FLOG_STATIC1(KNetDialLogFolder(),KNetDialLogFile(),logString2(),iLoopCounter);
+				}
+			return ETrue;				// Consumed Something
+			}
+		}
+	return EFalse;						// Nothing doing...
+	}
+
+//
+// CGotoCommand definitions
+//
+
+CGotoCommand* CGotoCommand::NewL(TScriptStatus& aScriptStatus,CScriptReader* aScriptReader,CScriptVarMan* aVarMan,CScriptCharacterConverter* aCharConv,CScriptLabelMan* aLabelMan)
+/**
+2 phased constructor for CGotoCommand, first phase.
+
+@param aScriptStatus is script status.
+@param aScriptReader a pointer to script reader.
+@param aVarMan a pointer to variable manager.
+@param aCharConv a pointer to script character converter.
+@param aLabelMan a pointer to label manager.
+@exception Leaves if ConstructL() leaves, or not enough memory is available.
+@return a new CGotoCommand object.
+*/	
+	{
+	CGotoCommand* c=new(ELeave) CGotoCommand(aScriptStatus,aScriptReader,aVarMan,aCharConv,aLabelMan);
+	CleanupStack::PushL(c);
+	c->ConstructL();
+	CleanupStack::Pop();
+	return c;
+	}
+
+CGotoCommand::CGotoCommand(TScriptStatus& aScriptStatus,CScriptReader* aScriptReader,CScriptVarMan* aVarMan,CScriptCharacterConverter* aCharConv,CScriptLabelMan* aLabelMan)
+	: CScriptCommandBase(aScriptStatus,aScriptReader,aVarMan,aCharConv), iLabelMan(aLabelMan)
+/**
+Constructor for CGotoCommand, used in the first phase of construction.
+
+@param aScriptStatus is script status.
+@param aScriptReader a pointer to script reader.
+@param aVarMan a pointer to variable manager.
+@param aCharConv a pointer to script character converter.
+@param aLabelMan a pointer to label manager.
+*/
+	{}
+
+CGotoCommand::~CGotoCommand()
+/**
+Destructor.
+*/
+	{}
+
+TBool CGotoCommand::ParseL()
+/**
+Parses GOTO command. Parses label and goto label.
+*/
+	{
+	EatSpacesAndLinesAndCommentsL();
+	TInt end=FindTokenEnd(iStatus.iOffset);
+	if (iStatus.iLine.Mid(iStatus.iOffset,end-iStatus.iOffset).CompareF(KGotoCommand)==KErrNone)
+		{
+		if(!iStatus.iSkip)
+			{
+			__FLOG_STMT(_LIT8(logString,"Script:\tExecuting Goto");)
+			__FLOG_STATIC(KNetDialLogFolder(),KNetDialLogFile(),logString());
+			}
+		iStatus.iOffset=end;
+		EatSpaces(iStatus.iOffset);
+		end=FindTokenEnd(iStatus.iOffset);
+		TPtrC var=iStatus.iLine.Mid(iStatus.iOffset,end-iStatus.iOffset);
+	//	HBufC* labelName=HBufC::NewLC(var.Length());
+	//	(*labelName)=var;
+	//	GotoL(labelName->Des());
+	//	CleanupStack::PopAndDestroy();
+		Goto(var);
+		iStatus.iOffset=end;
+		return ETrue;		// Consumed
+		}
+	return EFalse;			// Not Consumed
+	}
+
+void CGotoCommand::Goto(const TDesC& aLabelName)
+/**
+Finds label in those passed already, or skip lines until it is found.
+*/
+	{
+	TLinePosition pos;
+	if(!iStatus.iSkip)
+		{
+		if (iLabelMan->FindLabel(aLabelName,pos)==KErrNotFound)
+			{
+			iSearchName.Copy(aLabelName);
+			iStatus.iSkipModeToggleReq=ETrue;
+			__FLOG_STMT(_LIT(logString1,"Script:\tSearching for Label %S");)
+			__FLOG_STATIC1(KNetDialLogFolder(),KNetDialLogFile(),TRefByValue<const TDesC>(logString1()),&aLabelName);
+			__FLOG_STMT(_LIT8(logString2,"Script:\tEntering Skip Mode");)
+			__FLOG_STATIC(KNetDialLogFolder(),KNetDialLogFile(),logString2());
+			}
+		else
+			iScriptReader->SetCurrentPos(pos);
+		}
+	}
+
+TBool CGotoCommand::ParseLabelL()
+/**
+Parses label and adds it to label list. Compares label against one to be found.
+*/
+	{
+	EatSpacesAndLinesAndCommentsL();
+	TInt start=iStatus.iOffset;
+	TInt end=FindTokenEnd(start);
+	if ((iStatus.iLine.Length()>=(end+1)) && (iStatus.iLine[end]==KColonChar))
+		{
+		TLinePosition pos;
+		iScriptReader->CurrentPos(pos,end+1);
+		iLabelMan->AddLabelL(iStatus.iLine.Mid(start,end-start),pos);
+		iStatus.iOffset=++end;
+		TLinePosition dummyPos;
+		if (iStatus.iSkip && (iLabelMan->FindLabel(iSearchName,dummyPos)==KErrNone))
+			{
+			iStatus.iSkipModeToggleReq=ETrue;
+			__FLOG_STMT(_LIT8(logString,"Script:\tExiting Skip Mode");)
+			__FLOG_STATIC(KNetDialLogFolder(),KNetDialLogFile(),logString());
+			}
+		return ETrue;
+		}
+	return EFalse;
+	}
+
+void CGotoCommand::ServiceSkipReqs()
+/**
+Toggles skip mode.
+*/
+	{
+	if(iStatus.iSkipModeToggleReq)
+		{
+		iStatus.iSkipModeToggleReq=EFalse;
+		iStatus.iSkip=!iStatus.iSkip;
+		}
+	}
+
+//
+// CDTRCommand definitions
+//
+
+CDTRCommand* CDTRCommand::NewL(TScriptStatus& aScriptStatus,CScriptReader* aScriptReader,CScriptVarMan* aVarMan,CScriptCharacterConverter* aCharConv,CScriptIO* aScriptIO)
+/**
+2 phased constructor for CDTRCommand, first phase.
+
+@param aScriptStatus is script status.
+@param aScriptReader a pointer to script reader.
+@param aVarMan a pointer to variable manager.
+@param aCharConv a pointer to script character converter.
+@param aScriptIO a pointer to serial comms I/O handler.
+@exception Leaves if ConstructL() leaves, or not enough memory is available.
+@return a new CDTRCommand object.
+*/
+	{
+	CDTRCommand* c=new(ELeave) CDTRCommand(aScriptStatus,aScriptReader,aVarMan,aCharConv,aScriptIO);
+	CleanupStack::PushL(c);
+	c->ConstructL();
+	CleanupStack::Pop();
+	return c;
+	}
+
+CDTRCommand::CDTRCommand(TScriptStatus& aScriptStatus,CScriptReader* aScriptReader,CScriptVarMan* aVarMan,CScriptCharacterConverter* aCharConv,CScriptIO* aScriptIO)
+	: CScriptCommandBase(aScriptStatus,aScriptReader,aVarMan,aCharConv), iScriptIO(aScriptIO)
+/**
+Constructor for CDTRCommand, used in the first phase of construction.
+
+@param aScriptStatus is script status.
+@param aScriptReader a pointer to script reader.
+@param aVarMan a pointer to variable manager.
+@param aCharConv a pointer to script character converter.
+@param aScriptIO a pointer to serial comms I/O handler.
+*/
+	{}
+
+CDTRCommand::~CDTRCommand()
+/**
+Destructor.
+*/
+	{}
+
+TBool CDTRCommand::ParseL()
+/**
+Parses DTR command. Drops or raises appropriately.
+*/
+	{
+	EatSpacesAndLinesAndCommentsL();
+	TInt end=FindTokenEnd(iStatus.iOffset);
+	if (iStatus.iLine.Mid(iStatus.iOffset,end-iStatus.iOffset).CompareF(KDTRCommand)==KErrNone)
+		{
+		if(!iStatus.iSkip)
+			{
+			__FLOG_STMT(_LIT8(logString1,"Script:\tExecuting DTR");)
+			__FLOG_STATIC(KNetDialLogFolder(),KNetDialLogFile(),logString1());
+			}
+		iStatus.iOffset=end;
+		EatSpaces(iStatus.iOffset);
+		end=FindTokenEnd(iStatus.iOffset);
+		if (iStatus.iLine.Mid(iStatus.iOffset,end-iStatus.iOffset).CompareF(KRaiseDTRCommand)==KErrNone)
+			{
+			if(!iStatus.iSkip)
+				{
+				__FLOG_STMT(_LIT8(logString2,"Script:\tRaising DTR");)
+				__FLOG_STATIC(KNetDialLogFolder(),KNetDialLogFile(),logString2());
+				iScriptIO->RaiseDTR(NULL);
+				}	
+			}
+		else if (iStatus.iLine.Mid(iStatus.iOffset,end-iStatus.iOffset).CompareF(KDropDTRCommand)==KErrNone)
+			{
+			if(!iStatus.iSkip)
+				{
+				__FLOG_STMT(_LIT8(logString3,"Script:\tDropping DTR");)
+				__FLOG_STATIC(KNetDialLogFolder(),KNetDialLogFile(),logString3());
+				iScriptIO->DropDTR(NULL);
+				}	
+			}
+		else
+			User::Leave(KErrNoDropOrRaise);
+		iStatus.iOffset=end;
+		return ETrue;		// Consumed
+		}
+	return EFalse;			// Not Consumed
+	}
+
+//
+// CReadPCTCommand definitions
+//
+
+CReadPCTCommand* CReadPCTCommand::NewL(TScriptStatus& aScriptStatus,CScriptReader* aScriptReader,CScriptVarMan* aVarMan,CScriptCharacterConverter* aCharConv,CScriptExecutor* aScriptExec)
+/**
+2 phased constructor for CReadPCTCommand, first phase.
+
+@param aScriptStatus is script status.
+@param aScriptReader a pointer to script reader.
+@param aVarMan a pointer to variable manager.
+@param aCharConv a pointer to script character converter.
+@param aScriptExec a pointer to script executioner.
+@exception Leaves if ConstructL() leaves, or not enough memory is available.
+@return a new CReadPCTCommand object.
+*/
+	{
+	CReadPCTCommand* c=new(ELeave) CReadPCTCommand(aScriptStatus,aScriptReader,aVarMan,aCharConv,aScriptExec);
+	CleanupStack::PushL(c);
+	c->ConstructL();
+	CleanupStack::Pop();
+	return c;
+	}
+
+CReadPCTCommand::CReadPCTCommand(TScriptStatus& aScriptStatus,CScriptReader* aScriptReader,CScriptVarMan* aVarMan,CScriptCharacterConverter* aCharConv,CScriptExecutor* aScriptExec)
+	: CScriptCommandBase(aScriptStatus,aScriptReader,aVarMan,aCharConv), iScriptExec(aScriptExec)
+/**
+Constructor for CDTRCommand, used in the first phase of construction.
+
+@param aScriptStatus is script status.
+@param aScriptReader a pointer to script reader.
+@param aVarMan a pointer to variable manager.
+@param aCharConv a pointer to script character converter.
+@param aScriptExec a pointer to script executioner.
+*/
+	{}
+
+CReadPCTCommand::~CReadPCTCommand()
+/**
+Destructor.
+*/
+	{}
+
+TBool CReadPCTCommand::ParseL()
+/**
+Parses Read command.
+*/
+	{
+	EatSpacesAndLinesAndCommentsL();
+	TInt end=FindTokenEnd(iStatus.iOffset);
+	if (iStatus.iLine.Mid(iStatus.iOffset,end-iStatus.iOffset).CompareF(KReadCommand)==KErrNone)
+		{
+		if (!iStatus.iSkip)
+			{
+			__FLOG_STMT(_LIT8(logString,"Script:\tExecuting Read");)
+			__FLOG_STATIC(KNetDialLogFolder(),KNetDialLogFile(),logString());
+			iCharSet=ParseCharacterTypeL(iStatus.iOffset);
+			iScriptExec->ReadPct();
+			}
+		iStatus.iOffset=end;
+		return ETrue;		// Consumed
+		}
+	return EFalse;			// Not Consumed
+	}
+
+TBool CReadPCTCommand::CheckReadL()
+/**
+Checks Read.
+*/
+	{
+	EatSpacesAndLinesAndCommentsL();
+	TInt end=FindTokenEnd(iStatus.iOffset);
+	if (iStatus.iLine.Mid(iStatus.iOffset,end-iStatus.iOffset).CompareF(KReadCommand)==KErrNone)
+		return ETrue;
+	else
+		return EFalse;
+	}
+
+TPtrC CReadPCTCommand::CharSet()
+/**
+Returns used character set.
+*/
+	{
+	return iCharSet;
+	}
+
+//
+// CCharMapCommand definitions
+//
+
+CCharMapCommand* CCharMapCommand::NewL(TScriptStatus& aScriptStatus, CScriptReader* aScriptReader, CScriptVarMan* aVarMan,CScriptCharacterConverter* aCharConv)
+/**
+2 phased constructor for CCharMapCommand, first phase.
+
+@param aScriptStatus is script status.
+@param aScriptReader a pointer to script reader.
+@param aVarMan a pointer to variable manager.
+@param aCharConv a pointer to script character converter.
+@exception Leaves if ConstructL() leaves, or not enough memory is available.
+@return a new CCharMapCommand object.
+*/
+	{
+	CCharMapCommand* c=new(ELeave) CCharMapCommand(aScriptStatus,aScriptReader,aVarMan,aCharConv);
+	CleanupStack::PushL(c);
+	c->ConstructL();
+	CleanupStack::Pop();
+	return c;
+	}
+
+CCharMapCommand::CCharMapCommand(TScriptStatus& aScriptStatus, CScriptReader* aScriptReader, CScriptVarMan* aVarMan,CScriptCharacterConverter* aCharConv)
+	: CScriptCommandBase(aScriptStatus,aScriptReader,aVarMan,aCharConv)
+/**
+Constructor for CCharMapCommand, used in the first phase of construction.
+
+@param aScriptStatus is script status.
+@param aScriptReader a pointer to script reader.
+@param aVarMan a pointer to variable manager.
+@param aCharConv a pointer to script character converter.
+*/
+	{}
+
+CCharMapCommand::~CCharMapCommand()
+/**
+Destructor.
+*/
+	{}	
+
+TBool CCharMapCommand::ParseL()
+/**
+Parse.
+*/
+	{
+	EatSpacesAndLinesAndCommentsL();
+	TInt end=FindTokenEnd(iStatus.iOffset);
+	if (iStatus.iLine.Mid(iStatus.iOffset,end-iStatus.iOffset).CompareF(KCharmapCommand)==KErrNone)
+		{
+		iStatus.iOffset=end;
+		if (!iStatus.iSkip)
+			{
+			iCharConv->SetDefaultCharSet(ParseCharacterTypeL(iStatus.iOffset));
+			}
+		return ETrue;		// Consumed
+		}
+	return EFalse;			// Not Consumed
+	}
+
+//
+// CExitCommand definiton
+//
+
+CExitCommand* CExitCommand::NewL(TScriptStatus& aScriptStatus,CScriptReader* aScriptReader,CScriptVarMan* aVarMan,CScriptCharacterConverter* aCharConv)
+/**
+2 phased constructor for CExitCommand, first phase.
+
+@param aScriptStatus is script status.
+@param aScriptReader a pointer to script reader.
+@param aVarMan a pointer to variable manager.
+@param aCharConv a pointer to script character converter.
+@exception Leaves if ConstructL() leaves, or not enough memory is available.
+@return a new CExitCommand object.
+*/
+	{
+	CExitCommand* c=new(ELeave) CExitCommand(aScriptStatus,aScriptReader,aVarMan,aCharConv);
+	CleanupStack::PushL(c);
+	c->ConstructL();
+	CleanupStack::Pop();
+	return c;
+	}
+
+CExitCommand::CExitCommand(TScriptStatus& aScriptStatus,CScriptReader* aScriptReader,CScriptVarMan* aVarMan,CScriptCharacterConverter* aCharConv)
+	: CScriptCommandBase(aScriptStatus,aScriptReader,aVarMan,aCharConv)
+/**
+Constructor for CExitCommand, used in the first phase of construction.
+
+@param aScriptStatus is script status.
+@param aScriptReader a pointer to script reader.
+@param aVarMan a pointer to variable manager.
+@param aCharConv a pointer to script character converter.
+*/
+	{}
+
+CExitCommand::~CExitCommand()
+/**
+Destructor.
+*/
+	{}
+
+TBool CExitCommand::ParseL()
+/**
+Parses EXIT command. Parses number or variable and leaves with the appropriate value.
+*/
+	{
+	EatSpacesAndLinesAndCommentsL();
+	TInt end=FindTokenEnd(iStatus.iOffset);
+	if (iStatus.iLine.Mid(iStatus.iOffset,end-iStatus.iOffset).CompareF(KExitCommand)==KErrNone)
+		{
+		if (!iStatus.iSkip)
+			{
+			__FLOG_STMT(_LIT8(logString1,"Script:\tExecuting Exit");)
+			__FLOG_STATIC(KNetDialLogFolder(),KNetDialLogFile(),logString1());
+			}
+		iStatus.iOffset=end;
+		EatSpaces(iStatus.iOffset);
+		TPtrC exitStatus;
+		TRAPD(ret,(exitStatus.Set(ParseCompoundExpressionL(iStatus.iOffset))));
+		if (!iStatus.iSkip)
+			{
+			if (ret==KErrNone)
+				{
+				TInt32 val;
+				TLex lex(exitStatus);
+				if(lex.Val(val)!=KErrNone)
+					User::Leave(KErrInvalidNumber);
+				if(val>0)
+					User::Leave(KErrNumberOutOfRange);
+				if(val==0)
+					val=(TInt32)KErrScriptCompleted;
+				User::Leave(val);
+				}
+			else if (ret==KErrNoExpression)
+				User::Leave(KErrScriptCompleted);
+			else
+				{
+				__FLOG_STMT(_LIT8(logString2,"Script:\tExit With Error %d");)
+				__FLOG_STATIC1(KNetDialLogFolder(),KNetDialLogFile(),TRefByValue<const TDesC8>(logString2()),ret);
+				User::Leave(ret);
+				}
+			}
+		return ETrue;		// Consumed
+		}
+	return EFalse;			// Not Consumed
+	}