summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonny Lamb <jonny.lamb@collabora.co.uk>2011-04-19 10:46:25 +0100
committerJonny Lamb <jonny.lamb@collabora.co.uk>2011-04-19 10:46:25 +0100
commitcd6a1056f97210ff62ad0dd186934afbc1ce5a52 (patch)
tree13c4c6832965b456621b79b62756a339eeef7730
parent75f46887349f3391bf027e648e632fad24820c22 (diff)
status: implement DiscoveredStatuses
Signed-off-by: Jonny Lamb <jonny.lamb@collabora.co.uk>
-rw-r--r--salut/status.c59
-rw-r--r--salut/utils.h1
-rw-r--r--tests/twisted/salut/status.py32
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)