[PATCH] wininet: Move InternetReadFile to vtbl.
Jacek Caban
jacek at codeweavers.com
Sun Mar 2 12:35:11 CST 2008
---
dlls/wininet/ftp.c | 18 ++++++++++++++++++
dlls/wininet/http.c | 42 ++++++++++++++++++++++++++++++++++++++++++
dlls/wininet/internet.c | 39 ++++++++++++++++-----------------------
dlls/wininet/internet.h | 1 +
4 files changed, 77 insertions(+), 23 deletions(-)
diff --git a/dlls/wininet/ftp.c b/dlls/wininet/ftp.c
index f92e545..101ba78 100644
--- a/dlls/wininet/ftp.c
+++ b/dlls/wininet/ftp.c
@@ -1174,6 +1174,21 @@ static void FTPFILE_Destroy(WININETHANDLEHEADER *hdr)
HeapFree(GetProcessHeap(), 0, lpwh);
}
+static DWORD FTPFILE_ReadFile(WININETHANDLEHEADER *hdr, void *buffer, DWORD size, DWORD *read)
+{
+ WININETFTPFILE *file = (WININETFTPFILE*)hdr;
+ int res;
+
+ if (file->nDataSocket == -1)
+ return ERROR_INTERNET_DISCONNECTED;
+
+ /* FIXME: FTP should use NETCON_ stuff */
+ res = recv(file->nDataSocket, buffer, size, MSG_WAITALL);
+ *read = res>0 ? res : 0;
+
+ return res>=0 ? ERROR_SUCCESS : INTERNET_ERROR_BASE; /* FIXME*/
+}
+
static BOOL FTPFILE_WriteFile(WININETHANDLEHEADER *hdr, const void *buffer, DWORD size, DWORD *written)
{
LPWININETFTPFILE lpwh = (LPWININETFTPFILE) hdr;
@@ -1189,6 +1204,7 @@ static const HANDLEHEADERVtbl FTPFILEVtbl = {
FTPFILE_Destroy,
NULL,
NULL,
+ FTPFILE_ReadFile,
FTPFILE_WriteFile,
NULL,
NULL
@@ -2111,6 +2127,7 @@ static const HANDLEHEADERVtbl FTPSESSIONVtbl = {
NULL,
NULL,
NULL,
+ NULL,
NULL
};
@@ -3197,6 +3214,7 @@ static const HANDLEHEADERVtbl FTPFINDNEXTVtbl = {
NULL,
NULL,
NULL,
+ NULL,
FTPFINDNEXT_FindNextFileW
};
diff --git a/dlls/wininet/http.c b/dlls/wininet/http.c
index 2558ea1..40070fb 100644
--- a/dlls/wininet/http.c
+++ b/dlls/wininet/http.c
@@ -1410,6 +1410,46 @@ static DWORD HTTPREQ_SetOption(WININETHANDLEHEADER *hdr, DWORD option, void *buf
return ERROR_INTERNET_INVALID_OPTION;
}
+DWORD HTTPREQ_Read(WININETHTTPREQW *req, void *buffer, DWORD size, DWORD *read, BOOL sync)
+{
+ int bytes_read;
+
+ if(!NETCON_recv(&req->netConnection, buffer, min(size, req->dwContentLength - req->dwContentRead),
+ sync ? MSG_WAITALL : 0, &bytes_read)) {
+ if(req->dwContentLength != -1 && req->dwContentRead != req->dwContentLength)
+ ERR("not all data received %d/%d\n", req->dwContentRead, req->dwContentLength);
+
+ /* always returns TRUE, even if the network layer returns an
+ * error */
+ *read = 0;
+ HTTP_FinishedReading(req);
+ return ERROR_SUCCESS;
+ }
+
+ req->dwContentRead += bytes_read;
+ *read = bytes_read;
+
+ if(req->lpszCacheFile) {
+ BOOL res;
+
+ res = WriteFile(req->hCacheFile, buffer, bytes_read, NULL, NULL);
+ if(!res)
+ WARN("WriteFile failed: %u\n", GetLastError());
+ }
+
+ if(!bytes_read && (req->dwContentRead == req->dwContentLength))
+ HTTP_FinishedReading(req);
+
+ return ERROR_SUCCESS;
+}
+
+static DWORD HTTPREQ_ReadFile(WININETHANDLEHEADER *hdr, void *buffer, DWORD size, DWORD *read)
+{
+ WININETHTTPREQW *req = (WININETHTTPREQW*)hdr;
+
+ return HTTPREQ_Read(req, buffer, size, read, TRUE);
+}
+
static BOOL HTTPREQ_WriteFile(WININETHANDLEHEADER *hdr, const void *buffer, DWORD size, DWORD *written)
{
LPWININETHTTPREQW lpwhr = (LPWININETHTTPREQW)hdr;
@@ -1471,6 +1511,7 @@ static const HANDLEHEADERVtbl HTTPREQVtbl = {
HTTPREQ_Destroy,
HTTPREQ_CloseConnection,
HTTPREQ_SetOption,
+ HTTPREQ_ReadFile,
HTTPREQ_WriteFile,
HTTPREQ_QueryDataAvailable,
NULL
@@ -2999,6 +3040,7 @@ static const HANDLEHEADERVtbl HTTPSESSIONVtbl = {
NULL,
NULL,
NULL,
+ NULL,
NULL
};
diff --git a/dlls/wininet/internet.c b/dlls/wininet/internet.c
index 0019bb9..53bb715 100644
--- a/dlls/wininet/internet.c
+++ b/dlls/wininet/internet.c
@@ -477,6 +477,7 @@ static const HANDLEHEADERVtbl APPINFOVtbl = {
NULL,
NULL,
NULL,
+ NULL,
NULL
};
@@ -1703,11 +1704,9 @@ BOOL INTERNET_ReadFile(LPWININETHANDLEHEADER lpwh, LPVOID lpBuffer,
DWORD dwNumOfBytesToRead, LPDWORD pdwNumOfBytesRead, BOOL bWait)
{
BOOL retval = FALSE;
- int nSocket = -1;
int bytes_read;
LPWININETHTTPREQW lpwhr;
- /* FIXME: this should use NETCON functions! */
switch (lpwh->htype)
{
case WH_HHTTPREQ:
@@ -1749,17 +1748,6 @@ BOOL INTERNET_ReadFile(LPWININETHANDLEHEADER lpwh, LPVOID lpBuffer,
}
break;
- case WH_HFILE:
- /* FIXME: FTP should use NETCON_ stuff */
- nSocket = ((LPWININETFTPFILE)lpwh)->nDataSocket;
- if (nSocket != -1)
- {
- int res = recv(nSocket, lpBuffer, dwNumOfBytesToRead, bWait ? MSG_WAITALL : 0);
- retval = (res >= 0);
- *pdwNumOfBytesRead = retval ? res : 0;
- }
- break;
-
default:
break;
}
@@ -1778,25 +1766,30 @@ BOOL INTERNET_ReadFile(LPWININETHANDLEHEADER lpwh, LPVOID lpBuffer,
*
*/
BOOL WINAPI InternetReadFile(HINTERNET hFile, LPVOID lpBuffer,
- DWORD dwNumOfBytesToRead, LPDWORD pdwNumOfBytesRead)
+ DWORD dwNumOfBytesToRead, LPDWORD pdwNumOfBytesRead)
{
- LPWININETHANDLEHEADER lpwh;
- BOOL retval;
+ LPWININETHANDLEHEADER hdr;
+ DWORD res = ERROR_INTERNET_INCORRECT_HANDLE_TYPE;
TRACE("%p %p %d %p\n", hFile, lpBuffer, dwNumOfBytesToRead, pdwNumOfBytesRead);
- lpwh = WININET_GetObject( hFile );
- if (!lpwh)
- {
+ hdr = WININET_GetObject(hFile);
+ if (!hdr) {
INTERNET_SetLastError(ERROR_INVALID_HANDLE);
return FALSE;
}
- retval = INTERNET_ReadFile(lpwh, lpBuffer, dwNumOfBytesToRead, pdwNumOfBytesRead, TRUE);
- WININET_Release( lpwh );
+ if(hdr->vtbl->ReadFile)
+ res = hdr->vtbl->ReadFile(hdr, lpBuffer, dwNumOfBytesToRead, pdwNumOfBytesRead);
- TRACE("-- %s (bytes read: %d)\n", retval ? "TRUE": "FALSE", pdwNumOfBytesRead ? *pdwNumOfBytesRead : -1);
- return retval;
+ WININET_Release(hdr);
+
+ TRACE("-- %s (%u) (bytes read: %d)\n", res == ERROR_SUCCESS ? "TRUE": "FALSE", res,
+ pdwNumOfBytesRead ? *pdwNumOfBytesRead : -1);
+
+ if(res != ERROR_SUCCESS)
+ SetLastError(res);
+ return res == ERROR_SUCCESS;
}
/***********************************************************************
diff --git a/dlls/wininet/internet.h b/dlls/wininet/internet.h
index fcf225d..ec81379 100644
--- a/dlls/wininet/internet.h
+++ b/dlls/wininet/internet.h
@@ -139,6 +139,7 @@ typedef struct {
void (*Destroy)(WININETHANDLEHEADER*);
void (*CloseConnection)(WININETHANDLEHEADER*);
DWORD (*SetOption)(WININETHANDLEHEADER*,DWORD,void*,DWORD);
+ DWORD (*ReadFile)(WININETHANDLEHEADER*,void*,DWORD,DWORD*);
BOOL (*WriteFile)(WININETHANDLEHEADER*,const void*,DWORD,DWORD*);
DWORD (*QueryDataAvailable)(WININETHANDLEHEADER*,DWORD*,DWORD,DWORD_PTR);
DWORD (*FindNextFileW)(WININETHANDLEHEADER*,void*);
--
1.5.4.3
--------------020206080806090200030707--
More information about the wine-patches
mailing list