示例#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));
 }
示例#2
0
 public MimeAddressParser(MimeStringList lines, MimeAddressParser source)
 {
     this.Initialized = source.Initialized;
     ignoreComments = source.ignoreComments;
     useSquareBrackets = source.useSquareBrackets;
     valueParser = new ValueParser(lines, source.valueParser);
     groupInProgress = source.groupInProgress;
 }
示例#3
0
 public ValueParser(MimeStringList lines, bool allowUTF8)
 {
     this.lines = lines;
     this.allowUTF8 = allowUTF8;
     nextLine = 0;
     bytes = null;
     start = 0;
     end = 0;
     position = 0;
     this.ParseNextLine();
 }
示例#4
0
 public ValueParser(MimeStringList lines, ValueParser valueParser)
 {
     this.lines = lines;
     allowUTF8 = valueParser.allowUTF8;
     nextLine = valueParser.nextLine;
     if (nextLine > 0 && nextLine <= this.lines.Count) {
         int count;
         bytes = this.lines[nextLine - 1].GetData(out start, out count);
         start = valueParser.start;
         position = valueParser.position;
         end = valueParser.end;
     } else {
         bytes = null;
         start = 0;
         end = 0;
         position = 0;
     }
 }
示例#5
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:
     ;
 }
示例#6
0
 public void ParseAppendLastByte(ref MimeStringList phrase)
 {
     phrase.AppendFragment(new MimeString(bytes, position - 1, 1));
 }
示例#7
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;
 }
示例#8
0
 internal AddressItem(ref MimeStringList displayName)
 {
     displayNameFragments.TakeOver(ref displayName);
 }
示例#9
0
文件: Header.cs 项目: Rhombulus/Mime
 internal void SetRawValue(byte[] value, bool markDirty)
 {
     this.RawValueAboutToChange();
     lines = value == null || value.Length == 0 ? new MimeStringList() : new MimeStringList(new MimeString(value));
     if (!markDirty)
         return;
     this.SetDirty();
 }
示例#10
0
文件: Header.cs 项目: Rhombulus/Mime
 internal static long WriteLines(MimeStringList lines, System.IO.Stream stream)
 {
     if (lines.Count == 0) {
         var currentLineLength = new MimeStringLength(0);
         return Header.WriteLineEnd(stream, ref currentLineLength);
     }
     var num = 0L;
     for (var index = 0; index < lines.Count; ++index) {
         int offset;
         int count;
         var data = lines[index].GetData(out offset, out count);
         if (count != 0) {
             if (!MimeScan.IsLWSP(data[offset])) {
                 stream.Write(MimeString.Space, 0, MimeString.Space.Length);
                 num += MimeString.Space.Length;
             }
             stream.Write(data, offset, count);
             num += count;
         }
         var currentLineLength = new MimeStringLength(0);
         num += Header.WriteLineEnd(stream, ref currentLineLength);
     }
     return num;
 }
示例#11
0
文件: Header.cs 项目: Rhombulus/Mime
 internal static MimeStringList MergeLines(MimeStringList lines)
 {
     if (lines.Length == 0)
         return lines;
     var numArray = new byte[lines.Length];
     var destinationIndex = 0;
     for (var index = 0; index < lines.Count; ++index) {
         var mimeString = lines[index];
         mimeString.CopyTo(numArray, destinationIndex);
         destinationIndex += mimeString.Length;
     }
     return new MimeStringList(numArray);
 }
示例#12
0
 internal override void ParseValue(ValueParser parser, bool storeValue)
 {
     var phrase = new MimeStringList();
     parser.ParseCFWS(false, ref phrase, true);
     var mimeString = parser.ParseToken();
     if (!storeValue)
         return;
     if (mimeString.Length == 0)
         disp = string.Empty;
     else
         disp = Header.NormalizeString(mimeString.Data, mimeString.Offset, mimeString.Length, false);
 }
示例#13
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;
 }
示例#14
0
 public void ParseSkipToNextDelimiterByte(byte delimiter)
 {
     var mimeStringList = new MimeStringList();
     while (true) {
         while (position == end) {
             if (!this.ParseNextLine())
                 return;
         }
         var num = bytes[position];
         if (num != delimiter) {
             if (num == 34)
                 this.ParseQString(false, ref mimeStringList, true);
             else if (num == 40)
                 this.ParseComment(false, false, ref mimeStringList, true);
             else {
                 ++position;
                 this.ParseCFWS(false, ref mimeStringList, true);
                 var characterCount = 0;
                 position += MimeScan.FindEndOf(MimeScan.Token.Atom, bytes, position, end - position, out characterCount, allowUTF8);
             }
         } else
             break;
     }
 }
示例#15
0
 internal MimeStringList GetDisplayNameToWrite(EncodingOptions encodingOptions)
 {
     var mimeStringList = displayNameFragments;
     if (mimeStringList.GetLength(4026531839U) == 0 && decodedDisplayName != null && decodedDisplayName.Length != 0) {
         mimeStringList =
             MimeCommon.EncodeValue(
                 (encodingOptions.EncodingFlags & EncodingFlags.QuoteDisplayNameBeforeRfc2047Encoding) == EncodingFlags.None || !this.IsQuotingRequired(decodedDisplayName, encodingOptions.AllowUTF8) ||
                 !MimeCommon.IsEncodingRequired(decodedDisplayName, encodingOptions.AllowUTF8)
                     ? decodedDisplayName
                     : this.QuoteString(decodedDisplayName),
                 encodingOptions,
                 ValueEncodingStyle.Phrase);
         displayNameFragments = mimeStringList;
     } else if ((EncodingFlags.ForceReencode & encodingOptions.EncodingFlags) != EncodingFlags.None)
         mimeStringList = MimeCommon.EncodeValue(this.DisplayName, encodingOptions, ValueEncodingStyle.Phrase);
     return mimeStringList;
 }
示例#16
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));
 }
示例#17
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;
         }
     }
 }
示例#18
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));
 }
示例#19
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());
 }
示例#20
0
 public ValueDecoder(MimeStringList lines, uint linesMask)
 {
     iterator = new ValueIterator(lines, linesMask);
     maxCharsetNameLength = System.Math.Max(60, Globalization.Charset.MaxCharsetNameLength) + 10 + 1;
 }
示例#21
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;
     }
 }
示例#22
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);
 }
示例#23
0
 private static void ParseValue(MimeStringList list, out System.DateTime utcDateTime, out System.TimeSpan timeZoneOffset)
 {
     var phrase = new MimeStringList();
     var valueParser = new ValueParser(list, false);
     var parseStage = ParseStage.DayOfWeek;
     var numArray = new int[8];
     byte num1 = 32;
     while (parseStage != ParseStage.Count) {
         valueParser.ParseCFWS(false, ref phrase, true);
         var ch = valueParser.ParseGet();
         if (ch != 0) {
             if (!MimeScan.IsToken(ch) || ch == 45 || ch == 43) {
                 num1 = ch;
                 valueParser.ParseCFWS(false, ref phrase, true);
             } else {
                 if (MimeScan.IsDigit(ch)) {
                     if (parseStage == ParseStage.DayOfWeek)
                         parseStage = ParseStage.DayOfMonth;
                     if (parseStage == ParseStage.Second && num1 != 58)
                         parseStage = ParseStage.Zone;
                     var num2 = 0;
                     do {
                         ++num2;
                         numArray[(int) parseStage] *= 10;
                         numArray[(int) parseStage] += ch - 48;
                         ch = valueParser.ParseGet();
                     } while (ch != 0 && MimeScan.IsDigit(ch));
                     if (ch != 0)
                         valueParser.ParseUnget();
                     if (parseStage == ParseStage.Year && num2 <= 2)
                         numArray[(int) parseStage] += numArray[(int) parseStage] < 30 ? 2000 : 1900;
                     if (parseStage == ParseStage.Zone && num2 <= 2)
                         numArray[(int) parseStage] *= 100;
                     if (parseStage == ParseStage.Zone && num1 == 45)
                         numArray[(int) parseStage] = -numArray[(int) parseStage];
                     ++parseStage;
                 } else if (MimeScan.IsAlpha(ch)) {
                     valueParser.ParseUnget();
                     var mimeString = valueParser.ParseToken(MimeScan.Token.Alpha);
                     if (parseStage == ParseStage.DayOfWeek)
                         parseStage = ParseStage.DayOfMonth;
                     else if (parseStage == ParseStage.Month) {
                         numArray[(int) parseStage] = DateHeader.MapMonthToInt(mimeString.Data, mimeString.Offset, mimeString.Length);
                         parseStage = ParseStage.Year;
                     } else if (parseStage >= ParseStage.Second) {
                         if (mimeString.Length == 2 && 65 == DateHeader.MakeUpper(mimeString[0]) && 77 == DateHeader.MakeUpper(mimeString[1])) {
                             if (numArray[4] == 12)
                                 numArray[4] = 0;
                             parseStage = ParseStage.Zone;
                         } else if (mimeString.Length == 2 && 80 == DateHeader.MakeUpper(mimeString[0]) && 77 == DateHeader.MakeUpper(mimeString[1])) {
                             if (numArray[4] < 12)
                                 numArray[4] += 12;
                             parseStage = ParseStage.Zone;
                         } else {
                             numArray[7] = (int) DateHeader.MapZoneToInt(mimeString.Data, mimeString.Offset, mimeString.Length);
                             parseStage = ParseStage.Count;
                         }
                     }
                 }
                 num1 = 32;
             }
         } else
             break;
     }
     if (parseStage > ParseStage.Year) {
         var year = numArray[3];
         var month = numArray[2];
         var day = numArray[1];
         var hour = numArray[4];
         var minute = numArray[5];
         var second = numArray[6];
         if (hour == 23 && minute == 59 && second == 60)
             second = 59;
         if (year >= 1900 && year <= 9999 && (month >= 1 && month <= 12) && (day >= 1 && day <= System.DateTime.DaysInMonth(year, month) && (hour >= 0 && hour < 24)) && (minute >= 0 && minute < 60 && second >= 0)) {
             if (second < 60) {
                 try {
                     utcDateTime = new System.DateTime(year, month, day, hour, minute, second, 0, System.DateTimeKind.Utc);
                     goto label_46;
                 } catch (System.ArgumentException ex) {
                     utcDateTime = minDateTime;
                     goto label_46;
                 }
             }
         }
         utcDateTime = minDateTime;
     } else
         utcDateTime = minDateTime;
     label_46:
     if (parseStage == ParseStage.Count && utcDateTime > minDateTime) {
         var hours = numArray[7]/100;
         var minutes = numArray[7]%100;
         if (hours > 99 || hours < -99) {
             hours = 0;
             minutes = 0;
         }
         if (minutes > 59 || minutes < -59)
             minutes = 0;
         timeZoneOffset = new System.TimeSpan(hours, minutes, 0);
         if (utcDateTime.Ticks >= timeZoneOffset.Ticks && System.DateTime.MaxValue.Ticks >= utcDateTime.Ticks - timeZoneOffset.Ticks)
             utcDateTime -= timeZoneOffset;
         else {
             utcDateTime = minDateTime;
             timeZoneOffset = System.TimeSpan.Zero;
         }
     } else
         timeZoneOffset = System.TimeSpan.Zero;
 }
示例#24
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;
 }
示例#25
0
文件: Header.cs 项目: Rhombulus/Mime
 internal static long QuoteAndFold(
     System.IO.Stream stream, MimeStringList fragments, uint inputMask, bool quoteOutput, bool addSpaceAtStart, bool allowUTF8, int lastLineReserve, ref MimeStringLength currentLineLength, ref byte[] scratchBuffer)
 {
     var num = 0L;
     var lineBuffer = new LineBuffer();
     lineBuffer.Length = new MimeStringLength(0);
     lineBuffer.LengthTillLastLWSP = new MimeStringLength(-1);
     if (scratchBuffer == null || scratchBuffer.Length < 998)
         scratchBuffer = new byte[998];
     lineBuffer.Bytes = scratchBuffer;
     var token = quoteOutput ? MimeScan.Token.Spec | MimeScan.Token.Fwsp : MimeScan.Token.Fwsp;
     var autoAddedLastLWSP = false;
     if (addSpaceAtStart && currentLineLength.InBytes != 0) {
         num += Header.WriteToken(Space, 0, new MimeStringLength(1), stream, ref currentLineLength, ref lineBuffer, ref autoAddedLastLWSP, allowUTF8);
         autoAddedLastLWSP = true;
     }
     if (quoteOutput)
         num += Header.WriteToken(DoubleQuote, 0, new MimeStringLength(1), stream, ref currentLineLength, ref lineBuffer, ref autoAddedLastLWSP, allowUTF8);
     for (var index = 0; index < fragments.Count; ++index) {
         var mimeString = fragments[index];
         var offset = 0;
         var count = 0;
         var data = mimeString.GetData(out offset, out count);
         if (((int) mimeString.Mask & (int) inputMask) != 0) {
             do {
                 var characterCount = 0;
                 var nextOf = MimeScan.FindNextOf(token, data, offset, count, out characterCount, allowUTF8);
                 if (nextOf > 0) {
                     num += Header.WriteToken(data, offset, new MimeStringLength(characterCount, nextOf), stream, ref currentLineLength, ref lineBuffer, ref autoAddedLastLWSP, allowUTF8);
                     offset += nextOf;
                     count -= nextOf;
                 }
                 if (count != 0) {
                     switch (data[offset]) {
                         case 34:
                         case 92:
                             if (((int) mimeString.Mask & -536870913) != 0) {
                                 num += Header.WriteToken(
                                     new byte[2] {
                                         92,
                                         data[offset]
                                     },
                                     0,
                                     new MimeStringLength(2),
                                     stream,
                                     ref currentLineLength,
                                     ref lineBuffer,
                                     ref autoAddedLastLWSP,
                                     allowUTF8);
                                 ++offset;
                                 --count;
                                 goto label_15;
                             }
                             break;
                     }
                     num += Header.WriteToken(
                         new byte[1] {
                             data[offset]
                         },
                         0,
                         new MimeStringLength(1),
                         stream,
                         ref currentLineLength,
                         ref lineBuffer,
                         ref autoAddedLastLWSP,
                         allowUTF8);
                     ++offset;
                     --count;
                 }
                 label_15:
                 ;
             } while (count != 0);
         }
     }
     if (quoteOutput)
         num += Header.WriteToken(DoubleQuote, 0, new MimeStringLength(1), stream, ref currentLineLength, ref lineBuffer, ref autoAddedLastLWSP, allowUTF8);
     if (lastLineReserve > 0)
         num += Header.WriteToken(null, 0, new MimeStringLength(lastLineReserve), stream, ref currentLineLength, ref lineBuffer, ref autoAddedLastLWSP, allowUTF8);
     if (lineBuffer.Length.InBytes > 0) {
         stream.Write(lineBuffer.Bytes, 0, lineBuffer.Length.InBytes);
         num += lineBuffer.Length.InBytes;
         currentLineLength.IncrementBy(lineBuffer.Length);
     }
     return num;
 }
示例#26
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());
 }
示例#27
0
文件: Header.cs 项目: Rhombulus/Mime
 internal void SetRawValue(string value, bool markDirty, bool allowUTF8)
 {
     if (string.IsNullOrEmpty(value))
         this.SetRawValue(null, markDirty);
     else {
         var numArray = Internal.ByteString.StringToBytes(value, allowUTF8);
         var num1 = Internal.ByteString.IndexOf(numArray, 10, 0, numArray.Length);
         if (num1 == -1)
             this.SetRawValue(numArray, markDirty);
         else {
             this.RawValueAboutToChange();
             lines = new MimeStringList();
             var offset = 0;
             do {
                 var num2 = num1;
                 while (num2 > offset && numArray[num2 - 1] == 13)
                     --num2;
                 if (num2 > offset)
                     lines.Append(new MimeString(numArray, offset, num2 - offset));
                 offset = num1 + 1;
                 num1 = Internal.ByteString.IndexOf(numArray, 10, offset, numArray.Length - offset);
             } while (num1 != -1);
             if (offset != numArray.Length)
                 lines.Append(new MimeString(numArray, offset, numArray.Length - offset));
             if (!markDirty)
                 return;
             this.SetDirty();
         }
     }
 }
示例#28
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;
     }
 }
示例#29
0
文件: Header.cs 项目: Rhombulus/Mime
 internal void SetRawValue(MimeStringList newLines, bool markDirty)
 {
     this.RawValueAboutToChange();
     lines = newLines;
     if (!markDirty)
         return;
     this.SetDirty();
 }
示例#30
0
 internal bool IsQuotingRequired(MimeStringList displayNameFragments, bool allowUTF8)
 {
     for (var index = 0; index != displayNameFragments.Count; ++index) {
         var mimeStr = displayNameFragments[index];
         if (((int) mimeStr.Mask & -268435457) != 0 && this.IsQuotingRequired(mimeStr, allowUTF8))
             return true;
     }
     return false;
 }