TInt SkipToNextCommand(TLex& aLex) { if ((aLex.Offset() == 0) && (aLex.Remainder().Find(KPartialCommandStart) == 0)) { return KErrNone; } return SkipTo(aLex, KCommandStart); }
TInt SkipToEnd(TLex& aLex, const TDesC& aDes) { TInt ret = aLex.Remainder().Find(aDes); if (ret >= 0) { aLex.Inc(ret + aDes.Length()); return KErrNone; } return KErrNotFound; }
TPtrC LineRemainder(TLex& aLex) { aLex.Mark(); if (SkipTo(aLex, KNewLine) == KErrNone) { return aLex.MarkedToken(); } else { return aLex.Remainder(); } }
TPtrC NextCommand(TLex& aLex) { TPtrC command; if (SkipToNextCommand(aLex) == KErrNone) { SkipToEnd(aLex, KPartialCommandStart); aLex.Mark(); aLex.SkipCharacters(); command.Set(aLex.MarkedToken()); } else { aLex.Inc(aLex.Remainder().Length()); } return command; }
TPtrC TextToNextCommand(TLex& aLex) { aLex.Mark(); if (SkipToNextCommand(aLex) != KErrNone) { aLex.Inc(aLex.Remainder().Length()); } TLex lex(aLex.MarkedToken()); // Strip leading white space. while (!lex.Eos()) { if (lex.Peek().IsSpace()) { lex.Get(); } else { break; } } lex.Mark(); TInt startOffset = lex.Offset(); // Remove trailing white space. lex.Inc(lex.Remainder().Length()); while (lex.Offset() > startOffset) { lex.UnGet(); if (!lex.Peek().IsSpace()) { lex.Get(); break; } } return lex.MarkedToken(); }
void CCommandInfoFile::AddSubCommandL(TLex& aNameLex, TLex& aDataLex, RFs& aFs, const TDesC& aFileName) { TPtrC subCommandName(NextWord(aNameLex)); TBool found(EFalse); for (TInt i = (iChildren.Count() - 1); i >= 0; --i) { if (iChildren[i]->Name() == subCommandName) { iChildren[i]->AddSubCommandL(aNameLex, aDataLex, aFs, aFileName); found = ETrue; break; } } __ASSERT_ALWAYS(found || (aNameLex.Remainder().Length() == 0), IoUtils::Panic(ECifSubCommandParentNotFound)); if (!found) { CCommandInfoFile* subCommand = new(ELeave) CCommandInfoFile(*this); CleanupStack::PushL(subCommand); subCommand->iName.Set(subCommandName); subCommand->ReadDetailsL(aDataLex, aFs, aFileName); iChildren.AppendL(subCommand); CleanupStack::Pop(subCommand); } }
// // ParseMessageL() // // Simple Notification: // Looks for number of messages and "From:" field // writes numMsg into the parsed field array, sets // entry.iDetails to the "From:" // Complicated Notification: // does the above and writes everything else into // the array.... // void CEmailNotificationParser::ParseMessageL() { TBool isSimpleNotification = EFalse; TLex tokenLex; TPtrC fieldName; TPtrC fieldValue; // reset parsedfield array for(TInt i = iParsedFieldArray->Count();--i>=0;) (*iParsedFieldArray)[i]->SetFieldValueL(_L("")); // Set extraction mark at first character iSms.SkipSpaceAndMark(); if(iSms.Peek() == KCharSlash) { // Check first line is <header> iSms.SkipCharacters(); if (iSms.MarkedToken() != KEmailHeader) { User::Leave(KBspInvalidMessage); } // Get <new-amount> from second line and check for terminating linefeed iSms.SkipSpaceAndMark(); } // Val() seeks forward from next char position, looking for valid // digits and incrementing next char as it goes. if (!(iSms.Val(iMessageCount) == KErrNone && iMessageCount >= 0)) // If marked token is not a valid positive integer { iMessageCount = 0; User::Leave(KBspInvalidMessage); } else { fieldValue.Set(iSms.MarkedToken()); // The message count.. AddParsedFieldL(KHeaderNumberMessages, fieldValue, ETrue); } // Next character may now be at newline or space after integer. // If at space, advance to newline. while (iSms.Peek() != KCharLineFeed && !iSms.Eos()) iSms.Inc(); iSms.SkipSpaceAndMark(); // Now parse the rest of the fields, if any. while (!iSms.Eos()) { while (iSms.Peek() != KCharLineFeed && !iSms.Eos()) iSms.Inc(); // Skip to next delimiter if (iSms.Eos()) break; // we've finished break out of the function if (iSms.TokenLength() == 0) User::Leave(KBspSmartMessageInvalidToken); // Parsing.... tokenLex.Assign(iSms.MarkedToken()); // Assign token to a new TLex while (tokenLex.Peek() != KCharColon && !tokenLex.Eos()) tokenLex.Inc(); // Advance to a ':' if (tokenLex.Eos() || tokenLex.TokenLength() == 0) User::Leave(KBspSmartMessageInvalidToken); fieldName.Set(tokenLex.MarkedToken()); // Store (pointer to) field name tokenLex.Inc(); //fix for DEF017686 LeaveIfEmptyFieldsL(fieldName,tokenLex); tokenLex.SkipSpaceAndMark(); // Step past optional spaces //fix for DEF017686 LeaveIfEmptyFieldsL(fieldName,tokenLex); // if it's the server id field try to extract the id value // and match to an existing email service if(fieldName.CompareF(KHeaderServerId)==KErrNone) { TInt valErr = tokenLex.Val(iServerId); if(valErr != KErrNone) iServerId = 0; else GetEmailServicesL(); tokenLex.UnGetToMark(); } fieldValue.Set(tokenLex.Remainder()); // Store (pointer to) field value if(!isSimpleNotification) { AddParsedFieldL(fieldName, fieldValue, EFalse); } // Successfully parsed a token. Move iSms's next character past the // (linefeed) delimiter, set the extraction mark and reiterate to // look for next token. iSms.SkipSpaceAndMark(); } }