Piotr Caban : msxml3: Change SAX IStream parser implementation.

Alexandre Julliard julliard at winehq.org
Tue Sep 9 05:50:55 CDT 2008


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

Author: Piotr Caban <piotr.caban at gmail.com>
Date:   Mon Sep  8 15:07:46 2008 +0200

msxml3: Change SAX IStream parser implementation.

---

 dlls/msxml3/saxreader.c |   93 ++++++++++++++++++++++++++---------------------
 1 files changed, 52 insertions(+), 41 deletions(-)

diff --git a/dlls/msxml3/saxreader.c b/dlls/msxml3/saxreader.c
index 554b048..4821a60 100644
--- a/dlls/msxml3/saxreader.c
+++ b/dlls/msxml3/saxreader.c
@@ -1680,6 +1680,57 @@ static HRESULT internal_parseBuffer(saxreader *This, const char *buffer, int siz
     return S_OK;
 }
 
+static HRESULT internal_parseStream(saxreader *This, IStream *stream, BOOL vbInterface)
+{
+    saxlocator *locator;
+    HRESULT hr;
+    ULONG dataRead;
+    char data[1024];
+
+    hr = IStream_Read(stream, data, sizeof(data), &dataRead);
+    if(hr != S_OK)
+        return hr;
+
+    hr = SAXLocator_create(This, &locator, vbInterface);
+    if(FAILED(hr))
+        return E_FAIL;
+
+    locator->pParserCtxt = xmlCreatePushParserCtxt(
+            &locator->saxreader->sax, locator,
+            data, dataRead, NULL);
+    if(!locator->pParserCtxt)
+    {
+        ISAXLocator_Release((ISAXLocator*)&locator->lpSAXLocatorVtbl);
+        return E_FAIL;
+    }
+
+    while(1)
+    {
+        hr = IStream_Read(stream, data, sizeof(data), &dataRead);
+        if(hr != S_OK)
+            break;
+
+        if(xmlParseChunk(locator->pParserCtxt, data, dataRead, 0)) hr = E_FAIL;
+        else hr = locator->ret;
+
+        if(hr != S_OK) break;
+
+        if(dataRead != sizeof(data))
+        {
+            if(xmlParseChunk(locator->pParserCtxt, data, 0, 1)) hr = E_FAIL;
+            else hr = locator->ret;
+
+            break;
+        }
+    }
+
+    locator->pParserCtxt->sax = NULL;
+    xmlFreeParserCtxt(locator->pParserCtxt);
+    locator->pParserCtxt = NULL;
+    ISAXLocator_Release((ISAXLocator*)&locator->lpSAXLocatorVtbl);
+    return hr;
+}
+
 static HRESULT WINAPI internal_getEntityResolver(
         saxreader *This,
         void *pEntityResolver,
@@ -1867,47 +1918,7 @@ static HRESULT WINAPI internal_parse(
             if(stream || IUnknown_QueryInterface(V_UNKNOWN(&varInput),
                         &IID_IStream, (void**)&stream) == S_OK)
             {
-                STATSTG dataInfo;
-                ULONG dataRead;
-                char *data;
-
-                while(1)
-                {
-                    hr = IStream_Stat(stream, &dataInfo, STATFLAG_NONAME);
-                    if(hr == E_PENDING) continue;
-                    break;
-                }
-                if(hr != S_OK)
-                {
-                    IStream_Release(stream);
-                    break;
-                }
-
-                data = HeapAlloc(GetProcessHeap(), 0,
-                        dataInfo.cbSize.QuadPart);
-                if(!data)
-                {
-                    IStream_Release(stream);
-                    break;
-                }
-
-                while(1)
-                {
-                    hr = IStream_Read(stream, data,
-                            dataInfo.cbSize.QuadPart, &dataRead);
-                    if(hr == E_PENDING) continue;
-                    break;
-                }
-                if(hr != S_OK)
-                {
-                    HeapFree(GetProcessHeap(), 0, data);
-                    IStream_Release(stream);
-                    break;
-                }
-
-                hr = internal_parseBuffer(This, data,
-                        dataInfo.cbSize.QuadPart, vbInterface);
-                HeapFree(GetProcessHeap(), 0, data);
+                hr = internal_parseStream(This, stream, vbInterface);
                 IStream_Release(stream);
                 break;
             }




More information about the wine-cvs mailing list