From b68b95efe92023193c318d4dd0fb92544463adef Mon Sep 17 00:00:00 2001 From: Xavier Claessens Date: Fri, 15 Feb 2008 22:28:44 +0000 Subject: [PATCH] Merge commit 'sjoerd/master' svn path=/trunk/; revision=637 --- libempathy/empathy-contact.c | 4 ++++ libempathy/empathy-contact.h | 2 ++ libempathy/empathy-tp-call.c | 24 +++++++++++++++++++++++- 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 70025c7b..3f03c1d3 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 57a72c90..b84f784c 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 b72e3877..4ec4a97f 100644 --- a/libempathy/empathy-tp-call.c +++ b/libempathy/empathy-tp-call.c @@ -325,6 +325,20 @@ tp_call_request_streams_for_capabilities (EmpathyTpCall *call, g_array_free (stream_types, TRUE); } +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) { @@ -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 77482522..533f1c5b 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; } -- 2.39.2