Jacek Caban : urlmon: Don't store IWinInetInfo reference in BindProtocol.
Alexandre Julliard
julliard at winehq.org
Tue May 8 15:58:58 CDT 2018
Module: wine
Branch: master
Commit: 03183590bfddfa634f97525d95bef1f3a5eec883
URL: https://source.winehq.org/git/wine.git/?a=commit;h=03183590bfddfa634f97525d95bef1f3a5eec883
Author: Jacek Caban <jacek at codeweavers.com>
Date: Tue May 8 18:18:17 2018 +0200
urlmon: Don't store IWinInetInfo reference in BindProtocol.
Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/urlmon/binding.c | 29 ++++++++++++++++++++++++-----
dlls/urlmon/bindprot.c | 11 +----------
dlls/urlmon/session.c | 13 ++-----------
dlls/urlmon/urlmon_main.h | 3 +--
4 files changed, 28 insertions(+), 28 deletions(-)
diff --git a/dlls/urlmon/binding.c b/dlls/urlmon/binding.c
index ea3b81c..051b23f 100644
--- a/dlls/urlmon/binding.c
+++ b/dlls/urlmon/binding.c
@@ -792,13 +792,23 @@ static HRESULT WINAPI Binding_QueryInterface(IBinding *iface, REFIID riid, void
TRACE("(%p)->(IID_IServiceProvider %p)\n", This, ppv);
*ppv = &This->IServiceProvider_iface;
}else if(IsEqualGUID(&IID_IWinInetInfo, riid)) {
+ IWinInetInfo *wininet_info;
+ HRESULT hres;
+
TRACE("(%p)->(IID_IWinInetInfo %p)\n", This, ppv);
/* NOTE: This violidates COM rules, but tests prove that we should do it */
- if(!This->protocol->wininet_info)
+ if(!This->protocol->protocol_unk)
return E_NOINTERFACE;
- *ppv = &This->IWinInetHttpInfo_iface;
+ if(This->protocol->protocol_unk) {
+ hres = IUnknown_QueryInterface(This->protocol->protocol_unk, &IID_IWinInetInfo,
+ (void**)&wininet_info);
+ if(SUCCEEDED(hres)) {
+ IWinInetInfo_Release(wininet_info);
+ *ppv = &This->IWinInetHttpInfo_iface;
+ }
+ }
}else if(IsEqualGUID(&IID_IWinInetHttpInfo, riid)) {
IWinInetHttpInfo *http_info;
HRESULT hres;
@@ -1313,13 +1323,22 @@ static HRESULT WINAPI WinInetHttpInfo_QueryOption(IWinInetHttpInfo *iface, DWORD
void *pBuffer, DWORD *pcbBuffer)
{
Binding *This = impl_from_IWinInetHttpInfo(iface);
+ IWinInetInfo *wininet_info;
+ HRESULT hres;
+
TRACE("(%p)->(%x %p %p)\n", This, dwOption, pBuffer, pcbBuffer);
- if(!This->protocol->wininet_info)
+ if(!This->protocol->protocol_unk)
return E_FAIL;
- return IWinInetInfo_QueryOption(This->protocol->wininet_info,
- dwOption, pBuffer, pcbBuffer);
+ hres = IUnknown_QueryInterface(This->protocol->protocol_unk, &IID_IWinInetHttpInfo,
+ (void**)&wininet_info);
+ if(FAILED(hres))
+ return E_FAIL;
+
+ hres = IWinInetInfo_QueryOption(wininet_info, dwOption, pBuffer, pcbBuffer);
+ IWinInetInfo_Release(wininet_info);
+ return hres;
}
static HRESULT WINAPI WinInetHttpInfo_QueryInfo(IWinInetHttpInfo *iface, DWORD dwOption,
diff --git a/dlls/urlmon/bindprot.c b/dlls/urlmon/bindprot.c
index eeab3d5..4b8069f 100644
--- a/dlls/urlmon/bindprot.c
+++ b/dlls/urlmon/bindprot.c
@@ -330,10 +330,6 @@ static ULONG WINAPI BindProtocol_AddRef(IInternetProtocolEx *iface)
static void release_protocol_handler(BindProtocol *This)
{
- if(This->wininet_info) {
- IWinInetInfo_Release(This->wininet_info);
- This->wininet_info = NULL;
- }
if(This->protocol_unk) {
IUnknown_Release(This->protocol_unk);
This->protocol_unk = NULL;
@@ -497,7 +493,6 @@ static HRESULT WINAPI BindProtocol_StartEx(IInternetProtocolEx *iface, IUri *pUr
IInternetProtocolEx *protocolex;
IInternetPriority *priority;
IServiceProvider *service_provider;
- BOOL urlmon_protocol = FALSE;
CLSID clsid = IID_NULL;
IUnknown *protocol_unk = NULL;
LPOLESTR clsid_str;
@@ -529,7 +524,7 @@ static HRESULT WINAPI BindProtocol_StartEx(IInternetProtocolEx *iface, IUri *pUr
if(!protocol) {
IClassFactory *cf;
- hres = get_protocol_handler(pUri, &clsid, &urlmon_protocol, &cf);
+ hres = get_protocol_handler(pUri, &clsid, &cf);
if(FAILED(hres))
return hres;
@@ -562,10 +557,6 @@ static HRESULT WINAPI BindProtocol_StartEx(IInternetProtocolEx *iface, IUri *pUr
This->protocol_unk = protocol_unk;
This->protocol = protocol;
- if(urlmon_protocol) {
- IInternetProtocol_QueryInterface(protocol, &IID_IWinInetInfo, (void**)&This->wininet_info);
- }
-
set_binding_sink(This, pOIProtSink, pOIBindInfo);
hres = IInternetProtocol_QueryInterface(protocol, &IID_IInternetPriority, (void**)&priority);
diff --git a/dlls/urlmon/session.c b/dlls/urlmon/session.c
index 1df483f..e053f8b 100644
--- a/dlls/urlmon/session.c
+++ b/dlls/urlmon/session.c
@@ -219,7 +219,7 @@ IInternetProtocolInfo *get_protocol_info(LPCWSTR url)
return ret;
}
-HRESULT get_protocol_handler(IUri *uri, CLSID *clsid, BOOL *urlmon_protocol, IClassFactory **ret)
+HRESULT get_protocol_handler(IUri *uri, CLSID *clsid, IClassFactory **ret)
{
name_space *ns;
BSTR scheme;
@@ -240,20 +240,11 @@ HRESULT get_protocol_handler(IUri *uri, CLSID *clsid, BOOL *urlmon_protocol, ICl
IClassFactory_AddRef(*ret);
if(clsid)
*clsid = ns->clsid;
- if(urlmon_protocol)
- *urlmon_protocol = ns->urlmon;
}
LeaveCriticalSection(&session_cs);
- if(*ret) {
- hres = S_OK;
- }else {
- if(urlmon_protocol)
- *urlmon_protocol = FALSE;
- hres = get_protocol_cf(scheme, SysStringLen(scheme), clsid, ret);
- }
-
+ hres = *ret ? S_OK : get_protocol_cf(scheme, SysStringLen(scheme), clsid, ret);
SysFreeString(scheme);
return hres;
}
diff --git a/dlls/urlmon/urlmon_main.h b/dlls/urlmon/urlmon_main.h
index b708921..1d6faaa 100644
--- a/dlls/urlmon/urlmon_main.h
+++ b/dlls/urlmon/urlmon_main.h
@@ -66,7 +66,7 @@ static inline void URLMON_UnlockModule(void) { InterlockedDecrement( &URLMON_ref
extern HINSTANCE urlmon_instance;
IInternetProtocolInfo *get_protocol_info(LPCWSTR) DECLSPEC_HIDDEN;
-HRESULT get_protocol_handler(IUri*,CLSID*,BOOL*,IClassFactory**) DECLSPEC_HIDDEN;
+HRESULT get_protocol_handler(IUri*,CLSID*,IClassFactory**) DECLSPEC_HIDDEN;
IInternetProtocol *get_mime_filter(LPCWSTR) DECLSPEC_HIDDEN;
BOOL is_registered_protocol(LPCWSTR) DECLSPEC_HIDDEN;
HRESULT register_namespace(IClassFactory*,REFIID,LPCWSTR,BOOL) DECLSPEC_HIDDEN;
@@ -178,7 +178,6 @@ typedef struct {
IUnknown *protocol_unk;
IInternetProtocol *protocol;
- IWinInetInfo *wininet_info;
IInternetBindInfo *bind_info;
IInternetProtocolSink *protocol_sink;
More information about the wine-cvs
mailing list