[telepathy-gabble/master] Convert to use GResolver instead of GibberResolver.

Mike Ruprecht mike.ruprecht at collabora.co.uk
Mon Dec 7 07:36:11 PST 2009


---
 src/jingle-factory.c |   74 +++++++++++++++++++++++++++----------------------
 1 files changed, 41 insertions(+), 33 deletions(-)

diff --git a/src/jingle-factory.c b/src/jingle-factory.c
index ae3ec3d..7e53134 100644
--- a/src/jingle-factory.c
+++ b/src/jingle-factory.c
@@ -25,7 +25,6 @@
 #include <string.h>
 #include <glib.h>
 
-#include <lib/gibber/gibber-resolver.h>
 #include <loudmouth/loudmouth.h>
 #include <libsoup/soup.h>
 
@@ -74,7 +73,6 @@ struct _GabbleJingleFactoryPrivate
 
   /* instances of SESSION_MAP_KEY_FORMAT => GabbleJingleSession. */
   GHashTable *sessions;
-  GibberResolver *resolver;
   SoupSession *soup;
 
   gchar *stun_server;
@@ -140,14 +138,15 @@ gabble_jingle_factory_init (GabbleJingleFactory *obj)
 
   priv->conn = NULL;
   priv->dispose_has_run = FALSE;
-  priv->resolver = gibber_resolver_get_resolver ();
   priv->relay_http_port = 80;
 }
 
 typedef struct {
+    GabbleJingleFactory *factory;
     gchar *stun_server;
     guint16 stun_port;
     gboolean fallback;
+    GCancellable *cancellable;
 } PendingStunServer;
 
 static void
@@ -155,48 +154,46 @@ pending_stun_server_free (gpointer p)
 {
   PendingStunServer *data = p;
 
+  if (data->factory != NULL)
+    g_object_remove_weak_pointer (G_OBJECT (data->factory),
+        (gpointer)&data->factory);
+
+  g_object_unref (data->cancellable);
   g_free (data->stun_server);
   g_slice_free (PendingStunServer, p);
 }
 
 static void
-stun_server_resolved_cb (GibberResolver *resolver,
-                         GList *entries,
-                         GError *error,
-                         gpointer user_data,
-                         GObject *object)
+stun_server_resolved_cb (GObject *resolver,
+                         GAsyncResult *result,
+                         gpointer user_data)
 {
-  GabbleJingleFactory *self = GABBLE_JINGLE_FACTORY (object);
   PendingStunServer *data = user_data;
-  GibberResolverAddrInfo *info;
+  GabbleJingleFactory *self = data->factory;
   GError *e = NULL;
   gchar *stun_server;
+  GList *entries;
 
-  if (error != NULL)
-    {
-      DEBUG ("Failed to resolve STUN server %s:%u: %s",
-          data->stun_server, data->stun_port, error->message);
-      return;
-    }
-
-  if (entries == NULL)
-    {
-      DEBUG ("No results for STUN server %s:%u",
-          data->stun_server, data->stun_port);
-      return;
-    }
+  if (self != NULL)
+      g_object_weak_unref (G_OBJECT (self),
+          (GWeakNotify)g_cancellable_cancel, data->cancellable);
 
-  info = entries->data;
+  entries = g_resolver_lookup_by_name_finish (
+      G_RESOLVER (resolver), result, &e);
 
-  if (!gibber_resolver_sockaddr_to_str ((struct sockaddr *) &(info->sockaddr),
-        info->sockaddr_len, &stun_server, NULL, &e))
+  if (entries == NULL)
     {
-      DEBUG ("Couldn't convert resolved address of %s to string: %s",
-          data->stun_server, e->message);
+      DEBUG ("Failed to resolve STUN server %s:%u: %s",
+          data->stun_server, data->stun_port, e->message);
       g_error_free (e);
+      pending_stun_server_free (data);
+      g_object_unref (resolver);
       return;
     }
 
+  stun_server = g_inet_address_to_string (entries->data);
+  g_resolver_free_addresses (entries);
+
   DEBUG ("Resolved STUN server %s:%u to %s:%u", data->stun_server,
       data->stun_port, stun_server, data->stun_port);
 
@@ -212,6 +209,9 @@ stun_server_resolved_cb (GibberResolver *resolver,
       self->priv->stun_server = stun_server;
       self->priv->stun_port = data->stun_port;
     }
+
+  pending_stun_server_free (data);
+  g_object_unref (resolver);
 }
 
 static void
@@ -220,21 +220,29 @@ take_stun_server (GabbleJingleFactory *self,
                   guint16 stun_port,
                   gboolean fallback)
 {
-  PendingStunServer *data = g_slice_new0 (PendingStunServer);
+  GResolver *resolver;
+  PendingStunServer *data;
 
   if (stun_server == NULL)
     return;
 
+  resolver = g_resolver_get_default ();
+  data = g_slice_new0 (PendingStunServer);
+
   DEBUG ("Resolving %s STUN server %s:%u",
       fallback ? "fallback" : "primary", stun_server, stun_port);
+  data->factory = self;
+  g_object_add_weak_pointer (G_OBJECT (self), (gpointer*)&data->factory);
   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,
-      stun_server_resolved_cb, data, pending_stun_server_free,
-      G_OBJECT (self));
+  data->cancellable = g_cancellable_new ();
+  g_object_weak_ref (G_OBJECT (self), (GWeakNotify)g_cancellable_cancel,
+      data->cancellable);
+
+  g_resolver_lookup_by_name_async (resolver, stun_server,
+      data->cancellable, stun_server_resolved_cb, data);
 }
 
 
-- 
1.5.6.5




More information about the telepathy-commits mailing list