Merge remote branch 'gvdb/master'
[platform/upstream/glib.git] / gio / goutputstream.c
1 /* GIO - GLib Input, Output and Streaming Library
2  * 
3  * Copyright (C) 2006-2007 Red Hat, Inc.
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Lesser General Public
7  * License as published by the Free Software Foundation; either
8  * version 2 of the License, or (at your option) any later version.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * Lesser General Public License for more details.
14  *
15  * You should have received a copy of the GNU Lesser General
16  * Public License along with this library; if not, write to the
17  * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
18  * Boston, MA 02111-1307, USA.
19  *
20  * Author: Alexander Larsson <alexl@redhat.com>
21  */
22
23 #include "config.h"
24 #include "goutputstream.h"
25 #include "gcancellable.h"
26 #include "gasyncresult.h"
27 #include "gsimpleasyncresult.h"
28 #include "ginputstream.h"
29 #include "gioerror.h"
30 #include "glibintl.h"
31
32 #include "gioalias.h"
33
34 /**
35  * SECTION:goutputstream
36  * @short_description: Base class for implementing streaming output
37  * @include: gio/gio.h
38  *
39  * GOutputStream has functions to write to a stream (g_output_stream_write()),
40  * to close a stream (g_output_stream_close()) and to flush pending writes
41  * (g_output_stream_flush()). 
42  *
43  * To copy the content of an input stream to an output stream without 
44  * manually handling the reads and writes, use g_output_stream_splice(). 
45  *
46  * All of these functions have async variants too.
47  **/
48
49 G_DEFINE_TYPE (GOutputStream, g_output_stream, G_TYPE_OBJECT);
50
51 struct _GOutputStreamPrivate {
52   guint closed : 1;
53   guint pending : 1;
54   guint closing : 1;
55   GAsyncReadyCallback outstanding_callback;
56 };
57
58 static gssize   g_output_stream_real_splice        (GOutputStream             *stream,
59                                                     GInputStream              *source,
60                                                     GOutputStreamSpliceFlags   flags,
61                                                     GCancellable              *cancellable,
62                                                     GError                   **error);
63 static void     g_output_stream_real_write_async   (GOutputStream             *stream,
64                                                     const void                *buffer,
65                                                     gsize                      count,
66                                                     int                        io_priority,
67                                                     GCancellable              *cancellable,
68                                                     GAsyncReadyCallback        callback,
69                                                     gpointer                   data);
70 static gssize   g_output_stream_real_write_finish  (GOutputStream             *stream,
71                                                     GAsyncResult              *result,
72                                                     GError                   **error);
73 static void     g_output_stream_real_splice_async  (GOutputStream             *stream,
74                                                     GInputStream              *source,
75                                                     GOutputStreamSpliceFlags   flags,
76                                                     int                        io_priority,
77                                                     GCancellable              *cancellable,
78                                                     GAsyncReadyCallback        callback,
79                                                     gpointer                   data);
80 static gssize   g_output_stream_real_splice_finish (GOutputStream             *stream,
81                                                     GAsyncResult              *result,
82                                                     GError                   **error);
83 static void     g_output_stream_real_flush_async   (GOutputStream             *stream,
84                                                     int                        io_priority,
85                                                     GCancellable              *cancellable,
86                                                     GAsyncReadyCallback        callback,
87                                                     gpointer                   data);
88 static gboolean g_output_stream_real_flush_finish  (GOutputStream             *stream,
89                                                     GAsyncResult              *result,
90                                                     GError                   **error);
91 static void     g_output_stream_real_close_async   (GOutputStream             *stream,
92                                                     int                        io_priority,
93                                                     GCancellable              *cancellable,
94                                                     GAsyncReadyCallback        callback,
95                                                     gpointer                   data);
96 static gboolean g_output_stream_real_close_finish  (GOutputStream             *stream,
97                                                     GAsyncResult              *result,
98                                                     GError                   **error);
99
100 static void
101 g_output_stream_finalize (GObject *object)
102 {
103   G_OBJECT_CLASS (g_output_stream_parent_class)->finalize (object);
104 }
105
106 static void
107 g_output_stream_dispose (GObject *object)
108 {
109   GOutputStream *stream;
110
111   stream = G_OUTPUT_STREAM (object);
112   
113   if (!stream->priv->closed)
114     g_output_stream_close (stream, NULL, NULL);
115
116   G_OBJECT_CLASS (g_output_stream_parent_class)->dispose (object);
117 }
118
119 static void
120 g_output_stream_class_init (GOutputStreamClass *klass)
121 {
122   GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
123   
124   g_type_class_add_private (klass, sizeof (GOutputStreamPrivate));
125   
126   gobject_class->finalize = g_output_stream_finalize;
127   gobject_class->dispose = g_output_stream_dispose;
128
129   klass->splice = g_output_stream_real_splice;
130   
131   klass->write_async = g_output_stream_real_write_async;
132   klass->write_finish = g_output_stream_real_write_finish;
133   klass->splice_async = g_output_stream_real_splice_async;
134   klass->splice_finish = g_output_stream_real_splice_finish;
135   klass->flush_async = g_output_stream_real_flush_async;
136   klass->flush_finish = g_output_stream_real_flush_finish;
137   klass->close_async = g_output_stream_real_close_async;
138   klass->close_finish = g_output_stream_real_close_finish;
139 }
140
141 static void
142 g_output_stream_init (GOutputStream *stream)
143 {
144   stream->priv = G_TYPE_INSTANCE_GET_PRIVATE (stream,
145                                               G_TYPE_OUTPUT_STREAM,
146                                               GOutputStreamPrivate);
147 }
148
149 /**
150  * g_output_stream_write:
151  * @stream: a #GOutputStream.
152  * @buffer: the buffer containing the data to write. 
153  * @count: the number of bytes to write
154  * @cancellable: optional cancellable object
155  * @error: location to store the error occuring, or %NULL to ignore
156  *
157  * Tries to write @count bytes from @buffer into the stream. Will block
158  * during the operation.
159  * 
160  * If count is zero returns zero and does nothing. A value of @count
161  * larger than %G_MAXSSIZE will cause a %G_IO_ERROR_INVALID_ARGUMENT error.
162  *
163  * On success, the number of bytes written to the stream is returned.
164  * It is not an error if this is not the same as the requested size, as it
165  * can happen e.g. on a partial i/o error, or if there is not enough
166  * storage in the stream. All writes either block until at least one byte
167  * is written, so zero is never returned (unless @count is zero).
168  * 
169  * If @cancellable is not NULL, then the operation can be cancelled by
170  * triggering the cancellable object from another thread. If the operation
171  * was cancelled, the error G_IO_ERROR_CANCELLED will be returned. If an
172  * operation was partially finished when the operation was cancelled the
173  * partial result will be returned, without an error.
174  *
175  * On error -1 is returned and @error is set accordingly.
176  * 
177  * Return value: Number of bytes written, or -1 on error
178  **/
179 gssize
180 g_output_stream_write (GOutputStream  *stream,
181                        const void     *buffer,
182                        gsize           count,
183                        GCancellable   *cancellable,
184                        GError        **error)
185 {
186   GOutputStreamClass *class;
187   gssize res;
188
189   g_return_val_if_fail (G_IS_OUTPUT_STREAM (stream), -1);
190   g_return_val_if_fail (buffer != NULL, 0);
191
192   if (count == 0)
193     return 0;
194   
195   if (((gssize) count) < 0)
196     {
197       g_set_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT,
198                    _("Too large count value passed to %s"), G_STRFUNC);
199       return -1;
200     }
201
202   class = G_OUTPUT_STREAM_GET_CLASS (stream);
203
204   if (class->write_fn == NULL) 
205     {
206       g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED,
207                            _("Output stream doesn't implement write"));
208       return -1;
209     }
210   
211   if (!g_output_stream_set_pending (stream, error))
212     return -1;
213   
214   if (cancellable)
215     g_cancellable_push_current (cancellable);
216   
217   res = class->write_fn (stream, buffer, count, cancellable, error);
218   
219   if (cancellable)
220     g_cancellable_pop_current (cancellable);
221   
222   g_output_stream_clear_pending (stream);
223
224   return res; 
225 }
226
227 /**
228  * g_output_stream_write_all:
229  * @stream: a #GOutputStream.
230  * @buffer: the buffer containing the data to write. 
231  * @count: the number of bytes to write
232  * @bytes_written: location to store the number of bytes that was 
233  *     written to the stream
234  * @cancellable: optional #GCancellable object, %NULL to ignore.
235  * @error: location to store the error occuring, or %NULL to ignore
236  *
237  * Tries to write @count bytes from @buffer into the stream. Will block
238  * during the operation.
239  * 
240  * This function is similar to g_output_stream_write(), except it tries to
241  * write as many bytes as requested, only stopping on an error.
242  *
243  * On a successful write of @count bytes, %TRUE is returned, and @bytes_written
244  * is set to @count.
245  * 
246  * If there is an error during the operation FALSE is returned and @error
247  * is set to indicate the error status, @bytes_written is updated to contain
248  * the number of bytes written into the stream before the error occurred.
249  *
250  * Return value: %TRUE on success, %FALSE if there was an error
251  **/
252 gboolean
253 g_output_stream_write_all (GOutputStream  *stream,
254                            const void     *buffer,
255                            gsize           count,
256                            gsize          *bytes_written,
257                            GCancellable   *cancellable,
258                            GError        **error)
259 {
260   gsize _bytes_written;
261   gssize res;
262
263   g_return_val_if_fail (G_IS_OUTPUT_STREAM (stream), FALSE);
264   g_return_val_if_fail (buffer != NULL, FALSE);
265
266   _bytes_written = 0;
267   while (_bytes_written < count)
268     {
269       res = g_output_stream_write (stream, (char *)buffer + _bytes_written, count - _bytes_written,
270                                    cancellable, error);
271       if (res == -1)
272         {
273           if (bytes_written)
274             *bytes_written = _bytes_written;
275           return FALSE;
276         }
277       
278       if (res == 0)
279         g_warning ("Write returned zero without error");
280
281       _bytes_written += res;
282     }
283   
284   if (bytes_written)
285     *bytes_written = _bytes_written;
286
287   return TRUE;
288 }
289
290 /**
291  * g_output_stream_flush:
292  * @stream: a #GOutputStream.
293  * @cancellable: optional cancellable object
294  * @error: location to store the error occuring, or %NULL to ignore
295  *
296  * Flushed any outstanding buffers in the stream. Will block during 
297  * the operation. Closing the stream will implicitly cause a flush.
298  *
299  * This function is optional for inherited classes.
300  * 
301  * If @cancellable is not %NULL, then the operation can be cancelled by
302  * triggering the cancellable object from another thread. If the operation
303  * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned.
304  *
305  * Return value: %TRUE on success, %FALSE on error
306  **/
307 gboolean
308 g_output_stream_flush (GOutputStream  *stream,
309                        GCancellable   *cancellable,
310                        GError        **error)
311 {
312   GOutputStreamClass *class;
313   gboolean res;
314
315   g_return_val_if_fail (G_IS_OUTPUT_STREAM (stream), FALSE);
316
317   if (!g_output_stream_set_pending (stream, error))
318     return FALSE;
319   
320   class = G_OUTPUT_STREAM_GET_CLASS (stream);
321
322   res = TRUE;
323   if (class->flush)
324     {
325       if (cancellable)
326         g_cancellable_push_current (cancellable);
327       
328       res = class->flush (stream, cancellable, error);
329       
330       if (cancellable)
331         g_cancellable_pop_current (cancellable);
332     }
333   
334   g_output_stream_clear_pending (stream);
335
336   return res;
337 }
338
339 /**
340  * g_output_stream_splice:
341  * @stream: a #GOutputStream.
342  * @source: a #GInputStream.
343  * @flags: a set of #GOutputStreamSpliceFlags.
344  * @cancellable: optional #GCancellable object, %NULL to ignore.
345  * @error: a #GError location to store the error occuring, or %NULL to
346  * ignore.
347  *
348  * Splices an input stream into an output stream.
349  *
350  * Returns: a #gssize containing the size of the data spliced, or
351  *     -1 if an error occurred.
352  **/
353 gssize
354 g_output_stream_splice (GOutputStream             *stream,
355                         GInputStream              *source,
356                         GOutputStreamSpliceFlags   flags,
357                         GCancellable              *cancellable,
358                         GError                   **error)
359 {
360   GOutputStreamClass *class;
361   gssize bytes_copied;
362
363   g_return_val_if_fail (G_IS_OUTPUT_STREAM (stream), -1);
364   g_return_val_if_fail (G_IS_INPUT_STREAM (source), -1);
365
366   if (g_input_stream_is_closed (source))
367     {
368       g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_CLOSED,
369                            _("Source stream is already closed"));
370       return -1;
371     }
372
373   if (!g_output_stream_set_pending (stream, error))
374     return -1;
375
376   class = G_OUTPUT_STREAM_GET_CLASS (stream);
377
378   if (cancellable)
379     g_cancellable_push_current (cancellable);
380
381   bytes_copied = class->splice (stream, source, flags, cancellable, error);
382
383   if (cancellable)
384     g_cancellable_pop_current (cancellable);
385
386   g_output_stream_clear_pending (stream);
387
388   return bytes_copied;
389 }
390
391 static gssize
392 g_output_stream_real_splice (GOutputStream             *stream,
393                              GInputStream              *source,
394                              GOutputStreamSpliceFlags   flags,
395                              GCancellable              *cancellable,
396                              GError                   **error)
397 {
398   GOutputStreamClass *class = G_OUTPUT_STREAM_GET_CLASS (stream);
399   gssize n_read, n_written;
400   gssize bytes_copied;
401   char buffer[8192], *p;
402   gboolean res;
403
404   bytes_copied = 0;
405   if (class->write_fn == NULL)
406     {
407       g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED,
408                            _("Output stream doesn't implement write"));
409       res = FALSE;
410       goto notsupported;
411     }
412
413   res = TRUE;
414   do
415     {
416       n_read = g_input_stream_read (source, buffer, sizeof (buffer), cancellable, error);
417       if (n_read == -1)
418         {
419           res = FALSE;
420           break;
421         }
422
423       if (n_read == 0)
424         break;
425
426       p = buffer;
427       while (n_read > 0)
428         {
429           n_written = class->write_fn (stream, p, n_read, cancellable, error);
430           if (n_written == -1)
431             {
432               res = FALSE;
433               break;
434             }
435
436           p += n_written;
437           n_read -= n_written;
438           bytes_copied += n_written;
439         }
440     }
441   while (res);
442
443  notsupported:
444   if (!res)
445     error = NULL; /* Ignore further errors */
446
447   if (flags & G_OUTPUT_STREAM_SPLICE_CLOSE_SOURCE)
448     {
449       /* Don't care about errors in source here */
450       g_input_stream_close (source, cancellable, NULL);
451     }
452
453   if (flags & G_OUTPUT_STREAM_SPLICE_CLOSE_TARGET)
454     {
455       /* But write errors on close are bad! */
456       if (class->close_fn &&
457           !class->close_fn (stream, cancellable, error))
458         res = FALSE;
459     }
460
461   if (res)
462     return bytes_copied;
463
464   return -1;
465 }
466
467
468 /**
469  * g_output_stream_close:
470  * @stream: A #GOutputStream.
471  * @cancellable: optional cancellable object
472  * @error: location to store the error occuring, or %NULL to ignore
473  *
474  * Closes the stream, releasing resources related to it.
475  *
476  * Once the stream is closed, all other operations will return %G_IO_ERROR_CLOSED.
477  * Closing a stream multiple times will not return an error.
478  *
479  * Closing a stream will automatically flush any outstanding buffers in the
480  * stream.
481  *
482  * Streams will be automatically closed when the last reference
483  * is dropped, but you might want to call this function to make sure 
484  * resources are released as early as possible.
485  *
486  * Some streams might keep the backing store of the stream (e.g. a file descriptor)
487  * open after the stream is closed. See the documentation for the individual
488  * stream for details.
489  *
490  * On failure the first error that happened will be reported, but the close
491  * operation will finish as much as possible. A stream that failed to
492  * close will still return %G_IO_ERROR_CLOSED for all operations. Still, it
493  * is important to check and report the error to the user, otherwise
494  * there might be a loss of data as all data might not be written.
495  * 
496  * If @cancellable is not NULL, then the operation can be cancelled by
497  * triggering the cancellable object from another thread. If the operation
498  * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned.
499  * Cancelling a close will still leave the stream closed, but there some streams
500  * can use a faster close that doesn't block to e.g. check errors. On
501  * cancellation (as with any error) there is no guarantee that all written
502  * data will reach the target. 
503  *
504  * Return value: %TRUE on success, %FALSE on failure
505  **/
506 gboolean
507 g_output_stream_close (GOutputStream  *stream,
508                        GCancellable   *cancellable,
509                        GError        **error)
510 {
511   GOutputStreamClass *class;
512   gboolean res;
513
514   g_return_val_if_fail (G_IS_OUTPUT_STREAM (stream), FALSE);
515
516   class = G_OUTPUT_STREAM_GET_CLASS (stream);
517
518   if (stream->priv->closed)
519     return TRUE;
520
521   if (!g_output_stream_set_pending (stream, error))
522     return FALSE;
523
524   stream->priv->closing = TRUE;
525
526   if (cancellable)
527     g_cancellable_push_current (cancellable);
528
529   if (class->flush)
530     res = class->flush (stream, cancellable, error);
531   else
532     res = TRUE;
533   
534   if (!res)
535     {
536       /* flushing caused the error that we want to return,
537        * but we still want to close the underlying stream if possible
538        */
539       if (class->close_fn)
540         class->close_fn (stream, cancellable, NULL);
541     }
542   else
543     {
544       res = TRUE;
545       if (class->close_fn)
546         res = class->close_fn (stream, cancellable, error);
547     }
548   
549   if (cancellable)
550     g_cancellable_pop_current (cancellable);
551
552   stream->priv->closing = FALSE;
553   stream->priv->closed = TRUE;
554   g_output_stream_clear_pending (stream);
555   
556   return res;
557 }
558
559 static void
560 async_ready_callback_wrapper (GObject      *source_object,
561                               GAsyncResult *res,
562                               gpointer      user_data)
563 {
564   GOutputStream *stream = G_OUTPUT_STREAM (source_object);
565
566   g_output_stream_clear_pending (stream);
567   if (stream->priv->outstanding_callback)
568     (*stream->priv->outstanding_callback) (source_object, res, user_data);
569   g_object_unref (stream);
570 }
571
572 static void
573 async_ready_close_callback_wrapper (GObject      *source_object,
574                                     GAsyncResult *res,
575                                     gpointer      user_data)
576 {
577   GOutputStream *stream = G_OUTPUT_STREAM (source_object);
578
579   stream->priv->closing = FALSE;
580   stream->priv->closed = TRUE;
581   g_output_stream_clear_pending (stream);
582   if (stream->priv->outstanding_callback)
583     (*stream->priv->outstanding_callback) (source_object, res, user_data);
584   g_object_unref (stream);
585 }
586
587 /**
588  * g_output_stream_write_async:
589  * @stream: A #GOutputStream.
590  * @buffer: the buffer containing the data to write. 
591  * @count: the number of bytes to write
592  * @io_priority: the io priority of the request.
593  * @cancellable: optional #GCancellable object, %NULL to ignore.
594  * @callback: callback to call when the request is satisfied
595  * @user_data: the data to pass to callback function
596  *
597  * Request an asynchronous write of @count bytes from @buffer into 
598  * the stream. When the operation is finished @callback will be called.
599  * You can then call g_output_stream_write_finish() to get the result of the 
600  * operation.
601  *
602  * During an async request no other sync and async calls are allowed, 
603  * and will result in %G_IO_ERROR_PENDING errors. 
604  *
605  * A value of @count larger than %G_MAXSSIZE will cause a 
606  * %G_IO_ERROR_INVALID_ARGUMENT error.
607  *
608  * On success, the number of bytes written will be passed to the
609  * @callback. It is not an error if this is not the same as the 
610  * requested size, as it can happen e.g. on a partial I/O error, 
611  * but generally we try to write as many bytes as requested. 
612  *
613  * Any outstanding I/O request with higher priority (lower numerical 
614  * value) will be executed before an outstanding request with lower 
615  * priority. Default priority is %G_PRIORITY_DEFAULT.
616  *
617  * The asyncronous methods have a default fallback that uses threads 
618  * to implement asynchronicity, so they are optional for inheriting 
619  * classes. However, if you override one you must override all.
620  *
621  * For the synchronous, blocking version of this function, see 
622  * g_output_stream_write().
623  **/
624 void
625 g_output_stream_write_async (GOutputStream       *stream,
626                              const void          *buffer,
627                              gsize                count,
628                              int                  io_priority,
629                              GCancellable        *cancellable,
630                              GAsyncReadyCallback  callback,
631                              gpointer             user_data)
632 {
633   GOutputStreamClass *class;
634   GSimpleAsyncResult *simple;
635   GError *error = NULL;
636
637   g_return_if_fail (G_IS_OUTPUT_STREAM (stream));
638   g_return_if_fail (buffer != NULL);
639
640   if (count == 0)
641     {
642       simple = g_simple_async_result_new (G_OBJECT (stream),
643                                           callback,
644                                           user_data,
645                                           g_output_stream_write_async);
646       g_simple_async_result_complete_in_idle (simple);
647       g_object_unref (simple);
648       return;
649     }
650
651   if (((gssize) count) < 0)
652     {
653       g_simple_async_report_error_in_idle (G_OBJECT (stream),
654                                            callback,
655                                            user_data,
656                                            G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT,
657                                            _("Too large count value passed to %s"),
658                                            G_STRFUNC);
659       return;
660     }
661
662   if (!g_output_stream_set_pending (stream, &error))
663     {
664       g_simple_async_report_gerror_in_idle (G_OBJECT (stream),
665                                             callback,
666                                             user_data,
667                                             error);
668       g_error_free (error);
669       return;
670     }
671   
672   class = G_OUTPUT_STREAM_GET_CLASS (stream);
673
674   stream->priv->outstanding_callback = callback;
675   g_object_ref (stream);
676   class->write_async (stream, buffer, count, io_priority, cancellable,
677                       async_ready_callback_wrapper, user_data);
678 }
679
680 /**
681  * g_output_stream_write_finish:
682  * @stream: a #GOutputStream.
683  * @result: a #GAsyncResult.
684  * @error: a #GError location to store the error occuring, or %NULL to 
685  * ignore.
686  * 
687  * Finishes a stream write operation.
688  * 
689  * Returns: a #gssize containing the number of bytes written to the stream.
690  **/
691 gssize
692 g_output_stream_write_finish (GOutputStream  *stream,
693                               GAsyncResult   *result,
694                               GError        **error)
695 {
696   GSimpleAsyncResult *simple;
697   GOutputStreamClass *class;
698
699   g_return_val_if_fail (G_IS_OUTPUT_STREAM (stream), -1);
700   g_return_val_if_fail (G_IS_ASYNC_RESULT (result), -1);
701
702   if (G_IS_SIMPLE_ASYNC_RESULT (result))
703     {
704       simple = G_SIMPLE_ASYNC_RESULT (result);
705       if (g_simple_async_result_propagate_error (simple, error))
706         return -1;
707
708       /* Special case writes of 0 bytes */
709       if (g_simple_async_result_get_source_tag (simple) == g_output_stream_write_async)
710         return 0;
711     }
712   
713   class = G_OUTPUT_STREAM_GET_CLASS (stream);
714   return class->write_finish (stream, result, error);
715 }
716
717 typedef struct {
718   GInputStream *source;
719   gpointer user_data;
720   GAsyncReadyCallback callback;
721 } SpliceUserData;
722
723 static void
724 async_ready_splice_callback_wrapper (GObject      *source_object,
725                                      GAsyncResult *res,
726                                      gpointer     _data)
727 {
728   GOutputStream *stream = G_OUTPUT_STREAM (source_object);
729   SpliceUserData *data = _data;
730   
731   g_output_stream_clear_pending (stream);
732   
733   if (data->callback)
734     (*data->callback) (source_object, res, data->user_data);
735   
736   g_object_unref (stream);
737   g_object_unref (data->source);
738   g_free (data);
739 }
740
741 /**
742  * g_output_stream_splice_async:
743  * @stream: a #GOutputStream.
744  * @source: a #GInputStream. 
745  * @flags: a set of #GOutputStreamSpliceFlags.
746  * @io_priority: the io priority of the request.
747  * @cancellable: optional #GCancellable object, %NULL to ignore. 
748  * @callback: a #GAsyncReadyCallback. 
749  * @user_data: user data passed to @callback.
750  * 
751  * Splices a stream asynchronously.
752  * When the operation is finished @callback will be called.
753  * You can then call g_output_stream_splice_finish() to get the 
754  * result of the operation.
755  *
756  * For the synchronous, blocking version of this function, see 
757  * g_output_stream_splice().
758  **/
759 void
760 g_output_stream_splice_async (GOutputStream            *stream,
761                               GInputStream             *source,
762                               GOutputStreamSpliceFlags  flags,
763                               int                       io_priority,
764                               GCancellable             *cancellable,
765                               GAsyncReadyCallback       callback,
766                               gpointer                  user_data)
767 {
768   GOutputStreamClass *class;
769   SpliceUserData *data;
770   GError *error = NULL;
771
772   g_return_if_fail (G_IS_OUTPUT_STREAM (stream));
773   g_return_if_fail (G_IS_INPUT_STREAM (source));
774
775   if (g_input_stream_is_closed (source))
776     {
777       g_simple_async_report_error_in_idle (G_OBJECT (stream),
778                                            callback,
779                                            user_data,
780                                            G_IO_ERROR, G_IO_ERROR_CLOSED,
781                                            _("Source stream is already closed"));
782       return;
783     }
784   
785   if (!g_output_stream_set_pending (stream, &error))
786     {
787       g_simple_async_report_gerror_in_idle (G_OBJECT (stream),
788                                             callback,
789                                             user_data,
790                                             error);
791       g_error_free (error);
792       return;
793     }
794
795   class = G_OUTPUT_STREAM_GET_CLASS (stream);
796
797   data = g_new0 (SpliceUserData, 1);
798   data->callback = callback;
799   data->user_data = user_data;
800   data->source = g_object_ref (source);
801   
802   g_object_ref (stream);
803   class->splice_async (stream, source, flags, io_priority, cancellable,
804                       async_ready_splice_callback_wrapper, data);
805 }
806
807 /**
808  * g_output_stream_splice_finish:
809  * @stream: a #GOutputStream.
810  * @result: a #GAsyncResult.
811  * @error: a #GError location to store the error occuring, or %NULL to 
812  * ignore.
813  *
814  * Finishes an asynchronous stream splice operation.
815  * 
816  * Returns: a #gssize of the number of bytes spliced.
817  **/
818 gssize
819 g_output_stream_splice_finish (GOutputStream  *stream,
820                                GAsyncResult   *result,
821                                GError        **error)
822 {
823   GSimpleAsyncResult *simple;
824   GOutputStreamClass *class;
825
826   g_return_val_if_fail (G_IS_OUTPUT_STREAM (stream), -1);
827   g_return_val_if_fail (G_IS_ASYNC_RESULT (result), -1);
828
829   if (G_IS_SIMPLE_ASYNC_RESULT (result))
830     {
831       simple = G_SIMPLE_ASYNC_RESULT (result);
832       if (g_simple_async_result_propagate_error (simple, error))
833         return -1;
834     }
835   
836   class = G_OUTPUT_STREAM_GET_CLASS (stream);
837   return class->splice_finish (stream, result, error);
838 }
839
840 /**
841  * g_output_stream_flush_async:
842  * @stream: a #GOutputStream.
843  * @io_priority: the io priority of the request.
844  * @cancellable: optional #GCancellable object, %NULL to ignore.
845  * @callback: a #GAsyncReadyCallback to call when the request is satisfied
846  * @user_data: the data to pass to callback function
847  * 
848  * Flushes a stream asynchronously.
849  * For behaviour details see g_output_stream_flush().
850  *
851  * When the operation is finished @callback will be 
852  * called. You can then call g_output_stream_flush_finish() to get the 
853  * result of the operation.
854  **/
855 void
856 g_output_stream_flush_async (GOutputStream       *stream,
857                              int                  io_priority,
858                              GCancellable        *cancellable,
859                              GAsyncReadyCallback  callback,
860                              gpointer             user_data)
861 {
862   GOutputStreamClass *class;
863   GSimpleAsyncResult *simple;
864   GError *error = NULL;
865
866   g_return_if_fail (G_IS_OUTPUT_STREAM (stream));
867
868   if (!g_output_stream_set_pending (stream, &error))
869     {
870       g_simple_async_report_gerror_in_idle (G_OBJECT (stream),
871                                             callback,
872                                             user_data,
873                                             error);
874       g_error_free (error);
875       return;
876     }
877
878   stream->priv->outstanding_callback = callback;
879   g_object_ref (stream);
880
881   class = G_OUTPUT_STREAM_GET_CLASS (stream);
882   
883   if (class->flush_async == NULL)
884     {
885       simple = g_simple_async_result_new (G_OBJECT (stream),
886                                           async_ready_callback_wrapper,
887                                           user_data,
888                                           g_output_stream_flush_async);
889       g_simple_async_result_complete_in_idle (simple);
890       g_object_unref (simple);
891       return;
892     }
893       
894   class->flush_async (stream, io_priority, cancellable,
895                       async_ready_callback_wrapper, user_data);
896 }
897
898 /**
899  * g_output_stream_flush_finish:
900  * @stream: a #GOutputStream.
901  * @result: a GAsyncResult.
902  * @error: a #GError location to store the error occuring, or %NULL to 
903  * ignore.
904  * 
905  * Finishes flushing an output stream.
906  * 
907  * Returns: %TRUE if flush operation suceeded, %FALSE otherwise.
908  **/
909 gboolean
910 g_output_stream_flush_finish (GOutputStream  *stream,
911                               GAsyncResult   *result,
912                               GError        **error)
913 {
914   GSimpleAsyncResult *simple;
915   GOutputStreamClass *klass;
916
917   g_return_val_if_fail (G_IS_OUTPUT_STREAM (stream), FALSE);
918   g_return_val_if_fail (G_IS_ASYNC_RESULT (result), FALSE);
919
920   if (G_IS_SIMPLE_ASYNC_RESULT (result))
921     {
922       simple = G_SIMPLE_ASYNC_RESULT (result);
923       if (g_simple_async_result_propagate_error (simple, error))
924         return FALSE;
925
926       /* Special case default implementation */
927       if (g_simple_async_result_get_source_tag (simple) == g_output_stream_flush_async)
928         return TRUE;
929     }
930
931   klass = G_OUTPUT_STREAM_GET_CLASS (stream);
932   return klass->flush_finish (stream, result, error);
933 }
934
935
936 /**
937  * g_output_stream_close_async:
938  * @stream: A #GOutputStream.
939  * @io_priority: the io priority of the request.
940  * @callback: callback to call when the request is satisfied
941  * @user_data: the data to pass to callback function
942  * @cancellable: optional cancellable object
943  *
944  * Requests an asynchronous close of the stream, releasing resources 
945  * related to it. When the operation is finished @callback will be 
946  * called. You can then call g_output_stream_close_finish() to get 
947  * the result of the operation.
948  *
949  * For behaviour details see g_output_stream_close().
950  *
951  * The asyncronous methods have a default fallback that uses threads 
952  * to implement asynchronicity, so they are optional for inheriting 
953  * classes. However, if you override one you must override all.
954  **/
955 void
956 g_output_stream_close_async (GOutputStream       *stream,
957                              int                  io_priority,
958                              GCancellable        *cancellable,
959                              GAsyncReadyCallback  callback,
960                              gpointer             user_data)
961 {
962   GOutputStreamClass *class;
963   GSimpleAsyncResult *simple;
964   GError *error = NULL;
965
966   g_return_if_fail (G_IS_OUTPUT_STREAM (stream));
967   
968   if (stream->priv->closed)
969     {
970       simple = g_simple_async_result_new (G_OBJECT (stream),
971                                           callback,
972                                           user_data,
973                                           g_output_stream_close_async);
974       g_simple_async_result_complete_in_idle (simple);
975       g_object_unref (simple);
976       return;
977     }
978
979   if (!g_output_stream_set_pending (stream, &error))
980     {
981       g_simple_async_report_gerror_in_idle (G_OBJECT (stream),
982                                             callback,
983                                             user_data,
984                                             error);
985       g_error_free (error);
986       return;
987     }
988   
989   class = G_OUTPUT_STREAM_GET_CLASS (stream);
990   stream->priv->closing = TRUE;
991   stream->priv->outstanding_callback = callback;
992   g_object_ref (stream);
993   class->close_async (stream, io_priority, cancellable,
994                       async_ready_close_callback_wrapper, user_data);
995 }
996
997 /**
998  * g_output_stream_close_finish:
999  * @stream: a #GOutputStream.
1000  * @result: a #GAsyncResult.
1001  * @error: a #GError location to store the error occuring, or %NULL to 
1002  * ignore.
1003  * 
1004  * Closes an output stream.
1005  * 
1006  * Returns: %TRUE if stream was successfully closed, %FALSE otherwise.
1007  **/
1008 gboolean
1009 g_output_stream_close_finish (GOutputStream  *stream,
1010                               GAsyncResult   *result,
1011                               GError        **error)
1012 {
1013   GSimpleAsyncResult *simple;
1014   GOutputStreamClass *class;
1015
1016   g_return_val_if_fail (G_IS_OUTPUT_STREAM (stream), FALSE);
1017   g_return_val_if_fail (G_IS_ASYNC_RESULT (result), FALSE);
1018
1019   if (G_IS_SIMPLE_ASYNC_RESULT (result))
1020     {
1021       simple = G_SIMPLE_ASYNC_RESULT (result);
1022       if (g_simple_async_result_propagate_error (simple, error))
1023         return FALSE;
1024
1025       /* Special case already closed */
1026       if (g_simple_async_result_get_source_tag (simple) == g_output_stream_close_async)
1027         return TRUE;
1028     }
1029
1030   class = G_OUTPUT_STREAM_GET_CLASS (stream);
1031   return class->close_finish (stream, result, error);
1032 }
1033
1034 /**
1035  * g_output_stream_is_closed:
1036  * @stream: a #GOutputStream.
1037  * 
1038  * Checks if an output stream has already been closed.
1039  * 
1040  * Returns: %TRUE if @stream is closed. %FALSE otherwise. 
1041  **/
1042 gboolean
1043 g_output_stream_is_closed (GOutputStream *stream)
1044 {
1045   g_return_val_if_fail (G_IS_OUTPUT_STREAM (stream), TRUE);
1046   
1047   return stream->priv->closed;
1048 }
1049
1050 /**
1051  * g_output_stream_is_closing:
1052  * @stream: a #GOutputStream.
1053  *
1054  * Checks if an output stream is being closed. This can be
1055  * used inside e.g. a flush implementation to see if the
1056  * flush (or other i/o operation) is called from within
1057  * the closing operation.
1058  *
1059  * Returns: %TRUE if @stream is being closed. %FALSE otherwise.
1060  *
1061  * Since: 2.24
1062  **/
1063 gboolean
1064 g_output_stream_is_closing (GOutputStream *stream)
1065 {
1066   g_return_val_if_fail (G_IS_OUTPUT_STREAM (stream), TRUE);
1067
1068   return stream->priv->closing;
1069 }
1070
1071 /**
1072  * g_output_stream_has_pending:
1073  * @stream: a #GOutputStream.
1074  * 
1075  * Checks if an ouput stream has pending actions.
1076  * 
1077  * Returns: %TRUE if @stream has pending actions. 
1078  **/
1079 gboolean
1080 g_output_stream_has_pending (GOutputStream *stream)
1081 {
1082   g_return_val_if_fail (G_IS_OUTPUT_STREAM (stream), FALSE);
1083   
1084   return stream->priv->pending;
1085 }
1086
1087 /**
1088  * g_output_stream_set_pending:
1089  * @stream: a #GOutputStream.
1090  * @error: a #GError location to store the error occuring, or %NULL to 
1091  * ignore.
1092  * 
1093  * Sets @stream to have actions pending. If the pending flag is
1094  * already set or @stream is closed, it will return %FALSE and set
1095  * @error.
1096  *
1097  * Return value: %TRUE if pending was previously unset and is now set.
1098  **/
1099 gboolean
1100 g_output_stream_set_pending (GOutputStream *stream,
1101                              GError **error)
1102 {
1103   g_return_val_if_fail (G_IS_OUTPUT_STREAM (stream), FALSE);
1104   
1105   if (stream->priv->closed)
1106     {
1107       g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_CLOSED,
1108                            _("Stream is already closed"));
1109       return FALSE;
1110     }
1111   
1112   if (stream->priv->pending)
1113     {
1114       g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_PENDING,
1115                            /* Translators: This is an error you get if there is
1116                             * already an operation running against this stream when
1117                             * you try to start one */
1118                            _("Stream has outstanding operation"));
1119       return FALSE;
1120     }
1121   
1122   stream->priv->pending = TRUE;
1123   return TRUE;
1124 }
1125
1126 /**
1127  * g_output_stream_clear_pending:
1128  * @stream: output stream
1129  * 
1130  * Clears the pending flag on @stream.
1131  **/
1132 void
1133 g_output_stream_clear_pending (GOutputStream *stream)
1134 {
1135   g_return_if_fail (G_IS_OUTPUT_STREAM (stream));
1136   
1137   stream->priv->pending = FALSE;
1138 }
1139
1140
1141 /********************************************
1142  *   Default implementation of async ops    *
1143  ********************************************/
1144
1145 typedef struct {
1146   const void         *buffer;
1147   gsize               count_requested;
1148   gssize              count_written;
1149 } WriteData;
1150
1151 static void
1152 write_async_thread (GSimpleAsyncResult *res,
1153                     GObject            *object,
1154                     GCancellable       *cancellable)
1155 {
1156   WriteData *op;
1157   GOutputStreamClass *class;
1158   GError *error = NULL;
1159
1160   class = G_OUTPUT_STREAM_GET_CLASS (object);
1161   op = g_simple_async_result_get_op_res_gpointer (res);
1162   op->count_written = class->write_fn (G_OUTPUT_STREAM (object), op->buffer, op->count_requested,
1163                                        cancellable, &error);
1164   if (op->count_written == -1)
1165     {
1166       g_simple_async_result_set_from_error (res, error);
1167       g_error_free (error);
1168     }
1169 }
1170
1171 static void
1172 g_output_stream_real_write_async (GOutputStream       *stream,
1173                                   const void          *buffer,
1174                                   gsize                count,
1175                                   int                  io_priority,
1176                                   GCancellable        *cancellable,
1177                                   GAsyncReadyCallback  callback,
1178                                   gpointer             user_data)
1179 {
1180   GSimpleAsyncResult *res;
1181   WriteData *op;
1182
1183   op = g_new0 (WriteData, 1);
1184   res = g_simple_async_result_new (G_OBJECT (stream), callback, user_data, g_output_stream_real_write_async);
1185   g_simple_async_result_set_op_res_gpointer (res, op, g_free);
1186   op->buffer = buffer;
1187   op->count_requested = count;
1188   
1189   g_simple_async_result_run_in_thread (res, write_async_thread, io_priority, cancellable);
1190   g_object_unref (res);
1191 }
1192
1193 static gssize
1194 g_output_stream_real_write_finish (GOutputStream  *stream,
1195                                    GAsyncResult   *result,
1196                                    GError        **error)
1197 {
1198   GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (result);
1199   WriteData *op;
1200
1201   g_warn_if_fail (g_simple_async_result_get_source_tag (simple) == g_output_stream_real_write_async);
1202   op = g_simple_async_result_get_op_res_gpointer (simple);
1203   return op->count_written;
1204 }
1205
1206 typedef struct {
1207   GInputStream *source;
1208   GOutputStreamSpliceFlags flags;
1209   gssize bytes_copied;
1210 } SpliceData;
1211
1212 static void
1213 splice_async_thread (GSimpleAsyncResult *result,
1214                      GObject            *object,
1215                      GCancellable       *cancellable)
1216 {
1217   SpliceData *op;
1218   GOutputStreamClass *class;
1219   GError *error = NULL;
1220   GOutputStream *stream;
1221
1222   stream = G_OUTPUT_STREAM (object);
1223   class = G_OUTPUT_STREAM_GET_CLASS (object);
1224   op = g_simple_async_result_get_op_res_gpointer (result);
1225   
1226   op->bytes_copied = class->splice (stream,
1227                                     op->source,
1228                                     op->flags,
1229                                     cancellable,
1230                                     &error);
1231   if (op->bytes_copied == -1)
1232     {
1233       g_simple_async_result_set_from_error (result, error);
1234       g_error_free (error);
1235     }
1236 }
1237
1238 static void
1239 g_output_stream_real_splice_async (GOutputStream             *stream,
1240                                    GInputStream              *source,
1241                                    GOutputStreamSpliceFlags   flags,
1242                                    int                        io_priority,
1243                                    GCancellable              *cancellable,
1244                                    GAsyncReadyCallback        callback,
1245                                    gpointer                   user_data)
1246 {
1247   GSimpleAsyncResult *res;
1248   SpliceData *op;
1249
1250   op = g_new0 (SpliceData, 1);
1251   res = g_simple_async_result_new (G_OBJECT (stream), callback, user_data, g_output_stream_real_splice_async);
1252   g_simple_async_result_set_op_res_gpointer (res, op, g_free);
1253   op->flags = flags;
1254   op->source = source;
1255
1256   /* TODO: In the case where both source and destintion have
1257      non-threadbased async calls we can use a true async copy here */
1258   
1259   g_simple_async_result_run_in_thread (res, splice_async_thread, io_priority, cancellable);
1260   g_object_unref (res);
1261 }
1262
1263 static gssize
1264 g_output_stream_real_splice_finish (GOutputStream  *stream,
1265                                     GAsyncResult   *result,
1266                                     GError        **error)
1267 {
1268   GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (result);
1269   SpliceData *op;
1270
1271   g_warn_if_fail (g_simple_async_result_get_source_tag (simple) == g_output_stream_real_splice_async);
1272   op = g_simple_async_result_get_op_res_gpointer (simple);
1273   return op->bytes_copied;
1274 }
1275
1276
1277 static void
1278 flush_async_thread (GSimpleAsyncResult *res,
1279                     GObject            *object,
1280                     GCancellable       *cancellable)
1281 {
1282   GOutputStreamClass *class;
1283   gboolean result;
1284   GError *error = NULL;
1285
1286   class = G_OUTPUT_STREAM_GET_CLASS (object);
1287   result = TRUE;
1288   if (class->flush)
1289     result = class->flush (G_OUTPUT_STREAM (object), cancellable, &error);
1290
1291   if (!result)
1292     {
1293       g_simple_async_result_set_from_error (res, error);
1294       g_error_free (error);
1295     }
1296 }
1297
1298 static void
1299 g_output_stream_real_flush_async (GOutputStream       *stream,
1300                                   int                  io_priority,
1301                                   GCancellable        *cancellable,
1302                                   GAsyncReadyCallback  callback,
1303                                   gpointer             user_data)
1304 {
1305   GSimpleAsyncResult *res;
1306
1307   res = g_simple_async_result_new (G_OBJECT (stream), callback, user_data, g_output_stream_real_write_async);
1308   
1309   g_simple_async_result_run_in_thread (res, flush_async_thread, io_priority, cancellable);
1310   g_object_unref (res);
1311 }
1312
1313 static gboolean
1314 g_output_stream_real_flush_finish (GOutputStream  *stream,
1315                                    GAsyncResult   *result,
1316                                    GError        **error)
1317 {
1318   return TRUE;
1319 }
1320
1321 static void
1322 close_async_thread (GSimpleAsyncResult *res,
1323                     GObject            *object,
1324                     GCancellable       *cancellable)
1325 {
1326   GOutputStreamClass *class;
1327   GError *error = NULL;
1328   gboolean result;
1329
1330   /* Auto handling of cancelation disabled, and ignore
1331      cancellation, since we want to close things anyway, although
1332      possibly in a quick-n-dirty way. At least we never want to leak
1333      open handles */
1334
1335   class = G_OUTPUT_STREAM_GET_CLASS (object);
1336   if (class->close_fn)
1337     {
1338       result = class->close_fn (G_OUTPUT_STREAM (object), cancellable, &error);
1339       if (!result)
1340         {
1341           g_simple_async_result_set_from_error (res, error);
1342           g_error_free (error);
1343         }
1344     }
1345 }
1346
1347 static void
1348 g_output_stream_real_close_async (GOutputStream       *stream,
1349                                   int                  io_priority,
1350                                   GCancellable        *cancellable,
1351                                   GAsyncReadyCallback  callback,
1352                                   gpointer             user_data)
1353 {
1354   GSimpleAsyncResult *res;
1355   
1356   res = g_simple_async_result_new (G_OBJECT (stream), callback, user_data, g_output_stream_real_close_async);
1357
1358   g_simple_async_result_set_handle_cancellation (res, FALSE);
1359   
1360   g_simple_async_result_run_in_thread (res, close_async_thread, io_priority, cancellable);
1361   g_object_unref (res);
1362 }
1363
1364 static gboolean
1365 g_output_stream_real_close_finish (GOutputStream  *stream,
1366                                    GAsyncResult   *result,
1367                                    GError        **error)
1368 {
1369   GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (result);
1370   g_warn_if_fail (g_simple_async_result_get_source_tag (simple) == g_output_stream_real_close_async);
1371   return TRUE;
1372 }
1373
1374 #define __G_OUTPUT_STREAM_C__
1375 #include "gioaliasdef.c"