* Author: Christian Kellner <gicmo@gnome.org>
*/
-#include <config.h>
+#include "config.h"
#include "gbufferedoutputstream.h"
#include "goutputstream.h"
#include "gsimpleasyncresult.h"
/**
* SECTION:gbufferedoutputstream
* @short_description: Buffered Output Stream
- * @see_also: #GFilterOutputStream, #GOutputStream.
+ * @include: gio/gio.h
+ * @see_also: #GFilterOutputStream, #GOutputStream
*
* Buffered output stream implements #GFilterOutputStream and provides
* for buffered writes.
*
* By default, #GBufferedOutputStream's buffer size is set at 4 kilobytes.
*
- * To create a buffered output stream, use g_buffered_output_stream_new(), or
- * g_buffered_output_stream_new_sized() to specify the buffer's size at construction.
+ * To create a buffered output stream, use g_buffered_output_stream_new(),
+ * or g_buffered_output_stream_new_sized() to specify the buffer's size
+ * at construction.
*
* To get the size of a buffer within a buffered input stream, use
* g_buffered_output_stream_get_buffer_size(). To change the size of a
- * buffered output stream's buffer, use g_buffered_output_stream_set_buffer_size().
- * Note: the buffer's size cannot be reduced below the size of the data within the
- * buffer.
- *
+ * buffered output stream's buffer, use
+ * g_buffered_output_stream_set_buffer_size(). Note that the buffer's
+ * size cannot be reduced below the size of the data within the buffer.
**/
-
-
#define DEFAULT_BUFFER_SIZE 4096
struct _GBufferedOutputStreamPrivate {
enum {
PROP_0,
- PROP_BUFSIZE
+ PROP_BUFSIZE,
+ PROP_AUTO_GROW
};
static void g_buffered_output_stream_set_property (GObject *object,
object_class->finalize = g_buffered_output_stream_finalize;
ostream_class = G_OUTPUT_STREAM_CLASS (klass);
- ostream_class->write = g_buffered_output_stream_write;
+ ostream_class->write_fn = g_buffered_output_stream_write;
ostream_class->flush = g_buffered_output_stream_flush;
- ostream_class->close = g_buffered_output_stream_close;
+ ostream_class->close_fn = g_buffered_output_stream_close;
ostream_class->write_async = g_buffered_output_stream_write_async;
ostream_class->write_finish = g_buffered_output_stream_write_finish;
ostream_class->flush_async = g_buffered_output_stream_flush_async;
1,
G_MAXUINT,
DEFAULT_BUFFER_SIZE,
- G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY |
+ G_PARAM_READWRITE|G_PARAM_CONSTRUCT|
G_PARAM_STATIC_NAME|G_PARAM_STATIC_NICK|G_PARAM_STATIC_BLURB));
+ g_object_class_install_property (object_class,
+ PROP_AUTO_GROW,
+ g_param_spec_boolean ("auto-grow",
+ P_("Auto-grow"),
+ P_("Whether the buffer should automatically grow"),
+ FALSE,
+ G_PARAM_READWRITE|
+ G_PARAM_STATIC_NAME|G_PARAM_STATIC_NICK|G_PARAM_STATIC_BLURB));
+
}
/**
**/
void
g_buffered_output_stream_set_buffer_size (GBufferedOutputStream *stream,
- gsize size)
+ gsize size)
{
GBufferedOutputStreamPrivate *priv;
guint8 *buffer;
priv = stream->priv;
+ if (size == priv->len)
+ return;
+
if (priv->buffer)
{
size = MAX (size, priv->pos);
priv->len = size;
priv->pos = 0;
}
+
+ g_object_notify (G_OBJECT (stream), "buffer-size");
}
/**
* @auto_grow: a #gboolean.
*
* Sets whether or not the @stream's buffer should automatically grow.
+ * If @auto_grow is true, then each write will just make the buffer
+ * larger, and you must manually flush the buffer to actually write out
+ * the data to the underlying stream.
**/
void
g_buffered_output_stream_set_auto_grow (GBufferedOutputStream *stream,
- gboolean auto_grow)
+ gboolean auto_grow)
{
+ GBufferedOutputStreamPrivate *priv;
g_return_if_fail (G_IS_BUFFERED_OUTPUT_STREAM (stream));
-
- stream->priv->auto_grow = auto_grow;
+ priv = stream->priv;
+ auto_grow = auto_grow != FALSE;
+ if (priv->auto_grow != auto_grow)
+ {
+ priv->auto_grow = auto_grow;
+ g_object_notify (G_OBJECT (stream), "auto-grow");
+ }
}
static void
-g_buffered_output_stream_set_property (GObject *object,
- guint prop_id,
- const GValue *value,
- GParamSpec *pspec)
+g_buffered_output_stream_set_property (GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec)
{
- GBufferedOutputStream *buffered_stream;
- GBufferedOutputStreamPrivate *priv;
+ GBufferedOutputStream *stream;
- buffered_stream = G_BUFFERED_OUTPUT_STREAM (object);
- priv = buffered_stream->priv;
+ stream = G_BUFFERED_OUTPUT_STREAM (object);
switch (prop_id)
{
-
case PROP_BUFSIZE:
- g_buffered_output_stream_set_buffer_size (buffered_stream, g_value_get_uint (value));
+ g_buffered_output_stream_set_buffer_size (stream, g_value_get_uint (value));
break;
+ case PROP_AUTO_GROW:
+ g_buffered_output_stream_set_auto_grow (stream, g_value_get_boolean (value));
+ break;
+
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
switch (prop_id)
{
-
case PROP_BUFSIZE:
g_value_set_uint (value, priv->len);
break;
+ case PROP_AUTO_GROW:
+ g_value_set_boolean (value, priv->auto_grow);
+ break;
+
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
g_free (priv->buffer);
- if (G_OBJECT_CLASS (g_buffered_output_stream_parent_class)->finalize)
- (*G_OBJECT_CLASS (g_buffered_output_stream_parent_class)->finalize) (object);
+ G_OBJECT_CLASS (g_buffered_output_stream_parent_class)->finalize (object);
}
static void
**/
GOutputStream *
g_buffered_output_stream_new_sized (GOutputStream *base_stream,
- guint size)
+ gsize size)
{
GOutputStream *stream;
GError **error)
{
GBufferedOutputStream *bstream;
- GBufferedOutputStreamPrivate *priv;
GOutputStream *base_stream;
gboolean res;
bstream = G_BUFFERED_OUTPUT_STREAM (stream);
- priv = bstream->priv;
base_stream = G_FILTER_OUTPUT_STREAM (stream)->base_stream;
res = flush_buffer (bstream, cancellable, error);
- if (res == FALSE) {
+ if (res == FALSE)
return FALSE;
- }
- res = g_output_stream_flush (base_stream,
- cancellable,
- error);
+ res = g_output_stream_flush (base_stream, cancellable, error);
+
return res;
}
GError **error)
{
GBufferedOutputStream *bstream;
- GBufferedOutputStreamPrivate *priv;
GOutputStream *base_stream;
gboolean res;
bstream = G_BUFFERED_OUTPUT_STREAM (stream);
- priv = bstream->priv;
base_stream = G_FILTER_OUTPUT_STREAM (bstream)->base_stream;
-
res = flush_buffer (bstream, cancellable, error);
- /* report the first error but still close the stream */
- if (res)
- {
- res = g_output_stream_close (base_stream,
- cancellable,
- error);
- }
- else
+ if (g_filter_output_stream_get_close_base_stream (G_FILTER_OUTPUT_STREAM (stream)))
{
- g_output_stream_close (base_stream,
- cancellable,
- NULL);
+ /* report the first error but still close the stream */
+ if (res)
+ res = g_output_stream_close (base_stream, cancellable, error);
+ else
+ g_output_stream_close (base_stream, cancellable, NULL);
}
return res;
/* if flushing the buffer didn't work don't even bother
* to flush the stream but just report that error */
if (res && fdata->flush_stream)
- {
- res = g_output_stream_flush (base_stream,
- cancellable,
- &error);
- }
+ res = g_output_stream_flush (base_stream, cancellable, &error);
if (fdata->close_stream)
{
/* if flushing the buffer or the stream returned
* an error report that first error but still try
* close the stream */
- if (res == FALSE)
- {
- g_output_stream_close (base_stream,
- cancellable,
- NULL);
- }
- else
+ if (g_filter_output_stream_get_close_base_stream (G_FILTER_OUTPUT_STREAM (stream)))
{
- res = g_output_stream_close (base_stream,
- cancellable,
- &error);
- }
-
+ if (res == FALSE)
+ g_output_stream_close (base_stream, cancellable, NULL);
+ else
+ res = g_output_stream_close (base_stream, cancellable, &error);
+ }
}
if (res == FALSE)
- {
- g_simple_async_result_set_from_error (result, error);
- g_error_free (error);
- }
+ g_simple_async_result_take_error (result, error);
}
typedef struct {
buffered_stream = G_BUFFERED_OUTPUT_STREAM (stream);
priv = buffered_stream->priv;
- g_assert (g_simple_async_result_get_source_tag (simple) ==
+ g_warn_if_fail (g_simple_async_result_get_source_tag (simple) ==
g_buffered_output_stream_write_async);
wdata = g_simple_async_result_get_op_res_gpointer (simple);
simple = G_SIMPLE_ASYNC_RESULT (result);
- g_assert (g_simple_async_result_get_source_tag (simple) ==
+ g_warn_if_fail (g_simple_async_result_get_source_tag (simple) ==
g_buffered_output_stream_flush_async);
return TRUE;
simple = G_SIMPLE_ASYNC_RESULT (result);
- g_assert (g_simple_async_result_get_source_tag (simple) ==
- g_buffered_output_stream_flush_async);
+ g_warn_if_fail (g_simple_async_result_get_source_tag (simple) ==
+ g_buffered_output_stream_close_async);
return TRUE;
}
-
-/* vim: ts=2 sw=2 et */