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