summaryrefslogtreecommitdiff
path: root/bindings/xml/libxml_xmlparser.c
diff options
context:
space:
mode:
Diffstat (limited to 'bindings/xml/libxml_xmlparser.c')
-rw-r--r--bindings/xml/libxml_xmlparser.c69
1 files changed, 24 insertions, 45 deletions
diff --git a/bindings/xml/libxml_xmlparser.c b/bindings/xml/libxml_xmlparser.c
index ca3317e..dde598c 100644
--- a/bindings/xml/libxml_xmlparser.c
+++ b/bindings/xml/libxml_xmlparser.c
@@ -92,8 +92,6 @@ struct dom_xml_parser {
struct dom_document *doc; /**< DOM Document we're building */
- bool complete; /**< Indicate stream completion */
-
dom_string *udkey; /**< Key for DOM node user data */
dom_msg msg; /**< Informational message function */
@@ -167,7 +165,7 @@ static void *dom_xml_alloc(void *ptr, size_t len, void *pw)
* parser encoding is not yet implemented
*/
dom_xml_parser *dom_xml_parser_create(const char *enc, const char *int_enc,
- dom_msg msg, void *mctx)
+ dom_msg msg, void *mctx, dom_document **document)
{
dom_xml_parser *parser;
dom_exception err;
@@ -200,10 +198,6 @@ dom_xml_parser *dom_xml_parser_create(const char *enc, const char *int_enc,
return NULL;
}
- parser->doc = NULL;
-
- parser->complete = false;
-
/* Create key for user data registration */
err = dom_string_create((const uint8_t *) "__xmlnode",
SLEN("__xmlnode"), &parser->udkey);
@@ -214,6 +208,25 @@ dom_xml_parser *dom_xml_parser_create(const char *enc, const char *int_enc,
return NULL;
}
+ err = dom_implementation_create_document(
+ DOM_IMPLEMENTATION_XML,
+ /* namespace */ NULL,
+ /* qname */ NULL,
+ /* doctype */ NULL,
+ NULL,
+ document);
+
+ if (err != DOM_NO_ERR) {
+ xmlFreeParserCtxt(parser->xml_ctx);
+ dom_string_unref(parser->udkey);
+ dom_xml_alloc(parser, 0, NULL);
+ parser->msg(DOM_MSG_CRITICAL, parser->mctx,
+ "Failed creating document");
+ return NULL;
+ }
+
+ parser->doc = (dom_document *) dom_node_ref(*document);
+
parser->msg = msg;
parser->mctx = mctx;
@@ -228,6 +241,7 @@ dom_xml_parser *dom_xml_parser_create(const char *enc, const char *int_enc,
void dom_xml_parser_destroy(dom_xml_parser *parser)
{
dom_string_unref(parser->udkey);
+ dom_node_unref(parser->doc);
xmlFreeDoc(parser->xml_ctx->myDoc);
@@ -278,25 +292,10 @@ dom_xml_error dom_xml_parser_completed(dom_xml_parser *parser)
return DOM_XML_EXTERNAL_ERR | err;
}
- parser->complete = true;
-
return DOM_XML_OK;
}
/**
- * Retrieve the created DOM Document from a parser
- *
- * \param parser The parser instance to retrieve the document from
- * \return Pointer to document, or NULL if parsing is not complete
- *
- * This may only be called after xml_parser_completed().
- */
-struct dom_document *dom_xml_parser_get_document(dom_xml_parser *parser)
-{
- return (parser->complete ? parser->doc : NULL);
-}
-
-/**
* Handle a document start SAX event
*
* \param ctx The callback context
@@ -304,38 +303,18 @@ struct dom_document *dom_xml_parser_get_document(dom_xml_parser *parser)
void xml_parser_start_document(void *ctx)
{
dom_xml_parser *parser = (dom_xml_parser *) ctx;
- struct dom_document *doc;
dom_exception err;
/* Invoke libxml2's default behaviour */
xmlSAX2StartDocument(parser->xml_ctx);
- /* TODO: Just pass the dom_events_default_action_fetcher a NULL,
- * we should pass the real function when we integrate libDOM with
- * Netsurf */
- err = dom_implementation_create_document(
- DOM_IMPLEMENTATION_XML,
- /* namespace */ NULL,
- /* qname */ NULL,
- /* doctype */ NULL,
- NULL,
- &doc);
- if (err != DOM_NO_ERR) {
- parser->msg(DOM_MSG_CRITICAL, parser->mctx,
- "Failed creating document");
- return;
- }
-
/* Link nodes together */
- err = xml_parser_link_nodes(parser, (struct dom_node *) doc,
+ err = xml_parser_link_nodes(parser, (struct dom_node *) parser->doc,
(xmlNodePtr) parser->xml_ctx->myDoc);
if (err != DOM_NO_ERR) {
- dom_node_unref((struct dom_node *) doc);
- return;
+ parser->msg(DOM_MSG_WARNING, parser->mctx,
+ "Not able to link document nodes");
}
-
- /* And squirrel the document away for later use */
- parser->doc = doc;
}
/**