[Xfce4-commits] <postler:master> Identify messages by their globally unique ID

Christian Dywan noreply at xfce.org
Sun May 29 04:46:02 CEST 2011


Updating branch refs/heads/master
         to 98364a87b11484d908c3a64d5ca88a152a341a75 (commit)
       from 13d535c78f48042447b29347adebf8a573673a37 (commit)

commit 98364a87b11484d908c3a64d5ca88a152a341a75
Author: Christian Dywan <christian at twotoasts.de>
Date:   Sat May 28 16:53:27 2011 +0200

    Identify messages by their globally unique ID
    
    This ID never changes unlike filenames, even if re-creating
    the local setup from scratch on a different machine.

 postler/postler-client.vala   |   18 +++++++++++++-----
 postler/postler-composer.vala |    2 +-
 postler/postler-index.vala    |   32 +++++++++++++++-----------------
 postler/postler-message.vala  |   24 ++++++++++++++++--------
 postler/postler-messages.vala |    4 ++--
 postler/postler-service.vala  |   10 +++-------
 6 files changed, 50 insertions(+), 40 deletions(-)

diff --git a/postler/postler-client.vala b/postler/postler-client.vala
index 29181aa..886994c 100644
--- a/postler/postler-client.vala
+++ b/postler/postler-client.vala
@@ -14,7 +14,7 @@ namespace Postler {
     [DBus (name = "org.elementary.Postler")]
     interface PostlerClient : Object {
         public async abstract int64 unread_messages (string uri) throws IOError;
-        public async abstract GLib.HashTable<string,Variant> get_message (string uri) throws IOError;
+        public async abstract GLib.HashTable<string,Variant> get_message (string id) throws IOError;
         public async abstract string[] get_messages (string uri) throws IOError;
         public signal void progress (string account, string text, double fraction);
         public abstract void receive (string account) throws IOError;
@@ -58,7 +58,7 @@ namespace Postler {
 
         public async void get_message (Message message, Gtk.TreeRowReference row) {
             try {
-                message.from_hash_table (yield client.get_message (message.uri));
+                message.from_hash_table (yield client.get_message (message.id));
             } catch (GLib.Error error) {
                 message.from_error (error.message.replace (
     "org.gtk.GDBus.UnmappedGError.Quark._g_2dfile_2derror_2dquark.Code24", "GLib.FileError"));
@@ -70,9 +70,17 @@ namespace Postler {
 
         public async GLib.List<Message> get_messages (string uri) throws GLib.Error {
             var messages = new GLib.List<Message> ();
-            string[] uris = yield client.get_messages (uri);
-            foreach (string message_uri in uris)
-                messages.append (new Message.from_uri (message_uri));
+            try {
+                string[] ids = yield client.get_messages (uri);
+                foreach (string message_id in ids)
+                    messages.append (new Message.from_id (message_id));
+            }
+            catch (GLib.Error error) {
+                var message = new Message.from_id ("error:");
+                message.from_error (error.message.replace (
+    "org.gtk.GDBus.UnmappedGError.Quark._g_2dfile_2derror_2dquark.Code24", "GLib.FileError"));
+                messages.append (message);
+            }
             return messages;
         }
 
diff --git a/postler/postler-composer.vala b/postler/postler-composer.vala
index 86c8770..a0037d9 100644
--- a/postler/postler-composer.vala
+++ b/postler/postler-composer.vala
@@ -231,7 +231,7 @@ public class Postler.Composer : Gtk.Window {
         if ((actions.get_action ("MarkImportant") as Gtk.ToggleAction).active)
             header += "X-Priority: 1\n";
         if (content.message_id != null)
-            header += "In-Reply-To: " + content.message_id + "\n";
+            header += "In-Reply-To: <" + content.message_id + ">\n";
 
         Gtk.TreeIter iter;
         if (!(attachments.model.get_iter_first (out iter))) {
diff --git a/postler/postler-index.vala b/postler/postler-index.vala
index 7c02567..95f15b1 100644
--- a/postler/postler-index.vala
+++ b/postler/postler-index.vala
@@ -37,10 +37,10 @@ namespace Postler {
             if (database.exec (
                 """
                 CREATE TABLE IF NOT EXISTS
-                messages (uri TEXT UNIQUE, subject TEXT, sender TEXT, recipients TEXT,
+                messages (id TEXT, uri TEXT, subject TEXT, sender TEXT, recipients TEXT,
                           unread BOOLEAN, flagged BOOLEAN,
                           forwarded BOOLEAN, replied BOOLEAN, priority BOOLEAN,
-                          date INTEGER, excerpt TEXT, zeitgeist BOOLEAN);
+                          date INTEGER, excerpt TEXT);
                 """
                 ) != Sqlite.OK)
                 throw new GLib.FileError.FAILED (_("Failed to open database: %s"), database.errmsg ());
@@ -51,11 +51,11 @@ namespace Postler {
                 if (database.prepare_v2 ("""
                     INSERT OR IGNORE INTO messages
                     (uri, subject, sender, recipients,
-                     unread, flagged, forwarded, replied, priority, date)
-                    VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10)
+                     unread, flagged, forwarded, replied, priority, date, id)
+                    VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11)
                     """,
                     -1, out statement_insert) != Sqlite.OK)
-                    throw new GLib.FileError.FAILED (_("Failed to open database: %s"), database.errmsg ());
+                    throw new GLib.FileError.FAILED (_("Failed to index message: %s"), database.errmsg ());
             }
             bool success =
                 statement_insert.bind_text (1, message.uri, -1) == Sqlite.OK
@@ -68,11 +68,11 @@ namespace Postler {
              && statement_insert.bind_int64 (8, message.replied ? 1 : 0) == Sqlite.OK
              && statement_insert.bind_int64 (9, message.priority ? 1 : 0) == Sqlite.OK
              && statement_insert.bind_int64 (10, message.get_timestamp ()) == Sqlite.OK
+             && statement_insert.bind_text (11, message.id) == Sqlite.OK
              && statement_insert.step () == Sqlite.DONE;
             statement_insert.reset ();
             if (!success)
                 throw new GLib.FileError.FAILED (_("Failed to index message: %s"), database.errmsg ());
-            /* TODO: Move file from new to cur */
 #if HAVE_ZEITGEIST
             var log = new Zeitgeist.Log ();
             var event = new Zeitgeist.Event.full (Zeitgeist.ZG_RECEIVE_EVENT,
@@ -82,7 +82,6 @@ namespace Postler {
                 "text/plain", GLib.File.new_for_uri (message.uri).get_parent ().get_uri (),
                 message.sender, ""));
             log.insert_events_no_reply (event);
-            /*  TODO: use async call and set 'zeitgeist' boolean if succeeded */
 #endif
         }
 
@@ -126,32 +125,32 @@ namespace Postler {
             return count;
         }
 
-        public Message get_message (string uri) throws GLib.Error {
+        public Message get_message (string id) throws GLib.Error {
             if (statement_get == null) {
                 if (database.prepare_v2 ("""
                     SELECT subject, sender, recipients,
-                    unread, flagged, forwarded, replied, priority, date FROM messages WHERE uri LIKE ?1
+                    unread, flagged, forwarded, replied, priority, date, uri FROM messages WHERE id = ?1
                     """,
                     -1, out statement_get) != Sqlite.OK)
                     throw new GLib.FileError.FAILED (_("Failed to list messages: %s"), database.errmsg ());
             }
             int result = Sqlite.ERROR;
             bool success =
-                statement_get.bind_text (1, uri + "%", -1) == Sqlite.OK
+                statement_get.bind_text (1, id, -1) == Sqlite.OK
              && ((result = statement_get.step ())) == Sqlite.ROW;
             if (!success) {
                 statement_get.reset ();
                 throw new GLib.FileError.FAILED (_("Failed to get message: %s"), database.errmsg ());
             }
-            var message = new Message.from_statement (uri, statement_get);
+            var message = new Message.from_statement (id, statement_get);
             statement_get.reset ();
             return message;
         }
 
-        public GLib.List<Message> get_messages (string folder) throws GLib.Error {
+        public string[] get_messages (string folder) throws GLib.Error {
             if (statement_list == null) {
                 if (database.prepare_v2 ("""
-                    SELECT uri FROM messages WHERE uri LIKE ?1 ORDER BY date ASC
+                    SELECT id FROM messages WHERE uri LIKE ?1 ORDER BY date ASC
                     """,
                     -1, out statement_list) != Sqlite.OK)
                     throw new GLib.FileError.FAILED (_("Failed to list messages: %s"), database.errmsg ());
@@ -164,14 +163,13 @@ namespace Postler {
                 statement_list.reset ();
                 throw new GLib.FileError.FAILED (_("Failed to list messages: %s"), database.errmsg ());
             }
-            var messages = new GLib.List<Message> ();
+            string[] ids = {};
             while (result == Sqlite.ROW) {
-                var message = new Message.from_uri (statement_list.column_text (0));
-                messages.append (message);
+                ids += statement_list.column_text (0);
                 result = statement_list.step ();
             }
             statement_list.reset ();
-            return messages;
+            return ids;
         }
     }
 }
diff --git a/postler/postler-message.vala b/postler/postler-message.vala
index ee23465..20b10fa 100644
--- a/postler/postler-message.vala
+++ b/postler/postler-message.vala
@@ -11,7 +11,7 @@
 
 namespace Postler {
     public class Message : GLib.Object, GLib.Initable {
-        public string uri { public get; set; } /* TODO: uri without status flags */
+        public string? uri { public get; set; }
         public string get_path () { return GLib.File.new_for_uri (uri).get_path (); }
         public string? id { public get; set; }
         string? charset = null;
@@ -35,7 +35,7 @@ namespace Postler {
         public GLib.DataInputStream get_stream () { return stream; }
 
         bool init (GLib.Cancellable? cancellable = null) throws GLib.Error {
-            return true;
+            return false;
         }
 
         static string parse_encoded (string quoted, out string charset) {
@@ -57,8 +57,8 @@ namespace Postler {
             return message_data;
         }
 
-        public Message.from_uri (string uri) {
-            this.uri = uri;
+        public Message.from_id (string id) {
+            this.id = id;
         }
 
         public void from_error (string error_message) {
@@ -67,6 +67,7 @@ namespace Postler {
         }
 
         public void from_hash_table (GLib.HashTable<string,Variant> message_data) {
+            this.uri = message_data.lookup ("uri").get_string ();
             this.subject = message_data.lookup ("subject").get_string ();
             this.sender = message_data.lookup ("sender").get_string ();
             this.recipients = message_data.lookup ("recipients").get_string ();
@@ -78,8 +79,8 @@ namespace Postler {
             this.date = new GLib.DateTime.from_unix_utc (message_data.lookup ("date").get_int64 ());
         }
 
-        public Message.from_statement (string uri, Sqlite.Statement statement) {
-            this.uri = uri;
+        public Message.from_statement (string id, Sqlite.Statement statement) {
+            this.id = id;
             this.subject = statement.column_text (0);
             this.sender = statement.column_text (1);
             this.recipients = statement.column_text (2);
@@ -89,6 +90,7 @@ namespace Postler {
             this.replied = statement.column_int64 (6) != 0;
             this.priority = statement.column_int64 (7) != 0;
             this.date = new GLib.DateTime.from_unix_utc (statement.column_int64 (8));
+            this.uri = statement.column_text (9);
         }
 
         void read_flags (string path) {
@@ -135,8 +137,11 @@ namespace Postler {
                     continue;
 
                 string field = ascii_strdown (parts[0]);
-                if (field == "message-id")
-                    id = parts[1].strip ();
+                if (field == "message-id") {
+                    string message_id = parts[1].strip ();
+                    if (message_id.has_prefix ("<") && message_id.has_suffix (">"))
+                        id = message_id.slice (1, -1);
+                }
                 else if (field == "subject")
                     subject = parse_encoded (parts[1], out charset);
                 else if (field == "from") {
@@ -169,6 +174,9 @@ namespace Postler {
                     fields.insert (field, parts[1]);
             }
 
+            if (id == null)
+                throw new GLib.FileError.FAILED (_("Failed to find valid message ID"));
+
             recipients = parse_encoded (recipients, out charset);
 
             /* Some mailing list systems override Reply-To so that it doesn't
diff --git a/postler/postler-messages.vala b/postler/postler-messages.vala
index eedde8b..c2778b6 100644
--- a/postler/postler-messages.vala
+++ b/postler/postler-messages.vala
@@ -137,7 +137,7 @@ public class Postler.Messages : Gtk.TreeView {
         renderer.xpad = renderer.ypad = 0;
         renderer.xalign = renderer.yalign = 0.0f;
 
-        if (message.date == null) {      
+        if (message.uri == null) {
             new Client ().get_message.begin (message,
                 new Gtk.TreeRowReference (model, model.get_path (iter)));
             renderer.markup = "...";
@@ -514,7 +514,7 @@ public class Postler.Messages : Gtk.TreeView {
     public void display_error (string title, string text) {
         clear ();
         string markup = "<big><b>%s</b></big>\n\n%s".printf (title, text);
-        var message = new Message.from_uri ("error:");
+        var message = new Message.from_id ("error:");
         message.from_error (markup);
         store.insert_with_values (null, null, 0,
                                   Columns.MESSAGE, message);
diff --git a/postler/postler-service.vala b/postler/postler-service.vala
index 5ae5c0a..a4164eb 100644
--- a/postler/postler-service.vala
+++ b/postler/postler-service.vala
@@ -326,16 +326,12 @@ namespace Postler {
              return index.unread_messages (uri);
         }
 
-        public GLib.HashTable<string,Variant> get_message (string uri) throws GLib.Error {
-            return index.get_message (uri).to_hash_table ();
+        public GLib.HashTable<string,Variant> get_message (string id) throws GLib.Error {
+            return index.get_message (id).to_hash_table ();
         }
 
         public string[] get_messages (string uri) throws GLib.Error {
-            var messages = index.get_messages (uri);
-            string[] uris = {};
-            foreach (var message in messages)
-                uris += message.uri;
-            return uris;
+            return index.get_messages (uri);
         }
 
         public signal void progress (string account, string text, double fraction);



More information about the Xfce4-commits mailing list