diff options
author | Jonny Lamb <jonny.lamb@collabora.co.uk> | 2011-04-19 10:46:25 +0100 |
---|---|---|
committer | Jonny Lamb <jonny.lamb@collabora.co.uk> | 2011-04-19 10:46:25 +0100 |
commit | cd6a1056f97210ff62ad0dd186934afbc1ce5a52 (patch) | |
tree | 13c4c6832965b456621b79b62756a339eeef7730 | |
parent | 75f46887349f3391bf027e648e632fad24820c22 (diff) |
status: implement DiscoveredStatuses
Signed-off-by: Jonny Lamb <jonny.lamb@collabora.co.uk>
-rw-r--r-- | salut/status.c | 59 | ||||
-rw-r--r-- | salut/utils.h | 1 | ||||
-rw-r--r-- | tests/twisted/salut/status.py | 32 |
3 files changed, 84 insertions, 8 deletions
diff --git a/salut/status.c b/salut/status.c index cf2f178..7ecc0aa 100644 --- a/salut/status.c +++ b/salut/status.c @@ -154,6 +154,52 @@ ytst_status_set_property (GObject *object, } } +static void +update_contact_status (YtstStatus *self, + const gchar *from, + const gchar *capability, + const gchar *service_name, + const gchar *status_str) +{ + YtstStatusPrivate *priv = self->priv; + const gchar *old_status; + + GHashTable *capability_service_map; + GHashTable *service_status_map; + + capability_service_map = g_hash_table_lookup (priv->discovered_statuses, from); + + if (capability_service_map == NULL) + { + capability_service_map = g_hash_table_new_full (g_str_hash, g_str_equal, + g_free, (GDestroyNotify) g_hash_table_unref); + g_hash_table_insert (priv->discovered_statuses, g_strdup (from), + capability_service_map); + } + + service_status_map = g_hash_table_lookup (capability_service_map, + capability); + + if (service_status_map == NULL) + { + service_status_map = g_hash_table_new_full (g_str_hash, g_str_equal, + g_free, g_free); + g_hash_table_insert (capability_service_map, + g_strdup (capability), service_status_map); + } + + old_status = g_hash_table_lookup (service_status_map, service_name); + + if (tp_strdiff (old_status, status_str)) + { + tp_yts_svc_status_emit_status_changed (self, from, capability, + service_name, status_str); + } + + g_hash_table_insert (service_status_map, g_strdup (service_name), + g_strdup (status_str)); +} + static gchar * get_node_body (WockyNode *node) { @@ -180,7 +226,7 @@ pep_event_cb (WockyPorter *porter, { YtstStatus *self = user_data; WockyNode *message, *event, *items, *item, *status; - gchar *status_str; + gchar *status_str = NULL; const gchar *from, *capability, *service_name; message = wocky_stanza_get_top_node (stanza); @@ -211,10 +257,10 @@ pep_event_cb (WockyPorter *porter, capability = wocky_node_get_ns (items) + strlen (CAPS_FEATURE_PREFIX); service_name = wocky_node_get_attribute (status, "from-service"); - status_str = get_node_body (status); + if (wocky_node_get_attribute (status, "activity") != NULL) + status_str = get_node_body (status); - tp_yts_svc_status_emit_status_changed (self, from, capability, - service_name, status_str); + update_contact_status (self, from, capability, service_name, status_str); g_free (status_str); @@ -250,6 +296,8 @@ ytst_status_dispose (GObject *object) YtstStatusPrivate *priv = self->priv; WockyPorter *porter; + g_print ("dispose called\n"); + if (priv->dispose_has_run) return; @@ -413,8 +461,7 @@ ytst_status_advertise_status (TpYtsSvcStatus *svc, } else { - status_tree = wocky_node_tree_new ("status", "urn:ytstenut:status", - NULL); + status_tree = wocky_node_tree_new ("status", YTST_STATUS_NS, NULL); } status_node = wocky_node_tree_get_top_node (status_tree); diff --git a/salut/utils.h b/salut/utils.h index 3590e2d..2423e6d 100644 --- a/salut/utils.h +++ b/salut/utils.h @@ -27,6 +27,7 @@ G_BEGIN_DECLS #define YTST_MESSAGE_NS "urn:ytstenut:message" +#define YTST_STATUS_NS "urn:ytstenut:status" GQuark ytst_message_error_quark (void); #define YTST_MESSAGE_ERROR (ytst_message_error_quark ()) diff --git a/tests/twisted/salut/status.py b/tests/twisted/salut/status.py index c8046b2..84170e3 100644 --- a/tests/twisted/salut/status.py +++ b/tests/twisted/salut/status.py @@ -17,6 +17,8 @@ # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA # 02110-1301 USA +import dbus + from salutservicetest import call_async, EventPattern, assertEquals, \ ProxyWrapper, assertNotEquals from saluttest import exec_test, wait_for_contact_in_publish, make_result_iq @@ -98,6 +100,10 @@ def test(q, bus, conn): # okay now we know about the contact's caps, we can go ahead + discovered = status.Get(ycs.STATUS_IFACE, 'DiscoveredStatuses', + dbus_interface=dbus.PROPERTIES_IFACE) + assertEquals({}, discovered) + el = Element(('urn:ytstenut:status', 'status')) el['activity'] = 'messing-with-your-stuff' desc = el.addElement('ytstenut:description', content='Yeah sorry about that') @@ -108,7 +114,8 @@ def test(q, bus, conn): e, _, sig = q.expect_many(EventPattern('stream-message', connection=incoming), EventPattern('dbus-return', method='AdvertiseStatus'), - EventPattern('dbus-signal', signal='StatusChanged')) + EventPattern('dbus-signal', signal='StatusChanged', + interface=ycs.STATUS_IFACE)) # check message message = e.stanza @@ -128,13 +135,22 @@ def test(q, bus, conn): assertEquals('ants.in.their.pants', service_name) assertNotEquals('', status_str) + # check property + discovered = status.Get(ycs.STATUS_IFACE, 'DiscoveredStatuses', + dbus_interface=dbus.PROPERTIES_IFACE) + assertEquals({'testsuite@testsuite': {CAP_NAME: {'ants.in.their.pants': status_str}}}, + discovered) + + # unset the status call_async(q, status, 'AdvertiseStatus', CAP_NAME, 'ants.in.their.pants', '') e, _, sig = q.expect_many(EventPattern('stream-message', connection=incoming), EventPattern('dbus-return', method='AdvertiseStatus'), - EventPattern('dbus-signal', signal='StatusChanged')) + EventPattern('dbus-signal', signal='StatusChanged', + interface=ycs.STATUS_IFACE)) + # check message message = e.stanza event = message.children[0] items = event.children[0] @@ -147,5 +163,17 @@ def test(q, bus, conn): assert 'activity' not in status_el.attributes assertEquals([], status_el.children) + # check signal + contact_id, capability, service_name, status_str = sig.args + assertEquals(CAP_NAME, capability) + assertEquals('ants.in.their.pants', service_name) + assertEquals('', status_str) + + # check property + discovered = status.Get(ycs.STATUS_IFACE, 'DiscoveredStatuses', + dbus_interface=dbus.PROPERTIES_IFACE) + assertEquals({'testsuite@testsuite': {CAP_NAME: {'ants.in.their.pants': ''}}}, + discovered) + if __name__ == '__main__': exec_test(test) |