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