[gnio/connection-factory: 6/6] Remove socket factory from GSocketClient



commit edb075c47fd48556bcf4c84797bdce8e8fe7f194
Author: Alexander Larsson <alexl redhat com>
Date:   Fri May 8 16:21:36 2009 +0200

    Remove socket factory from GSocketClient
    
    We don't need the subclasses for this, instead we add various
    properties that control socket construction. The user can set these
    directly for general work, or subclasses can autoset them as needed.
---
 gio/gsocketclient.c |  168 ++++++++++++++++++++++++++++++++++++++++++++++++---
 gio/gsocketclient.h |    3 -
 gio/gtcpclient.c    |   12 ----
 gio/gunixclient.c   |   12 ----
 4 files changed, 160 insertions(+), 35 deletions(-)

diff --git a/gio/gsocketclient.c b/gio/gsocketclient.c
index e12ead8..6e46e02 100644
--- a/gio/gsocketclient.c
+++ b/gio/gsocketclient.c
@@ -20,8 +20,10 @@
  * Authors: Ryan Lortie <desrt desrt ca>
  */
 
+#include "config.h"
 #include "gsocketclient.h"
 
+#include <gio/gioenumtypes.h>
 #include <gio/gsocketaddressenumerator.h>
 #include <gio/gsocketconnectable.h>
 #include <gio/gsimpleasyncresult.h>
@@ -31,24 +33,174 @@
 
 G_DEFINE_TYPE (GSocketClient, g_socket_client, G_TYPE_OBJECT);
 
+enum
+{
+  PROP_NONE,
+  PROP_FAMILY,
+  PROP_TYPE,
+  PROP_PROTOCOL,
+  PROP_LOCAL_ADDRESS
+};
+
+
+struct _GSocketClientPrivate
+{
+  GSocketFamily family;
+  GSocketType type;
+  char *protocol;
+  GSocketAddress *local_address;
+};
+
 static GSocket *
-g_socket_client_real_socket_factory (GSocketClient  *client,
-                                     GSocketAddress *address,
-				     GError        **error)
+create_socket (GSocketClient  *client,
+	       GSocketAddress *dest_address,
+	       GError        **error)
 {
-  return g_socket_new (g_socket_address_get_family (address),
-                       G_SOCKET_TYPE_STREAM, NULL, error);
+  GSocketFamily family;
+
+  family = client->priv->family;
+  if (family == G_SOCKET_FAMILY_INVALID &&
+      client->priv->local_address != NULL)
+    family = g_socket_address_get_family (client->priv->local_address);
+  if (family == G_SOCKET_FAMILY_INVALID)
+    family = g_socket_address_get_family (dest_address);
+
+  return g_socket_new (family,
+		       client->priv->type,
+		       client->priv->protocol,
+		       error);
 }
 
 static void
 g_socket_client_init (GSocketClient *client)
 {
+  client->priv = G_TYPE_INSTANCE_GET_PRIVATE (client,
+					      G_TYPE_SOCKET_CLIENT,
+					      GSocketClientPrivate);
+  client->priv->type = G_SOCKET_TYPE_STREAM;
+}
+
+static void
+g_socket_client_finalize (GObject *object)
+{
+  GSocketClient *client = G_SOCKET_CLIENT (object);
+
+  if (client->priv->local_address)
+    g_object_unref (client->priv->local_address);
+
+  g_free (client->priv->protocol);
+
+  if (G_OBJECT_CLASS (g_socket_client_parent_class)->finalize)
+    (*G_OBJECT_CLASS (g_socket_client_parent_class)->finalize) (object);
+}
+
+static void
+g_socket_client_get_property (GObject    *object,
+			      guint       prop_id,
+			      GValue     *value,
+			      GParamSpec *pspec)
+{
+  GSocketClient *client = G_SOCKET_CLIENT (object);
+
+  switch (prop_id)
+    {
+      case PROP_FAMILY:
+        g_value_set_enum (value, client->priv->family);
+        break;
+
+      case PROP_TYPE:
+        g_value_set_enum (value, client->priv->type);
+        break;
+
+      case PROP_PROTOCOL:
+        g_value_set_string (value, client->priv->protocol);
+        break;
+
+      case PROP_LOCAL_ADDRESS:
+        g_value_set_object (value, client->priv->local_address);
+        break;
+
+      default:
+        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+    }
+}
+
+static void
+g_socket_client_set_property (GObject      *object,
+			      guint         prop_id,
+			      const GValue *value,
+			      GParamSpec   *pspec)
+{
+  GSocketClient *client = G_SOCKET_CLIENT (object);
+
+  switch (prop_id)
+    {
+      case PROP_FAMILY:
+        client->priv->family = g_value_get_enum (value);
+        break;
+
+      case PROP_TYPE:
+        client->priv->type = g_value_get_enum (value);
+        break;
+
+      case PROP_PROTOCOL:
+        client->priv->protocol = g_value_dup_string (value);
+        break;
+
+      case PROP_LOCAL_ADDRESS:
+	client->priv->local_address = g_value_dup_object (value);
+        break;
+
+      default:
+        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+    }
 }
 
 static void
 g_socket_client_class_init (GSocketClientClass *class)
 {
-  class->socket_factory = g_socket_client_real_socket_factory;
+  GObjectClass *gobject_class = G_OBJECT_CLASS (class);
+
+  g_type_class_add_private (class, sizeof (GSocketClientPrivate));
+
+  gobject_class->finalize = g_socket_client_finalize;
+  gobject_class->set_property = g_socket_client_set_property;
+  gobject_class->get_property = g_socket_client_get_property;
+
+  g_object_class_install_property (gobject_class, PROP_FAMILY,
+                                   g_param_spec_enum ("family",
+                                                      P_("Socket family"),
+                                                      P_("The sockets address family to use for socket construction"),
+                                                      G_TYPE_SOCKET_FAMILY,
+                                                      G_SOCKET_FAMILY_INVALID,
+                                                      G_PARAM_CONSTRUCT | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+  /* TODO: Make real enum gtype for GSocketType */
+  g_object_class_install_property (gobject_class, PROP_TYPE,
+                                   g_param_spec_int ("type",
+						     P_("Socket type"),
+						     P_("The sockets type to use for socket construction"),
+#if 1 /* not enum */
+						     0, G_MAXINT,
+#else
+						     //G_TYPE_SOCKET_TYPE,
+#endif
+						     G_SOCKET_TYPE_STREAM,
+						     G_PARAM_CONSTRUCT | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+  g_object_class_install_property (gobject_class, PROP_PROTOCOL,
+                                   g_param_spec_string ("protocol",
+							P_("Socket protocol"),
+							P_("The protocol to use for socket construction"),
+							NULL,
+							G_PARAM_CONSTRUCT | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+  g_object_class_install_property (gobject_class, PROP_LOCAL_ADDRESS,
+                                   g_param_spec_object ("local-address",
+                                                        P_("Local address"),
+                                                        P_("The local address constructed sockets will be bound to"),
+                                                        G_TYPE_SOCKET_ADDRESS,
+                                                        G_PARAM_CONSTRUCT | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 }
 
 GSocketConnection *
@@ -85,7 +237,7 @@ g_socket_client_connect (GSocketClient       *client,
       if (error && *error)
         g_clear_error (error);
 
-      socket = class->socket_factory (client, address, error);
+      socket = create_socket (client, address, error);
       if (socket != NULL)
 	{
 	  if (g_socket_connect (socket, address, error))
@@ -219,7 +371,7 @@ g_socket_client_enumerator_callback (GObject      *object,
       GSocket *socket;
 
       class = G_SOCKET_CLIENT_GET_CLASS (data->client);
-      socket = class->socket_factory (data->client, address, &tmp_error);
+      socket = create_socket (data->client, address, &tmp_error);
 
       if (socket == NULL)
 	{
diff --git a/gio/gsocketclient.h b/gio/gsocketclient.h
index cef9e99..56a32fd 100644
--- a/gio/gsocketclient.h
+++ b/gio/gsocketclient.h
@@ -43,9 +43,6 @@ struct _GSocketClientClass
 {
   GObjectClass parent_class;
 
-  GSocket           * (* socket_factory)      (GSocketClient  *client,
-                                               GSocketAddress *address,
-					       GError        **error);
   gpointer padding[5];
 };
 
diff --git a/gio/gtcpclient.c b/gio/gtcpclient.c
index 3ca2e08..4647507 100644
--- a/gio/gtcpclient.c
+++ b/gio/gtcpclient.c
@@ -621,15 +621,6 @@ g_tcp_client_connect_to_service_finish (GTcpClient    *client,
   return g_tcp_client_connect_finish (client, result, error);
 }
 
-static GSocket *
-g_tcp_client_socket_factory (GSocketClient  *client,
-                             GSocketAddress *address,
-			     GError **error)
-{
-  return G_SOCKET_CLIENT_CLASS (g_tcp_client_parent_class)
-    ->socket_factory (client, address, error);
-}
-
 static void
 g_tcp_client_init (GTcpClient *client)
 {
@@ -638,9 +629,6 @@ g_tcp_client_init (GTcpClient *client)
 static void
 g_tcp_client_class_init (GTcpClientClass *class)
 {
-  GSocketClientClass *sc_class = G_SOCKET_CLIENT_CLASS (class);
-
-  sc_class->socket_factory = g_tcp_client_socket_factory;
 }
 
 /**
diff --git a/gio/gunixclient.c b/gio/gunixclient.c
index 3391d6d..f6a1b79 100644
--- a/gio/gunixclient.c
+++ b/gio/gunixclient.c
@@ -150,15 +150,6 @@ g_unix_client_connect_to_path_finish (GUnixClient   *client,
   return g_unix_client_connect_finish (client, result, error);
 }
 
-static GSocket *
-g_unix_client_socket_factory (GSocketClient  *client,
-			      GSocketAddress *address,
-			      GError **error)
-{
-  return G_SOCKET_CLIENT_CLASS (g_unix_client_parent_class)
-    ->socket_factory (client, address, error);
-}
-
 static void
 g_unix_client_init (GUnixClient *client)
 {
@@ -167,9 +158,6 @@ g_unix_client_init (GUnixClient *client)
 static void
 g_unix_client_class_init (GUnixClientClass *class)
 {
-  GSocketClientClass *sc_class = G_SOCKET_CLIENT_CLASS (class);
-
-  sc_class->socket_factory = g_unix_client_socket_factory;
 }
 
 GUnixClient *



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