X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;ds=sidebyside;f=gio%2Fgpollableoutputstream.c;h=c16b90aa521f783b3dcbd05ec442f1b73e7c8d87;hb=2a53b4d0e2c98a14aedf31e38f0ad1fb2e8fe26f;hp=cb9138aad34be4667001591abbc845330f0b1755;hpb=c20c2c0abd3bdb1b30b85a586ee6095ed75a7bc2;p=platform%2Fupstream%2Fglib.git diff --git a/gio/gpollableoutputstream.c b/gio/gpollableoutputstream.c index cb9138a..c16b90a 100644 --- a/gio/gpollableoutputstream.c +++ b/gio/gpollableoutputstream.c @@ -13,9 +13,7 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General - * Public License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place, Suite 330, - * Boston, MA 02111-1307, USA. + * Public License along with this library; if not, see . */ #include "config.h" @@ -25,7 +23,6 @@ #include "gpollableoutputstream.h" #include "gasynchelper.h" #include "gfiledescriptorbased.h" -#include "gio-marshal.h" #include "glibintl.h" /** @@ -34,10 +31,10 @@ * @include: gio/gio.h * @see_also: #GOutputStream, #GFileDescriptorBased, #GPollableInputStream * - * #GPollableOutputStream is implemented by #GOutputStreams that + * #GPollableOutputStream is implemented by #GOutputStreams that * can be polled for readiness to write. This can be used when - * interfacing with a non-gio API that expects - * unix-file-descriptor-style asynchronous I/O rather than gio-style. + * interfacing with a non-GIO API that expects + * UNIX-file-descriptor-style asynchronous I/O rather than GIO-style. * * Since: 2.28 */ @@ -47,7 +44,7 @@ G_DEFINE_INTERFACE (GPollableOutputStream, g_pollable_output_stream, G_TYPE_OUTP static gboolean g_pollable_output_stream_default_can_poll (GPollableOutputStream *stream); static gssize g_pollable_output_stream_default_write_nonblocking (GPollableOutputStream *stream, const void *buffer, - gsize size, + gsize count, GError **error); static void @@ -118,7 +115,7 @@ g_pollable_output_stream_is_writable (GPollableOutputStream *stream) /** * g_pollable_output_stream_create_source: * @stream: a #GPollableOutputStream. - * @cancellable: a #GCancellable, or %NULL + * @cancellable: (allow-none): a #GCancellable, or %NULL * * Creates a #GSource that triggers when @stream can be written, or * @cancellable is triggered or an error occurs. The callback on the @@ -126,11 +123,10 @@ g_pollable_output_stream_is_writable (GPollableOutputStream *stream) * * As with g_pollable_output_stream_is_writable(), it is possible that * the stream may not actually be writable even after the source - * triggers, so you should use - * g_pollable_output_stream_write_nonblocking() rather than - * g_output_stream_write() from the callback. + * triggers, so you should use g_pollable_output_stream_write_nonblocking() + * rather than g_output_stream_write() from the callback. * - * Returns: a new #GSource + * Returns: (transfer full): a new #GSource * * Since: 2.28 */ @@ -147,29 +143,30 @@ g_pollable_output_stream_create_source (GPollableOutputStream *stream, static gssize g_pollable_output_stream_default_write_nonblocking (GPollableOutputStream *stream, const void *buffer, - gsize size, + gsize count, GError **error) { if (!g_pollable_output_stream_is_writable (stream)) { - g_set_error (error, G_IO_ERROR, G_IO_ERROR_WOULD_BLOCK, - g_strerror (EAGAIN)); + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_WOULD_BLOCK, + g_strerror (EAGAIN)); return -1; } - return g_output_stream_write (G_OUTPUT_STREAM (stream), buffer, size, - NULL, error); + return G_OUTPUT_STREAM_GET_CLASS (stream)-> + write_fn (G_OUTPUT_STREAM (stream), buffer, count, NULL, error); } /** * g_pollable_output_stream_write_nonblocking: * @stream: a #GPollableOutputStream - * @buffer: a buffer to write data from - * @size: the number of bytes you want to write - * @cancellable: a #GCancellable, or %NULL + * @buffer: (array length=count) (element-type guint8): a buffer to write + * data from + * @count: the number of bytes you want to write + * @cancellable: (allow-none): a #GCancellable, or %NULL * @error: #GError for error reporting, or %NULL to ignore. * - * Attempts to write up to @size bytes from @buffer to @stream, as + * Attempts to write up to @count bytes from @buffer to @stream, as * with g_output_stream_write(). If @stream is not currently writable, * this will immediately return %G_IO_ERROR_WOULD_BLOCK, and you can * use g_pollable_output_stream_create_source() to create a #GSource @@ -181,21 +178,43 @@ g_pollable_output_stream_default_write_nonblocking (GPollableOutputStream *stre * may happen if you call this method after a source triggers due * to having been cancelled. * - * Return value: the number of bytes written, or -1 on error (including + * Virtual: write_nonblocking + * Returns: the number of bytes written, or -1 on error (including * %G_IO_ERROR_WOULD_BLOCK). */ gssize g_pollable_output_stream_write_nonblocking (GPollableOutputStream *stream, const void *buffer, - gsize size, + gsize count, GCancellable *cancellable, GError **error) { + gssize res; + g_return_val_if_fail (G_IS_POLLABLE_OUTPUT_STREAM (stream), -1); + g_return_val_if_fail (buffer != NULL, 0); if (g_cancellable_set_error_if_cancelled (cancellable, error)) return -1; - return G_POLLABLE_OUTPUT_STREAM_GET_INTERFACE (stream)-> - write_nonblocking (stream, buffer, size, error); + if (count == 0) + return 0; + + if (((gssize) count) < 0) + { + g_set_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT, + _("Too large count value passed to %s"), G_STRFUNC); + return -1; + } + + if (cancellable) + g_cancellable_push_current (cancellable); + + res = G_POLLABLE_OUTPUT_STREAM_GET_INTERFACE (stream)-> + write_nonblocking (stream, buffer, count, error); + + if (cancellable) + g_cancellable_pop_current (cancellable); + + return res; }