[Telepathy-commits] [telepathy-gabble/master] tp_handle_set_to_array doesn't guarantee any order so we shouldn't rely on it when mapping buddies and their properties
Guillaume Desmottes
guillaume.desmottes at collabora.co.uk
Fri Sep 26 10:02:17 PDT 2008
20080604101259-7fe3f-33cd78d6beda7556feda60cf539a0da7cd24626d.gz
---
src/conn-olpc.c | 20 ++++++++++++++------
src/olpc-buddy-view.c | 22 +++++++++++-----------
src/olpc-buddy-view.h | 2 +-
tests/twisted/olpc/olpc-buddy-search.py | 21 ++++++++++++---------
4 files changed, 38 insertions(+), 27 deletions(-)
diff --git a/src/conn-olpc.c b/src/conn-olpc.c
index 566366f..f492c00 100644
--- a/src/conn-olpc.c
+++ b/src/conn-olpc.c
@@ -2935,13 +2935,14 @@ add_buddies_to_view_from_node (GabbleConnection *conn,
GabbleOlpcBuddyView *view,
LmMessageNode *node)
{
- TpHandleSet *buddies;
+ GArray *buddies;
TpHandleRepoIface *contact_repo = tp_base_connection_get_handles (
(TpBaseConnection*) conn, TP_HANDLE_TYPE_CONTACT);
LmMessageNode *buddy;
GPtrArray *buddies_properties;
+ guint i;
- buddies = tp_handle_set_new (contact_repo);
+ buddies = g_array_new (FALSE, FALSE, sizeof (TpHandle));
buddies_properties = g_ptr_array_new ();
for (buddy = node->children; buddy != NULL; buddy = buddy->next)
@@ -2961,12 +2962,16 @@ add_buddies_to_view_from_node (GabbleConnection *conn,
if (handle == 0)
{
DEBUG ("Invalid jid: %s", jid);
- tp_handle_set_destroy (buddies);
+
+ for (i = 0; i < buddies->len; i++)
+ tp_handle_unref (contact_repo, g_array_index (buddies, TpHandle,
+ i));
+
+ g_array_free (buddies, TRUE);
return FALSE;
}
- tp_handle_set_add (buddies, handle);
- tp_handle_unref (contact_repo, handle);
+ g_array_append_val (buddies, handle);
properties_node = lm_message_node_get_child_with_namespace (buddy,
"properties", NS_OLPC_BUDDY_PROPS);
@@ -2984,7 +2989,10 @@ add_buddies_to_view_from_node (GabbleConnection *conn,
/* FIXME: we should update properties when needed */
gabble_olpc_buddy_view_add_buddies (view, buddies, buddies_properties);
- tp_handle_set_destroy (buddies);
+ for (i = 0; i < buddies->len; i++)
+ tp_handle_unref (contact_repo, g_array_index (buddies, TpHandle, i));
+
+ g_array_free (buddies, TRUE);
g_ptr_array_foreach (buddies_properties, (GFunc) g_hash_table_unref, NULL);
g_ptr_array_free (buddies_properties, TRUE);
diff --git a/src/olpc-buddy-view.c b/src/olpc-buddy-view.c
index 556a09e..a99aabc 100644
--- a/src/olpc-buddy-view.c
+++ b/src/olpc-buddy-view.c
@@ -334,30 +334,26 @@ olpc_buddy_view_close (GabbleSvcOLPCBuddyView *iface,
void
gabble_olpc_buddy_view_add_buddies (GabbleOlpcBuddyView *self,
- TpHandleSet *buddies,
+ GArray *buddies,
GPtrArray *buddies_properties)
{
GabbleOlpcBuddyViewPrivate *priv = GABBLE_OLPC_BUDDY_VIEW_GET_PRIVATE (self);
TpIntSet *empty;
- GArray *buddies_array;
guint i;
+ TpIntSet *added;
empty = tp_intset_new ();
- buddies_array = tp_handle_set_to_array (buddies);
+ added = tp_intset_from_array (buddies);
- g_assert (buddies_array->len == buddies_properties->len);
-
- tp_group_mixin_change_members (G_OBJECT (self), "",
- tp_handle_set_peek (buddies), empty, empty, empty,
- 0, TP_CHANNEL_GROUP_CHANGE_REASON_NONE);
+ g_assert (buddies->len == buddies_properties->len);
/* store properties */
- for (i = 0; i < buddies_array->len; i++)
+ for (i = 0; i < buddies->len; i++)
{
TpHandle handle;
GHashTable *properties;
- handle = g_array_index (buddies_array, TpHandle, i);
+ handle = g_array_index (buddies, TpHandle, i);
properties = g_ptr_array_index (buddies_properties, i);
g_hash_table_insert (priv->buddy_properties, GUINT_TO_POINTER (handle),
@@ -365,8 +361,12 @@ gabble_olpc_buddy_view_add_buddies (GabbleOlpcBuddyView *self,
g_hash_table_ref (properties);
}
+ tp_group_mixin_change_members (G_OBJECT (self), "",
+ added, empty, empty, empty,
+ 0, TP_CHANNEL_GROUP_CHANGE_REASON_NONE);
+
tp_intset_destroy (empty);
- g_array_free (buddies_array, TRUE);
+ tp_intset_destroy (added);
}
static void
diff --git a/src/olpc-buddy-view.h b/src/olpc-buddy-view.h
index 51b1ea4..ee34317 100644
--- a/src/olpc-buddy-view.h
+++ b/src/olpc-buddy-view.h
@@ -69,7 +69,7 @@ GabbleOlpcBuddyView * gabble_olpc_buddy_view_new (GabbleConnection *conn,
guint id);
void gabble_olpc_buddy_view_add_buddies (GabbleOlpcBuddyView *self,
- TpHandleSet *handles, GPtrArray *buddies_properties);
+ GArray *handles, GPtrArray *buddies_properties);
void gabble_olpc_buddy_view_remove_buddies (GabbleOlpcBuddyView *self,
diff --git a/tests/twisted/olpc/olpc-buddy-search.py b/tests/twisted/olpc/olpc-buddy-search.py
index 7d5053d..4dadb5f 100644
--- a/tests/twisted/olpc/olpc-buddy-search.py
+++ b/tests/twisted/olpc/olpc-buddy-search.py
@@ -126,6 +126,13 @@ def test(q, bus, conn, stream):
reply['to'] = 'alice at localhost'
view = xpath.queryForNodes('/iq/view', reply)[0]
buddy = view.addElement((None, "buddy"))
+ buddy['jid'] = 'charles at localhost'
+ properties = buddy.addElement((NS_OLPC_BUDDY_PROPS, "properties"))
+ property = properties.addElement((None, "property"))
+ property['type'] = 'str'
+ property['name'] = 'color'
+ property.addContent('#AAAAAA,#BBBBBB')
+ buddy = view.addElement((None, "buddy"))
buddy['jid'] = 'bob at localhost'
properties = buddy.addElement((NS_OLPC_BUDDY_PROPS, "properties"))
property = properties.addElement((None, "property"))
@@ -139,15 +146,10 @@ def test(q, bus, conn, stream):
view0_iface = dbus.Interface(view0, 'org.laptop.Telepathy.BuddyView')
view0_group_iface = dbus.Interface(view0, 'org.freedesktop.Telepathy.Channel.Interface.Group')
- event = q.expect('dbus-signal', signal='PropertiesChanged')
- handle, props = event.args
- assert conn.InspectHandles(1, [handle])[0] == 'bob at localhost'
- assert props == {'color': '#005FE4,#00A0FF'}
-
event = q.expect('dbus-signal', signal='MembersChanged')
msg, added, removed, lp, rp, actor, reason = event.args
assert (removed, lp, rp) == ([], [], [])
- assert len(added) == 1
+ assert len(added) == 2
handle = added[0]
assert conn.InspectHandles(1, [handle])[0] == 'bob at localhost'
@@ -229,11 +231,12 @@ def test(q, bus, conn, stream):
assert (removed, lp, rp) == ([], [], [])
assert len(added) == 1
handle = added[0]
- assert conn.InspectHandles(1, [handle])[0] == 'oscar at localhost'
+ assert conn.InspectHandles(1, added)[0] == 'oscar at localhost'
members = view0_group_iface.GetMembers()
members = sorted(conn.InspectHandles(1, members))
- assert members == ['bob at localhost', 'oscar at localhost']
+ assert sorted(members) == ['bob at localhost', 'charles at localhost',
+ 'oscar at localhost']
# remove a buddy from view 0
message = domish.Element((None, 'message'))
@@ -260,7 +263,7 @@ def test(q, bus, conn, stream):
members = view0_group_iface.GetMembers()
members = sorted(conn.InspectHandles(1, members))
- assert members == ['oscar at localhost']
+ assert sorted(members) == ['charles at localhost', 'oscar at localhost']
# close view 0
call_async(q, view0_iface, 'Close')
--
1.5.6.5
More information about the Telepathy-commits
mailing list