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)); }
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; }
public ValueParser(MimeStringList lines, bool allowUTF8) { this.lines = lines; this.allowUTF8 = allowUTF8; nextLine = 0; bytes = null; start = 0; end = 0; position = 0; this.ParseNextLine(); }
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; } }
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: ; }
public void ParseAppendLastByte(ref MimeStringList phrase) { phrase.AppendFragment(new MimeString(bytes, position - 1, 1)); }
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; }
internal AddressItem(ref MimeStringList displayName) { displayNameFragments.TakeOver(ref displayName); }
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(); }
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; }
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); }
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); }
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; }
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; } }
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; }
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)); }
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; } } }
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)); }
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()); }
public ValueDecoder(MimeStringList lines, uint linesMask) { iterator = new ValueIterator(lines, linesMask); maxCharsetNameLength = System.Math.Max(60, Globalization.Charset.MaxCharsetNameLength) + 10 + 1; }
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; } }
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 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; }
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; }
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; }
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()); }
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(); } } }
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; } }
internal void SetRawValue(MimeStringList newLines, bool markDirty) { this.RawValueAboutToChange(); lines = newLines; if (!markDirty) return; this.SetDirty(); }
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; }