[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