Make things inherit from GInitiallyUnowned, some more socket changes
authorSamuel Cormier-Iijima <sciyoshi@gmail.com>
Tue, 26 Feb 2008 22:51:00 +0000 (17:51 -0500)
committerSamuel Cormier-Iijima <sciyoshi@gmail.com>
Tue, 26 Feb 2008 22:51:00 +0000 (17:51 -0500)
gnio/ginetaddress.c
gnio/ginetaddress.h
gnio/ginetsocketaddress.c
gnio/gsocket.c
gnio/gsocket.h
gnio/gsocketaddress.c
gnio/gsocketaddress.h
test/test-server.c
test/test-stuff.c

index 809aaca..fbf8c67 100644 (file)
@@ -34,7 +34,7 @@
  * 
  **/
 
-G_DEFINE_ABSTRACT_TYPE (GInetAddress, g_inet_address, G_TYPE_OBJECT);
+G_DEFINE_ABSTRACT_TYPE (GInetAddress, g_inet_address, G_TYPE_INITIALLY_UNOWNED);
 
 enum
 {
index 6f01c7b..19bb313 100644 (file)
@@ -41,12 +41,12 @@ typedef struct _GInetAddressClass   GInetAddressClass;
 
 struct _GInetAddress
 {
-  GObject parent;
+  GInitiallyUnowned parent;
 };
 
 struct _GInetAddressClass
 {
-  GObjectClass parent_class;
+  GInitiallyUnownedClass parent_class;
 
   gchar *  (*to_string) (GInetAddress *address);
   gboolean (*is_any) (GInetAddress *address);
@@ -65,10 +65,6 @@ GType           g_inet_address_get_type        (void) G_GNUC_CONST;
 
 gchar *         g_inet_address_to_string       (GInetAddress *address);
 
-gsize           g_inet_address_sockaddr_size   (GInetAddress *address);
-
-gboolean        g_inet_address_to_sockaddr     (GInetAddress *address, gpointer dest);
-
 gboolean        g_inet_address_is_any          (GInetAddress *address);
 
 gboolean        g_inet_address_is_linklocal    (GInetAddress *address);
index 5913aee..60fe284 100644 (file)
@@ -60,6 +60,8 @@ g_inet_socket_address_dispose (GObject *object)
 {
   GInetSocketAddress *address G_GNUC_UNUSED = G_INET_SOCKET_ADDRESS (object);
 
+  g_object_unref (address->priv->address);
+
   if (G_OBJECT_CLASS (g_inet_socket_address_parent_class)->dispose)
     (*G_OBJECT_CLASS (g_inet_socket_address_parent_class)->dispose) (object);
 }
@@ -92,7 +94,7 @@ g_inet_socket_address_set_property (GObject *object, guint prop_id, const GValue
   switch (prop_id)
     {
       case PROP_ADDRESS:
-        address->priv->address = G_INET_ADDRESS (g_value_get_object (value));
+        address->priv->address = G_INET_ADDRESS (g_object_ref_sink (g_value_get_object (value)));
         break;
 
       case PROP_PORT:
@@ -192,10 +194,9 @@ g_inet_socket_address_init (GInetSocketAddress *address)
 GInetSocketAddress *
 g_inet_socket_address_new (GInetAddress *address, guint16 port)
 {
-  return NULL;
+  return G_INET_SOCKET_ADDRESS (g_object_new (G_TYPE_INET_SOCKET_ADDRESS, "address", address, "port", port, NULL));
 }
 
-
 GInetAddress *
 g_inet_socket_address_get_address (GInetSocketAddress *sockaddr)
 {
index 42b6394..3cf7534 100644 (file)
 
 G_DEFINE_TYPE (GSocket, g_socket, G_TYPE_OBJECT);
 
+enum
+{
+  PROP_0,
+  PROP_FD
+};
+
 struct _GSocketPrivate
 {
-  int fd;
+  gint fd;
+  gboolean blocking;
 };
 
+static void
+g_socket_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec)
+{
+  GSocket *socket = G_SOCKET (object);
+
+  switch (prop_id)
+    {
+      case PROP_FD:
+        g_value_set_int (value, socket->priv->fd);
+        break;
+
+      default:
+        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+    }
+}
+
+static void
+g_socket_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec)
+{
+  GSocket *socket = G_SOCKET (object);
+
+  switch (prop_id)
+    {
+      case PROP_FD:
+        socket->priv->fd = g_value_get_int (value);
+        break;
+
+      default:
+        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+    }
+}
+
 static void
 g_socket_finalize (GObject *object)
 {
@@ -77,28 +116,41 @@ g_socket_class_init (GSocketClass *klass)
 
   gobject_class->finalize = g_socket_finalize;
   gobject_class->dispose = g_socket_dispose;
+  gobject_class->set_property = g_socket_set_property;
+  gobject_class->get_property = g_socket_get_property;
 }
 
 static void
-g_socket_init (GSocket *address)
+g_socket_init (GSocket *socket)
 {
-  address->priv = G_TYPE_INSTANCE_GET_PRIVATE (address, G_TYPE_SOCKET, GSocketPrivate);
+  socket->priv = G_TYPE_INSTANCE_GET_PRIVATE (socket, G_TYPE_SOCKET, GSocketPrivate);
+
+  socket->priv->fd = -1;
+  socket->priv->blocking = TRUE;
 }
 
 GSocket *
-g_socket_new ()
+g_socket_new (gint domain, gint type, gint protocol)
 {
-  return G_SOCKET (g_object_new (G_TYPE_SOCKET, NULL));
+  gint sock;
+
+  sock = socket(domain, type, protocol);
+
+  if (sock < 0)
+    return NULL;
+
+  return G_SOCKET (g_object_new (G_TYPE_SOCKET, "fd", sock, NULL));
 }
 
 GSocket *
 g_socket_new_from_fd (gint fd)
 {
-  return G_SOCKET (g_object_new (G_TYPE_SOCKET, NULL));
+  return G_SOCKET (g_object_new (G_TYPE_SOCKET, "fd", fd, NULL));
 }
 
 void
-g_socket_set_blocking (GSocket *socket, gboolean blocking)
+g_socket_set_blocking (GSocket  *socket,
+                       gboolean  blocking)
 {
   glong arg;
 
@@ -114,13 +166,39 @@ g_socket_set_blocking (GSocket *socket, gboolean blocking)
 }
 
 void
-g_socket_listen (GSocket *socket, gint backlog)
+g_socket_listen (GSocket *socket,
+                 gint     backlog)
 {
   g_return_if_fail (G_IS_SOCKET (socket));
 
   listen (socket->priv->fd, backlog);
 }
 
+gboolean
+g_socket_bind (GSocket         *socket,
+               GSocketAddress  *address,
+               GError         **error)
+{
+  g_return_val_if_fail (G_IS_SOCKET (socket) && G_IS_SOCKET_ADDRESS (address), FALSE);
+
+  {
+    gchar addr[g_socket_address_native_size (address)];
+
+    if (!g_socket_address_to_native (address, addr))
+      return FALSE;
+
+    if (bind (socket->priv->fd, (struct sockaddr *) addr, g_socket_address_native_size (address)) < 0)
+      {
+        // TODO: set error
+        return FALSE;
+      }
+
+    g_object_unref (address);
+
+    return TRUE;
+  }
+}
+
 gboolean
 g_socket_connect (GSocket         *socket,
                   GSocketAddress  *address,
@@ -156,5 +234,5 @@ g_socket_connect_finish (GSocket       *socket,
                          GAsyncResult  *result,
                          GError       **error)
 {
-
+  return FALSE;
 }
index 7a0a568..0571108 100644 (file)
@@ -57,7 +57,7 @@ struct _GSocketClass
 
 GType          g_socket_get_type         (void) G_GNUC_CONST;
 
-GSocket *      g_socket_new              (void);
+GSocket *      g_socket_new              (gint domain, gint type, gint protocol);
 
 GSocket *      g_socket_new_from_fd      (gint fd);
 
index 0f904cc..6f362ac 100644 (file)
 
 #include "gsocketaddress.h"
 
-G_DEFINE_ABSTRACT_TYPE (GSocketAddress, g_socket_address, G_TYPE_OBJECT);
+G_DEFINE_ABSTRACT_TYPE (GSocketAddress, g_socket_address, G_TYPE_INITIALLY_UNOWNED);
 
 static void
 g_socket_address_class_init (GSocketAddressClass *klass)
 {
-  GObjectClass *gobject_class G_GNUC_UNUSED = G_OBJECT_CLASS (klass);
+
 }
 
 static void
index 985ae5f..a770574 100644 (file)
@@ -40,12 +40,12 @@ typedef struct _GSocketAddressClass   GSocketAddressClass;
 
 struct _GSocketAddress
 {
-  GObject parent;
+  GInitiallyUnowned parent;
 };
 
 struct _GSocketAddressClass
 {
-  GObjectClass parent_class;
+  GInitiallyUnownedClass parent_class;
 
   gssize (*native_size) (GSocketAddress *address);
 
index 0bbdb0e..e50326a 100644 (file)
@@ -8,7 +8,6 @@ GMainLoop *loop;
 int main (int argc, char *argv[])
 {
        GSocket *socket;
-       GError *error = NULL;
 
        g_thread_init (NULL);
 
index b92b209..4209e86 100644 (file)
@@ -72,6 +72,8 @@ int main (int argc, char *argv[])
 
        address = (GInetAddress *) g_inet4_address_from_string ("127.0.0.1");
 
+       g_printf ("is floating: %d\n", g_object_is_floating (address));
+
        g_printf ("%s:\n", g_inet_address_to_string (address));
 
        g_printf ("is_any: %d, is_linklocal: %d, is_loopback: %d\n", g_inet_address_is_any (address), g_inet_address_is_linklocal (address), g_inet_address_is_loopback (address));