Jacek Caban : urlmon: Query for IHtmlNegotiate[2] interfaces when needed.

Alexandre Julliard julliard at winehq.org
Tue Jun 23 10:02:51 CDT 2009


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Tue Jun 23 14:53:10 2009 +0200

urlmon: Query for IHtmlNegotiate[2] interfaces when needed.

---

 dlls/urlmon/bindctx.c   |   91 +++++++++++++++++++----------------------------
 dlls/urlmon/tests/url.c |    6 ---
 2 files changed, 37 insertions(+), 60 deletions(-)

diff --git a/dlls/urlmon/bindctx.c b/dlls/urlmon/bindctx.c
index 8c1949b..7438383 100644
--- a/dlls/urlmon/bindctx.c
+++ b/dlls/urlmon/bindctx.c
@@ -37,13 +37,6 @@ typedef struct {
 
     IBindStatusCallback *callback;
     IServiceProvider *serv_prov;
-
-    IHttpNegotiate *http_negotiate;
-    BOOL init_http_negotiate;
-    IHttpNegotiate2 *http_negotiate2;
-    BOOL init_http_negotiate2;
-    IAuthenticate *authenticate;
-    BOOL init_authenticate;
 } BindStatusCallback;
 
 #define STATUSCLB(x)     ((IBindStatusCallback*)  &(x)->lpBindStatusCallbackVtbl)
@@ -51,6 +44,18 @@ typedef struct {
 #define HTTPNEG2(x)      ((IHttpNegotiate2*)      &(x)->lpHttpNegotiate2Vtbl)
 #define AUTHENTICATE(x)  ((IAuthenticate*)        &(x)->lpAuthenticateVtbl)
 
+static void *get_callback_iface(BindStatusCallback *This, REFIID riid)
+{
+    void *ret;
+    HRESULT hres;
+
+    hres = IBindStatusCallback_QueryInterface(This->callback, riid, (void**)&ret);
+    if(FAILED(hres) && This->serv_prov)
+        IServiceProvider_QueryService(This->serv_prov, riid, riid, &ret);
+
+    return ret;
+}
+
 #define STATUSCLB_THIS(iface) DEFINE_THIS(BindStatusCallback, BindStatusCallback, iface)
 
 static HRESULT WINAPI BindStatusCallback_QueryInterface(IBindStatusCallback *iface,
@@ -112,12 +117,6 @@ static ULONG WINAPI BindStatusCallback_Release(IBindStatusCallback *iface)
     if(!ref) {
         if(This->serv_prov)
             IServiceProvider_Release(This->serv_prov);
-        if(This->http_negotiate)
-            IHttpNegotiate_Release(This->http_negotiate);
-        if(This->http_negotiate2)
-            IHttpNegotiate2_Release(This->http_negotiate2);
-        if(This->authenticate)
-            IAuthenticate_Release(This->authenticate);
         IBindStatusCallback_Release(This->callback);
         heap_free(This);
     }
@@ -250,46 +249,16 @@ static HRESULT WINAPI BSCServiceProvider_QueryService(IServiceProvider *iface,
 
     if(IsEqualGUID(&IID_IHttpNegotiate, guidService)) {
         TRACE("(%p)->(IID_IHttpNegotiate %s %p)\n", This, debugstr_guid(riid), ppv);
-
-        if(!This->init_http_negotiate) {
-            This->init_http_negotiate = TRUE;
-            hres = IBindStatusCallback_QueryInterface(This->callback, &IID_IHttpNegotiate,
-                    (void**)&This->http_negotiate);
-            if(FAILED(hres) && This->serv_prov)
-                IServiceProvider_QueryService(This->serv_prov, &IID_IHttpNegotiate,
-                        &IID_IHttpNegotiate, (void**)&This->http_negotiate);
-        }
-
         return IBindStatusCallback_QueryInterface(STATUSCLB(This), riid, ppv);
     }
 
     if(IsEqualGUID(&IID_IHttpNegotiate2, guidService)) {
         TRACE("(%p)->(IID_IHttpNegotiate2 %s %p)\n", This, debugstr_guid(riid), ppv);
-
-        if(!This->init_http_negotiate2) {
-            This->init_http_negotiate2 = TRUE;
-            hres = IBindStatusCallback_QueryInterface(This->callback, &IID_IHttpNegotiate2,
-                    (void**)&This->http_negotiate2);
-            if(FAILED(hres) && This->serv_prov)
-                IServiceProvider_QueryService(This->serv_prov, &IID_IHttpNegotiate2,
-                        &IID_IHttpNegotiate2, (void**)&This->http_negotiate2);
-        }
-
         return IBindStatusCallback_QueryInterface(STATUSCLB(This), riid, ppv);
     }
 
     if(IsEqualGUID(&IID_IAuthenticate, guidService)) {
         TRACE("(%p)->(IID_IAuthenticate %s %p)\n", This, debugstr_guid(riid), ppv);
-
-        if(!This->init_authenticate) {
-            This->init_authenticate = TRUE;
-            hres = IBindStatusCallback_QueryInterface(This->callback, &IID_IAuthenticate,
-                    (void**)&This->authenticate);
-            if(FAILED(hres) && This->serv_prov)
-                IServiceProvider_QueryService(This->serv_prov, &IID_IAuthenticate,
-                        &IID_IAuthenticate, (void**)&This->authenticate);
-        }
-
         return IBindStatusCallback_QueryInterface(STATUSCLB(This), riid, ppv);
     }
 
@@ -342,17 +311,22 @@ static HRESULT WINAPI BSCHttpNegotiate_BeginningTransaction(IHttpNegotiate2 *ifa
         LPCWSTR szURL, LPCWSTR szHeaders, DWORD dwReserved, LPWSTR *pszAdditionalHeaders)
 {
     BindStatusCallback *This = HTTPNEG2_THIS(iface);
+    IHttpNegotiate *http_negotiate;
+    HRESULT hres = S_OK;
 
     TRACE("(%p)->(%s %s %d %p)\n", This, debugstr_w(szURL), debugstr_w(szHeaders), dwReserved,
           pszAdditionalHeaders);
 
     *pszAdditionalHeaders = NULL;
 
-    if(!This->http_negotiate)
-        return S_OK;
+    http_negotiate = get_callback_iface(This, &IID_IHttpNegotiate);
+    if(http_negotiate) {
+        hres = IHttpNegotiate_BeginningTransaction(http_negotiate, szURL, szHeaders,
+                dwReserved, pszAdditionalHeaders);
+        IHttpNegotiate_Release(http_negotiate);
+    }
 
-    return IHttpNegotiate_BeginningTransaction(This->http_negotiate, szURL, szHeaders,
-                                               dwReserved, pszAdditionalHeaders);
+    return hres;
 }
 
 static HRESULT WINAPI BSCHttpNegotiate_OnResponse(IHttpNegotiate2 *iface, DWORD dwResponseCode,
@@ -361,14 +335,18 @@ static HRESULT WINAPI BSCHttpNegotiate_OnResponse(IHttpNegotiate2 *iface, DWORD
 {
     BindStatusCallback *This = HTTPNEG2_THIS(iface);
     LPWSTR additional_headers = NULL;
+    IHttpNegotiate *http_negotiate;
     HRESULT hres = S_OK;
 
     TRACE("(%p)->(%d %s %s %p)\n", This, dwResponseCode, debugstr_w(szResponseHeaders),
           debugstr_w(szRequestHeaders), pszAdditionalRequestHeaders);
 
-    if(This->http_negotiate)
-        hres = IHttpNegotiate_OnResponse(This->http_negotiate, dwResponseCode, szResponseHeaders,
-                                         szRequestHeaders, &additional_headers);
+    http_negotiate = get_callback_iface(This, &IID_IHttpNegotiate);
+    if(http_negotiate) {
+        hres = IHttpNegotiate_OnResponse(http_negotiate, dwResponseCode, szResponseHeaders,
+                szRequestHeaders, &additional_headers);
+        IHttpNegotiate_Release(http_negotiate);
+    }
 
     if(pszAdditionalRequestHeaders)
         *pszAdditionalRequestHeaders = additional_headers;
@@ -382,14 +360,19 @@ static HRESULT WINAPI BSCHttpNegotiate_GetRootSecurityId(IHttpNegotiate2 *iface,
         BYTE *pbSecurityId, DWORD *pcbSecurityId, DWORD_PTR dwReserved)
 {
     BindStatusCallback *This = HTTPNEG2_THIS(iface);
+    IHttpNegotiate2 *http_negotiate2;
+    HRESULT hres = E_FAIL;
 
     TRACE("(%p)->(%p %p %ld)\n", This, pbSecurityId, pcbSecurityId, dwReserved);
 
-    if(!This->http_negotiate2)
-        return E_NOTIMPL;
+    http_negotiate2 = get_callback_iface(This, &IID_IHttpNegotiate2);
+    if(http_negotiate2) {
+        hres = IHttpNegotiate2_GetRootSecurityId(http_negotiate2, pbSecurityId,
+                pcbSecurityId, dwReserved);
+        IHttpNegotiate2_Release(http_negotiate2);
+    }
 
-    return IHttpNegotiate2_GetRootSecurityId(This->http_negotiate2, pbSecurityId,
-                                             pcbSecurityId, dwReserved);
+    return hres;
 }
 
 #undef HTTPNEG2_THIS
diff --git a/dlls/urlmon/tests/url.c b/dlls/urlmon/tests/url.c
index 1dbc0a3..545c461 100644
--- a/dlls/urlmon/tests/url.c
+++ b/dlls/urlmon/tests/url.c
@@ -601,7 +601,6 @@ static HRESULT WINAPI Protocol_Start(IInternetProtocol *iface, LPCWSTR szUrl,
         SET_EXPECT(QueryInterface_IHttpNegotiate);
         hres = IHttpNegotiate_BeginningTransaction(http_negotiate, urls[test_protocol],
                                                    NULL, 0, &additional_headers);
-        todo_wine
         CHECK_CALLED_BROKEN(QueryInterface_IHttpNegotiate);
         CHECK_CALLED(BeginningTransaction);
         IHttpNegotiate_Release(http_negotiate);
@@ -618,7 +617,6 @@ static HRESULT WINAPI Protocol_Start(IInternetProtocol *iface, LPCWSTR szUrl,
         SET_EXPECT(QueryInterface_IHttpNegotiate2);
         SET_EXPECT(GetRootSecurityId);
         hres = IHttpNegotiate2_GetRootSecurityId(http_negotiate2, sec_id, &size, 0);
-        todo_wine
         CHECK_CALLED_BROKEN(QueryInterface_IHttpNegotiate2);
         CHECK_CALLED(GetRootSecurityId);
         IHttpNegotiate2_Release(http_negotiate2);
@@ -773,7 +771,6 @@ static HRESULT WINAPI Protocol_Continue(IInternetProtocol *iface,
         SET_EXPECT(QueryInterface_IHttpNegotiate);
         SET_EXPECT(OnResponse);
         hres = IHttpNegotiate_OnResponse(http_negotiate, 200, header, NULL, NULL);
-        todo_wine
         CHECK_CALLED_BROKEN(QueryInterface_IHttpNegotiate);
         CHECK_CALLED(OnResponse);
         IHttpNegotiate_Release(http_negotiate);
@@ -1951,7 +1948,6 @@ static BOOL test_bscholder(IBindStatusCallback *holder)
     SET_EXPECT(QueryInterface_IHttpNegotiate);
     SET_EXPECT(BeginningTransaction);
     hres = IHttpNegotiate_BeginningTransaction(http_negotiate_serv, urls[test_protocol], emptyW, 0, &wstr);
-    todo_wine
     CHECK_CALLED_BROKEN(QueryInterface_IHttpNegotiate); /* IE8 */
     CHECK_CALLED(BeginningTransaction);
     ok(hres == S_OK, "BeginningTransaction failed: %08x\n", hres);
@@ -1980,7 +1976,6 @@ static BOOL test_bscholder(IBindStatusCallback *holder)
         SET_EXPECT(GetRootSecurityId);
         hres = IHttpNegotiate2_GetRootSecurityId(http_negotiate2, (void*)0xdeadbeef, (void*)0xdeadbeef, 0);
         ok(hres == E_NOTIMPL, "GetRootSecurityId failed: %08x\n", hres);
-        todo_wine
         CHECK_CALLED_BROKEN(QueryInterface_IHttpNegotiate2); /* IE8 */
         CHECK_CALLED(GetRootSecurityId);
 
@@ -2001,7 +1996,6 @@ static BOOL test_bscholder(IBindStatusCallback *holder)
     wstr = (void*)0xdeadbeef;
     hres = IHttpNegotiate_OnResponse(http_negotiate, 200, emptyW, NULL, NULL);
     ok(hres == S_OK, "OnResponse failed: %08x\n", hres);
-    todo_wine
     CHECK_CALLED_BROKEN(QueryInterface_IHttpNegotiate); /* IE8 */
     CHECK_CALLED(OnResponse);
 




More information about the wine-cvs mailing list