[geary/wip/789924-network-transition-redux: 6/10] Move two folder-specific ImapDB methods from Account to Folder.
- From: Michael Gratton <mjog src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [geary/wip/789924-network-transition-redux: 6/10] Move two folder-specific ImapDB methods from Account to Folder.
- Date: Fri, 26 Jan 2018 03:21:33 +0000 (UTC)
commit ac7a405fc76ea912c49d57eaa523435a9a4cecd1
Author: Michael James Gratton <mike vee net>
Date: Thu Jan 18 17:33:49 2018 +1100
Move two folder-specific ImapDB methods from Account to Folder.
This allows simplifying the implementation and removing the dependency on
an instance of ImapDB.Account from ImapEngine.MinimalFolder.
* src/engine/imap-db/imap-db-account.vala (Account): Move
update_folder_status_async and update_folder_select_examine_async and
support code to Folder.
* src/engine/imap-db/imap-db-folder.vala (Folder): Rework moved methods
to pass in a Imap.FolderProperties instead of a complete Imap.Folder
and update call sites, use folder id to properly specify target DB row
when doing the update rather than inferring it from remote folder's
name. Update update_remote_selected_message_count to use same impl as
new methods, remove update_remote_status_message_count since it is
unused.
* src/engine/imap-engine/imap-engine-minimal-folder.vala (MinimalFolder):
Remove now unused ImapDB.Account instance, update subclasses and
constructor call sites.
src/engine/imap-db/imap-db-account.vala | 214 +-------------------
src/engine/imap-db/imap-db-folder.vala | 204 ++++++++++++++++---
.../gmail/imap-engine-gmail-account.vala | 9 +-
.../gmail/imap-engine-gmail-all-mail-folder.vala | 4 +-
.../gmail/imap-engine-gmail-drafts-folder.vala | 4 +-
.../gmail/imap-engine-gmail-folder.vala | 4 +-
.../gmail/imap-engine-gmail-spam-trash-folder.vala | 9 +-
.../imap-engine/imap-engine-generic-account.vala | 21 +-
.../imap-engine/imap-engine-generic-folder.vala | 4 +-
.../imap-engine/imap-engine-minimal-folder.vala | 16 +-
.../other/imap-engine-other-account.vala | 2 +-
.../other/imap-engine-other-folder.vala | 4 +-
.../outlook/imap-engine-outlook-account.vala | 4 +-
.../outlook/imap-engine-outlook-drafts-folder.vala | 4 +-
.../outlook/imap-engine-outlook-folder.vala | 5 +-
.../yahoo/imap-engine-yahoo-account.vala | 2 +-
.../yahoo/imap-engine-yahoo-folder.vala | 5 +-
17 files changed, 224 insertions(+), 291 deletions(-)
---
diff --git a/src/engine/imap-db/imap-db-account.vala b/src/engine/imap-db/imap-db-account.vala
index 33581b4..37c2250 100644
--- a/src/engine/imap-db/imap-db-account.vala
+++ b/src/engine/imap-db/imap-db-account.vala
@@ -433,158 +433,7 @@ private class Geary.ImapDB.Account : BaseObject {
return Db.TransactionOutcome.COMMIT;
}, cancellable);
}
-
- /**
- * Only updates folder's STATUS message count, attributes, recent, and unseen; UIDVALIDITY and UIDNEXT
- * updated when the folder is SELECT/EXAMINED (see update_folder_select_examine_async()) unless
- * update_uid_info is true.
- */
- public async void update_folder_status_async(Geary.Imap.Folder imap_folder, bool update_uid_info,
- bool respect_marked_for_remove, Cancellable? cancellable) throws Error {
- check_open();
-
- Geary.Imap.FolderProperties properties = imap_folder.properties;
- Geary.FolderPath path = imap_folder.path;
-
- // adjust for marked remove, but don't write these adjustments to the database -- they're
- // only reflected in memory via the properties
- int adjust_unseen = 0;
- int adjust_total = 0;
-
- yield db.exec_transaction_async(Db.TransactionType.RW, (cx) => {
- int64 parent_id;
- if (!do_fetch_parent_id(cx, path, true, out parent_id, cancellable)) {
- debug("Unable to find parent ID of %s to update properties", path.to_string());
-
- return Db.TransactionOutcome.ROLLBACK;
- }
-
- int64 folder_id;
- if (!do_fetch_folder_id(cx, path, false, out folder_id, cancellable))
- folder_id = Db.INVALID_ROWID;
-
- if (respect_marked_for_remove && folder_id != Db.INVALID_ROWID) {
- Db.Statement stmt = cx.prepare("""
- SELECT flags
- FROM MessageTable
- WHERE id IN (
- SELECT message_id
- FROM MessageLocationTable
- WHERE folder_id = ? AND remove_marker = ?
- )
- """);
- stmt.bind_rowid(0, folder_id);
- stmt.bind_bool(1, true);
-
- Db.Result results = stmt.exec(cancellable);
- while (!results.finished) {
- adjust_total++;
-
- Imap.EmailFlags flags = new Imap.EmailFlags(Imap.MessageFlags.deserialize(
- results.string_at(0)));
- if (flags.contains(EmailFlags.UNREAD))
- adjust_unseen++;
-
- results.next(cancellable);
- }
- }
-
- Db.Statement stmt;
- if (parent_id != Db.INVALID_ROWID) {
- stmt = cx.prepare(
- "UPDATE FolderTable SET attributes=?, unread_count=? WHERE parent_id=? AND name=?");
- stmt.bind_string(0, properties.attrs.serialize());
- stmt.bind_int(1, properties.email_unread);
- stmt.bind_rowid(2, parent_id);
- stmt.bind_string(3, path.basename);
- } else {
- stmt = cx.prepare(
- "UPDATE FolderTable SET attributes=?, unread_count=? WHERE parent_id IS NULL AND
name=?");
- stmt.bind_string(0, properties.attrs.serialize());
- stmt.bind_int(1, properties.email_unread);
- stmt.bind_string(2, path.basename);
- }
-
- stmt.exec(cancellable);
-
- if (update_uid_info)
- do_update_uid_info(cx, properties, parent_id, path, cancellable);
-
- if (properties.status_messages >= 0) {
- do_update_last_seen_status_total(cx, parent_id, path.basename, properties.status_messages,
- cancellable);
- }
-
- return Db.TransactionOutcome.COMMIT;
- }, cancellable);
-
- // update appropriate properties in the local folder
- ImapDB.Folder? db_folder = get_local_folder(path);
- if (db_folder != null) {
- Imap.FolderProperties local_properties = db_folder.get_properties();
-
- local_properties.set_status_unseen(Numeric.int_floor(properties.unseen - adjust_unseen, 0));
- local_properties.recent = properties.recent;
- local_properties.attrs = properties.attrs;
-
- if (update_uid_info) {
- local_properties.uid_validity = properties.uid_validity;
- local_properties.uid_next = properties.uid_next;
- }
-
- // only update STATUS MESSAGES count if previously set, but use this count as the
- // "authoritative" value until another SELECT/EXAMINE or MESSAGES response
- if (properties.status_messages >= 0) {
- local_properties.set_status_message_count(
- Numeric.int_floor(properties.status_messages - adjust_total, 0), true);
- }
- }
- }
-
- /**
- * Updates folder's SELECT/EXAMINE message count, UIDVALIDITY, UIDNEXT, unseen, and recent.
- * See also update_folder_status_async().
- */
- public async void update_folder_select_examine_async(Geary.Imap.Folder imap_folder, Cancellable?
cancellable)
- throws Error {
- check_open();
-
- Geary.Imap.FolderProperties properties = imap_folder.properties;
- Geary.FolderPath path = imap_folder.path;
-
- yield db.exec_transaction_async(Db.TransactionType.RW, (cx) => {
- int64 parent_id;
- if (!do_fetch_parent_id(cx, path, true, out parent_id, cancellable)) {
- debug("Unable to find parent ID of %s to update properties", path.to_string());
-
- return Db.TransactionOutcome.ROLLBACK;
- }
-
- do_update_uid_info(cx, properties, parent_id, path, cancellable);
-
- if (properties.select_examine_messages >= 0) {
- do_update_last_seen_select_examine_total(cx, parent_id, path.basename,
- properties.select_examine_messages, cancellable);
- }
-
- return Db.TransactionOutcome.COMMIT;
- }, cancellable);
-
- // update appropriate properties in the local folder
- ImapDB.Folder? db_folder = get_local_folder(path);
- if (db_folder != null) {
- Imap.FolderProperties local_properties = db_folder.get_properties();
-
- local_properties.set_status_unseen(properties.unseen);
- local_properties.recent = properties.recent;
- local_properties.uid_validity = properties.uid_validity;
- local_properties.uid_next = properties.uid_next;
-
- if (properties.select_examine_messages >= 0)
- local_properties.set_select_examine_message_count(properties.select_examine_messages);
- }
- }
-
+
private void initialize_contacts(Cancellable? cancellable = null) throws Error {
check_open();
@@ -1736,7 +1585,7 @@ private class Geary.ImapDB.Account : BaseObject {
// If the FolderPath has no parent, returns true and folder_id will be set to Db.INVALID_ROWID.
// If cannot create path or there is a logical problem traversing it, returns false with folder_id
// set to Db.INVALID_ROWID.
- private bool do_fetch_folder_id(Db.Connection cx, Geary.FolderPath path, bool create, out int64
folder_id,
+ internal bool do_fetch_folder_id(Db.Connection cx, Geary.FolderPath path, bool create, out int64
folder_id,
Cancellable? cancellable) throws Error {
int length = path.get_path_length();
if (length < 0)
@@ -1795,7 +1644,7 @@ private class Geary.ImapDB.Account : BaseObject {
}
// See do_fetch_folder_id() for return semantics.
- private bool do_fetch_parent_id(Db.Connection cx, Geary.FolderPath path, bool create, out int64
parent_id,
+ internal bool do_fetch_parent_id(Db.Connection cx, Geary.FolderPath path, bool create, out int64
parent_id,
Cancellable? cancellable = null) throws Error {
if (path.is_root()) {
parent_id = Db.INVALID_ROWID;
@@ -1931,63 +1780,6 @@ private class Geary.ImapDB.Account : BaseObject {
return (parent_path == null ? null : parent_path.get_child(name));
}
- // For SELECT/EXAMINE responses, not STATUS responses
- private void do_update_last_seen_select_examine_total(Db.Connection cx, int64 parent_id, string name,
int total,
- Cancellable? cancellable) throws Error {
- do_update_total(cx, parent_id, name, "last_seen_total", total, cancellable);
- }
-
- // For STATUS responses, not SELECT/EXAMINE responses
- private void do_update_last_seen_status_total(Db.Connection cx, int64 parent_id, string name,
- int total, Cancellable? cancellable) throws Error {
- do_update_total(cx, parent_id, name, "last_seen_status_total", total, cancellable);
- }
-
- private void do_update_total(Db.Connection cx, int64 parent_id, string name, string colname,
- int total, Cancellable? cancellable) throws Error {
- Db.Statement stmt;
- if (parent_id != Db.INVALID_ROWID) {
- stmt = cx.prepare(
- "UPDATE FolderTable SET %s=? WHERE parent_id=? AND name=?".printf(colname));
- stmt.bind_int(0, Numeric.int_floor(total, 0));
- stmt.bind_rowid(1, parent_id);
- stmt.bind_string(2, name);
- } else {
- stmt = cx.prepare(
- "UPDATE FolderTable SET %s=? WHERE parent_id IS NULL AND name=?".printf(colname));
- stmt.bind_int(0, Numeric.int_floor(total, 0));
- stmt.bind_string(1, name);
- }
-
- stmt.exec(cancellable);
- }
-
- private void do_update_uid_info(Db.Connection cx, Imap.FolderProperties properties,
- int64 parent_id, FolderPath path, Cancellable? cancellable) throws Error {
- int64 uid_validity = (properties.uid_validity != null) ? properties.uid_validity.value
- : Imap.UIDValidity.INVALID;
- int64 uid_next = (properties.uid_next != null) ? properties.uid_next.value
- : Imap.UID.INVALID;
-
- Db.Statement stmt;
- if (parent_id != Db.INVALID_ROWID) {
- stmt = cx.prepare(
- "UPDATE FolderTable SET uid_validity=?, uid_next=? WHERE parent_id=? AND name=?");
- stmt.bind_int64(0, uid_validity);
- stmt.bind_int64(1, uid_next);
- stmt.bind_rowid(2, parent_id);
- stmt.bind_string(3, path.basename);
- } else {
- stmt = cx.prepare(
- "UPDATE FolderTable SET uid_validity=?, uid_next=? WHERE parent_id IS NULL AND name=?");
- stmt.bind_int64(0, uid_validity);
- stmt.bind_int64(1, uid_next);
- stmt.bind_string(2, path.basename);
- }
-
- stmt.exec(cancellable);
- }
-
private int do_get_email_count(Db.Connection cx, Cancellable? cancellable)
throws Error {
Db.Statement stmt = cx.prepare(
diff --git a/src/engine/imap-db/imap-db-folder.vala b/src/engine/imap-db/imap-db-folder.vala
index 6a7fe5e..56651f6 100644
--- a/src/engine/imap-db/imap-db-folder.vala
+++ b/src/engine/imap-db/imap-db-folder.vala
@@ -89,7 +89,7 @@ private class Geary.ImapDB.Folder : BaseObject, Geary.ReferenceSemantics {
private string account_owner_email;
private int64 folder_id;
private Geary.Imap.FolderProperties properties;
-
+
/**
* Fired after one or more emails have been fetched with all Fields, and
* saved locally.
@@ -101,11 +101,13 @@ private class Geary.ImapDB.Folder : BaseObject, Geary.ReferenceSemantics {
* change the unread count for other folders that contain the email.
*/
public signal void unread_updated(Gee.Map<ImapDB.EmailIdentifier, bool> unread_status);
-
- internal Folder(ImapDB.Database db, Geary.FolderPath path, ContactStore contact_store,
- string account_owner_email, int64 folder_id, Geary.Imap.FolderProperties properties) {
- assert(folder_id != Db.INVALID_ROWID);
-
+
+ internal Folder(ImapDB.Database db,
+ Geary.FolderPath path,
+ ContactStore contact_store,
+ string account_owner_email,
+ int64 folder_id,
+ Geary.Imap.FolderProperties properties) {
this.db = db;
this.path = path;
this.contact_store = contact_store;
@@ -114,7 +116,7 @@ private class Geary.ImapDB.Folder : BaseObject, Geary.ReferenceSemantics {
this.folder_id = folder_id;
this.properties = properties;
}
-
+
public unowned Geary.FolderPath get_path() {
return path;
}
@@ -137,46 +139,138 @@ private class Geary.ImapDB.Folder : BaseObject, Geary.ReferenceSemantics {
return count;
}
-
- // Updates both the FolderProperties and the value in the local store.
- public async void update_remote_status_message_count(int count, Cancellable? cancellable) throws Error {
- if (count < 0)
- return;
-
- yield db.exec_transaction_async(Db.TransactionType.RW, (cx) => {
+
+ /**
+ * Updates folder's STATUS message count, attributes, recent, and unseen.
+ *
+ * UIDVALIDITY and UIDNEXT updated when the folder is
+ * SELECT/EXAMINED (see update_folder_select_examine_async())
+ * unless update_uid_info is true.
+ */
+ public async void update_folder_status(Geary.Imap.FolderProperties remote_properties,
+ bool update_uid_info,
+ bool respect_marked_for_remove,
+ Cancellable? cancellable)
+ throws Error {
+ // adjust for marked remove, but don't write these adjustments to the database -- they're
+ // only reflected in memory via the properties
+ int adjust_unseen = 0;
+ int adjust_total = 0;
+
+ yield this.db.exec_transaction_async(Db.TransactionType.RW, (cx) => {
+ if (respect_marked_for_remove) {
+ Db.Statement stmt = cx.prepare("""
+ SELECT flags
+ FROM MessageTable
+ WHERE id IN (
+ SELECT message_id
+ FROM MessageLocationTable
+ WHERE folder_id = ? AND remove_marker = ?
+ )
+ """);
+ stmt.bind_rowid(0, folder_id);
+ stmt.bind_bool(1, true);
+
+ Db.Result results = stmt.exec(cancellable);
+ while (!results.finished) {
+ adjust_total++;
+
+ Imap.EmailFlags flags = new Imap.EmailFlags(Imap.MessageFlags.deserialize(
+ results.string_at(0)));
+ if (flags.contains(EmailFlags.UNREAD))
+ adjust_unseen++;
+
+ results.next(cancellable);
+ }
+ }
+
Db.Statement stmt = cx.prepare(
- "UPDATE FolderTable SET last_seen_status_total=? WHERE id=?");
- stmt.bind_int(0, Numeric.int_floor(count, 0));
- stmt.bind_rowid(1, folder_id);
-
+ "UPDATE FolderTable SET attributes=?, unread_count=? WHERE id=?");
+ stmt.bind_string(0, remote_properties.attrs.serialize());
+ stmt.bind_int(1, remote_properties.email_unread);
+ stmt.bind_rowid(2, this.folder_id);
stmt.exec(cancellable);
-
+
+ if (update_uid_info)
+ do_update_uid_info(cx, remote_properties, cancellable);
+
+ if (remote_properties.status_messages >= 0) {
+ do_update_last_seen_status_total(
+ cx, remote_properties.status_messages, cancellable
+ );
+ }
+
return Db.TransactionOutcome.COMMIT;
}, cancellable);
-
- properties.set_status_message_count(count, false);
+
+ // update appropriate local properties
+ this.properties.set_status_unseen(
+ Numeric.int_floor(remote_properties.unseen - adjust_unseen, 0)
+ );
+ this.properties.recent = remote_properties.recent;
+ this.properties.attrs = remote_properties.attrs;
+
+ if (update_uid_info) {
+ this.properties.uid_validity = remote_properties.uid_validity;
+ this.properties.uid_next = remote_properties.uid_next;
+ }
+
+ // only update STATUS MESSAGES count if previously set, but use this count as the
+ // "authoritative" value until another SELECT/EXAMINE or MESSAGES response
+ if (remote_properties.status_messages >= 0) {
+ this.properties.set_status_message_count(
+ Numeric.int_floor(remote_properties.status_messages - adjust_total, 0),
+ true
+ );
+ }
}
-
+
+ /**
+ * Updates folder's SELECT/EXAMINE message count, UIDVALIDITY, UIDNEXT, unseen, and recent.
+ * See also update_folder_status_async().
+ */
+ public async void update_folder_select_examine(Geary.Imap.FolderProperties remote_properties,
+ Cancellable? cancellable)
+ throws Error {
+ yield this.db.exec_transaction_async(Db.TransactionType.RW, (cx) => {
+ do_update_uid_info(cx, remote_properties, cancellable);
+
+ if (remote_properties.select_examine_messages >= 0) {
+ do_update_last_seen_select_examine_total(
+ cx, remote_properties.select_examine_messages, cancellable
+ );
+ }
+
+ return Db.TransactionOutcome.COMMIT;
+ }, cancellable);
+
+ // update appropriate local properties
+ this.properties.set_status_unseen(remote_properties.unseen);
+ this.properties.recent = remote_properties.recent;
+ this.properties.uid_validity = remote_properties.uid_validity;
+ this.properties.uid_next = remote_properties.uid_next;
+
+ if (remote_properties.select_examine_messages >= 0) {
+ this.properties.set_select_examine_message_count(
+ remote_properties.select_examine_messages
+ );
+ }
+ }
+
// Updates both the FolderProperties and the value in the local store. Must be called while
// open.
public async void update_remote_selected_message_count(int count, Cancellable? cancellable) throws Error
{
if (count < 0)
return;
-
+
yield db.exec_transaction_async(Db.TransactionType.RW, (cx) => {
- Db.Statement stmt = cx.prepare(
- "UPDATE FolderTable SET last_seen_total=? WHERE id=?");
- stmt.bind_int(0, Numeric.int_floor(count, 0));
- stmt.bind_rowid(1, folder_id);
-
- stmt.exec(cancellable);
-
+ do_update_last_seen_select_examine_total(cx, count, cancellable);
return Db.TransactionOutcome.COMMIT;
}, cancellable);
-
+
properties.set_select_examine_message_count(count);
}
-
+
public async Imap.StatusData fetch_status_data(ListFlags flags, Cancellable? cancellable) throws Error {
Imap.StatusData? status_data = null;
yield db.exec_transaction_async(Db.TransactionType.RO, (cx) => {
@@ -2421,5 +2515,49 @@ private class Geary.ImapDB.Folder : BaseObject, Geary.ReferenceSemantics {
return 0;
}
-}
+ // For SELECT/EXAMINE responses, not STATUS responses
+ private void do_update_last_seen_select_examine_total(Db.Connection cx,
+ int total,
+ Cancellable? cancellable)
+ throws Error {
+ Db.Statement stmt = cx.prepare(
+ "UPDATE FolderTable SET last_seen_total=? WHERE id=?"
+ );
+ stmt.bind_int(0, Numeric.int_floor(total, 0));
+ stmt.bind_rowid(1, this.folder_id);
+ stmt.exec(cancellable);
+ }
+
+ // For STATUS responses, not SELECT/EXAMINE responses
+ private void do_update_last_seen_status_total(Db.Connection cx,
+ int total,
+ Cancellable? cancellable)
+ throws Error {
+ Db.Statement stmt = cx.prepare(
+ "UPDATE FolderTable SET last_seen_status_total=? WHERE id=?");
+ stmt.bind_int(0, Numeric.int_floor(total, 0));
+ stmt.bind_rowid(1, this.folder_id);
+ stmt.exec(cancellable);
+ }
+
+ private void do_update_uid_info(Db.Connection cx,
+ Imap.FolderProperties remote_properties,
+ Cancellable? cancellable)
+ throws Error {
+ int64 uid_validity = (remote_properties.uid_validity != null)
+ ? remote_properties.uid_validity.value
+ : Imap.UIDValidity.INVALID;
+ int64 uid_next = (remote_properties.uid_next != null)
+ ? remote_properties.uid_next.value
+ : Imap.UID.INVALID;
+
+ Db.Statement stmt = cx.prepare(
+ "UPDATE FolderTable SET uid_validity=?, uid_next=? WHERE id=?");
+ stmt.bind_int64(0, uid_validity);
+ stmt.bind_int64(1, uid_next);
+ stmt.bind_rowid(2, this.folder_id);
+ stmt.exec(cancellable);
+ }
+
+}
diff --git a/src/engine/imap-engine/gmail/imap-engine-gmail-account.vala
b/src/engine/imap-engine/gmail/imap-engine-gmail-account.vala
index f4cafde..bdebded 100644
--- a/src/engine/imap-engine/gmail/imap-engine-gmail-account.vala
+++ b/src/engine/imap-engine/gmail/imap-engine-gmail-account.vala
@@ -49,20 +49,21 @@ private class Geary.ImapEngine.GmailAccount : Geary.ImapEngine.GenericAccount {
switch (special_folder_type) {
case SpecialFolderType.ALL_MAIL:
- return new GmailAllMailFolder(this, this.remote, this.local, local_folder,
+ return new GmailAllMailFolder(this, this.remote, local_folder,
special_folder_type);
case SpecialFolderType.DRAFTS:
- return new GmailDraftsFolder(this, this.remote, this.local, local_folder,
+ return new GmailDraftsFolder(this, this.remote, local_folder,
special_folder_type);
case SpecialFolderType.SPAM:
case SpecialFolderType.TRASH:
- return new GmailSpamTrashFolder(this, this.remote, this.local, local_folder,
+ return new GmailSpamTrashFolder(this, this.remote, local_folder,
special_folder_type);
default:
- return new GmailFolder(this, this.remote, this.local, local_folder, special_folder_type);
+ return new GmailFolder(this, this.remote, local_folder,
+ special_folder_type);
}
}
diff --git a/src/engine/imap-engine/gmail/imap-engine-gmail-all-mail-folder.vala
b/src/engine/imap-engine/gmail/imap-engine-gmail-all-mail-folder.vala
index 612c55f..9f9fb8b 100644
--- a/src/engine/imap-engine/gmail/imap-engine-gmail-all-mail-folder.vala
+++ b/src/engine/imap-engine/gmail/imap-engine-gmail-all-mail-folder.vala
@@ -9,9 +9,9 @@
*/
private class Geary.ImapEngine.GmailAllMailFolder : MinimalFolder, FolderSupport.Remove {
- public GmailAllMailFolder(GmailAccount account, Imap.Account remote, ImapDB.Account local,
+ public GmailAllMailFolder(GmailAccount account, Imap.Account remote,
ImapDB.Folder local_folder, SpecialFolderType special_folder_type) {
- base (account, remote, local, local_folder, special_folder_type);
+ base (account, remote, local_folder, special_folder_type);
}
public async void remove_email_async(Gee.List<Geary.EmailIdentifier> email_ids,
diff --git a/src/engine/imap-engine/gmail/imap-engine-gmail-drafts-folder.vala
b/src/engine/imap-engine/gmail/imap-engine-gmail-drafts-folder.vala
index 897bf64..7b56ab9 100644
--- a/src/engine/imap-engine/gmail/imap-engine-gmail-drafts-folder.vala
+++ b/src/engine/imap-engine/gmail/imap-engine-gmail-drafts-folder.vala
@@ -11,9 +11,9 @@
private class Geary.ImapEngine.GmailDraftsFolder : MinimalFolder, FolderSupport.Create,
FolderSupport.Remove {
- public GmailDraftsFolder(GmailAccount account, Imap.Account remote, ImapDB.Account local,
+ public GmailDraftsFolder(GmailAccount account, Imap.Account remote,
ImapDB.Folder local_folder, SpecialFolderType special_folder_type) {
- base (account, remote, local, local_folder, special_folder_type);
+ base (account, remote, local_folder, special_folder_type);
}
public new async Geary.EmailIdentifier? create_email_async(
diff --git a/src/engine/imap-engine/gmail/imap-engine-gmail-folder.vala
b/src/engine/imap-engine/gmail/imap-engine-gmail-folder.vala
index 2579e29..cca2e00 100644
--- a/src/engine/imap-engine/gmail/imap-engine-gmail-folder.vala
+++ b/src/engine/imap-engine/gmail/imap-engine-gmail-folder.vala
@@ -6,9 +6,9 @@
private class Geary.ImapEngine.GmailFolder : MinimalFolder, FolderSupport.Archive,
FolderSupport.Create, FolderSupport.Remove {
- public GmailFolder(GmailAccount account, Imap.Account remote, ImapDB.Account local,
+ public GmailFolder(GmailAccount account, Imap.Account remote,
ImapDB.Folder local_folder, SpecialFolderType special_folder_type) {
- base (account, remote, local, local_folder, special_folder_type);
+ base (account, remote, local_folder, special_folder_type);
}
public new async Geary.EmailIdentifier? create_email_async(
diff --git a/src/engine/imap-engine/gmail/imap-engine-gmail-spam-trash-folder.vala
b/src/engine/imap-engine/gmail/imap-engine-gmail-spam-trash-folder.vala
index e450c0c..ec8461f 100644
--- a/src/engine/imap-engine/gmail/imap-engine-gmail-spam-trash-folder.vala
+++ b/src/engine/imap-engine/gmail/imap-engine-gmail-spam-trash-folder.vala
@@ -11,18 +11,17 @@
private class Geary.ImapEngine.GmailSpamTrashFolder : MinimalFolder, FolderSupport.Remove,
FolderSupport.Empty {
- public GmailSpamTrashFolder(GmailAccount account, Imap.Account remote, ImapDB.Account local,
+ public GmailSpamTrashFolder(GmailAccount account, Imap.Account remote,
ImapDB.Folder local_folder, SpecialFolderType special_folder_type) {
- base (account, remote, local, local_folder, special_folder_type);
+ base (account, remote, local_folder, special_folder_type);
}
-
+
public async void remove_email_async(Gee.List<Geary.EmailIdentifier> email_ids,
Cancellable? cancellable = null) throws Error {
yield expunge_email_async(email_ids, cancellable);
}
-
+
public async void empty_folder_async(Cancellable? cancellable = null) throws Error {
yield expunge_all_async(cancellable);
}
}
-
diff --git a/src/engine/imap-engine/imap-engine-generic-account.vala
b/src/engine/imap-engine/imap-engine-generic-account.vala
index 38bd71d..a48ecd9 100644
--- a/src/engine/imap-engine/imap-engine-generic-account.vala
+++ b/src/engine/imap-engine/imap-engine-generic-account.vala
@@ -974,7 +974,9 @@ internal class Geary.ImapEngine.UpdateRemoteFolders : AccountOperation {
// always update, openable or not; have the folder update the UID info the next time
// it's opened
try {
- yield this.local.update_folder_status_async(remote_folder, false, false, cancellable);
+ yield minimal_folder.local_folder.update_folder_status(
+ remote_folder.properties, false, false, cancellable
+ );
} catch (Error update_error) {
debug("Unable to update local folder %s with remote properties: %s",
remote_folder.to_string(), update_error.message);
@@ -1084,35 +1086,36 @@ internal class Geary.ImapEngine.RefreshFolderUnseen : FolderOperation {
private weak Imap.Account remote;
- private weak ImapDB.Account local;
internal RefreshFolderUnseen(MinimalFolder folder,
GenericAccount account,
- Imap.Account remote,
- ImapDB.Account local) {
+ Imap.Account remote) {
base(account, folder);
this.remote = remote;
- this.local = local;
}
public override async void execute(Cancellable cancellable) throws Error {
if (this.folder.get_open_state() == Geary.Folder.OpenState.CLOSED) {
- Imap.Folder remote_folder = yield remote.fetch_folder_cached_async(
+ Imap.Folder remote_folder = yield this.remote.fetch_folder_cached_async(
folder.path,
true,
cancellable
);
+
// Although this is called when the folder is closed, we
// can safely use local_folder since we are only using its
// properties, and the properties were loaded when the
// folder was first instantiated.
+ ImapDB.Folder local_folder = ((MinimalFolder) this.folder).local_folder;
+
if (remote_folder.properties.have_contents_changed(
- ((MinimalFolder) this.folder).local_folder.get_properties(),
+ local_folder.get_properties(),
this.folder.to_string())) {
- yield local.update_folder_status_async(
- remote_folder, false, true, cancellable
+
+ yield local_folder.update_folder_status(
+ remote_folder.properties, false, true, cancellable
);
((GenericAccount) this.account).update_folder(this.folder);
diff --git a/src/engine/imap-engine/imap-engine-generic-folder.vala
b/src/engine/imap-engine/imap-engine-generic-folder.vala
index 889d9bf..cd59b9b 100644
--- a/src/engine/imap-engine/imap-engine-generic-folder.vala
+++ b/src/engine/imap-engine/imap-engine-generic-folder.vala
@@ -10,9 +10,9 @@ private class Geary.ImapEngine.GenericFolder : MinimalFolder,
Geary.FolderSupport.Create,
Geary.FolderSupport.Empty {
- public GenericFolder(GenericAccount account, Imap.Account remote, ImapDB.Account local,
+ public GenericFolder(GenericAccount account, Imap.Account remote,
ImapDB.Folder local_folder, SpecialFolderType special_folder_type) {
- base (account, remote, local, local_folder, special_folder_type);
+ base (account, remote, local_folder, special_folder_type);
}
public async Geary.Revokable? archive_email_async(Gee.List<Geary.EmailIdentifier> email_ids,
diff --git a/src/engine/imap-engine/imap-engine-minimal-folder.vala
b/src/engine/imap-engine/imap-engine-minimal-folder.vala
index ca9b463..4037c76 100644
--- a/src/engine/imap-engine/imap-engine-minimal-folder.vala
+++ b/src/engine/imap-engine/imap-engine-minimal-folder.vala
@@ -64,7 +64,6 @@ private class Geary.ImapEngine.MinimalFolder : Geary.Folder, Geary.FolderSupport
private Geary.AggregatedFolderProperties _properties = new Geary.AggregatedFolderProperties(
false, false);
private Imap.Account remote;
- private ImapDB.Account local;
private Folder.OpenFlags open_flags = OpenFlags.NONE;
private int open_count = 0;
private bool remote_opened = false;
@@ -105,14 +104,15 @@ private class Geary.ImapEngine.MinimalFolder : Geary.Folder, Geary.FolderSupport
internal signal void report_problem(Geary.ProblemReport problem);
- public MinimalFolder(GenericAccount account, Imap.Account remote, ImapDB.Account local,
- ImapDB.Folder local_folder, SpecialFolderType special_folder_type) {
+ public MinimalFolder(GenericAccount account,
+ Imap.Account remote,
+ ImapDB.Folder local_folder,
+ SpecialFolderType special_folder_type) {
this._account = account;
this.remote = remote;
this.remote_open_timer = new TimeoutManager.seconds(
FORCE_OPEN_REMOTE_TIMEOUT_SEC, () => { start_open_remote(); }
);
- this.local = local;
this.local_folder = local_folder;
this.local_folder.email_complete.connect(on_email_complete);
@@ -701,8 +701,10 @@ private class Geary.ImapEngine.MinimalFolder : Geary.Folder, Geary.FolderSupport
// inconsistencies
if (yield normalize_folders(opening_folder, cancellable)) {
// update flags, properties, etc.
- yield local.update_folder_select_examine_async(opening_folder, cancellable);
-
+ yield local_folder.update_folder_select_examine(
+ opening_folder.properties, cancellable
+ );
+
// signals
opening_folder.appended.connect(on_remote_appended);
opening_folder.updated.connect(on_remote_updated);
@@ -1524,7 +1526,7 @@ private class Geary.ImapEngine.MinimalFolder : Geary.Folder, Geary.FolderSupport
// We queue an account operation since the folder itself is
// closed and hence does not have a connection to use for it.
RefreshFolderUnseen op = new RefreshFolderUnseen(
- this, this._account, this.remote, this.local
+ this, this._account, this.remote
);
try {
this._account.queue_operation(op);
diff --git a/src/engine/imap-engine/other/imap-engine-other-account.vala
b/src/engine/imap-engine/other/imap-engine-other-account.vala
index fb3467b..829ce2d 100644
--- a/src/engine/imap-engine/other/imap-engine-other-account.vala
+++ b/src/engine/imap-engine/other/imap-engine-other-account.vala
@@ -18,6 +18,6 @@ private class Geary.ImapEngine.OtherAccount : Geary.ImapEngine.GenericAccount {
else
type = local_folder.get_properties().attrs.get_special_folder_type();
- return new OtherFolder(this, this.remote, this.local, local_folder, type);
+ return new OtherFolder(this, this.remote, local_folder, type);
}
}
diff --git a/src/engine/imap-engine/other/imap-engine-other-folder.vala
b/src/engine/imap-engine/other/imap-engine-other-folder.vala
index e966603..77d84dd 100644
--- a/src/engine/imap-engine/other/imap-engine-other-folder.vala
+++ b/src/engine/imap-engine/other/imap-engine-other-folder.vala
@@ -5,9 +5,9 @@
*/
private class Geary.ImapEngine.OtherFolder : GenericFolder {
- public OtherFolder(OtherAccount account, Imap.Account remote, ImapDB.Account local,
+ public OtherFolder(OtherAccount account, Imap.Account remote,
ImapDB.Folder local_folder, SpecialFolderType special_folder_type) {
- base (account, remote, local, local_folder, special_folder_type);
+ base (account, remote, local_folder, special_folder_type);
}
}
diff --git a/src/engine/imap-engine/outlook/imap-engine-outlook-account.vala
b/src/engine/imap-engine/outlook/imap-engine-outlook-account.vala
index 8602450..6d68a00 100644
--- a/src/engine/imap-engine/outlook/imap-engine-outlook-account.vala
+++ b/src/engine/imap-engine/outlook/imap-engine-outlook-account.vala
@@ -46,9 +46,9 @@ private class Geary.ImapEngine.OutlookAccount : Geary.ImapEngine.GenericAccount
special_folder_type = local_folder.get_properties().attrs.get_special_folder_type();
if (special_folder_type == Geary.SpecialFolderType.DRAFTS)
- return new OutlookDraftsFolder(this, this.remote, this.local, local_folder, special_folder_type);
+ return new OutlookDraftsFolder(this, this.remote, local_folder, special_folder_type);
- return new OutlookFolder(this, this.remote, this.local, local_folder, special_folder_type);
+ return new OutlookFolder(this, this.remote, local_folder, special_folder_type);
}
}
diff --git a/src/engine/imap-engine/outlook/imap-engine-outlook-drafts-folder.vala
b/src/engine/imap-engine/outlook/imap-engine-outlook-drafts-folder.vala
index 14a21e3..3218664 100644
--- a/src/engine/imap-engine/outlook/imap-engine-outlook-drafts-folder.vala
+++ b/src/engine/imap-engine/outlook/imap-engine-outlook-drafts-folder.vala
@@ -12,8 +12,8 @@
* saved at all.
*/
private class Geary.ImapEngine.OutlookDraftsFolder : MinimalFolder {
- public OutlookDraftsFolder(OutlookAccount account, Imap.Account remote, ImapDB.Account local,
+ public OutlookDraftsFolder(OutlookAccount account, Imap.Account remote,
ImapDB.Folder local_folder, SpecialFolderType special_folder_type) {
- base (account, remote, local, local_folder, special_folder_type);
+ base (account, remote, local_folder, special_folder_type);
}
}
diff --git a/src/engine/imap-engine/outlook/imap-engine-outlook-folder.vala
b/src/engine/imap-engine/outlook/imap-engine-outlook-folder.vala
index 7e5dc2e..4131fe8 100644
--- a/src/engine/imap-engine/outlook/imap-engine-outlook-folder.vala
+++ b/src/engine/imap-engine/outlook/imap-engine-outlook-folder.vala
@@ -5,9 +5,8 @@
*/
private class Geary.ImapEngine.OutlookFolder : GenericFolder {
- public OutlookFolder(OutlookAccount account, Imap.Account remote, ImapDB.Account local,
+ public OutlookFolder(OutlookAccount account, Imap.Account remote,
ImapDB.Folder local_folder, SpecialFolderType special_folder_type) {
- base (account, remote, local, local_folder, special_folder_type);
+ base (account, remote, local_folder, special_folder_type);
}
}
-
diff --git a/src/engine/imap-engine/yahoo/imap-engine-yahoo-account.vala
b/src/engine/imap-engine/yahoo/imap-engine-yahoo-account.vala
index 4ce20a3..d7fd959 100644
--- a/src/engine/imap-engine/yahoo/imap-engine-yahoo-account.vala
+++ b/src/engine/imap-engine/yahoo/imap-engine-yahoo-account.vala
@@ -42,6 +42,6 @@ private class Geary.ImapEngine.YahooAccount : Geary.ImapEngine.GenericAccount {
Geary.FolderPath path = local_folder.get_path();
SpecialFolderType special_folder_type = special_map.has_key(path) ? special_map.get(path)
: Geary.SpecialFolderType.NONE;
- return new YahooFolder(this, this.remote, this.local, local_folder, special_folder_type);
+ return new YahooFolder(this, this.remote, local_folder, special_folder_type);
}
}
diff --git a/src/engine/imap-engine/yahoo/imap-engine-yahoo-folder.vala
b/src/engine/imap-engine/yahoo/imap-engine-yahoo-folder.vala
index 0a08ae3..5663faf 100644
--- a/src/engine/imap-engine/yahoo/imap-engine-yahoo-folder.vala
+++ b/src/engine/imap-engine/yahoo/imap-engine-yahoo-folder.vala
@@ -5,9 +5,8 @@
*/
private class Geary.ImapEngine.YahooFolder : GenericFolder {
- public YahooFolder(YahooAccount account, Imap.Account remote, ImapDB.Account local,
+ public YahooFolder(YahooAccount account, Imap.Account remote,
ImapDB.Folder local_folder, SpecialFolderType special_folder_type) {
- base (account, remote, local, local_folder, special_folder_type);
+ base (account, remote, local_folder, special_folder_type);
}
}
-
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]