telephonyprotocols/csdagt/script/SSCRREAD.CPP
changeset 0 3553901f7fa8
child 19 630d2f34d719
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/telephonyprotocols/csdagt/script/SSCRREAD.CPP	Tue Feb 02 01:41:59 2010 +0200
@@ -0,0 +1,268 @@
+// 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 reader
+// 
+//
+
+/**
+ @file Scrread.cpp 
+*/
+
+#include "SSCRREAD.H"
+#include "ND_STD.H"
+#include "SLOGGER.H"
+
+// TLinePosition definitions 
+
+TLinePosition::TLinePosition(TInt aLineCount,TInt aLineStart,TInt aLineLength,TInt aOffset)
+	: iLineCount(aLineCount), iLineStart(aLineStart), iLineLength(aLineLength), iOffset(aOffset)
+/**
+Constructor for TLinePosition.
+
+@param aLineCount is line count.
+@param aLineStart is line start.
+@param aLineLength is line length.
+@param aOffset is line offset.
+*/
+	{}
+
+TLinePosition& TLinePosition::operator=(const TLinePosition& aLinePosition)
+/**
+TLinePosition =-operator.
+
+@param aLinePosition a reference to line position for comparison.
+*/
+	{
+	iLineCount=aLinePosition.iLineCount;
+	iLineStart=aLinePosition.iLineStart;
+	iLineLength=aLinePosition.iLineLength;
+	iOffset=aLinePosition.iOffset;
+	return (*this);
+	}
+
+void TLinePosition::Reset()
+/**
+Reset.
+*/
+	{
+	iLineCount=0;
+	iLineStart=0;
+	iLineLength=0;
+	iOffset=0;
+	}
+
+// TScriptStatus definitions 
+
+TScriptStatus::TScriptStatus(TInt& aOffset,TPtrC& aLine,TBool& aSkip,TBool& aSkipModeToggleReq)
+	: iOffset(aOffset), iLine(aLine), iSkip(aSkip), iSkipModeToggleReq(aSkipModeToggleReq)
+/**
+Constructor for TScriptStatus.
+
+@param aOffset a reference to script offset.
+@param aLine a reference to script line.
+@param aSkip a reference to skip
+@param aSkipModeToggleReq a reference to skip mode toggle.
+*/
+	{}
+
+TScriptStatus::TScriptStatus(const TScriptStatus& aStatus)
+	: iOffset(aStatus.iOffset), iLine(aStatus.iLine), iSkip(aStatus.iSkip), iSkipModeToggleReq(aStatus.iSkipModeToggleReq)
+/**
+Constructor for TScriptStatus.
+
+@param aStatus a reference to script status.
+*/
+	{}
+
+// CScriptReader (NetDial Script Reader) definitions
+
+CScriptReader* CScriptReader::NewL(TInt aBufferSize)
+/**
+2 phased constructor for CScriptReader, first phase.
+
+@param aBufferSize is buffer size for script reader.
+@exception Leaves if ConstructL() leaves, or not enough memory is available.
+@return a new CScriptReader object.
+*/
+	{
+	CScriptReader* p=new(ELeave) CScriptReader();
+	CleanupStack::PushL(p);
+	p->ConstructL(aBufferSize);
+	CleanupStack::Pop();
+	return p;
+	}
+
+CScriptReader::CScriptReader() 
+	: iScript(NULL,0), iCurrentPosition()
+/**
+Constructor for CScriptReader, used in the first phase of construction.
+*/
+	{}
+
+void CScriptReader::ConstructL(TInt aBufferSize)
+/**
+Instantiate member variables.
+
+@param aBufferSize is buffer size for script reader.
+*/
+	{
+	__FLOG_STMT(_LIT8(logString,"Script:\tCreating Buffer Of Size %d");)
+	__FLOG_STATIC1(KNetDialLogFolder(),KNetDialLogFile(),TRefByValue<const TDesC8>(logString()),aBufferSize);
+	iScriptBuffer=HBufC::NewL(aBufferSize);
+	TPtr temp=iScriptBuffer->Des();
+	iScript.Set(temp);
+	iLoggingOn=ETrue;
+	}
+
+CScriptReader::~CScriptReader()
+/**
+Destructor.
+Delete members.
+*/
+	{
+	delete iScriptBuffer;
+	}
+
+void CScriptReader::SetScript(const TDesC& aScript)
+/**
+Set script and reset buffers.
+@param aScript a reference to used script.
+*/
+	{
+	iScript.Copy(aScript);
+	iCurrentPosition.Reset();
+	iScriptSet=ETrue;
+	iSkip=EFalse;
+	}
+
+TBool CScriptReader::IsScriptSet() const
+/**
+Set script and reset buffers.
+
+@return iScriptSet flag.
+*/
+	{
+	return iScriptSet;
+	}	
+
+TScriptStatus CScriptReader::ScriptStatus()
+/**
+Set script and reset buffers.
+
+@return TScriptStatus.
+*/
+	{
+	return TScriptStatus(iCurrentPosition.iOffset,iCurrentLine,iSkip,iSkipModeToggleReq);
+	}
+
+TInt CScriptReader::GetNextLine()
+/**
+Get next line.
+
+@return current line from GetCurrentLine().
+*/
+	{
+	iCurrentPosition.iLineStart+=iCurrentPosition.iLineLength;		// adjust to the start of the next line
+	return GetCurrentLine();
+	}
+	
+TInt CScriptReader::GetCurrentLine()
+/**
+Get current line.
+
+@return current line.
+*/
+	{
+	TInt activeLen=iScript.Length()-iCurrentPosition.iLineStart;	// length of the script which is still unread
+	if (activeLen==0)
+		return KErrScriptCompleted;
+	
+	TPtrC activeDes;
+	activeDes.Set(iScript.Right(activeLen));
+
+	TBool isLastLineWithoutReturn=EFalse;
+	TInt posCR=activeDes.Locate(KCarriageReturn);
+	TInt posLF=activeDes.Locate(KLineFeed);
+	if(posCR==KErrNotFound && posLF==KErrNotFound)
+		isLastLineWithoutReturn=ETrue;
+
+	if (isLastLineWithoutReturn)
+		iCurrentPosition.iLineLength=activeDes.Length();
+	else
+		{
+		if (posCR==KErrNotFound)
+			posCR = KMaxTInt;
+		if (posLF==KErrNotFound)
+			posLF = KMaxTInt;
+		TInt pos = Min(posCR,posLF);
+		iCurrentPosition.iLineLength=pos+1;
+		}
+
+	iCurrentLine.Set(activeDes.Left(iCurrentPosition.iLineLength));		// for script status
+	iCurrentPosition.iOffset=0;
+	iCurrentPosition.iLineCount++;
+	if (iLoggingOn)
+		{
+		TBuf<KLogBufferSize> line;
+		line.Copy(activeDes.Left(Min(KLogBufferSize,iCurrentPosition.iLineLength)));
+		if (iSkip)
+			{
+			__FLOG_STMT(_LIT(logString1,"Script Line #%d:\t[Skip] : %S");)
+			__FLOG_STATIC2(KNetDialLogFolder(),KNetDialLogFile(),TRefByValue<const TDesC>(logString1()),iCurrentPosition.iLineCount,&line);
+			}
+		else
+			{
+			__FLOG_STMT(_LIT(logString2,"Script Line #%d:\t%S");)
+			__FLOG_STATIC2(KNetDialLogFolder(),KNetDialLogFile(),TRefByValue<const TDesC>(logString2()),iCurrentPosition.iLineCount,&line);
+			}
+		}
+	return KErrNone;
+	}
+
+void CScriptReader::CurrentPos(TLinePosition& aPosition,TInt aOffset)
+/**
+Get the current position and change the offset to aOffset.
+
+@param aPosition a reference to line position.
+@param aOffset is offset.
+*/
+	{
+	aPosition=iCurrentPosition;
+	aPosition.iOffset=aOffset;
+	}
+
+void CScriptReader::SetCurrentPos(TLinePosition aPosition)
+/**
+Set current position to aPos and aLine
+
+@param aPosition is line position.
+*/
+	{
+	iCurrentPosition=aPosition;
+	}
+
+TInt CScriptReader::Reset()
+/**
+Reset counters and flags
+*/
+	{
+	iLoggingOn=ETrue;
+	iCurrentPosition.Reset();
+	TInt ret=GetCurrentLine();
+	__ASSERT_DEBUG(!iScriptSet || ret==KErrNone, User::Invariant());
+	GetCurrentLine();
+	iSkip=EFalse;
+	iSkipModeToggleReq=EFalse;
+	return ret;
+	}