diff options
Diffstat (limited to 'libempathy')
-rw-r--r-- | libempathy/empathy-contact.c | 4 | ||||
-rw-r--r-- | libempathy/empathy-contact.h | 2 | ||||
-rw-r--r-- | libempathy/empathy-tp-call.c | 24 | ||||
-rw-r--r-- | libempathy/empathy-tp-contact-factory.c | 7 |
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; } |