| 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;
|
| - 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;
|
| }
|
|
|