X-Git-Url: http://git.cascardo.eti.br/?p=cascardo%2Fgnio.git;a=blobdiff_plain;f=gnio%2Fgnetworkoutputstream.c;h=b7e9ea64e29a7c20fdbab05dcc955c271722169f;hp=c32a470398c7ac3bf39b6b47991387a38138a9d8;hb=08b3eba2ce5f8beafb2b8cb8fc8b08c9676adf5f;hpb=e7aa65fdc44e1989fd837b56db4af59c765f8489 diff --git a/gnio/gnetworkoutputstream.c b/gnio/gnetworkoutputstream.c index c32a470..b7e9ea6 100644 --- a/gnio/gnetworkoutputstream.c +++ b/gnio/gnetworkoutputstream.c @@ -25,18 +25,119 @@ #include #include +#include "gsocket.h" #include "gnetworkoutputstream.h" G_DEFINE_TYPE (GNetworkOutputStream, g_network_output_stream, G_TYPE_OUTPUT_STREAM); +enum +{ + PROP_0, + PROP_SOCKET +}; + +struct _GNetworkOutputStreamPrivate +{ + GSocket *socket; +}; + +static void +g_network_output_stream_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GNetworkOutputStream *stream = G_NETWORK_OUTPUT_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_output_stream_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GNetworkOutputStream *stream = G_NETWORK_OUTPUT_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_output_stream_finalize (GObject *object) +{ + if (G_OBJECT_CLASS (g_network_output_stream_parent_class)->finalize) + (*G_OBJECT_CLASS (g_network_output_stream_parent_class)->finalize) (object); +} + +static void +g_network_output_stream_dispose (GObject *object) +{ + if (G_OBJECT_CLASS (g_network_output_stream_parent_class)->dispose) + (*G_OBJECT_CLASS (g_network_output_stream_parent_class)->dispose) (object); +} + +static gssize +g_network_output_stream_write (GOutputStream *stream, + const void *buffer, + gsize count, + GCancellable *cancellable, + GError **error) +{ + GNetworkOutputStream *output_stream = G_NETWORK_OUTPUT_STREAM (stream); + + return g_socket_send (output_stream->priv->socket, (const gchar *) buffer, count, error); +} + static void g_network_output_stream_class_init (GNetworkOutputStreamClass *klass) { - GObjectClass *gobject_class G_GNUC_UNUSED = G_OBJECT_CLASS (klass); + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + GOutputStreamClass *goutputstream_class = G_OUTPUT_STREAM_CLASS (klass); + + g_type_class_add_private (klass, sizeof (GNetworkOutputStreamPrivate)); + + gobject_class->finalize = g_network_output_stream_finalize; + gobject_class->dispose = g_network_output_stream_dispose; + gobject_class->get_property = g_network_output_stream_get_property; + gobject_class->set_property = g_network_output_stream_set_property; + + goutputstream_class->write_fn = g_network_output_stream_write; + + 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_output_stream_init (GNetworkOutputStream *address) +g_network_output_stream_init (GNetworkOutputStream *stream) { + stream->priv = G_TYPE_INSTANCE_GET_PRIVATE (stream, G_TYPE_NETWORK_OUTPUT_STREAM, GNetworkOutputStreamPrivate); + + stream->priv->socket = NULL; +} +GNetworkOutputStream * +_g_network_output_stream_new (GSocket *socket) +{ + return G_NETWORK_OUTPUT_STREAM (g_object_new (G_TYPE_NETWORK_OUTPUT_STREAM, "socket", socket, NULL)); }