Piotr Caban : msxml3: Added partial implementation of ISAXXMLReader_parse.

Alexandre Julliard julliard at winehq.org
Thu Jul 17 06:38:23 CDT 2008


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

Author: Piotr Caban <piotr.caban at gmail.com>
Date:   Thu Jul 17 00:40:53 2008 +0200

msxml3: Added partial implementation of ISAXXMLReader_parse.

---

 dlls/msxml3/saxreader.c |   51 +++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 49 insertions(+), 2 deletions(-)

diff --git a/dlls/msxml3/saxreader.c b/dlls/msxml3/saxreader.c
index cda75b6..a50adca 100644
--- a/dlls/msxml3/saxreader.c
+++ b/dlls/msxml3/saxreader.c
@@ -60,6 +60,8 @@ typedef struct _saxlocator
     const struct ISAXLocatorVtbl *lpSAXLocatorVtbl;
     LONG ref;
     saxreader *saxreader;
+    HRESULT ret;
+    xmlParserCtxtPtr pParserCtxt;
 } saxlocator;
 
 static inline saxreader *impl_from_IVBSAXXMLReader( IVBSAXXMLReader *iface )
@@ -194,6 +196,9 @@ static HRESULT SAXLocator_create(saxreader *reader, saxlocator **ppsaxlocator)
     locator->saxreader = reader;
     ISAXXMLReader_AddRef((ISAXXMLReader*)&reader->lpSAXXMLReaderVtbl);
 
+    locator->pParserCtxt = NULL;
+    locator->ret = S_OK;
+
     *ppsaxlocator = locator;
 
     TRACE("returning %p\n", *ppsaxlocator);
@@ -773,9 +778,48 @@ static HRESULT WINAPI isaxxmlreader_parse(
         VARIANT varInput)
 {
     saxreader *This = impl_from_ISAXXMLReader( iface );
+    saxlocator *locator;
+    xmlChar *data = NULL;
+    HRESULT hr;
 
-    FIXME("(%p) stub\n", This);
-    return E_NOTIMPL;
+    FIXME("(%p) semi-stub\n", This);
+
+    hr = SAXLocator_create(This, &locator);
+    if(FAILED(hr))
+        return E_FAIL;
+
+    hr = S_OK;
+    switch(V_VT(&varInput))
+    {
+        case VT_BSTR:
+            locator->pParserCtxt = xmlNewParserCtxt();
+            if(!locator->pParserCtxt)
+            {
+                hr = E_FAIL;
+                break;
+            }
+            data = xmlChar_from_wchar(V_BSTR(&varInput));
+            xmlSetupParserForBuffer(locator->pParserCtxt, data, NULL);
+
+            locator->pParserCtxt->sax = &locator->saxreader->sax;
+            locator->pParserCtxt->userData = locator;
+
+            if(xmlParseDocument(locator->pParserCtxt)) hr = E_FAIL;
+            else hr = locator->ret;
+            break;
+        default:
+            hr = E_NOTIMPL;
+    }
+
+    if(locator->pParserCtxt)
+    {
+        locator->pParserCtxt->sax = NULL;
+        xmlFreeParserCtxt(locator->pParserCtxt);
+        locator->pParserCtxt = NULL;
+    }
+    if(data) HeapFree(GetProcessHeap(), 0, data);
+    ISAXLocator_Release((ISAXLocator*)&locator->lpSAXLocatorVtbl);
+    return hr;
 }
 
 static HRESULT WINAPI isaxxmlreader_parseURL(
@@ -829,6 +873,9 @@ HRESULT SAXXMLReader_create(IUnknown *pUnkOuter, LPVOID *ppObj)
     reader->contentHandler = NULL;
     reader->errorHandler = NULL;
 
+    memset(&reader->sax, 0, sizeof(xmlSAXHandler));
+    reader->sax.initialized = XML_SAX2_MAGIC;
+
     *ppObj = &reader->lpVtbl;
 
     TRACE("returning iface %p\n", *ppObj);




More information about the wine-cvs mailing list