Use g_simple_async_result_{new_,}take_error
[platform/upstream/glib.git] / gio / gbufferedoutputstream.c
index 309de9e..ffa8fbd 100644 (file)
@@ -20,7 +20,7 @@
  * Author: Christian Kellner <gicmo@gnome.org> 
  */
 
-#include <config.h>
+#include "config.h"
 #include "gbufferedoutputstream.h"
 #include "goutputstream.h"
 #include "gsimpleasyncresult.h"
@@ -30,6 +30,7 @@
 /**
  * SECTION:gbufferedoutputstream
  * @short_description: Buffered Output Stream
+ * @include: gio/gio.h
  * @see_also: #GFilterOutputStream, #GOutputStream
  * 
  * Buffered output stream implements #GFilterOutputStream and provides 
  * 
  * 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 {
@@ -61,7 +60,8 @@ struct _GBufferedOutputStreamPrivate {
 
 enum {
   PROP_0,
-  PROP_BUFSIZE
+  PROP_BUFSIZE,
+  PROP_AUTO_GROW
 };
 
 static void     g_buffered_output_stream_set_property (GObject      *object,
@@ -134,9 +134,9 @@ g_buffered_output_stream_class_init (GBufferedOutputStreamClass *klass)
   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;
@@ -152,9 +152,18 @@ g_buffered_output_stream_class_init (GBufferedOutputStreamClass *klass)
                                                       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));
+
 }
 
 /**
@@ -182,7 +191,7 @@ g_buffered_output_stream_get_buffer_size (GBufferedOutputStream *stream)
  **/    
 void
 g_buffered_output_stream_set_buffer_size (GBufferedOutputStream *stream,
-                                        gsize                 size)
+                                          gsize                  size)
 {
   GBufferedOutputStreamPrivate *priv;
   guint8 *buffer;
@@ -191,6 +200,9 @@ g_buffered_output_stream_set_buffer_size (GBufferedOutputStream *stream,
 
   priv = stream->priv;
   
+  if (size == priv->len)
+    return;
+
   if (priv->buffer)
     {
       size = MAX (size, priv->pos);
@@ -208,6 +220,8 @@ g_buffered_output_stream_set_buffer_size (GBufferedOutputStream *stream,
       priv->len = size;
       priv->pos = 0;
     }
+
+  g_object_notify (G_OBJECT (stream), "buffer-size");
 }
 
 /**
@@ -233,35 +247,45 @@ g_buffered_output_stream_get_auto_grow (GBufferedOutputStream *stream)
  * @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;
@@ -283,11 +307,14 @@ g_buffered_output_stream_get_property (GObject    *object,
 
   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;
@@ -306,8 +333,7 @@ g_buffered_output_stream_finalize (GObject *object)
 
   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
@@ -352,7 +378,7 @@ g_buffered_output_stream_new (GOutputStream *base_stream)
  **/  
 GOutputStream *
 g_buffered_output_stream_new_sized (GOutputStream *base_stream,
-                                    guint          size)
+                                    gsize          size)
 {
   GOutputStream *stream;
 
@@ -446,23 +472,19 @@ g_buffered_output_stream_flush (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;
 }
 
@@ -472,28 +494,20 @@ g_buffered_output_stream_close (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 (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;
@@ -543,11 +557,7 @@ flush_buffer_thread (GSimpleAsyncResult *result,
   /* 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) 
     {
@@ -555,26 +565,17 @@ flush_buffer_thread (GSimpleAsyncResult *result,
       /* 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 {
@@ -657,7 +658,7 @@ g_buffered_output_stream_write_finish (GOutputStream        *stream,
   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);
@@ -710,7 +711,7 @@ g_buffered_output_stream_flush_finish (GOutputStream        *stream,
 
   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;
@@ -752,10 +753,8 @@ g_buffered_output_stream_close_finish (GOutputStream        *stream,
 
   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 */