[PATCH 5/5] Implement ::get_status()
Nikolay Sivov
nsivov at codeweavers.com
Sat Sep 25 14:48:55 CDT 2010
---
dlls/msxml3/httprequest.c | 19 ++++++++++++++-----
dlls/msxml3/tests/domdoc.c | 26 +++++++++++++++++++++++++-
2 files changed, 39 insertions(+), 6 deletions(-)
diff --git a/dlls/msxml3/httprequest.c b/dlls/msxml3/httprequest.c
index 210012a..45ffa07 100644
--- a/dlls/msxml3/httprequest.c
+++ b/dlls/msxml3/httprequest.c
@@ -69,6 +69,7 @@ typedef struct
/* bind callback */
BindStatusCallback *bsc;
+ LONG status;
} httprequest;
struct BindStatusCallback
@@ -77,7 +78,7 @@ struct BindStatusCallback
const IHttpNegotiateVtbl *lpHttpNegotiateVtbl;
LONG ref;
- const httprequest *request;
+ httprequest *request;
};
#define STATUSCLB(x) ((IBindStatusCallback*) &(x)->lpBindStatusCallbackVtbl)
@@ -332,6 +333,8 @@ static HRESULT WINAPI BSCHttpNegotiate_OnResponse(IHttpNegotiate *iface, DWORD c
TRACE("(%p)->(%d %s %s %p)\n", This, code, debugstr_w(resp_headers),
debugstr_w(req_headers), add_reqheaders);
+ This->request->status = code;
+
return S_OK;
}
@@ -345,7 +348,7 @@ static const IHttpNegotiateVtbl BSCHttpNegotiateVtbl = {
BSCHttpNegotiate_OnResponse
};
-static HRESULT BindStatusCallback_create(const httprequest* This, BindStatusCallback **obj)
+static HRESULT BindStatusCallback_create(httprequest* This, BindStatusCallback **obj)
{
BindStatusCallback *bsc;
IBindCtx *pbc;
@@ -670,13 +673,18 @@ static HRESULT WINAPI httprequest_abort(IXMLHTTPRequest *iface)
return E_NOTIMPL;
}
-static HRESULT WINAPI httprequest_get_status(IXMLHTTPRequest *iface, LONG *plStatus)
+static HRESULT WINAPI httprequest_get_status(IXMLHTTPRequest *iface, LONG *status)
{
httprequest *This = impl_from_IXMLHTTPRequest( iface );
- FIXME("stub %p %p\n", This, plStatus);
+ TRACE("(%p)->(%p)\n", This, status);
- return E_NOTIMPL;
+ if (!status) return E_INVALIDARG;
+ if (This->state != STATE_COMPLETED) return E_FAIL;
+
+ *status = This->status;
+
+ return S_OK;
}
static HRESULT WINAPI httprequest_get_statusText(IXMLHTTPRequest *iface, BSTR *pbstrStatus)
@@ -789,6 +797,7 @@ HRESULT XMLHTTPRequest_create(IUnknown *pUnkOuter, void **ppObj)
req->url = req->user = req->password = NULL;
req->state = STATE_UNINITIALIZED;
req->bsc = NULL;
+ req->status = 0;
list_init(&req->reqheaders);
*ppObj = &req->lpVtbl;
diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c
index f3ebf63..a0fa2af 100644
--- a/dlls/msxml3/tests/domdoc.c
+++ b/dlls/msxml3/tests/domdoc.c
@@ -2887,7 +2887,7 @@ static void test_XMLHTTP(void)
VARIANT dummy;
VARIANT async;
VARIANT varbody;
- LONG state;
+ LONG state, status;
HRESULT hr = CoCreateInstance(&CLSID_XMLHTTPRequest, NULL,
CLSCTX_INPROC_SERVER, &IID_IXMLHttpRequest,
(void **)&pXMLHttpRequest);
@@ -2913,6 +2913,15 @@ static void test_XMLHTTP(void)
hr = IXMLHttpRequest_send(pXMLHttpRequest, dummy);
ok(hr == E_FAIL, "got 0x%08x\n", hr);
+ /* initial status code */
+ hr = IXMLHttpRequest_get_status(pXMLHttpRequest, NULL);
+ ok(hr == E_INVALIDARG, "got 0x%08x\n", hr);
+
+ status = 0xdeadbeef;
+ hr = IXMLHttpRequest_get_status(pXMLHttpRequest, &status);
+ ok(hr == E_FAIL, "got 0x%08x\n", hr);
+ ok(status == 0xdeadbeef, "got %d\n", status);
+
/* invalid parameters */
hr = IXMLHttpRequest_open(pXMLHttpRequest, NULL, NULL, async, dummy, dummy);
ok(hr == E_INVALIDARG, "got 0x%08x\n", hr);
@@ -2946,6 +2955,12 @@ static void test_XMLHTTP(void)
hr = IXMLHttpRequest_open(pXMLHttpRequest, method, url, async, dummy, dummy);
ok(hr == S_OK, "got 0x%08x\n", hr);
+ /* status code after ::open() */
+ status = 0xdeadbeef;
+ hr = IXMLHttpRequest_get_status(pXMLHttpRequest, &status);
+ ok(hr == E_FAIL, "got 0x%08x\n", hr);
+ ok(status == 0xdeadbeef, "got %d\n", status);
+
state = -1;
hr = IXMLHttpRequest_get_readyState(pXMLHttpRequest, &state);
ok(hr == S_OK, "got 0x%08x\n", hr);
@@ -2975,6 +2990,15 @@ static void test_XMLHTTP(void)
}
todo_wine ok(hr == S_OK, "IXMLHttpRequest_send should have succeeded instead of failing with 0x%08x\n", hr);
+ /* status code after ::send() */
+ status = 0xdeadbeef;
+ hr = IXMLHttpRequest_get_status(pXMLHttpRequest, &status);
+todo_wine {
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+ ok(status == 200, "got %d\n", status);
+}
+
+ /* another ::send() after completed request */
hr = IXMLHttpRequest_send(pXMLHttpRequest, varbody);
ok(hr == E_FAIL, "got 0x%08x\n", hr);
--
1.5.6.5
--------------010300060609070908000200--
More information about the wine-patches
mailing list