[glib] Added GProxyAddressEnumerator to proxy sample code



commit 6749ffce594b146ef49c8fe014bfa8b0272b6b9f
Author: Nicolas Dufresne <nicolas dufresne collabora co uk>
Date:   Fri May 7 16:27:34 2010 -0400

    Added GProxyAddressEnumerator to proxy sample code

 gio/tests/proxy.c |  133 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 133 insertions(+), 0 deletions(-)
---
diff --git a/gio/tests/proxy.c b/gio/tests/proxy.c
index e5dedb6..4385187 100644
--- a/gio/tests/proxy.c
+++ b/gio/tests/proxy.c
@@ -41,6 +41,7 @@ usage (void)
   fprintf (stderr, "Usage: proxy [-s] uri\n");
   fprintf (stderr, "       Use -s to do synchronous lookups.\n");
   fprintf (stderr, "       Use -c to cancel operation.\n");
+  fprintf (stderr, "       Use -e to use enumerator.\n");
   exit (1);
 }
 
@@ -125,9 +126,136 @@ use_resolver (gboolean synchronous)
     }
 }
 
+static void
+print_proxy_address (GSocketAddress *sockaddr)
+{
+  GProxyAddress *proxy = NULL;
+
+  if (sockaddr == NULL)
+    {
+      printf ("\tdirect://\n");
+      return;
+    }
+
+  if (G_IS_PROXY_ADDRESS (sockaddr))
+    {
+      proxy = G_PROXY_ADDRESS (sockaddr);
+      printf ("\t%s://", g_proxy_address_get_protocol(proxy));
+    }
+  else
+    {
+      printf ("\tdirect://");
+    }
+
+  if (G_IS_INET_SOCKET_ADDRESS (sockaddr))
+    {
+      GInetAddress *inetaddr;
+      guint port;
+      gchar *addr;
+
+      g_object_get (sockaddr,
+		    "address", &inetaddr,
+		    "port", &port,
+		    NULL);
+
+      addr = g_inet_address_to_string (inetaddr);
+
+      printf ("%s:%u", addr, port);
+
+      g_free (addr);
+    }
+
+  if (proxy && g_proxy_address_get_username(proxy))
+    printf ("\t(Username: %s  Password: %s)",
+	    g_proxy_address_get_username(proxy),
+	    g_proxy_address_get_password(proxy));
+
+  printf ("\n");
+}
+
+static void
+_proxy_enumerate_cb (GObject *object,
+		     GAsyncResult *result,
+		     gpointer user_data)
+{
+  GError *error = NULL;
+  GMainLoop *loop = user_data;
+  GSocketAddressEnumerator *enumerator = G_SOCKET_ADDRESS_ENUMERATOR (object);
+  GSocketAddress *sockaddr;
+
+  sockaddr = g_socket_address_enumerator_next_finish (enumerator,
+						      result,
+						      &error);
+  if (sockaddr)
+    {
+      print_proxy_address (sockaddr);
+      g_socket_address_enumerator_next_async (enumerator,
+                                              cancellable,
+					      _proxy_enumerate_cb,
+					      loop);
+      g_object_unref (sockaddr);
+    }
+  else
+    {
+      if (error)
+	print_and_free_error (error);
+
+      g_main_loop_quit (loop);
+    }
+}
+
+static void
+run_with_enumerator (gboolean synchronous, GSocketAddressEnumerator *enumerator)
+{
+  GError *error = NULL;
+
+  if (synchronous)
+    {
+      GSocketAddress *sockaddr;
+
+      while ((sockaddr = g_socket_address_enumerator_next(enumerator,
+							  cancellable,
+							  &error)))
+	{
+	  print_proxy_address (sockaddr);
+	  g_object_unref (sockaddr);
+	}
+
+      if (error)
+	print_and_free_error (error);
+    }
+  else
+    {
+      GMainLoop *loop = g_main_loop_new (NULL, FALSE);
+
+      g_socket_address_enumerator_next_async (enumerator,
+                                              cancellable,
+					      _proxy_enumerate_cb,
+					      loop);
+      g_main_loop_run (loop);
+      g_main_loop_unref (loop);
+    }
+}
+
+static void
+use_enumerator (gboolean synchronous)
+{
+  GSocketAddressEnumerator *enumerator;
+
+  enumerator = g_object_new (G_TYPE_PROXY_ADDRESS_ENUMERATOR,
+			     "uri", uri,
+			     NULL);
+
+  printf ("Proxies for URI '%s' are:\n", uri);
+  run_with_enumerator (synchronous, enumerator);
+
+  g_object_unref (enumerator);
+}
+
 typedef enum
 {
   USE_RESOLVER,
+  USE_ENUMERATOR,
 } ProxyTestType;
 
 gint
@@ -145,6 +273,8 @@ main (gint argc, gchar **argv)
         synchronous = TRUE;
       else if (!strcmp (argv[1], "-c"))
         cancel = TRUE;
+      else if (!strcmp (argv[1], "-e"))
+        type = USE_ENUMERATOR;
       else
 	usage ();
 
@@ -169,6 +299,9 @@ main (gint argc, gchar **argv)
     case USE_RESOLVER:
       use_resolver (synchronous);
       break;
+    case USE_ENUMERATOR:
+      use_enumerator (synchronous);
+      break;
     }
 
   return return_value;



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]