From 15a5c26739463d98e50173f36206cbd1be1366f7 Mon Sep 17 00:00:00 2001 From: Simon McVittie Date: Fri, 7 Sep 2012 15:18:23 +0100 Subject: [PATCH 1/4] Add Google camera-v1 as a first-class caps bundle This is partly a point of principle - given any caps bundle that we have ever advertised support for, we should be prepared to define when asked - but mainly a workaround for the iChat bug mentioned in commit af55ea3d. If we return an error, it will keep disco'ing us repeatedly in a loop. This leaves us with the problem of finding out what the bundle contains. In Google's usage it is only its name that is important (ignoring that XEP-0115 explicitly makes bundle names opaque), but replying to disco requests for it requires us to be able to turn it into a set of 0 or more capability URIs. Because of the Google server bug mentioned in commit cd0da0a8, we can't just ask a Google client, because they're all on Google servers, so they can't usefully be disco'd. We assume here that it behaves like the voice-v1 and video-v1 bundles in containing exactly one URI, and that that URI corresponds to the bundle name in the same way. Signed-off-by: Simon McVittie Bug: https://bugs.freedesktop.org/show_bug.cgi?id=54634 --- gabble/capabilities.h | 1 + src/capabilities.c | 13 +++++++++++++ src/connection.c | 3 +++ src/namespaces.h | 1 + src/presence-cache.c | 3 +++ 5 files changed, 21 insertions(+) diff --git a/gabble/capabilities.h b/gabble/capabilities.h index 81c8c25..dd0a0c9 100644 --- a/gabble/capabilities.h +++ b/gabble/capabilities.h @@ -65,6 +65,7 @@ const GabbleCapabilitySet *gabble_capabilities_get_olpc_notify (void); const GabbleCapabilitySet *gabble_capabilities_get_bundle_share_v1 (void); const GabbleCapabilitySet *gabble_capabilities_get_bundle_voice_v1 (void); const GabbleCapabilitySet *gabble_capabilities_get_bundle_video_v1 (void); +const GabbleCapabilitySet *gabble_capabilities_get_bundle_camera_v1 (void); /* Return the capabilities we always have */ const GabbleCapabilitySet *gabble_capabilities_get_fixed_caps (void); diff --git a/src/capabilities.c b/src/capabilities.c index 14a396a..d2b25f5 100644 --- a/src/capabilities.c +++ b/src/capabilities.c @@ -77,6 +77,7 @@ static const Feature self_advertised_features[] = { FEATURE_OPTIONAL, NS_GOOGLE_FEAT_SHARE }, { FEATURE_OPTIONAL, NS_GOOGLE_FEAT_VOICE }, { FEATURE_OPTIONAL, NS_GOOGLE_FEAT_VIDEO }, + { FEATURE_OPTIONAL, NS_GOOGLE_FEAT_CAMERA }, { FEATURE_OPTIONAL, NS_JINGLE_DESCRIPTION_AUDIO }, { FEATURE_OPTIONAL, NS_JINGLE_DESCRIPTION_VIDEO }, { FEATURE_OPTIONAL, NS_JINGLE_RTP }, @@ -103,6 +104,7 @@ static GabbleCapabilitySet *legacy_caps = NULL; static GabbleCapabilitySet *share_v1_caps = NULL; static GabbleCapabilitySet *voice_v1_caps = NULL; static GabbleCapabilitySet *video_v1_caps = NULL; +static GabbleCapabilitySet *camera_v1_caps = NULL; static GabbleCapabilitySet *any_audio_caps = NULL; static GabbleCapabilitySet *any_video_caps = NULL; static GabbleCapabilitySet *any_audio_video_caps = NULL; @@ -138,6 +140,12 @@ gabble_capabilities_get_bundle_video_v1 (void) } const GabbleCapabilitySet * +gabble_capabilities_get_bundle_camera_v1 (void) +{ + return camera_v1_caps; +} + +const GabbleCapabilitySet * gabble_capabilities_get_any_audio (void) { return any_audio_caps; @@ -271,6 +279,9 @@ gabble_capabilities_init (gpointer conn) video_v1_caps = gabble_capability_set_new (); gabble_capability_set_add (video_v1_caps, NS_GOOGLE_FEAT_VIDEO); + camera_v1_caps = gabble_capability_set_new (); + gabble_capability_set_add (camera_v1_caps, NS_GOOGLE_FEAT_CAMERA); + any_audio_caps = gabble_capability_set_new (); gabble_capability_set_add (any_audio_caps, NS_JINGLE_RTP_AUDIO); gabble_capability_set_add (any_audio_caps, NS_JINGLE_DESCRIPTION_AUDIO); @@ -335,6 +346,7 @@ gabble_capabilities_finalize (gpointer conn) gabble_capability_set_free (share_v1_caps); gabble_capability_set_free (voice_v1_caps); gabble_capability_set_free (video_v1_caps); + gabble_capability_set_free (camera_v1_caps); gabble_capability_set_free (any_audio_caps); gabble_capability_set_free (any_video_caps); gabble_capability_set_free (any_audio_video_caps); @@ -350,6 +362,7 @@ gabble_capabilities_finalize (gpointer conn) share_v1_caps = NULL; voice_v1_caps = NULL; video_v1_caps = NULL; + camera_v1_caps = NULL; any_audio_caps = NULL; any_video_caps = NULL; any_audio_video_caps = NULL; diff --git a/src/connection.c b/src/connection.c index c1e5946..316af96 100644 --- a/src/connection.c +++ b/src/connection.c @@ -2707,6 +2707,9 @@ iq_disco_cb (WockyPorter *porter, if (!tp_strdiff (suffix, BUNDLE_VIDEO_V1)) features = gabble_capabilities_get_bundle_video_v1 (); + + if (!tp_strdiff (suffix, BUNDLE_CAMERA_V1)) + features = gabble_capabilities_get_bundle_camera_v1 (); } if (data_forms != NULL) diff --git a/src/namespaces.h b/src/namespaces.h index 4f8415c..13ae5db 100644 --- a/src/namespaces.h +++ b/src/namespaces.h @@ -35,6 +35,7 @@ #define NS_GOOGLE_FEAT_SHARE "http://google.com/xmpp/protocol/share/v1" #define NS_GOOGLE_FEAT_VOICE "http://www.google.com/xmpp/protocol/voice/v1" #define NS_GOOGLE_FEAT_VIDEO "http://www.google.com/xmpp/protocol/video/v1" +#define NS_GOOGLE_FEAT_CAMERA "http://www.google.com/xmpp/protocol/camera/v1" #define NS_GOOGLE_JINGLE_INFO "google:jingleinfo" #define NS_GOOGLE_ROSTER "google:roster" #define NS_GOOGLE_QUEUE "google:queue" diff --git a/src/presence-cache.c b/src/presence-cache.c index 31a3012..72901a0 100644 --- a/src/presence-cache.c +++ b/src/presence-cache.c @@ -522,6 +522,7 @@ gabble_presence_cache_add_bundles (GabblePresenceCache *cache) */ GOOGLE_BUNDLE ("voice-v1", NS_GOOGLE_FEAT_VOICE); GOOGLE_BUNDLE ("video-v1", NS_GOOGLE_FEAT_VIDEO); + GOOGLE_BUNDLE ("camera-v1", NS_GOOGLE_FEAT_CAMERA); /* File transfer support */ GOOGLE_BUNDLE ("share-v1", NS_GOOGLE_FEAT_SHARE); @@ -550,6 +551,8 @@ gabble_presence_cache_add_bundles (GabblePresenceCache *cache) NS_GABBLE_CAPS "#" BUNDLE_VIDEO_V1, NS_GOOGLE_FEAT_VIDEO); gabble_presence_cache_add_bundle_caps (cache, NS_GABBLE_CAPS "#" BUNDLE_SHARE_V1, NS_GOOGLE_FEAT_SHARE); + gabble_presence_cache_add_bundle_caps (cache, + NS_GABBLE_CAPS "#" BUNDLE_CAMERA_V1, NS_GOOGLE_FEAT_CAMERA); } static GObject * -- 1.7.10.4