ChangeSet ID: 21256 CVSROOT: /opt/cvs-commit Module name: wine Changes by: julliard@winehq.org 2005/11/14 06:28:19
Modified files: dlls/urlmon : urlmon_main.h session.c internet.c
Log message: Jacek Caban jack@itma.pwr.wroc.pl Added get_protocol_iface internal function and use it in get_protocol_info.
Patch: http://cvs.winehq.org/patch.py?id=21256
Old revision New revision Changes Path 1.14 1.15 +2 -0 wine/dlls/urlmon/urlmon_main.h 1.3 1.4 +47 -0 wine/dlls/urlmon/session.c 1.4 1.5 +5 -36 wine/dlls/urlmon/internet.c
Index: wine/dlls/urlmon/urlmon_main.h diff -u -p wine/dlls/urlmon/urlmon_main.h:1.14 wine/dlls/urlmon/urlmon_main.h:1.15 --- wine/dlls/urlmon/urlmon_main.h:1.14 14 Nov 2005 12:28:19 -0000 +++ wine/dlls/urlmon/urlmon_main.h 14 Nov 2005 12:28:19 -0000 @@ -54,4 +54,6 @@ typedef struct HRESULT UMCreateStreamOnCacheFile(LPCWSTR pszURL, DWORD dwSize, LPWSTR pszFileName, HANDLE *phfile, IUMCacheStream **ppstr); void UMCloseCacheFileStream(IUMCacheStream *pstr);
+HRESULT get_protocol_iface(LPCWSTR url, IUnknown **ret); + #endif /* __WINE_URLMON_MAIN_H */ Index: wine/dlls/urlmon/session.c diff -u -p wine/dlls/urlmon/session.c:1.3 wine/dlls/urlmon/session.c:1.4 --- wine/dlls/urlmon/session.c:1.3 14 Nov 2005 12:28:19 -0000 +++ wine/dlls/urlmon/session.c 14 Nov 2005 12:28:19 -0000 @@ -23,6 +23,7 @@ #include "windef.h" #include "winbase.h" #include "winuser.h" +#include "winreg.h" #include "ole2.h" #include "urlmon.h" #include "urlmon_main.h" @@ -31,6 +32,52 @@
WINE_DEFAULT_DEBUG_CHANNEL(urlmon);
+HRESULT get_protocol_iface(LPCWSTR url, IUnknown **ret) +{ + WCHAR schema[64], str_clsid[64]; + HKEY hkey = NULL; + DWORD res, type, size, schema_len; + CLSID clsid; + LPWSTR wszKey; + HRESULT hres; + + static const WCHAR wszProtocolsKey[] = + {'P','R','O','T','O','C','O','L','S','\','H','a','n','d','l','e','r','\'}; + static const WCHAR wszCLSID[] = {'C','L','S','I','D',0}; + + hres = CoInternetParseUrl(url, PARSE_SCHEMA, 0, schema, sizeof(schema)/sizeof(schema[0]), + &schema_len, 0); + if(FAILED(hres) || !schema_len) + return E_FAIL; + + wszKey = HeapAlloc(GetProcessHeap(), 0, sizeof(wszProtocolsKey)+(schema_len+1)*sizeof(WCHAR)); + memcpy(wszKey, wszProtocolsKey, sizeof(wszProtocolsKey)); + memcpy(wszKey + sizeof(wszProtocolsKey)/sizeof(WCHAR), schema, (schema_len+1)*sizeof(WCHAR)); + + res = RegOpenKeyW(HKEY_CLASSES_ROOT, wszKey, &hkey); + HeapFree(GetProcessHeap(), 0, wszKey); + if(res != ERROR_SUCCESS) { + TRACE("Could not open key %s\n", debugstr_w(wszKey)); + return E_FAIL; + } + + size = sizeof(str_clsid); + res = RegQueryValueExW(hkey, wszCLSID, NULL, &type, (LPBYTE)str_clsid, &size); + RegCloseKey(hkey); + if(res != ERROR_SUCCESS || type != REG_SZ) { + WARN("Could not get protocol CLSID res=%ld\n", res); + return E_FAIL; + } + + hres = CLSIDFromString(str_clsid, &clsid); + if(FAILED(hres)) { + WARN("CLSIDFromString failed: %08lx\n", hres); + return hres; + } + + return CoGetClassObject(&clsid, CLSCTX_INPROC_SERVER, NULL, &IID_IUnknown, (void**)ret); +} + static HRESULT WINAPI InternetSession_QueryInterface(IInternetSession *iface, REFIID riid, void **ppv) { Index: wine/dlls/urlmon/internet.c diff -u -p wine/dlls/urlmon/internet.c:1.4 wine/dlls/urlmon/internet.c:1.5 --- wine/dlls/urlmon/internet.c:1.4 14 Nov 2005 12:28:19 -0000 +++ wine/dlls/urlmon/internet.c 14 Nov 2005 12:28:19 -0000 @@ -64,47 +64,16 @@ static HRESULT parse_schema(LPCWSTR url, static IInternetProtocolInfo *get_protocol_info(LPCWSTR url) { IInternetProtocolInfo *ret = NULL; - WCHAR schema[64], str_clsid[64]; - HKEY hkey = NULL; - DWORD res, type, size, schema_len; - CLSID clsid; - LPWSTR wszKey; + IUnknown *unk; HRESULT hres;
- static const WCHAR wszProtocolsKey[] = - {'P','R','O','T','O','C','O','L','S','\','H','a','n','d','l','e','r','\'}; - static const WCHAR wszCLSID[] = {'C','L','S','I','D',0}; - - hres = parse_schema(url, 0, schema, sizeof(schema)/sizeof(schema[0]), &schema_len); - if(FAILED(hres) || !schema_len) - return NULL; - - wszKey = HeapAlloc(GetProcessHeap(), 0, sizeof(wszProtocolsKey)+(schema_len+1)*sizeof(WCHAR)); - memcpy(wszKey, wszProtocolsKey, sizeof(wszProtocolsKey)); - memcpy(wszKey + sizeof(wszProtocolsKey)/sizeof(WCHAR), schema, (schema_len+1)*sizeof(WCHAR)); - - res = RegOpenKeyW(HKEY_CLASSES_ROOT, wszKey, &hkey); - HeapFree(GetProcessHeap(), 0, wszKey); - if(res != ERROR_SUCCESS) { - TRACE("Could not open key %s\n", debugstr_w(wszKey)); - return NULL; - } - - size = sizeof(str_clsid); - res = RegQueryValueExW(hkey, wszCLSID, NULL, &type, (LPBYTE)str_clsid, &size); - RegCloseKey(hkey); - if(res != ERROR_SUCCESS || type != REG_SZ) { - WARN("Could not get protocol CLSID res=%ld\n", res); + hres = get_protocol_iface(url, &unk); + if(FAILED(hres)) return NULL; - }
- hres = CLSIDFromString(str_clsid, &clsid); - if(FAILED(hres)) { - WARN("CLSIDFromString failed: %08lx\n", hres); - return NULL; - } + IUnknown_QueryInterface(unk, &IID_IInternetProtocolInfo, (void**)&ret); + IUnknown_Release(unk);
- CoGetClassObject(&clsid, CLSCTX_INPROC_SERVER, NULL, &IID_IInternetProtocolInfo, (void**)&ret); return ret; }