[telepathy-gabble/telepathy-gabble-0.8] query proxies.telepathy.im if there is no fallback server

Guillaume Desmottes guillaume.desmottes at collabora.co.uk
Fri Dec 4 07:03:19 PST 2009


This server returns a list of public proxies that can be used as fallback.
---
 src/bytestream-factory.c |   70 ++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 68 insertions(+), 2 deletions(-)

diff --git a/src/bytestream-factory.c b/src/bytestream-factory.c
index de8836a..5fa75e8 100644
--- a/src/bytestream-factory.c
+++ b/src/bytestream-factory.c
@@ -51,6 +51,8 @@ G_DEFINE_TYPE (GabbleBytestreamFactory, gabble_bytestream_factory,
 #define FALLBACK_PROXY_CACHE_SIZE 5
 #define SOCKS5_PROXY_TIMEOUT 10
 
+#define TELEPATHY_PROXIES_SERVICE "proxies.telepathy.im"
+
 /* properties */
 enum
 {
@@ -195,6 +197,8 @@ bytestream_factory_iq_socks5_cb (LmMessageHandler *handler,
 static void query_proxies (GabbleBytestreamFactory *self,
     guint nb_proxies_needed);
 
+static GSList * randomize_g_slist (GSList *list);
+
 static void
 gabble_bytestream_factory_init (GabbleBytestreamFactory *self)
 {
@@ -397,6 +401,66 @@ query_proxies (GabbleBytestreamFactory *self,
     }
 }
 
+static void
+proxies_disco_cb (GabbleDisco *disco,
+    GabbleDiscoRequest *request,
+    const gchar *j,
+    const gchar *n,
+    LmMessageNode *query_result,
+    GError *error,
+    gpointer user_data)
+{
+  GabbleBytestreamFactory *self = GABBLE_BYTESTREAM_FACTORY (user_data);
+  GabbleBytestreamFactoryPrivate *priv = GABBLE_BYTESTREAM_FACTORY_GET_PRIVATE (
+      self);
+  NodeIter i;
+
+  if (error != NULL)
+    return;
+
+  for (i = node_iter (query_result); i; i = node_iter_next (i))
+    {
+      LmMessageNode *node = node_iter_data (i);
+      const gchar *jid;
+
+      if (tp_strdiff (node->name, "item"))
+        continue;
+
+      jid = lm_message_node_get_attribute (node, "jid");
+      if (jid == NULL)
+        continue;
+
+      DEBUG ("Discovered proxy %s", jid);
+
+      priv->socks5_potential_proxies = g_slist_prepend (
+          priv->socks5_potential_proxies, g_strdup (jid));
+    }
+
+  if (priv->socks5_potential_proxies == NULL)
+    return;
+
+  /* randomize the list to not always use the same proxies */
+  priv->socks5_potential_proxies = randomize_g_slist (
+      priv->socks5_potential_proxies);
+  priv->next_query = priv->socks5_potential_proxies;
+
+  gabble_bytestream_factory_query_socks5_proxies (self);
+}
+
+/* Query TELEPATHY_PROXIES_SERVICE to get a list of proxies */
+static void
+get_proxies_list (GabbleBytestreamFactory *self)
+{
+  GabbleBytestreamFactoryPrivate *priv = GABBLE_BYTESTREAM_FACTORY_GET_PRIVATE (
+      self);
+
+  DEBUG ("Ask %s for proxies", TELEPATHY_PROXIES_SERVICE);
+
+  gabble_disco_request (priv->conn->disco, GABBLE_DISCO_TYPE_ITEMS,
+      TELEPATHY_PROXIES_SERVICE, NULL, proxies_disco_cb, self, G_OBJECT (self),
+      NULL);
+}
+
 /* ask to the factory to try to find more proxies if needed */
 void
 gabble_bytestream_factory_query_socks5_proxies (GabbleBytestreamFactory *self)
@@ -407,8 +471,10 @@ gabble_bytestream_factory_query_socks5_proxies (GabbleBytestreamFactory *self)
   guint nb_proxies_needed;
 
   if (priv->socks5_potential_proxies == NULL)
-    /* No potential proxies, we can't do anything */
-    return;
+    {
+      get_proxies_list (self);
+      return;
+    }
 
   nb_proxies_found = g_slist_length (priv->socks5_proxies) +
     g_slist_length (priv->socks5_fallback_proxies);
-- 
1.5.6.5




More information about the telepathy-commits mailing list