aboutsummaryrefslogtreecommitdiffstats
path: root/libempathy
diff options
context:
space:
mode:
Diffstat (limited to 'libempathy')
-rw-r--r--libempathy/empathy-contact.c4
-rw-r--r--libempathy/empathy-contact.h2
-rw-r--r--libempathy/empathy-tp-call.c24
-rw-r--r--libempathy/empathy-tp-contact-factory.c7
4 files changed, 33 insertions, 4 deletions
diff --git a/libempathy/empathy-contact.c b/libempathy/empathy-contact.c
index 70025c7b0..3f03c1d33 100644
--- a/libempathy/empathy-contact.c
+++ b/libempathy/empathy-contact.c
@@ -176,6 +176,10 @@ empathy_contact_class_init (EmpathyContactClass *class)
static void
empathy_contact_init (EmpathyContact *contact)
{
+ EmpathyContactPriv *priv;
+
+ priv = GET_PRIV (contact);
+ priv->capabilities = EMPATHY_CAPABILITIES_UNKNOWN;
}
static void
diff --git a/libempathy/empathy-contact.h b/libempathy/empathy-contact.h
index 57a72c906..b84f784cc 100644
--- a/libempathy/empathy-contact.h
+++ b/libempathy/empathy-contact.h
@@ -54,8 +54,10 @@ struct _EmpathyContactClass {
};
typedef enum {
+ EMPATHY_CAPABILITIES_NONE = 0,
EMPATHY_CAPABILITIES_AUDIO = 1 << 0,
EMPATHY_CAPABILITIES_VIDEO = 1 << 1,
+ EMPATHY_CAPABILITIES_UNKNOWN = 1 << 7
} EmpathyCapabilities;
GType empathy_contact_get_type (void) G_GNUC_CONST;
diff --git a/libempathy/empathy-tp-call.c b/libempathy/empathy-tp-call.c
index b72e3877e..4ec4a97ff 100644
--- a/libempathy/empathy-tp-call.c
+++ b/libempathy/empathy-tp-call.c
@@ -326,6 +326,20 @@ tp_call_request_streams_for_capabilities (EmpathyTpCall *call,
}
static void
+tp_call_request_streams_capabilities_cb (EmpathyContact *contact,
+ GParamSpec *property, gpointer user_data)
+{
+ EmpathyTpCall *call = EMPATHY_TP_CALL (user_data);
+
+ g_signal_handlers_disconnect_by_func (contact,
+ tp_call_request_streams_capabilities_cb,
+ user_data);
+
+ tp_call_request_streams_for_capabilities (call,
+ empathy_contact_get_capabilities (contact));
+}
+
+static void
tp_call_request_streams (EmpathyTpCall *call)
{
EmpathyTpCallPriv *priv = GET_PRIV (call);
@@ -335,7 +349,6 @@ tp_call_request_streams (EmpathyTpCall *call)
empathy_debug (DEBUG_DOMAIN,
"Requesting appropriate audio/video streams from contact");
- capabilities = empathy_contact_get_capabilities (priv->contact);
/* FIXME: SIP don't have capabilities interface but we know it supports
* only audio and not video. */
@@ -345,6 +358,15 @@ tp_call_request_streams (EmpathyTpCall *call)
{
capabilities = EMPATHY_CAPABILITIES_AUDIO;
}
+ else
+ {
+ capabilities = empathy_contact_get_capabilities (priv->contact);
+ if (capabilities == EMPATHY_CAPABILITIES_UNKNOWN) {
+ g_signal_connect (G_OBJECT (priv->contact), "notify::capabilities",
+ G_CALLBACK (tp_call_request_streams_capabilities_cb), call);
+ return;
+ }
+ }
tp_call_request_streams_for_capabilities (call, capabilities);
}
diff --git a/libempathy/empathy-tp-contact-factory.c b/libempathy/empathy-tp-contact-factory.c
index 77482522b..533f1c5b1 100644
--- a/libempathy/empathy-tp-contact-factory.c
+++ b/libempathy/empathy-tp-contact-factory.c
@@ -505,8 +505,7 @@ tp_contact_factory_update_capabilities (EmpathyTpContactFactory *tp_factory,
capabilities = empathy_contact_get_capabilities (contact);
if (strcmp (channel_type, TP_IFACE_CHANNEL_TYPE_STREAMED_MEDIA) == 0) {
- capabilities &= ~EMPATHY_CAPABILITIES_AUDIO;
- capabilities &= ~EMPATHY_CAPABILITIES_VIDEO;
+ capabilities = EMPATHY_CAPABILITIES_NONE;
if (specific & TP_CHANNEL_MEDIA_CAPABILITY_AUDIO) {
capabilities |= EMPATHY_CAPABILITIES_AUDIO;
}
@@ -534,7 +533,9 @@ tp_contact_factory_get_capabilities_cb (DBusGProxy *proxy,
if (error) {
empathy_debug (DEBUG_DOMAIN, "Error getting capabilities: %s",
- error->message);
+ error->message);
+ /* FIXME Should set the capabilities of the contacts for which this request
+ * originated to NONE */
goto OUT;
}