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