diff options
Diffstat (limited to 'source/fitz/archive.c')
-rw-r--r-- | source/fitz/archive.c | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/source/fitz/archive.c b/source/fitz/archive.c new file mode 100644 index 00000000..a61ceb01 --- /dev/null +++ b/source/fitz/archive.c @@ -0,0 +1,103 @@ +#include "mupdf/fitz.h" + +fz_stream * +fz_open_archive_entry(fz_context *ctx, fz_archive *arch, const char *name) +{ + if (!arch->open_entry) + fz_throw(ctx, FZ_ERROR_GENERIC, "cannot open archive entry"); + return arch->open_entry(ctx, arch, name); +} + +fz_buffer * +fz_read_archive_entry(fz_context *ctx, fz_archive *arch, const char *name) +{ + if (!arch->read_entry) + fz_throw(ctx, FZ_ERROR_GENERIC, "cannot read archive entry"); + return arch->read_entry(ctx, arch, name); +} + +int +fz_has_archive_entry(fz_context *ctx, fz_archive *arch, const char *name) +{ + if (!arch->has_entry) + fz_throw(ctx, FZ_ERROR_GENERIC, "cannot check if archive has entry"); + return arch->has_entry(ctx, arch, name); +} + +const char * +fz_list_archive_entry(fz_context *ctx, fz_archive *arch, int idx) +{ + if (!arch->list_entry) + fz_throw(ctx, FZ_ERROR_GENERIC, "cannot list archive entries"); + return arch->list_entry(ctx, arch, idx); +} +int +fz_count_archive_entries(fz_context *ctx, fz_archive *arch) +{ + if (!arch->count_entries) + fz_throw(ctx, FZ_ERROR_GENERIC, "cannot count archive entries"); + return arch->count_entries(ctx, arch); +} + +const char * +fz_archive_format(fz_context *ctx, fz_archive *arch) +{ + return arch->format; +} + +fz_archive * +fz_new_archive_of_size(fz_context *ctx, fz_stream *file, int size) +{ + fz_archive *arch; + arch = Memento_label(fz_calloc(ctx, 1, size), "fz_archive"); + arch->file = fz_keep_stream(ctx, file); + return arch; +} + +fz_archive * +fz_open_archive_with_stream(fz_context *ctx, fz_stream *file) +{ + fz_archive *arch = NULL; + + fz_try(ctx) + { + if (fz_is_zip_archive(ctx, file)) + arch = fz_open_zip_archive_with_stream(ctx, file); + else + fz_throw(ctx, FZ_ERROR_GENERIC, "cannot recognize archive"); + } + fz_catch(ctx) + fz_rethrow(ctx); + + return arch; +} + +fz_archive * +fz_open_archive(fz_context *ctx, const char *filename) +{ + fz_stream *file; + fz_archive *arch = NULL; + + file = fz_open_file(ctx, filename); + + fz_try(ctx) + arch = fz_open_archive_with_stream(ctx, file); + fz_always(ctx) + fz_drop_stream(ctx, file); + fz_catch(ctx) + fz_rethrow(ctx); + + return arch; +} + +void +fz_drop_archive(fz_context *ctx, fz_archive *arch) +{ + if (!arch) + return; + + if (arch->drop_archive) + arch->drop_archive(ctx, arch); + fz_drop_stream(ctx, arch->file); + fz_free(ctx, arch); +} |