[telepathy-gabble/master] MediaChannel: set nat-traversal Tp property appropriately

Senko Rasic senko.rasic at collabora.co.uk
Mon Jun 29 04:43:08 PDT 2009


---
 src/media-channel.c |   14 +++++++++++++-
 src/media-factory.c |   22 ++++++++++++++++++++++
 2 files changed, 35 insertions(+), 1 deletions(-)

diff --git a/src/media-channel.c b/src/media-channel.c
index 2e870c2..b6516e0 100644
--- a/src/media-channel.c
+++ b/src/media-channel.c
@@ -745,7 +745,7 @@ gabble_media_channel_class_init (GabbleMediaChannelClass *gabble_media_channel_c
   param_spec = g_param_spec_string ("nat-traversal", "NAT traversal",
       "NAT traversal mechanism.",
       "gtalk-p2p",
-      G_PARAM_CONSTRUCT | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
+      G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
   g_object_class_install_property (object_class, PROP_NAT_TRAVERSAL,
       param_spec);
 
@@ -1708,6 +1708,18 @@ _gabble_media_channel_request_contents (GabbleMediaChannel *chan,
       create_session (chan, peer, peer_resource);
 
       g_object_set (priv->session, "dialect", dialect, NULL);
+
+      /* Change nat-transport type if we need to */
+      if (!tp_strdiff (transport_ns, NS_JINGLE_TRANSPORT_ICEUDP))
+        {
+          DEBUG ("changing nat-traversal property to ice-udp");
+          g_object_set (chan, "nat-traversal", "ice-udp", NULL);
+        }
+      else if (!tp_strdiff (transport_ns, NS_JINGLE_TRANSPORT_RAWUDP))
+        {
+          DEBUG ("changing nat-traversal property to raw-udp");
+          g_object_set (chan, "nat-traversal", "none", NULL);
+        }
     }
 
   /* check it's not a ridiculous number of streams */
diff --git a/src/media-factory.c b/src/media-factory.c
index 85485eb..1b216b1 100644
--- a/src/media-factory.c
+++ b/src/media-factory.c
@@ -42,6 +42,7 @@
 #include "jingle-factory.h"
 #include "jingle-media-rtp.h"
 #include "jingle-session.h"
+
 #include "media-channel.h"
 #include "namespaces.h"
 #include "util.h"
@@ -332,6 +333,27 @@ new_jingle_session_cb (GabbleJingleFactory *jf, GabbleJingleSession *sess, gpoin
     {
       GabbleMediaChannel *chan = new_media_channel (self, sess, sess->peer,
           FALSE, FALSE, FALSE);
+      GList *cs;
+
+      /* FIXME: we need this detection to properly adjust nat-traversal on
+       * the channel. We hope all contents will have the same transport... */
+      cs = gabble_jingle_session_get_contents (sess);
+
+      if (cs != NULL)
+        {
+          GabbleJingleContent *c = cs->data;
+          gchar *ns;
+
+          g_object_get (c, "transport-ns", &ns, NULL);
+
+          if (!tp_strdiff (ns, NS_JINGLE_TRANSPORT_ICEUDP))
+              g_object_set (chan, "nat-traversal", "ice-udp", NULL);
+          else if (!tp_strdiff (ns, NS_JINGLE_TRANSPORT_RAWUDP))
+              g_object_set (chan, "nat-traversal", "none", NULL);
+
+          g_list_free (cs);
+        }
+
       tp_channel_manager_emit_new_channel (self,
           TP_EXPORTABLE_CHANNEL (chan), NULL);
     }
-- 
1.5.6.5




More information about the telepathy-commits mailing list