[glib] GSocketClient: add a timeout property



commit 16bafb479995e69417b86b5b26682ec7c2ceb5a0
Author: Dan Winship <danw gnome org>
Date:   Sat Aug 14 15:04:24 2010 -0400

    GSocketClient: add a timeout property
    
    GSocket has a timeout flag now, but when using GSocketClient there was
    no way to set the timeout until after connecting (or failing). Fix
    that by adding a timeout property to GSocketClient.

 gio/gsocketclient.c   |   69 ++++++++++++++++++++++++++++++++++++++++++++++++-
 gio/gsocketclient.h   |    3 ++
 gio/tests/send-data.c |    5 +++
 3 files changed, 76 insertions(+), 1 deletions(-)
---
diff --git a/gio/gsocketclient.c b/gio/gsocketclient.c
index d0266ff..37b0b59 100644
--- a/gio/gsocketclient.c
+++ b/gio/gsocketclient.c
@@ -70,7 +70,8 @@ enum
   PROP_FAMILY,
   PROP_TYPE,
   PROP_PROTOCOL,
-  PROP_LOCAL_ADDRESS
+  PROP_LOCAL_ADDRESS,
+  PROP_TIMEOUT
 };
 
 struct _GSocketClientPrivate
@@ -79,6 +80,7 @@ struct _GSocketClientPrivate
   GSocketType type;
   GSocketProtocol protocol;
   GSocketAddress *local_address;
+  guint timeout;
 };
 
 static GSocket *
@@ -115,6 +117,9 @@ create_socket (GSocketClient  *client,
 	}
     }
 
+  if (client->priv->timeout)
+    g_socket_set_timeout (socket, client->priv->timeout);
+
   return socket;
 }
 
@@ -181,6 +186,10 @@ g_socket_client_get_property (GObject    *object,
 	g_value_set_object (value, client->priv->local_address);
 	break;
 
+      case PROP_TIMEOUT:
+	g_value_set_uint (value, client->priv->timeout);
+	break;
+
       default:
 	G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
     }
@@ -212,6 +221,10 @@ g_socket_client_set_property (GObject      *object,
       g_socket_client_set_local_address (client, g_value_get_object (value));
       break;
 
+    case PROP_TIMEOUT:
+      g_socket_client_set_timeout (client, g_value_get_uint (value));
+      break;
+
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
     }
@@ -396,6 +409,50 @@ g_socket_client_set_local_address (GSocketClient  *client,
   g_object_notify (G_OBJECT (client), "local-address");
 }
 
+/**
+ * g_socket_client_get_timeout:
+ * @client: a #GSocketClient
+ *
+ * Gets the I/O timeout time for sockets created by @client.
+ *
+ * See g_socket_client_set_timeout() for details.
+ *
+ * Returns: the timeout in seconds
+ *
+ * Since: 2.26
+ */
+guint
+g_socket_client_get_timeout (GSocketClient *client)
+{
+  return client->priv->timeout;
+}
+
+
+/**
+ * g_socket_client_set_timeout:
+ * @client: a #GSocketClient.
+ * @timeout: the timeout
+ *
+ * Sets the I/O timeout for sockets created by @client. @timeout is a
+ * time in seconds, or 0 for no timeout (the default).
+ *
+ * The timeout value affects the initial connection attempt as well,
+ * so setting this may cause calls to g_socket_client_connect(), etc,
+ * to fail with %G_IO_ERROR_TIMED_OUT.
+ *
+ * Since: 2.26
+ */
+void
+g_socket_client_set_timeout (GSocketClient *client,
+			     guint          timeout)
+{
+  if (client->priv->timeout == timeout)
+    return;
+
+  client->priv->timeout = timeout;
+  g_object_notify (G_OBJECT (client), "timeout");
+}
+
 static void
 g_socket_client_class_init (GSocketClientClass *class)
 {
@@ -445,6 +502,16 @@ g_socket_client_class_init (GSocketClientClass *class)
 							G_PARAM_CONSTRUCT |
                                                         G_PARAM_READWRITE |
                                                         G_PARAM_STATIC_STRINGS));
+
+  g_object_class_install_property (gobject_class, PROP_TIMEOUT,
+				   g_param_spec_uint ("timeout",
+						      P_("Socket timeout"),
+						      P_("The I/O timeout for sockets, or 0 for none"),
+						      0, G_MAXUINT, 0,
+						      G_PARAM_CONSTRUCT |
+                                                      G_PARAM_READWRITE |
+                                                      G_PARAM_STATIC_STRINGS));
+
 }
 
 /**
diff --git a/gio/gsocketclient.h b/gio/gsocketclient.h
index 0576614..df9f5a2 100644
--- a/gio/gsocketclient.h
+++ b/gio/gsocketclient.h
@@ -82,6 +82,9 @@ void                    g_socket_client_set_protocol                    (GSocket
 GSocketAddress         *g_socket_client_get_local_address               (GSocketClient        *client);
 void                    g_socket_client_set_local_address               (GSocketClient        *client,
 									 GSocketAddress       *address);
+guint                   g_socket_client_get_timeout                     (GSocketClient        *client);
+void                    g_socket_client_set_timeout                     (GSocketClient        *client,
+									 guint                 timeout);
 
 GSocketConnection *     g_socket_client_connect                         (GSocketClient        *client,
                                                                          GSocketConnectable   *connectable,
diff --git a/gio/tests/send-data.c b/gio/tests/send-data.c
index a2592ce..189aed2 100644
--- a/gio/tests/send-data.c
+++ b/gio/tests/send-data.c
@@ -5,6 +5,7 @@
 GMainLoop *loop;
 
 int cancel_timeout = 0;
+int io_timeout = 0;
 gboolean async = FALSE;
 gboolean graceful = FALSE;
 static GOptionEntry cmd_entries[] = {
@@ -14,6 +15,8 @@ static GOptionEntry cmd_entries[] = {
    "Use async ops", NULL},
   {"graceful-disconnect", 'g', 0, G_OPTION_ARG_NONE, &graceful,
    "Use graceful disconnect", NULL},
+  {"timeout", 't', 0, G_OPTION_ARG_INT, &io_timeout,
+   "Time out socket I/O after the specified number of seconds", NULL},
   {NULL}
 };
 
@@ -97,6 +100,8 @@ main (int argc, char *argv[])
     }
 
   client = g_socket_client_new ();
+  if (io_timeout)
+    g_socket_client_set_timeout (client, io_timeout);
 
   if (async)
     {



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