[Telepathy-commits] [telepathy-gabble/master] GabbleJingleFactory: additionally resolve and set up the fallback STUN server

Simon McVittie simon.mcvittie at collabora.co.uk
Wed Feb 25 11:54:19 PST 2009


---
 src/jingle-factory.c |   54 ++++++++++++++++++++++++++++++++++++++++++-------
 1 files changed, 46 insertions(+), 8 deletions(-)

diff --git a/src/jingle-factory.c b/src/jingle-factory.c
index dc4e1f3..2a08b6c 100644
--- a/src/jingle-factory.c
+++ b/src/jingle-factory.c
@@ -69,6 +69,8 @@ struct _GabbleJingleFactoryPrivate
 
   gchar *stun_server;
   guint16 stun_port;
+  gchar *fallback_stun_server;
+  guint16 fallback_stun_port;
   gchar *relay_token;
   gboolean get_stun_from_jingle;
   gboolean dispose_has_run;
@@ -114,6 +116,7 @@ gabble_jingle_factory_init (GabbleJingleFactory *obj)
 typedef struct {
     gchar *stun_server;
     guint16 stun_port;
+    gboolean fallback;
 } PendingStunServer;
 
 static void
@@ -166,24 +169,36 @@ stun_server_resolved_cb (GibberResolver *resolver,
   DEBUG ("Resolved STUN server %s:%u to %s:%u", data->stun_server,
       data->stun_port, stun_server, data->stun_port);
 
-  g_free (self->priv->stun_server);
-  self->priv->stun_server = stun_server;
-  self->priv->stun_port = data->stun_port;
+  if (data->fallback)
+    {
+      g_free (self->priv->fallback_stun_server);
+      self->priv->fallback_stun_server = stun_server;
+      self->priv->fallback_stun_port = data->stun_port;
+    }
+  else
+    {
+      g_free (self->priv->stun_server);
+      self->priv->stun_server = stun_server;
+      self->priv->stun_port = data->stun_port;
+    }
 }
 
 static void
 take_stun_server (GabbleJingleFactory *self,
                   gchar *stun_server,
-                  guint16 stun_port)
+                  guint16 stun_port,
+                  gboolean fallback)
 {
   PendingStunServer *data = g_slice_new0 (PendingStunServer);
 
   if (stun_server == NULL)
     return;
 
-  DEBUG ("Resolving STUN server %s:%u", stun_server, stun_port);
+  DEBUG ("Resolving %s STUN server %s:%u",
+      fallback ? "fallback" : "primary", stun_server, stun_port);
   data->stun_server = stun_server;
   data->stun_port = stun_port;
+  data->fallback = fallback;
 
   gibber_resolver_addrinfo (self->priv->resolver, stun_server, NULL,
       AF_INET, SOCK_DGRAM, IPPROTO_UDP, 0,
@@ -264,7 +279,7 @@ jingle_info_cb (LmMessageHandler *handler,
             {
               DEBUG ("jingle info: got stun server %s, port %u", server,
                   port);
-              take_stun_server (fac, g_strdup (server), port);
+              take_stun_server (fac, g_strdup (server), port, FALSE);
             }
         }
     }
@@ -349,6 +364,7 @@ gabble_jingle_factory_dispose (GObject *object)
   priv->transports = NULL;
 
   g_free (fac->priv->stun_server);
+  g_free (fac->priv->fallback_stun_server);
   g_free (fac->priv->relay_token);
 
   if (G_OBJECT_CLASS (gabble_jingle_factory_parent_class)->dispose)
@@ -493,7 +509,17 @@ connection_status_changed_cb (GabbleConnection *conn,
             }
           else
             {
-              take_stun_server (self, stun_server, stun_port);
+              take_stun_server (self, stun_server, stun_port, FALSE);
+            }
+
+          g_object_get (priv->conn,
+              "fallback-stun-server", &stun_server,
+              "fallback-stun-port", &stun_port,
+              NULL);
+
+          if (stun_server != NULL)
+            {
+              take_stun_server (self, stun_server, stun_port, TRUE);
             }
 
           if (priv->conn->features &
@@ -745,7 +771,19 @@ gabble_jingle_factory_get_stun_server (GabbleJingleFactory *self,
                                        guint *stun_port)
 {
   if (self->priv->stun_server == NULL || self->priv->stun_port == 0)
-    return FALSE;
+    {
+      if (self->priv->fallback_stun_server == NULL ||
+          self->priv->fallback_stun_port == 0)
+        return FALSE;
+
+      if (stun_server != NULL)
+        *stun_server = g_strdup (self->priv->fallback_stun_server);
+
+      if (stun_port != NULL)
+        *stun_port = self->priv->fallback_stun_port;
+
+      return TRUE;
+    }
 
   if (stun_server != NULL)
     *stun_server = g_strdup (self->priv->stun_server);
-- 
1.5.6.5




More information about the telepathy-commits mailing list