forked from Mirrors/wine-wine
urlmon: Use wine lists to store namespaces and MIME filters.
parent
fe339ba25b
commit
e804d0915a
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue