From: Piotr Caban piotr@codeweavers.com
--- dlls/wininet/internet.c | 165 +++++++++++++++++++++++++++++----------- 1 file changed, 121 insertions(+), 44 deletions(-)
diff --git a/dlls/wininet/internet.c b/dlls/wininet/internet.c index fdea5c8c3c6..072c76ff7e3 100644 --- a/dlls/wininet/internet.c +++ b/dlls/wininet/internet.c @@ -110,6 +110,8 @@ static ULONG connect_timeout = 60000; static const WCHAR szInternetSettings[] = L"Software\Microsoft\Windows\CurrentVersion\Internet Settings";
+static WCHAR *get_proxy_autoconfig_url(void); + void *alloc_object(object_header_t *parent, const object_vtbl_t *vtbl, size_t size) { UINT_PTR handle = 0, num; @@ -985,6 +987,37 @@ static VOID APPINFO_Destroy(object_header_t *hdr) free(lpwai->proxyPassword); }
+static WCHAR *copy_optionW(WCHAR *value) +{ + DWORD len; + void *tmp; + + if (!value) + return NULL; + + len = (wcslen(value) + 1) * sizeof(WCHAR); + if (!(tmp = HeapAlloc(GetProcessHeap(), 0, len))) + return NULL; + + return memcpy(tmp, value, len); +} + +static char *copy_optionA(WCHAR *value) +{ + DWORD len; + void *tmp; + + if (!value) + return NULL; + + len = wcslen(value) * 3 + 1; + if (!(tmp = HeapAlloc(GetProcessHeap(), 0, len))) + return NULL; + + WideCharToMultiByte(CP_ACP, 0, value, -1, tmp, len, NULL, NULL); + return tmp; +} + static DWORD APPINFO_QueryOption(object_header_t *hdr, DWORD option, void *buffer, DWORD *size, BOOL unicode) { appinfo_t *ai = (appinfo_t*)hdr; @@ -1123,6 +1156,80 @@ static DWORD APPINFO_QueryOption(object_header_t *hdr, DWORD option, void *buffe *size = sizeof(ULONG);
return ERROR_SUCCESS; + + case INTERNET_OPTION_PER_CONNECTION_OPTION: { + INTERNET_PER_CONN_OPTION_LISTW *con = buffer; + INTERNET_PER_CONN_OPTION_LISTA *conA = buffer; + LONG res = ERROR_SUCCESS; + WCHAR *url = NULL; + int i; + + if (*size < sizeof(INTERNET_PER_CONN_OPTION_LISTW)) + return ERROR_INSUFFICIENT_BUFFER; + + EnterCriticalSection(&WININET_cs); + + if (global_proxy.flags & PROXY_TYPE_AUTO_DETECT) + url = get_proxy_autoconfig_url(); + + for (i = 0; i < con->dwOptionCount; i++) { + INTERNET_PER_CONN_OPTIONW *optionW = con->pOptions + i; + INTERNET_PER_CONN_OPTIONA *optionA = conA->pOptions + i; + + switch (optionW->dwOption) { + case INTERNET_PER_CONN_FLAGS: + optionW->Value.dwValue = global_proxy.flags; + break; + + case INTERNET_PER_CONN_PROXY_SERVER: + if (unicode) + optionW->Value.pszValue = copy_optionW(global_proxy.proxy); + else + optionA->Value.pszValue = copy_optionA(global_proxy.proxy); + break; + + case INTERNET_PER_CONN_PROXY_BYPASS: + if (unicode) + optionW->Value.pszValue = copy_optionW(global_proxy.proxyBypass); + else + optionA->Value.pszValue = copy_optionA(global_proxy.proxyBypass); + break; + + case INTERNET_PER_CONN_AUTOCONFIG_URL: + if (unicode) + optionW->Value.pszValue = copy_optionW(global_proxy.autoconf_url); + else + optionA->Value.pszValue = copy_optionA(global_proxy.autoconf_url); + break; + + case INTERNET_PER_CONN_AUTODISCOVERY_FLAGS: + optionW->Value.dwValue = AUTO_PROXY_FLAG_ALWAYS_DETECT; + break; + + case INTERNET_PER_CONN_AUTOCONFIG_LAST_DETECT_URL: + if (unicode) + optionW->Value.pszValue = copy_optionW(url); + else + optionA->Value.pszValue = copy_optionA(url); + break; + + case INTERNET_PER_CONN_AUTOCONFIG_SECONDARY_URL: + case INTERNET_PER_CONN_AUTOCONFIG_RELOAD_DELAY_MINS: + case INTERNET_PER_CONN_AUTOCONFIG_LAST_DETECT_TIME: + FIXME("Unhandled dwOption %ld\n", optionW->dwOption); + memset(&optionW->Value, 0, sizeof(optionW->Value)); + break; + + default: + FIXME("Unknown dwOption %ld\n", optionW->dwOption); + res = ERROR_INVALID_PARAMETER; + break; + } + } + + LeaveCriticalSection(&WININET_cs); + return res; + } }
return INET_QueryOption(hdr, option, buffer, size, unicode); @@ -2806,37 +2913,6 @@ static WCHAR *get_proxy_autoconfig_url(void) return ret; }
-static WCHAR *copy_optionW(WCHAR *value) -{ - DWORD len; - void *tmp; - - if (!value) - return NULL; - - len = (wcslen(value) + 1) * sizeof(WCHAR); - if (!(tmp = HeapAlloc(GetProcessHeap(), 0, len))) - return NULL; - - return memcpy(tmp, value, len); -} - -static char *copy_optionA(WCHAR *value) -{ - DWORD len; - void *tmp; - - if (!value) - return NULL; - - len = wcslen(value) * 3 + 1; - if (!(tmp = HeapAlloc(GetProcessHeap(), 0, len))) - return NULL; - - WideCharToMultiByte(CP_ACP, 0, value, -1, tmp, len, NULL, NULL); - return tmp; -} - static DWORD query_global_option(DWORD option, void *buffer, DWORD *size, BOOL unicode) { /* FIXME: This function currently handles more options than it should. Options requiring @@ -2920,25 +2996,25 @@ static DWORD query_global_option(DWORD option, void *buffer, DWORD *size, BOOL u }
case INTERNET_OPTION_PER_CONNECTION_OPTION: { - WCHAR *url; + WCHAR *url = NULL; INTERNET_PER_CONN_OPTION_LISTW *con = buffer; INTERNET_PER_CONN_OPTION_LISTA *conA = buffer; DWORD res = ERROR_SUCCESS, i; proxyinfo_t pi; LONG ret;
- TRACE("Getting global proxy info\n"); if((ret = INTERNET_LoadProxySettings(&pi))) return ret;
- FIXME("INTERNET_OPTION_PER_CONNECTION_OPTION stub\n"); + TRACE("INTERNET_OPTION_PER_CONNECTION_OPTION\n");
if (*size < sizeof(INTERNET_PER_CONN_OPTION_LISTW)) { FreeProxyInfo(&pi); return ERROR_INSUFFICIENT_BUFFER; }
- url = get_proxy_autoconfig_url(); + if (pi.flags & PROXY_TYPE_AUTO_DETECT) + url = get_proxy_autoconfig_url();
for (i = 0; i < con->dwOptionCount; i++) { INTERNET_PER_CONN_OPTIONW *optionW = con->pOptions + i; @@ -2947,9 +3023,6 @@ static DWORD query_global_option(DWORD option, void *buffer, DWORD *size, BOOL u switch (optionW->dwOption) { case INTERNET_PER_CONN_FLAGS: optionW->Value.dwValue = pi.flags; - if (url) - /* native includes PROXY_TYPE_DIRECT even if PROXY_TYPE_PROXY is set */ - optionW->Value.dwValue |= PROXY_TYPE_DIRECT|PROXY_TYPE_AUTO_PROXY_URL; break;
case INTERNET_PER_CONN_PROXY_SERVER: @@ -2967,22 +3040,26 @@ static DWORD query_global_option(DWORD option, void *buffer, DWORD *size, BOOL u break;
case INTERNET_PER_CONN_AUTOCONFIG_URL: - if (!url) - optionW->Value.pszValue = NULL; - else if (unicode) - optionW->Value.pszValue = copy_optionW(url); + if (unicode) + optionW->Value.pszValue = copy_optionW(pi.autoconf_url); else - optionA->Value.pszValue = copy_optionA(url); + optionA->Value.pszValue = copy_optionA(pi.autoconf_url); break;
case INTERNET_PER_CONN_AUTODISCOVERY_FLAGS: optionW->Value.dwValue = AUTO_PROXY_FLAG_ALWAYS_DETECT; break;
+ case INTERNET_PER_CONN_AUTOCONFIG_LAST_DETECT_URL: + if (unicode) + optionW->Value.pszValue = copy_optionW(url); + else + optionA->Value.pszValue = copy_optionA(url); + break; + case INTERNET_PER_CONN_AUTOCONFIG_SECONDARY_URL: case INTERNET_PER_CONN_AUTOCONFIG_RELOAD_DELAY_MINS: case INTERNET_PER_CONN_AUTOCONFIG_LAST_DETECT_TIME: - case INTERNET_PER_CONN_AUTOCONFIG_LAST_DETECT_URL: FIXME("Unhandled dwOption %ld\n", optionW->dwOption); memset(&optionW->Value, 0, sizeof(optionW->Value)); break;