Jacek Caban : wininet: Set available bytes in InternetQueryDataAvailable even if it ends up in async call .

Alexandre Julliard julliard at winehq.org
Thu Feb 14 15:01:33 CST 2013


Module: wine
Branch: master
Commit: 851866e22a731141da7e3cbd2550c67c59968959
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=851866e22a731141da7e3cbd2550c67c59968959

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Thu Feb 14 18:05:14 2013 +0100

wininet: Set available bytes in InternetQueryDataAvailable even if it ends up in async call.

---

 dlls/wininet/http.c       |   24 ++++++++++++++++--------
 dlls/wininet/tests/http.c |    9 ++++++++-
 2 files changed, 24 insertions(+), 9 deletions(-)

diff --git a/dlls/wininet/http.c b/dlls/wininet/http.c
index d4c822d..81439ca 100644
--- a/dlls/wininet/http.c
+++ b/dlls/wininet/http.c
@@ -2763,7 +2763,7 @@ static void send_request_complete(http_request_t *req, DWORD_PTR result, DWORD e
             sizeof(INTERNET_ASYNC_RESULT));
 }
 
-static void HTTP_ReceiveRequestData(http_request_t *req, BOOL first_notif)
+static void HTTP_ReceiveRequestData(http_request_t *req, BOOL first_notif, DWORD *ret_size)
 {
     DWORD res, read = 0, avail = 0;
     read_mode_t mode;
@@ -2776,6 +2776,8 @@ static void HTTP_ReceiveRequestData(http_request_t *req, BOOL first_notif)
     res = refill_read_buffer(req, mode, &read);
     if(res == ERROR_SUCCESS && !first_notif)
         avail = get_avail_data(req);
+    if(ret_size)
+        *ret_size = get_avail_data(req);
 
     LeaveCriticalSection( &req->read_section );
 
@@ -2993,11 +2995,16 @@ static DWORD HTTPREQ_WriteFile(object_header_t *hdr, const void *buffer, DWORD s
     return res;
 }
 
-static void AsyncQueryDataAvailableProc(task_header_t *task)
+typedef struct {
+    task_header_t hdr;
+    DWORD *ret_size;
+} http_data_available_task_t;
+
+static void AsyncQueryDataAvailableProc(task_header_t *hdr)
 {
-    http_request_t *req = (http_request_t*)task->hdr;
+    http_data_available_task_t *task = (http_data_available_task_t*)hdr;
 
-    HTTP_ReceiveRequestData(req, FALSE);
+    HTTP_ReceiveRequestData((http_request_t*)task->hdr.hdr, FALSE, task->ret_size);
 }
 
 static DWORD HTTPREQ_QueryDataAvailable(object_header_t *hdr, DWORD *available, DWORD flags, DWORD_PTR ctx)
@@ -3008,7 +3015,7 @@ static DWORD HTTPREQ_QueryDataAvailable(object_header_t *hdr, DWORD *available,
 
     if (req->session->appInfo->hdr.dwFlags & INTERNET_FLAG_ASYNC)
     {
-        task_header_t *task;
+        http_data_available_task_t *task;
 
         /* never wait, if we can't enter the section we queue an async request right away */
         if (TryEnterCriticalSection( &req->read_section ))
@@ -3020,7 +3027,8 @@ static DWORD HTTPREQ_QueryDataAvailable(object_header_t *hdr, DWORD *available,
         }
 
         task = alloc_async_task(&req->hdr, AsyncQueryDataAvailableProc, sizeof(*task));
-        INTERNET_AsyncCall(task);
+        task->ret_size = available;
+        INTERNET_AsyncCall(&task->hdr);
         return ERROR_IO_PENDING;
     }
 
@@ -4923,7 +4931,7 @@ lend:
     {
         if (res == ERROR_SUCCESS) {
             if(bEndRequest && request->contentLength && request->bytesWritten == request->bytesToWrite)
-                HTTP_ReceiveRequestData(request, TRUE);
+                HTTP_ReceiveRequestData(request, TRUE, NULL);
             else
                 send_request_complete(request,
                         request->session->hdr.dwInternalFlags & INET_OPENURL ? (DWORD_PTR)request->hdr.hInternet : 1, 0);
@@ -5034,7 +5042,7 @@ static DWORD HTTP_HttpEndRequestW(http_request_t *request, DWORD dwFlags, DWORD_
         create_cache_entry(request);
 
     if (res == ERROR_SUCCESS && request->contentLength)
-        HTTP_ReceiveRequestData(request, TRUE);
+        HTTP_ReceiveRequestData(request, TRUE, NULL);
     else
         send_request_complete(request, res == ERROR_SUCCESS, res);
 
diff --git a/dlls/wininet/tests/http.c b/dlls/wininet/tests/http.c
index ba4ec4d..6083900 100644
--- a/dlls/wininet/tests/http.c
+++ b/dlls/wininet/tests/http.c
@@ -448,7 +448,7 @@ static void InternetReadFile_test(int flags, const test_data_t *test)
     char *post_data = NULL;
     BOOL res, on_async = TRUE;
     CHAR buffer[4000];
-    DWORD length, post_len = 0;
+    DWORD length, exlen = 0, post_len = 0;
     const char *types[2] = { "*", NULL };
     HINTERNET hi, hic = 0, hor = 0;
 
@@ -649,12 +649,17 @@ static void InternetReadFile_test(int flags, const test_data_t *test)
     {
         if (flags & INTERNET_FLAG_ASYNC)
             SET_EXPECT(INTERNET_STATUS_REQUEST_COMPLETE);
+        length = 0;
         res = InternetQueryDataAvailable(hor,&length,0x0,0x0);
         if (flags & INTERNET_FLAG_ASYNC)
         {
             if (res)
             {
                 CHECK_NOT_NOTIFIED(INTERNET_STATUS_REQUEST_COMPLETE);
+                if(exlen) {
+                    ok(length >= exlen, "length %u < exlen %u\n", length, exlen);
+                    exlen = 0;
+                }
             }
             else if (GetLastError() == ERROR_IO_PENDING)
             {
@@ -663,6 +668,8 @@ static void InternetReadFile_test(int flags, const test_data_t *test)
                 if(!(test->flags & TESTF_CHUNKED))
                     ok(!length, "InternetQueryDataAvailable returned ERROR_IO_PENDING and %u length\n", length);
                 WaitForSingleObject(hCompleteEvent, INFINITE);
+                exlen = length;
+                ok(exlen, "length = 0\n");
                 CHECK_NOTIFIED(INTERNET_STATUS_REQUEST_COMPLETE);
                 ok(req_error, "req_error = 0\n");
                 continue;




More information about the wine-cvs mailing list