aboutsummaryrefslogtreecommitdiffstats
path: root/src/archive
diff options
context:
space:
mode:
authorMax Kellermann <max@duempel.org>2009-12-30 23:27:37 +0100
committerMax Kellermann <max@duempel.org>2010-01-01 17:25:07 +0100
commitd3b763a48c09a60a0c0b5ccb6cccd9376875c470 (patch)
tree83b8794f78ef8941806cf5757888d8abf2eaa126 /src/archive
parent816b6ad4a71c3ade95e62b62396f2b0415c03f20 (diff)
downloadmpd-d3b763a48c09a60a0c0b5ccb6cccd9376875c470.tar.gz
mpd-d3b763a48c09a60a0c0b5ccb6cccd9376875c470.tar.xz
mpd-d3b763a48c09a60a0c0b5ccb6cccd9376875c470.zip
input_stream: return allocated input_stream objects
Major API redesign: don't let the caller allocate the input_stream object. Let each input plugin allocate its own (derived/extended) input_stream pointer. The "data" attribute can now be removed, and all input plugins simply cast the input_stream pointer to their own structure (with an "struct input_stream base" as the first attribute).
Diffstat (limited to '')
-rw-r--r--src/archive/bz2_archive_plugin.c35
-rw-r--r--src/archive/iso9660_archive_plugin.c27
-rw-r--r--src/archive/zzip_archive_plugin.c29
-rw-r--r--src/archive_plugin.c6
-rw-r--r--src/archive_plugin.h9
5 files changed, 52 insertions, 54 deletions
diff --git a/src/archive/bz2_archive_plugin.c b/src/archive/bz2_archive_plugin.c
index 07d174403..75b4b1ece 100644
--- a/src/archive/bz2_archive_plugin.c
+++ b/src/archive/bz2_archive_plugin.c
@@ -45,10 +45,12 @@ struct bz2_archive_file {
char *name;
bool reset;
- struct input_stream istream;
+ struct input_stream *istream;
};
struct bz2_input_stream {
+ struct input_stream base;
+
struct bz2_archive_file *archive;
bool eof;
@@ -111,7 +113,8 @@ bz2_open(const char *pathname, GError **error_r)
refcount_init(&context->ref);
//open archive
- if (!input_stream_open(&context->istream, pathname, error_r)) {
+ context->istream = input_stream_open(pathname, error_r);
+ if (context->istream == NULL) {
g_free(context);
return NULL;
}
@@ -158,44 +161,42 @@ bz2_close(struct archive_file *file)
g_free(context->name);
- input_stream_close(&context->istream);
+ input_stream_close(context->istream);
g_free(context);
}
/* single archive handling */
-static bool
-bz2_open_stream(struct archive_file *file, struct input_stream *is,
+static struct input_stream *
+bz2_open_stream(struct archive_file *file,
G_GNUC_UNUSED const char *path, GError **error_r)
{
struct bz2_archive_file *context = (struct bz2_archive_file *) file;
struct bz2_input_stream *bis = g_new(struct bz2_input_stream, 1);
+ input_stream_init(&bis->base, &bz2_inputplugin);
+
bis->archive = context;
- //setup file ops
- is->plugin = &bz2_inputplugin;
- //insert back reference
- is->data = bis;
- is->ready = true;
- is->seekable = false;
+ bis->base.ready = true;
+ bis->base.seekable = false;
if (!bz2_alloc(bis, error_r)) {
g_free(bis);
- return false;
+ return NULL;
}
bis->eof = false;
refcount_inc(&context->ref);
- return true;
+ return &bis->base;
}
static void
bz2_is_close(struct input_stream *is)
{
- struct bz2_input_stream *bis = (struct bz2_input_stream *)is->data;
+ struct bz2_input_stream *bis = (struct bz2_input_stream *)is;
bz2_destroy(bis);
@@ -215,7 +216,7 @@ bz2_fillbuffer(struct bz2_input_stream *bis, GError **error_r)
if (bzstream->avail_in > 0)
return true;
- count = input_stream_read(&bis->archive->istream,
+ count = input_stream_read(bis->archive->istream,
bis->buffer, sizeof(bis->buffer),
error_r);
if (count == 0)
@@ -230,7 +231,7 @@ static size_t
bz2_is_read(struct input_stream *is, void *ptr, size_t length,
GError **error_r)
{
- struct bz2_input_stream *bis = (struct bz2_input_stream *)is->data;
+ struct bz2_input_stream *bis = (struct bz2_input_stream *)is;
bz_stream *bzstream;
int bz_result;
size_t nbytes = 0;
@@ -269,7 +270,7 @@ bz2_is_read(struct input_stream *is, void *ptr, size_t length,
static bool
bz2_is_eof(struct input_stream *is)
{
- struct bz2_input_stream *bis = (struct bz2_input_stream *)is->data;
+ struct bz2_input_stream *bis = (struct bz2_input_stream *)is;
return bis->eof;
}
diff --git a/src/archive/iso9660_archive_plugin.c b/src/archive/iso9660_archive_plugin.c
index f6c6ed5f2..38003da94 100644
--- a/src/archive/iso9660_archive_plugin.c
+++ b/src/archive/iso9660_archive_plugin.c
@@ -163,14 +163,16 @@ iso9660_archive_close(struct archive_file *file)
/* single archive handling */
struct iso9660_input_stream {
+ struct input_stream base;
+
struct iso9660_archive_file *archive;
iso9660_stat_t *statbuf;
size_t max_blocks;
};
-static bool
-iso9660_archive_open_stream(struct archive_file *file, struct input_stream *is,
+static struct input_stream *
+iso9660_archive_open_stream(struct archive_file *file,
const char *pathname, GError **error_r)
{
struct iso9660_archive_file *context =
@@ -178,6 +180,7 @@ iso9660_archive_open_stream(struct archive_file *file, struct input_stream *is,
struct iso9660_input_stream *iis;
iis = g_new(struct iso9660_input_stream, 1);
+ input_stream_init(&iis->base, &iso9660_input_plugin);
iis->archive = context;
iis->statbuf = iso9660_ifs_stat_translate(context->iso, pathname);
@@ -185,31 +188,26 @@ iso9660_archive_open_stream(struct archive_file *file, struct input_stream *is,
g_free(iis);
g_set_error(error_r, iso9660_quark(), 0,
"not found in the ISO file: %s", pathname);
- return false;
+ return NULL;
}
- //setup file ops
- is->plugin = &iso9660_input_plugin;
- //insert back reference
- is->data = iis;
- is->ready = true;
+ iis->base.ready = true;
//we are not seekable
- is->seekable = false;
+ iis->base.seekable = false;
- is->size = iis->statbuf->size;
+ iis->base.size = iis->statbuf->size;
iis->max_blocks = CEILING(iis->statbuf->size, ISO_BLOCKSIZE);
refcount_inc(&context->ref);
- return true;
+ return &iis->base;
}
static void
iso9660_input_close(struct input_stream *is)
{
- struct iso9660_input_stream *iis =
- (struct iso9660_input_stream *)is->data;
+ struct iso9660_input_stream *iis = (struct iso9660_input_stream *)is;
g_free(iis->statbuf);
@@ -220,8 +218,7 @@ iso9660_input_close(struct input_stream *is)
static size_t
iso9660_input_read(struct input_stream *is, void *ptr, size_t size, GError **error_r)
{
- struct iso9660_input_stream *iis =
- (struct iso9660_input_stream *)is->data;
+ struct iso9660_input_stream *iis = (struct iso9660_input_stream *)is;
int toread, readed = 0;
int no_blocks, cur_block;
size_t left_bytes = iis->statbuf->size - is->offset;
diff --git a/src/archive/zzip_archive_plugin.c b/src/archive/zzip_archive_plugin.c
index 3e0c063c2..7e59a0935 100644
--- a/src/archive/zzip_archive_plugin.c
+++ b/src/archive/zzip_archive_plugin.c
@@ -125,13 +125,15 @@ zzip_archive_close(struct archive_file *file)
/* single archive handling */
struct zzip_input_stream {
+ struct input_stream base;
+
struct zzip_archive *archive;
ZZIP_FILE *file;
};
-static bool
-zzip_archive_open_stream(struct archive_file *file, struct input_stream *is,
+static struct input_stream *
+zzip_archive_open_stream(struct archive_file *file,
const char *pathname, GError **error_r)
{
struct zzip_archive *context = (struct zzip_archive *) file;
@@ -139,6 +141,7 @@ zzip_archive_open_stream(struct archive_file *file, struct input_stream *is,
ZZIP_STAT z_stat;
zis = g_new(struct zzip_input_stream, 1);
+ input_stream_init(&zis->base, &zzip_input_plugin);
zis->archive = context;
zis->file = zzip_file_open(context->dir, pathname, 0);
@@ -146,29 +149,25 @@ zzip_archive_open_stream(struct archive_file *file, struct input_stream *is,
g_free(zis);
g_set_error(error_r, zzip_quark(), 0,
"not found in the ZIP file: %s", pathname);
- return false;
+ return NULL;
}
- //setup file ops
- is->plugin = &zzip_input_plugin;
- //insert back reference
- is->data = zis;
- is->ready = true;
+ zis->base.ready = true;
//we are seekable (but its not recommendent to do so)
- is->seekable = true;
+ zis->base.seekable = true;
zzip_file_stat(zis->file, &z_stat);
- is->size = z_stat.st_size;
+ zis->base.size = z_stat.st_size;
refcount_inc(&context->ref);
- return true;
+ return &zis->base;
}
static void
zzip_input_close(struct input_stream *is)
{
- struct zzip_input_stream *zis = (struct zzip_input_stream *)is->data;
+ struct zzip_input_stream *zis = (struct zzip_input_stream *)is;
zzip_file_close(zis->file);
zzip_archive_close(&zis->archive->base);
@@ -179,7 +178,7 @@ static size_t
zzip_input_read(struct input_stream *is, void *ptr, size_t size,
GError **error_r)
{
- struct zzip_input_stream *zis = (struct zzip_input_stream *)is->data;
+ struct zzip_input_stream *zis = (struct zzip_input_stream *)is;
int ret;
ret = zzip_file_read(zis->file, ptr, size);
@@ -197,7 +196,7 @@ zzip_input_read(struct input_stream *is, void *ptr, size_t size,
static bool
zzip_input_eof(struct input_stream *is)
{
- struct zzip_input_stream *zis = (struct zzip_input_stream *)is->data;
+ struct zzip_input_stream *zis = (struct zzip_input_stream *)is;
return (goffset)zzip_tell(zis->file) == is->size;
}
@@ -206,7 +205,7 @@ static bool
zzip_input_seek(struct input_stream *is,
goffset offset, int whence, GError **error_r)
{
- struct zzip_input_stream *zis = (struct zzip_input_stream *)is->data;
+ struct zzip_input_stream *zis = (struct zzip_input_stream *)is;
zzip_off_t ofs = zzip_seek(zis->file, offset, whence);
if (ofs != -1) {
g_set_error(error_r, zzip_quark(), ofs,
diff --git a/src/archive_plugin.c b/src/archive_plugin.c
index b43293e75..60da4d283 100644
--- a/src/archive_plugin.c
+++ b/src/archive_plugin.c
@@ -80,13 +80,13 @@ archive_file_scan_next(struct archive_file *file)
return file->plugin->scan_next(file);
}
-bool
-archive_file_open_stream(struct archive_file *file, struct input_stream *is,
+struct input_stream *
+archive_file_open_stream(struct archive_file *file,
const char *path, GError **error_r)
{
assert(file != NULL);
assert(file->plugin != NULL);
assert(file->plugin->open_stream != NULL);
- return file->plugin->open_stream(file, is, path, error_r);
+ return file->plugin->open_stream(file, path, error_r);
}
diff --git a/src/archive_plugin.h b/src/archive_plugin.h
index 254c81f66..b08c93389 100644
--- a/src/archive_plugin.h
+++ b/src/archive_plugin.h
@@ -71,8 +71,9 @@ struct archive_plugin {
* @param error_r location to store the error occuring, or
* NULL to ignore errors
*/
- bool (*open_stream)(struct archive_file *, struct input_stream *is,
- const char *path, GError **error_r);
+ struct input_stream *(*open_stream)(struct archive_file *af,
+ const char *path,
+ GError **error_r);
/**
* closes archive file.
@@ -99,8 +100,8 @@ archive_file_scan_reset(struct archive_file *file);
char *
archive_file_scan_next(struct archive_file *file);
-bool
-archive_file_open_stream(struct archive_file *file, struct input_stream *is,
+struct input_stream *
+archive_file_open_stream(struct archive_file *file,
const char *path, GError **error_r);
#endif