Exemplo n.º 1
0
 public void ParseAppendSpace(ref MimeStringList phrase)
 {
     if (position == start || bytes[position - 1] != 32)
         phrase.AppendFragment(SpaceLine);
     else
         phrase.AppendFragment(new MimeString(bytes, position - 1, 1));
 }
Exemplo n.º 2
0
 public void ParseCFWS(bool save, ref MimeStringList phrase, bool handleISO2022)
 {
     do {
         var count = MimeScan.SkipLwsp(bytes, position, end - position);
         if (save && count != 0)
             phrase.AppendFragment(new MimeString(bytes, position, count));
         position += count;
         if (position != end) {
             if (bytes[position] == 40)
                 this.ParseComment(save, false, ref phrase, handleISO2022);
             else
                 goto label_6;
         }
     } while (this.ParseNextLine());
     goto label_7;
     label_6:
     return;
     label_7:
     ;
 }
Exemplo n.º 3
0
 private bool ParseEscapeSequence(bool save, ref MimeStringList outStr)
 {
     var num1 = this.ParseGet();
     var num2 = this.ParseGet();
     var num3 = this.ParseGet();
     if (num3 != 0)
         this.ParseUnget();
     if (num2 != 0)
         this.ParseUnget();
     if (num1 != 0)
         this.ParseUnget();
     var num4 = 0;
     var flag = false;
     switch (num1) {
         case 36:
             if (num2 == 66 || num2 == 65 || num2 == 64) {
                 num4 = 2;
                 flag = true;
                 break;
             }
             if (num2 == 40 && (num3 == 67 || num3 == 68)) {
                 num4 = 3;
                 flag = true;
             }
             break;
         case 40:
             if (num2 == 73) {
                 flag = true;
                 num4 = 2;
                 break;
             }
             if (num2 == 66 || num2 == 74 || num2 == 72)
                 num4 = 2;
             break;
         case 78:
         case 79:
             if (num2 >= 33) {
                 num4 = 2;
                 if (num3 >= 33)
                     num4 = 3;
             }
             break;
     }
     while (num4-- != 0) {
         int num5 = this.ParseGet();
         if (save)
             outStr.AppendFragment(new MimeString(bytes, position - 1, 1, 536870912U));
     }
     return flag;
 }
Exemplo n.º 4
0
 public void ParseAppendLastByte(ref MimeStringList phrase)
 {
     phrase.AppendFragment(new MimeString(bytes, position - 1, 1));
 }
Exemplo n.º 5
0
 public void ParseWhitespace(bool save, ref MimeStringList phrase)
 {
     do {
         var count = MimeScan.SkipLwsp(bytes, position, end - position);
         if (save && count != 0)
             phrase.AppendFragment(new MimeString(bytes, position, count));
         position += count;
     } while (position == end && this.ParseNextLine());
 }
Exemplo n.º 6
0
 private void ParseEscapedString(bool save, ref MimeStringList outStr, out bool singleByte)
 {
     var flag = bytes[position] == 27;
     if (save)
         outStr.AppendFragment(new MimeString(bytes, position, 1, 536870912U));
     ++position;
     if (flag && !this.ParseEscapeSequence(save, ref outStr))
         singleByte = true;
     else {
         singleByte = false;
         do {
             var count = MimeScan.ScanJISString(bytes, position, end - position, ref singleByte);
             if (save && count != 0)
                 outStr.AppendFragment(new MimeString(bytes, position, count, 536870912U));
             position += count;
         } while (!singleByte && this.ParseNextLine());
         if (flag || position == end || bytes[position] != 15)
             return;
         if (save)
             outStr.AppendFragment(new MimeString(bytes, position, 1, 536870912U));
         ++position;
     }
 }
Exemplo n.º 7
0
 public void ParseToEnd(ref MimeStringList phrase)
 {
     if (position != end) {
         phrase.AppendFragment(new MimeString(bytes, position, end - position));
         position = end;
     }
     while (this.ParseNextLine()) {
         phrase.AppendFragment(new MimeString(bytes, start, end - start));
         position = end;
     }
 }
Exemplo n.º 8
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);
 }
Exemplo n.º 9
0
 public void ParseQString(bool save, ref MimeStringList phrase, bool handleISO2022)
 {
     var quotedPair = false;
     if (save)
         phrase.AppendFragment(new MimeString(bytes, position, 1, 268435456U));
     ++position;
     var singleByte = true;
     do {
         var count = MimeScan.ScanQuotedString(bytes, position, end - position, handleISO2022, ref quotedPair);
         if (count != 0) {
             if (save)
                 phrase.AppendFragment(new MimeString(bytes, position, count));
             position += count;
         }
         if (position != end) {
             if (bytes[position] == 14 || bytes[position] == 27)
                 this.ParseEscapedString(save, ref phrase, out singleByte);
             else {
                 if (save)
                     phrase.AppendFragment(new MimeString(bytes, position, 1, 268435456U));
                 ++position;
                 if (bytes[position - 1] == 34)
                     return;
                 quotedPair = true;
             }
         }
     } while (this.ParseNextLine());
     if (!save || !singleByte)
         return;
     phrase.AppendFragment(new MimeString(MimeString.DoubleQuote, 0, MimeString.DoubleQuote.Length, 268435456U));
 }
Exemplo n.º 10
0
 public bool ParseToDelimiter(bool ignoreNextByte, bool separateWithWhitespace, ref MimeStringList phrase)
 {
     var flag = false;
     var num = ignoreNextByte ? 1 : 0;
     while (true) {
         var characterCount = 0;
         var count = num + MimeScan.FindEndOf(MimeScan.Token.Atom, bytes, position + num, end - position - num, out characterCount, allowUTF8);
         if (count != 0) {
             flag = true;
             if (phrase.Length != 0 && separateWithWhitespace) {
                 if (position == start || bytes[position - 1] != 32)
                     phrase.AppendFragment(SpaceLine);
                 else {
                     --position;
                     ++count;
                 }
             }
             separateWithWhitespace = false;
             phrase.AppendFragment(new MimeString(bytes, position, count));
             position += count;
         }
         if (position == end && this.ParseNextLine())
             num = 0;
         else
             break;
     }
     return flag;
 }
Exemplo n.º 11
0
 public void ParseParameterValue(ref MimeStringList value, ref bool goodValue, bool handleISO2022)
 {
     var mimeStringList = new MimeStringList();
     goodValue = true;
     while (position != end || this.ParseNextLine()) {
         var ch = bytes[position];
         switch (ch) {
             case 34:
                 value.Reset();
                 mimeStringList.Reset();
                 this.ParseQString(true, ref value, handleISO2022);
                 return;
             case 40:
                 this.ParseCFWS(true, ref mimeStringList, handleISO2022);
                 continue;
             default:
                 if (!MimeScan.IsLWSP(ch)) {
                     if (ch == 59)
                         return;
                     var offset = position;
                     do {
                         var bytesUsed = 1;
                         if (!MimeScan.IsToken(ch)) {
                             if (allowUTF8 && ch >= 128) {
                                 if (!MimeScan.IsUTF8NonASCII(bytes, position, end, out bytesUsed)) {
                                     bytesUsed = 1;
                                     goodValue = false;
                                 }
                             } else
                                 goodValue = false;
                         }
                         position += bytesUsed;
                         if (position != end) {
                             ch = bytes[position];
                             switch (ch) {
                                 case 59:
                                 case 40:
                                     goto label_17;
                                 default:
                                     continue;
                             }
                         }
                         break;
                     } while (!MimeScan.IsLWSP(ch));
                     label_17:
                     value.TakeOverAppend(ref mimeStringList);
                     value.AppendFragment(new MimeString(bytes, offset, position - offset));
                     continue;
                 }
                 goto case (byte) 40;
         }
     }
 }
Exemplo n.º 12
0
 public void ParseDomainLiteral(bool save, ref MimeStringList domain)
 {
     var flag = false;
     var offset = position;
     ++position;
     byte num;
     do {
         if (position == end) {
             if (offset != position && save)
                 domain.AppendFragment(new MimeString(bytes, offset, position - offset));
             if (!this.ParseNextLine()) {
                 offset = position;
                 break;
             }
             offset = position;
         }
         num = bytes[position++];
         if (flag)
             flag = false;
         else if (num == 92)
             flag = true;
     } while (num != 93);
     if (offset == position || !save)
         return;
     domain.AppendFragment(new MimeString(bytes, offset, position - offset));
 }
Exemplo n.º 13
0
 public void ParseComment(bool save, bool saveInnerOnly, ref MimeStringList comment, bool handleISO2022)
 {
     var level = 1;
     var quotedPair = false;
     var num1 = 0;
     if (save && !saveInnerOnly)
         comment.AppendFragment(new MimeString(bytes, position, 1));
     ++position;
     do {
         var num2 = MimeScan.ScanComment(bytes, position, end - position, handleISO2022, ref level, ref quotedPair);
         if (num2 != 0) {
             if (save) {
                 if (level == 0 && saveInnerOnly)
                     num1 = 1;
                 comment.AppendFragment(new MimeString(bytes, position, num2 - num1));
             }
             position += num2;
             if (level == 0)
                 break;
         }
         if (position != end && (bytes[position] == 14 || bytes[position] == 27)) {
             bool singleByte;
             this.ParseEscapedString(save, ref comment, out singleByte);
         }
     } while (this.ParseNextLine());
 }
Exemplo n.º 14
0
 public AddressParserResult ParseNextMailbox(ref MimeStringList displayName, ref MimeStringList address)
 {
     var addressParserResult = groupInProgress ? AddressParserResult.GroupInProgress : AddressParserResult.Mailbox;
     var parserStage = ParserStage.BEGIN;
     var mimeStringList1 = new MimeStringList();
     var mimeStringList2 = new MimeStringList();
     var mimeStringList3 = new MimeStringList();
     var flag1 = true;
     var flag2 = false;
     var ignoreNextByte = false;
     if (!this.Initialized)
         throw new System.InvalidOperationException(Resources.Strings.AddressParserNotInitialized);
     while (true) {
         byte num1;
         do {
             do {
                 do {
                     do {
                         if (valueParser.ParseToDelimiter(ignoreNextByte, !flag1 && flag2, ref mimeStringList1)) {
                             flag2 = false;
                             ignoreNextByte = false;
                             flag1 = false;
                         }
                         num1 = valueParser.ParseGet();
                         var num2 = num1;
                         if (num2 <= 34U) {
                             switch (num2) {
                                 case 0:
                                     goto label_24;
                                 case 9:
                                 case 10:
                                 case 13:
                                 case 32:
                                     valueParser.ParseWhitespace(false, ref mimeStringList3);
                                     flag2 = true;
                                     continue;
                                 case 34:
                                     valueParser.ParseUnget();
                                     if (mimeStringList1.Length != 0 && !flag1)
                                         valueParser.ParseAppendSpace(ref mimeStringList1);
                                     else
                                         flag1 = false;
                                     valueParser.ParseQString(true, ref mimeStringList1, true);
                                     flag2 = true;
                                     continue;
                             }
                         } else if (num2 <= 46U) {
                             switch (num2) {
                                 case 40:
                                     if (mimeStringList2.Length != 0)
                                         mimeStringList2.Reset();
                                     valueParser.ParseUnget();
                                     if (ignoreComments) {
                                         valueParser.ParseComment(true, false, ref mimeStringList2, true);
                                         if (flag2)
                                             mimeStringList1.AppendFragment(new MimeString(" "));
                                         mimeStringList1.TakeOverAppend(ref mimeStringList2);
                                     } else
                                         valueParser.ParseComment(true, true, ref mimeStringList2, true);
                                     flag2 = true;
                                     continue;
                                 case 44:
                                     goto label_24;
                                 case 46:
                                     valueParser.ParseAppendLastByte(ref mimeStringList1);
                                     flag1 = true;
                                     continue;
                             }
                         } else {
                             switch (num2) {
                                 case 58:
                                 case 59:
                                 case 60:
                                 case 62:
                                 case 64:
                                 case 91:
                                 case 93:
                                     goto label_24;
                             }
                         }
                         valueParser.ParseUnget();
                         ignoreNextByte = true;
                         continue;
                         label_24:
                         switch (parserStage) {
                             case ParserStage.BEGIN:
                                 var num3 = num1;
                                 if (num3 <= 44U) {
                                     if (num3 != 0) {
                                         if (num3 != 44)
                                             goto label_41;
                                     } else
                                         goto label_40;
                                 } else {
                                     switch (num3) {
                                         case 58:
                                             continue;
                                         case 59:
                                             groupInProgress = false;
                                             addressParserResult = AddressParserResult.Mailbox;
                                             break;
                                         case 60:
                                             goto label_38;
                                         case 62:
                                             goto label_39;
                                         case 64:
                                             goto label_35;
                                         case 91:
                                             goto label_36;
                                         default:
                                             goto label_41;
                                     }
                                 }
                                 if (mimeStringList1.GetLength(4026531839U) != 0) {
                                     displayName.TakeOver(ref mimeStringList1);
                                     goto label_89;
                                 }
                                 mimeStringList1.Reset();
                                 continue;
                             case ParserStage.ANGLEADDR:
                                 goto label_42;
                             case ParserStage.ADDRSPEC:
                                 goto label_60;
                             case ParserStage.ROUTEDOMAIN:
                                 goto label_75;
                             case ParserStage.END:
                                 goto label_85;
                             default:
                                 goto label_89;
                         }
                     } while (mimeStringList1.GetLength(4026531839U) == 0);
                     displayName.TakeOver(ref mimeStringList1);
                     groupInProgress = true;
                     return AddressParserResult.GroupStart;
                     label_35:
                     var length = mimeStringList1.Length;
                     valueParser.ParseAppendLastByte(ref mimeStringList1);
                     address.TakeOver(ref mimeStringList1);
                     parserStage = ParserStage.ADDRSPEC;
                     continue;
                     label_36:
                     if (!useSquareBrackets) {
                         valueParser.ParseUnget();
                         ignoreNextByte = true;
                         continue;
                     }
                     label_38:
                     displayName.TakeOver(ref mimeStringList1);
                     parserStage = ParserStage.ANGLEADDR;
                     continue;
                     label_39:
                     mimeStringList1.Reset();
                     continue;
                     label_40:
                     displayName.TakeOver(ref mimeStringList1);
                     goto label_89;
                     label_41:
                     valueParser.ParseUnget();
                     ignoreNextByte = true;
                     continue;
                     label_42:
                     var num4 = num1;
                     if (num4 <= 44U) {
                         if (num4 != 0) {
                             if (num4 == 44)
                                 goto label_57;
                             goto label_59;
                         }
                         goto label_58;
                     }
                     switch (num4) {
                         case 58:
                             goto label_56;
                         case 60:
                             continue;
                         case 62:
                             goto label_55;
                         case 64:
                             if (mimeStringList1.Length == 0) {
                                 parserStage = ParserStage.ROUTEDOMAIN;
                                 continue;
                             }
                             valueParser.ParseAppendLastByte(ref mimeStringList1);
                             address.TakeOver(ref mimeStringList1);
                             parserStage = ParserStage.ADDRSPEC;
                             continue;
                         case 91:
                             if (!useSquareBrackets) {
                                 valueParser.ParseUnget();
                                 ignoreNextByte = true;
                                 continue;
                             }
                             goto case (byte) 60;
                         case 93:
                             goto label_53;
                         default:
                             goto label_59;
                     }
                 } while (mimeStringList1.Length == 0);
                 valueParser.ParseUnget();
                 ignoreNextByte = true;
                 continue;
                 label_53:
                 if (!useSquareBrackets) {
                     valueParser.ParseUnget();
                     ignoreNextByte = true;
                     continue;
                 }
                 label_55:
                 address.TakeOver(ref mimeStringList1);
                 parserStage = address.Length != 0 || displayName.Length != 0 ? ParserStage.END : ParserStage.BEGIN;
                 continue;
                 label_56:
                 mimeStringList1.Reset();
                 continue;
                 label_57:
                 ;
             } while (displayName.Length == 0 && mimeStringList1.Length == 0);
             label_58:
             address.TakeOver(ref mimeStringList1);
             break;
             label_59:
             valueParser.ParseUnget();
             ignoreNextByte = true;
             continue;
             label_60:
             var num5 = num1;
             if (num5 <= 44U) {
                 if (num5 != 0 && num5 != 44)
                     goto label_74;
             } else {
                 switch (num5) {
                     case 59:
                         groupInProgress = false;
                         break;
                     case 60:
                         if (displayName.Length == 0) {
                             displayName.TakeOverAppend(ref address);
                             parserStage = ParserStage.ANGLEADDR;
                             continue;
                         }
                         valueParser.ParseUnget();
                         ignoreNextByte = true;
                         continue;
                     case 62:
                         address.TakeOverAppend(ref mimeStringList1);
                         parserStage = ParserStage.END;
                         continue;
                     case 91:
                         if (mimeStringList1.Length == 0) {
                             valueParser.ParseUnget();
                             valueParser.ParseDomainLiteral(true, ref mimeStringList1);
                             address.TakeOverAppend(ref mimeStringList1);
                             parserStage = ParserStage.END;
                             continue;
                         }
                         valueParser.ParseUnget();
                         ignoreNextByte = true;
                         continue;
                     case 93:
                         if (!useSquareBrackets) {
                             valueParser.ParseUnget();
                             ignoreNextByte = true;
                             continue;
                         }
                         goto case (byte) 62;
                     default:
                         goto label_74;
                 }
             }
             address.TakeOverAppend(ref mimeStringList1);
         } while (address.Length == 0 && displayName.Length == 0 && num1 != 0);
         break;
         label_74:
         valueParser.ParseUnget();
         ignoreNextByte = true;
         continue;
         label_75:
         var num6 = num1;
         if (num6 <= 44U) {
             if (num6 != 0) {
                 if (num6 != 44)
                     goto label_84;
             } else
                 break;
         } else {
             switch (num6) {
                 case 58:
                     break;
                 case 62:
                     mimeStringList1.Reset();
                     parserStage = ParserStage.END;
                     continue;
                 case 91:
                     mimeStringList1.Reset();
                     valueParser.ParseUnget();
                     valueParser.ParseDomainLiteral(false, ref mimeStringList3);
                     continue;
                 case 93:
                     if (!useSquareBrackets) {
                         valueParser.ParseUnget();
                         ignoreNextByte = true;
                         continue;
                     }
                     goto case (byte) 62;
                 default:
                     goto label_84;
             }
         }
         mimeStringList1.Reset();
         parserStage = ParserStage.ANGLEADDR;
         continue;
         label_84:
         valueParser.ParseUnget();
         ignoreNextByte = true;
         continue;
         label_85:
         mimeStringList1.Reset();
         switch (num1) {
             case 0:
             case 44:
                 if (address.Length == 0 && displayName.Length == 0 && num1 != 0) {
                     parserStage = ParserStage.BEGIN;
                     continue;
                 }
                 goto label_89;
             case 59:
                 groupInProgress = false;
                 goto case (byte) 0;
             default:
                 continue;
         }
     }
     label_89:
     if (displayName.Length == 0 && mimeStringList2.Length != 0 && address.Length != 0)
         displayName.TakeOver(ref mimeStringList2);
     if (address.Length == 0 && displayName.Length == 0)
         addressParserResult = AddressParserResult.End;
     return addressParserResult;
 }
Exemplo n.º 15
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);
 }