Piotr Caban : msxml3: Added support for more arguments in ISAXXMLReader_parse.
Alexandre Julliard
julliard at winehq.org
Thu Jul 24 06:58:12 CDT 2008
Module: wine
Branch: master
Commit: fc825af3ee8d837e486e3226b3f991077a331ea9
URL: http://source.winehq.org/git/wine.git/?a=commit;h=fc825af3ee8d837e486e3226b3f991077a331ea9
Author: Piotr Caban <piotr.caban at 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;
More information about the wine-cvs
mailing list