Remove build warning
[platform/upstream/libsoup.git] / libsoup / soup-body-output-stream.c
index 269ec71..03353ef 100644 (file)
@@ -9,14 +9,10 @@
 #include <config.h>
 #endif
 
-#include <stdio.h>
-#include <stdlib.h>
 #include <string.h>
-#include <gio/gio.h>
 
 #include "soup-body-output-stream.h"
-#include "soup-enum-types.h"
-#include "soup-message-headers.h"
+#include "soup.h"
 
 typedef enum {
        SOUP_BODY_OUTPUT_STREAM_STATE_CHUNK_SIZE,
@@ -60,7 +56,7 @@ soup_body_output_stream_init (SoupBodyOutputStream *stream)
 }
 
 static void
-constructed (GObject *object)
+soup_body_output_stream_constructed (GObject *object)
 {
        SoupBodyOutputStream *bostream = SOUP_BODY_OUTPUT_STREAM (object);
 
@@ -68,8 +64,8 @@ constructed (GObject *object)
 }
 
 static void
-set_property (GObject *object, guint prop_id,
-             const GValue *value, GParamSpec *pspec)
+soup_body_output_stream_set_property (GObject *object, guint prop_id,
+                                     const GValue *value, GParamSpec *pspec)
 {
        SoupBodyOutputStream *bostream = SOUP_BODY_OUTPUT_STREAM (object);
 
@@ -89,8 +85,8 @@ set_property (GObject *object, guint prop_id,
 }
 
 static void
-get_property (GObject *object, guint prop_id,
-             GValue *value, GParamSpec *pspec)
+soup_body_output_stream_get_property (GObject *object, guint prop_id,
+                                     GValue *value, GParamSpec *pspec)
 {
        SoupBodyOutputStream *bostream = SOUP_BODY_OUTPUT_STREAM (object);
 
@@ -108,6 +104,7 @@ static gssize
 soup_body_output_stream_write_raw (SoupBodyOutputStream  *bostream,
                                   const void            *buffer,
                                   gsize                  count,
+                                  gboolean               blocking,
                                   GCancellable          *cancellable,
                                   GError               **error)
 {
@@ -126,9 +123,9 @@ soup_body_output_stream_write_raw (SoupBodyOutputStream  *bostream,
        } else
                my_count = count;
 
-       nwrote = g_output_stream_write (bostream->priv->base_stream,
-                                       buffer, my_count,
-                                       cancellable, error);
+       nwrote = g_pollable_stream_write (bostream->priv->base_stream,
+                                         buffer, my_count,
+                                         blocking, cancellable, error);
 
        if (nwrote > 0 && bostream->priv->write_length)
                bostream->priv->written += nwrote;
@@ -143,6 +140,7 @@ static gssize
 soup_body_output_stream_write_chunked (SoupBodyOutputStream  *bostream,
                                       const void            *buffer,
                                       gsize                  count,
+                                      gboolean               blocking,
                                       GCancellable          *cancellable,
                                       GError               **error)
 {
@@ -152,8 +150,9 @@ soup_body_output_stream_write_chunked (SoupBodyOutputStream  *bostream,
 again:
        len = strlen (buf);
        if (len) {
-               nwrote = g_output_stream_write (bostream->priv->base_stream,
-                                               buf, len, cancellable, error);
+               nwrote = g_pollable_stream_write (bostream->priv->base_stream,
+                                                 buf, len, blocking,
+                                                 cancellable, error);
                if (nwrote < 0)
                        return nwrote;
                memmove (buf, buf + nwrote, len + 1 - nwrote);
@@ -162,8 +161,8 @@ again:
 
        switch (bostream->priv->chunked_state) {
        case SOUP_BODY_OUTPUT_STREAM_STATE_CHUNK_SIZE:
-               snprintf (buf, sizeof (bostream->priv->buf),
-                         "%lx\r\n", (gulong)count);
+               g_snprintf (buf, sizeof (bostream->priv->buf),
+                           "%lx\r\n", (gulong)count);
                len = strlen (buf);
 
                if (count > 0)
@@ -173,8 +172,9 @@ again:
                break;
 
        case SOUP_BODY_OUTPUT_STREAM_STATE_CHUNK:
-               nwrote = g_output_stream_write (bostream->priv->base_stream,
-                                               buffer, count, cancellable, error);
+               nwrote = g_pollable_stream_write (bostream->priv->base_stream,
+                                                 buffer, count, blocking,
+                                                 cancellable, error);
                if (nwrote < (gssize)count)
                        return nwrote;
 
@@ -216,11 +216,11 @@ soup_body_output_stream_write_fn (GOutputStream  *stream,
        switch (bostream->priv->encoding) {
        case SOUP_ENCODING_CHUNKED:
                return soup_body_output_stream_write_chunked (bostream, buffer, count,
-                                                             cancellable, error);
+                                                             TRUE, cancellable, error);
 
        default:
                return soup_body_output_stream_write_raw (bostream, buffer, count,
-                                                         cancellable, error);
+                                                         TRUE, cancellable, error);
        }
 }
 
@@ -231,8 +231,9 @@ soup_body_output_stream_close_fn (GOutputStream  *stream,
 {
        SoupBodyOutputStream *bostream = SOUP_BODY_OUTPUT_STREAM (stream);
 
-       if (bostream->priv->encoding == SOUP_ENCODING_CHUNKED) {
-               if (soup_body_output_stream_write_chunked (bostream, NULL, 0, cancellable, error) == -1)
+       if (bostream->priv->encoding == SOUP_ENCODING_CHUNKED &&
+           bostream->priv->chunked_state == SOUP_BODY_OUTPUT_STREAM_STATE_CHUNK_SIZE) {
+               if (soup_body_output_stream_write_chunked (bostream, NULL, 0, TRUE, cancellable, error) == -1)
                        return FALSE;
        }
 
@@ -248,6 +249,28 @@ soup_body_output_stream_is_writable (GPollableOutputStream *stream)
                g_pollable_output_stream_is_writable (G_POLLABLE_OUTPUT_STREAM (bostream->priv->base_stream));
 }
 
+static gssize
+soup_body_output_stream_write_nonblocking (GPollableOutputStream  *stream,
+                                          const void             *buffer,
+                                          gsize                   count,
+                                          GError                **error)
+{
+       SoupBodyOutputStream *bostream = SOUP_BODY_OUTPUT_STREAM (stream);
+
+       if (bostream->priv->eof)
+               return count;
+
+       switch (bostream->priv->encoding) {
+       case SOUP_ENCODING_CHUNKED:
+               return soup_body_output_stream_write_chunked (bostream, buffer, count,
+                                                             FALSE, NULL, error);
+
+       default:
+               return soup_body_output_stream_write_raw (bostream, buffer, count,
+                                                         FALSE, NULL, error);
+       }
+}
+
 static GSource *
 soup_body_output_stream_create_source (GPollableOutputStream *stream,
                                       GCancellable *cancellable)
@@ -276,9 +299,9 @@ soup_body_output_stream_class_init (SoupBodyOutputStreamClass *stream_class)
 
        g_type_class_add_private (stream_class, sizeof (SoupBodyOutputStreamPrivate));
 
-       object_class->constructed = constructed;
-       object_class->set_property = set_property;
-       object_class->get_property = get_property;
+       object_class->constructed = soup_body_output_stream_constructed;
+       object_class->set_property = soup_body_output_stream_set_property;
+       object_class->get_property = soup_body_output_stream_get_property;
 
        output_stream_class->write_fn = soup_body_output_stream_write_fn;
        output_stream_class->close_fn = soup_body_output_stream_close_fn;
@@ -305,6 +328,7 @@ soup_body_output_stream_pollable_init (GPollableOutputStreamInterface *pollable_
                                       gpointer interface_data)
 {
        pollable_interface->is_writable = soup_body_output_stream_is_writable;
+       pollable_interface->write_nonblocking = soup_body_output_stream_write_nonblocking;
        pollable_interface->create_source = soup_body_output_stream_create_source;
 }