msxml3: Added partial implementation of ISAXXMLReader_parse.

This commit is contained in:
Piotr Caban 2008-07-17 00:40:53 +02:00 committed by Alexandre Julliard
parent d3e9ca7d0a
commit 51c952767c
1 changed files with 49 additions and 2 deletions

View File

@ -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);