]> git.0d.be Git - empathy.git/commitdiff
tp-contact-list: watch for list channels announced in NewChannels signals
authorGuillaume Desmottes <guillaume.desmottes@collabora.co.uk>
Wed, 24 Mar 2010 10:38:39 +0000 (11:38 +0100)
committerGuillaume Desmottes <guillaume.desmottes@collabora.co.uk>
Tue, 30 Mar 2010 10:09:44 +0000 (12:09 +0200)
If ensuring list channels fails (for example because the server is slow and the
D-Bus call timeouts before CM fetches the roster), we have a chance to get them
later. (#612949)

libempathy/empathy-tp-contact-list.c

index 1b8f116796e1545ab05fa5fa4a9bf20e08d6ebed..fd2cfaa3869a050246d39ee37f95edc775c6f9a6 100644 (file)
@@ -752,6 +752,47 @@ list_ensure_channel_cb (TpConnection *conn,
        g_object_unref (channel);
 }
 
+static void
+new_channels_cb (TpConnection *conn,
+                const GPtrArray *channels,
+                gpointer user_data,
+                GObject *weak_object)
+{
+       EmpathyTpContactList *list = EMPATHY_TP_CONTACT_LIST (weak_object);
+       guint i;
+
+       for (i = 0; i < channels->len ; i++) {
+               GValueArray *arr = g_ptr_array_index (channels, i);
+               const gchar *path;
+               GHashTable *properties;
+               const gchar *id;
+               TpChannel *channel;
+
+               path = g_value_get_boxed (g_value_array_get_nth (arr, 0));
+               properties = g_value_get_boxed (g_value_array_get_nth (arr, 1));
+
+               if (tp_strdiff (tp_asv_get_string (properties,
+                               TP_IFACE_CHANNEL ".ChannelType"),
+                   TP_IFACE_CHANNEL_TYPE_CONTACT_LIST))
+                       return;
+
+               if (tp_asv_get_uint32 (properties,
+                                      TP_IFACE_CHANNEL ".TargetHandleType", NULL)
+                   != TP_HANDLE_TYPE_LIST)
+                       return;
+
+               id = tp_asv_get_string (properties,
+                                       TP_IFACE_CHANNEL ".TargetID");
+               if (id == NULL)
+                       return;
+
+               channel = tp_channel_new_from_properties (conn, path,
+                                                         properties, NULL);
+               got_list_channel (list, channel);
+               g_object_unref (channel);
+       }
+}
+
 static void
 conn_ready_cb (TpConnection *connection,
               const GError *error,
@@ -771,6 +812,12 @@ conn_ready_cb (TpConnection *connection,
                TP_IFACE_CHANNEL ".TargetHandleType", G_TYPE_UINT, TP_HANDLE_TYPE_LIST,
                NULL);
 
+       /* Watch the NewChannels signal so if ensuring list channels fails (for
+        * example because the server is slow and the D-Bus call timeouts before CM
+        * fetches the roster), we have a chance to get them later. */
+       tp_cli_connection_interface_requests_connect_to_new_channels (
+               priv->connection, new_channels_cb, NULL, NULL, G_OBJECT (list), NULL);
+
        /* Request the 'stored' list. */
        tp_asv_set_static_string (request, TP_IFACE_CHANNEL ".TargetID", "stored");
        tp_cli_connection_interface_requests_call_ensure_channel (priv->connection,