[Xfce4-commits] <postler:master> Lookup and render avatars and unify lookup

Christian Dywan noreply at xfce.org
Wed Jun 29 20:02:01 CEST 2011


Updating branch refs/heads/master
         to 8ea33c0649f90a3aea47a41bdb42f991ad9aa046 (commit)
       from 15db8304c665640f0c461f730af95c965e514581 (commit)

commit 8ea33c0649f90a3aea47a41bdb42f991ad9aa046
Author: Christian Dywan <christian at twotoasts.de>
Date:   Tue Jun 28 22:12:18 2011 +0200

    Lookup and render avatars and unify lookup

 postler/postler-contact.vala  |    8 ++++++
 postler/postler-content.vala  |    9 +++++++
 postler/postler-index.vala    |   49 ++++++++++++++++++++++++++++------------
 postler/postler-message.vala  |    6 +++++
 postler/postler-messages.vala |    8 +------
 5 files changed, 58 insertions(+), 22 deletions(-)

diff --git a/postler/postler-contact.vala b/postler/postler-contact.vala
index 67c34f0..8bdfb29 100644
--- a/postler/postler-contact.vala
+++ b/postler/postler-contact.vala
@@ -11,6 +11,14 @@
 
 namespace Postler {
     public class Contact {
+        public string display_name;
+        public GLib.File? avatar;
+
+        public Contact (string display_name, GLib.File? avatar) {
+            this.display_name = display_name;
+            this.avatar = avatar;
+        }
+
         internal static string[] parse (string address)
             ensures (result[0] != null && result[1] != null) {
             if (address.length < 1) {
diff --git a/postler/postler-content.vala b/postler/postler-content.vala
index 8cdc605..99b2a4a 100644
--- a/postler/postler-content.vala
+++ b/postler/postler-content.vala
@@ -358,6 +358,10 @@ public class Postler.Content : WebKit.WebView {
         if (pixbuf == null) {
             return null;
         }
+        return pixbuf_to_data_uri (pixbuf);
+    }
+
+    static string? pixbuf_to_data_uri (Gdk.Pixbuf pixbuf) {
         string buffer;
         size_t buffer_size;
         try {
@@ -706,6 +710,11 @@ public class Postler.Content : WebKit.WebView {
                 reply_markup = reply_markup.replace ("\"%sender%\"", ("\"" + child.sender + "\""));
                 reply_markup = reply_markup.replace ("%sender%", linkify_address (child.sender, null));
                 reply_markup = reply_markup.replace ("%time{%X}%", format_date (child.date));
+                string avatar_uri = "Incoming/buddy_icon.png";
+                if (child.avatar != null && child.avatar.get_path () != null) {
+                    avatar_uri = child.avatar.get_uri ();
+                }
+                reply_markup = reply_markup.replace ("%userIconPath%", avatar_uri);
                 body_chunk.append (reply_markup);
 
                 foreach (var attachment_part in child.parts) {
diff --git a/postler/postler-index.vala b/postler/postler-index.vala
index bb4d1e3..4311860 100644
--- a/postler/postler-index.vala
+++ b/postler/postler-index.vala
@@ -22,7 +22,7 @@ namespace Postler {
         static Sqlite.Statement? statement_unread = null;
         static Sqlite.Statement? statement_guess = null;
         static int64 startup_timestamp = new DateTime.now_utc ().to_unix ();
-        static GLib.HashTable<string,string> names;
+        static GLib.HashTable<string,Postler.Contact> names;
 #if HAVE_FOLKS
         static Folks.IndividualAggregator aggregator;
 
@@ -30,13 +30,14 @@ namespace Postler {
             foreach (var individual in aggregator.get_individuals ().get_values ()) {
                 string? display_name = individual.full_name ?? individual.alias;
                 if (display_name != null) {
+                    var contact = new Postler.Contact (display_name, individual.avatar);
                     foreach (string address in individual.email_addresses)
-                        names.insert (address, display_name);
+                        names.insert (address, contact);
                     /* foreach (string address in individual.im_addresses.get_values ())
-                            names.insert (address, display_name); */
+                            names.insert (address, contact); */
                     foreach (var persona in individual.personas) {
                         if (persona.display_id.chr (-1, '@') != null)
-                            names.insert (persona.display_id, display_name);
+                            names.insert (persona.display_id, contact);
                     }
                 }
             }
@@ -55,7 +56,7 @@ namespace Postler {
             if (database != null)
                 return;
 
-            names = new GLib.HashTable<string,string> (str_hash, str_equal);
+            names = new GLib.HashTable<string,Postler.Contact> (str_hash, str_equal);
 #if HAVE_FOLKS
             aggregator = new Folks.IndividualAggregator ();
             /* FIXME: Connect to aggregator.individuals_changed */
@@ -218,7 +219,17 @@ namespace Postler {
                 throw new GLib.FileError.FAILED (_("Failed to get message: %s"), database.errmsg ());
             }
             var message = new Message.from_statement (id, statement_get);
-            message.sender = guess_name (message.sender);
+            string address = Postler.Contact.address_from_string (message.sender);
+            try {
+                var contact = guess_name (address);
+                if (contact != null) {
+                    message.sender = "%s <%s>".printf (contact.display_name, address);
+                    message.avatar = contact.avatar;
+                }
+            }
+            catch (GLib.Error guess_error) {
+                GLib.warning (guess_error.message);
+            }
             statement_get.reset ();
             return message;
         }
@@ -305,10 +316,14 @@ namespace Postler {
             return -1;
         }
 
-        public string guess_name (string address) throws GLib.Error {
-            string? display_name = names.lookup (address);
+        public Postler.Contact? guess_name (string address) throws GLib.Error {
+            Postler.Contact? contact = names.lookup (address);
+            if (contact != null)
+                return contact;
+
+            string? display_name = new Dexter.Dexter ().get_name (address);
             if (display_name != null)
-                return "%s <%s>".printf (display_name, address);
+                return new Postler.Contact (display_name, null);
 
             if (statement_guess == null) {
                 if (database.prepare_v2 ("""
@@ -316,19 +331,23 @@ namespace Postler {
                     GROUP BY sender ORDER BY COUNT (sender) DESC LIMIT 1
                     """,
                     -1, out statement_guess) != Sqlite.OK)
-                    throw new GLib.FileError.FAILED (_("Failed to list messages: %s"), database.errmsg ());
+                    throw new GLib.FileError.FAILED (_("Failed to guess name: %s"), database.errmsg ());
             }
+            int result = Sqlite.ERROR;
             bool success =
-                statement_guess.bind_text (1, "%" + address + ">", -1) == Sqlite.OK;
-            int result = statement_guess.step ();
-            success = success && row_or_done (result);
+                statement_guess.bind_text (1, "%<" + address + ">", -1) == Sqlite.OK
+             && row_or_done (((result = statement_guess.step ())));
             if (!success) {
                 statement_guess.reset ();
                 throw new GLib.FileError.FAILED (_("Failed to guess name: %s"), database.errmsg ());
             }
-            string find = result == Sqlite.ROW ? statement_guess.column_text (0) : address;
+            if (result == Sqlite.ROW) {
+                display_name = Postler.Contact.name_from_string (statement_guess.column_text (0));
+                statement_guess.reset ();
+                return new Postler.Contact (display_name, null);
+            }
             statement_guess.reset ();
-            return find;
+            return null;
         }
     }
 }
diff --git a/postler/postler-message.vala b/postler/postler-message.vala
index eb1675a..5eb1cd5 100644
--- a/postler/postler-message.vala
+++ b/postler/postler-message.vala
@@ -94,6 +94,7 @@ namespace Postler {
         public int64 get_timestamp () { return date != null ? date.to_unix () : 0; }
         public string? subject { public get; set; }
         public string? sender { public get; internal set; }
+        public GLib.File? avatar { public get; internal set; }
         public string? recipients { public get; set; }
         public string? reply_to { public get; set; }
         public bool unread { public get; set; }
@@ -128,6 +129,8 @@ namespace Postler {
             message_data.insert ("replies", this.replies);
             message_data.insert ("subject", this.subject ?? "");
             message_data.insert ("sender", this.sender ?? "");
+            if (avatar != null)
+                message_data.insert ("avatar", avatar.get_uri ());
             message_data.insert ("recipients", this.recipients ?? "");
             message_data.insert ("unread", this.unread);
             message_data.insert ("flagged", this.flagged);
@@ -153,6 +156,9 @@ namespace Postler {
             this.replies = message_data.lookup ("replies").get_int64 ();
             this.subject = message_data.lookup ("subject").get_string ();
             this.sender = message_data.lookup ("sender").get_string ();
+            Variant? avatar = message_data.lookup ("avatar");
+            if (avatar != null)
+                this.avatar = GLib.File.new_for_uri (avatar.get_string ());
             this.recipients = message_data.lookup ("recipients").get_string ();
             this.unread = message_data.lookup ("unread").get_boolean ();
             this.flagged = message_data.lookup ("flagged").get_boolean ();
diff --git a/postler/postler-messages.vala b/postler/postler-messages.vala
index 61c93fd..d277de0 100644
--- a/postler/postler-messages.vala
+++ b/postler/postler-messages.vala
@@ -14,7 +14,6 @@ public class Postler.Messages : Gtk.TreeView {
     Gtk.TreeStore store;
     Gtk.TreePath defer_select;
     Postler.Client? client = null;
-    Dexter.Dexter dexter = new Dexter.Dexter ();
 
     public Postler.Content content { get; set; }
     public bool hide_read { get; set; }
@@ -150,12 +149,7 @@ public class Postler.Messages : Gtk.TreeView {
         for (int j = 0; j < 20 - size; j++)
             date = date + " ";
 
-        string from;
-        if (message.sender != null)
-            from = escape_text (dexter.get_name (message.sender)
-                ?? Postler.Contact.name_from_string (message.sender));
-        else
-            from = _("Unknown");
+        string from = escape_text (Postler.Contact.name_from_string (message.sender));
         int weight = message.unread ? Pango.Weight.BOLD : Pango.Weight.NORMAL;
 
         renderer.ellipsize = Pango.EllipsizeMode.MIDDLE;



More information about the Xfce4-commits mailing list