From: Samuel Cormier-Iijima Date: Tue, 26 Feb 2008 22:51:00 +0000 (-0500) Subject: Make things inherit from GInitiallyUnowned, some more socket changes X-Git-Url: http://git.cascardo.eti.br/?p=cascardo%2Fgnio.git;a=commitdiff_plain;h=e565d23487b351658be8d8bc374d847c09b7a0cf Make things inherit from GInitiallyUnowned, some more socket changes --- diff --git a/gnio/ginetaddress.c b/gnio/ginetaddress.c index 809aaca..fbf8c67 100644 --- a/gnio/ginetaddress.c +++ b/gnio/ginetaddress.c @@ -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 { diff --git a/gnio/ginetaddress.h b/gnio/ginetaddress.h index 6f01c7b..19bb313 100644 --- a/gnio/ginetaddress.h +++ b/gnio/ginetaddress.h @@ -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); diff --git a/gnio/ginetsocketaddress.c b/gnio/ginetsocketaddress.c index 5913aee..60fe284 100644 --- a/gnio/ginetsocketaddress.c +++ b/gnio/ginetsocketaddress.c @@ -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) { diff --git a/gnio/gsocket.c b/gnio/gsocket.c index 42b6394..3cf7534 100644 --- a/gnio/gsocket.c +++ b/gnio/gsocket.c @@ -45,11 +45,50 @@ 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; } diff --git a/gnio/gsocket.h b/gnio/gsocket.h index 7a0a568..0571108 100644 --- a/gnio/gsocket.h +++ b/gnio/gsocket.h @@ -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); diff --git a/gnio/gsocketaddress.c b/gnio/gsocketaddress.c index 0f904cc..6f362ac 100644 --- a/gnio/gsocketaddress.c +++ b/gnio/gsocketaddress.c @@ -26,12 +26,12 @@ #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 diff --git a/gnio/gsocketaddress.h b/gnio/gsocketaddress.h index 985ae5f..a770574 100644 --- a/gnio/gsocketaddress.h +++ b/gnio/gsocketaddress.h @@ -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); diff --git a/test/test-server.c b/test/test-server.c index 0bbdb0e..e50326a 100644 --- a/test/test-server.c +++ b/test/test-server.c @@ -8,7 +8,6 @@ GMainLoop *loop; int main (int argc, char *argv[]) { GSocket *socket; - GError *error = NULL; g_thread_init (NULL); diff --git a/test/test-stuff.c b/test/test-stuff.c index b92b209..4209e86 100644 --- a/test/test-stuff.c +++ b/test/test-stuff.c @@ -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));