static fz_outline * xps_load_document_structure(xps_context *ctx, xps_document *fixdoc) { xps_part *part; xml_element *root; fz_outline *outline; part = xps_read_part(ctx, fixdoc->outline); if (!part) return NULL; root = xml_parse_document(ctx->ctx, part->data, part->size); if (!root) { fz_error_handle(ctx->ctx, -1, "cannot parse document structure part '%s'", part->name); xps_free_part(ctx, part); return NULL; } outline = xps_parse_document_structure(ctx, root); xml_free_element(ctx->ctx, root); xps_free_part(ctx, part); return outline; }
static int xps_parse_remote_resource_dictionary(xps_context *ctx, xps_resource **dictp, char *base_uri, char *source_att) { char part_name[1024]; char part_uri[1024]; xps_resource *dict; xps_part *part; xml_element *xml; char *s; int code; /* External resource dictionaries MUST NOT reference other resource dictionaries */ xps_absolute_path(part_name, base_uri, source_att, sizeof part_name); part = xps_read_part(ctx, part_name); if (!part) { return fz_throw("cannot find remote resource part '%s'", part_name); } xml = xml_parse_document(part->data, part->size); if (!xml) { xps_free_part(ctx, part); return fz_rethrow(-1, "cannot parse xml"); } if (strcmp(xml_tag(xml), "ResourceDictionary")) { xml_free_element(xml); xps_free_part(ctx, part); return fz_throw("expected ResourceDictionary element (found %s)", xml_tag(xml)); } fz_strlcpy(part_uri, part_name, sizeof part_uri); s = strrchr(part_uri, '/'); if (s) s[1] = 0; code = xps_parse_resource_dictionary(ctx, &dict, part_uri, xml); if (code) { xml_free_element(xml); xps_free_part(ctx, part); return fz_rethrow(code, "cannot parse remote resource dictionary: %s", part_uri); } dict->base_xml = xml; /* pass on ownership */ xps_free_part(ctx, part); *dictp = dict; return fz_okay; }
static xps_resource * xps_parse_remote_resource_dictionary(xps_document *doc, char *base_uri, char *source_att) { char part_name[1024]; char part_uri[1024]; xps_resource *dict; xps_part *part; xml_element *xml; char *s; /* External resource dictionaries MUST NOT reference other resource dictionaries */ xps_resolve_url(part_name, base_uri, source_att, sizeof part_name); part = xps_read_part(doc, part_name); xml = xml_parse_document(doc->ctx, part->data, part->size); xps_free_part(doc, part); if (strcmp(xml_tag(xml), "ResourceDictionary")) { xml_free_element(doc->ctx, xml); fz_throw(doc->ctx, "expected ResourceDictionary element (found %s)", xml_tag(xml)); } fz_strlcpy(part_uri, part_name, sizeof part_uri); s = strrchr(part_uri, '/'); if (s) s[1] = 0; dict = xps_parse_resource_dictionary(doc, part_uri, xml); if (dict) dict->base_xml = xml; /* pass on ownership */ return dict; }
fz_obj *xps_extract_doc_props(xps_context *ctx) { char path[1024]; xps_part *part; fz_obj *dict; if (xps_find_doc_props_path(ctx, path) != fz_okay) fz_error_handle(ctx->ctx, -1, "ignore broken part '/_rels/.rels'"); if (!*path) return NULL; part = xps_read_part(ctx, path); if (!part) { fz_error_handle(ctx->ctx, -1, "cannot read zip part '%s'", path); return NULL; } dict = fz_new_dict(ctx->ctx, 8); xps_hacky_get_prop(ctx->ctx, part->data, dict, "Title", "dc:title"); xps_hacky_get_prop(ctx->ctx, part->data, dict, "Subject", "dc:subject"); xps_hacky_get_prop(ctx->ctx, part->data, dict, "Author", "dc:creator"); xps_hacky_get_prop(ctx->ctx, part->data, dict, "CreationDate", "dcterms:created"); xps_hacky_get_prop(ctx->ctx, part->data, dict, "ModDate", "dcterms:modified"); xps_free_part(ctx, part); return dict; }
static int xps_load_fixed_page(xps_context *ctx, xps_page *page) { xps_part *part; xml_element *root; char *width_att; char *height_att; part = xps_read_part(ctx, page->name); if (!part) return fz_rethrow(-1, "cannot read zip part '%s'", page->name); root = xml_parse_document(part->data, part->size); if (!root) return fz_rethrow(-1, "cannot parse xml part '%s'", page->name); xps_free_part(ctx, part); if (strcmp(xml_tag(root), "FixedPage")) return fz_throw("expected FixedPage element (found %s)", xml_tag(root)); width_att = xml_att(root, "Width"); if (!width_att) return fz_throw("FixedPage missing required attribute: Width"); height_att = xml_att(root, "Height"); if (!height_att) return fz_throw("FixedPage missing required attribute: Height"); page->width = atoi(width_att); page->height = atoi(height_att); page->root = root; return 0; }
fz_obj *xps_extract_doc_props(xps_context *ctx) { char path[1024]; xps_part *part; fz_obj *dict; if (xps_find_doc_props_path(ctx, path) != fz_okay) { fz_catch(-1, "couldn't find the exact part name for /docProps/core.xml"); fz_strlcpy(path, "/docProps/core.xml", sizeof(path)); } if (!*path) return NULL; part = xps_read_part(ctx, path); if (!part) { fz_catch(-1, "cannot read zip part '%s'", path); return NULL; } dict = fz_new_dict(8); xps_hacky_get_prop(part->data, dict, "Title", "dc:title"); xps_hacky_get_prop(part->data, dict, "Subject", "dc:subject"); xps_hacky_get_prop(part->data, dict, "Author", "dc:creator"); xps_hacky_get_prop(part->data, dict, "CreationDate", "dcterms:created"); xps_hacky_get_prop(part->data, dict, "ModDate", "dcterms:modified"); xps_free_part(ctx, part); return dict; }
static int xps_open_and_parse(xps_context *ctx, char *path, xml_element **rootp) { xps_part *part = xps_read_part(ctx, path); if (!part) return fz_error_note(ctx->ctx, -1, "cannot read part '%s'", path); *rootp = xml_parse_document(ctx->ctx, part->data, part->size); xps_free_part(ctx, part); if (!*rootp) return fz_error_note(ctx->ctx, -1, "cannot parse part '%s'", path); return fz_okay; }
static int xps_open_and_parse(xps_context *ctx, char *path, xml_element **rootp) { xps_part *part = xps_read_part(ctx, path); if (!part) return fz_rethrow(-1, "cannot read zip part '%s'", path); *rootp = xml_parse_document(part->data, part->size); xps_free_part(ctx, part); if (!*rootp) return fz_rethrow(-1, "cannot parse metadata for part '%s'", path); return fz_okay; }
static int xps_read_and_process_metadata_part(xps_context *ctx, char *name) { xps_part *part; int code; part = xps_read_part(ctx, name); if (!part) return fz_rethrow(-1, "cannot read zip part '%s'", name); code = xps_parse_metadata(ctx, part); if (code) return fz_rethrow(code, "cannot process metadata part '%s'", name); xps_free_part(ctx, part); return fz_okay; }