[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