Module: wine Branch: master Commit: af07789cdc852109d8aba0df90dbf884af2929ba URL: http://source.winehq.org/git/wine.git/?a=commit;h=af07789cdc852109d8aba0df90...
Author: Nikolay Sivov nsivov@codeweavers.com Date: Fri Sep 29 17:35:46 2017 +0300
msxml3/httpreq: Added ISupportErrorInfo stub.
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/msxml3/httprequest.c | 54 +++++++++++++++++++++++++++++++++-- dlls/msxml3/tests/httpreq.c | 69 +++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 115 insertions(+), 8 deletions(-)
diff --git a/dlls/msxml3/httprequest.c b/dlls/msxml3/httprequest.c index d9f3f98..72234ee 100644 --- a/dlls/msxml3/httprequest.c +++ b/dlls/msxml3/httprequest.c @@ -73,6 +73,7 @@ typedef struct IXMLHTTPRequest IXMLHTTPRequest_iface; IObjectWithSite IObjectWithSite_iface; IObjectSafety IObjectSafety_iface; + ISupportErrorInfo ISupportErrorInfo_iface; LONG ref;
READYSTATE state; @@ -131,6 +132,11 @@ static inline httprequest *impl_from_IObjectSafety(IObjectSafety *iface) return CONTAINING_RECORD(iface, httprequest, IObjectSafety_iface); }
+static inline httprequest *impl_from_ISupportErrorInfo(ISupportErrorInfo *iface) +{ + return CONTAINING_RECORD(iface, httprequest, ISupportErrorInfo_iface); +} + static inline serverhttp *impl_from_IServerXMLHTTPRequest(IServerXMLHTTPRequest *iface) { return CONTAINING_RECORD(iface, serverhttp, IServerXMLHTTPRequest_iface); @@ -1329,6 +1335,10 @@ static HRESULT WINAPI XMLHTTPRequest_QueryInterface(IXMLHTTPRequest *iface, REFI { *ppvObject = &This->IObjectSafety_iface; } + else if (IsEqualGUID(&IID_ISupportErrorInfo, riid)) + { + *ppvObject = &This->ISupportErrorInfo_iface; + } else { TRACE("Unsupported interface %s\n", debugstr_guid(riid)); @@ -1336,7 +1346,7 @@ static HRESULT WINAPI XMLHTTPRequest_QueryInterface(IXMLHTTPRequest *iface, REFI return E_NOINTERFACE; }
- IXMLHTTPRequest_AddRef( iface ); + IUnknown_AddRef((IUnknown *)*ppvObject);
return S_OK; } @@ -1709,6 +1719,41 @@ static const IObjectSafetyVtbl ObjectSafetyVtbl = { httprequest_Safety_SetInterfaceSafetyOptions };
+static HRESULT WINAPI SupportErrorInfo_QueryInterface(ISupportErrorInfo *iface, REFIID riid, void **obj) +{ + httprequest *This = impl_from_ISupportErrorInfo(iface); + return IXMLHTTPRequest_QueryInterface(&This->IXMLHTTPRequest_iface, riid, obj); +} + +static ULONG WINAPI SupportErrorInfo_AddRef(ISupportErrorInfo *iface) +{ + httprequest *This = impl_from_ISupportErrorInfo(iface); + return IXMLHTTPRequest_AddRef(&This->IXMLHTTPRequest_iface); +} + +static ULONG WINAPI SupportErrorInfo_Release(ISupportErrorInfo *iface) +{ + httprequest *This = impl_from_ISupportErrorInfo(iface); + return IXMLHTTPRequest_Release(&This->IXMLHTTPRequest_iface); +} + +static HRESULT WINAPI SupportErrorInfo_InterfaceSupportsErrorInfo(ISupportErrorInfo *iface, REFIID riid) +{ + httprequest *This = impl_from_ISupportErrorInfo(iface); + + FIXME("(%p)->(%s)\n", This, debugstr_guid(riid)); + + return E_NOTIMPL; +} + +static const ISupportErrorInfoVtbl SupportErrorInfoVtbl = +{ + SupportErrorInfo_QueryInterface, + SupportErrorInfo_AddRef, + SupportErrorInfo_Release, + SupportErrorInfo_InterfaceSupportsErrorInfo, +}; + /* IServerXMLHTTPRequest */ static HRESULT WINAPI ServerXMLHTTPRequest_QueryInterface(IServerXMLHTTPRequest *iface, REFIID riid, void **obj) { @@ -1723,6 +1768,10 @@ static HRESULT WINAPI ServerXMLHTTPRequest_QueryInterface(IServerXMLHTTPRequest { *obj = iface; } + else if ( IsEqualGUID( riid, &IID_ISupportErrorInfo )) + { + *obj = &This->req.ISupportErrorInfo_iface; + } else { TRACE("Unsupported interface %s\n", debugstr_guid(riid)); @@ -1730,7 +1779,7 @@ static HRESULT WINAPI ServerXMLHTTPRequest_QueryInterface(IServerXMLHTTPRequest return E_NOINTERFACE; }
- IServerXMLHTTPRequest_AddRef( iface ); + IUnknown_AddRef( (IUnknown *)*obj );
return S_OK; } @@ -1987,6 +2036,7 @@ static void init_httprequest(httprequest *req) req->IXMLHTTPRequest_iface.lpVtbl = &XMLHTTPRequestVtbl; req->IObjectWithSite_iface.lpVtbl = &ObjectWithSiteVtbl; req->IObjectSafety_iface.lpVtbl = &ObjectSafetyVtbl; + req->ISupportErrorInfo_iface.lpVtbl = &SupportErrorInfoVtbl; req->ref = 1;
req->async = FALSE; diff --git a/dlls/msxml3/tests/httpreq.c b/dlls/msxml3/tests/httpreq.c index a744b95..538e23f 100644 --- a/dlls/msxml3/tests/httpreq.c +++ b/dlls/msxml3/tests/httpreq.c @@ -1339,6 +1339,16 @@ static IXMLHttpRequest *create_xhr(void) return SUCCEEDED(hr) ? ret : NULL; }
+static IServerXMLHTTPRequest *create_server_xhr(void) +{ + IServerXMLHTTPRequest *ret; + HRESULT hr; + + hr = CoCreateInstance(&CLSID_ServerXMLHTTP30, NULL, CLSCTX_INPROC_SERVER, &IID_IServerXMLHTTPRequest, (void **)&ret); + + return SUCCEEDED(hr) ? ret : NULL; +} + static void set_safety_opt(IUnknown *unk, DWORD mask, DWORD opts) { IObjectSafety *obj_safety; @@ -1777,20 +1787,67 @@ static void test_safe_httpreq(void) free_bstrs(); }
+static void test_supporterrorinfo(void) +{ + HRESULT hr; + IXMLHttpRequest *xhr; + IServerXMLHTTPRequest *server_xhr; + ISupportErrorInfo *errorinfo, *errorinfo2; + + xhr = create_xhr(); + + EXPECT_REF(xhr, 1); + hr = IXMLHttpRequest_QueryInterface(xhr, &IID_ISupportErrorInfo, (void **)&errorinfo); + ok(hr == S_OK, "Failed to get ISupportErrorInfo, hr %#x.\n", hr); + EXPECT_REF(xhr, 2); + + hr = IXMLHttpRequest_QueryInterface(xhr, &IID_ISupportErrorInfo, (void **)&errorinfo2); + ok(hr == S_OK, "Failed to get ISupportErrorInfo, hr %#x.\n", hr); + ok(errorinfo == errorinfo2, "Unexpected error info instance.\n"); + EXPECT_REF(xhr, 3); + + ISupportErrorInfo_Release(errorinfo2); + ISupportErrorInfo_Release(errorinfo); + + IXMLHttpRequest_Release(xhr); + + /* ServerXMLHTTP */ + server_xhr = create_server_xhr(); + + EXPECT_REF(server_xhr, 1); + hr = IServerXMLHTTPRequest_QueryInterface(server_xhr, &IID_ISupportErrorInfo, (void **)&errorinfo); + ok(hr == S_OK, "Failed to get ISupportErrorInfo, hr %#x.\n", hr); + EXPECT_REF(server_xhr, 2); + + hr = IServerXMLHTTPRequest_QueryInterface(server_xhr, &IID_ISupportErrorInfo, (void **)&errorinfo2); + ok(hr == S_OK, "Failed to get ISupportErrorInfo, hr %#x.\n", hr); + ok(errorinfo == errorinfo2, "Unexpected error info instance.\n"); + EXPECT_REF(server_xhr, 3); + + ISupportErrorInfo_Release(errorinfo2); + ISupportErrorInfo_Release(errorinfo); + + IServerXMLHTTPRequest_Release(server_xhr); +} + START_TEST(httpreq) { IXMLHttpRequest *xhr;
CoInitialize(NULL);
- if((xhr = create_xhr())) { - IXMLHttpRequest_Release(xhr); - - test_XMLHTTP(); - test_safe_httpreq(); - }else { + if (!(xhr = create_xhr())) + { win_skip("IXMLHTTPRequest is not available\n"); + CoUninitialize(); + return; }
+ IXMLHttpRequest_Release(xhr); + + test_XMLHTTP(); + test_safe_httpreq(); + test_supporterrorinfo(); + CoUninitialize(); }