X-Git-Url: http://git.cascardo.eti.br/?p=cascardo%2Fgnio.git;a=blobdiff_plain;f=gnio%2Fgnetworkinputstream.c;h=48ecf8c4ff1eadcbff7bbcc5677673a7c4a0dc83;hp=a7bdbb6d1599e6bebcd0e48599130f9371e8cc4d;hb=08b3eba2ce5f8beafb2b8cb8fc8b08c9676adf5f;hpb=e7aa65fdc44e1989fd837b56db4af59c765f8489 diff --git a/gnio/gnetworkinputstream.c b/gnio/gnetworkinputstream.c index a7bdbb6..48ecf8c 100644 --- a/gnio/gnetworkinputstream.c +++ b/gnio/gnetworkinputstream.c @@ -25,18 +25,119 @@ #include #include +#include "gsocket.h" #include "gnetworkinputstream.h" G_DEFINE_TYPE (GNetworkInputStream, g_network_input_stream, G_TYPE_INPUT_STREAM); +enum +{ + PROP_0, + PROP_SOCKET +}; + +struct _GNetworkInputStreamPrivate +{ + GSocket *socket; +}; + +static void +g_network_input_stream_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GNetworkInputStream *stream = G_NETWORK_INPUT_STREAM (object); + + switch (prop_id) + { + case PROP_SOCKET: + g_value_set_object (value, stream->priv->socket); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } +} + +static void +g_network_input_stream_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GNetworkInputStream *stream = G_NETWORK_INPUT_STREAM (object); + + switch (prop_id) + { + case PROP_SOCKET: + stream->priv->socket = g_value_dup_object (value); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } +} + +static void +g_network_input_stream_finalize (GObject *object) +{ + if (G_OBJECT_CLASS (g_network_input_stream_parent_class)->finalize) + (*G_OBJECT_CLASS (g_network_input_stream_parent_class)->finalize) (object); +} + +static void +g_network_input_stream_dispose (GObject *object) +{ + if (G_OBJECT_CLASS (g_network_input_stream_parent_class)->dispose) + (*G_OBJECT_CLASS (g_network_input_stream_parent_class)->dispose) (object); +} + +static gssize +g_network_input_stream_read (GInputStream *stream, + void *buffer, + gsize count, + GCancellable *cancellable, + GError **error) +{ + GNetworkInputStream *input_stream = G_NETWORK_INPUT_STREAM (stream); + + return g_socket_receive (input_stream->priv->socket, (gchar *) buffer, count, error); +} + static void g_network_input_stream_class_init (GNetworkInputStreamClass *klass) { - GObjectClass *gobject_class G_GNUC_UNUSED = G_OBJECT_CLASS (klass); + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + GInputStreamClass *ginputstream_class = G_INPUT_STREAM_CLASS (klass); + + g_type_class_add_private (klass, sizeof (GNetworkInputStreamPrivate)); + + gobject_class->finalize = g_network_input_stream_finalize; + gobject_class->dispose = g_network_input_stream_dispose; + gobject_class->get_property = g_network_input_stream_get_property; + gobject_class->set_property = g_network_input_stream_set_property; + + ginputstream_class->read_fn = g_network_input_stream_read; + + g_object_class_install_property (gobject_class, PROP_SOCKET, + g_param_spec_object ("socket", + "socket", + "the socket that this stream wraps", + G_TYPE_SOCKET, + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE | G_PARAM_STATIC_NAME | G_PARAM_STATIC_BLURB | G_PARAM_STATIC_NICK)); } static void -g_network_input_stream_init (GNetworkInputStream *address) +g_network_input_stream_init (GNetworkInputStream *stream) { + stream->priv = G_TYPE_INSTANCE_GET_PRIVATE (stream, G_TYPE_NETWORK_INPUT_STREAM, GNetworkInputStreamPrivate); + + stream->priv->socket = NULL; +} +GNetworkInputStream * +_g_network_input_stream_new (GSocket *socket) +{ + return G_NETWORK_INPUT_STREAM (g_object_new (G_TYPE_NETWORK_INPUT_STREAM, "socket", socket, NULL)); }