Piotr Caban : msxml3: Added ISAXXMLReader_parseURL implementation.

Alexandre Julliard julliard at winehq.org
Mon Jul 28 08:07:18 CDT 2008


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

Author: Piotr Caban <piotr.caban at gmail.com>
Date:   Sun Jul 27 19:54:48 2008 +0200

msxml3: Added ISAXXMLReader_parseURL implementation.

---

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

diff --git a/dlls/msxml3/saxreader.c b/dlls/msxml3/saxreader.c
index 3b67d01..ce27496 100644
--- a/dlls/msxml3/saxreader.c
+++ b/dlls/msxml3/saxreader.c
@@ -1098,17 +1098,11 @@ static HRESULT WINAPI isaxxmlreader_putSecureBaseURL(
     return E_NOTIMPL;
 }
 
-static HRESULT WINAPI isaxxmlreader_parse(
-        ISAXXMLReader* iface,
-        VARIANT varInput)
+static HRESULT parse_buffer(saxreader *This, xmlChar *buffer)
 {
-    saxreader *This = impl_from_ISAXXMLReader( iface );
     saxlocator *locator;
-    xmlChar *data = NULL;
     HRESULT hr;
 
-    TRACE("(%p)\n", This);
-
     hr = SAXLocator_create(This, &locator);
     if(FAILED(hr))
         return E_FAIL;
@@ -1123,12 +1117,38 @@ static HRESULT WINAPI isaxxmlreader_parse(
     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;
+
+    if(locator->pParserCtxt)
+    {
+        locator->pParserCtxt->sax = NULL;
+        xmlFreeParserCtxt(locator->pParserCtxt);
+        locator->pParserCtxt = NULL;
+    }
+
+    ISAXLocator_Release((ISAXLocator*)&locator->lpSAXLocatorVtbl);
+    return S_OK;
+}
+
+static HRESULT WINAPI isaxxmlreader_parse(
+        ISAXXMLReader* iface,
+        VARIANT varInput)
+{
+    saxreader *This = impl_from_ISAXXMLReader( iface );
+    xmlChar *data = NULL;
+    HRESULT hr;
+
+    TRACE("(%p)\n", This);
+
     hr = S_OK;
     switch(V_VT(&varInput))
     {
         case VT_BSTR:
             data = xmlChar_from_wchar(V_BSTR(&varInput));
-            xmlSetupParserForBuffer(locator->pParserCtxt, data, NULL);
+            hr = parse_buffer(This, data);
             break;
         case VT_ARRAY|VT_UI1: {
             void *pSAData;
@@ -1146,7 +1166,7 @@ static HRESULT WINAPI isaxxmlreader_parse(
             if(hr != S_OK) break;
             memcpy(data, pSAData, dataRead);
             data[dataRead] = '\0';
-            xmlSetupParserForBuffer(locator->pParserCtxt, data, NULL);
+            hr = parse_buffer(This, data);
             SafeArrayUnaccessData(V_ARRAY(&varInput));
             break;
         }
@@ -1185,7 +1205,7 @@ static HRESULT WINAPI isaxxmlreader_parse(
                     break;
                 }
                 data[dataInfo.cbSize.QuadPart] = '\0';
-                xmlSetupParserForBuffer(locator->pParserCtxt, data, NULL);
+                hr = parse_buffer(This, data);
                 IStream_Release(stream);
                 break;
             }
@@ -1196,7 +1216,7 @@ static HRESULT WINAPI isaxxmlreader_parse(
 
                 IXMLDOMDocument_get_xml(xmlDoc, &bstrData);
                 data = xmlChar_from_wchar(bstrData);
-                xmlSetupParserForBuffer(locator->pParserCtxt, data, NULL);
+                hr = parse_buffer(This, data);
                 IXMLDOMDocument_Release(xmlDoc);
                 hr = E_NOTIMPL;
                 break;
@@ -1207,20 +1227,23 @@ static HRESULT WINAPI isaxxmlreader_parse(
             hr = E_INVALIDARG;
     }
 
-    if(hr == S_OK)
-    {
-        if(xmlParseDocument(locator->pParserCtxt)) hr = E_FAIL;
-        else hr = locator->ret;
-    }
+    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);
 
-    if(locator->pParserCtxt)
-    {
-        locator->pParserCtxt->sax = NULL;
-        xmlFreeParserCtxt(locator->pParserCtxt);
-        locator->pParserCtxt = NULL;
-    }
     HeapFree(GetProcessHeap(), 0, data);
-    ISAXLocator_Release((ISAXLocator*)&locator->lpSAXLocatorVtbl);
     return hr;
 }
 
@@ -1229,9 +1252,18 @@ static HRESULT WINAPI isaxxmlreader_parseURL(
         const WCHAR *url)
 {
     saxreader *This = impl_from_ISAXXMLReader( iface );
+    bsc_t *bsc;
+    HRESULT hr;
 
-    FIXME("(%p)->(%s) stub\n", This, debugstr_w(url));
-    return E_NOTIMPL;
+    TRACE("(%p)->(%s) stub\n", This, debugstr_w(url));
+
+    hr = bind_url(url, saxreader_onDataAvailable, This, &bsc);
+    if(FAILED(hr))
+        return hr;
+
+    detach_bsc(bsc);
+
+    return S_OK;
 }
 
 static const struct ISAXXMLReaderVtbl isaxreader_vtbl =




More information about the wine-cvs mailing list