diff --git a/src/console/main.vala b/src/console/main.vala index fdcfcaee..418112a1 100644 --- a/src/console/main.vala +++ b/src/console/main.vala @@ -483,7 +483,8 @@ class ImapConsole : Gtk.Window { Gee.ArrayList data_items = new Gee.ArrayList(); for (int ctr = 1; ctr < args.length; ctr++) { - Geary.Imap.FetchDataSpecifier data_type = Geary.Imap.FetchDataSpecifier.decode(args[ctr]); + Geary.Imap.StringParameter stringp = Geary.Imap.StringParameter.get_best_for(args[ctr]); + Geary.Imap.FetchDataSpecifier data_type = Geary.Imap.FetchDataSpecifier.from_parameter(stringp); data_items.add(data_type); } @@ -578,8 +579,10 @@ class ImapConsole : Gtk.Window { status("Status %s".printf(args[0])); Geary.Imap.StatusDataType[] data_items = new Geary.Imap.StatusDataType[0]; - for (int ctr = 1; ctr < args.length; ctr++) - data_items += Geary.Imap.StatusDataType.decode(args[ctr]); + for (int ctr = 1; ctr < args.length; ctr++) { + Geary.Imap.StringParameter stringp = Geary.Imap.StringParameter.get_best_for(args[ctr]); + data_items += Geary.Imap.StatusDataType.from_parameter(stringp); + } cx.send_async.begin(new Geary.Imap.StatusCommand(new Geary.Imap.MailboxSpecifier(args[0]), data_items), null, on_get_status); diff --git a/src/engine/imap/command/imap-command.vala b/src/engine/imap/command/imap-command.vala index 5d3d8bac..01cd331c 100644 --- a/src/engine/imap/command/imap-command.vala +++ b/src/engine/imap/command/imap-command.vala @@ -74,13 +74,8 @@ public class Geary.Imap.Command : RootParameters { add(tag); add(new AtomParameter(name)); if (args != null) { - foreach (string arg in args) { - StringParameter? stringp = StringParameter.get_best_for(arg); - if (stringp != null) - add(stringp); - else - add(new LiteralParameter(new Memory.StringBuffer(arg))); - } + foreach (string arg in args) + add(Parameter.get_for_string(arg)); } } diff --git a/src/engine/imap/command/imap-list-command.vala b/src/engine/imap/command/imap-list-command.vala index 54d37d91..d54d815d 100644 --- a/src/engine/imap/command/imap-list-command.vala +++ b/src/engine/imap/command/imap-list-command.vala @@ -52,7 +52,7 @@ public class Geary.Imap.ListCommand : Command { if (return_param == null || return_param.size == 0) return; - add(StringParameter.get_best_for("return")); + add(StringParameter.get_best_for_unchecked("return")); add(return_param); } } diff --git a/src/engine/imap/command/imap-list-return-parameter.vala b/src/engine/imap/command/imap-list-return-parameter.vala index df88f87d..c1dd2b4f 100644 --- a/src/engine/imap/command/imap-list-return-parameter.vala +++ b/src/engine/imap/command/imap-list-return-parameter.vala @@ -30,7 +30,7 @@ public class Geary.Imap.ListReturnParameter : ListParameter { } public void add_special_use() { - add(StringParameter.get_best_for(SPECIAL_USE)); + add(StringParameter.get_best_for_unchecked(SPECIAL_USE)); } } diff --git a/src/engine/imap/command/imap-search-criterion.vala b/src/engine/imap/command/imap-search-criterion.vala index 6e446954..64aec2c0 100644 --- a/src/engine/imap/command/imap-search-criterion.vala +++ b/src/engine/imap/command/imap-search-criterion.vala @@ -44,16 +44,12 @@ public class Geary.Imap.SearchCriterion : BaseObject { * Create a single criterion with a simple name and custom value. */ public SearchCriterion.string_value(string name, string value) { - Parameter? valuep = StringParameter.get_best_for(value); - if (valuep == null) - valuep = new LiteralParameter(new Memory.StringBuffer(value)); - parameters.add(prep_name(name)); - parameters.add(valuep); + parameters.add(Parameter.get_for_string(value)); } private static Parameter prep_name(string name) { - Parameter? namep = StringParameter.get_best_for(name); + Parameter? namep = StringParameter.try_get_best_for(name); if (namep == null) { warning("Using a search name that requires a literal parameter: %s", name); namep = new LiteralParameter(new Memory.StringBuffer(name)); @@ -106,7 +102,7 @@ public class Geary.Imap.SearchCriterion : BaseObject { /** * The IMAP SEARCH KEYWORD criterion, or if the {@link MessageFlag} has a macro, that value. */ - public static SearchCriterion has_flag(MessageFlag flag) { + public static SearchCriterion has_flag(MessageFlag flag) throws ImapError { string? keyword = flag.get_search_keyword(true); if (keyword != null) return new SearchCriterion.simple(keyword); @@ -117,7 +113,7 @@ public class Geary.Imap.SearchCriterion : BaseObject { /** * The IMAP SEARCH UNKEYWORD criterion, or if the {@link MessageFlag} has a macro, that value. */ - public static SearchCriterion has_not_flag(MessageFlag flag) { + public static SearchCriterion has_not_flag(MessageFlag flag) throws ImapError { string? keyword = flag.get_search_keyword(false); if (keyword != null) return new SearchCriterion.simple(keyword); diff --git a/src/engine/imap/message/imap-fetch-body-data-specifier.vala b/src/engine/imap/message/imap-fetch-body-data-specifier.vala index 83af2814..ff2e98de 100644 --- a/src/engine/imap/message/imap-fetch-body-data-specifier.vala +++ b/src/engine/imap/message/imap-fetch-body-data-specifier.vala @@ -331,7 +331,8 @@ public class Geary.Imap.FetchBodyDataSpecifier : BaseObject, Gee.Hashable", out subset_start) != 1) { throw new ImapError.PARSE_ERROR("Improperly formed octet \"%s\" in %s", octet_string, - stringp.value); + stringp.to_string()); } if (subset_start < 0) { throw new ImapError.PARSE_ERROR("Invalid octet count %d in %s", subset_start, - stringp.value); + stringp.to_string()); } } diff --git a/src/engine/imap/message/imap-fetch-data-specifier.vala b/src/engine/imap/message/imap-fetch-data-specifier.vala index e6aa693f..b7dace54 100644 --- a/src/engine/imap/message/imap-fetch-data-specifier.vala +++ b/src/engine/imap/message/imap-fetch-data-specifier.vala @@ -78,12 +78,12 @@ public enum Geary.Imap.FetchDataSpecifier { } /** - * Converts a plain string into a {@link FetchDataType}. + * Decoders a {@link StringParameter} into a {@link FetchDataType} using {@link decode}. * - * @throws ImapError.PARSE_ERROR if not a recognized value. + * @see decode */ - public static FetchDataSpecifier decode(string value) throws ImapError { - switch (Ascii.strdown(value)) { + public static FetchDataSpecifier from_parameter(StringParameter strparam) throws ImapError { + switch (strparam.as_lower()) { case "uid": return UID; @@ -124,7 +124,8 @@ public enum Geary.Imap.FetchDataSpecifier { return FULL; default: - throw new ImapError.PARSE_ERROR("\"%s\" is not a valid fetch-command data item", value); + throw new ImapError.PARSE_ERROR("\"%s\" is not a valid fetch-command data item", + strparam.to_string()); } } @@ -135,15 +136,6 @@ public enum Geary.Imap.FetchDataSpecifier { return new AtomParameter(to_string()); } - /** - * Decoders a {@link StringParameter} into a {@link FetchDataType} using {@link decode}. - * - * @see decode - */ - public static FetchDataSpecifier from_parameter(StringParameter strparam) throws ImapError { - return decode(strparam.value); - } - /** * Returns the appropriate {@link FetchDataDecoder} for this {@link FetchDataType}. * diff --git a/src/engine/imap/message/imap-flag.vala b/src/engine/imap/message/imap-flag.vala index 0a2e2ce4..dbb3c7b9 100644 --- a/src/engine/imap/message/imap-flag.vala +++ b/src/engine/imap/message/imap-flag.vala @@ -35,7 +35,7 @@ public abstract class Geary.Imap.Flag : BaseObject, Gee.Hashable list = new Gee.ArrayList(); for (int ctr = 0; ctr < listp.size; ctr++) - list.add(new MessageFlag(listp.get_as_string(ctr).value)); + list.add(new MessageFlag(listp.get_as_string(ctr).ascii)); return new MessageFlags(list); } diff --git a/src/engine/imap/message/imap-status-data-type.vala b/src/engine/imap/message/imap-status-data-type.vala index 22e0ea15..07e45761 100644 --- a/src/engine/imap/message/imap-status-data-type.vala +++ b/src/engine/imap/message/imap-status-data-type.vala @@ -45,8 +45,8 @@ public enum Geary.Imap.StatusDataType { } } - public static StatusDataType decode(string value) throws ImapError { - switch (Ascii.strdown(value)) { + public static StatusDataType from_parameter(StringParameter stringp) throws ImapError { + switch (stringp.as_lower()) { case "messages": return MESSAGES; @@ -63,16 +63,12 @@ public enum Geary.Imap.StatusDataType { return UNSEEN; default: - throw new ImapError.PARSE_ERROR("Unknown status data type \"%s\"", value); + throw new ImapError.PARSE_ERROR("Unknown status data type \"%s\"", stringp.to_string()); } } public StringParameter to_parameter() { return new AtomParameter(to_string()); } - - public static StatusDataType from_parameter(StringParameter stringp) throws ImapError { - return decode(stringp.value); - } } diff --git a/src/engine/imap/message/imap-tag.vala b/src/engine/imap/message/imap-tag.vala index 11fb9ece..d02bf2da 100644 --- a/src/engine/imap/message/imap-tag.vala +++ b/src/engine/imap/message/imap-tag.vala @@ -24,12 +24,12 @@ public class Geary.Imap.Tag : AtomParameter, Gee.Hashable { private static Tag? unassigned = null; private static Tag? continuation = null; - public Tag(string value) { - base (value); + public Tag(string ascii) { + base (ascii); } public Tag.from_parameter(StringParameter strparam) { - base (strparam.value); + base (strparam.ascii); } internal static void init() { @@ -67,15 +67,15 @@ public class Geary.Imap.Tag : AtomParameter, Gee.Hashable { if (stringp is QuotedStringParameter) return false; - if (String.is_empty(stringp.value)) + if (stringp.is_empty()) return false; - if (stringp.value == UNTAGGED_VALUE || stringp.value == CONTINUATION_VALUE) + if (stringp.equals_cs(UNTAGGED_VALUE) || stringp.equals_cs(CONTINUATION_VALUE)) return true; int index = 0; for (;;) { - char ch = stringp.value[index++]; + char ch = stringp.ascii[index++]; if (ch == String.EOS) break; @@ -87,26 +87,26 @@ public class Geary.Imap.Tag : AtomParameter, Gee.Hashable { } public bool is_tagged() { - return (value != UNTAGGED_VALUE) && (value != CONTINUATION_VALUE) && (value != UNASSIGNED_VALUE); + return !equals_cs(UNTAGGED_VALUE) && !equals_cs(CONTINUATION_VALUE) && !equals_cs(UNASSIGNED_VALUE); } public bool is_continuation() { - return value == CONTINUATION_VALUE; + return equals_cs(CONTINUATION_VALUE); } public bool is_assigned() { - return (value != UNASSIGNED_VALUE) && (value != CONTINUATION_VALUE); + return !equals_cs(UNASSIGNED_VALUE) && !equals_cs(CONTINUATION_VALUE); } public uint hash() { - return Ascii.str_hash(value); + return Ascii.str_hash(ascii); } public bool equal_to(Geary.Imap.Tag tag) { if (this == tag) return true; - return equals_cs(tag.value); + return equals_cs(tag.ascii); } } diff --git a/src/engine/imap/parameter/imap-atom-parameter.vala b/src/engine/imap/parameter/imap-atom-parameter.vala index 374ce66d..abe94cfa 100644 --- a/src/engine/imap/parameter/imap-atom-parameter.vala +++ b/src/engine/imap/parameter/imap-atom-parameter.vala @@ -26,7 +26,7 @@ public class Geary.Imap.AtomParameter : Geary.Imap.UnquotedStringParameter { * {@inheritDoc} */ public override void serialize(Serializer ser, Tag tag) throws Error { - ser.push_unquoted_string(value); + ser.push_unquoted_string(ascii); } } diff --git a/src/engine/imap/parameter/imap-list-parameter.vala b/src/engine/imap/parameter/imap-list-parameter.vala index e7427523..e561102a 100644 --- a/src/engine/imap/parameter/imap-list-parameter.vala +++ b/src/engine/imap/parameter/imap-list-parameter.vala @@ -420,7 +420,7 @@ public class Geary.Imap.ListParameter : Geary.Imap.Parameter { StringParameter? stringp = get_if_string(index); if (stringp != null) - return new Memory.StringBuffer(stringp.value); + return stringp.as_buffer(); return null; } diff --git a/src/engine/imap/parameter/imap-nil-parameter.vala b/src/engine/imap/parameter/imap-nil-parameter.vala index f9a26a13..f52a7c27 100644 --- a/src/engine/imap/parameter/imap-nil-parameter.vala +++ b/src/engine/imap/parameter/imap-nil-parameter.vala @@ -41,7 +41,7 @@ public class Geary.Imap.NilParameter : Geary.Imap.Parameter { * list. */ public static bool is_nil(StringParameter stringp) { - return Ascii.stri_equal(VALUE, stringp.value); + return stringp.equals_ci(VALUE); } /** diff --git a/src/engine/imap/parameter/imap-number-parameter.vala b/src/engine/imap/parameter/imap-number-parameter.vala index 354a3f6c..f6c29f52 100644 --- a/src/engine/imap/parameter/imap-number-parameter.vala +++ b/src/engine/imap/parameter/imap-number-parameter.vala @@ -41,12 +41,12 @@ public class Geary.Imap.NumberParameter : UnquotedStringParameter { * No checking is performed to verify that the string is only composed of numeric characters. * Use {@link is_numeric}. */ - public NumberParameter.from_string(string str) { - base (str); + public NumberParameter.from_ascii(string ascii) { + base (ascii); } /** - * Returns true if the string is composed of numeric characters. + * Returns true if the string is composed of numeric 7-bit characters. * * The only non-numeric character allowed is a dash ('-') at the beginning of the string to * indicate a negative value. However, note that almost every IMAP use of a number is for a diff --git a/src/engine/imap/parameter/imap-parameter.vala b/src/engine/imap/parameter/imap-parameter.vala index 85bcc1d5..7f1f6a35 100644 --- a/src/engine/imap/parameter/imap-parameter.vala +++ b/src/engine/imap/parameter/imap-parameter.vala @@ -13,6 +13,23 @@ */ public abstract class Geary.Imap.Parameter : BaseObject { + /** + * Returns an appropriate {@link Parameter} for the string. + * + * get_for_string() goes from simple to complexity in terms of parameter encoding. It uses + * {@link StringParameter.get_best_for} first to attempt to produced an unquoted, then unquoted, + * string. (It will also produce a {@link NumberParameter} if appropriate.) If the string + * cannot be held in those forms, it returns a {@link LiteralParameter}, which is capable of + * transmitting 8-bit data. + */ + public static Parameter get_for_string(string value) { + try { + return StringParameter.get_best_for(value); + } catch (ImapError ierr) { + return new LiteralParameter(new Memory.StringBuffer(value)); + } + } + /** * Invoked when the {@link Parameter} is to be serialized out to the network. * diff --git a/src/engine/imap/parameter/imap-quoted-string-parameter.vala b/src/engine/imap/parameter/imap-quoted-string-parameter.vala index 55e2d2c5..06362e26 100644 --- a/src/engine/imap/parameter/imap-quoted-string-parameter.vala +++ b/src/engine/imap/parameter/imap-quoted-string-parameter.vala @@ -16,22 +16,22 @@ */ public class Geary.Imap.QuotedStringParameter : Geary.Imap.StringParameter { - public QuotedStringParameter(string value) { - base (value); + public QuotedStringParameter(string ascii) { + base (ascii); } /** * {@inheritDoc} */ public override string to_string() { - return "\"%s\"".printf(value); + return "\"%s\"".printf(ascii); } /** * {@inheritDoc} */ public override void serialize(Serializer ser, Tag tag) throws Error { - ser.push_quoted_string(value); + ser.push_quoted_string(ascii); } } diff --git a/src/engine/imap/parameter/imap-string-parameter.vala b/src/engine/imap/parameter/imap-string-parameter.vala index c9d3a9b0..0a164f54 100644 --- a/src/engine/imap/parameter/imap-string-parameter.vala +++ b/src/engine/imap/parameter/imap-string-parameter.vala @@ -21,21 +21,21 @@ public abstract class Geary.Imap.StringParameter : Geary.Imap.Parameter { /** - * The unquoted, decoded string. + * The unquoted, decoded string as 7-bit ASCII. */ - public string value { get; private set; } + public string ascii { get; private set; } /** * Returns {@link value} or null if value is empty (zero-length). */ - public string? nullable_value { + public string? nullable_ascii { get { - return String.is_empty(value) ? null : value; + return String.is_empty(ascii) ? null : ascii; } } - protected StringParameter(string value) { - this.value = value; + protected StringParameter(string ascii) { + this.ascii = ascii; } /** @@ -48,11 +48,12 @@ public abstract class Geary.Imap.StringParameter : Geary.Imap.Parameter { * Because of these restrictions, should only be used when the context or syntax of the * Parameter is unknown or uncertain. * - * @return null if the string must be represented with a {@link LiteralParameter}. + * @throws ImapError.NOT_SUPPORTED if the string must be represented as a {@link LiteralParameter}. + * @see Parameter.get_for_string */ - public static StringParameter? get_best_for(string value) { + public static StringParameter get_best_for(string value) throws ImapError { if (NumberParameter.is_numeric(value, null)) - return new NumberParameter.from_string(value); + return new NumberParameter.from_ascii(value); switch (DataFormat.is_quoting_required(value)) { case DataFormat.Quoting.REQUIRED: @@ -62,26 +63,54 @@ public abstract class Geary.Imap.StringParameter : Geary.Imap.Parameter { return new UnquotedStringParameter(value); case DataFormat.Quoting.UNALLOWED: - return null; + throw new ImapError.NOT_SUPPORTED("String must be a literal parameter"); default: assert_not_reached(); } } + /** + * Like {@link get_best_for} but the library will panic if the value cannot be turned into + * a {@link StringParameter}. + * + * This should ''only'' be used with string constants that are guaranteed 7-bit ASCII. + */ + public static StringParameter get_best_for_unchecked(string value) { + try { + return get_best_for(value); + } catch (ImapError ierr) { + error("Unable to create StringParameter for \"%s\": %s", value, ierr.message); + } + } + + /** + * Like {@link get_best_for} but returns null if the value cannot be stored as a + * {@link StringParameter}. + * + * @see Parameter.get_for_string + */ + public static StringParameter? try_get_best_for(string value) { + try { + return get_best_for(value); + } catch (ImapError ierr) { + return null; + } + } + /** * Can be used by subclasses to properly serialize the string value according to quoting rules. * * NOTE: Literal data is not currently supported. */ protected void serialize_string(Serializer ser) throws Error { - switch (DataFormat.is_quoting_required(value)) { + switch (DataFormat.is_quoting_required(ascii)) { case DataFormat.Quoting.REQUIRED: - ser.push_quoted_string(value); + ser.push_quoted_string(ascii); break; case DataFormat.Quoting.OPTIONAL: - ser.push_unquoted_string(value); + ser.push_unquoted_string(ascii); break; case DataFormat.Quoting.UNALLOWED: @@ -92,32 +121,46 @@ public abstract class Geary.Imap.StringParameter : Geary.Imap.Parameter { } } + /** + * Returns the string as a {@link Memory.Buffer}. + */ + public Memory.Buffer as_buffer() { + return new Memory.StringBuffer(ascii); + } + + /** + * Returns true if the string is empty (zero-length). + */ + public bool is_empty() { + return String.is_empty(ascii); + } + /** * Case-sensitive comparison. */ public bool equals_cs(string value) { - return Ascii.str_equal(this.value, value); + return Ascii.str_equal(ascii, value); } /** * Case-insensitive comparison. */ public bool equals_ci(string value) { - return Ascii.stri_equal(this.value, value); + return Ascii.stri_equal(ascii, value); } /** * Returns the string lowercased. */ public string as_lower() { - return Ascii.strdown(value); + return Ascii.strdown(ascii); } /** * Returns the string uppercased. */ public string as_upper() { - return Ascii.strup(value); + return Ascii.strup(ascii); } /** @@ -127,7 +170,7 @@ public abstract class Geary.Imap.StringParameter : Geary.Imap.Parameter { *. added later. */ public int as_int(int clamp_min = int.MIN, int clamp_max = int.MAX) throws ImapError { - return int.parse(value).clamp(clamp_min, clamp_max); + return int.parse(ascii).clamp(clamp_min, clamp_max); } /** @@ -137,7 +180,7 @@ public abstract class Geary.Imap.StringParameter : Geary.Imap.Parameter { *. added later. */ public long as_long(int clamp_min = int.MIN, int clamp_max = int.MAX) throws ImapError { - return long.parse(value).clamp(clamp_min, clamp_max); + return long.parse(ascii).clamp(clamp_min, clamp_max); } /** @@ -147,7 +190,7 @@ public abstract class Geary.Imap.StringParameter : Geary.Imap.Parameter { *. added later. */ public int64 as_int64(int64 clamp_min = int64.MIN, int64 clamp_max = int64.MAX) throws ImapError { - return int64.parse(value).clamp(clamp_min, clamp_max); + return int64.parse(ascii).clamp(clamp_min, clamp_max); } } diff --git a/src/engine/imap/parameter/imap-unquoted-string-parameter.vala b/src/engine/imap/parameter/imap-unquoted-string-parameter.vala index 766c6b23..d771c07c 100644 --- a/src/engine/imap/parameter/imap-unquoted-string-parameter.vala +++ b/src/engine/imap/parameter/imap-unquoted-string-parameter.vala @@ -18,22 +18,22 @@ */ public class Geary.Imap.UnquotedStringParameter : Geary.Imap.StringParameter { - public UnquotedStringParameter(string value) { - base (value); + public UnquotedStringParameter(string ascii) { + base (ascii); } /** * {@inheritDoc} */ public override void serialize(Serializer ser, Tag tag) throws Error { - ser.push_unquoted_string(value); + ser.push_unquoted_string(ascii); } /** * {@inheritDoc} */ public override string to_string() { - return value; + return ascii; } } diff --git a/src/engine/imap/response/imap-capabilities.vala b/src/engine/imap/response/imap-capabilities.vala index f74dd255..b6f6e5d2 100644 --- a/src/engine/imap/response/imap-capabilities.vala +++ b/src/engine/imap/response/imap-capabilities.vala @@ -30,7 +30,7 @@ public class Geary.Imap.Capabilities : Geary.GenericCapabilities { } public bool add_parameter(StringParameter stringp) { - return parse_and_add_capability(stringp.value); + return parse_and_add_capability(stringp.ascii); } public override string to_string() { diff --git a/src/engine/imap/response/imap-fetch-data-decoder.vala b/src/engine/imap/response/imap-fetch-data-decoder.vala index 6f9e2cac..142a2a30 100644 --- a/src/engine/imap/response/imap-fetch-data-decoder.vala +++ b/src/engine/imap/response/imap-fetch-data-decoder.vala @@ -97,7 +97,7 @@ public class Geary.Imap.MessageFlagsDecoder : Geary.Imap.FetchDataDecoder { protected override MessageData decode_list(ListParameter listp) throws ImapError { Gee.List flags = new Gee.ArrayList(); for (int ctr = 0; ctr < listp.size; ctr++) - flags.add(new MessageFlag(listp.get_as_string(ctr).value)); + flags.add(new MessageFlag(listp.get_as_string(ctr).ascii)); return new MessageFlags(flags); } @@ -109,7 +109,7 @@ public class Geary.Imap.InternalDateDecoder : Geary.Imap.FetchDataDecoder { } protected override MessageData decode_string(StringParameter stringp) throws ImapError { - return InternalDate.decode(stringp.value); + return InternalDate.decode(stringp.ascii); } } @@ -142,17 +142,17 @@ public class Geary.Imap.EnvelopeDecoder : Geary.Imap.FetchDataDecoder { // Although Message-ID is required to be returned by IMAP, it may be blank if the email // does not supply it (optional according to RFC822); deal with this cognitive dissonance - if (message_id != null && String.is_empty(message_id.value)) + if (message_id != null && message_id.is_empty()) message_id = null; - return new Envelope((sent != null) ? new Geary.RFC822.Date(sent.value) : null, - new Geary.RFC822.Subject.decode(subject.value), + return new Envelope((sent != null) ? new Geary.RFC822.Date(sent.ascii) : null, + new Geary.RFC822.Subject.decode(subject.ascii), parse_addresses(from), parse_addresses(sender), parse_addresses(reply_to), (to != null) ? parse_addresses(to) : null, (cc != null) ? parse_addresses(cc) : null, (bcc != null) ? parse_addresses(bcc) : null, - (in_reply_to != null) ? new Geary.RFC822.MessageIDList.from_rfc822_string(in_reply_to.value) : null, - (message_id != null) ? new Geary.RFC822.MessageID(message_id.value) : null); + (in_reply_to != null) ? new Geary.RFC822.MessageIDList.from_rfc822_string(in_reply_to.ascii) : null, + (message_id != null) ? new Geary.RFC822.MessageID(message_id.ascii) : null); } // TODO: This doesn't handle group lists (see Johnson, p.268) -- this will throw an @@ -167,10 +167,10 @@ public class Geary.Imap.EnvelopeDecoder : Geary.Imap.FetchDataDecoder { StringParameter domain = fields.get_as_empty_string(3); Geary.RFC822.MailboxAddress addr = new Geary.RFC822.MailboxAddress.imap( - (name != null) ? name.nullable_value : null, - (source_route != null) ? source_route.nullable_value : null, - mailbox.value, - domain.value); + (name != null) ? name.nullable_ascii : null, + (source_route != null) ? source_route.nullable_ascii : null, + mailbox.ascii, + domain.ascii); list.add(addr); } diff --git a/src/engine/imap/response/imap-fetched-data.vala b/src/engine/imap/response/imap-fetched-data.vala index 6972c6df..a759b85e 100644 --- a/src/engine/imap/response/imap-fetched-data.vala +++ b/src/engine/imap/response/imap-fetched-data.vala @@ -71,7 +71,7 @@ public class Geary.Imap.FetchedData : Object { else fetched_data.body_data_map.set(specifier, Memory.EmptyBuffer.instance); } else { - FetchDataSpecifier data_item = FetchDataSpecifier.decode(data_item_param.value); + FetchDataSpecifier data_item = FetchDataSpecifier.from_parameter(data_item_param); FetchDataDecoder? decoder = data_item.get_decoder(); if (decoder == null) { debug("Unable to decode fetch response for \"%s\": No decoder available", diff --git a/src/engine/imap/response/imap-mailbox-attributes.vala b/src/engine/imap/response/imap-mailbox-attributes.vala index b23af14d..63599a0f 100644 --- a/src/engine/imap/response/imap-mailbox-attributes.vala +++ b/src/engine/imap/response/imap-mailbox-attributes.vala @@ -33,7 +33,7 @@ public class Geary.Imap.MailboxAttributes : Geary.Imap.Flags { public static MailboxAttributes from_list(ListParameter listp) throws ImapError { Gee.Collection list = new Gee.ArrayList(); for (int ctr = 0; ctr < listp.size; ctr++) - list.add(new MailboxAttribute(listp.get_as_string(ctr).value)); + list.add(new MailboxAttribute(listp.get_as_string(ctr).ascii)); return new MailboxAttributes(list); } diff --git a/src/engine/imap/response/imap-mailbox-information.vala b/src/engine/imap/response/imap-mailbox-information.vala index 741a958b..93f1b0e9 100644 --- a/src/engine/imap/response/imap-mailbox-information.vala +++ b/src/engine/imap/response/imap-mailbox-information.vala @@ -65,7 +65,7 @@ public class Geary.Imap.MailboxInformation : Object { continue; } - attrlist.add(new MailboxAttribute(stringp.value)); + attrlist.add(new MailboxAttribute(stringp.ascii)); } // decode everything @@ -77,10 +77,10 @@ public class Geary.Imap.MailboxInformation : Object { // Set \Inbox to standard path if (canonical_inbox && Geary.Imap.MailboxAttribute.SPECIAL_FOLDER_INBOX in attributes) { return new MailboxInformation(MailboxSpecifier.inbox, - (delim != null) ? delim.nullable_value : null, attributes); + (delim != null) ? delim.nullable_ascii : null, attributes); } else { return new MailboxInformation(new MailboxSpecifier.from_parameter(mailbox), - (delim != null) ? delim.nullable_value : null, attributes); + (delim != null) ? delim.nullable_ascii : null, attributes); } } diff --git a/src/engine/imap/response/imap-response-code-type.vala b/src/engine/imap/response/imap-response-code-type.vala index c7776f53..3bb0c84e 100644 --- a/src/engine/imap/response/imap-response-code-type.vala +++ b/src/engine/imap/response/imap-response-code-type.vala @@ -61,17 +61,17 @@ public class Geary.Imap.ResponseCodeType : BaseObject, Gee.Hashable