From 180cf8d29bb484065e4e00015e1d843fe4b43a2f Mon Sep 17 00:00:00 2001 From: Chris Young Date: Mon, 22 Aug 2016 23:33:37 +0100 Subject: Parse the fetched external entity --- content/handlers/image/svg.c | 34 +++++++++++++++++++++++++++++----- 1 file changed, 29 insertions(+), 5 deletions(-) diff --git a/content/handlers/image/svg.c b/content/handlers/image/svg.c index b81f510ef..5cd388352 100644 --- a/content/handlers/image/svg.c +++ b/content/handlers/image/svg.c @@ -46,21 +46,33 @@ typedef struct svg_content { int current_height; } svg_content; - +struct svg_fetch_cb_data +{ + void *parser; + int (*cb)(void *parser, const char *data, int size); +}; /** Callback for hlcache fetch */ static nserror svg_fetch_hlcache_cb(hlcache_handle *handle, - const hlcache_event *event, - void *parser) + const hlcache_event *event, void *userdata) { + unsigned long size = 0; + const char *data; + struct svg_fetch_cb_data *cb_userdata = userdata; + switch (event->type) { case CONTENT_MSG_DONE: LOG("external entity '%s' retrieved", nsurl_access(hlcache_handle_get_url(handle))); + data = content_get_source_data(handle, &size); + cb_userdata->cb(cb_userdata->parser, data, size); + hlcache_handle_release(handle); + free(userdata); break; case CONTENT_MSG_ERROR: LOG("external entity %s error: %s", nsurl_access(hlcache_handle_get_url(handle)), event->data.error); hlcache_handle_release(handle); + free(userdata); break; default: @@ -71,23 +83,35 @@ static nserror svg_fetch_hlcache_cb(hlcache_handle *handle, } /** Callback for libsvgtiny fetch */ -static int svg_fetch_cb(void *parser, const char *base, const char *uri) +static int svg_fetch_cb(void *parser, const char *base, const char *uri, + int (*svgtiny_expat_xmlparser_parse_cb)(void *parser, const char *data, int size)) { nsurl *x_ent; nserror ret; hlcache_handle *handle; + struct svg_fetch_cb_data *userdata; LOG("Fetching external entity reference %s", uri); + userdata = malloc(sizeof(struct svg_fetch_cb_data)); + if (userdata == NULL) { + return false; + } + + userdata->parser = parser; + userdata->cb = svgtiny_expat_xmlparser_parse_cb; + /* create url */ + /**\todo this should be nsurl_joining base+uri */ ret = nsurl_create(uri, &x_ent); if (ret != NSERROR_OK) { + free(userdata); return false; } ret = hlcache_handle_retrieve(x_ent, 0, NULL, NULL, svg_fetch_hlcache_cb, - parser, /* data */ + userdata, /* data */ NULL, CONTENT_ANY, &handle); nsurl_unref(x_ent); -- cgit v1.2.3