URLMON: Added get_protocol_iface internal function
Jacek Caban
jack at itma.pwr.wroc.pl
Sun Nov 13 10:31:12 CST 2005
We'll need this func in BindToStorage (I'll send the patch after the
patches I've
sent will be applied). This func has to be in session.c to allow us to
implement
RegisterNameSpace.
Changelog:
Added get_protocol_iface internal function and use it in
get_protocol_info.
-------------- next part --------------
Index: dlls/urlmon/session.c
===================================================================
RCS file: /home/wine/wine/dlls/urlmon/session.c,v
retrieving revision 1.3
diff -u -p -r1.3 session.c
--- dlls/urlmon/session.c 19 Sep 2005 14:29:16 -0000 1.3
+++ dlls/urlmon/session.c 13 Nov 2005 16:25:58 -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: dlls/urlmon/urlmon_main.h
===================================================================
RCS file: /home/wine/wine/dlls/urlmon/urlmon_main.h,v
retrieving revision 1.14
diff -u -p -r1.14 urlmon_main.h
--- dlls/urlmon/urlmon_main.h 14 Sep 2005 15:38:26 -0000 1.14
+++ dlls/urlmon/urlmon_main.h 13 Nov 2005 16:25:58 -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: dlls/urlmon/internet.c
===================================================================
RCS file: /home/wine/wine/dlls/urlmon/internet.c,v
retrieving revision 1.4
diff -u -p -r1.4 internet.c
--- dlls/urlmon/internet.c 13 Sep 2005 14:30:15 -0000 1.4
+++ dlls/urlmon/internet.c 13 Nov 2005 16:25:58 -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;
}
More information about the wine-patches
mailing list