[geary/mjog/invert-folder-class-hierarchy: 65/72] engine: Add new FetchEmail replay op
- From: Michael Gratton <mjog src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [geary/mjog/invert-folder-class-hierarchy: 65/72] engine: Add new FetchEmail replay op
- Date: Wed, 3 Mar 2021 11:52:48 +0000 (UTC)
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]