diff options
author | Guillaume Desmottes <guillaume.desmottes@collabora.co.uk> | 2009-04-21 13:21:55 +0100 |
---|---|---|
committer | Guillaume Desmottes <guillaume.desmottes@collabora.co.uk> | 2009-04-21 13:21:55 +0100 |
commit | 23a5800f1f215fdcaa47de9457ac85a32fd8af33 (patch) | |
tree | 32162d853e2e0e0747fbf36f07ca45ed78c3a89b /src/bytestream-factory.c | |
parent | 8a5e41f86bb2d0618ab60d67d447427490f0533b (diff) | |
download | telepathy-gabble-23a5800f1f215fdcaa47de9457ac85a32fd8af33.tar.gz |
bytestream-factory: only query few SOCKS5 proxies instead of the whole list
Diffstat (limited to 'src/bytestream-factory.c')
-rw-r--r-- | src/bytestream-factory.c | 116 |
1 files changed, 83 insertions, 33 deletions
diff --git a/src/bytestream-factory.c b/src/bytestream-factory.c index 67c262e10..edf3b76ee 100644 --- a/src/bytestream-factory.c +++ b/src/bytestream-factory.c @@ -46,6 +46,8 @@ G_DEFINE_TYPE (GabbleBytestreamFactory, gabble_bytestream_factory, G_TYPE_OBJECT); +#define NB_SOCKS5_PROXIES_USED 5 + /* properties */ enum { @@ -161,6 +163,8 @@ struct _GabbleBytestreamFactoryPrivate GSList *socks5_proxies; /* List of GabbleSocks5Proxy found using the fallback-socks5-proxies param */ GSList *socks5_fallback_proxies; + /* List of SOCKS5's jids that have not been queried yet */ + GSList *socks5_potential_proxies; gboolean dispose_has_run; }; @@ -292,6 +296,70 @@ disco_item_found_cb (GabbleDisco *disco, } static void +query_socks5_proxies (GabbleBytestreamFactory *self) +{ + GabbleBytestreamFactoryPrivate *priv = GABBLE_BYTESTREAM_FACTORY_GET_PRIVATE ( + self); + guint nb_proxies_found; + guint nb_proxies_needed; + guint i; + + nb_proxies_found = g_slist_length (priv->socks5_proxies) + + g_slist_length (priv->socks5_fallback_proxies); + + if (nb_proxies_found >= NB_SOCKS5_PROXIES_USED) + { + DEBUG ("we already have discovered enough proxies (%u)", + nb_proxies_found); + return; + } + + nb_proxies_needed = NB_SOCKS5_PROXIES_USED - nb_proxies_found; + DEBUG ("Need %u more proxies", nb_proxies_needed); + + for (i = 0; i < nb_proxies_needed && + priv->socks5_potential_proxies != NULL; i++) + { + gchar *jid; + + jid = priv->socks5_potential_proxies->data; + send_proxy_query (self, jid, TRUE); + + g_free (jid); + priv->socks5_potential_proxies = g_slist_delete_link ( + priv->socks5_potential_proxies, priv->socks5_potential_proxies); + } +} + +static GSList * +randomize_g_slist (GSList *list) +{ + guint len; + guint i; + GSList *new_head, *new_tail; + + len = g_slist_length (list); + if (len <= 1) + return list; + + i = g_random_int_range (0, len); + if (i == 0) + return list; + + /* Cut the list at the i th position and make it the new head of the + * list */ + new_tail = g_slist_nth (list, i - 1); + g_assert (new_tail != NULL); + + new_head = new_tail->next; + g_assert (new_head != NULL); + + new_tail->next = NULL; + + return g_slist_concat (new_head, list); +} + +static void conn_status_changed_cb (GabbleConnection *conn, TpConnectionStatus status, TpConnectionStatusReason reason, @@ -303,19 +371,25 @@ conn_status_changed_cb (GabbleConnection *conn, if (status == TP_CONNECTION_STATUS_CONNECTED) { - /* Send SOCKS5 query to fallback SOCKS5 proxy if any */ GStrv jids; guint i; + /* we can't intialize socks5_potential_proxies in the constructor + * because Connection's properties are not set yet at this point */ g_object_get (priv->conn, "fallback-socks5-proxies", &jids, NULL); - if (jids == NULL) - return; - for (i = 0; jids[i] != NULL; i++) + for (i = 0; jids != NULL && jids[i] != NULL; i++) { - send_proxy_query (self, jids[i], TRUE); + priv->socks5_potential_proxies = g_slist_prepend ( + priv->socks5_potential_proxies, g_strdup (jids[i])); } + /* randomize the list to not always use the same proxies */ + priv->socks5_potential_proxies = randomize_g_slist ( + priv->socks5_potential_proxies); + + query_socks5_proxies (self); + g_strfreev (jids); } } @@ -421,6 +495,10 @@ gabble_bytestream_factory_dispose (GObject *object) priv->socks5_proxies = NULL; priv->socks5_fallback_proxies = NULL; + g_slist_foreach (priv->socks5_potential_proxies, (GFunc) g_free, NULL); + g_slist_free (priv->socks5_potential_proxies); + priv->socks5_potential_proxies = NULL; + if (G_OBJECT_CLASS (gabble_bytestream_factory_parent_class)->dispose) G_OBJECT_CLASS (gabble_bytestream_factory_parent_class)->dispose (object); } @@ -1953,34 +2031,6 @@ gabble_bytestream_factory_make_multi_accept_iq (const gchar *full_jid, return msg; } -static GSList * -randomize_g_slist (GSList *list) -{ - guint len; - guint i; - GSList *new_head, *new_tail; - - len = g_slist_length (list); - if (len <= 1) - return list; - - i = g_random_int_range (0, len); - if (i == 0) - return list; - - /* Cut the list at the i th position and make it the new head of the - * list */ - new_tail = g_slist_nth (list, i - 1); - g_assert (new_tail != NULL); - - new_head = new_tail->next; - g_assert (new_head != NULL); - - new_tail->next = NULL; - - return g_slist_concat (new_head, list); -} - GSList * gabble_bytestream_factory_get_socks5_proxies (GabbleBytestreamFactory *self) { |