diff options
Diffstat (limited to 'source/xps/xps-zip.c')
-rw-r--r-- | source/xps/xps-zip.c | 106 |
1 files changed, 43 insertions, 63 deletions
diff --git a/source/xps/xps-zip.c b/source/xps/xps-zip.c index e3d006ba..3759c4b6 100644 --- a/source/xps/xps-zip.c +++ b/source/xps/xps-zip.c @@ -1,45 +1,44 @@ #include "mupdf/xps.h" -static void xps_init_document(xps_document *doc); +static void xps_init_document(fz_context *ctx, xps_document *doc); xps_part * -xps_new_part(xps_document *doc, char *name, unsigned char *data, int size) +xps_new_part(fz_context *ctx, xps_document *doc, char *name, unsigned char *data, int size) { xps_part *part; - part = fz_malloc_struct(doc->ctx, xps_part); - fz_try(doc->ctx) + part = fz_malloc_struct(ctx, xps_part); + fz_try(ctx) { - part->name = fz_strdup(doc->ctx, name); + part->name = fz_strdup(ctx, name); part->data = data; part->size = size; } - fz_catch(doc->ctx) + fz_catch(ctx) { - fz_free(doc->ctx, part->name); - fz_free(doc->ctx, part->data); - fz_free(doc->ctx, part); - fz_rethrow(doc->ctx); + fz_free(ctx, part->name); + fz_free(ctx, part->data); + fz_free(ctx, part); + fz_rethrow(ctx); } return part; } void -xps_free_part(xps_document *doc, xps_part *part) +xps_drop_part(fz_context *ctx, xps_document *doc, xps_part *part) { - fz_free(doc->ctx, part->name); - fz_free(doc->ctx, part->data); - fz_free(doc->ctx, part); + fz_free(ctx, part->name); + fz_free(ctx, part->data); + fz_free(ctx, part); } /* * Read and interleave split parts from a ZIP file. */ xps_part * -xps_read_part(xps_document *doc, char *partname) +xps_read_part(fz_context *ctx, xps_document *doc, char *partname) { - fz_context *ctx = doc->ctx; fz_archive *zip = doc->zip; fz_buffer *buf, *tmp; char path[2048]; @@ -85,6 +84,7 @@ xps_read_part(xps_document *doc, char *partname) } else { + fz_drop_buffer(ctx, buf); fz_throw(ctx, FZ_ERROR_GENERIC, "cannot find all pieces for part '%s'", partname); } } @@ -95,25 +95,26 @@ xps_read_part(xps_document *doc, char *partname) /* take over the data */ data = buf->data; - size = buf->len; + /* size doesn't include the added zero-terminator */ + size = buf->len - 1; fz_free(ctx, buf); - return xps_new_part(doc, partname, data, size); + return xps_new_part(ctx, doc, partname, data, size); } int -xps_has_part(xps_document *doc, char *name) +xps_has_part(fz_context *ctx, xps_document *doc, char *name) { char buf[2048]; if (name[0] == '/') name++; - if (fz_has_archive_entry(doc->ctx, doc->zip, name)) + if (fz_has_archive_entry(ctx, doc->zip, name)) return 1; sprintf(buf, "%s/[0].piece", name); - if (fz_has_archive_entry(doc->ctx, doc->zip, buf)) + if (fz_has_archive_entry(ctx, doc->zip, buf)) return 1; sprintf(buf, "%s/[0].last.piece", name); - if (fz_has_archive_entry(doc->ctx, doc->zip, buf)) + if (fz_has_archive_entry(ctx, doc->zip, buf)) return 1; return 0; } @@ -124,17 +125,16 @@ xps_open_document_with_directory(fz_context *ctx, const char *directory) xps_document *doc; doc = fz_malloc_struct(ctx, xps_document); - xps_init_document(doc); - doc->ctx = ctx; + xps_init_document(ctx, doc); doc->zip = fz_open_directory(ctx, directory); fz_try(ctx) { - xps_read_page_list(doc); + xps_read_page_list(ctx, doc); } fz_catch(ctx) { - xps_close_document(doc); + xps_close_document(ctx, doc); fz_rethrow(ctx); } @@ -147,17 +147,16 @@ xps_open_document_with_stream(fz_context *ctx, fz_stream *file) xps_document *doc; doc = fz_malloc_struct(ctx, xps_document); - xps_init_document(doc); - doc->ctx = ctx; - doc->zip = fz_open_archive_with_stream(ctx, file); + xps_init_document(ctx, doc); fz_try(ctx) { - xps_read_page_list(doc); + doc->zip = fz_open_archive_with_stream(ctx, file); + xps_read_page_list(ctx, doc); } fz_catch(ctx) { - xps_close_document(doc); + xps_close_document(ctx, doc); fz_rethrow(ctx); } @@ -183,26 +182,19 @@ xps_open_document(fz_context *ctx, const char *filename) } file = fz_open_file(ctx, filename); - if (!file) - fz_throw(ctx, FZ_ERROR_GENERIC, "cannot open file '%s': %s", filename, strerror(errno)); fz_try(ctx) - { doc = xps_open_document_with_stream(ctx, file); - } fz_always(ctx) - { - fz_close(file); - } + fz_drop_stream(ctx, file); fz_catch(ctx) - { fz_rethrow_message(ctx, "cannot load document '%s'", filename); - } + return doc; } void -xps_close_document(xps_document *doc) +xps_close_document(fz_context *ctx, xps_document *doc) { xps_font_cache *font, *next; @@ -210,26 +202,26 @@ xps_close_document(xps_document *doc) return; if (doc->zip) - fz_close_archive(doc->ctx, doc->zip); + fz_drop_archive(ctx, doc->zip); font = doc->font_table; while (font) { next = font->next; - fz_drop_font(doc->ctx, font->font); - fz_free(doc->ctx, font->name); - fz_free(doc->ctx, font); + fz_drop_font(ctx, font->font); + fz_free(ctx, font->name); + fz_free(ctx, font); font = next; } - xps_free_page_list(doc); + xps_drop_page_list(ctx, doc); - fz_free(doc->ctx, doc->start_part); - fz_free(doc->ctx, doc); + fz_free(ctx, doc->start_part); + fz_free(ctx, doc); } static int -xps_meta(xps_document *doc, int key, void *ptr, int size) +xps_meta(fz_context *ctx, xps_document *doc, int key, void *ptr, int size) { switch (key) { @@ -242,24 +234,12 @@ xps_meta(xps_document *doc, int key, void *ptr, int size) } static void -xps_rebind(xps_document *doc, fz_context *ctx) -{ - doc->ctx = ctx; - fz_rebind_archive(doc->zip, ctx); - fz_rebind_device(doc->dev, ctx); -} - -static void -xps_init_document(xps_document *doc) +xps_init_document(fz_context *ctx, xps_document *doc) { + doc->super.refs = 1; doc->super.close = (fz_document_close_fn *)xps_close_document; doc->super.load_outline = (fz_document_load_outline_fn *)xps_load_outline; doc->super.count_pages = (fz_document_count_pages_fn *)xps_count_pages; doc->super.load_page = (fz_document_load_page_fn *)xps_load_page; - doc->super.load_links = (fz_document_load_links_fn *)xps_load_links; - doc->super.bound_page = (fz_document_bound_page_fn *)xps_bound_page; - doc->super.run_page_contents = (fz_document_run_page_contents_fn *)xps_run_page; - doc->super.free_page = (fz_document_free_page_fn *)xps_free_page; doc->super.meta = (fz_document_meta_fn *)xps_meta; - doc->super.rebind = (fz_document_rebind_fn *)xps_rebind; } |