Jacek Caban : urlmon: Support BINDINFO_OPTIONS_DISABLEAUTOREDIRECTS in BindProtocol object.

Alexandre Julliard julliard at winehq.org
Tue Jun 6 15:23:35 CDT 2017


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Tue Jun  6 17:15:55 2017 +0200

urlmon: Support BINDINFO_OPTIONS_DISABLEAUTOREDIRECTS in BindProtocol object.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/urlmon/bindprot.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 46 insertions(+)

diff --git a/dlls/urlmon/bindprot.c b/dlls/urlmon/bindprot.c
index 1e9dd5c..1493023 100644
--- a/dlls/urlmon/bindprot.c
+++ b/dlls/urlmon/bindprot.c
@@ -732,6 +732,11 @@ static HRESULT WINAPI ProtocolHandler_Terminate(IInternetProtocol *iface, DWORD
         This->bind_info = NULL;
     }
 
+    if(This->redirect_callback) {
+        IBindCallbackRedirect_Release(This->redirect_callback);
+        This->redirect_callback = NULL;
+    }
+
     IInternetProtocolEx_Release(&This->IInternetProtocolEx_iface);
     return S_OK;
 }
@@ -994,6 +999,29 @@ static HRESULT WINAPI ProtocolSinkHandler_ReportData(IInternetProtocolSink *ifac
     return IInternetProtocolSink_ReportData(This->protocol_sink, bscf, progress, progress_max);
 }
 
+static HRESULT handle_redirect(BindProtocol *This, const WCHAR *url)
+{
+    HRESULT hres;
+
+    if(This->redirect_callback) {
+        VARIANT_BOOL cancel = VARIANT_FALSE;
+        IBindCallbackRedirect_Redirect(This->redirect_callback, url, &cancel);
+        if(cancel)
+            return INET_E_REDIRECT_FAILED;
+    }
+
+    if(This->protocol_sink) {
+        hres = IInternetProtocolSink_ReportProgress(This->protocol_sink, BINDSTATUS_REDIRECTING, url);
+        if(FAILED(hres))
+            return hres;
+    }
+
+    IInternetProtocol_Terminate(This->protocol, 0); /* should this be done in StartEx? */
+    release_protocol_handler(This);
+
+    return IInternetProtocolEx_Start(&This->IInternetProtocolEx_iface, url, This->protocol_sink, This->bind_info, This->pi, 0);
+}
+
 static HRESULT WINAPI ProtocolSinkHandler_ReportResult(IInternetProtocolSink *iface,
         HRESULT hrResult, DWORD dwError, LPCWSTR szResult)
 {
@@ -1001,6 +1029,13 @@ static HRESULT WINAPI ProtocolSinkHandler_ReportResult(IInternetProtocolSink *if
 
     TRACE("(%p)->(%08x %d %s)\n", This, hrResult, dwError, debugstr_w(szResult));
 
+    if(hrResult == INET_E_REDIRECT_FAILED) {
+        hrResult = handle_redirect(This, szResult);
+        if(hrResult == S_OK)
+            return S_OK;
+        szResult = NULL;
+    }
+
     if(This->protocol_sink)
         return IInternetProtocolSink_ReportResult(This->protocol_sink, hrResult, dwError, szResult);
     return S_OK;
@@ -1054,6 +1089,17 @@ static HRESULT WINAPI BindInfo_GetBindInfo(IInternetBindInfo *iface,
         return hres;
     }
 
+    if((pbindinfo->dwOptions & BINDINFO_OPTIONS_DISABLEAUTOREDIRECTS) && !This->redirect_callback) {
+        IServiceProvider *service_provider;
+
+        hres = IInternetProtocolSink_QueryInterface(This->protocol_sink, &IID_IServiceProvider, (void**)&service_provider);
+        if(SUCCEEDED(hres)) {
+            hres = IServiceProvider_QueryService(service_provider, &IID_IBindCallbackRedirect, &IID_IBindCallbackRedirect,
+                                                 (void**)&This->redirect_callback);
+            IServiceProvider_Release(service_provider);
+        }
+    }
+
     *grfBINDF |= BINDF_FROMURLMON;
     return hres;
 }




More information about the wine-cvs mailing list