Jacek Caban : urlmon: Added UrlMkSetSessionOption(URLMON_OPTION_USERAGENT) implementation.
Alexandre Julliard
julliard at winehq.org
Mon Jun 29 09:17:38 CDT 2009
Module: wine
Branch: master
Commit: 1880de044c615e9fa344f88f37b8dd423702214d
URL: http://source.winehq.org/git/wine.git/?a=commit;h=1880de044c615e9fa344f88f37b8dd423702214d
Author: Jacek Caban <jacek at codeweavers.com>
Date: Sat Jun 27 00:31:39 2009 +0200
urlmon: Added UrlMkSetSessionOption(URLMON_OPTION_USERAGENT) implementation.
---
dlls/urlmon/session.c | 77 ++++++++++++++++++++++++++++++++++++++++----
dlls/urlmon/urlmon_main.c | 1 +
dlls/urlmon/urlmon_main.h | 1 +
3 files changed, 72 insertions(+), 7 deletions(-)
diff --git a/dlls/urlmon/session.c b/dlls/urlmon/session.c
index 933202c..60402ad 100644
--- a/dlls/urlmon/session.c
+++ b/dlls/urlmon/session.c
@@ -52,6 +52,13 @@ static CRITICAL_SECTION_DEBUG session_cs_dbg =
};
static CRITICAL_SECTION session_cs = { &session_cs_dbg, -1, 0, 0, 0, 0 };
+static const WCHAR internet_settings_keyW[] =
+ {'S','O','F','T','W','A','R','E',
+ '\\','M','i','c','r','o','s','o','f','t',
+ '\\','W','i','n','d','o','w','s',
+ '\\','C','u','r','r','e','n','t','V','e','r','s','i','o','n',
+ '\\','I','n','t','e','r','n','e','t',' ','S','e','t','t','i','n','g','s',0};
+
static name_space *find_name_space(LPCWSTR protocol)
{
name_space *iter;
@@ -482,15 +489,9 @@ static BOOL get_url_encoding(HKEY root, DWORD *encoding)
DWORD size = sizeof(DWORD), res, type;
HKEY hkey;
- static const WCHAR wszKeyName[] =
- {'S','O','F','T','W','A','R','E',
- '\\','M','i','c','r','o','s','o','f','t',
- '\\','W','i','n','d','o','w','s',
- '\\','C','u','r','r','e','n','t','V','e','r','s','i','o','n',
- '\\','I','n','t','e','r','n','e','t',' ','S','e','t','t','i','n','g','s',0};
static const WCHAR wszUrlEncoding[] = {'U','r','l','E','n','c','o','d','i','n','g',0};
- res = RegOpenKeyW(root, wszKeyName, &hkey);
+ res = RegOpenKeyW(root, internet_settings_keyW, &hkey);
if(res != ERROR_SUCCESS)
return FALSE;
@@ -500,6 +501,37 @@ static BOOL get_url_encoding(HKEY root, DWORD *encoding)
return res == ERROR_SUCCESS;
}
+static LPWSTR user_agent;
+
+static void ensure_useragent(void)
+{
+ DWORD size = sizeof(DWORD), res, type;
+ HKEY hkey;
+
+ static const WCHAR user_agentW[] = {'U','s','e','r',' ','A','g','e','n','t',0};
+
+ if(user_agent)
+ return;
+
+ res = RegOpenKeyW(HKEY_CURRENT_USER, internet_settings_keyW, &hkey);
+ if(res != ERROR_SUCCESS)
+ return;
+
+ res = RegQueryValueExW(hkey, user_agentW, NULL, &type, NULL, &size);
+ if(res == ERROR_SUCCESS && type == REG_SZ) {
+ user_agent = heap_alloc(size);
+ res = RegQueryValueExW(hkey, user_agentW, NULL, &type, (LPBYTE)user_agent, &size);
+ if(res != ERROR_SUCCESS) {
+ heap_free(user_agent);
+ user_agent = NULL;
+ }
+ }else {
+ WARN("Could not find User Agent value: %u\n", res);
+ }
+
+ RegCloseKey(hkey);
+}
+
HRESULT WINAPI UrlMkGetSessionOption(DWORD dwOption, LPVOID pBuffer, DWORD dwBufferLength,
DWORD* pdwBufferLength, DWORD dwReserved)
{
@@ -509,6 +541,32 @@ HRESULT WINAPI UrlMkGetSessionOption(DWORD dwOption, LPVOID pBuffer, DWORD dwBuf
WARN("dwReserved = %d\n", dwReserved);
switch(dwOption) {
+ case URLMON_OPTION_USERAGENT: {
+ HRESULT hres = E_OUTOFMEMORY;
+ DWORD size;
+
+ if(!pdwBufferLength)
+ return E_INVALIDARG;
+
+ EnterCriticalSection(&session_cs);
+
+ ensure_useragent();
+ if(user_agent) {
+ size = WideCharToMultiByte(CP_ACP, 0, user_agent, -1, NULL, 0, NULL, NULL);
+ *pdwBufferLength = size;
+ if(size <= dwBufferLength) {
+ if(pBuffer)
+ WideCharToMultiByte(CP_ACP, 0, user_agent, -1, pBuffer, size, NULL, NULL);
+ else
+ hres = E_INVALIDARG;
+ }
+ }
+
+ LeaveCriticalSection(&session_cs);
+
+ /* Tests prove that we have to return E_OUTOFMEMORY on success. */
+ return hres;
+ }
case URLMON_OPTION_URL_ENCODING: {
DWORD encoding = 0;
@@ -528,3 +586,8 @@ HRESULT WINAPI UrlMkGetSessionOption(DWORD dwOption, LPVOID pBuffer, DWORD dwBuf
return E_INVALIDARG;
}
+
+void free_session(void)
+{
+ heap_free(user_agent);
+}
diff --git a/dlls/urlmon/urlmon_main.c b/dlls/urlmon/urlmon_main.c
index 6e51db5..62fe4ec 100644
--- a/dlls/urlmon/urlmon_main.c
+++ b/dlls/urlmon/urlmon_main.c
@@ -139,6 +139,7 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID fImpLoad)
FreeLibrary(hCabinet);
hCabinet = NULL;
init_session(FALSE);
+ free_session();
free_tls_list();
URLMON_hInstance = 0;
break;
diff --git a/dlls/urlmon/urlmon_main.h b/dlls/urlmon/urlmon_main.h
index e5501e0..1b5d8d5 100644
--- a/dlls/urlmon/urlmon_main.h
+++ b/dlls/urlmon/urlmon_main.h
@@ -63,6 +63,7 @@ HRESULT get_protocol_handler(LPCWSTR,CLSID*,BOOL*,IClassFactory**);
IInternetProtocol *get_mime_filter(LPCWSTR);
BOOL is_registered_protocol(LPCWSTR);
void register_urlmon_namespace(IClassFactory*,REFIID,LPCWSTR,BOOL);
+void free_session(void);
HRESULT bind_to_storage(LPCWSTR url, IBindCtx *pbc, REFIID riid, void **ppv);
HRESULT bind_to_object(IMoniker *mon, LPCWSTR url, IBindCtx *pbc, REFIID riid, void **ppv);
More information about the wine-cvs
mailing list