Robert Shearman : wininet: Implement setting of send and receive timeouts.

Alexandre Julliard julliard at wine.codeweavers.com
Tue Mar 14 12:04:31 CST 2006


Module: wine
Branch: refs/heads/master
Commit: 5b5d45586ed5b051b5bdbefbf43d08862e196b9f
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=5b5d45586ed5b051b5bdbefbf43d08862e196b9f

Author: Robert Shearman <rob at codeweavers.com>
Date:   Tue Mar 14 14:36:11 2006 +0000

wininet: Implement setting of send and receive timeouts.

---

 dlls/wininet/internet.c      |   26 ++++++++++++++++++++++----
 dlls/wininet/internet.h      |    1 +
 dlls/wininet/netconnection.c |   28 ++++++++++++++++++++++++++++
 3 files changed, 51 insertions(+), 4 deletions(-)

diff --git a/dlls/wininet/internet.c b/dlls/wininet/internet.c
index 51db944..f2d4ad3 100644
--- a/dlls/wininet/internet.c
+++ b/dlls/wininet/internet.c
@@ -2442,11 +2442,29 @@ BOOL WINAPI InternetSetOptionW(HINTERNET
     case INTERNET_OPTION_DISABLE_PASSPORT_AUTH:
 	TRACE("Option INTERNET_OPTION_DISABLE_PASSPORT_AUTH: harmless stub, since not enabled\n");
 	break;
-    case INTERNET_OPTION_RECEIVE_TIMEOUT:
-        FIXME("Option INTERNET_OPTION_RECEIVE_TIMEOUT: STUB\n");
-        break;
     case INTERNET_OPTION_SEND_TIMEOUT:
-        FIXME("Option INTERNET_OPTION_SEND_TIMEOUT: STUB\n");
+    case INTERNET_OPTION_RECEIVE_TIMEOUT:
+        TRACE("INTERNET_OPTION_SEND/RECEIVE_TIMEOUT\n");
+        if (dwBufferLength == sizeof(DWORD))
+        {
+            if (lpwhh->htype == WH_HHTTPREQ)
+                ret = NETCON_set_timeout(
+                    &((LPWININETHTTPREQW)lpwhh)->netConnection,
+                    dwOption == INTERNET_OPTION_SEND_TIMEOUT,
+                    *(DWORD *)lpBuffer);
+            else
+            {
+                FIXME("INTERNET_OPTION_SEND/RECEIVE_TIMEOUT not supported on protocol %d\n",
+                      lpwhh->htype);
+                INTERNET_SetLastError(ERROR_INVALID_PARAMETER);
+                ret = FALSE;
+            }
+        }
+        else
+        {
+            INTERNET_SetLastError(ERROR_INVALID_PARAMETER);
+            ret = FALSE;
+        }
         break;
     case INTERNET_OPTION_CONNECT_RETRIES:
         FIXME("Option INTERNET_OPTION_CONNECT_RETRIES: STUB\n");
diff --git a/dlls/wininet/internet.h b/dlls/wininet/internet.h
index 6399de9..8043e4c 100644
--- a/dlls/wininet/internet.h
+++ b/dlls/wininet/internet.h
@@ -481,6 +481,7 @@ BOOL NETCON_recv(WININET_NETCONNECTION *
 		int *recvd /* out */);
 BOOL NETCON_getNextLine(WININET_NETCONNECTION *connection, LPSTR lpszBuffer, LPDWORD dwBuffer);
 LPCVOID NETCON_GetCert(WININET_NETCONNECTION *connection);
+BOOL NETCON_set_timeout(WININET_NETCONNECTION *connection, BOOL send, int value);
 
 extern void URLCacheContainers_CreateDefaults(void);
 extern void URLCacheContainers_DeleteAll(void);
diff --git a/dlls/wininet/netconnection.c b/dlls/wininet/netconnection.c
index e046e04..0c9d06f 100644
--- a/dlls/wininet/netconnection.c
+++ b/dlls/wininet/netconnection.c
@@ -714,3 +714,31 @@ LPCVOID NETCON_GetCert(WININET_NETCONNEC
     return NULL;
 #endif
 }
+
+BOOL NETCON_set_timeout(WININET_NETCONNECTION *connection, BOOL send, int value)
+{
+    int result;
+    struct timeval tv;
+
+    /* FIXME: we should probably store the timeout in the connection to set
+     * when we do connect */
+    if (!NETCON_connected(connection))
+        return TRUE;
+
+    /* value is in milliseconds, convert to struct timeval */
+    tv.tv_sec = value / 1000;
+    tv.tv_usec = (value % 1000) * 1000;
+
+    result = setsockopt(connection->socketFD, SOL_SOCKET,
+                        send ? SO_SNDTIMEO : SO_RCVTIMEO, &tv,
+                        sizeof(tv));
+
+    if (result == -1)
+    {
+        WARN("setsockopt failed (%s)\n", strerror(errno));
+        INTERNET_SetLastError(sock_get_error(errno));
+        return FALSE;
+    }
+
+    return TRUE;
+}




More information about the wine-cvs mailing list