Module: wine Branch: refs/heads/master Commit: 5b5d45586ed5b051b5bdbefbf43d08862e196b9f URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=5b5d45586ed5b051b5bdbefb...
Author: Robert Shearman rob@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; +}