From 82cfce76eb5787f1a24151f6a3840a999ed82659 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Fri, 30 Jan 2009 00:53:32 +0100 Subject: archive: replaced setup_stream() with open_stream() The open_stream() method opens the input_stream. This allows the archive plugin to do its own initialization, and it also allows it to use input_stream.data. We can remove input_stream.archive now, which was unnatural to have in the first place. --- src/input_archive.c | 85 +++-------------------------------------------------- 1 file changed, 4 insertions(+), 81 deletions(-) (limited to 'src/input_archive.c') diff --git a/src/input_archive.c b/src/input_archive.c index 387ad465a..26a44d2f4 100644 --- a/src/input_archive.c +++ b/src/input_archive.c @@ -16,29 +16,13 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +#include "input_archive.h" #include "archive_api.h" #include "archive_list.h" -#include "input_archive.h" #include "input_stream.h" -#include "gcc.h" -#include "log.h" -#include "ls.h" -#include -#include -#include -#include -#include -#include -#include #include -typedef struct { - const struct archive_plugin *aplugin; - const struct input_plugin *iplugin; - struct archive_file *file; -} archive_context; - /** * select correct archive plugin to handle the input stream * may allow stacking of archive plugins. for example for handling @@ -50,8 +34,8 @@ typedef struct { static bool input_archive_open(struct input_stream *is, const char *pathname) { - archive_context *arch_ctx; const struct archive_plugin *arplug; + struct archive_file *file; char *archive, *filename, *suffix, *pname; bool opened; @@ -74,24 +58,10 @@ input_archive_open(struct input_stream *is, const char *pathname) return false; } - arch_ctx = (archive_context *) g_malloc(sizeof(archive_context)); + file = arplug->open(archive); - //setup archive plugin pointer - arch_ctx->aplugin = arplug; - //open archive file - arch_ctx->file = arplug->open(archive); //setup fileops - arplug->setup_stream(arch_ctx->file, is); - //setup input plugin backup - arch_ctx->iplugin = is->plugin; - is->plugin = &input_plugin_archive; - - //internal handle - is->plugin = &input_plugin_archive; - is->data = arch_ctx; - - //open archive - opened = arch_ctx->iplugin->open(is, filename); + opened = arplug->open_stream(file, is, filename); if (!opened) { g_warning("open inarchive file %s failed\n\n",filename); @@ -102,53 +72,6 @@ input_archive_open(struct input_stream *is, const char *pathname) return opened; } -static void -input_archive_close(struct input_stream *is) -{ - archive_context *arch_ctx = (archive_context *)is->data; - //close archive infile ops - arch_ctx->iplugin->close(is); - //close archive - arch_ctx->aplugin->close(arch_ctx->file); - //free private data - g_free(arch_ctx); -} - -static bool -input_archive_seek(struct input_stream *is, off_t offset, int whence) -{ - archive_context *arch_ctx = (archive_context *)is->data; - return arch_ctx->iplugin->seek(is, offset, whence); -} - -static size_t -input_archive_read(struct input_stream *is, void *ptr, size_t size) -{ - archive_context *arch_ctx = (archive_context *)is->data; - assert(ptr != NULL); - assert(size > 0); - return arch_ctx->iplugin->read(is, ptr, size); -} - -static bool -input_archive_eof(struct input_stream *is) -{ - archive_context *arch_ctx = (archive_context *)is->data; - return arch_ctx->iplugin->eof(is); -} - -static int -input_archive_buffer(struct input_stream *is) -{ - archive_context *arch_ctx = (archive_context *)is->data; - return arch_ctx->iplugin->buffer(is); -} - const struct input_plugin input_plugin_archive = { .open = input_archive_open, - .close = input_archive_close, - .buffer = input_archive_buffer, - .read = input_archive_read, - .eof = input_archive_eof, - .seek = input_archive_seek, }; -- cgit v1.2.3