summaryrefslogtreecommitdiff
path: root/xps/xps_doc.c
diff options
context:
space:
mode:
authorRobin Watts <robin.watts@artifex.com>2012-02-02 16:18:13 +0000
committerRobin Watts <robin.watts@artifex.com>2012-02-02 17:21:20 +0000
commitbb1e3c973526e66024e1a3260255368034cb2008 (patch)
tree9102d5d22818788e88c6407a0e4a358dfa7011b5 /xps/xps_doc.c
parent4ab5924753d32b5eaeb80138c6626057f61b516f (diff)
downloadmupdf-bb1e3c973526e66024e1a3260255368034cb2008.tar.xz
Support remote links in XPS documents.
Update xps path handling to cope with URLs. Fix premature freeing of links. Spot remote URLs and use appropriate link type.
Diffstat (limited to 'xps/xps_doc.c')
-rw-r--r--xps/xps_doc.c65
1 files changed, 37 insertions, 28 deletions
diff --git a/xps/xps_doc.c b/xps/xps_doc.c
index d1943fc0..0bc7e443 100644
--- a/xps/xps_doc.c
+++ b/xps/xps_doc.c
@@ -90,32 +90,42 @@ xps_add_link(xps_document *doc, fz_rect area, char *base_uri, char *target_uri)
len = 2 + (base_uri ? strlen(base_uri) : 0) +
(target_uri ? strlen(target_uri) : 0);
buffer = fz_malloc(doc->ctx, len);
- xps_absolute_path(buffer, base_uri, target_uri, len);
- uri = buffer;
-
- /* FIXME: This won't work for remote docs */
- /* Skip until we find the fragment marker */
- while (*uri && *uri != '#')
- uri++;
- if (*uri == '#')
- uri++;
-
- for (target = doc->target; target; target = target->next)
- if (!strcmp(target->name, uri))
- break;
+ xps_resolve_url(buffer, base_uri, target_uri, len);
+ if (xps_url_is_remote(buffer))
+ {
+ dest.kind = FZ_LINK_URI;
+ dest.ld.uri.is_map = 0;
+ dest.ld.uri.uri = buffer;
+ buffer = NULL;
+ }
+ else
+ {
+ uri = buffer;
- if (target == NULL)
- break;
+ /* FIXME: This won't work for remote docs */
+ /* Skip until we find the fragment marker */
+ while (*uri && *uri != '#')
+ uri++;
+ if (*uri == '#')
+ uri++;
- dest.kind = FZ_LINK_GOTO;
- dest.ld.gotor.flags = fz_link_flag_l_valid | fz_link_flag_t_valid | fz_link_flag_r_valid | fz_link_flag_b_valid;
- dest.ld.gotor.lt.x = area.x0;
- dest.ld.gotor.lt.y = area.y0;
- dest.ld.gotor.rb.x = area.x1;
- dest.ld.gotor.rb.y = area.y1;
- dest.ld.gotor.page = target->page;
- dest.ld.gotor.file_spec = NULL;
- dest.ld.gotor.new_window = 0;
+ for (target = doc->target; target; target = target->next)
+ if (!strcmp(target->name, uri))
+ break;
+
+ if (target == NULL)
+ break;
+
+ dest.kind = FZ_LINK_GOTO;
+ dest.ld.gotor.flags = 0;
+ dest.ld.gotor.lt.x = 0;
+ dest.ld.gotor.lt.y = 0;
+ dest.ld.gotor.rb.x = 0;
+ dest.ld.gotor.rb.y = 0;
+ dest.ld.gotor.page = target->page;
+ dest.ld.gotor.file_spec = NULL;
+ dest.ld.gotor.new_window = 0;
+ }
link = fz_new_link(doc->ctx, area, dest);
link->next = doc->current_page->links;
@@ -256,7 +266,7 @@ xps_parse_metadata_imp(xps_document *doc, xml_element *item, xps_fixdoc *fixdoc)
if (target && type)
{
char tgtbuf[1024];
- xps_absolute_path(tgtbuf, doc->base_uri, target, sizeof tgtbuf);
+ xps_resolve_url(tgtbuf, doc->base_uri, target, sizeof tgtbuf);
if (!strcmp(type, REL_START_PART))
doc->start_part = fz_strdup(doc->ctx, tgtbuf);
if (!strcmp(type, REL_DOC_STRUCTURE) && fixdoc)
@@ -270,7 +280,7 @@ xps_parse_metadata_imp(xps_document *doc, xml_element *item, xps_fixdoc *fixdoc)
if (source)
{
char srcbuf[1024];
- xps_absolute_path(srcbuf, doc->base_uri, source, sizeof srcbuf);
+ xps_resolve_url(srcbuf, doc->base_uri, source, sizeof srcbuf);
xps_add_fixed_document(doc, srcbuf);
}
}
@@ -285,7 +295,7 @@ xps_parse_metadata_imp(xps_document *doc, xml_element *item, xps_fixdoc *fixdoc)
if (source)
{
char srcbuf[1024];
- xps_absolute_path(srcbuf, doc->base_uri, source, sizeof srcbuf);
+ xps_resolve_url(srcbuf, doc->base_uri, source, sizeof srcbuf);
xps_add_fixed_page(doc, srcbuf, width, height);
}
}
@@ -421,7 +431,6 @@ xps_load_page(xps_document *doc, int number)
doc->current_page = page;
if (!page->root)
xps_load_fixed_page(doc, page);
- page->links_resolved = 1;
return page;
}
n ++;