[Telepathy-commits] [telepathy-gabble/master] Emit ContactCapabilitiesChanged, and update twisted test. The signal is still empty (to be done)

Alban Crequy alban.crequy at collabora.co.uk
Fri Dec 5 09:42:34 PST 2008


---
 src/connection.c                 |   44 ++++++++++++++++++++++++++++++++++---
 src/presence-cache.c             |   42 ++++++++++++++++++++++++++---------
 tests/twisted/test-caps-tubes.py |   19 ++++++----------
 3 files changed, 78 insertions(+), 27 deletions(-)

diff --git a/src/connection.c b/src/connection.c
index d5bbec6..be60f82 100644
--- a/src/connection.c
+++ b/src/connection.c
@@ -187,7 +187,7 @@ struct _GabbleConnectionPrivate
 
 static void connection_capabilities_update_cb (GabblePresenceCache *,
     TpHandle, GabblePresenceCapabilities, GabblePresenceCapabilities,
-    gpointer);
+    GHashTable *, GHashTable *, gpointer);
 
 static GPtrArray *
 _gabble_connection_create_channel_factories (TpBaseConnection *conn)
@@ -2130,15 +2130,52 @@ _emit_capabilities_changed (GabbleConnection *conn,
 }
 
 static void
+_emit_contact_capabilities_changed (GabbleConnection *conn,
+                                    TpHandle handle,
+                                    GHashTable *old_caps,
+                                    GHashTable *new_caps)
+{
+  GValueArray *arr = g_value_array_new (2);
+  GPtrArray *old_array;
+  GPtrArray *new_array;
+  GValue old = {0, };
+  GValue new = {0, };
+
+  DEBUG ("Called.");
+
+  old_array = g_ptr_array_new ();
+  new_array = g_ptr_array_new ();
+
+  g_value_init (&old, GABBLE_ARRAY_TYPE_ENHANCED_CONTACT_CAPABILITY_LIST);
+  g_value_init (&new, GABBLE_ARRAY_TYPE_ENHANCED_CONTACT_CAPABILITY_LIST);
+
+  g_value_set_boxed (&old, old_array);
+  g_value_set_boxed (&new, new_array);
+
+  g_value_array_append (arr, &old);
+  g_value_array_append (arr, &new);
+
+  gabble_svc_connection_interface_contact_capabilities_emit_contact_capabilities_changed (
+      conn, arr);
+}
+
+static void
 connection_capabilities_update_cb (GabblePresenceCache *cache,
                                    TpHandle handle,
                                    GabblePresenceCapabilities old_caps,
                                    GabblePresenceCapabilities new_caps,
+                                   GHashTable *old_enhenced_caps,
+                                   GHashTable *new_enhenced_caps,
                                    gpointer user_data)
 {
   GabbleConnection *conn = GABBLE_CONNECTION (user_data);
 
-  _emit_capabilities_changed (conn, handle, old_caps, new_caps);
+  if (old_caps != new_caps)
+    _emit_capabilities_changed (conn, handle, old_caps, new_caps);
+
+  if (old_enhenced_caps != NULL || new_enhenced_caps != NULL)
+    _emit_contact_capabilities_changed (conn, handle,
+                                        old_enhenced_caps, new_enhenced_caps);
 }
 
 /**
@@ -2248,8 +2285,7 @@ gabble_connection_advertise_capabilities (TpSvcConnectionInterfaceCapabilities *
           return;
         }
 
-      _emit_capabilities_changed (self, base->self_handle,
-          save_caps, caps);
+      _emit_capabilities_changed (self, base->self_handle, save_caps, caps);
     }
 
   tp_svc_connection_interface_capabilities_return_from_advertise_capabilities (
diff --git a/src/presence-cache.c b/src/presence-cache.c
index 978e9c1..ab1b252 100644
--- a/src/presence-cache.c
+++ b/src/presence-cache.c
@@ -327,8 +327,8 @@ gabble_presence_cache_class_init (GabblePresenceCacheClass *klass)
     G_SIGNAL_RUN_LAST,
     0,
     NULL, NULL,
-    gabble_marshal_VOID__UINT_UINT_UINT, G_TYPE_NONE,
-    3, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT);
+    gabble_marshal_VOID__UINT_UINT_UINT_POINTER_POINTER, G_TYPE_NONE,
+    5, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_POINTER, G_TYPE_POINTER);
   signals[AVATAR_UPDATE] = g_signal_new (
     "avatar-update",
     G_TYPE_FROM_CLASS (klass),
@@ -718,8 +718,12 @@ void
 gabble_presence_cache_free_specific_cache (
     GHashTable *per_channel_factory_caps)
 {
+  if (per_channel_factory_caps == NULL)
+    return;
+
   g_hash_table_foreach (per_channel_factory_caps, free_specific_caps_helper,
       NULL);
+  g_hash_table_destroy (per_channel_factory_caps);
 }
 
 static void
@@ -994,6 +998,10 @@ _caps_disco_cb (GabbleDisco *disco,
               if (presence)
               {
                 GabblePresenceCapabilities save_caps = presence->caps;
+                GHashTable *save_enhenced_caps =
+                    presence->per_channel_factory_caps;
+                presence->per_channel_factory_caps = NULL;
+
                 DEBUG ("setting caps for %d (thanks to %d %s) to "
                     "%d (save_caps %d)",
                     waiter->handle, handle, jid, caps, save_caps);
@@ -1002,7 +1010,9 @@ _caps_disco_cb (GabbleDisco *disco,
                 DEBUG ("caps for %d (thanks to %d %s) now %d", waiter->handle,
                     handle, jid, presence->caps);
                 g_signal_emit (cache, signals[CAPABILITIES_UPDATE], 0,
-                  waiter->handle, save_caps, presence->caps);
+                  waiter->handle, save_caps, presence->caps,
+                  save_enhenced_caps, presence->per_channel_factory_caps);
+                gabble_presence_cache_free_specific_cache (save_enhenced_caps);
               }
             }
 
@@ -1165,6 +1175,7 @@ _process_caps (GabblePresenceCache *cache,
   GSList *uris, *i;
   GabblePresenceCachePrivate *priv;
   GabblePresenceCapabilities old_caps = 0;
+  GHashTable *old_enhenced_caps;
   guint serial;
   const gchar *hash, *ver;
 
@@ -1178,7 +1189,11 @@ _process_caps (GabblePresenceCache *cache,
   uris = _parse_cap_bundles (lm_node, &hash, &ver);
 
   if (presence)
+    {
       old_caps = presence->caps;
+      old_enhenced_caps = presence->per_channel_factory_caps;
+      presence->per_channel_factory_caps = NULL;
+    }
 
   for (i = uris; NULL != i; i = i->next)
     {
@@ -1188,17 +1203,15 @@ _process_caps (GabblePresenceCache *cache,
 
     }
 
-  if (presence && (old_caps != presence->caps))
+  if (presence)
     {
       DEBUG ("Emitting caps update: handle %u, old %u, new %u",
           handle, old_caps, presence->caps);
 
       g_signal_emit (cache, signals[CAPABILITIES_UPDATE], 0,
-          handle, old_caps, presence->caps);
-    }
-  else if (!presence)
-    {
-      DEBUG ("No presence, not updating caps for %u", handle);
+          handle, old_caps, presence->caps, old_enhenced_caps,
+          presence->per_channel_factory_caps);
+      gabble_presence_cache_free_specific_cache (old_enhenced_caps);
     }
   else
     {
@@ -1470,6 +1483,7 @@ gabble_presence_cache_do_update (
   const gchar *jid;
   GabblePresence *presence;
   GabblePresenceCapabilities caps_before;
+  GHashTable *enhenced_caps_before;
   gboolean ret = FALSE;
 
   jid = tp_handle_inspect (contact_repo, handle);
@@ -1482,13 +1496,19 @@ gabble_presence_cache_do_update (
     presence = _cache_insert (cache, handle);
 
   caps_before = presence->caps;
+  enhenced_caps_before = presence->per_channel_factory_caps;
+  presence->per_channel_factory_caps = NULL;
 
   ret = gabble_presence_update (presence, resource, presence_id,
       status_message, priority);
 
   if (caps_before != presence->caps)
-    g_signal_emit (cache, signals[CAPABILITIES_UPDATE], 0, handle,
-        caps_before, presence->caps);
+    {
+      g_signal_emit (cache, signals[CAPABILITIES_UPDATE], 0, handle,
+          caps_before, presence->caps, enhenced_caps_before,
+          presence->per_channel_factory_caps);
+      gabble_presence_cache_free_specific_cache (enhenced_caps_before);
+    }
 
   return ret;
 }
diff --git a/tests/twisted/test-caps-tubes.py b/tests/twisted/test-caps-tubes.py
index 9334225..899b2af 100644
--- a/tests/twisted/test-caps-tubes.py
+++ b/tests/twisted/test-caps-tubes.py
@@ -140,9 +140,9 @@ def _test_tube_caps(q, bus, conn, stream, contact, contact_handle, client):
     feature = query.addElement('feature')
     feature['var'] = 'http://www.google.com/transport/p2p'
     stream.send(result)
-    sync_stream(q, stream)
 
-    #event = q.expect('dbus-signal', signal='CapabilitiesChanged')
+    event = q.expect('dbus-signal', signal='ContactCapabilitiesChanged')
+    print str(event.args)
 
     # no special capabilities
     basic_caps = [(contact_handle, text_fixed_properties,
@@ -177,9 +177,8 @@ def _test_tube_caps(q, bus, conn, stream, contact, contact_handle, client):
     feature = query.addElement('feature')
     feature['var'] = ns_tubes + '/stream/daap'
     stream.send(result)
-    sync_stream(q, stream)
 
-    #event = q.expect('dbus-signal', signal='CapabilitiesChanged')
+    event = q.expect('dbus-signal', signal='ContactCapabilitiesChanged')
 
     # daap capabilities
     daap_caps = [
@@ -215,9 +214,8 @@ def _test_tube_caps(q, bus, conn, stream, contact, contact_handle, client):
     feature = query.addElement('feature')
     feature['var'] = ns_tubes + '/dbus/com.example.Xiangqi'
     stream.send(result)
-    sync_stream(q, stream)
 
-    #event = q.expect('dbus-signal', signal='CapabilitiesChanged')
+    event = q.expect('dbus-signal', signal='ContactCapabilitiesChanged')
 
     # xiangqi capabilities
     xiangqi_caps = [
@@ -255,9 +253,8 @@ def _test_tube_caps(q, bus, conn, stream, contact, contact_handle, client):
     feature = query.addElement('feature')
     feature['var'] = ns_tubes + '/stream/daap'
     stream.send(result)
-    sync_stream(q, stream)
 
-    #event = q.expect('dbus-signal', signal='CapabilitiesChanged')
+    event = q.expect('dbus-signal', signal='ContactCapabilitiesChanged')
 
     # daap + xiangqi capabilities
     daap_xiangqi_caps = [
@@ -300,9 +297,8 @@ def _test_tube_caps(q, bus, conn, stream, contact, contact_handle, client):
     feature = query.addElement('feature')
     feature['var'] = ns_tubes + '/stream/http'
     stream.send(result)
-    sync_stream(q, stream)
 
-    #event = q.expect('dbus-signal', signal='CapabilitiesChanged')
+    event = q.expect('dbus-signal', signal='ContactCapabilitiesChanged')
 
     # http + daap + xiangqi + go capabilities
     all_tubes_caps = [
@@ -329,9 +325,8 @@ def _test_tube_caps(q, bus, conn, stream, contact, contact_handle, client):
     stream.send(presence)
 
     # Gabble does not look up our capabilities because of the cache
-    sync_stream(q, stream)
 
-    #event = q.expect('dbus-signal', signal='CapabilitiesChanged')
+    event = q.expect('dbus-signal', signal='ContactCapabilitiesChanged')
 
     # daap + xiangqi capabilities
     daap_xiangqi_caps = [
-- 
1.5.6.5




More information about the Telepathy-commits mailing list