[geary/mjog/rfc822-cleanup-part-n: 9/9] Geary.Imap.FolderSession: Ensure Email fields updated for null values




commit 53ddf8192778b736480bb7fb6f702eb0ab8d875f
Author: Michael Gratton <mike vee net>
Date:   Thu Jul 30 13:03:31 2020 +1000

    Geary.Imap.FolderSession: Ensure Email fields updated for null values
    
    Ensure that when setting values from server responses on a Geary.Email
    that the flags are still updated even when values are null (e.g. set
    Email.Field.DATE even if no Date header was present) so that clients
    can tell that the value is in fact null and that email field prereq
    checks aren't accidentally triggered.

 src/engine/imap/api/imap-folder-session.vala | 33 ++++++++++++++++------------
 1 file changed, 19 insertions(+), 14 deletions(-)
---
diff --git a/src/engine/imap/api/imap-folder-session.vala b/src/engine/imap/api/imap-folder-session.vala
index af01a803b..9bc61aca8 100644
--- a/src/engine/imap/api/imap-folder-session.vala
+++ b/src/engine/imap/api/imap-folder-session.vala
@@ -908,12 +908,15 @@ private class Geary.Imap.FolderSession : Geary.Imap.SessionObject {
                 }
             }
 
+            // When setting email properties below, the relevant
+            // Geary.Email setter needs to be called regardless of
+            // whether the value being set is null, since the setter
+            // will update the email's flags so we know the email has
+            // the field set and it is null.
+
             // DATE
             if (required_but_not_set(DATE, required_fields, email)) {
-                RFC822.Date? date = unflatten_date(headers.get("Date"));
-                if (date != null) {
-                    email.set_send_date(date);
-                }
+                email.set_send_date(unflatten_date(headers.get("Date")));
             }
 
             // ORIGINATORS
@@ -944,7 +947,9 @@ private class Geary.Imap.FolderSession : Geary.Imap.SessionObject {
             // References header will be present if REFERENCES were required, which is why
             // REFERENCES is set at the bottom of the method, when all information has been gathered
             if (message_id == null) {
-                message_id = unflatten_message_id(headers.get("Message-ID"));
+                message_id = unflatten_message_id(
+                    headers.get("Message-ID")
+                );
             }
             if (in_reply_to == null) {
                 in_reply_to = unflatten_message_id_list(
@@ -958,13 +963,13 @@ private class Geary.Imap.FolderSession : Geary.Imap.SessionObject {
             }
 
             // SUBJECT
-            // Unlike DATE, allow for empty subjects
             if (required_but_not_set(Geary.Email.Field.SUBJECT, required_fields, email)) {
+                RFC822.Subject? subject = null;
                 string? value = headers.get("Subject");
-                if (value != null)
-                    email.set_message_subject(new RFC822.Subject.from_rfc822_string(value));
-                else
-                    email.set_message_subject(null);
+                if (value != null) {
+                    subject = new RFC822.Subject.from_rfc822_string(value);
+                }
+                email.set_message_subject(subject);
             }
         }
 
@@ -983,12 +988,11 @@ private class Geary.Imap.FolderSession : Geary.Imap.SessionObject {
                 preview_specifier
             );
 
+            RFC822.PreviewText? preview = null;
             if (preview_headers != null && preview_headers.size > 0 &&
                 preview_body != null && preview_body.size > 0) {
-                email.set_message_preview(
-                    new RFC822.PreviewText.with_header(
-                        preview_headers, preview_body
-                    )
+                preview = new RFC822.PreviewText.with_header(
+                    preview_headers, preview_body
                 );
             } else {
                 warning("No preview specifiers \"%s\" and \"%s\" found",
@@ -996,6 +1000,7 @@ private class Geary.Imap.FolderSession : Geary.Imap.SessionObject {
                 foreach (FetchBodyDataSpecifier specifier in fetched_data.body_data_map.keys)
                     warning(" - has %s", specifier.to_string());
             }
+            email.set_message_preview(preview);
         }
 
         // If body was requested, get it now. We also set the preview


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