[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