summaryrefslogtreecommitdiff
path: root/source/cbz/mucbz.c
diff options
context:
space:
mode:
authorSebastian Rasmussen <sebras@gmail.com>2016-08-13 17:45:14 +0800
committerSebastian Rasmussen <sebras@gmail.com>2016-09-08 18:53:00 +0800
commit15cab201d3c98dc6580c8cf592d94ab226f96db5 (patch)
tree352861e9bf8b5ec8289810501faa0007c19b7f68 /source/cbz/mucbz.c
parent793ae6a3c2d23743e66039b124f826b232a5a04e (diff)
downloadmupdf-15cab201d3c98dc6580c8cf592d94ab226f96db5.tar.xz
Make fz_archive a generic archive type.
Previously it was inherently tied to zip archives and directories. Now these are separated out into distinct subclasses. This prepares for support for further archive formats.
Diffstat (limited to 'source/cbz/mucbz.c')
-rw-r--r--source/cbz/mucbz.c48
1 files changed, 28 insertions, 20 deletions
diff --git a/source/cbz/mucbz.c b/source/cbz/mucbz.c
index 0b5de93e..17a881cc 100644
--- a/source/cbz/mucbz.c
+++ b/source/cbz/mucbz.c
@@ -19,7 +19,7 @@ struct cbz_page_s
struct cbz_document_s
{
fz_document super;
- fz_archive *zip;
+ fz_archive *arch;
int page_count;
const char **page;
};
@@ -75,10 +75,10 @@ cbz_compare_page_names(const void *a, const void *b)
static void
cbz_create_page_list(fz_context *ctx, cbz_document *doc)
{
- fz_archive *zip = doc->zip;
+ fz_archive *arch = doc->arch;
int i, k, count;
- count = fz_count_archive_entries(ctx, zip);
+ count = fz_count_archive_entries(ctx, arch);
doc->page_count = 0;
doc->page = fz_malloc_array(ctx, count, sizeof *doc->page);
@@ -87,8 +87,13 @@ cbz_create_page_list(fz_context *ctx, cbz_document *doc)
{
for (k = 0; cbz_ext_list[k]; k++)
{
- const char *name = fz_list_archive_entry(ctx, zip, i);
- const char *ext = name ? strrchr(name, '.') : NULL;
+ const char *name;
+ const char *ext;
+
+ if (arch)
+ name = fz_list_archive_entry(ctx, arch, i);
+
+ ext = name ? strrchr(name, '.') : NULL;
if (ext && !fz_strcasecmp(ext, cbz_ext_list[k]))
{
doc->page[doc->page_count++] = name;
@@ -103,7 +108,7 @@ cbz_create_page_list(fz_context *ctx, cbz_document *doc)
static void
cbz_drop_document(fz_context *ctx, cbz_document *doc)
{
- fz_drop_archive(ctx, doc->zip);
+ fz_drop_archive(ctx, doc->arch);
fz_free(ctx, (char **)doc->page);
fz_free(ctx, doc);
}
@@ -155,7 +160,7 @@ cbz_load_page(fz_context *ctx, cbz_document *doc, int number)
{
unsigned char *data = NULL;
cbz_page *page = NULL;
- fz_buffer *buf;
+ fz_buffer *buf = NULL;
if (number < 0 || number >= doc->page_count)
return NULL;
@@ -163,7 +168,11 @@ cbz_load_page(fz_context *ctx, cbz_document *doc, int number)
fz_var(data);
fz_var(page);
- buf = fz_read_archive_entry(ctx, doc->zip, doc->page[number]);
+ if (doc->arch)
+ buf = fz_read_archive_entry(ctx, doc->arch, doc->page[number]);
+ if (!buf)
+ fz_throw(ctx, FZ_ERROR_GENERIC, "cannot load cbz page");
+
fz_try(ctx)
{
page = fz_new_page(ctx, sizeof *page);
@@ -190,14 +199,16 @@ static int
cbz_lookup_metadata(fz_context *ctx, cbz_document *doc, const char *key, char *buf, int size)
{
if (!strcmp(key, "format"))
- return (int)fz_strlcpy(buf, "CBZ", size);
+ return (int) fz_strlcpy(buf, fz_archive_format(ctx, doc->arch), size);
return -1;
}
static cbz_document *
cbz_open_document_with_stream(fz_context *ctx, fz_stream *file)
{
- cbz_document *doc = fz_new_document(ctx, cbz_document);
+ cbz_document *doc;
+
+ doc = fz_new_document(ctx, cbz_document);
doc->super.drop_document = (fz_document_drop_fn *)cbz_drop_document;
doc->super.count_pages = (fz_document_count_pages_fn *)cbz_count_pages;
@@ -206,7 +217,7 @@ cbz_open_document_with_stream(fz_context *ctx, fz_stream *file)
fz_try(ctx)
{
- doc->zip = fz_open_archive_with_stream(ctx, file);
+ doc->arch = fz_open_archive_with_stream(ctx, file);
cbz_create_page_list(ctx, doc);
}
fz_catch(ctx)
@@ -236,18 +247,15 @@ cbz_open_document(fz_context *ctx, const char *filename)
}
static int
-cbz_recognize(fz_context *doc, const char *magic)
+cbz_recognize(fz_context *ctx, const char *magic)
{
char *ext = strrchr(magic, '.');
-
- if (ext)
- {
- if (!fz_strcasecmp(ext, ".cbz") || !fz_strcasecmp(ext, ".zip"))
- return 100;
- }
- if (!strcmp(magic, "cbz") || !strcmp(magic, "application/x-cbz"))
+ if ((ext && !fz_strcasecmp(ext, ".cbz")) || !strcmp(magic, "cbz") ||
+ !strcmp(magic, "application/x-cbz"))
+ return 100;
+ if ((ext && !fz_strcasecmp(ext, ".zip")) || !strcmp(magic, "zip") ||
+ !strcmp(magic, "application/zip"))
return 100;
-
return 0;
}