summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVivek Dasmohapatra <vivek@collabora.co.uk>2010-07-27 20:01:35 +0100
committerVivek Dasmohapatra <vivek@collabora.co.uk>2010-07-29 17:23:58 +0100
commit929dc974509a172d9a0ad6c3bd9931171e75ba9d (patch)
tree13b53d933bb64637e4732045d913faca128cb852
parentced3e32094b11970653227e78dbe7c3bd8515c8f (diff)
downloadtelepathy-mission-control-929dc974509a172d9a0ad6c3bd9931171e75ba9d.tar.gz
Can't use the AvatarRetrieved signal to find out if an avatar has been removed
The signal only fired for those contacts that had an avatar, so if the connection signals that the avatar has been updated, and we then try to fetch the avatar via this signal, we simply never receive any data and the avatar we have never gets erased.
-rw-r--r--src/mcd-connection.c69
1 files changed, 59 insertions, 10 deletions
diff --git a/src/mcd-connection.c b/src/mcd-connection.c
index 327c2d88..44294606 100644
--- a/src/mcd-connection.c
+++ b/src/mcd-connection.c
@@ -674,6 +674,7 @@ avatars_clear_avatar_cb (TpConnection *proxy, const GError *error,
}
}
+/* this signal handler only deals with our own avatar updates */
static void
on_avatar_retrieved (TpConnection *proxy, guint contact_id, const gchar *token,
const GArray *avatar, const gchar *mime_type,
@@ -710,6 +711,54 @@ avatars_request_avatars_cb (TpConnection *proxy, const GError *error,
}
static void
+avatars_known_token_cb (TpConnection *proxy, GHashTable *tokens,
+ const GError *error, gpointer user_data,
+ GObject *weak_object)
+{
+ McdConnection *connection = MCD_CONNECTION (weak_object);
+ McdConnectionPrivate *priv = connection->priv;
+ const gchar *token;
+ TpHandle self_handle = tp_connection_get_self_handle (proxy);
+ gpointer handle = user_data;
+
+ if (error)
+ {
+ g_warning ("%s: error: %s", G_STRFUNC, error->message);
+ return;
+ }
+
+ if (handle != GUINT_TO_POINTER (self_handle))
+ return;
+
+ token = g_hash_table_lookup (tokens, handle);
+
+ /* we have a token and it is not the empty string (ie no avatar) */
+ if (token != NULL && *token != '\0')
+ {
+ GArray handles = { (gchar *) &handle, 1 };
+
+ /* if we have an avatar, set off the request to fetch it: this will *
+ get picked up as we connect to the retrieved signal elsewhere */
+ tp_cli_connection_interface_avatars_call_request_avatars (priv->tp_conn,
+ -1,
+ &handles,
+ avatars_request_avatars_cb,
+ NULL,
+ NULL,
+ weak_object);
+ }
+ else
+ { /* no avatar => will never get a retrieved signal - remove manually */
+ GError *avatar_error = NULL;
+ McdAccount *account = mcd_connection_get_account (connection);
+
+ if (!_mcd_account_set_avatar (account, NULL, "", "", &avatar_error))
+ DEBUG ("Attempt to clear avatar failed: %s", avatar_error->message);
+ }
+}
+
+/* this signal handler only deals with our own avatar updates */
+static void
on_avatar_updated (TpConnection *proxy, guint contact_id, const gchar *token,
gpointer user_data, GObject *weak_object)
{
@@ -727,16 +776,16 @@ on_avatar_updated (TpConnection *proxy, guint contact_id, const gchar *token,
if (!prev_token || strcmp (token, prev_token) != 0)
{
- GArray handles;
- DEBUG ("avatar has changed");
- /* the avatar has changed, let's retrieve the new one */
- handles.len = 1;
- handles.data = (gchar *)&contact_id;
- tp_cli_connection_interface_avatars_call_request_avatars (priv->tp_conn, -1,
- &handles,
- avatars_request_avatars_cb,
- priv, NULL,
- (GObject *)connection);
+ GArray handles = { (gchar *) &contact_id, 1 };
+
+ DEBUG ("avatar has changed or been erased");
+ tp_cli_connection_interface_avatars_call_get_known_avatar_tokens (priv->tp_conn,
+ -1,
+ &handles,
+ avatars_known_token_cb,
+ GUINT_TO_POINTER (contact_id),
+ NULL,
+ (GObject *)connection);
}
g_free (prev_token);
}