Juan Lang : wininet: Implement setting proxy options globally for a process .
Alexandre Julliard
julliard at winehq.org
Fri Jul 22 10:15:57 CDT 2011
Module: wine
Branch: master
Commit: cfdce43de93bf66a126a297f85721a4e42b24755
URL: http://source.winehq.org/git/wine.git/?a=commit;h=cfdce43de93bf66a126a297f85721a4e42b24755
Author: Juan Lang <juan.lang at gmail.com>
Date: Thu Jul 21 13:17:21 2011 -0700
wininet: Implement setting proxy options globally for a process.
---
dlls/wininet/internet.c | 67 ++++++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 66 insertions(+), 1 deletions(-)
diff --git a/dlls/wininet/internet.c b/dlls/wininet/internet.c
index 90dd27e..c949f5d 100644
--- a/dlls/wininet/internet.c
+++ b/dlls/wininet/internet.c
@@ -498,10 +498,24 @@ static void FreeProxyInfo( proxyinfo_t *lpwpi )
heap_free(lpwpi->proxyBypass);
}
+static proxyinfo_t *global_proxy;
+
+static void free_global_proxy( void )
+{
+ EnterCriticalSection( &WININET_cs );
+ if (global_proxy)
+ {
+ FreeProxyInfo( global_proxy );
+ heap_free( global_proxy );
+ }
+ LeaveCriticalSection( &WININET_cs );
+}
+
/***********************************************************************
* INTERNET_LoadProxySettings
*
- * Loads proxy information from the registry or environment into lpwpi.
+ * Loads proxy information from process-wide global settings, the registry,
+ * or the environment into lpwpi.
*
* The caller should call FreeProxyInfo when done with lpwpi.
*
@@ -516,6 +530,15 @@ static LONG INTERNET_LoadProxySettings( proxyinfo_t *lpwpi )
LPCSTR envproxy;
LONG ret;
+ EnterCriticalSection( &WININET_cs );
+ if (global_proxy)
+ {
+ lpwpi->proxyEnabled = global_proxy->proxyEnabled;
+ lpwpi->proxy = heap_strdupW( global_proxy->proxy );
+ lpwpi->proxyBypass = heap_strdupW( global_proxy->proxyBypass );
+ }
+ LeaveCriticalSection( &WININET_cs );
+
if ((ret = RegOpenKeyW( HKEY_CURRENT_USER, szInternetSettings, &key )))
return ret;
@@ -2538,6 +2561,48 @@ BOOL WINAPI InternetSetOptionW(HINTERNET hInternet, DWORD dwOption,
lpwhh->ErrorMask = *(ULONG*)lpBuffer;
}
break;
+ case INTERNET_OPTION_PROXY:
+ {
+ INTERNET_PROXY_INFOW *info = lpBuffer;
+
+ if (!lpBuffer || dwBufferLength < sizeof(INTERNET_PROXY_INFOW))
+ {
+ SetLastError(ERROR_INVALID_PARAMETER);
+ return FALSE;
+ }
+ if (!hInternet)
+ {
+ EnterCriticalSection( &WININET_cs );
+ free_global_proxy();
+ global_proxy = heap_alloc( sizeof(proxyinfo_t) );
+ if (global_proxy)
+ {
+ if (info->dwAccessType == INTERNET_OPEN_TYPE_PROXY)
+ {
+ global_proxy->proxyEnabled = 1;
+ global_proxy->proxy = heap_strdupW( info->lpszProxy );
+ global_proxy->proxyBypass = heap_strdupW( info->lpszProxyBypass );
+ }
+ else
+ {
+ global_proxy->proxyEnabled = 0;
+ global_proxy->proxy = global_proxy->proxyBypass = NULL;
+ }
+ }
+ LeaveCriticalSection( &WININET_cs );
+ }
+ else
+ {
+ /* In general, each type of object should handle
+ * INTERNET_OPTION_PROXY directly. This FIXME ensures it doesn't
+ * get silently dropped.
+ */
+ FIXME("INTERNET_OPTION_PROXY unimplemented\n");
+ SetLastError(ERROR_INTERNET_INVALID_OPTION);
+ ret = FALSE;
+ }
+ break;
+ }
case INTERNET_OPTION_CODEPAGE:
{
ULONG codepage = *(ULONG *)lpBuffer;
More information about the wine-cvs
mailing list