From 1c187d64a4265d04d0f48f0138668a21f2661f18 Mon Sep 17 00:00:00 2001 From: Daniel Lehman Date: Wed, 15 Mar 2017 09:38:30 -0700 Subject: [PATCH v2] msxml3: Don't QI for IPersistStream in internal_parse v2: simplify test (Nikolay) internal_parse QIs for IPersistStream and calls Save to convert to an IStream in memory. but IPersistStream::Save might not be implemented in a way that writes readable XML Windows doesn't appear to query for IPersistStream and returns E_INVALIDARG from "parse Method1" in ISAXXMLReader interface docs on MSDN: https://msdn.microsoft.com/en-us/library/ms764729.aspx " Parameters varInput A variant (or a reference to one) containing the input source to parse from. The following VARIANT types are supported: ... - VT_UNKNOWN or VT_DISPATCH, which can contain a value in the form of either an IStream, ISequentialStream, or IXMLDOMDocument " Signed-off-by: Daniel Lehman --- dlls/msxml3/saxreader.c | 32 ++++---------------------------- dlls/msxml3/tests/saxreader.c | 2 ++ 2 files changed, 6 insertions(+), 28 deletions(-) diff --git a/dlls/msxml3/saxreader.c b/dlls/msxml3/saxreader.c index 78cfe08..82241ad 100644 --- a/dlls/msxml3/saxreader.c +++ b/dlls/msxml3/saxreader.c @@ -2661,7 +2661,6 @@ static HRESULT internal_parse( } case VT_UNKNOWN: case VT_DISPATCH: { - IPersistStream *persistStream; ISequentialStream *stream = NULL; IXMLDOMDocument *xmlDoc; @@ -2678,34 +2677,11 @@ static HRESULT internal_parse( break; } - if(IUnknown_QueryInterface(V_UNKNOWN(&varInput), - &IID_IPersistStream, (void**)&persistStream) == S_OK) - { - IStream *stream_copy; - - hr = CreateStreamOnHGlobal(NULL, TRUE, &stream_copy); - if(hr != S_OK) - { - IPersistStream_Release(persistStream); - return hr; - } - - hr = IPersistStream_Save(persistStream, stream_copy, TRUE); - IPersistStream_Release(persistStream); - 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); - } + 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) { diff --git a/dlls/msxml3/tests/saxreader.c b/dlls/msxml3/tests/saxreader.c index 5fc62b7..cabca9d 100644 --- a/dlls/msxml3/tests/saxreader.c +++ b/dlls/msxml3/tests/saxreader.c @@ -1908,6 +1908,8 @@ static HRESULT WINAPI istream_QueryInterface(IStream *iface, REFIID riid, void * { *ppvObject = NULL; + ok(!IsEqualGUID(riid, &IID_IPersistStream), "Did not expect QI for IPersistStream\n"); + if(IsEqualGUID(riid, &IID_IStream) || IsEqualGUID(riid, &IID_IUnknown)) *ppvObject = iface; else -- 1.9.5