#include "gsimpleasyncresult.h"
#include "gioerror.h"
-#include "gioalias.h"
/**
* SECTION:ginputstream
* All of these functions have async variants too.
**/
-G_DEFINE_TYPE (GInputStream, g_input_stream, G_TYPE_OBJECT);
+G_DEFINE_ABSTRACT_TYPE (GInputStream, g_input_stream, G_TYPE_OBJECT);
struct _GInputStreamPrivate {
guint closed : 1;
static void
g_input_stream_finalize (GObject *object)
{
- GInputStream *stream;
-
- stream = G_INPUT_STREAM (object);
-
G_OBJECT_CLASS (g_input_stream_parent_class)->finalize (object);
}
char buffer[8192];
GError *my_error;
- class = G_INPUT_STREAM_GET_CLASS (stream);
-
if (G_IS_SEEKABLE (stream) && g_seekable_can_seek (G_SEEKABLE (stream)))
{
if (g_seekable_seek (G_SEEKABLE (stream),
/* If not seekable, or seek failed, fall back to reading data: */
class = G_INPUT_STREAM_GET_CLASS (stream);
-
+
read_bytes = 0;
while (1)
{
my_error = NULL;
ret = class->read_fn (stream, buffer, MIN (sizeof (buffer), count),
- cancellable, &my_error);
+ cancellable, &my_error);
if (ret == -1)
{
if (read_bytes > 0 &&
g_error_free (my_error);
return read_bytes;
}
-
+
g_propagate_error (error, my_error);
return -1;
}
count -= ret;
read_bytes += ret;
-
+
if (ret == 0 || count == 0)
- return read_bytes;
+ return read_bytes;
}
}
* You can then call g_input_stream_read_finish() to get the result of the
* operation.
*
- * During an async request no other sync and async calls are allowed, and will
+ * During an async request no other sync and async calls are allowed on @stream, and will
* result in %G_IO_ERROR_PENDING errors.
*
* A value of @count larger than %G_MAXSSIZE will cause a %G_IO_ERROR_INVALID_ARGUMENT error.
* g_input_stream_skip_async:
* @stream: A #GInputStream.
* @count: the number of bytes that will be skipped from the stream
- * @io_priority: the <link linkend="io-priority">I/O priority</link>
- * of the request.
- * @cancellable: optional #GCancellable object, %NULL to ignore.
+ * @io_priority: the <link linkend="io-priority">I/O priority</link>
+ * of the request.
+ * @cancellable: optional #GCancellable object, %NULL to ignore.
* @callback: callback to call when the request is satisfied
* @user_data: the data to pass to callback function
*
* Request an asynchronous skip of @count bytes from the stream.
- * When the operation is finished @callback will be called.
- * You can then call g_input_stream_skip_finish() to get the result of the
- * operation.
+ * When the operation is finished @callback will be called.
+ * You can then call g_input_stream_skip_finish() to get the result
+ * of the operation.
*
- * During an async request no other sync and async calls are allowed, and will
- * result in %G_IO_ERROR_PENDING errors.
+ * During an async request no other sync and async calls are allowed,
+ * and will result in %G_IO_ERROR_PENDING errors.
*
* A value of @count larger than %G_MAXSSIZE will cause a %G_IO_ERROR_INVALID_ARGUMENT error.
*
- * On success, the number of bytes skipped will be passed to the
- * callback. It is not an error if this is not the same as the requested size, as it
+ * On success, the number of bytes skipped will be passed to the callback.
+ * It is not an error if this is not the same as the requested size, as it
* can happen e.g. near the end of a file, but generally we try to skip
* as many bytes as requested. Zero is returned on end of file
* (or if @count is zero), but never otherwise.
*
- * Any outstanding i/o request with higher priority (lower numerical value) will
- * be executed before an outstanding request with lower priority. Default
- * priority is %G_PRIORITY_DEFAULT.
+ * Any outstanding i/o request with higher priority (lower numerical value)
+ * will be executed before an outstanding request with lower priority.
+ * Default priority is %G_PRIORITY_DEFAULT.
*
- * The asyncronous methods have a default fallback that uses threads to implement
- * asynchronicity, so they are optional for inheriting classes. However, if you
- * override one you must override all.
+ * The asynchronous methods have a default fallback that uses threads to
+ * implement asynchronicity, so they are optional for inheriting classes.
+ * However, if you override one, you must override all.
**/
void
g_input_stream_skip_async (GInputStream *stream,
op->buffer, op->count_requested,
cancellable, &error);
if (op->count_read == -1)
- {
- g_simple_async_result_set_from_error (res, error);
- g_error_free (error);
- }
+ g_simple_async_result_take_error (res, error);
}
static void
op->count_requested,
cancellable, &error);
if (op->count_skipped == -1)
- {
- g_simple_async_result_set_from_error (res, error);
- g_error_free (error);
- }
+ g_simple_async_result_take_error (res, error);
}
typedef struct {
if (ret == -1)
{
- if (data->count_skipped &&
- error->domain == G_IO_ERROR &&
- error->code == G_IO_ERROR_CANCELLED)
- { /* No error, return partial read */ }
+ if (data->count_skipped &&
+ g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
+ /* No error, return partial read */
+ g_error_free (error);
else
- g_simple_async_result_set_from_error (simple, error);
- g_error_free (error);
+ g_simple_async_result_take_error (simple, error);
}
/* Complete immediately, not in idle, since we're already in a mainloop callout */
{
result = class->close_fn (G_INPUT_STREAM (object), cancellable, &error);
if (!result)
- {
- g_simple_async_result_set_from_error (res, error);
- g_error_free (error);
- }
+ g_simple_async_result_take_error (res, error);
}
}
g_warn_if_fail (g_simple_async_result_get_source_tag (simple) == g_input_stream_real_close_async);
return TRUE;
}
-
-#define __G_INPUT_STREAM_C__
-#include "gioaliasdef.c"