Module: wine Branch: master Commit: fc48d6da73bc9d5c4f1cfde2b9b800e813363a54 URL: http://source.winehq.org/git/wine.git/?a=commit;h=fc48d6da73bc9d5c4f1cfde2b9...
Author: Misha Koshelev mk144210@bcm.edu Date: Sun Jul 15 16:32:28 2007 -0500
urlmon: Fix HttpProtocol behavior when InternetQueryDataAvailable returns ERROR_IO_PENDING.
---
dlls/urlmon/http.c | 38 ++++++++++++++++++++++---------------- 1 files changed, 22 insertions(+), 16 deletions(-)
diff --git a/dlls/urlmon/http.c b/dlls/urlmon/http.c index 926fc91..3914bdb 100644 --- a/dlls/urlmon/http.c +++ b/dlls/urlmon/http.c @@ -68,11 +68,12 @@ WINE_DEFAULT_DEBUG_CHANNEL(urlmon); * Continue is executed by the protocol sink. */ #define FLAG_REQUEST_COMPLETE 0x1 -#define FLAG_FIRST_DATA_REPORTED 0x2 -#define FLAG_ALL_DATA_READ 0x4 -#define FLAG_LAST_DATA_REPORTED 0x8 -#define FLAG_RESULT_REPORTED 0x10 -#define FLAG_CALLED_SWITCH 0x20 +#define FLAG_CALLED_SWITCH 0x2 +#define FLAG_FIRST_CONTINUE_COMPLETE 0x4 +#define FLAG_FIRST_DATA_REPORTED 0x8 +#define FLAG_ALL_DATA_READ 0x10 +#define FLAG_LAST_DATA_REPORTED 0x20 +#define FLAG_RESULT_REPORTED 0x40
typedef struct { const IInternetProtocolVtbl *lpInternetProtocolVtbl; @@ -180,20 +181,15 @@ static void CALLBACK HTTPPROTOCOL_InternetStatusCallback( case INTERNET_STATUS_REQUEST_COMPLETE: if (This->flags & FLAG_CALLED_SWITCH) return; - This->flags |= FLAG_CALLED_SWITCH; + This->flags |= FLAG_CALLED_SWITCH | FLAG_REQUEST_COMPLETE;
/* PROTOCOLDATA same as native */ memset(&data, 0, sizeof(data)); data.dwState = 0xf1000000; - if (!(This->flags & FLAG_REQUEST_COMPLETE)) - { - This->flags |= FLAG_REQUEST_COMPLETE; - data.pData = (LPVOID)BINDSTATUS_DOWNLOADINGDATA; - } - else - { + if (This->flags & FLAG_FIRST_CONTINUE_COMPLETE) data.pData = (LPVOID)BINDSTATUS_ENDDOWNLOADCOMPONENTS; - } + else + data.pData = (LPVOID)BINDSTATUS_DOWNLOADINGDATA; IInternetProtocolSink_Switch(This->protocol_sink, &data); return; default: @@ -583,14 +579,23 @@ static HRESULT WINAPI HttpProtocol_Continue(IInternetProtocol *iface, PROTOCOLDA { This->content_length = atoiW(content_length); } + + This->flags |= FLAG_FIRST_CONTINUE_COMPLETE; }
if (pProtocolData->pData >= (LPVOID)BINDSTATUS_DOWNLOADINGDATA) { if (!InternetQueryDataAvailable(This->request, &This->available_bytes, 0, 0)) { - WARN("InternetQueryDataAvailable failed: %d\n", GetLastError()); - HTTPPROTOCOL_ReportResult(This, INET_E_DATA_NOT_AVAILABLE); + if (GetLastError() == ERROR_IO_PENDING) + { + This->flags &= ~FLAG_REQUEST_COMPLETE; + } + else + { + WARN("InternetQueryDataAvailable failed: %d\n", GetLastError()); + HTTPPROTOCOL_ReportResult(This, INET_E_DATA_NOT_AVAILABLE); + } } else { @@ -658,6 +663,7 @@ static HRESULT WINAPI HttpProtocol_Read(IInternetProtocol *iface, void *pv, { if (GetLastError() == ERROR_IO_PENDING) { + This->flags &= ~FLAG_REQUEST_COMPLETE; hres = E_PENDING; } else