Jacek Caban : urlmon: Better implementation of bind stopping.
Alexandre Julliard
julliard at winehq.org
Mon Dec 31 12:32:21 CST 2007
Module: wine
Branch: master
Commit: 2f34d0093c3ac679d13eab92761c4cbdd2dcd73e
URL: http://source.winehq.org/git/wine.git/?a=commit;h=2f34d0093c3ac679d13eab92761c4cbdd2dcd73e
Author: Jacek Caban <jacek at codeweavers.com>
Date: Sun Dec 30 17:43:11 2007 +0100
urlmon: Better implementation of bind stopping.
---
dlls/urlmon/binding.c | 28 ++++++++++++++++++++++------
1 files changed, 22 insertions(+), 6 deletions(-)
diff --git a/dlls/urlmon/binding.c b/dlls/urlmon/binding.c
index ca83537..8bfc9c1 100644
--- a/dlls/urlmon/binding.c
+++ b/dlls/urlmon/binding.c
@@ -52,6 +52,7 @@ typedef enum {
} download_state_t;
#define BINDING_LOCKED 0x0001
+#define BINDING_STOPPED 0x0002
struct Binding {
const IBindingVtbl *lpBindingVtbl;
@@ -74,6 +75,7 @@ struct Binding {
BOOL report_mime;
DWORD continue_call;
DWORD state;
+ HRESULT hres;
download_state_t download_state;
DWORD apartment_thread;
@@ -310,6 +312,21 @@ static void mime_available(Binding *This, LPCWSTR mime, BOOL verify)
}
}
+static void stop_binding(Binding *binding, HRESULT hres, LPCWSTR str)
+{
+ if(binding->state & BINDING_LOCKED) {
+ IInternetProtocol_UnlockRequest(binding->protocol);
+ binding->state &= ~BINDING_LOCKED;
+ }
+
+ if(!(binding->state & BINDING_STOPPED)) {
+ binding->state |= BINDING_STOPPED;
+
+ IBindStatusCallback_OnStopBinding(binding->callback, hres, str);
+ binding->hres = hres;
+ }
+}
+
#define STREAM_THIS(iface) DEFINE_THIS(ProtocolStream, Stream, iface)
static HRESULT WINAPI ProtocolStream_QueryInterface(IStream *iface,
@@ -852,9 +869,8 @@ static void report_data(Binding *This, DWORD bscf, ULONG progress, ULONG progres
IBindStatusCallback_OnDataAvailable(This->callback, bscf, progress,
&formatetc, &This->stgmed);
- if(This->download_state == END_DOWNLOAD) {
- IBindStatusCallback_OnStopBinding(This->callback, S_OK, NULL);
- }
+ if(This->download_state == END_DOWNLOAD)
+ stop_binding(This, S_OK, NULL);
}
typedef struct {
@@ -1167,6 +1183,7 @@ static HRESULT Binding_Create(LPCWSTR url, IBindCtx *pbc, REFIID riid, Binding *
ret->state = 0;
ret->download_state = BEFORE_DOWNLOAD;
ret->task_queue_head = ret->task_queue_tail = NULL;
+ ret->hres = S_OK;
memset(&ret->bindinfo, 0, sizeof(BINDINFO));
ret->bindinfo.cbSize = sizeof(BINDINFO);
@@ -1232,7 +1249,7 @@ static HRESULT start_binding(LPCWSTR url, IBindCtx *pbc, REFIID riid, Binding **
hres = IBindStatusCallback_OnStartBinding(binding->callback, 0, BINDING(binding));
if(FAILED(hres)) {
WARN("OnStartBinding failed: %08x\n", hres);
- IBindStatusCallback_OnStopBinding(binding->callback, 0x800c0008, NULL);
+ stop_binding(binding, 0x800c0008, NULL);
IBinding_Release(BINDING(binding));
return hres;
}
@@ -1245,8 +1262,7 @@ static HRESULT start_binding(LPCWSTR url, IBindCtx *pbc, REFIID riid, Binding **
if(FAILED(hres)) {
WARN("Start failed: %08x\n", hres);
- IInternetProtocol_Terminate(binding->protocol, 0);
- IBindStatusCallback_OnStopBinding(binding->callback, S_OK, NULL);
+ stop_binding(binding, hres, NULL);
IBinding_Release(BINDING(binding));
return hres;
More information about the wine-cvs
mailing list