Gitweb links:

...log 
http://git.netsurf-browser.org/libdom.git/shortlog/13cec75b28d57040c03e0dc8151b8be0f0ac1bf6
...commit 
http://git.netsurf-browser.org/libdom.git/commit/13cec75b28d57040c03e0dc8151b8be0f0ac1bf6
...tree 
http://git.netsurf-browser.org/libdom.git/tree/13cec75b28d57040c03e0dc8151b8be0f0ac1bf6

The branch, chris/fetch-x-ent-ref has been created
        at  13cec75b28d57040c03e0dc8151b8be0f0ac1bf6 (commit)

- Log -----------------------------------------------------------------
commitdiff 
http://git.netsurf-browser.org/libdom.git/commit/?id=13cec75b28d57040c03e0dc8151b8be0f0ac1bf6
commit 13cec75b28d57040c03e0dc8151b8be0f0ac1bf6
Author: Chris Young <[email protected]>
Commit: Chris Young <[email protected]>

    Fetch external entities for libexpat/svg through the proper channels.
    This currently does fetching, but not parsing.

diff --git a/bindings/xml/expat_xmlparser.c b/bindings/xml/expat_xmlparser.c
index e1c22ad..9b7d113 100644
--- a/bindings/xml/expat_xmlparser.c
+++ b/bindings/xml/expat_xmlparser.c
@@ -29,6 +29,7 @@ struct dom_xml_parser {
        struct dom_document *doc;       /**< DOM Document we're building */
        struct dom_node *current;       /**< DOM node we're currently building 
*/
        bool is_cdata;                  /**< If the character data is cdata or 
text */
+       dom_xml_parser_fetch_cb fetch_cb;       /**< Callback to fetch external 
entities */
 };
 
 /* Binding functions */
@@ -292,44 +293,49 @@ expat_xmlparser_external_entity_ref_handler(XML_Parser 
parser,
                                            const XML_Char *system_id,
                                            const XML_Char *public_id)
 {
-       FILE *fh;
        XML_Parser subparser;
        unsigned char data[1024];
        size_t len;
        enum XML_Status status;
 
-       UNUSED(base);
+       UNUSED(data);
+       UNUSED(len);
+       UNUSED(status);
+
        UNUSED(public_id);
 
        if (system_id == NULL)
                return XML_STATUS_OK;
 
-       fh = fopen(system_id, "r");
+       struct dom_xml_parser *xml_parser = XML_GetUserData(parser);
 
-       if (fh == NULL)
+       if (xml_parser->fetch_cb == NULL) {
                return XML_STATUS_OK;
+       }
 
-       subparser = XML_ExternalEntityParserCreate(parser,
-                                                  context,
-                                                  NULL);
+       subparser = XML_ExternalEntityParserCreate(parser, context, NULL);
 
        if (subparser == NULL) {
-               fclose(fh);
                return XML_STATUS_OK;
        }
+       
+       if(xml_parser->fetch_cb(subparser, base, system_id) == false)
+               return XML_STATUS_OK;
+
+#if 0
 
        /* Parse the file bit by bit */
        while ((len = fread(data, 1, 1024, fh)) > 0) {
                status = XML_Parse(subparser, (const char *)data, len, 0);
                if (status != XML_STATUS_OK) {
                        XML_ParserFree(subparser);
-                       fclose(fh);
                        return XML_STATUS_OK;
                }
        }
+#endif
        XML_Parse(subparser, "", 0, 1);
        XML_ParserFree(subparser);
-       fclose(fh);
+
        return XML_STATUS_OK;
 }
 
@@ -447,7 +453,8 @@ expat_xmlparser_unknown_data_handler(void *_parser,
  */
 dom_xml_parser *
 dom_xml_parser_create(const char *enc, const char *int_enc,
-                     dom_msg msg, void *mctx, dom_document **document)
+                     dom_msg msg, void *mctx, dom_document **document,
+                     dom_xml_parser_fetch_cb fetch_cb)
 {
        dom_xml_parser *parser;
        dom_exception err;
@@ -460,6 +467,7 @@ dom_xml_parser_create(const char *enc, const char *int_enc,
                return NULL;
        }
 
+       parser->fetch_cb = fetch_cb;
        parser->msg = msg;
        parser->mctx = mctx;
 
diff --git a/bindings/xml/xmlparser.h b/bindings/xml/xmlparser.h
index d9bd07b..36b6848 100644
--- a/bindings/xml/xmlparser.h
+++ b/bindings/xml/xmlparser.h
@@ -16,10 +16,13 @@
 #include "xmlerror.h"
 
 typedef struct dom_xml_parser dom_xml_parser;
+typedef int (*dom_xml_parser_fetch_cb)(void *parser, const char *base,
+                                                                      const 
char *uri);
 
 /* Create an XML parser instance */
 dom_xml_parser *dom_xml_parser_create(const char *enc, const char *int_enc,
-               dom_msg msg, void *mctx, dom_document **document);
+               dom_msg msg, void *mctx, dom_document **document,
+               dom_xml_parser_fetch_cb fetch_cb);
 
 /* Destroy an XML parser instance */
 void dom_xml_parser_destroy(dom_xml_parser *parser);


-----------------------------------------------------------------------


-- 
Document Object Model library

_______________________________________________
netsurf-commits mailing list
[email protected]
http://listmaster.pepperfish.net/cgi-bin/mailman/listinfo/netsurf-commits-netsurf-browser.org

Reply via email to