Piotr Caban : urlmon: Use wine lists to store namespaces and MIME filters.

Alexandre Julliard julliard at winehq.org
Tue Mar 13 13:50:38 CDT 2012


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

Author: Piotr Caban <piotr at codeweavers.com>
Date:   Tue Mar 13 14:09:09 2012 +0100

urlmon: Use wine lists to store namespaces and MIME filters.

---

 dlls/urlmon/session.c |   82 +++++++++++++++++++-----------------------------
 1 files changed, 33 insertions(+), 49 deletions(-)

diff --git a/dlls/urlmon/session.c b/dlls/urlmon/session.c
index fc36c0b..24ed2e5 100644
--- a/dlls/urlmon/session.c
+++ b/dlls/urlmon/session.c
@@ -23,25 +23,25 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(urlmon);
 
-typedef struct name_space {
+typedef struct {
     LPWSTR protocol;
     IClassFactory *cf;
     CLSID clsid;
     BOOL urlmon;
 
-    struct name_space *next;
+    struct list entry;
 } name_space;
 
-typedef struct mime_filter {
+typedef struct {
     IClassFactory *cf;
     CLSID clsid;
     LPWSTR mime;
 
-    struct mime_filter *next;
+    struct list entry;
 } mime_filter;
 
-static name_space *name_space_list = NULL;
-static mime_filter *mime_filter_list = NULL;
+static struct list name_space_list = LIST_INIT(name_space_list);
+static struct list mime_filter_list = LIST_INIT(mime_filter_list);
 
 static CRITICAL_SECTION session_cs;
 static CRITICAL_SECTION_DEBUG session_cs_dbg =
@@ -63,7 +63,7 @@ static name_space *find_name_space(LPCWSTR protocol)
 {
     name_space *iter;
 
-    for(iter = name_space_list; iter; iter = iter->next) {
+    LIST_FOR_EACH_ENTRY(iter, &name_space_list, name_space, entry) {
         if(!strcmpW(iter->protocol, protocol))
             return iter;
     }
@@ -134,8 +134,7 @@ static HRESULT register_namespace(IClassFactory *cf, REFIID clsid, LPCWSTR proto
 
     EnterCriticalSection(&session_cs);
 
-    new_name_space->next = name_space_list;
-    name_space_list = new_name_space;
+    list_add_head(&name_space_list, &new_name_space->entry);
 
     LeaveCriticalSection(&session_cs);
 
@@ -144,32 +143,25 @@ static HRESULT register_namespace(IClassFactory *cf, REFIID clsid, LPCWSTR proto
 
 static HRESULT unregister_namespace(IClassFactory *cf, LPCWSTR protocol)
 {
-    name_space *iter, *last = NULL;
+    name_space *iter;
 
     EnterCriticalSection(&session_cs);
 
-    for(iter = name_space_list; iter; iter = iter->next) {
-        if(iter->cf == cf && !strcmpW(iter->protocol, protocol))
-            break;
-        last = iter;
-    }
+    LIST_FOR_EACH_ENTRY(iter, &name_space_list, name_space, entry) {
+        if(iter->cf == cf && !strcmpW(iter->protocol, protocol)) {
+            list_remove(&iter->entry);
 
-    if(iter) {
-        if(last)
-            last->next = iter->next;
-        else
-            name_space_list = iter->next;
-    }
+            LeaveCriticalSection(&session_cs);
 
-    LeaveCriticalSection(&session_cs);
-
-    if(iter) {
-        if(!iter->urlmon)
-            IClassFactory_Release(iter->cf);
-        heap_free(iter->protocol);
-        heap_free(iter);
+            if(!iter->urlmon)
+                IClassFactory_Release(iter->cf);
+            heap_free(iter->protocol);
+            heap_free(iter);
+            return S_OK;
+        }
     }
 
+    LeaveCriticalSection(&session_cs);
     return S_OK;
 }
 
@@ -284,7 +276,7 @@ IInternetProtocol *get_mime_filter(LPCWSTR mime)
 
     EnterCriticalSection(&session_cs);
 
-    for(iter = mime_filter_list; iter; iter = iter->next) {
+    LIST_FOR_EACH_ENTRY(iter, &mime_filter_list, mime_filter, entry) {
         if(!strcmpW(iter->mime, mime)) {
             cf = iter->cf;
             break;
@@ -379,8 +371,7 @@ static HRESULT WINAPI InternetSession_RegisterMimeFilter(IInternetSession *iface
 
     EnterCriticalSection(&session_cs);
 
-    filter->next = mime_filter_list;
-    mime_filter_list = filter;
+    list_add_head(&mime_filter_list, &filter->entry);
 
     LeaveCriticalSection(&session_cs);
 
@@ -390,33 +381,26 @@ static HRESULT WINAPI InternetSession_RegisterMimeFilter(IInternetSession *iface
 static HRESULT WINAPI InternetSession_UnregisterMimeFilter(IInternetSession *iface,
         IClassFactory *pCF, LPCWSTR pwzType)
 {
-    mime_filter *iter, *prev = NULL;
+    mime_filter *iter;
 
     TRACE("(%p %s)\n", pCF, debugstr_w(pwzType));
 
     EnterCriticalSection(&session_cs);
 
-    for(iter = mime_filter_list; iter; iter = iter->next) {
-        if(iter->cf == pCF && !strcmpW(iter->mime, pwzType))
-            break;
-        prev = iter;
-    }
+    LIST_FOR_EACH_ENTRY(iter, &mime_filter_list, mime_filter, entry) {
+        if(iter->cf == pCF && !strcmpW(iter->mime, pwzType)) {
+            list_remove(&iter->entry);
 
-    if(iter) {
-        if(prev)
-            prev->next = iter->next;
-        else
-            mime_filter_list = iter->next;
-    }
+            LeaveCriticalSection(&session_cs);
 
-    LeaveCriticalSection(&session_cs);
-
-    if(iter) {
-        IClassFactory_Release(iter->cf);
-        heap_free(iter->mime);
-        heap_free(iter);
+            IClassFactory_Release(iter->cf);
+            heap_free(iter->mime);
+            heap_free(iter);
+            return S_OK;
+        }
     }
 
+    LeaveCriticalSection(&session_cs);
     return S_OK;
 }
 




More information about the wine-cvs mailing list