Nikolay Sivov : msxml3/httpreq: Added ISupportErrorInfo stub.

Alexandre Julliard julliard at winehq.org
Fri Sep 29 13:32:38 CDT 2017


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

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Fri Sep 29 17:35:46 2017 +0300

msxml3/httpreq: Added ISupportErrorInfo stub.

Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at 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();
 }




More information about the wine-cvs mailing list