Jacek Caban : urlmon: Use registered protocols.
Alexandre Julliard
julliard at wine.codeweavers.com
Thu May 25 04:15:58 CDT 2006
Module: wine
Branch: refs/heads/master
Commit: 9c9838d9e8d95986d181fc4a8dbdbe16cd254a24
URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=9c9838d9e8d95986d181fc4a8dbdbe16cd254a24
Author: Jacek Caban <jacek at codeweavers.com>
Date: Wed May 24 18:00:08 2006 +0200
urlmon: Use registered protocols.
---
dlls/urlmon/binding.c | 2 +
dlls/urlmon/internet.c | 16 ---------
dlls/urlmon/session.c | 82 ++++++++++++++++++++++++++++++++++++++++-----
dlls/urlmon/urlmon_main.h | 3 +-
4 files changed, 76 insertions(+), 27 deletions(-)
diff --git a/dlls/urlmon/binding.c b/dlls/urlmon/binding.c
index e1c63f6..efbd12f 100644
--- a/dlls/urlmon/binding.c
+++ b/dlls/urlmon/binding.c
@@ -789,7 +789,7 @@ static HRESULT get_protocol(Binding *Thi
return S_OK;
}
- hres = get_protocol_iface(url, &unk);
+ hres = get_protocol_handler(url, &unk);
if(FAILED(hres))
return hres;
diff --git a/dlls/urlmon/internet.c b/dlls/urlmon/internet.c
index ef9939e..8ae22e0 100644
--- a/dlls/urlmon/internet.c
+++ b/dlls/urlmon/internet.c
@@ -61,22 +61,6 @@ static HRESULT parse_schema(LPCWSTR url,
return S_OK;
}
-static IInternetProtocolInfo *get_protocol_info(LPCWSTR url)
-{
- IInternetProtocolInfo *ret = NULL;
- IUnknown *unk;
- HRESULT hres;
-
- hres = get_protocol_iface(url, &unk);
- if(FAILED(hres))
- return NULL;
-
- IUnknown_QueryInterface(unk, &IID_IInternetProtocolInfo, (void**)&ret);
- IUnknown_Release(unk);
-
- return ret;
-}
-
static HRESULT parse_security_url(LPCWSTR url, DWORD flags, LPWSTR result, DWORD size, DWORD *rsize)
{
IInternetProtocolInfo *protocol_info;
diff --git a/dlls/urlmon/session.c b/dlls/urlmon/session.c
index 4a1a9b3..deb7146 100644
--- a/dlls/urlmon/session.c
+++ b/dlls/urlmon/session.c
@@ -1,5 +1,5 @@
/*
- * Copyright 2005 Jacek Caban
+ * Copyright 2005-2006 Jacek Caban for CodeWeavers
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -42,11 +42,23 @@ typedef struct name_space {
static name_space *name_space_list = NULL;
-HRESULT get_protocol_iface(LPCWSTR url, IUnknown **ret)
+static IClassFactory *find_name_space(LPCWSTR protocol)
{
- WCHAR schema[64], str_clsid[64];
+ name_space *iter;
+
+ for(iter = name_space_list; iter; iter = iter->next) {
+ if(!strcmpW(iter->protocol, protocol))
+ return iter->cf;
+ }
+
+ return NULL;
+}
+
+static HRESULT get_protocol_iface(LPCWSTR schema, DWORD schema_len, IUnknown **ret)
+{
+ WCHAR str_clsid[64];
HKEY hkey = NULL;
- DWORD res, type, size, schema_len;
+ DWORD res, type, size;
CLSID clsid;
LPWSTR wszKey;
HRESULT hres;
@@ -55,11 +67,6 @@ HRESULT get_protocol_iface(LPCWSTR url,
{'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));
@@ -88,6 +95,63 @@ HRESULT get_protocol_iface(LPCWSTR url,
return CoGetClassObject(&clsid, CLSCTX_INPROC_SERVER, NULL, &IID_IUnknown, (void**)ret);
}
+IInternetProtocolInfo *get_protocol_info(LPCWSTR url)
+{
+ IInternetProtocolInfo *ret = NULL;
+ IClassFactory *cf;
+ IUnknown *unk;
+ WCHAR schema[64];
+ DWORD schema_len;
+ HRESULT hres;
+
+ hres = CoInternetParseUrl(url, PARSE_SCHEMA, 0, schema, sizeof(schema)/sizeof(schema[0]),
+ &schema_len, 0);
+ if(FAILED(hres) || !schema_len)
+ return NULL;
+
+ cf = find_name_space(schema);
+ if(cf) {
+ hres = IClassFactory_QueryInterface(cf, &IID_IInternetProtocolInfo, (void**)&ret);
+ if(SUCCEEDED(hres))
+ return ret;
+
+ hres = IClassFactory_CreateInstance(cf, NULL, &IID_IInternetProtocolInfo, (void**)&ret);
+ if(SUCCEEDED(hres))
+ return ret;
+ }
+
+ hres = get_protocol_iface(schema, schema_len, &unk);
+ if(FAILED(hres))
+ return NULL;
+
+ hres = IUnknown_QueryInterface(unk, &IID_IInternetProtocolInfo, (void**)&ret);
+ IUnknown_Release(unk);
+
+ return ret;
+}
+
+HRESULT get_protocol_handler(LPCWSTR url, IUnknown **ret)
+{
+ IClassFactory *cf;
+ WCHAR schema[64];
+ DWORD schema_len;
+ HRESULT hres;
+
+ hres = CoInternetParseUrl(url, PARSE_SCHEMA, 0, schema, sizeof(schema)/sizeof(schema[0]),
+ &schema_len, 0);
+ if(FAILED(hres) || !schema_len)
+ return schema_len ? hres : E_FAIL;
+
+ cf = find_name_space(schema);
+ if(cf) {
+ hres = IClassFactory_CreateInstance(cf, NULL, &IID_IUnknown, (void**)ret);
+ if(SUCCEEDED(hres))
+ return hres;
+ }
+
+ return get_protocol_iface(schema, schema_len, ret);
+}
+
static HRESULT WINAPI InternetSession_QueryInterface(IInternetSession *iface,
REFIID riid, void **ppv)
{
diff --git a/dlls/urlmon/urlmon_main.h b/dlls/urlmon/urlmon_main.h
index c67b52a..0eb7db6 100644
--- a/dlls/urlmon/urlmon_main.h
+++ b/dlls/urlmon/urlmon_main.h
@@ -54,7 +54,8 @@ 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);
+IInternetProtocolInfo *get_protocol_info(LPCWSTR url);
+HRESULT get_protocol_handler(LPCWSTR url, IUnknown **ret);
HRESULT start_binding(LPCWSTR url, IBindCtx *pbc, REFIID riid, void **ppv);
More information about the wine-cvs
mailing list