[Telepathy-commits] [telepathy-gabble/master] Roster: include request token with new-channels if the roster has already been received

Will Thompson will.thompson at collabora.co.uk
Thu Sep 18 11:07:16 PDT 2008


This fixes the bug exposed by
tests/twisted/roster/request-never-answered-2.py
---
 src/roster.c |   42 ++++++++++++++++++++++++++++--------------
 1 files changed, 28 insertions(+), 14 deletions(-)

diff --git a/src/roster.c b/src/roster.c
index 1af224f..af442ca 100644
--- a/src/roster.c
+++ b/src/roster.c
@@ -509,7 +509,10 @@ _gabble_roster_item_remove (GabbleRoster *roster,
 
 /* the TpHandleType must be GROUP or LIST */
 static GabbleRosterChannel *_gabble_roster_get_channel (GabbleRoster *,
-    TpHandleType, TpHandle, gboolean *created);
+    TpHandleType, TpHandle, gboolean *created, gpointer request_token);
+
+static void gabble_roster_associate_request (GabbleRoster *self,
+    GabbleRosterChannel *channel, gpointer request);
 
 typedef struct
 {
@@ -851,6 +854,7 @@ gabble_roster_emit_new_channel (GabbleRoster *self,
   requests_satisfied = g_hash_table_lookup (priv->queued_requests, channel);
   g_hash_table_steal (priv->queued_requests, channel);
   requests_satisfied = g_slist_reverse (requests_satisfied);
+
   tp_channel_manager_emit_new_channel (self,
       TP_EXPORTABLE_CHANNEL (channel), requests_satisfied);
   g_slist_free (requests_satisfied);
@@ -894,7 +898,8 @@ roster_channel_closed_cb (GabbleRosterChannel *channel,
 static GabbleRosterChannel *
 _gabble_roster_create_channel (GabbleRoster *roster,
                                guint handle_type,
-                               TpHandle handle)
+                               TpHandle handle,
+                               gpointer request_token)
 {
   GabbleRosterPrivate *priv = GABBLE_ROSTER_GET_PRIVATE (roster);
   TpBaseConnection *conn = (TpBaseConnection *) priv->conn;
@@ -944,10 +949,17 @@ _gabble_roster_create_channel (GabbleRoster *roster,
       DEBUG ("roster already received, emitting signal for %s",
              object_path);
 
+      if (request_token != NULL)
+        gabble_roster_associate_request (roster, chan, request_token);
+
       gabble_roster_emit_new_channel (roster, chan);
     }
   else
     {
+      /* Not associating the request with the channel; gabble_roster_request
+       * does that for all requests except (channel newly created && roster
+       * already recieved).
+       */
       DEBUG ("roster not yet received, not emitting signal for %s list "
           "channel", name);
     }
@@ -960,7 +972,8 @@ static GabbleRosterChannel *
 _gabble_roster_get_channel (GabbleRoster *roster,
                             guint handle_type,
                             TpHandle handle,
-                            gboolean *created)
+                            gboolean *created,
+                            gpointer request_token)
 {
   GabbleRosterPrivate *priv = GABBLE_ROSTER_GET_PRIVATE (roster);
   TpHandleRepoIface *handle_repo = tp_base_connection_get_handles (
@@ -984,7 +997,8 @@ _gabble_roster_get_channel (GabbleRoster *roster,
     {
       if (created)
         *created = TRUE;
-      chan = _gabble_roster_create_channel (roster, handle_type, handle);
+      chan = _gabble_roster_create_channel (roster, handle_type, handle,
+          request_token);
     }
   else
     {
@@ -1067,7 +1081,7 @@ _update_group (gpointer key,
   GabbleRoster *roster = GABBLE_ROSTER (user_data);
   GroupMembershipUpdate *update = value;
   GabbleRosterChannel *group_channel = _gabble_roster_get_channel (
-      roster, TP_HANDLE_TYPE_GROUP, group_handle, NULL);
+      roster, TP_HANDLE_TYPE_GROUP, group_handle, NULL, NULL);
   TpIntSet *empty = tp_intset_new ();
 
 #ifdef ENABLE_DEBUG
@@ -1194,9 +1208,9 @@ gabble_roster_iq_cb (LmMessageHandler *handler,
 
       /* we need these for preserving "fragile" local/remote pending states */
       pub_chan = _gabble_roster_get_channel (roster, TP_HANDLE_TYPE_LIST,
-          GABBLE_LIST_HANDLE_PUBLISH, NULL);
+          GABBLE_LIST_HANDLE_PUBLISH, NULL, NULL);
       sub_chan = _gabble_roster_get_channel (roster, TP_HANDLE_TYPE_LIST,
-          GABBLE_LIST_HANDLE_SUBSCRIBE, NULL);
+          GABBLE_LIST_HANDLE_SUBSCRIBE, NULL, NULL);
 
       /* iterate every sub-node, which we expect to be <item>s */
       for (item_node = query_node->children;
@@ -1379,7 +1393,7 @@ gabble_roster_iq_cb (LmMessageHandler *handler,
 
       handle = GABBLE_LIST_HANDLE_KNOWN;
       chan = _gabble_roster_get_channel (roster, TP_HANDLE_TYPE_LIST, handle,
-          NULL);
+          NULL, NULL);
 
       DEBUG ("calling change members on known channel");
       tp_group_mixin_change_members ((GObject *) chan,
@@ -1392,7 +1406,7 @@ gabble_roster_iq_cb (LmMessageHandler *handler,
         {
           handle = GABBLE_LIST_HANDLE_DENY;
           chan = _gabble_roster_get_channel (roster, TP_HANDLE_TYPE_LIST,
-              handle, NULL);
+              handle, NULL, NULL);
 
           DEBUG ("calling change members on deny channel");
           tp_group_mixin_change_members ((GObject *) chan,
@@ -1564,7 +1578,7 @@ gabble_roster_presence_cb (LmMessageHandler *handler,
 
       list_handle = GABBLE_LIST_HANDLE_PUBLISH;
       chan = _gabble_roster_get_channel (roster, TP_HANDLE_TYPE_LIST,
-          list_handle, NULL);
+          list_handle, NULL, NULL);
       tp_group_mixin_change_members ((GObject *) chan, status_message,
           NULL, NULL, tmp, NULL, 0, 0);
 
@@ -1581,7 +1595,7 @@ gabble_roster_presence_cb (LmMessageHandler *handler,
 
       list_handle = GABBLE_LIST_HANDLE_PUBLISH;
       chan = _gabble_roster_get_channel (roster, TP_HANDLE_TYPE_LIST,
-          list_handle, NULL);
+          list_handle, NULL, NULL);
       changed = tp_group_mixin_change_members ((GObject *) chan,
           status_message, NULL, tmp, NULL, NULL, 0, 0);
 
@@ -1600,7 +1614,7 @@ gabble_roster_presence_cb (LmMessageHandler *handler,
 
       list_handle = GABBLE_LIST_HANDLE_SUBSCRIBE;
       chan = _gabble_roster_get_channel (roster, TP_HANDLE_TYPE_LIST,
-          list_handle, NULL);
+          list_handle, NULL, NULL);
       changed = tp_group_mixin_change_members ((GObject *) chan,
           status_message, tmp, NULL, NULL, NULL, 0, 0);
 
@@ -1619,7 +1633,7 @@ gabble_roster_presence_cb (LmMessageHandler *handler,
 
       list_handle = GABBLE_LIST_HANDLE_SUBSCRIBE;
       chan = _gabble_roster_get_channel (roster, TP_HANDLE_TYPE_LIST,
-          list_handle, NULL);
+          list_handle, NULL, NULL);
       changed = tp_group_mixin_change_members ((GObject *) chan,
           status_message, NULL, tmp, NULL, NULL, 0, 0);
 
@@ -2581,7 +2595,7 @@ gabble_roster_request (GabbleRoster *self,
     }
 
   channel = _gabble_roster_get_channel (self, handle_type, handle,
-      &created);
+      &created, request_token);
 
   if (require_new && !created)
     {
-- 
1.5.6.5




More information about the Telepathy-commits mailing list