Nikolay Sivov : msxml3: Accept ISequentialStream as reader input.
Alexandre Julliard
julliard at winehq.org
Tue Jul 24 14:39:27 CDT 2012
Module: wine
Branch: master
Commit: 5b7a55f67f8b8c5fa7e3602c9e65f95ee97b2b9a
URL: http://source.winehq.org/git/wine.git/?a=commit;h=5b7a55f67f8b8c5fa7e3602c9e65f95ee97b2b9a
Author: Nikolay Sivov <nsivov at codeweavers.com>
Date: Tue Jul 24 09:59:50 2012 +0400
msxml3: Accept ISequentialStream as reader input.
---
dlls/msxml3/saxreader.c | 45 ++++++++++++++++++++++++++++++---------------
1 files changed, 30 insertions(+), 15 deletions(-)
diff --git a/dlls/msxml3/saxreader.c b/dlls/msxml3/saxreader.c
index 87974bc..d10b822 100644
--- a/dlls/msxml3/saxreader.c
+++ b/dlls/msxml3/saxreader.c
@@ -2295,7 +2295,7 @@ static HRESULT internal_parseBuffer(saxreader *This, const char *buffer, int siz
return hr;
}
-static HRESULT internal_parseStream(saxreader *This, IStream *stream, BOOL vbInterface)
+static HRESULT internal_parseStream(saxreader *This, ISequentialStream *stream, BOOL vbInterface)
{
saxlocator *locator;
HRESULT hr;
@@ -2304,7 +2304,7 @@ static HRESULT internal_parseStream(saxreader *This, IStream *stream, BOOL vbInt
int ret;
dataRead = 0;
- hr = IStream_Read(stream, data, sizeof(data), &dataRead);
+ hr = ISequentialStream_Read(stream, data, sizeof(data), &dataRead);
if(FAILED(hr)) return hr;
hr = SAXLocator_create(This, &locator, vbInterface);
@@ -2331,7 +2331,7 @@ static HRESULT internal_parseStream(saxreader *This, IStream *stream, BOOL vbInt
while(1)
{
dataRead = 0;
- hr = IStream_Read(stream, data, sizeof(data), &dataRead);
+ hr = ISequentialStream_Read(stream, data, sizeof(data), &dataRead);
if (FAILED(hr)) break;
ret = xmlParseChunk(locator->pParserCtxt, data, dataRead, 0);
@@ -2411,7 +2411,7 @@ static HRESULT internal_parse(
case VT_UNKNOWN:
case VT_DISPATCH: {
IPersistStream *persistStream;
- IStream *stream = NULL;
+ ISequentialStream *stream = NULL;
IXMLDOMDocument *xmlDoc;
if(IUnknown_QueryInterface(V_UNKNOWN(&varInput),
@@ -2430,29 +2430,44 @@ static HRESULT internal_parse(
if(IUnknown_QueryInterface(V_UNKNOWN(&varInput),
&IID_IPersistStream, (void**)&persistStream) == S_OK)
{
- hr = CreateStreamOnHGlobal(NULL, TRUE, &stream);
+ IStream *stream_copy;
+
+ hr = CreateStreamOnHGlobal(NULL, TRUE, &stream_copy);
if(hr != S_OK)
{
IPersistStream_Release(persistStream);
return hr;
}
- hr = IPersistStream_Save(persistStream, stream, TRUE);
+ hr = IPersistStream_Save(persistStream, stream_copy, TRUE);
IPersistStream_Release(persistStream);
- if(hr != S_OK)
- {
- IStream_Release(stream);
- stream = NULL;
- }
+ if(hr == S_OK)
+ IStream_QueryInterface(stream_copy, &IID_ISequentialStream, (void**)&stream);
+
+ IStream_Release(stream_copy);
+ }
+
+ /* try base interface first */
+ if(!stream)
+ {
+ IUnknown_QueryInterface(V_UNKNOWN(&varInput), &IID_ISequentialStream, (void**)&stream);
+ if (!stream)
+ /* this should never happen if IStream is implemented properly, but just in case */
+ IUnknown_QueryInterface(V_UNKNOWN(&varInput), &IID_IStream, (void**)&stream);
}
- if(stream || IUnknown_QueryInterface(V_UNKNOWN(&varInput),
- &IID_IStream, (void**)&stream) == S_OK)
+ if(stream)
{
hr = internal_parseStream(This, stream, vbInterface);
- IStream_Release(stream);
- break;
+ ISequentialStream_Release(stream);
}
+ else
+ {
+ WARN("IUnknown* input doesn't support any of expected interfaces\n");
+ hr = E_INVALIDARG;
+ }
+
+ break;
}
default:
WARN("vt %d not implemented\n", V_VT(&varInput));
More information about the wine-cvs
mailing list