[gnome-shell] use TpContact to get the avatar



commit 370c596fbf609aea11907f2adbf8962d3a4880c8
Author: Guillaume Desmottes <guillaume desmottes collabora co uk>
Date:   Tue Feb 8 14:05:20 2011 +0100

    use TpContact to get the avatar

 js/ui/telepathyClient.js |  132 ++++++++--------------------------------------
 1 files changed, 22 insertions(+), 110 deletions(-)
---
diff --git a/js/ui/telepathyClient.js b/js/ui/telepathyClient.js
index 616eaa0..ac9fd9b 100644
--- a/js/ui/telepathyClient.js
+++ b/js/ui/telepathyClient.js
@@ -284,114 +284,6 @@ ContactManager.prototype = {
 
         delete this._connections[conn.getPath()];
     },
-
-    _getFileForToken: function(info, token) {
-        return info.cacheDir + '/' + Telepathy.escapeAsIdentifier(token);
-    },
-
-    _setIcon: function(iconBox, info, handle) {
-        let textureCache = St.TextureCache.get_default();
-        let token = info.tokens[handle];
-        let file;
-
-        if (token) {
-            file = this._getFileForToken(info, token);
-            if (!GLib.file_test(file, GLib.FileTest.EXISTS))
-                file = null;
-        }
-
-        if (file) {
-            let uri = GLib.filename_to_uri(file, null);
-            iconBox.child = textureCache.load_uri_async(uri, iconBox._size, iconBox._size);
-        } else {
-            iconBox.child = new St.Icon({ icon_name: 'stock_person',
-                                          icon_type: St.IconType.FULLCOLOR,
-                                          icon_size: iconBox._size });
-        }
-    },
-
-    _updateIcons: function(info, handle) {
-        if (!info.icons[handle])
-            return;
-
-        for (let i = 0; i < info.icons[handle].length; i++) {
-            let iconBox = info.icons[handle][i];
-            this._setIcon(iconBox, info, handle);
-        }
-    },
-
-    _avatarUpdated: function(conn, handle, token) {
-        let info = this._connections[conn.getPath()];
-        if (!info)
-            return;
-
-        if (info.tokens[handle] == token)
-            return;
-
-        info.tokens[handle] = token;
-        if (token != '') {
-            let file = this._getFileForToken(info, token);
-            if (!GLib.file_test(file, GLib.FileTest.EXISTS)) {
-                info.connectionAvatars.RequestAvatarsRemote([handle]);
-                return;
-            }
-        }
-
-        this._updateIcons(info, handle);
-    },
-
-    _avatarRetrieved: function(conn, handle, token, avatarData, mimeType) {
-        let info = this._connections[conn.getPath()];
-        if (!info)
-            return;
-
-        let file = this._getFileForToken(info, token);
-        let success = false;
-        try {
-            success = GLib.file_set_contents(file, avatarData, avatarData.length);
-        } catch (e) {
-            logError(e, 'Error caching avatar data');
-        }
-
-        if (success)
-            this._updateIcons(info, handle);
-    },
-
-    createAvatar: function(conn, handle, size) {
-        let iconBox = new St.Bin({ style_class: 'avatar-box' });
-        iconBox._size = size;
-
-        let info = this._connections[conn.get_object_path()];
-        if (!info)
-            info = this.addConnection(conn.get_object_path());
-
-        if (!info.icons[handle])
-            info.icons[handle] = [];
-        info.icons[handle].push(iconBox);
-
-        iconBox.connect('destroy', Lang.bind(this,
-            function() {
-                let i = info.icons[handle].indexOf(iconBox);
-                if (i != -1)
-                    info.icons[handle].splice(i, 1);
-            }));
-
-        // If we already have the icon cached and know its token, this
-        // will fill it in. Otherwise it will fill in the default
-        // icon.
-        this._setIcon(iconBox, info, handle);
-
-        // Asynchronously load the real avatar if we don't have it yet.
-        if (info.tokens[handle] == null) {
-            info.connectionAvatars.GetKnownAvatarTokensRemote([handle], Lang.bind(this,
-                function (tokens, err) {
-                    let token = tokens && tokens[handle] ? tokens[handle] : '';
-                    this._avatarUpdated(info.connectionAvatars, handle, token);
-                }));
-        }
-
-        return iconBox;
-    }
 };
 Signals.addSignalMethods(ContactManager.prototype);
 
@@ -433,6 +325,7 @@ Source.prototype = {
         this._setSummaryIcon(this.createNotificationIcon());
 
         this._notifyAliasId = this._contact.connect('notify::alias', Lang.bind(this, this._updateAlias));
+        this._notifyAvatarId = this._contact.connect('notify::avatar-file', Lang.bind(this, this._updateAvatarIcon));
     },
 
     _updateAlias: function() {
@@ -440,8 +333,26 @@ Source.prototype = {
     },
 
     createNotificationIcon: function() {
-        return contactManager.createAvatar(this._conn, this._targetHandle,
-                                           this.ICON_SIZE);
+        this._iconBox = new St.Bin({ style_class: 'avatar-box' });
+        this._iconBox._size = this.ICON_SIZE;
+
+        this._updateAvatarIcon();
+
+        return this._iconBox;
+    },
+
+    _updateAvatarIcon: function() {
+        let textureCache = St.TextureCache.get_default();
+        let file = this._contact.get_avatar_file();
+
+        if (file) {
+            let uri = file.get_uri();
+            this._iconBox.child = textureCache.load_uri_async(uri, this._iconBox._size, this._iconBox._size);
+        } else {
+            this._iconBox.child = new St.Icon({ icon_name: 'stock_person',
+                                                icon_type: St.IconType.FULLCOLOR,
+                                                icon_size: this._iconBox._size });
+        }
     },
 
     _notificationClicked: function(notification) {
@@ -468,6 +379,7 @@ Source.prototype = {
         this._channelText.disconnect(this._sentId);
 
         this._contact.disconnect(this._notifyAliasId);
+        this._contact.disconnect(this._notifyAvatarId);
         this.destroy();
     },
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]