[telepathy-gabble-0.16] telepathy-gabble: Add Google camera-v1 as a first-class caps bundle

Simon McVittie smcv at kemper.freedesktop.org
Tue Sep 11 04:26:47 PDT 2012


Module: telepathy-gabble
Branch: telepathy-gabble-0.16
Commit: fbfa8c138da1a4f00c74af4bda98e858a203a58b
URL:    http://cgit.freedesktop.org/telepathy/telepathy-gabble/commit/?id=fbfa8c138da1a4f00c74af4bda98e858a203a58b

Author: Simon McVittie <simon.mcvittie at collabora.co.uk>
Date:   Fri Sep  7 15:18:23 2012 +0100

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 <simon.mcvittie at collabora.co.uk>
Reviewed-by: Sjoerd Simons <sjoerd.simons at collabora.co.uk>
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(+), 0 deletions(-)

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 *



More information about the telepathy-commits mailing list