Piotr Caban : msxml3: Reorganize parse_buffer function ( make use of libxml2 parserInternals.h).

Alexandre Julliard julliard at winehq.org
Fri Aug 1 05:33:45 CDT 2008


Module: wine
Branch: master
Commit: df5e40ec727895b99d19dbf0ff74a36526e041f4
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=df5e40ec727895b99d19dbf0ff74a36526e041f4

Author: Piotr Caban <piotr.caban at gmail.com>
Date:   Thu Jul 31 16:45:30 2008 +0200

msxml3: Reorganize parse_buffer function (make use of libxml2 parserInternals.h).

---

 dlls/msxml3/saxreader.c |   43 ++++++++++++++++++-------------------------
 1 files changed, 18 insertions(+), 25 deletions(-)

diff --git a/dlls/msxml3/saxreader.c b/dlls/msxml3/saxreader.c
index 5a64e2b..789dce2 100644
--- a/dlls/msxml3/saxreader.c
+++ b/dlls/msxml3/saxreader.c
@@ -44,6 +44,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(msxml);
 #ifdef HAVE_LIBXML2
 
 #include <libxml/SAX2.h>
+#include <libxml/parserInternals.h>
 
 typedef struct _saxreader
 {
@@ -151,6 +152,12 @@ static void update_position(saxlocator *This, xmlChar *end)
         This->line = 1;
         This->column = 1;
     }
+    else if(This->lastCur < This->pParserCtxt->input->base)
+    {
+        This->lastCur = (xmlChar*)This->pParserCtxt->input->base;
+        This->line = 1;
+        This->column = 1;
+    }
 
     if(!end) end = (xmlChar*)This->pParserCtxt->input->cur;
 
@@ -1468,7 +1475,7 @@ static HRESULT WINAPI isaxxmlreader_putSecureBaseURL(
     return E_NOTIMPL;
 }
 
-static HRESULT parse_buffer(saxreader *This, xmlChar *buffer)
+static HRESULT parse_buffer(saxreader *This, const char *buffer, int size)
 {
     saxlocator *locator;
     HRESULT hr;
@@ -1477,7 +1484,7 @@ static HRESULT parse_buffer(saxreader *This, xmlChar *buffer)
     if(FAILED(hr))
         return E_FAIL;
 
-    locator->pParserCtxt = xmlNewParserCtxt();
+    locator->pParserCtxt = xmlCreateMemoryParserCtxt(buffer, size);
     if(!locator->pParserCtxt)
     {
         ISAXLocator_Release((ISAXLocator*)&locator->lpSAXLocatorVtbl);
@@ -1487,8 +1494,6 @@ static HRESULT parse_buffer(saxreader *This, xmlChar *buffer)
     locator->pParserCtxt->sax = &locator->saxreader->sax;
     locator->pParserCtxt->userData = locator;
 
-    xmlSetupParserForBuffer(locator->pParserCtxt, buffer, NULL);
-
     if(xmlParseDocument(locator->pParserCtxt)) hr = E_FAIL;
     else hr = locator->ret;
 
@@ -1508,7 +1513,6 @@ static HRESULT WINAPI isaxxmlreader_parse(
         VARIANT varInput)
 {
     saxreader *This = impl_from_ISAXXMLReader( iface );
-    xmlChar *data = NULL;
     HRESULT hr;
 
     TRACE("(%p)\n", This);
@@ -1517,8 +1521,8 @@ static HRESULT WINAPI isaxxmlreader_parse(
     switch(V_VT(&varInput))
     {
         case VT_BSTR:
-            data = xmlChar_from_wchar(V_BSTR(&varInput));
-            hr = parse_buffer(This, data);
+            hr = parse_buffer(This, (const char*)V_BSTR(&varInput),
+                    SysStringByteLen(V_BSTR(&varInput)));
             break;
         case VT_ARRAY|VT_UI1: {
             void *pSAData;
@@ -1530,13 +1534,9 @@ static HRESULT WINAPI isaxxmlreader_parse(
             hr = SafeArrayGetUBound(V_ARRAY(&varInput), 1, &uBound);
             if(hr != S_OK) break;
             dataRead = (uBound-lBound)*SafeArrayGetElemsize(V_ARRAY(&varInput));
-            data = HeapAlloc(GetProcessHeap(), 0, dataRead+1);
-            if(!data) break;
             hr = SafeArrayAccessData(V_ARRAY(&varInput), (void**)&pSAData);
             if(hr != S_OK) break;
-            memcpy(data, pSAData, dataRead);
-            data[dataRead] = '\0';
-            hr = parse_buffer(This, data);
+            hr = parse_buffer(This, pSAData, dataRead);
             SafeArrayUnaccessData(V_ARRAY(&varInput));
             break;
         }
@@ -1558,6 +1558,7 @@ static HRESULT WINAPI isaxxmlreader_parse(
             {
                 STATSTG dataInfo;
                 ULONG dataRead;
+                char *data;
 
                 while(1)
                 {
@@ -1566,7 +1567,7 @@ static HRESULT WINAPI isaxxmlreader_parse(
                     break;
                 }
                 data = HeapAlloc(GetProcessHeap(), 0,
-                        dataInfo.cbSize.QuadPart+1);
+                        dataInfo.cbSize.QuadPart);
                 while(1)
                 {
                     hr = IStream_Read(stream, data,
@@ -1574,8 +1575,8 @@ static HRESULT WINAPI isaxxmlreader_parse(
                     if(hr == E_PENDING) continue;
                     break;
                 }
-                data[dataInfo.cbSize.QuadPart] = '\0';
-                hr = parse_buffer(This, data);
+                hr = parse_buffer(This, data, dataInfo.cbSize.QuadPart);
+                HeapFree(GetProcessHeap(), 0, data);
                 IStream_Release(stream);
                 break;
             }
@@ -1585,8 +1586,7 @@ static HRESULT WINAPI isaxxmlreader_parse(
                 BSTR bstrData;
 
                 IXMLDOMDocument_get_xml(xmlDoc, &bstrData);
-                data = xmlChar_from_wchar(bstrData);
-                hr = parse_buffer(This, data);
+                hr = parse_buffer(This, (const char*)bstrData, SysStringByteLen(bstrData));
                 IXMLDOMDocument_Release(xmlDoc);
                 hr = E_NOTIMPL;
                 break;
@@ -1597,23 +1597,16 @@ static HRESULT WINAPI isaxxmlreader_parse(
             hr = E_INVALIDARG;
     }
 
-    HeapFree(GetProcessHeap(), 0, data);
     return hr;
 }
 
 static HRESULT saxreader_onDataAvailable(void *obj, char *ptr, DWORD len)
 {
     saxreader *This = obj;
-    xmlChar *data;
     HRESULT hr;
 
-    data = HeapAlloc(GetProcessHeap(), 0, len+1);
-    memcpy(data, ptr, len);
-    data[len] = 0;
-
-    hr = parse_buffer(This, data);
+    hr = parse_buffer(This, ptr, len);
 
-    HeapFree(GetProcessHeap(), 0, data);
     return hr;
 }
 




More information about the wine-cvs mailing list