Jacek Caban : urlmon: Don' t forward StartEx call to protocol handler in BindProtocol.
Alexandre Julliard
julliard at winehq.org
Mon Nov 15 13:28:54 CST 2010
Module: wine
Branch: master
Commit: 0d4287b2e8343f4cd5d013621588abc0ce819f75
URL: http://source.winehq.org/git/wine.git/?a=commit;h=0d4287b2e8343f4cd5d013621588abc0ce819f75
Author: Jacek Caban <jacek at codeweavers.com>
Date: Mon Nov 15 12:36:20 2010 +0100
urlmon: Don't forward StartEx call to protocol handler in BindProtocol.
---
dlls/urlmon/bindprot.c | 192 +++++++++++++++++++++++-------------------------
1 files changed, 92 insertions(+), 100 deletions(-)
diff --git a/dlls/urlmon/bindprot.c b/dlls/urlmon/bindprot.c
index 956b6a5..cdc6ea4 100644
--- a/dlls/urlmon/bindprot.c
+++ b/dlls/urlmon/bindprot.c
@@ -510,15 +510,101 @@ static HRESULT WINAPI BindProtocol_StartEx(IInternetProtocolEx *iface, IUri *pUr
DWORD grfPI, HANDLE *dwReserved)
{
BindProtocol *This = PROTOCOL_THIS(iface);
+ IInternetProtocol *protocol = NULL;
+ IInternetProtocolEx *protocolex;
+ IInternetPriority *priority;
+ IServiceProvider *service_provider;
+ BOOL urlmon_protocol = FALSE;
+ CLSID clsid = IID_NULL;
+ LPOLESTR clsid_str;
+ HRESULT hres;
TRACE("(%p)->(%p %p %p %08x %p)\n", This, pUri, pOIProtSink, pOIBindInfo, grfPI, dwReserved);
- if(This->protocol_handler != (IInternetProtocol*)PROTOCOLHANDLER(This)) {
- FIXME("This->protocol_handler != PROTOCOLHANDLER(This)\n");
- return E_FAIL;
+ if(!pUri || !pOIProtSink || !pOIBindInfo)
+ return E_INVALIDARG;
+
+ This->pi = grfPI;
+
+ IUri_AddRef(pUri);
+ This->uri = pUri;
+
+ hres = IInternetProtocolSink_QueryInterface(pOIProtSink, &IID_IServiceProvider,
+ (void**)&service_provider);
+ if(SUCCEEDED(hres)) {
+ /* FIXME: What's protocol CLSID here? */
+ IServiceProvider_QueryService(service_provider, &IID_IInternetProtocol,
+ &IID_IInternetProtocol, (void**)&protocol);
+ IServiceProvider_Release(service_provider);
}
- return IInternetProtocolEx_StartEx(PROTOCOLHANDLER(This), pUri, pOIProtSink, pOIBindInfo, grfPI, dwReserved);
+ if(!protocol) {
+ IClassFactory *cf;
+ IUnknown *unk;
+ BSTR raw_uri;
+
+ /* FIXME: Avoid GetRawUri here */
+ hres = IUri_GetRawUri(pUri, &raw_uri);
+ if(FAILED(hres))
+ return hres;
+
+ hres = get_protocol_handler(raw_uri, &clsid, &urlmon_protocol, &cf);
+ SysFreeString(raw_uri);
+ if(FAILED(hres))
+ return hres;
+
+ if(This->from_urlmon) {
+ hres = IClassFactory_CreateInstance(cf, NULL, &IID_IInternetProtocol, (void**)&protocol);
+ IClassFactory_Release(cf);
+ if(FAILED(hres))
+ return hres;
+ }else {
+ hres = IClassFactory_CreateInstance(cf, (IUnknown*)BINDINFO(This),
+ &IID_IUnknown, (void**)&unk);
+ IClassFactory_Release(cf);
+ if(FAILED(hres))
+ return hres;
+
+ hres = IUnknown_QueryInterface(unk, &IID_IInternetProtocol, (void**)&protocol);
+ IUnknown_Release(unk);
+ if(FAILED(hres))
+ return hres;
+ }
+ }
+
+ StringFromCLSID(&clsid, &clsid_str);
+ IInternetProtocolSink_ReportProgress(pOIProtSink, BINDSTATUS_PROTOCOLCLASSID, clsid_str);
+ CoTaskMemFree(clsid_str);
+
+ This->protocol = protocol;
+
+ if(urlmon_protocol)
+ IInternetProtocol_QueryInterface(protocol, &IID_IWinInetInfo, (void**)&This->wininet_info);
+
+ set_binding_sink((IInternetProtocol*)PROTOCOLEX(This), pOIProtSink, pOIBindInfo);
+
+ hres = IInternetProtocol_QueryInterface(protocol, &IID_IInternetPriority, (void**)&priority);
+ if(SUCCEEDED(hres)) {
+ IInternetPriority_SetPriority(priority, This->priority);
+ IInternetPriority_Release(priority);
+ }
+
+ hres = IInternetProtocol_QueryInterface(protocol, &IID_IInternetProtocolEx, (void**)&protocolex);
+ if(SUCCEEDED(hres)) {
+ hres = IInternetProtocolEx_StartEx(protocolex, pUri, PROTSINK(This), BINDINFO(This), 0, NULL);
+ IInternetProtocolEx_Release(protocolex);
+ }else {
+ BSTR display_uri;
+
+ hres = IUri_GetDisplayUri(pUri, &display_uri);
+ if(FAILED(hres))
+ return hres;
+
+ hres = IInternetProtocol_Start(protocol, display_uri, PROTSINK(This), BINDINFO(This), 0, 0);
+ SysFreeString(display_uri);
+ }
+
+ return hres;
}
void set_binding_sink(IInternetProtocol *bind_protocol, IInternetProtocolSink *sink, IInternetBindInfo *bind_info)
@@ -730,102 +816,8 @@ static HRESULT WINAPI ProtocolHandler_StartEx(IInternetProtocolEx *iface, IUri *
IInternetProtocolSink *pOIProtSink, IInternetBindInfo *pOIBindInfo,
DWORD grfPI, HANDLE *dwReserved)
{
- BindProtocol *This = PROTOCOLHANDLER_THIS(iface);
- IInternetProtocol *protocol = NULL;
- IInternetProtocolEx *protocolex;
- IInternetPriority *priority;
- IServiceProvider *service_provider;
- BOOL urlmon_protocol = FALSE;
- CLSID clsid = IID_NULL;
- LPOLESTR clsid_str;
- HRESULT hres;
-
- TRACE("(%p)->(%p %p %p %08x %p)\n", This, pUri, pOIProtSink, pOIBindInfo, grfPI, dwReserved);
-
- if(!pUri || !pOIProtSink || !pOIBindInfo)
- return E_INVALIDARG;
-
- This->pi = grfPI;
-
- IUri_AddRef(pUri);
- This->uri = pUri;
-
- hres = IInternetProtocolSink_QueryInterface(pOIProtSink, &IID_IServiceProvider,
- (void**)&service_provider);
- if(SUCCEEDED(hres)) {
- /* FIXME: What's protocol CLSID here? */
- IServiceProvider_QueryService(service_provider, &IID_IInternetProtocol,
- &IID_IInternetProtocol, (void**)&protocol);
- IServiceProvider_Release(service_provider);
- }
-
- if(!protocol) {
- IClassFactory *cf;
- IUnknown *unk;
- BSTR raw_uri;
-
- /* FIXME: Avoid GetRawUri here */
- hres = IUri_GetRawUri(pUri, &raw_uri);
- if(FAILED(hres))
- return hres;
-
- hres = get_protocol_handler(raw_uri, &clsid, &urlmon_protocol, &cf);
- SysFreeString(raw_uri);
- if(FAILED(hres))
- return hres;
-
- if(This->from_urlmon) {
- hres = IClassFactory_CreateInstance(cf, NULL, &IID_IInternetProtocol, (void**)&protocol);
- IClassFactory_Release(cf);
- if(FAILED(hres))
- return hres;
- }else {
- hres = IClassFactory_CreateInstance(cf, (IUnknown*)BINDINFO(This),
- &IID_IUnknown, (void**)&unk);
- IClassFactory_Release(cf);
- if(FAILED(hres))
- return hres;
-
- hres = IUnknown_QueryInterface(unk, &IID_IInternetProtocol, (void**)&protocol);
- IUnknown_Release(unk);
- if(FAILED(hres))
- return hres;
- }
- }
-
- StringFromCLSID(&clsid, &clsid_str);
- IInternetProtocolSink_ReportProgress(pOIProtSink, BINDSTATUS_PROTOCOLCLASSID, clsid_str);
- CoTaskMemFree(clsid_str);
-
- This->protocol = protocol;
-
- if(urlmon_protocol)
- IInternetProtocol_QueryInterface(protocol, &IID_IWinInetInfo, (void**)&This->wininet_info);
-
- set_binding_sink((IInternetProtocol*)PROTOCOLEX(This), pOIProtSink, pOIBindInfo);
-
- hres = IInternetProtocol_QueryInterface(protocol, &IID_IInternetPriority, (void**)&priority);
- if(SUCCEEDED(hres)) {
- IInternetPriority_SetPriority(priority, This->priority);
- IInternetPriority_Release(priority);
- }
-
- hres = IInternetProtocol_QueryInterface(protocol, &IID_IInternetProtocolEx, (void**)&protocolex);
- if(SUCCEEDED(hres)) {
- hres = IInternetProtocolEx_StartEx(protocolex, pUri, PROTSINK(This), BINDINFO(This), 0, NULL);
- IInternetProtocolEx_Release(protocolex);
- }else {
- BSTR display_uri;
-
- hres = IUri_GetDisplayUri(pUri, &display_uri);
- if(FAILED(hres))
- return hres;
-
- hres = IInternetProtocol_Start(protocol, display_uri, PROTSINK(This), BINDINFO(This), 0, 0);
- SysFreeString(display_uri);
- }
-
- return hres;
+ ERR("Should not be called\n");
+ return E_NOTIMPL;
}
#undef PROTOCOL_THIS
More information about the wine-cvs
mailing list