Jacek Caban : urlmon: Optimize registering urlmon protocols.

Alexandre Julliard julliard at winehq.org
Thu Feb 21 07:42:43 CST 2008


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Thu Feb 21 13:07:41 2008 +0100

urlmon: Optimize registering urlmon protocols.

---

 dlls/urlmon/session.c     |   87 ++++++++++++++++++++++++++++-----------------
 dlls/urlmon/urlmon_main.c |   25 ++-----------
 dlls/urlmon/urlmon_main.h |    1 +
 3 files changed, 59 insertions(+), 54 deletions(-)

diff --git a/dlls/urlmon/session.c b/dlls/urlmon/session.c
index 9ce7b66..09cd330 100644
--- a/dlls/urlmon/session.c
+++ b/dlls/urlmon/session.c
@@ -101,6 +101,58 @@ static HRESULT get_protocol_cf(LPCWSTR schema, DWORD schema_len, CLSID *pclsid,
     return CoGetClassObject(&clsid, CLSCTX_INPROC_SERVER, NULL, &IID_IClassFactory, (void**)ret);
 }
 
+static HRESULT register_namespace(IClassFactory *cf, REFIID clsid, LPCWSTR protocol, BOOL urlmon_protocol)
+{
+    name_space *new_name_space;
+
+    new_name_space = heap_alloc(sizeof(name_space));
+
+    if(!urlmon_protocol)
+        IClassFactory_AddRef(cf);
+    new_name_space->cf = cf;
+    new_name_space->clsid = *clsid;
+    new_name_space->protocol = heap_strdupW(protocol);
+
+    new_name_space->next = name_space_list;
+    name_space_list = new_name_space;
+
+    return S_OK;
+}
+
+static HRESULT unregister_namespace(IClassFactory *cf, LPCWSTR protocol, BOOL urlmon_protocol)
+{
+    name_space *iter, *last = NULL;
+
+    for(iter = name_space_list; iter; iter = iter->next) {
+        if(iter->cf == cf && !strcmpW(iter->protocol, protocol))
+            break;
+        last = iter;
+    }
+
+    if(iter) {
+        if(last)
+            last->next = iter->next;
+        else
+            name_space_list = iter->next;
+
+        if(!urlmon_protocol)
+            IClassFactory_Release(iter->cf);
+        heap_free(iter->protocol);
+        heap_free(iter);
+    }
+
+    return S_OK;
+}
+
+
+void register_urlmon_namespace(IClassFactory *cf, REFIID clsid, LPCWSTR protocol, BOOL do_register)
+{
+    if(do_register)
+        register_namespace(cf, clsid, protocol, TRUE);
+    else
+        unregister_namespace(cf, protocol, TRUE);
+}
+
 BOOL is_registered_protocol(LPCWSTR url)
 {
     DWORD schema_len;
@@ -209,8 +261,6 @@ static HRESULT WINAPI InternetSession_RegisterNameSpace(IInternetSession *iface,
         IClassFactory *pCF, REFCLSID rclsid, LPCWSTR pwzProtocol, ULONG cPatterns,
         const LPCWSTR *ppwzPatterns, DWORD dwReserved)
 {
-    name_space *new_name_space;
-
     TRACE("(%p %s %s %d %p %d)\n", pCF, debugstr_guid(rclsid), debugstr_w(pwzProtocol),
           cPatterns, ppwzPatterns, dwReserved);
 
@@ -222,47 +272,18 @@ static HRESULT WINAPI InternetSession_RegisterNameSpace(IInternetSession *iface,
     if(!pCF || !pwzProtocol)
         return E_INVALIDARG;
 
-    new_name_space = heap_alloc(sizeof(name_space));
-
-    IClassFactory_AddRef(pCF);
-    new_name_space->cf = pCF;
-    new_name_space->clsid = *rclsid;
-    new_name_space->protocol = heap_strdupW(pwzProtocol);
-
-    new_name_space->next = name_space_list;
-    name_space_list = new_name_space;
-    return S_OK;
+    return register_namespace(pCF, rclsid, pwzProtocol, FALSE);
 }
 
 static HRESULT WINAPI InternetSession_UnregisterNameSpace(IInternetSession *iface,
         IClassFactory *pCF, LPCWSTR pszProtocol)
 {
-    name_space *iter, *last = NULL;
-
     TRACE("(%p %s)\n", pCF, debugstr_w(pszProtocol));
 
     if(!pCF || !pszProtocol)
         return E_INVALIDARG;
 
-    for(iter = name_space_list; iter; iter = iter->next) {
-        if(iter->cf == pCF && !strcmpW(iter->protocol, pszProtocol))
-            break;
-        last = iter;
-    }
-
-    if(!iter)
-        return S_OK;
-
-    if(last)
-        last->next = iter->next;
-    else
-        name_space_list = iter->next;
-
-    IClassFactory_Release(iter->cf);
-    heap_free(iter->protocol);
-    heap_free(iter);
-
-    return S_OK;
+    return unregister_namespace(pCF, pszProtocol, FALSE);
 }
 
 static HRESULT WINAPI InternetSession_RegisterMimeFilter(IInternetSession *iface,
diff --git a/dlls/urlmon/urlmon_main.c b/dlls/urlmon/urlmon_main.c
index 07a9e89..7d56062 100644
--- a/dlls/urlmon/urlmon_main.c
+++ b/dlls/urlmon/urlmon_main.c
@@ -210,31 +210,14 @@ static const struct object_creation_info object_creation[] =
 
 static void init_session(BOOL init)
 {
-    IInternetSession *session;
     int i;
 
-    CoInternetGetSession(0, &session, 0);
-
     for(i=0; i < sizeof(object_creation)/sizeof(object_creation[0]); i++) {
-        if(object_creation[i].protocol) {
-            if(init)
-            {
-                IInternetSession_RegisterNameSpace(session, object_creation[i].cf,
-                        object_creation[i].clsid, object_creation[i].protocol, 0, NULL, 0);
-                /* make sure that the AddRef on the class factory doesn't keep us loaded */
-                URLMON_UnlockModule();
-            }
-            else
-            {
-                /* make sure that the Release on the class factory doesn't unload us */
-                URLMON_LockModule();
-                IInternetSession_UnregisterNameSpace(session, object_creation[i].cf,
-                        object_creation[i].protocol);
-            }
-        }
-    }
 
-    IInternetSession_Release(session);
+        if(object_creation[i].protocol)
+            register_urlmon_namespace(object_creation[i].cf, object_creation[i].clsid,
+                                      object_creation[i].protocol, init);
+    }
 }
 
 /*******************************************************************************
diff --git a/dlls/urlmon/urlmon_main.h b/dlls/urlmon/urlmon_main.h
index 0e5ebff..17cbd76 100644
--- a/dlls/urlmon/urlmon_main.h
+++ b/dlls/urlmon/urlmon_main.h
@@ -68,6 +68,7 @@ void	UMCloseCacheFileStream(IUMCacheStream *pstr);
 IInternetProtocolInfo *get_protocol_info(LPCWSTR url);
 HRESULT get_protocol_handler(LPCWSTR url, CLSID *clsid, IClassFactory **ret);
 BOOL is_registered_protocol(LPCWSTR);
+void register_urlmon_namespace(IClassFactory*,REFIID,LPCWSTR,BOOL);
 
 HRESULT bind_to_storage(LPCWSTR url, IBindCtx *pbc, REFIID riid, void **ppv);
 HRESULT bind_to_object(IMoniker *mon, LPCWSTR url, IBindCtx *pbc, REFIID riid, void **ppv);




More information about the wine-cvs mailing list