[Telepathy-commits] [telepathy-gabble/master] JingleFactory: code for creating google relay sessions if relay-token is known

Senko Rasic senko.rasic at collabora.co.uk
Wed Mar 4 10:55:39 PST 2009


---
 src/jingle-factory.c |  100 +++++++++++++++++++++++++++++++++++++++++++++++++-
 src/jingle-factory.h |    2 +
 2 files changed, 101 insertions(+), 1 deletions(-)

diff --git a/src/jingle-factory.c b/src/jingle-factory.c
index 2a08b6c..198799b 100644
--- a/src/jingle-factory.c
+++ b/src/jingle-factory.c
@@ -27,6 +27,7 @@
 
 #include <lib/gibber/gibber-resolver.h>
 #include <loudmouth/loudmouth.h>
+#include <libsoup/soup.h>
 
 #define DEBUG_FLAG GABBLE_DEBUG_MEDIA
 
@@ -66,6 +67,7 @@ struct _GabbleJingleFactoryPrivate
   GHashTable *transports;
   GHashTable *sessions;
   GibberResolver *resolver;
+  SoupSession *soup;
 
   gchar *stun_server;
   guint16 stun_port;
@@ -73,6 +75,7 @@ struct _GabbleJingleFactoryPrivate
   guint16 fallback_stun_port;
   gchar *relay_token;
   gboolean get_stun_from_jingle;
+
   gboolean dispose_has_run;
 };
 
@@ -298,7 +301,7 @@ jingle_info_cb (LmMessageHandler *handler,
 
           if (token != NULL)
             {
-              DEBUG ("jingle info: got relay token %s", token);
+              DEBUG ("jingle info: got Google relay token %s", token);
               g_free (fac->priv->relay_token);
               fac->priv->relay_token = g_strdup (token);
             }
@@ -367,6 +370,12 @@ gabble_jingle_factory_dispose (GObject *object)
   g_free (fac->priv->fallback_stun_server);
   g_free (fac->priv->relay_token);
 
+  if (priv->soup != NULL)
+    {
+      g_object_unref (priv->soup);
+      priv->soup = NULL;
+    }
+
   if (G_OBJECT_CLASS (gabble_jingle_factory_parent_class)->dispose)
     G_OBJECT_CLASS (gabble_jingle_factory_parent_class)->dispose (object);
 }
@@ -793,3 +802,92 @@ gabble_jingle_factory_get_stun_server (GabbleJingleFactory *self,
 
   return TRUE;
 }
+
+static void
+on_http_response (SoupSession *soup,
+                  SoupMessage *msg,
+                  gpointer user_data)
+{
+  if (msg->status_code != 200)
+    {
+      DEBUG ("Google session creation failed, relaying not used: %d %s",
+          msg->status_code, msg->reason_phrase);
+    }
+  else
+    {
+      /* parse a=b lines into GHashTable */
+      GabbleJingleSession *sess = GABBLE_JINGLE_SESSION (user_data);
+      GHashTable *map = g_hash_table_new_full (g_str_hash, g_str_equal,
+          g_free, g_free);
+      gchar **lines;
+      guint i;
+
+      lines = g_strsplit (msg->response_body->data, "\n", 0);
+
+      if (lines != NULL)
+        {
+          for (i = 0; lines[i] != NULL; i++)
+            {
+              gchar ** fields = g_strsplit (lines[i], "=", 2);
+
+              /* we only want lines of format a=b */
+              if ((fields != NULL) &&
+                  (fields[0] != NULL) && (fields[1] != NULL) &&
+                  (fields[2] == NULL))
+                {
+                  gchar *key = g_strdup (fields[0]);
+                  gchar *val = g_strdup (fields[1]);
+                  gchar *cr = g_utf8_strchr (val, -1, '\r');
+                  if (cr != NULL)
+                      *cr = 0;
+
+                  g_hash_table_insert (map, key, val);
+                }
+
+              g_strfreev (fields);
+            }
+        }
+
+      g_object_set (sess, "relay-info", map, NULL);
+      g_strfreev (lines);
+    }
+}
+
+/* If we have a relay token, we'll try to use it and get relay info.
+ * When/if we do, we'll set "relay-info" property on the given session. */
+void
+gabble_jingle_factory_create_google_relay_session (GabbleJingleFactory *fac,
+  GabbleJingleSession *sess)
+{
+  GabbleJingleFactoryPrivate *priv =
+      GABBLE_JINGLE_FACTORY_GET_PRIVATE (fac);
+  SoupMessage *msg;
+
+  if (fac->priv->relay_token == NULL)
+    {
+      DEBUG ("No relay token provided, not creating google relay session");
+      return;
+    }
+
+  if (priv->soup == NULL)
+    {
+      /* libsoup uses glib in multiple threads and don't have this, so we have to
+       * enable it manually here */
+      if (!g_thread_supported ())
+        g_thread_init (NULL);
+
+      priv->soup = soup_session_async_new ();
+    }
+
+  msg = soup_message_new ("GET", "http://relay.google.com/create_session");
+
+  DEBUG ("Trying to create a new relay session");
+
+  /* libjingle sets both headers, so shall we */
+  soup_message_headers_append (msg->request_headers,
+      "X-Talk-Google-Relay-Auth", fac->priv->relay_token);
+  soup_message_headers_append (msg->request_headers,
+      "X-Google-Relay-Auth", fac->priv->relay_token);
+
+  soup_session_queue_message (priv->soup, msg, on_http_response, sess);
+}
diff --git a/src/jingle-factory.h b/src/jingle-factory.h
index e37e2e2..613771e 100644
--- a/src/jingle-factory.h
+++ b/src/jingle-factory.h
@@ -141,6 +141,8 @@ void _jingle_factory_unregister_session (GabbleJingleFactory *factory,
 
 GabbleJingleSession *gabble_jingle_factory_create_session (GabbleJingleFactory
     *fac, TpHandle peer, const gchar *peer_resource);
+void gabble_jingle_factory_create_google_relay_session (GabbleJingleFactory
+  *fac, GabbleJingleSession *sess);
 
 const gchar *gabble_jingle_factory_get_google_relay_token (
     GabbleJingleFactory *self);
-- 
1.5.6.5




More information about the telepathy-commits mailing list