>From 1fdee0211989d8b87fb399e988c5e8857e063d87 Mon Sep 17 00:00:00 2001 From: Nikolay Sivov Date: Tue, 13 Dec 2011 00:56:13 +0300 Subject: [PATCH 1/3] Implemented get_responseStream() --- dlls/msxml3/httprequest.c | 26 ++++++++++++++++++++++---- dlls/msxml3/tests/domdoc.c | 31 ++++++++++++++++++++++++++++++- 2 files changed, 52 insertions(+), 5 deletions(-) diff --git a/dlls/msxml3/httprequest.c b/dlls/msxml3/httprequest.c index 2385d18..cf4afe4 100644 --- a/dlls/msxml3/httprequest.c +++ b/dlls/msxml3/httprequest.c @@ -926,7 +926,9 @@ static HRESULT WINAPI httprequest_get_responseBody(IXMLHTTPRequest *iface, VARIA TRACE("(%p)->(%p)\n", This, body); if (!body) return E_INVALIDARG; - if (This->state != READYSTATE_COMPLETE) return E_FAIL; + V_VT(body) = VT_EMPTY; + + if (This->state != READYSTATE_COMPLETE) return E_PENDING; hr = GetHGlobalFromStream(This->bsc->stream, &hglobal); if (hr == S_OK) @@ -968,13 +970,29 @@ static HRESULT WINAPI httprequest_get_responseBody(IXMLHTTPRequest *iface, VARIA return hr; } -static HRESULT WINAPI httprequest_get_responseStream(IXMLHTTPRequest *iface, VARIANT *pvarBody) +static HRESULT WINAPI httprequest_get_responseStream(IXMLHTTPRequest *iface, VARIANT *body) { httprequest *This = impl_from_IXMLHTTPRequest( iface ); + LARGE_INTEGER move; + IStream *stream; + HRESULT hr; - FIXME("stub %p %p\n", This, pvarBody); + TRACE("(%p)->(%p)\n", This, body); - return E_NOTIMPL; + if (!body) return E_INVALIDARG; + V_VT(body) = VT_EMPTY; + + if (This->state != READYSTATE_COMPLETE) return E_PENDING; + + hr = IStream_Clone(This->bsc->stream, &stream); + + move.QuadPart = 0; + IStream_Seek(stream, move, STREAM_SEEK_SET, NULL); + + V_VT(body) = VT_UNKNOWN; + V_UNKNOWN(body) = (IUnknown*)stream; + + return hr; } static HRESULT WINAPI httprequest_get_readyState(IXMLHTTPRequest *iface, LONG *state) diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c index 4a719c8..19cb758 100644 --- a/dlls/msxml3/tests/domdoc.c +++ b/dlls/msxml3/tests/domdoc.c @@ -4639,6 +4639,7 @@ static void test_XMLHTTP(void) IDispatch *event; void *ptr; HRESULT hr; + HGLOBAL g; hr = CoCreateInstance(&CLSID_XMLHTTPRequest, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLHttpRequest, (void**)&xhr); @@ -4665,6 +4666,20 @@ static void test_XMLHTTP(void) hr = IXMLHttpRequest_abort(xhr); EXPECT_HR(hr, S_OK); + V_VT(&varbody) = VT_I2; + V_I2(&varbody) = 1; + hr = IXMLHttpRequest_get_responseBody(xhr, &varbody); + EXPECT_HR(hr, E_PENDING); + ok(V_VT(&varbody) == VT_EMPTY, "got type %d\n", V_VT(&varbody)); + ok(V_I2(&varbody) == 1, "got %d\n", V_I2(&varbody)); + + V_VT(&varbody) = VT_I2; + V_I2(&varbody) = 1; + hr = IXMLHttpRequest_get_responseStream(xhr, &varbody); + EXPECT_HR(hr, E_PENDING); + ok(V_VT(&varbody) == VT_EMPTY, "got type %d\n", V_VT(&varbody)); + ok(V_I2(&varbody) == 1, "got %d\n", V_I2(&varbody)); + /* send before open */ hr = IXMLHttpRequest_send(xhr, dummy); ok(hr == E_FAIL || broken(hr == E_UNEXPECTED) /* win2k */, "got 0x%08x\n", hr); @@ -4835,9 +4850,23 @@ static void test_XMLHTTP(void) SafeArrayUnaccessData(V_ARRAY(&varbody)); VariantClear(&varbody); - SysFreeString(url); + /* get_responseStream */ + hr = IXMLHttpRequest_get_responseStream(xhr, NULL); + EXPECT_HR(hr, E_INVALIDARG); + + V_VT(&varbody) = VT_EMPTY; + hr = IXMLHttpRequest_get_responseStream(xhr, &varbody); + ok(V_VT(&varbody) == VT_UNKNOWN, "got type %d\n", V_VT(&varbody)); + EXPECT_HR(hr, S_OK); + EXPECT_REF(V_UNKNOWN(&varbody), 1); + + g = NULL; + hr = GetHGlobalFromStream((IStream*)V_UNKNOWN(&varbody), &g); + EXPECT_HR(hr, S_OK); + ok(g != NULL, "got %p\n", g); + hr = IXMLHttpRequest_QueryInterface(xhr, &IID_IObjectSafety, (void**)&safety); EXPECT_HR(hr, S_OK); if(hr == S_OK) -- 1.5.6.5