Chromium Code Reviews| Index: net/proxy/proxy_config_service_linux.cc |
| diff --git a/net/proxy/proxy_config_service_linux.cc b/net/proxy/proxy_config_service_linux.cc |
| index 1c8e5a367d84f5de9c47ea42f7d72cde7c0f5a6a..aaf5095c675dcbe9dd631a9eb764565479cc039a 100644 |
| --- a/net/proxy/proxy_config_service_linux.cc |
| +++ b/net/proxy/proxy_config_service_linux.cc |
| @@ -9,12 +9,6 @@ |
| #if defined(USE_GCONF) |
| #include <gconf/gconf-client.h> |
| #endif // defined(USE_GCONF) |
| -#if defined(USE_GIO) |
| -#include <gio/gio.h> |
| -#if defined(DLOPEN_GSETTINGS) |
| -#include <dlfcn.h> |
| -#endif // defined(DLOPEN_GSETTINGS) |
| -#endif // defined(USE_GIO) |
| #include <limits.h> |
| #include <stdio.h> |
| #include <stdlib.h> |
| @@ -43,6 +37,10 @@ |
| #include "net/proxy/proxy_config.h" |
| #include "net/proxy/proxy_server.h" |
| +#if defined(USE_GIO) |
| +#include "library_loaders/libgio.h" |
| +#endif // defined(USE_GIO) |
| + |
| namespace net { |
| namespace { |
| @@ -515,16 +513,6 @@ class SettingGetterImplGSettings |
| : public ProxyConfigServiceLinux::SettingGetter { |
| public: |
| SettingGetterImplGSettings() : |
| -#if defined(DLOPEN_GSETTINGS) |
| - g_settings_new(NULL), |
| - g_settings_get_child(NULL), |
| - g_settings_get_boolean(NULL), |
| - g_settings_get_string(NULL), |
| - g_settings_get_int(NULL), |
| - g_settings_get_strv(NULL), |
| - g_settings_list_schemas(NULL), |
| - gio_handle_(NULL), |
| -#endif |
| client_(NULL), |
| http_client_(NULL), |
| https_client_(NULL), |
| @@ -554,16 +542,10 @@ class SettingGetterImplGSettings |
| } |
| } |
| DCHECK(!client_); |
| -#if defined(DLOPEN_GSETTINGS) |
| - if (gio_handle_) { |
| - dlclose(gio_handle_); |
| - gio_handle_ = NULL; |
| - } |
| -#endif |
| } |
| bool SchemaExists(const char* schema_name) { |
| - const gchar* const* schemas = g_settings_list_schemas(); |
| + const gchar* const* schemas = libgio_loader_.g_settings_list_schemas(); |
| while (*schemas) { |
| if (strcmp(schema_name, static_cast<const char*>(*schemas)) == 0) |
| return true; |
| @@ -582,17 +564,17 @@ class SettingGetterImplGSettings |
| DCHECK(!task_runner_); |
| if (!SchemaExists("org.gnome.system.proxy") || |
| - !(client_ = g_settings_new("org.gnome.system.proxy"))) { |
| + !(client_ = libgio_loader_.g_settings_new("org.gnome.system.proxy"))) { |
| // It's not clear whether/when this can return NULL. |
| LOG(ERROR) << "Unable to create a gsettings client"; |
| return false; |
| } |
| task_runner_ = glib_thread_task_runner; |
| // We assume these all work if the above call worked. |
| - http_client_ = g_settings_get_child(client_, "http"); |
| - https_client_ = g_settings_get_child(client_, "https"); |
| - ftp_client_ = g_settings_get_child(client_, "ftp"); |
| - socks_client_ = g_settings_get_child(client_, "socks"); |
| + http_client_ = libgio_loader_.g_settings_get_child(client_, "http"); |
| + https_client_ = libgio_loader_.g_settings_get_child(client_, "https"); |
| + ftp_client_ = libgio_loader_.g_settings_get_child(client_, "ftp"); |
| + socks_client_ = libgio_loader_.g_settings_get_child(client_, "socks"); |
| DCHECK(http_client_ && https_client_ && ftp_client_ && socks_client_); |
| return true; |
| } |
| @@ -713,41 +695,10 @@ class SettingGetterImplGSettings |
| } |
| private: |
| -#if defined(DLOPEN_GSETTINGS) |
| - // We replicate the prototypes for the g_settings APIs we need. We may not |
| - // even be compiling on a system that has them. If we are, these won't |
| - // conflict both because they are identical and also due to scoping. The |
| - // scoping will also ensure that these get used instead of the global ones. |
| - struct _GSettings; |
| - typedef struct _GSettings GSettings; |
|
Ryan Sleevi
2012/11/28 20:38:33
It's not clear to me whether this removal is safe
Paweł Hajdan Jr.
2012/11/28 21:19:46
It will fail compile. We have trybots for that. We
Ryan Sleevi
2012/11/28 22:29:42
Considering how often you're adding flags that try
|
| - GSettings* (*g_settings_new)(const gchar* schema); |
| - GSettings* (*g_settings_get_child)(GSettings* settings, const gchar* name); |
| - gboolean (*g_settings_get_boolean)(GSettings* settings, const gchar* key); |
| - gchar* (*g_settings_get_string)(GSettings* settings, const gchar* key); |
| - gint (*g_settings_get_int)(GSettings* settings, const gchar* key); |
| - gchar** (*g_settings_get_strv)(GSettings* settings, const gchar* key); |
| - const gchar* const* (*g_settings_list_schemas)(); |
| - |
| - // The library handle. |
| - void* gio_handle_; |
| - |
| - // Load a symbol from |gio_handle_| and store it into |*func_ptr|. |
| - bool LoadSymbol(const char* name, void** func_ptr) { |
| - dlerror(); |
| - *func_ptr = dlsym(gio_handle_, name); |
| - const char* error = dlerror(); |
| - if (error) { |
| - VLOG(1) << "Unable to load symbol " << name << ": " << error; |
| - return false; |
| - } |
| - return true; |
| - } |
| -#endif // defined(DLOPEN_GSETTINGS) |
| - |
| bool GetStringByPath(GSettings* client, const char* key, |
| std::string* result) { |
| DCHECK(task_runner_->BelongsToCurrentThread()); |
| - gchar* value = g_settings_get_string(client, key); |
| + gchar* value = libgio_loader_.g_settings_get_string(client, key); |
| if (!value) |
| return false; |
| *result = value; |
| @@ -756,18 +707,19 @@ class SettingGetterImplGSettings |
| } |
| bool GetBoolByPath(GSettings* client, const char* key, bool* result) { |
| DCHECK(task_runner_->BelongsToCurrentThread()); |
| - *result = static_cast<bool>(g_settings_get_boolean(client, key)); |
| + *result = static_cast<bool>( |
| + libgio_loader_.g_settings_get_boolean(client, key)); |
| return true; |
| } |
| bool GetIntByPath(GSettings* client, const char* key, int* result) { |
| DCHECK(task_runner_->BelongsToCurrentThread()); |
| - *result = g_settings_get_int(client, key); |
| + *result = libgio_loader_.g_settings_get_int(client, key); |
| return true; |
| } |
| bool GetStringListByPath(GSettings* client, const char* key, |
| std::vector<std::string>* result) { |
| DCHECK(task_runner_->BelongsToCurrentThread()); |
| - gchar** list = g_settings_get_strv(client, key); |
| + gchar** list = libgio_loader_.g_settings_get_strv(client, key); |
| if (!list) |
| return false; |
| for (size_t i = 0; list[i]; ++i) { |
| @@ -818,6 +770,8 @@ class SettingGetterImplGSettings |
| // thread. Only for assertions. |
| scoped_refptr<base::SingleThreadTaskRunner> task_runner_; |
| + LibGioLoader libgio_loader_; |
| + |
| DISALLOW_COPY_AND_ASSIGN(SettingGetterImplGSettings); |
| }; |
| @@ -838,40 +792,16 @@ bool SettingGetterImplGSettings::LoadAndCheckVersion( |
| // but don't use gsettings for proxy settings, but they do have the old |
| // binary, so we detect these systems that way. |
| -#ifdef DLOPEN_GSETTINGS |
| - gio_handle_ = dlopen("libgio-2.0.so.0", RTLD_NOW | RTLD_GLOBAL); |
| - if (!gio_handle_) { |
| - // Try again without .0 at the end; on some systems this may be required. |
| - gio_handle_ = dlopen("libgio-2.0.so", RTLD_NOW | RTLD_GLOBAL); |
| - if (!gio_handle_) { |
| - VLOG(1) << "Cannot load gio library. Will fall back to gconf."; |
| - return false; |
| - } |
| - } |
| - if (!LoadSymbol("g_settings_new", |
| - reinterpret_cast<void**>(&g_settings_new)) || |
| - !LoadSymbol("g_settings_get_child", |
| - reinterpret_cast<void**>(&g_settings_get_child)) || |
| - !LoadSymbol("g_settings_get_string", |
| - reinterpret_cast<void**>(&g_settings_get_string)) || |
| - !LoadSymbol("g_settings_get_boolean", |
| - reinterpret_cast<void**>(&g_settings_get_boolean)) || |
| - !LoadSymbol("g_settings_get_int", |
| - reinterpret_cast<void**>(&g_settings_get_int)) || |
| - !LoadSymbol("g_settings_get_strv", |
| - reinterpret_cast<void**>(&g_settings_get_strv)) || |
| - !LoadSymbol("g_settings_list_schemas", |
| - reinterpret_cast<void**>(&g_settings_list_schemas))) { |
| - VLOG(1) << "Cannot load gsettings API. Will fall back to gconf."; |
| - dlclose(gio_handle_); |
| - gio_handle_ = NULL; |
| + // Try also without .0 at the end; on some systems this may be required. |
| + if (!libgio_loader_.Load("libgio-2.0.so.0") && |
| + !libgio_loader_.Load("libgio-2.0.so")) { |
| + VLOG(1) << "Cannot load gio library. Will fall back to gconf."; |
| return false; |
| } |
| -#endif |
| GSettings* client; |
| if (!SchemaExists("org.gnome.system.proxy") || |
| - !(client = g_settings_new("org.gnome.system.proxy"))) { |
| + !(client = libgio_loader_.g_settings_new("org.gnome.system.proxy"))) { |
| VLOG(1) << "Cannot create gsettings client. Will fall back to gconf."; |
| return false; |
| } |