Misha Koshelev : urlmon:
Fix HttpProtocol behavior when InternetQueryDataAvailable returns
ERROR_IO_PENDING .
Alexandre Julliard
julliard at wine.codeweavers.com
Mon Jul 16 08:23:39 CDT 2007
Module: wine
Branch: master
Commit: fc48d6da73bc9d5c4f1cfde2b9b800e813363a54
URL: http://source.winehq.org/git/wine.git/?a=commit;h=fc48d6da73bc9d5c4f1cfde2b9b800e813363a54
Author: Misha Koshelev <mk144210 at 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
More information about the wine-cvs
mailing list