urlmon: Store download state in Binding object.

This commit is contained in:
Jacek Caban 2007-02-10 16:32:03 +01:00 committed by Alexandre Julliard
parent 639ffbfde7
commit f66b99db83
1 changed files with 20 additions and 3 deletions

View File

@ -57,6 +57,12 @@ typedef struct {
BOOL init_buf; BOOL init_buf;
} ProtocolStream; } ProtocolStream;
typedef enum {
BEFORE_DOWNLOAD,
DOWNLOADING,
END_DOWNLOAD
} download_state_t;
struct Binding { struct Binding {
const IBindingVtbl *lpBindingVtbl; const IBindingVtbl *lpBindingVtbl;
const IInternetProtocolSinkVtbl *lpInternetProtocolSinkVtbl; const IInternetProtocolSinkVtbl *lpInternetProtocolSinkVtbl;
@ -77,6 +83,7 @@ struct Binding {
BOOL report_mime; BOOL report_mime;
DWORD continue_call; DWORD continue_call;
BOOL request_locked; BOOL request_locked;
download_state_t download_state;
DWORD apartment_thread; DWORD apartment_thread;
HWND notif_hwnd; HWND notif_hwnd;
@ -824,6 +831,9 @@ static void report_data(Binding *This, DWORD bscf, ULONG progress, ULONG progres
TRACE("(%p)->(%d %u %u)\n", This, bscf, progress, progress_max); TRACE("(%p)->(%d %u %u)\n", This, bscf, progress, progress_max);
if(This->download_state == END_DOWNLOAD)
return;
if(GetCurrentThreadId() != This->apartment_thread) if(GetCurrentThreadId() != This->apartment_thread)
FIXME("called from worked hread\n"); FIXME("called from worked hread\n");
@ -841,14 +851,18 @@ static void report_data(Binding *This, DWORD bscf, ULONG progress, ULONG progres
BINDSTATUS_MIMETYPEAVAILABLE, mime); BINDSTATUS_MIMETYPEAVAILABLE, mime);
} }
if(bscf & BSCF_FIRSTDATANOTIFICATION) { if(This->download_state == BEFORE_DOWNLOAD) {
fill_stream_buffer(This->stream);
This->download_state = DOWNLOADING;
IBindStatusCallback_OnProgress(This->callback, progress, progress_max, IBindStatusCallback_OnProgress(This->callback, progress, progress_max,
BINDSTATUS_BEGINDOWNLOADDATA, This->url); BINDSTATUS_BEGINDOWNLOADDATA, This->url);
} }
if(bscf & BSCF_LASTDATANOTIFICATION) if(bscf & BSCF_LASTDATANOTIFICATION) {
IBindStatusCallback_OnProgress(This->callback, progress, progress_max, IBindStatusCallback_OnProgress(This->callback, progress, progress_max,
BINDSTATUS_ENDDOWNLOADDATA, This->url); BINDSTATUS_ENDDOWNLOADDATA, This->url);
}
if(!This->request_locked) { if(!This->request_locked) {
HRESULT hres = IInternetProtocol_LockRequest(This->protocol, 0); HRESULT hres = IInternetProtocol_LockRequest(This->protocol, 0);
@ -860,9 +874,11 @@ static void report_data(Binding *This, DWORD bscf, ULONG progress, ULONG progres
IBindStatusCallback_OnDataAvailable(This->callback, bscf, This->stream->buf_size, IBindStatusCallback_OnDataAvailable(This->callback, bscf, This->stream->buf_size,
&formatetc, &This->stgmed); &formatetc, &This->stgmed);
if(bscf & BSCF_LASTDATANOTIFICATION) if(bscf & BSCF_LASTDATANOTIFICATION) {
This->download_state = END_DOWNLOAD;
IBindStatusCallback_OnStopBinding(This->callback, S_OK, NULL); IBindStatusCallback_OnStopBinding(This->callback, S_OK, NULL);
} }
}
typedef struct { typedef struct {
task_header_t header; task_header_t header;
@ -1196,6 +1212,7 @@ static HRESULT Binding_Create(LPCWSTR url, IBindCtx *pbc, REFIID riid, Binding *
ret->report_mime = TRUE; ret->report_mime = TRUE;
ret->continue_call = 0; ret->continue_call = 0;
ret->request_locked = FALSE; ret->request_locked = FALSE;
ret->download_state = BEFORE_DOWNLOAD;
ret->task_queue_head = ret->task_queue_tail = NULL; ret->task_queue_head = ret->task_queue_tail = NULL;
memset(&ret->bindinfo, 0, sizeof(BINDINFO)); memset(&ret->bindinfo, 0, sizeof(BINDINFO));