[telepathy-gabble/master] Use namespace sets to convert Capabilities type-specific flags to XMPP caps

Simon McVittie simon.mcvittie at collabora.co.uk
Mon Aug 24 08:10:56 PDT 2009


---
 src/capabilities.h  |    2 +-
 src/connection.c    |   14 ++++++++++++--
 src/media-channel.c |   38 +++++++++++++-------------------------
 src/media-channel.h |    4 ++--
 4 files changed, 28 insertions(+), 30 deletions(-)

diff --git a/src/capabilities.h b/src/capabilities.h
index 2b79d8a..344fc35 100644
--- a/src/capabilities.h
+++ b/src/capabilities.h
@@ -126,7 +126,7 @@ const GabbleCapabilitySet *gabble_capabilities_get_initial_caps (void);
 
 GabblePresenceCapabilities capabilities_parse (const GabbleCapabilitySet *cap_set);
 
-typedef GabblePresenceCapabilities (*TypeFlagsToCapsFunc) (guint typeflags);
+typedef void (*TypeFlagsToCapsFunc) (guint typeflags, GabbleCapabilitySet *caps);
 typedef guint (*CapsToTypeFlagsFunc) (GabblePresenceCapabilities caps);
 
 typedef struct _CapabilityConversionData CapabilityConversionData;
diff --git a/src/connection.c b/src/connection.c
index 7c5be36..64a10b9 100644
--- a/src/connection.c
+++ b/src/connection.c
@@ -2460,11 +2460,15 @@ gabble_connection_advertise_capabilities (TpSvcConnectionInterfaceCapabilities *
   GabbleCapabilitySet *cap_set;
   GabbleCapabilitySet *save_set;
   GError *error = NULL;
+  GabbleCapabilitySet *add_set, *remove_set;
 
   TP_BASE_CONNECTION_ERROR_IF_NOT_CONNECTED (base, context);
 
   DEBUG ("caps before: %x", pres->caps);
 
+  add_set = gabble_capability_set_new ();
+  remove_set = gabble_capability_set_new ();
+
   for (i = 0; i < add->len; i++)
     {
       GValue iface_flags_pair = {0, };
@@ -2481,7 +2485,7 @@ gabble_connection_advertise_capabilities (TpSvcConnectionInterfaceCapabilities *
 
       for (ccd = capabilities_conversions; NULL != ccd->iface; ccd++)
           if (g_str_equal (channel_type, ccd->iface))
-            add_caps |= ccd->tf2c_fn (flags);
+            ccd->tf2c_fn (flags, add_set);
 
       g_free (channel_type);
     }
@@ -2490,9 +2494,15 @@ gabble_connection_advertise_capabilities (TpSvcConnectionInterfaceCapabilities *
     {
       for (ccd = capabilities_conversions; NULL != ccd->iface; ccd++)
           if (g_str_equal (del[i], ccd->iface))
-            remove_caps |= ccd->tf2c_fn (~0);
+            ccd->tf2c_fn (~0, remove_set);
     }
 
+  add_caps = capabilities_parse (add_set);
+  remove_caps = capabilities_parse (remove_set);
+
+  gabble_capability_set_free (add_set);
+  gabble_capability_set_free (remove_set);
+
   save_caps = caps = pres->caps;
   save_set = gabble_presence_dup_caps (pres);
 
diff --git a/src/media-channel.c b/src/media-channel.c
index 77bdeb2..9876371 100644
--- a/src/media-channel.c
+++ b/src/media-channel.c
@@ -2493,24 +2493,10 @@ stream_direction_changed_cb (GabbleMediaStream *stream,
       chan, id, direction, pending_send);
 }
 
-#define GTALK_CAPS \
-  ( PRESENCE_CAP_GOOGLE_VOICE )
-
-#define GTALK_VIDEO_CAPS \
-   ( PRESENCE_CAP_GOOGLE_VIDEO )
-
-#define JINGLE_AUDIO_CAPS \
-  ( PRESENCE_CAP_JINGLE_RTP | PRESENCE_CAP_JINGLE_RTP_AUDIO \
-  | PRESENCE_CAP_JINGLE_DESCRIPTION_AUDIO )
-
-#define JINGLE_VIDEO_CAPS \
-  ( PRESENCE_CAP_JINGLE_RTP | PRESENCE_CAP_JINGLE_RTP_VIDEO \
-  | PRESENCE_CAP_JINGLE_DESCRIPTION_VIDEO )
-
-GabblePresenceCapabilities
-_gabble_media_channel_typeflags_to_caps (TpChannelMediaCapabilities flags)
+void
+_gabble_media_channel_typeflags_to_caps (TpChannelMediaCapabilities flags,
+    GabbleCapabilitySet *caps)
 {
-  GabblePresenceCapabilities caps = 0;
   gboolean gtalk_p2p;
 
   DEBUG ("adding Jingle caps %u (%s, %s, %s, %s)", flags,
@@ -2522,30 +2508,32 @@ _gabble_media_channel_typeflags_to_caps (TpChannelMediaCapabilities flags)
         ? "ice-udp" : "no ice-udp");
 
   if (flags & TP_CHANNEL_MEDIA_CAPABILITY_NAT_TRAVERSAL_ICE_UDP)
-    caps |= PRESENCE_CAP_JINGLE_TRANSPORT_ICEUDP;
+    gabble_capability_set_add (caps, NS_JINGLE_TRANSPORT_ICEUDP);
 
   gtalk_p2p = flags & TP_CHANNEL_MEDIA_CAPABILITY_NAT_TRAVERSAL_GTALK_P2P;
 
   if (gtalk_p2p)
-    caps |= PRESENCE_CAP_GOOGLE_TRANSPORT_P2P;
+    gabble_capability_set_add (caps, NS_GOOGLE_TRANSPORT_P2P);
 
   if (flags & TP_CHANNEL_MEDIA_CAPABILITY_AUDIO)
     {
-      caps |= JINGLE_AUDIO_CAPS;
+      gabble_capability_set_add (caps, NS_JINGLE_RTP);
+      gabble_capability_set_add (caps, NS_JINGLE_RTP_AUDIO);
+      gabble_capability_set_add (caps, NS_JINGLE_DESCRIPTION_AUDIO);
 
       if (gtalk_p2p)
-        caps |= GTALK_CAPS;
+        gabble_capability_set_add (caps, NS_GOOGLE_FEAT_VOICE);
     }
 
   if (flags & TP_CHANNEL_MEDIA_CAPABILITY_VIDEO)
     {
-      caps |= JINGLE_VIDEO_CAPS;
+      gabble_capability_set_add (caps, NS_JINGLE_RTP);
+      gabble_capability_set_add (caps, NS_JINGLE_RTP_VIDEO);
+      gabble_capability_set_add (caps, NS_JINGLE_DESCRIPTION_VIDEO);
 
       if (gtalk_p2p)
-        caps |= GTALK_VIDEO_CAPS;
+        gabble_capability_set_add (caps, NS_GOOGLE_FEAT_VIDEO);
     }
-
-  return caps;
 }
 
 static void
diff --git a/src/media-channel.h b/src/media-channel.h
index a91404b..3966815 100644
--- a/src/media-channel.h
+++ b/src/media-channel.h
@@ -71,8 +71,8 @@ GType gabble_media_channel_get_type (void);
   (G_TYPE_INSTANCE_GET_CLASS ((obj), GABBLE_TYPE_MEDIA_CHANNEL, \
                               GabbleMediaChannelClass))
 
-GabblePresenceCapabilities
-_gabble_media_channel_typeflags_to_caps (TpChannelMediaCapabilities flags);
+void _gabble_media_channel_typeflags_to_caps (TpChannelMediaCapabilities flags,
+    GabbleCapabilitySet *caps);
 
 TpChannelMediaCapabilities
 _gabble_media_channel_caps_to_typeflags (GabblePresenceCapabilities caps);
-- 
1.5.6.5




More information about the telepathy-commits mailing list