wininet: Use vtbl for InternetSetOption(INTERNET_OPTION_[SEND|RECEIVE]_TIMEOUT) implementation.
This commit is contained in:
parent
1ffcfbce85
commit
0e33eee9a2
|
@ -1169,6 +1169,7 @@ static BOOL FTPFILE_WriteFile(WININETHANDLEHEADER *hdr, const void *buffer, DWOR
|
||||||
static const HANDLEHEADERVtbl FTPFILEVtbl = {
|
static const HANDLEHEADERVtbl FTPFILEVtbl = {
|
||||||
FTPFILE_Destroy,
|
FTPFILE_Destroy,
|
||||||
NULL,
|
NULL,
|
||||||
|
NULL,
|
||||||
FTPFILE_WriteFile
|
FTPFILE_WriteFile
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -2086,6 +2087,7 @@ static void FTPSESSION_CloseConnection(WININETHANDLEHEADER *hdr)
|
||||||
static const HANDLEHEADERVtbl FTPSESSIONVtbl = {
|
static const HANDLEHEADERVtbl FTPSESSIONVtbl = {
|
||||||
FTPSESSION_Destroy,
|
FTPSESSION_Destroy,
|
||||||
FTPSESSION_CloseConnection,
|
FTPSESSION_CloseConnection,
|
||||||
|
NULL,
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -3164,6 +3166,7 @@ static void FTPFINDNEXT_Destroy(WININETHANDLEHEADER *hdr)
|
||||||
static const HANDLEHEADERVtbl FTPFINDNEXTVtbl = {
|
static const HANDLEHEADERVtbl FTPFINDNEXTVtbl = {
|
||||||
FTPFINDNEXT_Destroy,
|
FTPFINDNEXT_Destroy,
|
||||||
NULL,
|
NULL,
|
||||||
|
NULL,
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -1392,6 +1392,25 @@ static void HTTPREQ_CloseConnection(WININETHANDLEHEADER *hdr)
|
||||||
INTERNET_STATUS_CONNECTION_CLOSED, 0, 0);
|
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)
|
static BOOL HTTPREQ_WriteFile(WININETHANDLEHEADER *hdr, const void *buffer, DWORD size, DWORD *written)
|
||||||
{
|
{
|
||||||
LPWININETHTTPREQW lpwhr = (LPWININETHTTPREQW)hdr;
|
LPWININETHTTPREQW lpwhr = (LPWININETHTTPREQW)hdr;
|
||||||
|
@ -1402,6 +1421,7 @@ static BOOL HTTPREQ_WriteFile(WININETHANDLEHEADER *hdr, const void *buffer, DWOR
|
||||||
static const HANDLEHEADERVtbl HTTPREQVtbl = {
|
static const HANDLEHEADERVtbl HTTPREQVtbl = {
|
||||||
HTTPREQ_Destroy,
|
HTTPREQ_Destroy,
|
||||||
HTTPREQ_CloseConnection,
|
HTTPREQ_CloseConnection,
|
||||||
|
HTTPREQ_SetOption,
|
||||||
HTTPREQ_WriteFile
|
HTTPREQ_WriteFile
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -2925,6 +2945,7 @@ static void HTTPSESSION_Destroy(WININETHANDLEHEADER *hdr)
|
||||||
static const HANDLEHEADERVtbl HTTPSESSIONVtbl = {
|
static const HANDLEHEADERVtbl HTTPSESSIONVtbl = {
|
||||||
HTTPSESSION_Destroy,
|
HTTPSESSION_Destroy,
|
||||||
NULL,
|
NULL,
|
||||||
|
NULL,
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -474,6 +474,7 @@ static VOID APPINFO_Destroy(WININETHANDLEHEADER *hdr)
|
||||||
static const HANDLEHEADERVtbl APPINFOVtbl = {
|
static const HANDLEHEADERVtbl APPINFOVtbl = {
|
||||||
APPINFO_Destroy,
|
APPINFO_Destroy,
|
||||||
NULL,
|
NULL,
|
||||||
|
NULL,
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -2477,11 +2478,22 @@ BOOL WINAPI InternetSetOptionW(HINTERNET hInternet, DWORD dwOption,
|
||||||
LPWININETHANDLEHEADER lpwhh;
|
LPWININETHANDLEHEADER lpwhh;
|
||||||
BOOL ret = TRUE;
|
BOOL ret = TRUE;
|
||||||
|
|
||||||
TRACE("0x%08x\n", dwOption);
|
TRACE("(%p %d %p %d)\n", hInternet, dwOption, lpBuffer, dwBufferLength);
|
||||||
|
|
||||||
lpwhh = (LPWININETHANDLEHEADER) WININET_GetObject( hInternet );
|
lpwhh = (LPWININETHANDLEHEADER) WININET_GetObject( hInternet );
|
||||||
if( !lpwhh )
|
if(lpwhh && lpwhh->vtbl->SetOption) {
|
||||||
return FALSE;
|
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)
|
switch (dwOption)
|
||||||
{
|
{
|
||||||
|
@ -2553,25 +2565,7 @@ BOOL WINAPI InternetSetOptionW(HINTERNET hInternet, DWORD dwOption,
|
||||||
break;
|
break;
|
||||||
case INTERNET_OPTION_SEND_TIMEOUT:
|
case INTERNET_OPTION_SEND_TIMEOUT:
|
||||||
case INTERNET_OPTION_RECEIVE_TIMEOUT:
|
case INTERNET_OPTION_RECEIVE_TIMEOUT:
|
||||||
TRACE("INTERNET_OPTION_SEND/RECEIVE_TIMEOUT\n");
|
FIXME("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;
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case INTERNET_OPTION_CONNECT_RETRIES:
|
case INTERNET_OPTION_CONNECT_RETRIES:
|
||||||
FIXME("Option INTERNET_OPTION_CONNECT_RETRIES: STUB\n");
|
FIXME("Option INTERNET_OPTION_CONNECT_RETRIES: STUB\n");
|
||||||
|
@ -2584,11 +2578,13 @@ BOOL WINAPI InternetSetOptionW(HINTERNET hInternet, DWORD dwOption,
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
FIXME("Option %d STUB\n",dwOption);
|
FIXME("Option %d STUB\n",dwOption);
|
||||||
INTERNET_SetLastError(ERROR_INVALID_PARAMETER);
|
INTERNET_SetLastError(ERROR_INTERNET_INVALID_OPTION);
|
||||||
ret = FALSE;
|
ret = FALSE;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
WININET_Release( lpwhh );
|
|
||||||
|
if(lpwhh)
|
||||||
|
WININET_Release( lpwhh );
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
|
@ -138,6 +138,7 @@ typedef struct _WININETHANDLEHEADER WININETHANDLEHEADER, *LPWININETHANDLEHEADER;
|
||||||
typedef struct {
|
typedef struct {
|
||||||
void (*Destroy)(WININETHANDLEHEADER*);
|
void (*Destroy)(WININETHANDLEHEADER*);
|
||||||
void (*CloseConnection)(WININETHANDLEHEADER*);
|
void (*CloseConnection)(WININETHANDLEHEADER*);
|
||||||
|
DWORD (*SetOption)(WININETHANDLEHEADER*,DWORD,void*,DWORD);
|
||||||
BOOL (*WriteFile)(WININETHANDLEHEADER*,const void*,DWORD,DWORD*);
|
BOOL (*WriteFile)(WININETHANDLEHEADER*,const void*,DWORD,DWORD*);
|
||||||
} HANDLEHEADERVtbl;
|
} 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_query_data_available(WININET_NETCONNECTION *connection, DWORD *available);
|
||||||
BOOL NETCON_getNextLine(WININET_NETCONNECTION *connection, LPSTR lpszBuffer, LPDWORD dwBuffer);
|
BOOL NETCON_getNextLine(WININET_NETCONNECTION *connection, LPSTR lpszBuffer, LPDWORD dwBuffer);
|
||||||
LPCVOID NETCON_GetCert(WININET_NETCONNECTION *connection);
|
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_CreateDefaults(void);
|
||||||
extern void URLCacheContainers_DeleteAll(void);
|
extern void URLCacheContainers_DeleteAll(void);
|
||||||
|
|
|
@ -745,7 +745,7 @@ LPCVOID NETCON_GetCert(WININET_NETCONNECTION *connection)
|
||||||
#endif
|
#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;
|
int result;
|
||||||
struct timeval tv;
|
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
|
/* FIXME: we should probably store the timeout in the connection to set
|
||||||
* when we do connect */
|
* when we do connect */
|
||||||
if (!NETCON_connected(connection))
|
if (!NETCON_connected(connection))
|
||||||
return TRUE;
|
return ERROR_SUCCESS;
|
||||||
|
|
||||||
/* value is in milliseconds, convert to struct timeval */
|
/* value is in milliseconds, convert to struct timeval */
|
||||||
tv.tv_sec = value / 1000;
|
tv.tv_sec = value / 1000;
|
||||||
|
@ -766,9 +766,8 @@ BOOL NETCON_set_timeout(WININET_NETCONNECTION *connection, BOOL send, int value)
|
||||||
if (result == -1)
|
if (result == -1)
|
||||||
{
|
{
|
||||||
WARN("setsockopt failed (%s)\n", strerror(errno));
|
WARN("setsockopt failed (%s)\n", strerror(errno));
|
||||||
INTERNET_SetLastError(sock_get_error(errno));
|
return sock_get_error(errno);
|
||||||
return FALSE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return TRUE;
|
return ERROR_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
|
@ -113,6 +113,10 @@ static void test_InternetCanonicalizeUrlA(void)
|
||||||
"got %u and %u with size %u for '%s' (%d)\n",
|
"got %u and %u with size %u for '%s' (%d)\n",
|
||||||
res, GetLastError(), dwSize, buffer, lstrlenA(buffer));
|
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());
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ############################### */
|
/* ############################### */
|
||||||
|
|
Loading…
Reference in New Issue