urlmon: Fix HttpProtocol behavior when InternetQueryDataAvailable returns ERROR_IO_PENDING.

This commit is contained in:
Misha Koshelev 2007-07-15 16:32:28 -05:00 committed by Alexandre Julliard
parent 4e0371f322
commit fc48d6da73
1 changed files with 22 additions and 16 deletions

View File

@ -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