/// <summary> /// Initializes a new instance of the <see cref="MimeKit.ContentDisposition"/> class. /// </summary> /// <remarks> /// The disposition should either be <see cref="ContentDisposition.Attachment"/> /// or <see cref="ContentDisposition.Inline"/>. /// </remarks> /// <param name="disposition">The disposition.</param> /// <exception cref="System.ArgumentNullException"> /// <paramref name="disposition"/> is <c>null</c>. /// </exception> /// <exception cref="System.ArgumentException"> /// <paramref name="disposition"/> is not <c>"attachment"</c> or <c>"inline"</c>. /// </exception> public ContentDisposition(string disposition) { Parameters = new ParameterList(); Disposition = disposition; }
internal static bool TryParse(ParserOptions options, byte[] text, ref int index, int endIndex, bool throwOnError, out ContentDisposition disposition) { string type; int atom; disposition = null; if (!ParseUtils.SkipCommentsAndWhiteSpace(text, ref index, endIndex, throwOnError)) { return(false); } atom = index; if (!ParseUtils.SkipAtom(text, ref index, endIndex)) { if (throwOnError) { throw new ParseException(string.Format("Invalid atom token at position {0}", atom), atom, index); } return(false); } type = Encoding.ASCII.GetString(text, atom, index - atom); if (!ParseUtils.SkipCommentsAndWhiteSpace(text, ref index, endIndex, throwOnError)) { return(false); } disposition = new ContentDisposition(); disposition.disposition = type; if (index >= endIndex) { return(true); } if (text[index] != (byte)';') { if (throwOnError) { throw new ParseException(string.Format("Expected ';' at position {0}", index), index, index); } return(false); } index++; if (!ParseUtils.SkipCommentsAndWhiteSpace(text, ref index, endIndex, throwOnError)) { return(false); } if (index >= endIndex) { return(true); } ParameterList parameters; if (!ParameterList.TryParse(options, text, ref index, endIndex, throwOnError, out parameters)) { return(false); } disposition.Parameters = parameters; return(true); }
internal static bool TryParse(ParserOptions options, byte[] text, ref int index, int endIndex, bool throwOnError, out ContentDisposition disposition) { string type; int atom; disposition = null; if (!ParseUtils.SkipCommentsAndWhiteSpace(text, ref index, endIndex, throwOnError)) { return(false); } if (index >= endIndex) { if (throwOnError) { throw new ParseException(string.Format("Expected atom token at position {0}", index), index, index); } return(false); } atom = index; if (text[index] == '"') { if (throwOnError) { throw new ParseException(string.Format("Unxpected qstring token at position {0}", atom), atom, index); } // Note: This is a work-around for broken mailers that quote the disposition value... // // See https://github.com/jstedfast/MailKit/issues/486 for details. if (!ParseUtils.SkipQuoted(text, ref index, endIndex, throwOnError)) { return(false); } type = CharsetUtils.ConvertToUnicode(options, text, atom, index - atom); type = MimeUtils.Unquote(type); if (string.IsNullOrEmpty(type)) { type = Attachment; } } else { if (!ParseUtils.SkipAtom(text, ref index, endIndex)) { if (throwOnError) { throw new ParseException(string.Format("Invalid atom token at position {0}", atom), atom, index); } // Note: this is a work-around for broken mailers that do not specify a disposition value... // // See https://github.com/jstedfast/MailKit/issues/486 for details. if (index > atom || text[index] != (byte)';') { return(false); } type = Attachment; } else { type = Encoding.ASCII.GetString(text, atom, index - atom); } } disposition = new ContentDisposition(); disposition.disposition = type; if (!ParseUtils.SkipCommentsAndWhiteSpace(text, ref index, endIndex, throwOnError)) { return(false); } if (index >= endIndex) { return(true); } if (text[index] != (byte)';') { if (throwOnError) { throw new ParseException(string.Format("Expected ';' at position {0}", index), index, index); } return(false); } index++; if (!ParseUtils.SkipCommentsAndWhiteSpace(text, ref index, endIndex, throwOnError)) { return(false); } if (index >= endIndex) { return(true); } ParameterList parameters; if (!ParameterList.TryParse(options, text, ref index, endIndex, throwOnError, out parameters)) { return(false); } disposition.Parameters = parameters; return(true); }
internal static bool TryParse(ParserOptions options, byte[] text, ref int index, int endIndex, bool throwOnError, out ContentType contentType) { string type, subtype; int start; contentType = null; if (!ParseUtils.SkipCommentsAndWhiteSpace(text, ref index, endIndex, throwOnError)) { return(false); } start = index; if (!SkipType(text, ref index, endIndex)) { if (throwOnError) { throw new ParseException(string.Format("Invalid type token at position {0}", start), start, index); } return(false); } type = Encoding.ASCII.GetString(text, start, index - start); if (!ParseUtils.SkipCommentsAndWhiteSpace(text, ref index, endIndex, throwOnError)) { return(false); } if (index >= endIndex || text[index] != (byte)'/') { if (throwOnError) { throw new ParseException(string.Format("Expected '/' at position {0}", index), index, index); } return(false); } // skip over the '/' index++; if (!ParseUtils.SkipCommentsAndWhiteSpace(text, ref index, endIndex, throwOnError)) { return(false); } start = index; if (!ParseUtils.SkipToken(text, ref index, endIndex)) { if (throwOnError) { throw new ParseException(string.Format("Invalid atom token at position {0}", start), start, index); } return(false); } subtype = Encoding.ASCII.GetString(text, start, index - start); if (!ParseUtils.SkipCommentsAndWhiteSpace(text, ref index, endIndex, throwOnError)) { return(false); } contentType = new ContentType(type, subtype); if (index >= endIndex) { return(true); } if (text[index] != (byte)';') { if (throwOnError) { throw new ParseException(string.Format("Expected ';' at position {0}", index), index, index); } return(false); } index++; if (!ParseUtils.SkipCommentsAndWhiteSpace(text, ref index, endIndex, throwOnError)) { return(false); } if (index >= endIndex) { return(true); } ParameterList parameters; if (!ParameterList.TryParse(options, text, ref index, endIndex, throwOnError, out parameters)) { return(false); } contentType.Parameters = parameters; return(true); }