wininet: Moved InternetReadFileExA to vtbl.
diff --git a/dlls/wininet/http.c b/dlls/wininet/http.c
index eafec2b..e88ef95 100644
--- a/dlls/wininet/http.c
+++ b/dlls/wininet/http.c
@@ -1431,6 +1431,73 @@
return HTTPREQ_Read(req, buffer, size, read, TRUE);
}
+static void HTTPREQ_AsyncReadFileExProc(WORKREQUEST *workRequest)
+{
+ struct WORKREQ_INTERNETREADFILEEXA const *data = &workRequest->u.InternetReadFileExA;
+ WININETHTTPREQW *req = (WININETHTTPREQW*)workRequest->hdr;
+ INTERNET_ASYNC_RESULT iar;
+ DWORD res;
+
+ TRACE("INTERNETREADFILEEXA %p\n", workRequest->hdr);
+
+ res = HTTPREQ_Read(req, data->lpBuffersOut->lpvBuffer,
+ data->lpBuffersOut->dwBufferLength, &data->lpBuffersOut->dwBufferLength, TRUE);
+
+ iar.dwResult = res == ERROR_SUCCESS;
+ iar.dwError = res;
+
+ INTERNET_SendCallback(&req->hdr, req->hdr.dwContext,
+ INTERNET_STATUS_REQUEST_COMPLETE, &iar,
+ sizeof(INTERNET_ASYNC_RESULT));
+}
+
+static DWORD HTTPREQ_ReadFileExA(WININETHANDLEHEADER *hdr, INTERNET_BUFFERSA *buffers,
+ DWORD flags, DWORD_PTR context)
+{
+
+ WININETHTTPREQW *req = (WININETHTTPREQW*)hdr;
+ DWORD res;
+
+ if (flags & ~(IRF_ASYNC|IRF_NO_WAIT))
+ FIXME("these dwFlags aren't implemented: 0x%x\n", flags & ~(IRF_ASYNC|IRF_NO_WAIT));
+
+ if (buffers->dwStructSize != sizeof(*buffers))
+ return ERROR_INVALID_PARAMETER;
+
+ INTERNET_SendCallback(&req->hdr, req->hdr.dwContext, INTERNET_STATUS_RECEIVING_RESPONSE, NULL, 0);
+
+ /* FIXME: IRF_ASYNC may not be the right thing to test here;
+ * hIC->hdr.dwFlags & INTERNET_FLAG_ASYNC is probably better */
+ if (flags & IRF_ASYNC) {
+ DWORD available = 0;
+
+ NETCON_query_data_available(&req->netConnection, &available);
+ if (!available)
+ {
+ WORKREQUEST workRequest;
+
+ workRequest.asyncproc = HTTPREQ_AsyncReadFileExProc;
+ workRequest.hdr = WININET_AddRef(&req->hdr);
+ workRequest.u.InternetReadFileExA.lpBuffersOut = buffers;
+
+ INTERNET_AsyncCall(&workRequest);
+
+ return ERROR_IO_PENDING;
+ }
+ }
+
+ res = HTTPREQ_Read(req, buffers->lpvBuffer, buffers->dwBufferLength, &buffers->dwBufferLength,
+ !(flags & IRF_NO_WAIT));
+
+ if (res == ERROR_SUCCESS) {
+ DWORD size = buffers->dwBufferLength;
+ INTERNET_SendCallback(&req->hdr, req->hdr.dwContext, INTERNET_STATUS_RESPONSE_RECEIVED,
+ &size, sizeof(size));
+ }
+
+ return res;
+}
+
static BOOL HTTPREQ_WriteFile(WININETHANDLEHEADER *hdr, const void *buffer, DWORD size, DWORD *written)
{
LPWININETHTTPREQW lpwhr = (LPWININETHTTPREQW)hdr;
@@ -1493,6 +1560,7 @@
HTTPREQ_CloseConnection,
HTTPREQ_SetOption,
HTTPREQ_ReadFile,
+ HTTPREQ_ReadFileExA,
HTTPREQ_WriteFile,
HTTPREQ_QueryDataAvailable,
NULL
@@ -3041,6 +3109,7 @@
NULL,
NULL,
NULL,
+ NULL,
NULL
};