[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