aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGuillaume Desmottes <guillaume.desmottes@collabora.co.uk>2010-01-13 21:59:23 +0800
committerGuillaume Desmottes <guillaume.desmottes@collabora.co.uk>2010-01-14 20:59:29 +0800
commit0fc14712b0e218d6ab5244eb995cc632d02f3b34 (patch)
tree71236687f30c9cfbfd1a0557ac601fe350ea7cb9
parentaf80a92b8af244fff6567706d8a79010e2c21cc7 (diff)
downloadgsoc2013-empathy-0fc14712b0e218d6ab5244eb995cc632d02f3b34.tar.gz
gsoc2013-empathy-0fc14712b0e218d6ab5244eb995cc632d02f3b34.tar.zst
gsoc2013-empathy-0fc14712b0e218d6ab5244eb995cc632d02f3b34.zip
Claim that contacts support FT if it's announced in their contact capabilities (#599164)
-rw-r--r--libempathy/empathy-tp-contact-factory.c91
1 files changed, 91 insertions, 0 deletions
diff --git a/libempathy/empathy-tp-contact-factory.c b/libempathy/empathy-tp-contact-factory.c
index 80eaaa963..a9a02b176 100644
--- a/libempathy/empathy-tp-contact-factory.c
+++ b/libempathy/empathy-tp-contact-factory.c
@@ -731,6 +731,75 @@ tp_contact_factory_got_avatar_requirements_cb (TpConnection *proxy,
}
static void
+update_contact_capabilities (EmpathyTpContactFactory *self,
+ GHashTable *caps)
+{
+ GHashTableIter iter;
+ gpointer key, value;
+
+ g_hash_table_iter_init (&iter, caps);
+ while (g_hash_table_iter_next (&iter, &key, &value)) {
+ TpHandle handle = GPOINTER_TO_UINT (key);
+ GPtrArray *classes = value;
+ guint i;
+ EmpathyContact *contact;
+ EmpathyCapabilities capabilities;
+
+ contact = tp_contact_factory_find_by_handle (self, handle);
+ if (contact == NULL)
+ continue;
+
+ capabilities = empathy_contact_get_capabilities (contact);
+ capabilities &= ~EMPATHY_CAPABILITIES_UNKNOWN;
+
+ for (i = 0; i < classes->len; i++) {
+ GValueArray *class_struct;
+ GHashTable *fixed_prop;
+ TpHandleType handle_type;
+ const gchar *chan_type;
+
+ class_struct = g_ptr_array_index (classes, i);
+ fixed_prop = g_value_get_boxed (g_value_array_get_nth (class_struct, 0));
+
+ handle_type = tp_asv_get_uint32 (fixed_prop,
+ TP_IFACE_CHANNEL ".TargetHandleType", NULL);
+ if (handle_type != TP_HANDLE_TYPE_CONTACT)
+ continue;
+
+ chan_type = tp_asv_get_string (fixed_prop,
+ TP_IFACE_CHANNEL ".ChannelType");
+
+ if (!tp_strdiff (chan_type, TP_IFACE_CHANNEL_TYPE_FILE_TRANSFER))
+ capabilities |= EMPATHY_CAPABILITIES_FT;
+ }
+
+ DEBUG ("Changing capabilities for contact %s (%d) to %d",
+ empathy_contact_get_id (contact),
+ empathy_contact_get_handle (contact),
+ capabilities);
+
+ empathy_contact_set_capabilities (contact, capabilities);
+ }
+}
+
+static void
+tp_contact_factory_got_contact_capabilities (TpConnection *connection,
+ GHashTable *caps,
+ const GError *error,
+ gpointer user_data,
+ GObject *weak_object)
+{
+ EmpathyTpContactFactory *self = EMPATHY_TP_CONTACT_FACTORY (weak_object);
+
+ if (error != NULL) {
+ DEBUG ("Error: %s", error->message);
+ return;
+ }
+
+ update_contact_capabilities (self, caps);
+}
+
+static void
tp_contact_factory_add_contact (EmpathyTpContactFactory *tp_factory,
EmpathyContact *contact)
{
@@ -804,6 +873,13 @@ tp_contact_factory_add_contact (EmpathyTpContactFactory *tp_factory,
NULL);
}
+ if (priv->contact_caps_supported) {
+ tp_cli_connection_interface_contact_capabilities_call_get_contact_capabilities (
+ priv->connection, -1, &handles,
+ tp_contact_factory_got_contact_capabilities, NULL, NULL,
+ G_OBJECT (tp_factory));
+ }
+
DEBUG ("Contact added: %s (%d)",
empathy_contact_get_id (contact),
empathy_contact_get_handle (contact));
@@ -1318,6 +1394,17 @@ tp_contact_factory_finalize (GObject *object)
}
static void
+tp_contact_factory_contact_capabilities_changed_cb (TpConnection *connection,
+ GHashTable *caps,
+ gpointer user_data,
+ GObject *weak_object)
+{
+ EmpathyTpContactFactory *self = EMPATHY_TP_CONTACT_FACTORY (weak_object);
+
+ update_contact_capabilities (self, caps);
+}
+
+static void
connection_ready_cb (TpConnection *connection,
const GError *error,
gpointer user_data)
@@ -1355,6 +1442,10 @@ connection_ready_cb (TpConnection *connection,
if (tp_proxy_has_interface_by_id (connection,
TP_IFACE_QUARK_CONNECTION_INTERFACE_CONTACT_CAPABILITIES)) {
priv->contact_caps_supported = TRUE;
+
+ tp_cli_connection_interface_contact_capabilities_connect_to_contact_capabilities_changed (
+ priv->connection, tp_contact_factory_contact_capabilities_changed_cb,
+ NULL, NULL, G_OBJECT (tp_factory), NULL);
}
tp_cli_connection_interface_avatars_call_get_avatar_requirements (priv->connection,