Jacek Caban : urlmon: Use custom task structs.
Alexandre Julliard
julliard at wine.codeweavers.com
Wed Feb 7 16:00:22 CST 2007
Module: wine
Branch: master
Commit: 4e4b5890798dae03a7c72aedf218f2876a6afcb6
URL: http://source.winehq.org/git/wine.git/?a=commit;h=4e4b5890798dae03a7c72aedf218f2876a6afcb6
Author: Jacek Caban <jacek at codeweavers.com>
Date: Wed Feb 7 17:29:12 2007 +0100
urlmon: Use custom task structs.
---
dlls/urlmon/binding.c | 137 ++++++++++++++++++++++++++----------------------
1 files changed, 74 insertions(+), 63 deletions(-)
diff --git a/dlls/urlmon/binding.c b/dlls/urlmon/binding.c
index e7e739c..496d429 100644
--- a/dlls/urlmon/binding.c
+++ b/dlls/urlmon/binding.c
@@ -36,27 +36,14 @@ WINE_DEFAULT_DEBUG_CHANNEL(urlmon);
typedef struct Binding Binding;
-struct _task_t;
+struct _task_header_t;
-typedef void (*task_proc_t)(Binding*, struct _task_t*);
+typedef void (*task_proc_t)(Binding*, struct _task_header_t*);
-typedef struct {
- Binding *binding;
- ULONG progress;
- ULONG progress_max;
- ULONG status_code;
- LPWSTR status_text;
-} on_progress_data;
-
-typedef struct _task_t {
+typedef struct _task_header_t {
task_proc_t proc;
- struct _task_t *next;
- union {
- on_progress_data on_progress;
- PROTOCOLDATA *protocol_data;
- DWORD bscf;
- } data;
-} task_t;
+ struct _task_header_t *next;
+} task_header_t;
typedef struct {
const IStreamVtbl *lpStreamVtbl;
@@ -96,7 +83,7 @@ struct Binding {
STGMEDIUM stgmed;
- task_t *task_queue_head, *task_queue_tail;
+ task_header_t *task_queue_head, *task_queue_tail;
CRITICAL_SECTION section;
};
@@ -109,11 +96,12 @@ struct Binding {
#define WM_MK_CONTINUE (WM_USER+101)
-static void push_task(Binding *binding, task_t *task)
+static void push_task(Binding *binding, task_header_t *task, task_proc_t proc)
{
+ task->proc = proc;
task->next = NULL;
- EnterCriticalSection(&binding->section);
+ EnterCriticalSection(&binding->section);
if(binding->task_queue_tail)
binding->task_queue_tail->next = task;
@@ -123,22 +111,22 @@ static void push_task(Binding *binding,
LeaveCriticalSection(&binding->section);
}
-static task_t *pop_task(Binding *binding)
+static task_header_t *pop_task(Binding *binding)
{
- task_t *ret;
+ task_header_t *ret;
- EnterCriticalSection(&binding->section);
+ EnterCriticalSection(&binding->section);
- ret = binding->task_queue_head;
- if(ret) {
- binding->task_queue_head = ret->next;
- if(!binding->task_queue_head)
- binding->task_queue_tail = NULL;
- }
+ ret = binding->task_queue_head;
+ if(ret) {
+ binding->task_queue_head = ret->next;
+ if(!binding->task_queue_head)
+ binding->task_queue_tail = NULL;
+ }
- LeaveCriticalSection(&binding->section);
+ LeaveCriticalSection(&binding->section);
- return ret;
+ return ret;
}
static void fill_stream_buffer(ProtocolStream *This)
@@ -161,7 +149,7 @@ static LRESULT WINAPI notif_wnd_proc(HWN
{
if(msg == WM_MK_CONTINUE) {
Binding *binding = (Binding*)lParam;
- task_t *task;
+ task_header_t *task;
while((task = pop_task(binding)))
task->proc(binding, task);
@@ -696,26 +684,32 @@ static ULONG WINAPI InternetProtocolSink
return IBinding_Release(BINDING(This));
}
-static void switch_proc(Binding *binding, task_t *t)
+typedef struct {
+ task_header_t header;
+ PROTOCOLDATA *data;
+} switch_task_t;
+
+static void switch_proc(Binding *binding, task_header_t *t)
{
- IInternetProtocol_Continue(binding->protocol, t->data.protocol_data);
+ switch_task_t *task = (switch_task_t*)t;
+
+ IInternetProtocol_Continue(binding->protocol, task->data);
- HeapFree(GetProcessHeap(), 0, t);
+ HeapFree(GetProcessHeap(), 0, task);
}
static HRESULT WINAPI InternetProtocolSink_Switch(IInternetProtocolSink *iface,
PROTOCOLDATA *pProtocolData)
{
Binding *This = PROTSINK_THIS(iface);
- task_t *task;
+ switch_task_t *task;
TRACE("(%p)->(%p)\n", This, pProtocolData);
- task = HeapAlloc(GetProcessHeap(), 0, sizeof(task_t));
- task->proc = switch_proc;
- task->data.protocol_data = pProtocolData;
+ task = HeapAlloc(GetProcessHeap(), 0, sizeof(switch_task_t));
+ task->data = pProtocolData;
- push_task(This, task);
+ push_task(This, &task->header, switch_proc);
IBinding_AddRef(BINDING(This));
PostMessageW(This->notif_hwnd, WM_MK_CONTINUE, 0, (LPARAM)This);
@@ -723,19 +717,31 @@ static HRESULT WINAPI InternetProtocolSi
return S_OK;
}
-static void on_progress_proc(Binding *This, task_t *t)
+typedef struct {
+ task_header_t header;
+
+ Binding *binding;
+ ULONG progress;
+ ULONG progress_max;
+ ULONG status_code;
+ LPWSTR status_text;
+} on_progress_task_t;
+
+static void on_progress_proc(Binding *binding, task_header_t *t)
{
- IBindStatusCallback_OnProgress(This->callback, t->data.on_progress.progress,
- t->data.on_progress.progress_max, t->data.on_progress.status_code, t->data.on_progress.status_text);
+ on_progress_task_t *task = (on_progress_task_t*)t;
+
+ IBindStatusCallback_OnProgress(binding->callback, task->progress,
+ task->progress_max, task->status_code, task->status_text);
- HeapFree(GetProcessHeap(), 0, t->data.on_progress.status_text);
- HeapFree(GetProcessHeap(), 0, t);
+ HeapFree(GetProcessHeap(), 0, task->status_text);
+ HeapFree(GetProcessHeap(), 0, task);
}
static void on_progress(Binding *This, ULONG progress, ULONG progress_max,
ULONG status_code, LPCWSTR status_text)
{
- task_t *task;
+ on_progress_task_t *task;
if(GetCurrentThreadId() == This->apartment_thread && !This->continue_call) {
IBindStatusCallback_OnProgress(This->callback, progress, progress_max,
@@ -743,23 +749,22 @@ static void on_progress(Binding *This, U
return;
}
- task = HeapAlloc(GetProcessHeap(), 0, sizeof(task_t));
+ task = HeapAlloc(GetProcessHeap(), 0, sizeof(on_progress_task_t));
- task->proc = on_progress_proc;
- task->data.on_progress.progress = progress;
- task->data.on_progress.progress_max = progress_max;
- task->data.on_progress.status_code = status_code;
+ task->progress = progress;
+ task->progress_max = progress_max;
+ task->status_code = status_code;
if(status_text) {
DWORD size = (strlenW(status_text)+1)*sizeof(WCHAR);
- task->data.on_progress.status_text = HeapAlloc(GetProcessHeap(), 0, size);
- memcpy(task->data.on_progress.status_text, status_text, size);
+ task->status_text = HeapAlloc(GetProcessHeap(), 0, size);
+ memcpy(task->status_text, status_text, size);
}else {
- task->data.on_progress.status_text = NULL;
+ task->status_text = NULL;
}
- push_task(This, task);
+ push_task(This, &task->header, on_progress_proc);
if(GetCurrentThreadId() != This->apartment_thread) {
IBinding_AddRef(BINDING(This));
@@ -814,11 +819,18 @@ static void report_data(Binding *This, D
&formatetc, &This->stgmed);
}
-static void report_data_proc(Binding *binding, task_t *t)
+typedef struct {
+ task_header_t header;
+ DWORD bscf;
+} report_data_task_t;
+
+static void report_data_proc(Binding *binding, task_header_t *t)
{
- report_data(binding, t->data.bscf);
+ report_data_task_t *task = (report_data_task_t*)t;
+
+ report_data(binding, task->bscf);
- HeapFree(GetProcessHeap(), 0, t);
+ HeapFree(GetProcessHeap(), 0, task);
}
static HRESULT WINAPI InternetProtocolSink_ReportData(IInternetProtocolSink *iface,
@@ -857,11 +869,10 @@ static HRESULT WINAPI InternetProtocolSi
}
if(This->continue_call) {
- task_t *task = HeapAlloc(GetProcessHeap(), 0, sizeof(task_t));
- task->proc = report_data_proc;
- task->data.bscf = grfBSCF;
+ report_data_task_t *task = HeapAlloc(GetProcessHeap(), 0, sizeof(report_data_task_t));
+ task->bscf = grfBSCF;
- push_task(This, task);
+ push_task(This, &task->header, report_data_proc);
}else {
report_data(This, grfBSCF);
}
More information about the wine-cvs
mailing list