summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGuillaume Desmottes <guillaume.desmottes@collabora.co.uk>2013-09-17 15:23:05 +0200
committerGuillaume Desmottes <guillaume.desmottes@collabora.co.uk>2013-09-18 12:16:34 +0200
commitcc57a8a5138386ba7658d46dd7f0b46e2533c7c1 (patch)
treeaa47cb288479d04382378937014f55c590276784
parentc4f0fadc905734ac1a3a0cef62eb7352f26360fe (diff)
downloadtelepathy-haze-cc57a8a5138386ba7658d46dd7f0b46e2533c7c1.tar.gz
protocol: fix 'ConnectionInterfaces'
Return the set of interfaces actually supported for this specific protocol rather than claiming to support everything. https://bugs.freedesktop.org/show_bug.cgi?id=69466
-rw-r--r--src/connection.c23
-rw-r--r--src/connection.h4
-rw-r--r--src/protocol.c19
-rw-r--r--tests/twisted/cm/protocols.py8
4 files changed, 45 insertions, 9 deletions
diff --git a/src/connection.c b/src/connection.c
index e7f1994..8e1c0fc 100644
--- a/src/connection.c
+++ b/src/connection.c
@@ -107,12 +107,6 @@ static const gchar * implemented_interfaces[] = {
NULL
};
-const gchar **
-haze_connection_get_implemented_interfaces (void)
-{
- return implemented_interfaces;
-}
-
static void
add_always_present_connection_interfaces (GPtrArray *interfaces)
{
@@ -136,6 +130,23 @@ haze_connection_get_interfaces_always_present (TpBaseConnection *base)
return interfaces;
}
+static void add_optional_connection_interfaces (GPtrArray *ifaces,
+ PurplePluginProtocolInfo *prpl_info);
+
+/* Returns a (transfer container) not NULL terminated of (const gchar *)
+ * interface names. */
+GPtrArray *
+haze_connection_dup_implemented_interfaces (PurplePluginProtocolInfo *prpl_info)
+{
+ GPtrArray *ifaces;
+
+ ifaces = g_ptr_array_new ();
+ add_always_present_connection_interfaces (ifaces);
+ add_optional_connection_interfaces (ifaces, prpl_info);
+
+ return ifaces;
+}
+
struct _HazeConnectionPrivate
{
gchar *username;
diff --git a/src/connection.h b/src/connection.h
index 1677bf1..0eef922 100644
--- a/src/connection.h
+++ b/src/connection.h
@@ -98,7 +98,9 @@ GType haze_connection_get_type (void);
const gchar *haze_get_fallback_group (void);
-const gchar **haze_connection_get_implemented_interfaces (void);
+GPtrArray * haze_connection_dup_implemented_interfaces (
+ PurplePluginProtocolInfo *prpl_info);
+
const gchar **haze_connection_get_guaranteed_interfaces (void);
void haze_connection_request_password (PurpleAccount *account,
diff --git a/src/protocol.c b/src/protocol.c
index df56071..e0a7b46 100644
--- a/src/protocol.c
+++ b/src/protocol.c
@@ -905,8 +905,23 @@ haze_protocol_get_connection_details (TpBaseProtocol *base,
if (connection_interfaces != NULL)
{
- *connection_interfaces = g_strdupv (
- (gchar **) haze_connection_get_implemented_interfaces ());
+ GPtrArray *tmp, *ifaces;
+ guint i;
+
+ tmp = haze_connection_dup_implemented_interfaces (
+ self->priv->prpl_info);
+
+ /* @connection_interfaces takes a NULL terminated (transfer full)
+ * gchar ** so we have to dup each string and append NULL. */
+ ifaces = g_ptr_array_new ();
+
+ for (i = 0; i < tmp->len; i++)
+ g_ptr_array_add (ifaces, g_strdup (g_ptr_array_index (tmp, i)));
+
+ g_ptr_array_add (ifaces, NULL);
+
+ *connection_interfaces = (gchar **) g_ptr_array_free (ifaces, FALSE);
+ g_ptr_array_unref (tmp);
}
if (channel_manager_types != NULL)
diff --git a/tests/twisted/cm/protocols.py b/tests/twisted/cm/protocols.py
index 4dc3f19..d296710 100644
--- a/tests/twisted/cm/protocols.py
+++ b/tests/twisted/cm/protocols.py
@@ -94,6 +94,10 @@ def test(q, bus, conn, stream):
protocol_iface.IdentifyAccount({
'account': 'smcv',
'server': 'irc.debian.org'}))
+
+ assertDoesNotContain(cs.CONN_IFACE_AVATARS, flat_props['ConnectionInterfaces'])
+ assertDoesNotContain(cs.CONN_IFACE_CONTACT_BLOCKING, flat_props['ConnectionInterfaces'])
+ assertDoesNotContain(cs.CONN_IFACE_MAIL_NOTIFICATION + '.DRAFT', flat_props['ConnectionInterfaces'])
elif name == 'myspace':
assertEquals('x-myspace', flat_props['VCardField'])
assertEquals('im-myspace', flat_props['Icon'])
@@ -139,6 +143,10 @@ def test(q, bus, conn, stream):
'embrace-and-extend': r'WORKGROUP\Bill',
'password': 'letmein'})
q.expect('dbus-error', name=cs.INVALID_ARGUMENT)
+
+ assertContains(cs.CONN_IFACE_AVATARS, flat_props['ConnectionInterfaces'])
+ assertContains(cs.CONN_IFACE_CONTACT_BLOCKING, flat_props['ConnectionInterfaces'])
+ assertContains(cs.CONN_IFACE_MAIL_NOTIFICATION + '.DRAFT', flat_props['ConnectionInterfaces'])
elif name == 'qq':
assertEquals('x-qq', flat_props['VCardField'])
assertEquals('im-qq', flat_props['Icon'])