[PATCH 4/5] Store passed data for IXMLHttpRequest::open()
Nikolay Sivov
nsivov at codeweavers.com
Mon Sep 27 17:12:59 CDT 2010
---
dlls/msxml3/httprequest.c | 76 +++++++++++++++++++++++++++++++++++++++++--
dlls/msxml3/tests/domdoc.c | 34 +++++++++++++------
2 files changed, 95 insertions(+), 15 deletions(-)
diff --git a/dlls/msxml3/httprequest.c b/dlls/msxml3/httprequest.c
index 025dbc2..60d7cd1 100644
--- a/dlls/msxml3/httprequest.c
+++ b/dlls/msxml3/httprequest.c
@@ -36,10 +36,22 @@ WINE_DEFAULT_DEBUG_CHANNEL(msxml);
#ifdef HAVE_LIBXML2
+static const WCHAR MethodGetW[] = {'G','E','T',0};
+static const WCHAR MethodPutW[] = {'P','U','T',0};
+static const WCHAR MethodPostW[] = {'P','O','S','T',0};
+
typedef struct _httprequest
{
const struct IXMLHTTPRequestVtbl *lpVtbl;
LONG ref;
+
+ BINDVERB verb;
+ BSTR url;
+ BOOL async;
+
+ /* credentials */
+ BSTR user;
+ BSTR password;
} httprequest;
static inline httprequest *impl_from_IXMLHTTPRequest( IXMLHTTPRequest *iface )
@@ -83,6 +95,9 @@ static ULONG WINAPI httprequest_Release(IXMLHTTPRequest *iface)
ref = InterlockedDecrement( &This->ref );
if ( ref == 0 )
{
+ SysFreeString(This->url);
+ SysFreeString(This->user);
+ SysFreeString(This->password);
heap_free( This );
}
@@ -158,14 +173,63 @@ static HRESULT WINAPI httprequest_Invoke(IXMLHTTPRequest *iface, DISPID dispIdMe
return hr;
}
-static HRESULT WINAPI httprequest_open(IXMLHTTPRequest *iface, BSTR bstrMethod, BSTR bstrUrl,
- VARIANT varAsync, VARIANT bstrUser, VARIANT bstrPassword)
+static HRESULT WINAPI httprequest_open(IXMLHTTPRequest *iface, BSTR method, BSTR url,
+ VARIANT async, VARIANT user, VARIANT password)
{
httprequest *This = impl_from_IXMLHTTPRequest( iface );
+ HRESULT hr;
+ VARIANT str;
- FIXME("stub (%p)\n", This);
+ TRACE("(%p)->(%s %s)\n", This, debugstr_w(method), debugstr_w(url));
- return E_NOTIMPL;
+ if (!method || !url) return E_INVALIDARG;
+
+ /* free previously set data */
+ SysFreeString(This->url);
+ SysFreeString(This->user);
+ SysFreeString(This->password);
+ This->url = This->user = This->password = NULL;
+
+ if (lstrcmpiW(method, MethodGetW) == 0)
+ {
+ This->verb = BINDVERB_GET;
+ }
+ else if (lstrcmpiW(method, MethodPutW) == 0)
+ {
+ This->verb = BINDVERB_PUT;
+ }
+ else if (lstrcmpiW(method, MethodPostW) == 0)
+ {
+ This->verb = BINDVERB_POST;
+ }
+ else
+ {
+ FIXME("unsupported request type %s\n", debugstr_w(method));
+ This->verb = -1;
+ return E_FAIL;
+ }
+
+ This->url = SysAllocString(url);
+
+ hr = VariantChangeType(&async, &async, 0, VT_BOOL);
+ This->async = hr == S_OK && V_BOOL(&async) == VARIANT_TRUE;
+
+ VariantInit(&str);
+ hr = VariantChangeType(&str, &user, 0, VT_BSTR);
+ if (hr == S_OK)
+ {
+ This->user = SysAllocString(V_BSTR(&str));
+ VariantClear(&str);
+ }
+
+ hr = VariantChangeType(&str, &password, 0, VT_BSTR);
+ if (hr == S_OK)
+ {
+ This->password = SysAllocString(V_BSTR(&str));
+ VariantClear(&str);
+ }
+
+ return S_OK;
}
static HRESULT WINAPI httprequest_setRequestHeader(IXMLHTTPRequest *iface, BSTR bstrHeader, BSTR bstrValue)
@@ -324,6 +388,10 @@ HRESULT XMLHTTPRequest_create(IUnknown *pUnkOuter, LPVOID *ppObj)
req->lpVtbl = &dimimpl_vtbl;
req->ref = 1;
+ req->async = FALSE;
+ req->verb = -1;
+ req->url = req->user = req->password = NULL;
+
*ppObj = &req->lpVtbl;
TRACE("returning iface %p\n", *ppObj);
diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c
index 205716a..dcc38ba 100644
--- a/dlls/msxml3/tests/domdoc.c
+++ b/dlls/msxml3/tests/domdoc.c
@@ -2883,9 +2883,9 @@ static void test_XMLHTTP(void)
'p','o','s','t','t','e','s','t','.','p','h','p',0};
static const WCHAR wszExpectedResponse[] = {'F','A','I','L','E','D',0};
IXMLHttpRequest *pXMLHttpRequest;
- BSTR bstrResponse, str1, str2;
+ BSTR bstrResponse, method, url;
VARIANT dummy;
- VARIANT varfalse;
+ VARIANT async;
VARIANT varbody;
HRESULT hr = CoCreateInstance(&CLSID_XMLHTTPRequest, NULL,
CLSCTX_INPROC_SERVER, &IID_IXMLHttpRequest,
@@ -2899,18 +2899,30 @@ static void test_XMLHTTP(void)
VariantInit(&dummy);
V_VT(&dummy) = VT_ERROR;
V_ERROR(&dummy) = DISP_E_MEMBERNOTFOUND;
- VariantInit(&varfalse);
- V_VT(&varfalse) = VT_BOOL;
- V_BOOL(&varfalse) = VARIANT_FALSE;
+ VariantInit(&async);
+ V_VT(&async) = VT_BOOL;
+ V_BOOL(&async) = VARIANT_FALSE;
V_VT(&varbody) = VT_BSTR;
V_BSTR(&varbody) = SysAllocString(wszBody);
- str1 = SysAllocString(wszPOST);
- str2 = SysAllocString(wszUrl);
- hr = IXMLHttpRequest_open(pXMLHttpRequest, str1, str2, varfalse, dummy, dummy);
- todo_wine ok(hr == S_OK, "IXMLHttpRequest_open should have succeeded instead of failing with 0x%08x\n", hr);
- SysFreeString(str1);
- SysFreeString(str2);
+ method = SysAllocString(wszPOST);
+ url = SysAllocString(wszUrl);
+
+ /* invalid parameters */
+ hr = IXMLHttpRequest_open(pXMLHttpRequest, NULL, NULL, async, dummy, dummy);
+ ok(hr == E_INVALIDARG, "got 0x%08x\n", hr);
+
+ hr = IXMLHttpRequest_open(pXMLHttpRequest, method, NULL, async, dummy, dummy);
+ ok(hr == E_INVALIDARG, "got 0x%08x\n", hr);
+
+ hr = IXMLHttpRequest_open(pXMLHttpRequest, NULL, url, async, dummy, dummy);
+ ok(hr == E_INVALIDARG, "got 0x%08x\n", hr);
+
+ hr = IXMLHttpRequest_open(pXMLHttpRequest, method, url, async, dummy, dummy);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+
+ SysFreeString(method);
+ SysFreeString(url);
hr = IXMLHttpRequest_send(pXMLHttpRequest, varbody);
if (hr == INET_E_RESOURCE_NOT_FOUND)
--
1.5.6.5
--------------060805050608080400070601--
More information about the wine-patches
mailing list