[Xfce4-commits] <postler:master> Introduce GotMessage signal for new messages

Christian Dywan noreply at xfce.org
Thu Jun 23 21:00:04 CEST 2011


Updating branch refs/heads/master
         to d85170b4da8ff33fb87dec413e46199b267bec13 (commit)
       from 3450675b11e6d89ac5537ee17aa7787a2ff574f4 (commit)

commit d85170b4da8ff33fb87dec413e46199b267bec13
Author: Christian Dywan <christian at twotoasts.de>
Date:   Sun Jun 19 21:02:14 2011 +0200

    Introduce GotMessage signal for new messages
    
    The position is given so the message appears in order.

 postler/postler-client.vala   |    8 ++++++
 postler/postler-index.vala    |   30 ++++++++++++++++++++++++
 postler/postler-message.vala  |    1 +
 postler/postler-messages.vala |   51 +++++++++++++----------------------------
 postler/postler-service.vala  |    5 ++++
 5 files changed, 60 insertions(+), 35 deletions(-)

diff --git a/postler/postler-client.vala b/postler/postler-client.vala
index cb8d604..0ec9c75 100644
--- a/postler/postler-client.vala
+++ b/postler/postler-client.vala
@@ -16,6 +16,7 @@ namespace Postler {
         public async abstract int64 unread_messages (string uri) throws IOError;
         public async abstract GLib.HashTable<string,Variant> get_message (string id,
             char flag) throws IOError;
+        public signal void got_message (GLib.HashTable<string,Variant> message, int64 position);
         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;
@@ -36,6 +37,11 @@ namespace Postler {
                 client = Bus.get_proxy_sync (BusType.SESSION,
                                              "org.elementary.Postler",
                                              "/org/elementary/postler");
+                client.got_message.connect ((message_data, position) => {
+                    var message = new Message.from_id (message_data.lookup ("id").get_string ());
+                    message.from_hash_table (message_data);
+                    got_message (message, position);
+                });
                 client.progress.connect ((account, text, fraction) => {
                     progress (account, text != "" ? text : null, fraction);
                 });
@@ -71,6 +77,8 @@ namespace Postler {
                 row.get_model ().row_changed (row.get_path (), iter);
         }
 
+        public signal void got_message (Message message, int64 position);
+
         public async GLib.List<Message> get_messages (string uri) throws GLib.Error {
             var messages = new GLib.List<Message> ();
             try {
diff --git a/postler/postler-index.vala b/postler/postler-index.vala
index 5f04dc6..524b8fc 100644
--- a/postler/postler-index.vala
+++ b/postler/postler-index.vala
@@ -15,6 +15,7 @@ namespace Postler {
         static Sqlite.Statement? statement_insert = null;
         static Sqlite.Statement? statement_get = null;
         static Sqlite.Statement? statement_list = null;
+        static Sqlite.Statement? statement_position = null;
         static Sqlite.Statement? statement_count = null;
         static Sqlite.Statement? statement_remove = null;
         static Sqlite.Statement? statement_unread = null;
@@ -213,6 +214,35 @@ namespace Postler {
             return ids;
         }
 
+        public int64 get_position (Message message) throws GLib.Error {
+            if (statement_position == null) {
+                if (database.prepare_v2 ("""
+                    SELECT id FROM messages WHERE uri LIKE ?1 GROUP BY id ORDER BY date ASC
+                    """,
+                    -1, out statement_position) != Sqlite.OK)
+                    throw new GLib.FileError.FAILED (_("Failed to locate message: %s"), database.errmsg ());
+            }
+            int result = Sqlite.ERROR;
+            bool success =
+                statement_position.bind_text (1, message.uri, -1) == Sqlite.OK
+             && row_or_done (((result = statement_position.step ())));
+            if (!success) {
+                statement_position.reset ();
+                throw new GLib.FileError.FAILED (_("Failed to locate message: %s"), database.errmsg ());
+            }
+            int64 position = -1;
+            while (result == Sqlite.ROW) {
+                position++;
+                if (message.id == statement_position.column_text (0)) {
+                    statement_position.reset ();
+                    return position;
+                }
+                result = statement_position.step ();
+            }
+            statement_position.reset ();
+            return -1;
+        }
+
         public string guess_name (string address) throws GLib.Error {
             if (statement_guess == null) {
                 if (database.prepare_v2 ("""
diff --git a/postler/postler-message.vala b/postler/postler-message.vala
index 766687c..7857dbc 100644
--- a/postler/postler-message.vala
+++ b/postler/postler-message.vala
@@ -56,6 +56,7 @@ namespace Postler {
 
         public GLib.HashTable<string,Variant> to_hash_table () {
             var message_data = new GLib.HashTable<string,Variant> (str_hash, str_equal);
+            message_data.insert ("id", this.id);
             message_data.insert ("uri", this.uri ?? "");
             message_data.insert ("subject", this.subject ?? "");
             message_data.insert ("sender", this.sender ?? "");
diff --git a/postler/postler-messages.vala b/postler/postler-messages.vala
index dcd81f1..9fd75b2 100644
--- a/postler/postler-messages.vala
+++ b/postler/postler-messages.vala
@@ -13,6 +13,7 @@ public class Postler.Messages : Gtk.TreeView {
     Accounts accounts;
     Gtk.TreeStore store;
     Gtk.TreePath defer_select;
+    Postler.Client? client = null;
     Dexter.Dexter dexter = new Dexter.Dexter ();
 
     public Postler.Content content { get; set; }
@@ -26,7 +27,6 @@ public class Postler.Messages : Gtk.TreeView {
     string[] headers = {};
     string[] filters = {};
     string[] folders = {};
-    FileMonitor[] folder_monitors = {};
 
     enum Columns {
         MESSAGE
@@ -376,7 +376,7 @@ public class Postler.Messages : Gtk.TreeView {
     }
 
     public void clear () {
-        folder_monitors = {};
+        client = null;
         store.clear ();
     }
 
@@ -422,7 +422,9 @@ public class Postler.Messages : Gtk.TreeView {
                 folders = {};
                 headers = {};
                 filters = {};
-                var client = new Client ();
+                client = new Client ();
+                /* FIXME: The client emits, the callback isn't called */
+                client.got_message.connect (got_message);
                 /* TODO: pass search: URI */
                 if (location.has_prefix ("search:"))
                     messages = yield client.get_messages ("%/INBOX/%");
@@ -561,38 +563,17 @@ public class Postler.Messages : Gtk.TreeView {
         }
     }
 
-    void folder_monitor_changed (File file, File? other, FileMonitorEvent event) {
-        switch (event) {
-        case FileMonitorEvent.CREATED:
-            if (get_message_iter (file.get_path (), null))
-                break;
-            try {
-                /* TODO: Honor filter */
-                /* TODO: sort by timestamp */
-                var message = new Message.from_file (file);
-                bool scroll = vadjustment.value == 0;
-                store.insert_with_values (null, null, 0,
-                    Columns.MESSAGE, message);
-                if (scroll)
-                    vadjustment.value = 0;
-            }
-            catch (GLib.Error error) {
-                GLib.warning ("Failed to get new message: %s", error.message);
-            }
-            break;
-        case FileMonitorEvent.DELETED:
-            Gtk.TreeIter iter;
-            if (get_message_iter (file.get_path (), out iter))
-                store.remove (iter);
-            break;
-        case FileMonitorEvent.CHANGED:
-        case FileMonitorEvent.CHANGES_DONE_HINT:
-        case FileMonitorEvent.ATTRIBUTE_CHANGED:
-            break;
-        default:
-            GLib.warning ("Unhandled folder change: " + event.to_string ());
-            break;
-        }
+    void got_message (Message message, int64 position) {
+        if (get_message_iter (message.get_path (), null))
+            return;
+        /* TODO: Honor folder and filter */
+        bool scroll = vadjustment.value == 0;
+        store.insert_with_values (null, null, 0,
+            Columns.MESSAGE, message);
+        if (scroll)
+            vadjustment.value = 0;
+        /* if (get_message_iter (file.get_path (), out iter))
+                store.remove (iter); */
     }
 
     public void toggle_selected_flag (char flag) {
diff --git a/postler/postler-service.vala b/postler/postler-service.vala
index 6d94082..6e5f0f2 100644
--- a/postler/postler-service.vala
+++ b/postler/postler-service.vala
@@ -207,9 +207,12 @@ namespace Postler {
                     case FileMonitorEvent.CREATED:
                         var message = new Message.from_file (file);
                         index.insert_received_message (message);
+                        int64 position = index.get_position (message);
+                        got_message (message.to_hash_table (), position);
                         break;
                     case FileMonitorEvent.DELETED:
                         index.remove_filename (file.get_uri ());
+                        /* FIXME: Signal for removal */
                         break;
                     case FileMonitorEvent.CHANGED:
                     case FileMonitorEvent.CHANGES_DONE_HINT:
@@ -395,6 +398,8 @@ namespace Postler {
             return message.to_hash_table ();
         }
 
+        public signal void got_message (GLib.HashTable<string,Variant> message, int64 position);
+
         public string[] get_messages (string uri) throws GLib.Error {
             return index.get_messages (uri);
         }



More information about the Xfce4-commits mailing list