[geary/mjog/mail-merge-plugin: 67/74] Geary.RFC822.MailboxAddresses: Update append methods




commit e65298c00bfb5f20d701d4912a86cc43cab9074d
Author: Michael Gratton <mike vee net>
Date:   Thu Aug 6 14:50:18 2020 +1000

    Geary.RFC822.MailboxAddresses: Update append methods
    
    Rename append method to concatenate_list since that's what it actually does. Add new method
    for cat'ing a single mailbox, add methods for merging both a single mailbox and mailbox
    list into a new list.

 src/client/composer/composer-widget.vala           |  4 +-
 src/engine/rfc822/rfc822-mailbox-addresses.vala    | 55 +++++++++++++++++++++-
 .../rfc822/rfc822-mailbox-addresses-test.vala      | 15 ++++++
 3 files changed, 70 insertions(+), 4 deletions(-)
---
diff --git a/src/client/composer/composer-widget.vala b/src/client/composer/composer-widget.vala
index db8f3e95d..7d89db561 100644
--- a/src/client/composer/composer-widget.vala
+++ b/src/client/composer/composer-widget.vala
@@ -1178,12 +1178,12 @@ public class Composer.Widget : Gtk.EventBox, Geary.BaseInterface {
                 foreach (var candidate in email_map.get_keys()) {
                     if (candidate.message_id != null &&
                         mid.equal_to(candidate.message_id)) {
-                        to_addresses = to_addresses.append(
+                        to_addresses = to_addresses.merge_list(
                             Geary.RFC822.Utils.create_to_addresses_for_reply(
                                 candidate, sender_addresses
                             )
                         );
-                        cc_addresses = cc_addresses.append(
+                        cc_addresses = cc_addresses.merge_list(
                             Geary.RFC822.Utils.create_cc_addresses_for_reply_all(
                                 candidate, sender_addresses
                             )
diff --git a/src/engine/rfc822/rfc822-mailbox-addresses.vala b/src/engine/rfc822/rfc822-mailbox-addresses.vala
index 7a40f822d..81b95b5e6 100644
--- a/src/engine/rfc822/rfc822-mailbox-addresses.vala
+++ b/src/engine/rfc822/rfc822-mailbox-addresses.vala
@@ -71,16 +71,25 @@ public class Geary.RFC822.MailboxAddresses :
     private uint hash_value = 0;
 
 
+    /**
+     * Constructs a new mailbox list.
+     *
+     * If the optional collection of addresses is not given, the list
+     * is created empty. Otherwise the collection's addresses are
+     * added to the list by iterating over it in natural order.
+     */
     public MailboxAddresses(Gee.Collection<MailboxAddress>? addrs = null) {
         if (addrs != null) {
             this.addrs.add_all(addrs);
         }
     }
 
+    /** Constructs a new mailbox list with a single address. */
     public MailboxAddresses.single(MailboxAddress addr) {
         this.addrs.add(addr);
     }
 
+    /** Constructs a new mailbox list by parsing a RFC822 string. */
     public MailboxAddresses.from_rfc822_string(string rfc822)
         throws Error {
         var list = GMime.InternetAddressList.parse(
@@ -93,6 +102,7 @@ public class Geary.RFC822.MailboxAddresses :
         this.from_gmime(list);
     }
 
+    /** Constructs a new mailbox from a GMime list. */
     public MailboxAddresses.from_gmime(GMime.InternetAddressList list)
         throws Error {
         int length = list.length();
@@ -165,11 +175,52 @@ public class Geary.RFC822.MailboxAddresses :
         return false;
     }
 
+    /**
+     * Returns a list with the given mailbox appended if not already present.
+     *
+     * This list is returned if the given mailbox is already present,
+     * otherwise the result of a call to {@link concatenate_mailbox} is
+     * returned.
+     */
+    public MailboxAddresses merge_mailbox(MailboxAddress other) {
+        return (
+            this.addrs.contains(other)
+            ? this
+            : this.concatenate_mailbox(other)
+        );
+    }
+
+    /**
+     * Returns a list with the given mailboxes appended if not already present.
+     *
+     * This list is returned if all given mailboxes are already
+     * present, otherwise the result of a call to {@link
+     * concatenate_mailbox} for each not present is returned.
+     */
+    public MailboxAddresses merge_list(MailboxAddresses other) {
+        var list = this;
+        foreach (var addr in other) {
+            if (!this.addrs.contains(addr)) {
+                list = list.concatenate_mailbox(addr);
+            }
+        }
+        return list;
+    }
+
+    /**
+     * Returns a new list with the given address appended to this list's.
+     */
+    public MailboxAddresses concatenate_mailbox(MailboxAddress other) {
+        var new_addrs = new MailboxAddresses(this.addrs);
+        new_addrs.addrs.add(other);
+        return new_addrs;
+    }
+
     /**
      * Returns a new list with the given addresses appended to this list's.
      */
-    public MailboxAddresses append(MailboxAddresses others) {
-        MailboxAddresses new_addrs = new MailboxAddresses(this.addrs);
+    public MailboxAddresses concatenate_list(MailboxAddresses others) {
+        var new_addrs = new MailboxAddresses(this.addrs);
         new_addrs.addrs.add_all(others.addrs);
         return new_addrs;
     }
diff --git a/test/engine/rfc822/rfc822-mailbox-addresses-test.vala 
b/test/engine/rfc822/rfc822-mailbox-addresses-test.vala
index 2c969b925..d4c3ea66e 100644
--- a/test/engine/rfc822/rfc822-mailbox-addresses-test.vala
+++ b/test/engine/rfc822/rfc822-mailbox-addresses-test.vala
@@ -13,6 +13,7 @@ class Geary.RFC822.MailboxAddressesTest : TestCase {
         add_test("from_rfc822_string_quoted", from_rfc822_string_quoted);
         add_test("to_rfc822_string", to_rfc822_string);
         add_test("contains_all", contains_all);
+        add_test("merge", merge);
         add_test("equal_to", equal_to);
         add_test("hash", hash);
     }
@@ -85,6 +86,20 @@ class Geary.RFC822.MailboxAddressesTest : TestCase {
         );
     }
 
+    public void merge() throws GLib.Error {
+        var a1 = new MailboxAddress(null, "a example com");
+        var b = new MailboxAddress(null, "b example com");
+        var a2 = new MailboxAddress(null, "a example com");
+        var list = new MailboxAddresses.single(a1);
+
+        assert_equal<int?>(list.merge_mailbox(b).size, 2);
+        assert_equal<int?>(list.merge_mailbox(a2).size, 1);
+
+        assert_equal<int?>(list.merge_list(new MailboxAddresses.single(b)).size, 2);
+        assert_equal<int?>(list.merge_list(new MailboxAddresses.single(a2)).size, 1);
+    }
+
+
     public void equal_to() throws GLib.Error {
         var mailboxes_a = new_addreses({ "test1 example com" });
         var mailboxes_b = new_addreses({ "test1 example com" });


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]