diff -r 17af172ffa5f -r 630d2f34d719 cbsref/telephonyrefplugins/atltsy/comms/src/stringparser.cpp --- /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