Nikolay Sivov : msxml3: Implemented get_responseStream().

Alexandre Julliard julliard at winehq.org
Wed Dec 14 13:23:32 CST 2011


Module: wine
Branch: master
Commit: 19a86feaa1c986846a346a98d1340258e1c37106
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=19a86feaa1c986846a346a98d1340258e1c37106

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Tue Dec 13 00:56:13 2011 +0300

msxml3: 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)




More information about the wine-cvs mailing list