From ab9d0c27ad3d3fde6f35fa03987af354ea1dbfda Mon Sep 17 00:00:00 2001 From: Michael James Gratton Date: Thu, 12 Jul 2018 12:38:32 +1000 Subject: [PATCH] Make Imap.Command a top-level type rather than inherit from Parameter. Instead, make the args property a parameter list, and add params to that. This means Command's serialize method have a different signature compared to Parameter's, letting us do some more interesting things with it. --- .../imap/command/imap-append-command.vala | 33 +++++----- src/engine/imap/command/imap-command.vala | 42 ++++++------- .../imap/command/imap-copy-command.vala | 12 ++-- .../imap/command/imap-create-command.vala | 4 +- .../imap/command/imap-examine-command.vala | 27 ++++---- .../imap/command/imap-expunge-command.vala | 29 +++++---- .../imap/command/imap-fetch-command.vala | 61 ++++++++++--------- src/engine/imap/command/imap-id-command.vala | 30 ++++----- .../imap/command/imap-list-command.vala | 33 +++++----- .../imap/command/imap-search-command.vala | 12 ++-- .../imap/command/imap-select-command.vala | 27 ++++---- .../imap/command/imap-status-command.vala | 21 ++++--- .../imap/command/imap-store-command.vala | 34 ++++++----- .../command/imap-create-command-test.vala | 17 ++++-- 14 files changed, 196 insertions(+), 186 deletions(-) diff --git a/src/engine/imap/command/imap-append-command.vala b/src/engine/imap/command/imap-append-command.vala index 9c06eca7..d0cc6c78 100644 --- a/src/engine/imap/command/imap-append-command.vala +++ b/src/engine/imap/command/imap-append-command.vala @@ -1,4 +1,5 @@ -/* Copyright 2016 Software Freedom Conservancy Inc. +/* + * Copyright 2016 Software Freedom Conservancy Inc. * * This software is licensed under the GNU Lesser General Public License * (version 2.1 or later). See the COPYING file in this distribution. @@ -9,23 +10,25 @@ * * See [[http://tools.ietf.org/html/rfc3501#section-6.3.11]] */ - public class Geary.Imap.AppendCommand : Command { + public const string NAME = "append"; - + public AppendCommand(MailboxSpecifier mailbox, MessageFlags? flags, InternalDate? internal_date, Memory.Buffer message) { base (NAME); - - add(mailbox.to_parameter()); - - if (flags != null && flags.size > 0) - add(flags.to_parameter()); - - if (internal_date != null) - add(internal_date.to_parameter()); - - add(new LiteralParameter(message)); - } -} + this.args.add(mailbox.to_parameter()); + + if (flags != null && flags.size > 0) { + this.args.add(flags.to_parameter()); + } + + if (internal_date != null) { + this.args.add(internal_date.to_parameter()); + } + + this.args.add(new LiteralParameter(message)); + } + +} diff --git a/src/engine/imap/command/imap-command.vala b/src/engine/imap/command/imap-command.vala index 9811a012..a6e48179 100644 --- a/src/engine/imap/command/imap-command.vala +++ b/src/engine/imap/command/imap-command.vala @@ -16,7 +16,8 @@ * See [[http://tools.ietf.org/html/rfc3501#section-6]] */ -public class Geary.Imap.Command : RootParameters { +public class Geary.Imap.Command : BaseObject { + /** * All IMAP commands are tagged with an identifier assigned by the client. * @@ -29,45 +30,42 @@ public class Geary.Imap.Command : RootParameters { * @see assign_tag */ public Tag tag { get; private set; } - + /** * The name (or "verb") of the {@link Command}. */ public string name { get; private set; } - + /** - * Zero or more arguments for the {@link Command}. + * The command's arguments as parameters. * - * Note that some Commands have require args and others are optional. The format of the - * arguments ({@link StringParameter}, {@link ListParameter}, etc.) is sometimes crucial. + * Subclassess may append arguments to this before {@link + * serialize} is called, ideally from the constructor. */ - public string[]? args { get; private set; } - + protected ListParameter args { + get; private set; default = new RootParameters(); + } /** - * Create a Command with an unassigned Tag. + * Constructs a new command with an unassigned tag. * - * @see tag + * Any arguments provided here will be converted to appropriate + * string arguments + * + * @see Tag */ public Command(string name, string[]? args = null) { tag = Tag.get_unassigned(); this.name = name; - this.args = args; - - stock_params(); + if (args != null) { + foreach (string arg in args) { + this.args.add(Parameter.get_for_string(arg)); + } + } } /** - * Create a Command with an assigned Tag. * - * @see tag */ - public Command.assigned(Tag tag, string name, string[]? args = null) - requires (tag.is_tagged() && tag.is_assigned()) { - this.tag = tag; - this.name = name; - this.args = args; - - stock_params(); } private void stock_params() { diff --git a/src/engine/imap/command/imap-copy-command.vala b/src/engine/imap/command/imap-copy-command.vala index 1ae1472e..2b25264c 100644 --- a/src/engine/imap/command/imap-copy-command.vala +++ b/src/engine/imap/command/imap-copy-command.vala @@ -1,4 +1,5 @@ -/* Copyright 2016 Software Freedom Conservancy Inc. +/* + * Copyright 2016 Software Freedom Conservancy Inc. * * This software is licensed under the GNU Lesser General Public License * (version 2.1 or later). See the COPYING file in this distribution. @@ -7,16 +8,15 @@ /** * See [[http://tools.ietf.org/html/rfc3501#section-6.4.7]] */ - public class Geary.Imap.CopyCommand : Command { + public const string NAME = "copy"; public const string UID_NAME = "uid copy"; public CopyCommand(MessageSet message_set, MailboxSpecifier destination) { - base (message_set.is_uid ? UID_NAME : NAME); + base(message_set.is_uid ? UID_NAME : NAME); - add(message_set.to_parameter()); - add(destination.to_parameter()); + this.args.add(message_set.to_parameter()); + this.args.add(destination.to_parameter()); } } - diff --git a/src/engine/imap/command/imap-create-command.vala b/src/engine/imap/command/imap-create-command.vala index 0401a264..5652a0da 100644 --- a/src/engine/imap/command/imap-create-command.vala +++ b/src/engine/imap/command/imap-create-command.vala @@ -58,7 +58,7 @@ public class Geary.Imap.CreateCommand : Command { public CreateCommand(MailboxSpecifier mailbox) { base(NAME_ATOM); this.mailbox = mailbox; - add(mailbox.to_parameter()); + this.args.add(mailbox.to_parameter()); } public CreateCommand.special_use(MailboxSpecifier mailbox, @@ -75,7 +75,7 @@ public class Geary.Imap.CreateCommand : Command { use_param.add(new AtomParameter(USE_ATOM)); use_param.add(use_types); - add(use_param); + this.args.add(use_param); } } diff --git a/src/engine/imap/command/imap-examine-command.vala b/src/engine/imap/command/imap-examine-command.vala index 2800b759..5b2e2837 100644 --- a/src/engine/imap/command/imap-examine-command.vala +++ b/src/engine/imap/command/imap-examine-command.vala @@ -1,4 +1,5 @@ -/* Copyright 2016 Software Freedom Conservancy Inc. +/* + * Copyright 2016 Software Freedom Conservancy Inc. * * This software is licensed under the GNU Lesser General Public License * (version 2.1 or later). See the COPYING file in this distribution. @@ -9,18 +10,16 @@ * * @see SelectCommand */ - public class Geary.Imap.ExamineCommand : Command { - public const string NAME = "examine"; - - public MailboxSpecifier mailbox { get; private set; } - - public ExamineCommand(MailboxSpecifier mailbox) { - base (NAME); - - this.mailbox = mailbox; - - add(mailbox.to_parameter()); - } -} + public const string NAME = "examine"; + + public MailboxSpecifier mailbox { get; private set; } + + public ExamineCommand(MailboxSpecifier mailbox) { + base(NAME); + this.mailbox = mailbox; + this.args.add(mailbox.to_parameter()); + } + +} diff --git a/src/engine/imap/command/imap-expunge-command.vala b/src/engine/imap/command/imap-expunge-command.vala index 2e132ac5..be5b3445 100644 --- a/src/engine/imap/command/imap-expunge-command.vala +++ b/src/engine/imap/command/imap-expunge-command.vala @@ -1,4 +1,5 @@ -/* Copyright 2016 Software Freedom Conservancy Inc. +/* + * Copyright 2016 Software Freedom Conservancy Inc. * * This software is licensed under the GNU Lesser General Public License * (version 2.1 or later). See the COPYING file in this distribution. @@ -8,21 +9,19 @@ * See [[http://tools.ietf.org/html/rfc3501#section-6.4.3]] and * [[http://tools.ietf.org/html/rfc4315#section-2.1]] */ - public class Geary.Imap.ExpungeCommand : Command { + public const string NAME = "expunge"; public const string UID_NAME = "uid expunge"; - - public ExpungeCommand() { - base (NAME); - } - - public ExpungeCommand.uid(MessageSet message_set) { - base (UID_NAME); - - assert(message_set.is_uid); - - add(message_set.to_parameter()); - } -} + public ExpungeCommand() { + base(NAME); + } + + public ExpungeCommand.uid(MessageSet message_set) { + base(UID_NAME); + assert(message_set.is_uid); + this.args.add(message_set.to_parameter()); + } + +} diff --git a/src/engine/imap/command/imap-fetch-command.vala b/src/engine/imap/command/imap-fetch-command.vala index 3bcaa1bf..498b6779 100644 --- a/src/engine/imap/command/imap-fetch-command.vala +++ b/src/engine/imap/command/imap-fetch-command.vala @@ -1,4 +1,5 @@ -/* Copyright 2016 Software Freedom Conservancy Inc. +/* + * Copyright 2016 Software Freedom Conservancy Inc. * * This software is licensed under the GNU Lesser General Public License * (version 2.1 or later). See the COPYING file in this distribution. @@ -16,76 +17,76 @@ * @see FetchedData * @see StoreCommand */ - public class Geary.Imap.FetchCommand : Command { + public const string NAME = "fetch"; public const string UID_NAME = "uid fetch"; - + /** * Non-null if {@link FetchCommand} created for this {@link FetchDataSpecifier}. */ public Gee.List for_data_types { get; private set; default = new Gee.ArrayList(); } - + /** * Non-null if {@link FetchCommand} created for this {@link FetchBodyDataSpecifier}. */ public Gee.List for_body_data_specifiers { get; private set; default = new Gee.ArrayList(); } - + public FetchCommand(MessageSet msg_set, Gee.List? data_items, Gee.List? body_data_items) { base (msg_set.is_uid ? UID_NAME : NAME); - - add(msg_set.to_parameter()); - + + this.args.add(msg_set.to_parameter()); + int data_items_length = (data_items != null) ? data_items.size : 0; int body_items_length = (body_data_items != null) ? body_data_items.size : 0; - + // see note in unadorned ctor for reasoning here if (data_items_length == 1 && body_items_length == 0) { - add(data_items[0].to_parameter()); + this.args.add(data_items[0].to_parameter()); } else if (data_items_length == 0 && body_items_length == 1) { - add(body_data_items[0].to_request_parameter()); + this.args.add(body_data_items[0].to_request_parameter()); } else { ListParameter list = new ListParameter(); - + if (data_items_length > 0) { foreach (FetchDataSpecifier data_item in data_items) list.add(data_item.to_parameter()); } - + if (body_items_length > 0) { foreach (FetchBodyDataSpecifier body_item in body_data_items) list.add(body_item.to_request_parameter()); } - - add(list); + + this.args.add(list); } - + if (data_items != null) for_data_types.add_all(data_items); - + if (body_data_items != null) for_body_data_specifiers.add_all(body_data_items); } - + public FetchCommand.data_type(MessageSet msg_set, FetchDataSpecifier data_type) { base (msg_set.is_uid ? UID_NAME : NAME); - + for_data_types.add(data_type); - - add(msg_set.to_parameter()); - add(data_type.to_parameter()); + + this.args.add(msg_set.to_parameter()); + this.args.add(data_type.to_parameter()); } - + public FetchCommand.body_data_type(MessageSet msg_set, FetchBodyDataSpecifier body_data_specifier) { base (msg_set.is_uid ? UID_NAME : NAME); - - for_body_data_specifiers.add(body_data_specifier); - - add(msg_set.to_parameter()); - add(body_data_specifier.to_request_parameter()); - } -} + for_body_data_specifiers.add(body_data_specifier); + + this.args.add(msg_set.to_parameter()); + this.args.add(body_data_specifier.to_request_parameter()); + } + +} diff --git a/src/engine/imap/command/imap-id-command.vala b/src/engine/imap/command/imap-id-command.vala index 44aad573..b3be2451 100644 --- a/src/engine/imap/command/imap-id-command.vala +++ b/src/engine/imap/command/imap-id-command.vala @@ -1,4 +1,5 @@ -/* Copyright 2016 Software Freedom Conservancy Inc. +/* + * Copyright 2016 Software Freedom Conservancy Inc. * * This software is licensed under the GNU Lesser General Public License * (version 2.1 or later). See the COPYING file in this distribution. @@ -7,26 +8,25 @@ /** * See [[http://www.ietf.org/rfc/rfc2971.txt]] */ - public class Geary.Imap.IdCommand : Command { + public const string NAME = "id"; - + public IdCommand(Gee.HashMap fields) { - base (NAME); - + base(NAME); + ListParameter list = new ListParameter(); foreach (string key in fields.keys) { list.add(new QuotedStringParameter(key)); list.add(new QuotedStringParameter(fields.get(key))); } - - add(list); - } - - public IdCommand.nil() { - base (NAME); - - add(NilParameter.instance); - } -} + this.args.add(list); + } + + public IdCommand.nil() { + base(NAME); + this.args.add(NilParameter.instance); + } + +} diff --git a/src/engine/imap/command/imap-list-command.vala b/src/engine/imap/command/imap-list-command.vala index 3ae49678..d399f244 100644 --- a/src/engine/imap/command/imap-list-command.vala +++ b/src/engine/imap/command/imap-list-command.vala @@ -1,4 +1,5 @@ -/* Copyright 2016 Software Freedom Conservancy Inc. +/* + * Copyright 2016 Software Freedom Conservancy Inc. * * This software is licensed under the GNU Lesser General Public License * (version 2.1 or later). See the COPYING file in this distribution. @@ -14,11 +15,11 @@ * * @see MailboxInformation */ - public class Geary.Imap.ListCommand : Command { + public const string NAME = "list"; public const string XLIST_NAME = "xlist"; - + /** * LIST a particular mailbox by {@link MailboxSpecifier}. * @@ -34,26 +35,26 @@ public class Geary.Imap.ListCommand : Command { * See [[http://redmine.yorba.org/issues/7624]] for more information. */ public ListCommand(MailboxSpecifier mailbox, bool use_xlist, ListReturnParameter? return_param) { - base (use_xlist ? XLIST_NAME : NAME, { "" }); - - add(mailbox.to_parameter()); + base(use_xlist ? XLIST_NAME : NAME, { "" }); + + this.args.add(mailbox.to_parameter()); add_return_parameter(return_param); } - + public ListCommand.wildcarded(string reference, MailboxSpecifier mailbox, bool use_xlist, ListReturnParameter? return_param) { - base (use_xlist ? XLIST_NAME : NAME, { reference }); - - add(mailbox.to_parameter()); + base(use_xlist ? XLIST_NAME : NAME, { reference }); + + this.args.add(mailbox.to_parameter()); add_return_parameter(return_param); } - + private void add_return_parameter(ListReturnParameter? return_param) { if (return_param == null || return_param.size == 0) return; - - add(StringParameter.get_best_for_unchecked("return")); - add(return_param); - } -} + this.args.add(StringParameter.get_best_for_unchecked("return")); + this.args.add(return_param); + } + +} diff --git a/src/engine/imap/command/imap-search-command.vala b/src/engine/imap/command/imap-search-command.vala index 8738d1b7..86448b74 100644 --- a/src/engine/imap/command/imap-search-command.vala +++ b/src/engine/imap/command/imap-search-command.vala @@ -1,4 +1,5 @@ -/* Copyright 2016 Software Freedom Conservancy Inc. +/* + * Copyright 2016 Software Freedom Conservancy Inc. * * This software is licensed under the GNU Lesser General Public License * (version 2.1 or later). See the COPYING file in this distribution. @@ -9,8 +10,8 @@ * * See [[http://tools.ietf.org/html/rfc3501#section-6.4.4]]. */ - public class Geary.Imap.SearchCommand : Command { + public const string NAME = "search"; public const string UID_NAME = "uid search"; @@ -20,15 +21,16 @@ public class Geary.Imap.SearchCommand : Command { // Extend rather than append the criteria, so the top-level // criterion appear in the top-level list and not as a child // list - extend(criteria); + this.args.extend(criteria); } public SearchCommand.uid(SearchCriteria criteria) { - base (UID_NAME); + base(UID_NAME); // Extend rather than append the criteria, so the top-level // criterion appear in the top-level list and not as a child // list - extend(criteria); + this.args.extend(criteria); } + } diff --git a/src/engine/imap/command/imap-select-command.vala b/src/engine/imap/command/imap-select-command.vala index 3eaa73ae..5e7013a0 100644 --- a/src/engine/imap/command/imap-select-command.vala +++ b/src/engine/imap/command/imap-select-command.vala @@ -1,4 +1,5 @@ -/* Copyright 2016 Software Freedom Conservancy Inc. +/* + * Copyright 2016 Software Freedom Conservancy Inc. * * This software is licensed under the GNU Lesser General Public License * (version 2.1 or later). See the COPYING file in this distribution. @@ -9,18 +10,16 @@ * * @see ExamineCommand */ - public class Geary.Imap.SelectCommand : Command { - public const string NAME = "select"; - - public MailboxSpecifier mailbox { get; private set; } - - public SelectCommand(MailboxSpecifier mailbox) { - base (NAME); - - this.mailbox = mailbox; - - add(mailbox.to_parameter()); - } -} + public const string NAME = "select"; + + public MailboxSpecifier mailbox { get; private set; } + + public SelectCommand(MailboxSpecifier mailbox) { + base(NAME); + this.mailbox = mailbox; + this.args.add(mailbox.to_parameter()); + } + +} diff --git a/src/engine/imap/command/imap-status-command.vala b/src/engine/imap/command/imap-status-command.vala index 00668517..fde8fecf 100644 --- a/src/engine/imap/command/imap-status-command.vala +++ b/src/engine/imap/command/imap-status-command.vala @@ -1,4 +1,5 @@ -/* Copyright 2016 Software Freedom Conservancy Inc. +/* + * Copyright 2016 Software Freedom Conservancy Inc. * * This software is licensed under the GNU Lesser General Public License * (version 2.1 or later). See the COPYING file in this distribution. @@ -9,21 +10,21 @@ * * @see StatusData */ - public class Geary.Imap.StatusCommand : Command { + public const string NAME = "status"; - + public StatusCommand(MailboxSpecifier mailbox, StatusDataType[] data_items) { base (NAME); - - add(mailbox.to_parameter()); - + + this.args.add(mailbox.to_parameter()); + assert(data_items.length > 0); ListParameter data_item_list = new ListParameter(); foreach (StatusDataType data_item in data_items) data_item_list.add(data_item.to_parameter()); - - add(data_item_list); - } -} + this.args.add(data_item_list); + } + +} diff --git a/src/engine/imap/command/imap-store-command.vala b/src/engine/imap/command/imap-store-command.vala index e1dc056b..4264e03b 100644 --- a/src/engine/imap/command/imap-store-command.vala +++ b/src/engine/imap/command/imap-store-command.vala @@ -1,4 +1,5 @@ -/* Copyright 2016 Software Freedom Conservancy Inc. +/* + * Copyright 2016 Software Freedom Conservancy Inc. * * This software is licensed under the GNU Lesser General Public License * (version 2.1 or later). See the COPYING file in this distribution. @@ -10,11 +11,11 @@ * @see FetchCommand * @see FetchedData */ - public class Geary.Imap.StoreCommand : Command { + public const string NAME = "store"; public const string UID_NAME = "uid store"; - + /** * Options indicating functionality of the {@link StoreCommand}. * @@ -28,21 +29,22 @@ public class Geary.Imap.StoreCommand : Command { ADD_FLAGS, SILENT } - + public StoreCommand(MessageSet message_set, Gee.List flag_list, Option options) { base (message_set.is_uid ? UID_NAME : NAME); - + bool add_flag = (options & Option.ADD_FLAGS) != 0; bool silent = (options & Option.SILENT) != 0; - - add(message_set.to_parameter()); - add(new AtomParameter("%sflags%s".printf(add_flag ? "+" : "-", silent ? ".silent" : ""))); - - ListParameter list = new ListParameter(); - foreach(MessageFlag flag in flag_list) - list.add(new AtomParameter(flag.value)); - - add(list); - } -} + this.args.add(message_set.to_parameter()); + this.args.add(new AtomParameter("%sflags%s".printf(add_flag ? "+" : "-", silent ? ".silent" : ""))); + + ListParameter list = new ListParameter(); + foreach(MessageFlag flag in flag_list) { + list.add(new AtomParameter(flag.value)); + } + + this.args.add(list); + } + +} diff --git a/test/engine/imap/command/imap-create-command-test.vala b/test/engine/imap/command/imap-create-command-test.vala index 0c1f5db4..b64d52b4 100644 --- a/test/engine/imap/command/imap-create-command-test.vala +++ b/test/engine/imap/command/imap-create-command-test.vala @@ -15,15 +15,20 @@ class Geary.Imap.CreateCommandTest : TestCase { } public void basic_create() throws Error { - assert(new CreateCommand(new MailboxSpecifier("owatagusiam/")).to_string() == - "---- create owatagusiam/"); + assert_string( + "---- create owatagusiam/", + new CreateCommand(new MailboxSpecifier("owatagusiam/")).to_string() + ); } public void special_use() throws Error { - assert(new CreateCommand.special_use( - new MailboxSpecifier("Everything"), - SpecialFolderType.ALL_MAIL - ).to_string() == "---- create Everything (use (\\All))"); + assert_string( + "---- create Everything (use (\\All))", + new CreateCommand.special_use( + new MailboxSpecifier("Everything"), + SpecialFolderType.ALL_MAIL + ).to_string() + ); } }