urlmon: Store download state in Binding object.
This commit is contained in:
parent
639ffbfde7
commit
f66b99db83
|
@ -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));
|
||||||
|
|
Loading…
Reference in New Issue