diff --git a/gdk-pixbuf/ChangeLog b/gdk-pixbuf/ChangeLog index 1670d22e18..5e38b4bf11 100644 --- a/gdk-pixbuf/ChangeLog +++ b/gdk-pixbuf/ChangeLog @@ -1,3 +1,7 @@ +2008-01-15 Matthias Clasen + + * gdk-pixbuf-io.c (save_to_stream): Handle partial writes. + 2008-01-16 Michael Natterer * gdk-pixbuf-io.c (save_to_stream): fix signature of this function diff --git a/gdk-pixbuf/gdk-pixbuf-io.c b/gdk-pixbuf/gdk-pixbuf-io.c index 7c3ed83b82..206ed7962c 100644 --- a/gdk-pixbuf/gdk-pixbuf-io.c +++ b/gdk-pixbuf/gdk-pixbuf-io.c @@ -2218,24 +2218,32 @@ save_to_stream (const gchar *buffer, gpointer data) { SaveToStreamData *sdata = (SaveToStreamData *)data; + gsize remaining; + gssize written; GError *my_error = NULL; - gsize n; - n = g_output_stream_write (sdata->stream, - buffer, count, - sdata->cancellable, - &my_error); - if (n != count) { - if (!my_error) { - g_set_error (error, - G_IO_ERROR, 0, - _("Error writing to image stream")); - } - else { - g_propagate_error (error, my_error); - } - return FALSE; + remaining = count; + written = 0; + while (remaining > 0) { + buffer += written; + remaining -= written; + written = g_output_stream_write (sdata->stream, + buffer, remaining, + sdata->cancellable, + &my_error); + if (written < 0) { + if (!my_error) { + g_set_error (error, + G_IO_ERROR, 0, + _("Error writing to image stream")); + } + else { + g_propagate_error (error, my_error); + } + return FALSE; + } } + return TRUE; }