cbsref/telephonyrefplugins/atltsy/comms/src/stringparser.cpp
branchRCL_3
changeset 19 630d2f34d719
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cbsref/telephonyrefplugins/atltsy/comms/src/stringparser.cpp	Tue Aug 31 16:23:08 2010 +0300
@@ -0,0 +1,152 @@
+// Copyright (c) 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:
+// CStringParser.
+// 
+
+//user include
+#include "stringparser.h"
+#include "mslogger.h"
+
+CStringParser* CStringParser::NewL(TInt aBufferSize)
+	{
+	LOGTEXT(_L8("[Ltsy] Starting CStringParser::NewL()"));
+	
+	CStringParser* self = CStringParser::NewLC(aBufferSize);
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+CStringParser* CStringParser::NewLC(TInt aBufferSize)
+	{
+	LOGTEXT(_L8("[Ltsy] Starting CStringParser::NewLC()"));
+	
+	CStringParser* self = new (ELeave) CStringParser;
+	CleanupStack::PushL(self);
+	self->ConstructL(aBufferSize);
+	return self;
+	}
+
+CStringParser::~CStringParser()
+	{
+	User::Free(iBuffer);
+	}
+
+CStringParser::CStringParser()
+	{
+	}
+
+void CStringParser::ConstructL(TInt aBufferSize)
+	{
+	LOGTEXT(_L8("[Ltsy] Starting CStringParser::ConstructL()"));
+	CreateL(aBufferSize);
+	}
+
+TPtrC8 CStringParser::Buffer() const
+	{
+	return TPtrC8(iBuffer, iLastChar-iBuffer);
+	}
+
+TPtrC8 CStringParser::CurrentLine() const
+	{
+	TInt len=iLastChar-iLineStart;
+	if (len>0 && iInDelimiter)
+		len-=1;
+	return TPtrC8(iLineStart, len);	
+	}
+
+void CStringParser::ClearBuffer()
+	{
+	iLastChar = iBuffer;
+	iLineStart = iBuffer;
+	iInDelimiter = ETrue;	
+	}
+
+//
+// Remove current line, which is always at the end of the buffer
+//
+void CStringParser::ClearCurrentLine()
+	{
+	iLastChar = iLineStart;
+	iInDelimiter = ETrue;	
+	}
+
+void CStringParser::CreateL(TInt aBufSize)
+	{
+	iBuffer = (TText8*)User::AllocL(aBufSize);
+	iBufferEnd = (iBuffer+aBufSize)-1;
+	ClearBuffer();
+	}
+
+
+void CStringParser::SetReadLineNotify(MCommReadLineNotifier* aNofity)
+	{
+	iReadLineNotify = aNofity;
+	}
+
+
+void CStringParser::ProcessReadString(const TDesC8& aReadString)
+	{
+	LOGTEXT(_L8("[Ltsy] Starting CStringParse::ProcessReadString()"));
+	LOGTEXT2(_L8("[Ltsy] Read String = %S"), &aReadString);
+	for (TInt nBufferOffset = 0; nBufferOffset < aReadString.Length(); nBufferOffset++)
+		{
+		TText8 tChar = aReadString[nBufferOffset];
+		
+		// we have already found a char which is a delimiter of the Line
+        // so would dismiss any of delimiter following this one already found		
+		if (iInDelimiter && (tChar == '\r' || tChar == '\n'))
+			{
+			continue;
+			}
+		
+		// move on lastchar
+		*iLastChar++ = tChar;
+		// Diacarding characters if our buffer was overflowed
+		if (iLastChar >= iBufferEnd)
+			{
+			iLastChar = iBufferEnd;
+			}
+        // we anyway to find out the delimiter and notify the obser the line was found 		
+		if (tChar == '\r' || tChar == '\n')
+			{
+			iInDelimiter = ETrue;
+			TPtrC8 tLine(CurrentLine());
+			LOGTEXT2(_L8("[Ltsy] Line Content = %S"), &tLine);
+			TRAPD(err, iReadLineNotify->NotifyOneLineFoundL(KErrNone, tLine));
+			if (err != KErrNone)
+				{
+				ClearCurrentLine();
+				}
+			}
+		else
+			{
+			if(iInDelimiter) // the last char is a delimiter
+			    {
+				iInDelimiter=EFalse;
+			    iLineStart=iLastChar-1;	
+			    if(tChar == '>')
+			    	{
+			    	TPtrC8 tLine(CurrentLine());
+			    	TRAPD(err, iReadLineNotify->NotifyOneLineFoundL(KErrNone, tLine));
+					if (err != KErrNone)
+						{
+						ClearCurrentLine();
+						}			    	
+			    	}
+				}   
+			}
+		}
+	LOGTEXT(_L8("[Ltsy] End CStringParse::ProcessReadString()"));
+	}
+//End of file