wininet #3: Move InternetReadFile to vtbl.

Jacek Caban jacek at codeweavers.com
Sun Mar 2 12:59:34 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




More information about the wine-patches mailing list