Adam Martinson : msxml3: Fix a regression bug in domdoc_loadXML().
Alexandre Julliard
julliard at winehq.org
Thu Oct 21 10:50:48 CDT 2010
Module: wine
Branch: master
Commit: fd9bcfcfe812c0c4f13f9c081e8d029d3966b605
URL: http://source.winehq.org/git/wine.git/?a=commit;h=fd9bcfcfe812c0c4f13f9c081e8d029d3966b605
Author: Adam Martinson <amartinson at codeweavers.com>
Date: Wed Oct 20 17:00:21 2010 -0500
msxml3: Fix a regression bug in domdoc_loadXML().
Caused by commit 776a8662f088e75e88284cc0fc8e72d768771a6f. Fixes parse
failures for BSTR's where encoding is explicitly UTF-16.
---
dlls/msxml3/domdoc.c | 43 +++++++++++++++++++++++++++++++++++++------
1 files changed, 37 insertions(+), 6 deletions(-)
diff --git a/dlls/msxml3/domdoc.c b/dlls/msxml3/domdoc.c
index c401100..7669220 100644
--- a/dlls/msxml3/domdoc.c
+++ b/dlls/msxml3/domdoc.c
@@ -51,6 +51,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(msxml);
#include <libxml/xpathInternals.h>
#include <libxml/xmlsave.h>
#include <libxml/SAX2.h>
+#include <libxml/parserInternals.h>
/* not defined in older versions */
#define XML_SAVE_FORMAT 1
@@ -321,9 +322,10 @@ static void sax_characters(void *ctx, const xmlChar *ch, int len)
xmlSAX2Characters(ctx, ch, len);
}
-static xmlDocPtr doparse(domdoc* This, char *ptr, int len)
+static xmlDocPtr doparse(domdoc* This, char *ptr, int len, xmlChar const* encoding)
{
- xmlDocPtr doc;
+ xmlDocPtr doc = NULL;
+ xmlParserCtxtPtr pctx;
static xmlSAXHandler sax_handler = {
xmlSAX2InternalSubset, /* internalSubset */
xmlSAX2IsStandalone, /* isStandalone */
@@ -358,8 +360,33 @@ static xmlDocPtr doparse(domdoc* This, char *ptr, int len)
xmlSAX2EndElementNs, /* endElementNs */
NULL /* TODO: serror */
};
+ xmlInitParser();
- doc = xmlSAXParseMemoryWithData(&sax_handler, ptr, len, 0, This);
+ pctx = xmlCreateMemoryParserCtxt(ptr, len);
+ if (!pctx)
+ {
+ ERR("Failed to create parser context\n");
+ return NULL;
+ }
+
+ if (pctx->sax) xmlFree(pctx->sax);
+ pctx->sax = &sax_handler;
+ pctx->_private = This;
+ pctx->recovery = 0;
+ pctx->encoding = xmlStrdup(encoding);
+ xmlParseDocument(pctx);
+
+ if (pctx->wellFormed)
+ {
+ doc = pctx->myDoc;
+ }
+ else
+ {
+ xmlFreeDoc(pctx->myDoc);
+ pctx->myDoc = NULL;
+ }
+ pctx->sax = NULL;
+ xmlFreeParserCtxt(pctx);
/* TODO: put this in one of the SAX callbacks */
/* create first child as a <?xml...?> */
@@ -597,7 +624,7 @@ static HRESULT WINAPI domdoc_IPersistStreamInit_Load(
len = GlobalSize(hglobal);
ptr = GlobalLock(hglobal);
if (len != 0)
- xmldoc = doparse(This, ptr, len);
+ xmldoc = doparse(This, ptr, len, NULL);
GlobalUnlock(hglobal);
if (!xmldoc)
@@ -1789,7 +1816,7 @@ static HRESULT domdoc_onDataAvailable(void *obj, char *ptr, DWORD len)
domdoc *This = obj;
xmlDocPtr xmldoc;
- xmldoc = doparse(This, ptr, len);
+ xmldoc = doparse(This, ptr, len, NULL);
if(xmldoc) {
xmldoc->_private = create_priv();
return attach_xmldoc(This, xmldoc);
@@ -2017,6 +2044,7 @@ static HRESULT WINAPI domdoc_loadXML(
VARIANT_BOOL* isSuccessful )
{
domdoc *This = impl_from_IXMLDOMDocument3( iface );
+ static const xmlChar encoding[] = "UTF-8";
xmlDocPtr xmldoc = NULL;
HRESULT hr = S_FALSE, hr2;
char *str;
@@ -2032,10 +2060,13 @@ static HRESULT WINAPI domdoc_loadXML(
if ( bstrXML && bstr_to_utf8( bstrXML, &str, &len ) )
{
- xmldoc = doparse(This, str, len);
+ xmldoc = doparse(This, str, len, encoding);
heap_free( str );
if ( !xmldoc )
+ {
This->error = E_FAIL;
+ TRACE("failed to parse document\n");
+ }
else
{
hr = This->error = S_OK;
More information about the wine-cvs
mailing list