input_plugin: add method update()

Update the struct attributes, important for facades like the "rewind"
plugin.  To replace buffer().
This commit is contained in:
Max Kellermann 2011-09-14 22:25:29 +02:00
parent 8c6e8a6eb8
commit ad37c88f80
4 changed files with 33 additions and 0 deletions

View File

@ -105,6 +105,15 @@ input_rewind_close(struct input_stream *is)
g_free(r);
}
static void
input_rewind_update(struct input_stream *is)
{
struct input_rewind *r = (struct input_rewind *)is;
if (!reading_from_buffer(r))
copy_attributes(r);
}
static struct tag *
input_rewind_tag(struct input_stream *is)
{
@ -210,6 +219,7 @@ input_rewind_seek(struct input_stream *is, goffset offset, int whence,
static const struct input_plugin rewind_input_plugin = {
.close = input_rewind_close,
.update = input_rewind_update,
.tag = input_rewind_tag,
.buffer = input_rewind_buffer,
.read = input_rewind_read,

View File

@ -51,6 +51,12 @@ struct input_plugin {
struct input_stream *(*open)(const char *uri, GError **error_r);
void (*close)(struct input_stream *is);
/**
* Update the public attributes. Call before access. Can be
* NULL if the plugin always keeps its attributes up to date.
*/
void (*update)(struct input_stream *is);
struct tag *(*tag)(struct input_stream *is);
int (*buffer)(struct input_stream *is, GError **error_r);
size_t (*read)(struct input_stream *is, void *ptr, size_t size,

View File

@ -67,6 +67,16 @@ input_stream_open(const char *url, GError **error_r)
return false;
}
void
input_stream_update(struct input_stream *is)
{
assert(is != NULL);
assert(is->plugin != NULL);
if (is->plugin->update != NULL)
is->plugin->update(is);
}
bool
input_stream_seek(struct input_stream *is, goffset offset, int whence,
GError **error_r)

View File

@ -86,6 +86,13 @@ input_stream_open(const char *uri, GError **error_r);
void
input_stream_close(struct input_stream *is);
/**
* Update the public attributes. Call before accessing attributes
* such as "ready" or "offset".
*/
void
input_stream_update(struct input_stream *is);
/**
* Seeks to the specified position in the stream. This will most
* likely fail if the "seekable" flag is false.