Jacek Caban : urlmon: Return CLSID from get_protocol_handler.

Alexandre Julliard julliard at wine.codeweavers.com
Wed Jan 24 06:18:18 CST 2007


Module: wine
Branch: master
Commit: 87de64227a4e6822d5f519851502db1cbb3c37c0
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=87de64227a4e6822d5f519851502db1cbb3c37c0

Author: Jacek Caban <jacek at 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);
 




More information about the wine-cvs mailing list