[PATCH 3/3] Implemented ::get_status()

Nikolay Sivov nsivov at codeweavers.com
Mon Oct 4 13:09:02 CDT 2010


---
 dlls/msxml3/httprequest.c  |   20 +++++++++++++++-----
 dlls/msxml3/tests/domdoc.c |   26 +++++++++++++++++++++++++-
 2 files changed, 40 insertions(+), 6 deletions(-)

diff --git a/dlls/msxml3/httprequest.c b/dlls/msxml3/httprequest.c
index 3e69722..f1a93f6 100644
--- a/dlls/msxml3/httprequest.c
+++ b/dlls/msxml3/httprequest.c
@@ -2,6 +2,7 @@
  *    IXMLHTTPRequest implementation
  *
  * Copyright 2008 Alistair Leslie-Hughes
+ * Copyright 2010 Nikolay Sivov for Codeweavers
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -74,6 +75,7 @@ typedef struct
 
     /* bind callback */
     BindStatusCallback *bsc;
+    LONG status;
 } httprequest;
 
 static inline httprequest *impl_from_IXMLHTTPRequest( IXMLHTTPRequest *iface )
@@ -88,7 +90,7 @@ struct BindStatusCallback
     LONG ref;
 
     IBinding *binding;
-    const httprequest *request;
+    httprequest *request;
 };
 
 static inline BindStatusCallback *impl_from_IBindStatusCallback( IBindStatusCallback *iface )
@@ -349,6 +351,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;
 }
 
@@ -362,7 +366,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;
@@ -693,13 +697,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 != READYSTATE_COMPLETE) return E_FAIL;
+
+    *status = This->status;
+
+    return S_OK;
 }
 
 static HRESULT WINAPI httprequest_get_statusText(IXMLHTTPRequest *iface, BSTR *pbstrStatus)
@@ -812,6 +821,7 @@ HRESULT XMLHTTPRequest_create(IUnknown *pUnkOuter, void **ppObj)
     req->url = req->user = req->password = NULL;
     req->state = READYSTATE_UNINITIALIZED;
     req->bsc = NULL;
+    req->status = 0;
     req->reqheader_size = 0;
     list_init(&req->reqheaders);
 
diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c
index 07ef5a9..2c261fe 100644
--- a/dlls/msxml3/tests/domdoc.c
+++ b/dlls/msxml3/tests/domdoc.c
@@ -3082,7 +3082,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);
@@ -3108,6 +3108,15 @@ static void test_XMLHTTP(void)
     hr = IXMLHttpRequest_send(pXMLHttpRequest, dummy);
     ok(hr == E_FAIL || broken(hr == E_UNEXPECTED) /* win9x, win2k */, "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 || broken(hr == E_UNEXPECTED) /* win9x, win2k */, "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);
@@ -3141,6 +3150,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 || broken(hr == E_UNEXPECTED) /* win9x, win2k */, "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);
@@ -3167,6 +3182,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 || broken(hr == E_UNEXPECTED) /* win9x, win2k */, "got 0x%08x\n", hr);
 
-- 
1.5.6.5



--------------050506010506050208020206--



More information about the wine-patches mailing list