+static void avatar_chooser_set_image (EmpathyAvatarChooser *self,
+ GArray *avatar,
+ gchar *mime_type,
+ GdkPixbuf *pixbuf,
+ gboolean maybe_convert);
+static void avatar_chooser_clear_image (EmpathyAvatarChooser *self);
+
+static void
+get_avatar_cb (GObject *source,
+ GAsyncResult *result,
+ gpointer user_data)
+{
+ TpWeakRef *wr = user_data;
+ EmpathyAvatarChooser *self = tp_weak_ref_dup_object (wr);
+ const GArray *avatar;
+ GdkPixbuf *pixbuf;
+ gchar *mime_type;
+ GError *error = NULL;
+
+ if (self == NULL)
+ {
+ tp_weak_ref_destroy (wr);
+ return;
+ }
+
+ avatar = tp_account_get_avatar_finish (self->priv->account, result, &error);
+ if (avatar == NULL)
+ {
+ DEBUG ("Error getting account's avatar: %s", error->message);
+ g_clear_error (&error);
+ goto out;
+ }
+
+ if (avatar->len == 0)
+ {
+ avatar_chooser_clear_image (self);
+ goto out;
+ }
+
+ pixbuf = empathy_pixbuf_from_data_and_mime ((gchar *) avatar->data,
+ avatar->len, &mime_type);
+ if (pixbuf == NULL)
+ {
+ DEBUG ("couldn't make a pixbuf from avatar; giving up");
+ goto out;
+ }
+
+ avatar_chooser_set_image (self, (GArray *) avatar, mime_type, pixbuf, FALSE);
+ g_free (mime_type);
+
+ self->priv->changed = FALSE;
+
+out:
+ tp_weak_ref_destroy (wr);
+ g_object_unref (self);
+}
+
+static void
+avatar_changed_cb (TpAccount *account,
+ gpointer user_data,
+ GObject *weak_object)
+{
+ EmpathyAvatarChooser *self = (EmpathyAvatarChooser *) weak_object;
+
+ tp_account_get_avatar_async (self->priv->account,
+ get_avatar_cb, tp_weak_ref_new (self, NULL, NULL));
+}
+
+static void
+avatar_chooser_constructed (GObject *object)
+{
+ EmpathyAvatarChooser *self = (EmpathyAvatarChooser *) object;
+
+ G_OBJECT_CLASS (empathy_avatar_chooser_parent_class)->constructed (object);
+
+ tp_account_get_avatar_async (self->priv->account,
+ get_avatar_cb, tp_weak_ref_new (self, NULL, NULL));
+
+ /* FIXME: no signal on TpAccount, yet.
+ * See https://bugs.freedesktop.org/show_bug.cgi?id=52938 */
+ tp_cli_account_interface_avatar_connect_to_avatar_changed (
+ self->priv->account, avatar_changed_cb, NULL, NULL, (GObject *) self,
+ NULL);
+}
+