[librsvg] parse_xml_from_stream(): Extract this common function from two duplicated places
- From: Federico Mena Quintero <federico src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [librsvg] parse_xml_from_stream(): Extract this common function from two duplicated places
- Date: Thu, 6 Dec 2018 00:12:58 +0000 (UTC)
commit 731a1e63977c1fe18969687dee22d5222269c66c
Author: Federico Mena Quintero <federico gnome org>
Date: Wed Dec 5 16:16:34 2018 -0600
parse_xml_from_stream(): Extract this common function from two duplicated places
librsvg/rsvg-load.c | 138 +++++++++++++++++++++++++++-------------------------
1 file changed, 71 insertions(+), 67 deletions(-)
---
diff --git a/librsvg/rsvg-load.c b/librsvg/rsvg-load.c
index 5b70c266..a42ea715 100644
--- a/librsvg/rsvg-load.c
+++ b/librsvg/rsvg-load.c
@@ -145,36 +145,83 @@ rsvg_load_finish_load (RsvgLoad *load, GError **error)
return was_successful;
}
+static void
+set_error_from_xml (GError **error, xmlParserCtxtPtr ctxt)
+{
+ xmlErrorPtr xerr;
+
+ xerr = xmlCtxtGetLastError (ctxt);
+ if (xerr) {
+ g_set_error (error, rsvg_error_quark (), 0,
+ _("Error domain %d code %d on line %d column %d of %s: %s"),
+ xerr->domain, xerr->code,
+ xerr->line, xerr->int2,
+ xerr->file ? xerr->file : "data",
+ xerr->message ? xerr->message: "-");
+ } else {
+ g_set_error (error, rsvg_error_quark (), 0, _("Error parsing XML data"));
+ }
+}
+
+static gboolean
+rsvg_parse_xml_from_stream (RsvgXmlState *xml,
+ gboolean unlimited_size,
+ GInputStream *stream,
+ GCancellable *cancellable,
+ GError **error)
+{
+ GError *err = NULL;
+ xmlParserCtxtPtr xml_parser;
+ gboolean xml_parse_success;
+ gboolean svg_parse_success;
+
+ xml_parser = rsvg_create_xml_stream_parser (xml,
+ unlimited_size,
+ stream,
+ cancellable,
+ &err);
+ if (!xml_parser) {
+ g_assert (err != NULL);
+ g_propagate_error (error, err);
+ return FALSE;
+ }
+
+ g_assert (err == NULL);
+ xml_parse_success = xmlParseDocument (xml_parser) == 0;
+
+ svg_parse_success = err == NULL;
+
+ if (!svg_parse_success) {
+ g_propagate_error (error, err);
+ } else if (!xml_parse_success) {
+ set_error_from_xml (error, xml_parser);
+ }
+
+ xml_parser = free_xml_parser_and_doc (xml_parser);
+
+ return svg_parse_success && xml_parse_success;
+}
+
gboolean
rsvg_load_handle_xml_xinclude (RsvgHandle *handle, const char *href)
{
GInputStream *stream;
- GError *err = NULL;
- xmlParserCtxtPtr xml_parser;
g_assert (handle->priv->load != NULL);
stream = rsvg_handle_acquire_stream (handle, href, NULL);
if (stream) {
- gboolean success = FALSE;
+ gboolean success;
- xml_parser = rsvg_create_xml_stream_parser (handle->priv->load->xml.rust_state,
- handle->priv->load->unlimited_size,
- stream,
- handle->priv->cancellable,
- &err);
+ success = rsvg_parse_xml_from_stream (handle->priv->load->xml.rust_state,
+ handle->priv->load->unlimited_size,
+ stream,
+ handle->priv->cancellable,
+ NULL);
g_object_unref (stream);
- if (xml_parser) {
- success = xmlParseDocument (xml_parser) == 0;
-
- xml_parser = free_xml_parser_and_doc (xml_parser);
- }
-
- g_clear_error (&err);
-
return success;
} else {
return FALSE;
@@ -204,24 +251,6 @@ rsvg_sax_error_cb (void *data, const char *msg, ...)
g_free (buf);
}
-static void
-set_error_from_xml (GError **error, xmlParserCtxtPtr ctxt)
-{
- xmlErrorPtr xerr;
-
- xerr = xmlCtxtGetLastError (ctxt);
- if (xerr) {
- g_set_error (error, rsvg_error_quark (), 0,
- _("Error domain %d code %d on line %d column %d of %s: %s"),
- xerr->domain, xerr->code,
- xerr->line, xerr->int2,
- xerr->file ? xerr->file : "data",
- xerr->message ? xerr->message: "-");
- } else {
- g_set_error (error, rsvg_error_quark (), 0, _("Error parsing XML data"));
- }
-}
-
static gboolean
write_impl (RsvgLoad *load, const guchar * buf, gsize count, GError **error)
{
@@ -303,8 +332,7 @@ rsvg_load_read_stream_sync (RsvgLoad *load,
GError **error)
{
GError *err = NULL;
- gboolean res = FALSE;
- xmlParserCtxtPtr xml_parser;
+ gboolean res;
stream = rsvg_get_input_stream_for_loading (stream, cancellable, error);
if (stream == NULL) {
@@ -315,44 +343,20 @@ rsvg_load_read_stream_sync (RsvgLoad *load,
load->error = &err;
g_assert (load->xml.ctxt == NULL);
- xml_parser = rsvg_create_xml_stream_parser (load->xml.rust_state,
- load->unlimited_size,
- stream,
- cancellable,
- &err);
-
- if (!xml_parser) {
- g_assert (err != NULL);
- g_propagate_error (error, err);
-
- goto out;
- }
- if (xmlParseDocument (xml_parser) != 0) {
- if (err) {
- g_propagate_error (error, err);
- } else {
- set_error_from_xml (error, xml_parser);
- }
-
- goto out;
- }
-
- if (err != NULL) {
+ res = rsvg_parse_xml_from_stream (load->xml.rust_state,
+ load->unlimited_size,
+ stream,
+ cancellable,
+ &err);
+ if (!res) {
g_propagate_error (error, err);
- goto out;
}
- res = TRUE;
-
- out:
-
- xml_parser = free_xml_parser_and_doc (xml_parser);
+ load->error = NULL;
g_object_unref (stream);
- load->error = NULL;
-
return res;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]