private void Parse() { this.Reset(); parsed = true; var headerDecodingOptions = this.GetHeaderDecodingOptions(); var valueParser = new ValueParser(this.Lines, headerDecodingOptions.AllowUTF8); var mimeStringList1 = new MimeStringList(); var mimeStringList2 = new MimeStringList(); var mimeString1 = new MimeString(); var mimeString2 = MimeString.Empty; var parseState1 = ParseState.None; while (true) { valueParser.ParseWhitespace(true, ref mimeStringList1); var num1 = valueParser.ParseGet(); if (num1 != 0) { if (59 == num1) parseState1 = ParseState.Date; else if (40 == num1 && parseState1 == ParseState.DomainValue) parseState1 = ParseState.DomainAddress; else { valueParser.ParseUnget(); mimeString1 = valueParser.ParseToken(); if (mimeString1.Length == 0) { int num2 = valueParser.ParseGet(); mimeStringList2.TakeOverAppend(ref mimeStringList1); valueParser.ParseAppendLastByte(ref mimeStringList2); continue; } var parseState2 = this.StateFromToken(mimeString1); if (ParseState.None != parseState2) parseState1 = parseState2; } switch (parseState1) { case ParseState.Domain: case ParseState.OptInfo: if (mimeString2.Length != 0) this.FinishClause(ref mimeString2, ref mimeStringList2, headerDecodingOptions.AllowUTF8); else mimeStringList2.Reset(); mimeString2 = mimeString1; valueParser.ParseWhitespace(false, ref mimeStringList1); mimeStringList1.Reset(); ++parseState1; continue; case ParseState.DomainValue: mimeStringList2.TakeOverAppend(ref mimeStringList1); mimeStringList2.AppendFragment(mimeString1); continue; case ParseState.DomainAddress: var flag = mimeString2.CompareEqI(ParamFrom); this.FinishClause(ref mimeString2, ref mimeStringList2, headerDecodingOptions.AllowUTF8); mimeStringList1.Reset(); valueParser.ParseUnget(); valueParser.ParseComment(true, false, ref mimeStringList2, true); var sz1 = mimeStringList2.GetSz(); var str = sz1 == null ? null : Internal.ByteString.BytesToString(sz1, headerDecodingOptions.AllowUTF8); if (flag) fromTcpInfoValue = str; else byTcpInfoValue = str; mimeStringList2.Reset(); parseState1 = ParseState.None; continue; case ParseState.OptInfoValue: mimeStringList2.TakeOverAppend(ref mimeStringList1); mimeStringList2.AppendFragment(mimeString1); continue; case ParseState.Date: this.FinishClause(ref mimeString2, ref mimeStringList2, headerDecodingOptions.AllowUTF8); mimeStringList1.Reset(); valueParser.ParseWhitespace(false, ref mimeStringList1); valueParser.ParseToEnd(ref mimeStringList2); var sz2 = mimeStringList2.GetSz(); dateValue = sz2 == null ? null : Internal.ByteString.BytesToString(sz2, false); continue; case ParseState.None: mimeStringList2.Reset(); continue; default: continue; } } break; } this.FinishClause(ref mimeString2, ref mimeStringList2, headerDecodingOptions.AllowUTF8); }
public MimeString ParseToken(MimeScan.Token token) { var mimeStringList = new MimeStringList(); while (position != end || this.ParseNextLine()) { var characterCount = 0; var endOf = MimeScan.FindEndOf(token, bytes, position, end - position, out characterCount, allowUTF8); if (endOf != 0) { mimeStringList.AppendFragment(new MimeString(bytes, position, endOf)); position += endOf; } else break; } if (mimeStringList.Count == 0) return new MimeString(); if (mimeStringList.Count == 1) return mimeStringList[0]; var sz = mimeStringList.GetSz(); return new MimeString(sz, 0, sz.Length); }
private void FinishClause(ref MimeString param, ref MimeStringList value, bool allowUTF8) { if (param.Length == 0) return; var sz = value.GetSz(); var str = sz == null ? null : Internal.ByteString.BytesToString(sz, allowUTF8); var crcI = param.ComputeCrcI(); if (crcI <= 2556329580U) { if ((int) crcI != 271896810) { if ((int) crcI != 2115158205) { if ((int) crcI == -1738637716) fromValue = str; } else byValue = str; } else forValue = str; } else if ((int) crcI != -1177273070) { if ((int) crcI != -554265150) { if ((int) crcI == -18844241) idValue = str; } else viaValue = str; } else withValue = str; value.Reset(); param = MimeString.Empty; }