Module: wine Branch: master Commit: fcc1dd01f759e5862ac7beafeda6c0759e2e802f URL: http://source.winehq.org/git/wine.git/?a=commit;h=fcc1dd01f759e5862ac7beafed...
Author: Jacek Caban jacek@codeweavers.com Date: Mon Nov 15 12:37:35 2010 +0100
urlmon: Make get_protocol_handler IUri-based.
---
dlls/urlmon/bindprot.c | 9 +-------- dlls/urlmon/session.c | 29 ++++++++++++++++------------- dlls/urlmon/urlmon_main.h | 2 +- 3 files changed, 18 insertions(+), 22 deletions(-)
diff --git a/dlls/urlmon/bindprot.c b/dlls/urlmon/bindprot.c index 4acef40..68e1dec 100644 --- a/dlls/urlmon/bindprot.c +++ b/dlls/urlmon/bindprot.c @@ -541,15 +541,8 @@ static HRESULT WINAPI BindProtocol_StartEx(IInternetProtocolEx *iface, IUri *pUr 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); + hres = get_protocol_handler(pUri, &clsid, &urlmon_protocol, &cf); if(FAILED(hres)) return hres;
diff --git a/dlls/urlmon/session.c b/dlls/urlmon/session.c index 4c9281a..72a3e2a 100644 --- a/dlls/urlmon/session.c +++ b/dlls/urlmon/session.c @@ -236,23 +236,22 @@ IInternetProtocolInfo *get_protocol_info(LPCWSTR url) return ret; }
-HRESULT get_protocol_handler(LPCWSTR url, CLSID *clsid, BOOL *urlmon_protocol, IClassFactory **ret) +HRESULT get_protocol_handler(IUri *uri, CLSID *clsid, BOOL *urlmon_protocol, IClassFactory **ret) { name_space *ns; - WCHAR schema[64]; - DWORD schema_len; + BSTR scheme; HRESULT hres;
*ret = NULL;
- hres = CoInternetParseUrl(url, PARSE_SCHEMA, 0, schema, sizeof(schema)/sizeof(schema[0]), - &schema_len, 0); - if(FAILED(hres) || !schema_len) - return schema_len ? hres : MK_E_SYNTAX; + /* FIXME: Avoid GetSchemeName call for known schemes */ + hres = IUri_GetSchemeName(uri, &scheme); + if(FAILED(hres)) + return hres;
EnterCriticalSection(&session_cs);
- ns = find_name_space(schema); + ns = find_name_space(scheme); if(ns) { *ret = ns->cf; IClassFactory_AddRef(*ret); @@ -264,12 +263,16 @@ HRESULT get_protocol_handler(LPCWSTR url, CLSID *clsid, BOOL *urlmon_protocol, I
LeaveCriticalSection(&session_cs);
- if(*ret) - return S_OK; + if(*ret) { + hres = S_OK; + }else { + if(urlmon_protocol) + *urlmon_protocol = FALSE; + hres = get_protocol_cf(scheme, SysStringLen(scheme), clsid, ret); + }
- if(urlmon_protocol) - *urlmon_protocol = FALSE; - return get_protocol_cf(schema, schema_len, clsid, ret); + SysFreeString(scheme); + return hres; }
IInternetProtocol *get_mime_filter(LPCWSTR mime) diff --git a/dlls/urlmon/urlmon_main.h b/dlls/urlmon/urlmon_main.h index 239182e..2d719cb 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 #define DEFINE_THIS(cls,ifc,iface) DEFINE_THIS2(cls,lp ## ifc ## Vtbl,iface)
IInternetProtocolInfo *get_protocol_info(LPCWSTR); -HRESULT get_protocol_handler(LPCWSTR,CLSID*,BOOL*,IClassFactory**); +HRESULT get_protocol_handler(IUri*,CLSID*,BOOL*,IClassFactory**); IInternetProtocol *get_mime_filter(LPCWSTR); BOOL is_registered_protocol(LPCWSTR); void register_urlmon_namespace(IClassFactory*,REFIID,LPCWSTR,BOOL);