Piotr Caban : msxml3: Added support for more arguments in ISAXXMLReader_parse.
Module: wine Branch: master Commit: fc825af3ee8d837e486e3226b3f991077a331ea9 URL: http://source.winehq.org/git/wine.git/?a=commit;h=fc825af3ee8d837e486e3226b3... Author: Piotr Caban <piotr.caban(a)gmail.com> Date: Wed Jul 23 16:38:58 2008 +0200 msxml3: Added support for more arguments in ISAXXMLReader_parse. Parsing is not working when XMLDOMDocument is passed. It's because IXMLDOMDocument_get_xml returns incomplete data. --- dlls/msxml3/saxreader.c | 36 ++++++++++++++++++++++++++++++------ 1 files changed, 30 insertions(+), 6 deletions(-) diff --git a/dlls/msxml3/saxreader.c b/dlls/msxml3/saxreader.c index d0afcf5..9ea2aa2 100644 --- a/dlls/msxml3/saxreader.c +++ b/dlls/msxml3/saxreader.c @@ -1071,26 +1071,50 @@ static HRESULT WINAPI isaxxmlreader_parse( case VT_UNKNOWN: case VT_DISPATCH: { IPersistStream *persistStream; - IStream *stream; + IStream *stream = NULL; IXMLDOMDocument *xmlDoc; if(IUnknown_QueryInterface(V_UNKNOWN(&varInput), &IID_IPersistStream, (void**)&persistStream) == S_OK) { + hr = IPersistStream_Save(persistStream, stream, TRUE); IPersistStream_Release(persistStream); - hr = E_NOTIMPL; - break; + if(hr != S_OK) break; } - if(IUnknown_QueryInterface(V_UNKNOWN(&varInput), - &IID_IStream, (void**)&stream) == S_OK) + if(stream || IUnknown_QueryInterface(V_UNKNOWN(&varInput), + &IID_IStream, (void**)&stream) == S_OK) { + STATSTG dataInfo; + ULONG dataRead; + + while(1) + { + hr = IStream_Stat(stream, &dataInfo, STATFLAG_NONAME); + if(hr == E_PENDING) continue; + break; + } + data = HeapAlloc(GetProcessHeap(), 0, + dataInfo.cbSize.QuadPart+1); + while(1) + { + hr = IStream_Read(stream, data, + dataInfo.cbSize.QuadPart, &dataRead); + if(hr == E_PENDING) continue; + break; + } + data[dataInfo.cbSize.QuadPart] = '\0'; + xmlSetupParserForBuffer(locator->pParserCtxt, data, NULL); IStream_Release(stream); - hr = E_NOTIMPL; break; } if(IUnknown_QueryInterface(V_UNKNOWN(&varInput), &IID_IXMLDOMDocument, (void**)&xmlDoc) == S_OK) { + BSTR bstrData; + + IXMLDOMDocument_get_xml(xmlDoc, &bstrData); + data = xmlChar_from_wchar(bstrData); + xmlSetupParserForBuffer(locator->pParserCtxt, data, NULL); IXMLDOMDocument_Release(xmlDoc); hr = E_NOTIMPL; break;
participants (1)
-
Alexandre Julliard