Jacek Caban : wininet: Don't take INTERNET_BUFFERSW as argument in object' s ReadFileEx entry.
Alexandre Julliard
julliard at winehq.org
Fri Nov 23 12:53:23 CST 2012
Module: wine
Branch: master
Commit: 52144829d143a52ae868a590bd6ba7a764be1dae
URL: http://source.winehq.org/git/wine.git/?a=commit;h=52144829d143a52ae868a590bd6ba7a764be1dae
Author: Jacek Caban <jacek at codeweavers.com>
Date: Fri Nov 23 15:18:31 2012 +0100
wininet: Don't take INTERNET_BUFFERSW as argument in object's ReadFileEx entry.
---
dlls/wininet/ftp.c | 6 +++---
dlls/wininet/http.c | 33 +++++++++++++--------------------
dlls/wininet/internet.c | 10 ++++++++--
dlls/wininet/internet.h | 10 ++++++----
4 files changed, 30 insertions(+), 29 deletions(-)
diff --git a/dlls/wininet/ftp.c b/dlls/wininet/ftp.c
index 54dd655..4233bb3 100644
--- a/dlls/wininet/ftp.c
+++ b/dlls/wininet/ftp.c
@@ -1207,10 +1207,10 @@ static DWORD FTPFILE_ReadFileExA(object_header_t *hdr, INTERNET_BUFFERSA *buffer
return FTPFILE_ReadFile(hdr, buffers->lpvBuffer, buffers->dwBufferLength, &buffers->dwBufferLength);
}
-static DWORD FTPFILE_ReadFileExW(object_header_t *hdr, INTERNET_BUFFERSW *buffers,
+static DWORD FTPFILE_ReadFileEx(object_header_t *hdr, void *buf, DWORD size, DWORD *ret_size,
DWORD flags, DWORD_PTR context)
{
- return FTPFILE_ReadFile(hdr, buffers->lpvBuffer, buffers->dwBufferLength, &buffers->dwBufferLength);
+ return FTPFILE_ReadFile(hdr, buf, size, ret_size);
}
static DWORD FTPFILE_WriteFile(object_header_t *hdr, const void *buffer, DWORD size, DWORD *written)
@@ -1300,7 +1300,7 @@ static const object_vtbl_t FTPFILEVtbl = {
INET_SetOption,
FTPFILE_ReadFile,
FTPFILE_ReadFileExA,
- FTPFILE_ReadFileExW,
+ FTPFILE_ReadFileEx,
FTPFILE_WriteFile,
FTPFILE_QueryDataAvailable,
NULL
diff --git a/dlls/wininet/http.c b/dlls/wininet/http.c
index 39978b2..c4a98e5 100644
--- a/dlls/wininet/http.c
+++ b/dlls/wininet/http.c
@@ -2980,31 +2980,27 @@ done:
static void HTTPREQ_AsyncReadFileExWProc(WORKREQUEST *workRequest)
{
- struct WORKREQ_INTERNETREADFILEEXW const *data = &workRequest->u.InternetReadFileExW;
+ struct WORKREQ_HTTPREADFILEEX const *data = &workRequest->u.HttpReadFileEx;
http_request_t *req = (http_request_t*)workRequest->hdr;
DWORD res;
TRACE("INTERNETREADFILEEXW %p\n", workRequest->hdr);
- res = HTTPREQ_Read(req, data->lpBuffersOut->lpvBuffer,
- data->lpBuffersOut->dwBufferLength, &data->lpBuffersOut->dwBufferLength, TRUE);
+ res = HTTPREQ_Read(req, data->buf, data->size, data->ret_read, TRUE);
send_request_complete(req, res == ERROR_SUCCESS, res);
}
-static DWORD HTTPREQ_ReadFileExW(object_header_t *hdr, INTERNET_BUFFERSW *buffers,
+static DWORD HTTPREQ_ReadFileExW(object_header_t *hdr, void *buf, DWORD size, DWORD *ret_read,
DWORD flags, DWORD_PTR context)
{
http_request_t *req = (http_request_t*)hdr;
- DWORD res, size, read, error = ERROR_SUCCESS;
+ DWORD res, read, cread, error = ERROR_SUCCESS;
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);
if (hdr->dwFlags & INTERNET_FLAG_ASYNC)
@@ -3015,9 +3011,7 @@ static DWORD HTTPREQ_ReadFileExW(object_header_t *hdr, INTERNET_BUFFERSW *buffer
{
if (get_avail_data(req))
{
- res = HTTPREQ_Read(req, buffers->lpvBuffer, buffers->dwBufferLength,
- &buffers->dwBufferLength, FALSE);
- size = buffers->dwBufferLength;
+ res = HTTPREQ_Read(req, buf, size, &read, FALSE);
LeaveCriticalSection( &req->read_section );
goto done;
}
@@ -3026,7 +3020,9 @@ static DWORD HTTPREQ_ReadFileExW(object_header_t *hdr, INTERNET_BUFFERSW *buffer
workRequest.asyncproc = HTTPREQ_AsyncReadFileExWProc;
workRequest.hdr = WININET_AddRef(&req->hdr);
- workRequest.u.InternetReadFileExW.lpBuffersOut = buffers;
+ workRequest.u.HttpReadFileEx.buf = buf;
+ workRequest.u.HttpReadFileEx.size = size;
+ workRequest.u.HttpReadFileEx.ret_read = ret_read;
INTERNET_AsyncCall(&workRequest);
@@ -3034,7 +3030,6 @@ static DWORD HTTPREQ_ReadFileExW(object_header_t *hdr, INTERNET_BUFFERSW *buffer
}
read = 0;
- size = buffers->dwBufferLength;
EnterCriticalSection( &req->read_section );
if(hdr->dwError == ERROR_SUCCESS)
@@ -3043,19 +3038,18 @@ static DWORD HTTPREQ_ReadFileExW(object_header_t *hdr, INTERNET_BUFFERSW *buffer
hdr->dwError = ERROR_INTERNET_INTERNAL_ERROR;
while(1) {
- res = HTTPREQ_Read(req, (char*)buffers->lpvBuffer+read, size-read,
- &buffers->dwBufferLength, !(flags & IRF_NO_WAIT));
+ res = HTTPREQ_Read(req, (char*)buf+read, size-read, &cread, !(flags & IRF_NO_WAIT));
if(res != ERROR_SUCCESS)
break;
- read += buffers->dwBufferLength;
+ read += cread;
if(read == size || end_of_read_data(req))
break;
LeaveCriticalSection( &req->read_section );
INTERNET_SendCallback(&req->hdr, req->hdr.dwContext, INTERNET_STATUS_RESPONSE_RECEIVED,
- &buffers->dwBufferLength, sizeof(buffers->dwBufferLength));
+ &cread, sizeof(cread));
INTERNET_SendCallback(&req->hdr, req->hdr.dwContext,
INTERNET_STATUS_RECEIVING_RESPONSE, NULL, 0);
@@ -3068,13 +3062,12 @@ static DWORD HTTPREQ_ReadFileExW(object_header_t *hdr, INTERNET_BUFFERSW *buffer
error = hdr->dwError;
LeaveCriticalSection( &req->read_section );
- size = buffers->dwBufferLength;
- buffers->dwBufferLength = read;
done:
+ *ret_read = read;
if (res == ERROR_SUCCESS) {
INTERNET_SendCallback(&req->hdr, req->hdr.dwContext, INTERNET_STATUS_RESPONSE_RECEIVED,
- &size, sizeof(size));
+ &read, sizeof(read));
}
return res==ERROR_SUCCESS ? error : res;
diff --git a/dlls/wininet/internet.c b/dlls/wininet/internet.c
index 8d610c3..48fe41d 100644
--- a/dlls/wininet/internet.c
+++ b/dlls/wininet/internet.c
@@ -2269,14 +2269,20 @@ BOOL WINAPI InternetReadFileExW(HINTERNET hFile, LPINTERNET_BUFFERSW lpBuffer,
TRACE("(%p %p 0x%x 0x%lx)\n", hFile, lpBuffer, dwFlags, dwContext);
+ if (lpBuffer->dwStructSize != sizeof(*lpBuffer)) {
+ SetLastError(ERROR_INVALID_PARAMETER);
+ return FALSE;
+ }
+
hdr = get_handle_object(hFile);
if (!hdr) {
INTERNET_SetLastError(ERROR_INVALID_HANDLE);
return FALSE;
}
- if(hdr->vtbl->ReadFileExW)
- res = hdr->vtbl->ReadFileExW(hdr, lpBuffer, dwFlags, dwContext);
+ if(hdr->vtbl->ReadFileEx)
+ res = hdr->vtbl->ReadFileEx(hdr, lpBuffer->lpvBuffer, lpBuffer->dwBufferLength, &lpBuffer->dwBufferLength,
+ dwFlags, dwContext);
WININET_Release(hdr);
diff --git a/dlls/wininet/internet.h b/dlls/wininet/internet.h
index 09db338..4e25a93 100644
--- a/dlls/wininet/internet.h
+++ b/dlls/wininet/internet.h
@@ -234,7 +234,7 @@ typedef struct {
DWORD (*SetOption)(object_header_t*,DWORD,void*,DWORD);
DWORD (*ReadFile)(object_header_t*,void*,DWORD,DWORD*);
DWORD (*ReadFileExA)(object_header_t*,INTERNET_BUFFERSA*,DWORD,DWORD_PTR);
- DWORD (*ReadFileExW)(object_header_t*,INTERNET_BUFFERSW*,DWORD,DWORD_PTR);
+ DWORD (*ReadFileEx)(object_header_t*,void*,DWORD,DWORD*,DWORD,DWORD_PTR);
DWORD (*WriteFile)(object_header_t*,const void*,DWORD,DWORD*);
DWORD (*QueryDataAvailable)(object_header_t*,DWORD*,DWORD,DWORD_PTR);
DWORD (*FindNextFileW)(object_header_t*,void*);
@@ -467,9 +467,11 @@ struct WORKREQ_INTERNETREADFILEEXA
LPINTERNET_BUFFERSA lpBuffersOut;
};
-struct WORKREQ_INTERNETREADFILEEXW
+struct WORKREQ_HTTPREADFILEEX
{
- LPINTERNET_BUFFERSW lpBuffersOut;
+ void *buf;
+ DWORD size;
+ DWORD *ret_read;
};
typedef struct WORKREQ
@@ -494,7 +496,7 @@ typedef struct WORKREQ
struct WORKREQ_SENDCALLBACK SendCallback;
struct WORKREQ_INTERNETOPENURLW InternetOpenUrlW;
struct WORKREQ_INTERNETREADFILEEXA InternetReadFileExA;
- struct WORKREQ_INTERNETREADFILEEXW InternetReadFileExW;
+ struct WORKREQ_HTTPREADFILEEX HttpReadFileEx;
} u;
} WORKREQUEST, *LPWORKREQUEST;
More information about the wine-cvs
mailing list