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

oldstable
Piotr Caban 2012-03-13 14:09:09 +01:00 committed by Alexandre Julliard
parent fe339ba25b
commit e804d0915a
1 changed files with 33 additions and 49 deletions

View File

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