#include <glib.h>
#include <gio/gio.h>
+#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));
}