struct _GInetAddress
{
- GObject parent;
+ GInitiallyUnowned parent;
};
struct _GInetAddressClass
{
- GObjectClass parent_class;
+ GInitiallyUnownedClass parent_class;
gchar * (*to_string) (GInetAddress *address);
gboolean (*is_any) (GInetAddress *address);
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);
{
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);
}
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:
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)
{
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)
{
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;
}
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,
GAsyncResult *result,
GError **error)
{
-
+ return FALSE;
}