input_stream: return errors with GError

This commit is contained in:
Max Kellermann
2009-11-14 23:53:04 +01:00
parent d000d31355
commit 228b03edf8
36 changed files with 422 additions and 175 deletions

View File

@@ -25,20 +25,32 @@
#include <glib.h>
#include <assert.h>
bool
input_stream_open(struct input_stream *is, const char *url)
static inline GQuark
input_quark(void)
{
return g_quark_from_static_string("input");
}
bool
input_stream_open(struct input_stream *is, const char *url, GError **error_r)
{
GError *error = NULL;
assert(error_r == NULL || *error_r == NULL);
is->seekable = false;
is->ready = false;
is->offset = 0;
is->size = -1;
is->error = 0;
is->mime = NULL;
for (unsigned i = 0; input_plugins[i] != NULL; ++i) {
const struct input_plugin *plugin = input_plugins[i];
if (input_plugins_enabled[i] && plugin->open(is, url)) {
if (!input_plugins_enabled[i])
continue;
if (plugin->open(is, url, &error)) {
assert(is->plugin != NULL);
assert(is->plugin->close != NULL);
assert(is->plugin->read != NULL);
@@ -46,19 +58,24 @@ input_stream_open(struct input_stream *is, const char *url)
assert(!is->seekable || is->plugin->seek != NULL);
return true;
} else if (error != NULL) {
g_propagate_error(error_r, error);
return false;
}
}
g_set_error(error_r, input_quark(), 0, "Unrecognized URI");
return false;
}
bool
input_stream_seek(struct input_stream *is, goffset offset, int whence)
input_stream_seek(struct input_stream *is, goffset offset, int whence,
GError **error_r)
{
if (is->plugin->seek == NULL)
return false;
return is->plugin->seek(is, offset, whence);
return is->plugin->seek(is, offset, whence, error_r);
}
struct tag *
@@ -72,12 +89,13 @@ input_stream_tag(struct input_stream *is)
}
size_t
input_stream_read(struct input_stream *is, void *ptr, size_t size)
input_stream_read(struct input_stream *is, void *ptr, size_t size,
GError **error_r)
{
assert(ptr != NULL);
assert(size > 0);
return is->plugin->read(is, ptr, size);
return is->plugin->read(is, ptr, size, error_r);
}
void input_stream_close(struct input_stream *is)
@@ -92,10 +110,11 @@ bool input_stream_eof(struct input_stream *is)
return is->plugin->eof(is);
}
int input_stream_buffer(struct input_stream *is)
int
input_stream_buffer(struct input_stream *is, GError **error_r)
{
if (is->plugin->buffer == NULL)
return 0;
return is->plugin->buffer(is);
return is->plugin->buffer(is, error_r);
}