Module: wine Branch: master Commit: 0e33eee9a24121436e40529003b227696b343510 URL: http://source.winehq.org/git/wine.git/?a=commit;h=0e33eee9a24121436e40529003...
Author: Jacek Caban jacek@codeweavers.com Date: Tue Feb 26 20:22:02 2008 +0100
wininet: Use vtbl for InternetSetOption(INTERNET_OPTION_[SEND|RECEIVE]_TIMEOUT) implementation.
---
dlls/wininet/ftp.c | 3 ++ dlls/wininet/http.c | 21 +++++++++++++++++++ dlls/wininet/internet.c | 44 ++++++++++++++++++---------------------- dlls/wininet/internet.h | 3 +- dlls/wininet/netconnection.c | 9 +++---- dlls/wininet/tests/internet.c | 4 +++ 6 files changed, 54 insertions(+), 30 deletions(-)
diff --git a/dlls/wininet/ftp.c b/dlls/wininet/ftp.c index 0714777..d81e242 100644 --- a/dlls/wininet/ftp.c +++ b/dlls/wininet/ftp.c @@ -1169,6 +1169,7 @@ static BOOL FTPFILE_WriteFile(WININETHANDLEHEADER *hdr, const void *buffer, DWOR static const HANDLEHEADERVtbl FTPFILEVtbl = { FTPFILE_Destroy, NULL, + NULL, FTPFILE_WriteFile };
@@ -2086,6 +2087,7 @@ static void FTPSESSION_CloseConnection(WININETHANDLEHEADER *hdr) static const HANDLEHEADERVtbl FTPSESSIONVtbl = { FTPSESSION_Destroy, FTPSESSION_CloseConnection, + NULL, NULL };
@@ -3164,6 +3166,7 @@ static void FTPFINDNEXT_Destroy(WININETHANDLEHEADER *hdr) static const HANDLEHEADERVtbl FTPFINDNEXTVtbl = { FTPFINDNEXT_Destroy, NULL, + NULL, NULL };
diff --git a/dlls/wininet/http.c b/dlls/wininet/http.c index bd219e6..f3c2afc 100644 --- a/dlls/wininet/http.c +++ b/dlls/wininet/http.c @@ -1392,6 +1392,25 @@ static void HTTPREQ_CloseConnection(WININETHANDLEHEADER *hdr) INTERNET_STATUS_CONNECTION_CLOSED, 0, 0); }
+static DWORD HTTPREQ_SetOption(WININETHANDLEHEADER *hdr, DWORD option, void *buffer, DWORD size) +{ + WININETHTTPREQW *req = (WININETHTTPREQW*)hdr; + + switch(option) { + case INTERNET_OPTION_SEND_TIMEOUT: + case INTERNET_OPTION_RECEIVE_TIMEOUT: + TRACE("INTERNET_OPTION_SEND/RECEIVE_TIMEOUT\n"); + + if (size != sizeof(DWORD)) + return ERROR_INVALID_PARAMETER; + + return NETCON_set_timeout(&req->netConnection, option == INTERNET_OPTION_SEND_TIMEOUT, + *(DWORD*)buffer); + } + + return ERROR_INTERNET_INVALID_OPTION; +} + static BOOL HTTPREQ_WriteFile(WININETHANDLEHEADER *hdr, const void *buffer, DWORD size, DWORD *written) { LPWININETHTTPREQW lpwhr = (LPWININETHTTPREQW)hdr; @@ -1402,6 +1421,7 @@ static BOOL HTTPREQ_WriteFile(WININETHANDLEHEADER *hdr, const void *buffer, DWOR static const HANDLEHEADERVtbl HTTPREQVtbl = { HTTPREQ_Destroy, HTTPREQ_CloseConnection, + HTTPREQ_SetOption, HTTPREQ_WriteFile };
@@ -2925,6 +2945,7 @@ static void HTTPSESSION_Destroy(WININETHANDLEHEADER *hdr) static const HANDLEHEADERVtbl HTTPSESSIONVtbl = { HTTPSESSION_Destroy, NULL, + NULL, NULL };
diff --git a/dlls/wininet/internet.c b/dlls/wininet/internet.c index 472c183..1088519 100644 --- a/dlls/wininet/internet.c +++ b/dlls/wininet/internet.c @@ -474,6 +474,7 @@ static VOID APPINFO_Destroy(WININETHANDLEHEADER *hdr) static const HANDLEHEADERVtbl APPINFOVtbl = { APPINFO_Destroy, NULL, + NULL, NULL };
@@ -2477,11 +2478,22 @@ BOOL WINAPI InternetSetOptionW(HINTERNET hInternet, DWORD dwOption, LPWININETHANDLEHEADER lpwhh; BOOL ret = TRUE;
- TRACE("0x%08x\n", dwOption); + TRACE("(%p %d %p %d)\n", hInternet, dwOption, lpBuffer, dwBufferLength);
lpwhh = (LPWININETHANDLEHEADER) WININET_GetObject( hInternet ); - if( !lpwhh ) - return FALSE; + if(lpwhh && lpwhh->vtbl->SetOption) { + DWORD res; + + res = lpwhh->vtbl->SetOption(lpwhh, dwOption, lpBuffer, dwBufferLength); + if(res != ERROR_INTERNET_INVALID_OPTION) { + WININET_Release( lpwhh ); + + if(res != ERROR_SUCCESS) + SetLastError(res); + + return res == ERROR_SUCCESS; + } + }
switch (dwOption) { @@ -2553,25 +2565,7 @@ BOOL WINAPI InternetSetOptionW(HINTERNET hInternet, DWORD dwOption, break; case INTERNET_OPTION_SEND_TIMEOUT: 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); - } - } - else - { - INTERNET_SetLastError(ERROR_INVALID_PARAMETER); - ret = FALSE; - } + FIXME("INTERNET_OPTION_SEND/RECEIVE_TIMEOUT\n"); break; case INTERNET_OPTION_CONNECT_RETRIES: FIXME("Option INTERNET_OPTION_CONNECT_RETRIES: STUB\n"); @@ -2584,11 +2578,13 @@ BOOL WINAPI InternetSetOptionW(HINTERNET hInternet, DWORD dwOption, break; default: FIXME("Option %d STUB\n",dwOption); - INTERNET_SetLastError(ERROR_INVALID_PARAMETER); + INTERNET_SetLastError(ERROR_INTERNET_INVALID_OPTION); ret = FALSE; break; } - WININET_Release( lpwhh ); + + if(lpwhh) + WININET_Release( lpwhh );
return ret; } diff --git a/dlls/wininet/internet.h b/dlls/wininet/internet.h index 2389fe5..c3321e1 100644 --- a/dlls/wininet/internet.h +++ b/dlls/wininet/internet.h @@ -138,6 +138,7 @@ typedef struct _WININETHANDLEHEADER WININETHANDLEHEADER, *LPWININETHANDLEHEADER; typedef struct { void (*Destroy)(WININETHANDLEHEADER*); void (*CloseConnection)(WININETHANDLEHEADER*); + DWORD (*SetOption)(WININETHANDLEHEADER*,DWORD,void*,DWORD); BOOL (*WriteFile)(WININETHANDLEHEADER*,const void*,DWORD,DWORD*); } HANDLEHEADERVtbl;
@@ -475,7 +476,7 @@ BOOL NETCON_recv(WININET_NETCONNECTION *connection, void *buf, size_t len, int f BOOL NETCON_query_data_available(WININET_NETCONNECTION *connection, DWORD *available); 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); +DWORD 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 4500a9f..8bf3c2a 100644 --- a/dlls/wininet/netconnection.c +++ b/dlls/wininet/netconnection.c @@ -745,7 +745,7 @@ LPCVOID NETCON_GetCert(WININET_NETCONNECTION *connection) #endif }
-BOOL NETCON_set_timeout(WININET_NETCONNECTION *connection, BOOL send, int value) +DWORD NETCON_set_timeout(WININET_NETCONNECTION *connection, BOOL send, int value) { int result; struct timeval tv; @@ -753,7 +753,7 @@ BOOL NETCON_set_timeout(WININET_NETCONNECTION *connection, BOOL send, int value) /* FIXME: we should probably store the timeout in the connection to set * when we do connect */ if (!NETCON_connected(connection)) - return TRUE; + return ERROR_SUCCESS;
/* value is in milliseconds, convert to struct timeval */ tv.tv_sec = value / 1000; @@ -766,9 +766,8 @@ BOOL NETCON_set_timeout(WININET_NETCONNECTION *connection, BOOL send, int value) if (result == -1) { WARN("setsockopt failed (%s)\n", strerror(errno)); - INTERNET_SetLastError(sock_get_error(errno)); - return FALSE; + return sock_get_error(errno); }
- return TRUE; + return ERROR_SUCCESS; } diff --git a/dlls/wininet/tests/internet.c b/dlls/wininet/tests/internet.c index 259f563..d3adf91 100644 --- a/dlls/wininet/tests/internet.c +++ b/dlls/wininet/tests/internet.c @@ -113,6 +113,10 @@ static void test_InternetCanonicalizeUrlA(void) "got %u and %u with size %u for '%s' (%d)\n", res, GetLastError(), dwSize, buffer, lstrlenA(buffer));
+ res = InternetSetOptionA(NULL, 0xdeadbeef, buffer, sizeof(buffer)); + ok(!res, "InternetSetOptionA succeeded\n"); + ok(GetLastError() == ERROR_INTERNET_INVALID_OPTION, + "InternetSetOptionA failed %u, expected ERROR_INTERNET_INVALID_OPTION\n", GetLastError()); }
/* ############################### */