Module: wine Branch: master Commit: 87de64227a4e6822d5f519851502db1cbb3c37c0 URL: http://source.winehq.org/git/wine.git/?a=commit;h=87de64227a4e6822d5f5198515...
Author: Jacek Caban jacek@codeweavers.com Date: Tue Jan 23 19:35:35 2007 +0100
urlmon: Return CLSID from get_protocol_handler.
---
dlls/urlmon/binding.c | 2 +- dlls/urlmon/session.c | 37 ++++++++++++++++++++++--------------- dlls/urlmon/urlmon_main.h | 2 +- 3 files changed, 24 insertions(+), 17 deletions(-)
diff --git a/dlls/urlmon/binding.c b/dlls/urlmon/binding.c index 3da3a5b..edf3bd2 100644 --- a/dlls/urlmon/binding.c +++ b/dlls/urlmon/binding.c @@ -1079,7 +1079,7 @@ static HRESULT get_protocol(Binding *Thi return S_OK; }
- hres = get_protocol_handler(url, &cf); + hres = get_protocol_handler(url, NULL, &cf); if(FAILED(hres)) return hres;
diff --git a/dlls/urlmon/session.c b/dlls/urlmon/session.c index a9eb292..670b0f5 100644 --- a/dlls/urlmon/session.c +++ b/dlls/urlmon/session.c @@ -36,25 +36,26 @@ WINE_DEFAULT_DEBUG_CHANNEL(urlmon); typedef struct name_space { LPWSTR protocol; IClassFactory *cf; + CLSID clsid;
struct name_space *next; } name_space;
static name_space *name_space_list = NULL;
-static IClassFactory *find_name_space(LPCWSTR protocol) +static name_space *find_name_space(LPCWSTR protocol) { name_space *iter;
for(iter = name_space_list; iter; iter = iter->next) { if(!strcmpW(iter->protocol, protocol)) - return iter->cf; + return iter; }
return NULL; }
-static HRESULT get_protocol_iface(LPCWSTR schema, DWORD schema_len, IUnknown **ret) +static HRESULT get_protocol_iface(LPCWSTR schema, DWORD schema_len, CLSID *pclsid, IUnknown **ret) { WCHAR str_clsid[64]; HKEY hkey = NULL; @@ -92,13 +93,16 @@ static HRESULT get_protocol_iface(LPCWST return hres; }
+ if(pclsid) + *pclsid = clsid; + return CoGetClassObject(&clsid, CLSCTX_INPROC_SERVER, NULL, &IID_IUnknown, (void**)ret); }
IInternetProtocolInfo *get_protocol_info(LPCWSTR url) { IInternetProtocolInfo *ret = NULL; - IClassFactory *cf; + name_space *ns; IUnknown *unk; WCHAR schema[64]; DWORD schema_len; @@ -109,18 +113,18 @@ IInternetProtocolInfo *get_protocol_info if(FAILED(hres) || !schema_len) return NULL;
- cf = find_name_space(schema); - if(cf) { - hres = IClassFactory_QueryInterface(cf, &IID_IInternetProtocolInfo, (void**)&ret); + ns = find_name_space(schema); + if(ns) { + hres = IClassFactory_QueryInterface(ns->cf, &IID_IInternetProtocolInfo, (void**)&ret); if(SUCCEEDED(hres)) return ret;
- hres = IClassFactory_CreateInstance(cf, NULL, &IID_IInternetProtocolInfo, (void**)&ret); + hres = IClassFactory_CreateInstance(ns->cf, NULL, &IID_IInternetProtocolInfo, (void**)&ret); if(SUCCEEDED(hres)) return ret; }
- hres = get_protocol_iface(schema, schema_len, &unk); + hres = get_protocol_iface(schema, schema_len, NULL, &unk); if(FAILED(hres)) return NULL;
@@ -130,10 +134,10 @@ IInternetProtocolInfo *get_protocol_info return ret; }
-HRESULT get_protocol_handler(LPCWSTR url, IClassFactory **ret) +HRESULT get_protocol_handler(LPCWSTR url, CLSID *clsid, IClassFactory **ret) { - IClassFactory *cf; IUnknown *unk; + name_space *ns; WCHAR schema[64]; DWORD schema_len; HRESULT hres; @@ -143,13 +147,15 @@ HRESULT get_protocol_handler(LPCWSTR url if(FAILED(hres) || !schema_len) return schema_len ? hres : E_FAIL;
- cf = find_name_space(schema); - if(cf) { - *ret = cf; + ns = find_name_space(schema); + if(ns) { + *ret = ns->cf; + if(clsid) + *clsid = ns->clsid; return S_OK; }
- hres = get_protocol_iface(schema, schema_len, &unk); + hres = get_protocol_iface(schema, schema_len, clsid, &unk); if(FAILED(hres)) return hres;
@@ -213,6 +219,7 @@ static HRESULT WINAPI InternetSession_Re
IClassFactory_AddRef(pCF); new_name_space->cf = pCF; + new_name_space->clsid = *rclsid;
new_name_space->next = name_space_list; name_space_list = new_name_space; diff --git a/dlls/urlmon/urlmon_main.h b/dlls/urlmon/urlmon_main.h index bc48062..46ec671 100644 --- a/dlls/urlmon/urlmon_main.h +++ b/dlls/urlmon/urlmon_main.h @@ -56,7 +56,7 @@ HRESULT UMCreateStreamOnCacheFile(LPCWST void UMCloseCacheFileStream(IUMCacheStream *pstr);
IInternetProtocolInfo *get_protocol_info(LPCWSTR url); -HRESULT get_protocol_handler(LPCWSTR url, IClassFactory **ret); +HRESULT get_protocol_handler(LPCWSTR url, CLSID *clsid, IClassFactory **ret);
HRESULT start_binding(LPCWSTR url, IBindCtx *pbc, REFIID riid, void **ppv);