[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