[geary/mjog/invert-folder-class-hierarchy: 65/72] engine: Add new FetchEmail replay op




commit 1c6b8527e509d7db5bfdb6dc034e86c44070073c
Author: Michael Gratton <mike vee net>
Date:   Mon Mar 1 09:08:43 2021 +1100

    engine: Add new FetchEmail replay op
    
    Add a new op to allow engine code to fetch email via the replay queue.

 po/POTFILES.in                                     |  1 +
 .../replay-ops/imap-engine-fetch-email.vala        | 81 ++++++++++++++++++++++
 src/engine/meson.build                             |  1 +
 3 files changed, 83 insertions(+)
---
diff --git a/po/POTFILES.in b/po/POTFILES.in
index a43b57595..6dff71b8a 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -295,6 +295,7 @@ src/engine/imap-engine/outlook/imap-engine-outlook-folder.vala
 src/engine/imap-engine/replay-ops/imap-engine-copy-email.vala
 src/engine/imap-engine/replay-ops/imap-engine-create-email.vala
 src/engine/imap-engine/replay-ops/imap-engine-empty-folder.vala
+src/engine/imap-engine/replay-ops/imap-engine-fetch-email.vala
 src/engine/imap-engine/replay-ops/imap-engine-mark-email.vala
 src/engine/imap-engine/replay-ops/imap-engine-move-email-commit.vala
 src/engine/imap-engine/replay-ops/imap-engine-move-email-prepare.vala
diff --git a/src/engine/imap-engine/replay-ops/imap-engine-fetch-email.vala 
b/src/engine/imap-engine/replay-ops/imap-engine-fetch-email.vala
new file mode 100644
index 000000000..274537e73
--- /dev/null
+++ b/src/engine/imap-engine/replay-ops/imap-engine-fetch-email.vala
@@ -0,0 +1,81 @@
+/*
+ * Copyright © 2021 Michael Gratton <mike vee net>
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+/**
+ * Fetches and updates extant email from the remote.
+ *
+ * The given fields will be fetched for the given email identifiers
+ * from the remote, populating {@link fetched_email} when
+ * complete. All fetched data is updated in local storage and the
+ * fetched email have updated identifiers.
+ */
+private class Geary.ImapEngine.FetchEmail : SendReplayOperation {
+
+
+    public Gee.Set<Email> fetched_email {
+        get; private set; default = Email.new_identifier_based_set();
+    }
+
+    private MinimalFolder engine;
+    private Gee.Set<ImapDB.EmailIdentifier> ids =
+        new Gee.HashSet<ImapDB.EmailIdentifier>();
+    private Email.Field required_fields;
+    private GLib.Cancellable? cancellable;
+
+
+    public FetchEmail(MinimalFolder engine,
+                      Gee.Collection<ImapDB.EmailIdentifier> ids,
+                      Email.Field required_fields,
+                      GLib.Cancellable? cancellable = null) {
+        base.only_remote("FetchEmail", OnError.RETRY);
+        this.engine = engine;
+        this.ids.add_all(ids);
+        this.required_fields = required_fields;
+        this.cancellable = cancellable;
+    }
+
+    public override void notify_remote_removed_ids(
+        Gee.Collection<ImapDB.EmailIdentifier> ids
+    ) {
+        this.ids.remove_all(ids);
+    }
+
+    public override async void replay_remote_async(Imap.FolderSession remote)
+        throws GLib.Error {
+        var local = this.engine.local_folder;
+        Gee.Set<Imap.UID>? uids = yield local.get_uids_async(
+            this.ids, NONE, this.cancellable
+        );
+
+        if (uids != null && !uids.is_empty) {
+            foreach (Imap.MessageSet msg_set in
+                     Imap.MessageSet.uid_sparse(uids)) {
+                var fetched = yield remote.list_email_async(
+                    msg_set,
+                    this.required_fields,
+                    this.cancellable
+                );
+                var updated = yield local.create_or_merge_email_async(
+                    fetched,
+                    true,
+                    this.engine.harvester,
+                    cancellable
+                );
+                this.fetched_email.add_all(updated.keys);
+            }
+        }
+    }
+
+    public override string describe_state() {
+        return (
+            this.ids.size == 1
+            ? Collection.first(this.ids).to_string()
+            : "%d email ids".printf(this.ids.size)
+        );
+    }
+
+}
diff --git a/src/engine/meson.build b/src/engine/meson.build
index 73badc984..99335b26e 100644
--- a/src/engine/meson.build
+++ b/src/engine/meson.build
@@ -205,6 +205,7 @@ engine_vala_sources = files(
   'imap-engine/replay-ops/imap-engine-copy-email.vala',
   'imap-engine/replay-ops/imap-engine-create-email.vala',
   'imap-engine/replay-ops/imap-engine-empty-folder.vala',
+  'imap-engine/replay-ops/imap-engine-fetch-email.vala',
   'imap-engine/replay-ops/imap-engine-mark-email.vala',
   'imap-engine/replay-ops/imap-engine-move-email-commit.vala',
   'imap-engine/replay-ops/imap-engine-move-email-prepare.vala',


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