diff -r 000000000000 -r 7f656887cf89 libraries/iosrv/client/pod_lexer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libraries/iosrv/client/pod_lexer.cpp Wed Jun 23 15:52:26 2010 +0100 @@ -0,0 +1,229 @@ +// pod_lexer.cpp +// +// Copyright (c) 2009 - 2010 Accenture. All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the "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: +// Accenture - Initial contribution +// + +#include "pod_lexer.h" + + +TPodLexer::TPodLexer(const TDesC& aString) + : iLex(aString), iAttributes(0), iAttributeStackIndex(0) + { + } + +void TPodLexer::NextTokenL(TPtrC& aToken, TTokenType& aTokenType, TUint& aAttributes, TBool& aEop, TBool& aEos) + { + aTokenType = ETextBlock; + iScratch.Zero(); + TBool finished(EFalse); + TBool setAttributes(ETrue); + while (!iLex.Eos() && !finished && (iScratch.Length() < (iScratch.MaxLength() - 1))) + { + iLex.Mark(); + TUint16 sequenceIdentifier; + if ((iAttributeStackIndex > 0) && (iLex.Peek() == '>')) + { + if (iScratch.Length() > 0) + { + aAttributes = iAttributes; + setAttributes = EFalse; + finished = ETrue; + } + else + { + iLex.Get(); + aTokenType = EAttributePop; + aAttributes = PopAttribute(); + setAttributes = EFalse; + finished = ETrue; + } + } + else if (IsInteriorSequenceStart(sequenceIdentifier)) + { + if (iScratch.Length() > 0) + { + iLex.UnGetToMark(); + finished = ETrue; + } + else + { + switch (sequenceIdentifier) + { + case 'B': + PushAttribute(EBold); + aAttributes = EBold; + setAttributes = EFalse; + aTokenType = EAttributePush; + finished = ETrue; + break; + case 'C': + PushAttribute(ECode); + aAttributes = ECode; + setAttributes = EFalse; + aTokenType = EAttributePush; + finished = ETrue; + break; + case 'E': + if (iLex.Remainder().Length() >= 3) + { + if (iLex.Remainder().Left(3) == _L("gt>")) + { + iLex.Inc(3); + iScratch.Append('>'); + } + else if (iLex.Remainder().Left(3) == _L("lt>")) + { + iLex.Inc(3); + iScratch.Append('<'); + } + else + { + TUint num; + TInt err = iLex.Val(num); + if (err == KErrNone) + { + iScratch.Append(num); + } + else + { + User::Leave(err); + } + } + } + break; + case 'F': + PushAttribute(EFileName); + aAttributes = EFileName; + setAttributes = EFalse; + aTokenType = EAttributePush; + finished = ETrue; + break; + case 'I': + PushAttribute(EItalic); + aAttributes = EItalic; + setAttributes = EFalse; + aTokenType = EAttributePush; + finished = ETrue; + break; + case 'L': + iLex.Mark(); + SkipToClosingAngleBracket(); + iLex.UnGet(); + iScratch.Copy(iLex.MarkedToken()); + iLex.Get(); + aTokenType = ELink; + finished = ETrue; + break; + case 'S': + case 'X': + PushAttribute(ENull); + aAttributes = ENull; + setAttributes = EFalse; + aTokenType = EAttributePush; + finished = ETrue; + break; + case 'Z': + if (iLex.Peek() == '>') + { + iLex.Inc(); + iLex.Mark(); + } + else + { + User::Leave(KErrArgument); + } + break; + } + } + } + else + { + iScratch.Append(iLex.Get()); + } + } + + if (setAttributes) + { + aAttributes = iAttributes; + } + aToken.Set(iScratch); + aEop = Eop(); + aEos = iLex.Eos(); + } + +TInt TPodLexer::SkipToClosingAngleBracket() + { + TInt numSkippedChars = 0; + while (!iLex.Eos()) + { + TUint16 sequenceIdentifier; + if (IsInteriorSequenceStart(sequenceIdentifier)) + { + numSkippedChars = SkipToClosingAngleBracket(); + } + else if (iLex.Get() == '>') + { + break; + } + else + { + ++numSkippedChars; + } + } + return numSkippedChars; + } + +TBool TPodLexer::Eop() + { + _LIT(KParagraphEnd, "\r\n\r\n"); + return ((iLex.Remainder().Length() >= 4) && (iLex.Remainder().Left(4) == KParagraphEnd)); + } + +TBool TPodLexer::IsInteriorSequenceStart(TUint16& aSequenceIdentifier) + { + if (iLex.Remainder().Length() >= 2) + { + TUint16 first = iLex.Get(); + TUint16 second = iLex.Get(); + if (second == '<') + { + switch (first) + { + case 'B': + case 'C': + case 'E': + case 'F': + case 'I': + case 'L': + case 'S': + case 'X': + case 'Z': + aSequenceIdentifier = first; + return ETrue; + } + } + iLex.Inc(-2); + } + return EFalse; + } + +void TPodLexer::PushAttribute(TAttribute aAttribute) + { + iAttributes |= aAttribute; + iAttributeStack[iAttributeStackIndex++] = aAttribute; + } + +TPodLexer::TAttribute TPodLexer::PopAttribute() + { + TAttribute poppedAttribute = iAttributeStack[--iAttributeStackIndex]; + iAttributes &= ~poppedAttribute; + return poppedAttribute; + } +