From 89d40b3de103e1cf785e4606f000f8f85957073e Mon Sep 17 00:00:00 2001 From: Hans Leidekker Date: Tue, 6 May 2014 11:33:18 +0200 Subject: [PATCH] wininet: Add support for retrieving the proxy automatic configuration URL on Mac OS X. --- dlls/wininet/Makefile.in | 2 +- dlls/wininet/internet.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+), 1 deletion(-) diff --git a/dlls/wininet/Makefile.in b/dlls/wininet/Makefile.in index f7b8e894afd..357b9247c1f 100644 --- a/dlls/wininet/Makefile.in +++ b/dlls/wininet/Makefile.in @@ -3,7 +3,7 @@ MODULE = wininet.dll IMPORTLIB = wininet IMPORTS = mpr shlwapi shell32 user32 advapi32 DELAYIMPORTS = secur32 crypt32 cryptui -EXTRALIBS = $(SOCKET_LIBS) $(Z_LIBS) +EXTRALIBS = $(CORESERVICES_LIBS) $(SOCKET_LIBS) $(Z_LIBS) C_SRCS = \ cookie.c \ diff --git a/dlls/wininet/internet.c b/dlls/wininet/internet.c index 30e8f60c053..8ea2803232a 100644 --- a/dlls/wininet/internet.c +++ b/dlls/wininet/internet.c @@ -56,6 +56,15 @@ #endif #include +#ifdef HAVE_CORESERVICES_CORESERVICES_H +#define GetCurrentThread MacGetCurrentThread +#define LoadResource MacLoadResource +#include +#undef GetCurrentThread +#undef LoadResource +#undef DPRINTF +#endif + #include "windef.h" #include "winbase.h" #include "winreg.h" @@ -2389,6 +2398,33 @@ BOOL WINAPI InternetReadFileExW(HINTERNET hFile, LPINTERNET_BUFFERSW lpBuffer, return res == ERROR_SUCCESS; } +static BOOL get_proxy_autoconfig_url( char *buf, DWORD buflen ) +{ +#ifdef HAVE_CORESERVICES_CORESERVICES_H + CFDictionaryRef settings = CFNetworkCopySystemProxySettings(); + const void *ref; + BOOL ret = FALSE; + + if (!settings) return FALSE; + + if (!(ref = CFDictionaryGetValue( settings, kCFNetworkProxiesProxyAutoConfigURLString ))) + { + CFRelease( settings ); + return FALSE; + } + if (CFStringGetCString( ref, buf, buflen, kCFStringEncodingASCII )) + { + TRACE( "returning %s\n", debugstr_a(buf) ); + ret = TRUE; + } + CFRelease( settings ); + return ret; +#else + FIXME( "no support on this platform\n" ); + return FALSE; +#endif +} + 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 @@ -2472,16 +2508,20 @@ static DWORD query_global_option(DWORD option, void *buffer, DWORD *size, BOOL u } case INTERNET_OPTION_PER_CONNECTION_OPTION: { + char url[INTERNET_MAX_URL_LENGTH + 1]; INTERNET_PER_CONN_OPTION_LISTW *con = buffer; INTERNET_PER_CONN_OPTION_LISTA *conA = buffer; DWORD res = ERROR_SUCCESS, i; proxyinfo_t pi; + BOOL have_url; LONG ret; TRACE("Getting global proxy info\n"); if((ret = INTERNET_LoadProxySettings(&pi))) return ret; + have_url = get_proxy_autoconfig_url(url, sizeof(url)); + FIXME("INTERNET_OPTION_PER_CONNECTION_OPTION stub\n"); if (*size < sizeof(INTERNET_PER_CONN_OPTION_LISTW)) { @@ -2499,6 +2539,9 @@ static DWORD query_global_option(DWORD option, void *buffer, DWORD *size, BOOL u optionW->Value.dwValue = PROXY_TYPE_PROXY; else optionW->Value.dwValue = PROXY_TYPE_DIRECT; + if (have_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: @@ -2516,7 +2559,18 @@ static DWORD query_global_option(DWORD option, void *buffer, DWORD *size, BOOL u break; case INTERNET_PER_CONN_AUTOCONFIG_URL: + if (!have_url) + optionW->Value.pszValue = NULL; + else if (unicode) + optionW->Value.pszValue = heap_strdupAtoW(url); + else + optionA->Value.pszValue = heap_strdupA(url); + break; + case INTERNET_PER_CONN_AUTODISCOVERY_FLAGS: + optionW->Value.dwValue = AUTO_PROXY_FLAG_ALWAYS_DETECT; + break; + case INTERNET_PER_CONN_AUTOCONFIG_SECONDARY_URL: case INTERNET_PER_CONN_AUTOCONFIG_RELOAD_DELAY_MINS: case INTERNET_PER_CONN_AUTOCONFIG_LAST_DETECT_TIME: -- 2.11.4.GIT