예제 #1
0
 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);
 }
예제 #2
0
 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);
 }
예제 #3
0
 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;
 }