Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(170)

Side by Side Diff: net/proxy/proxy_config_service_linux.cc

Issue 6990008: LBYL on GSettings (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 9 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "net/proxy/proxy_config_service_linux.h" 5 #include "net/proxy/proxy_config_service_linux.h"
6 6
7 #include <errno.h> 7 #include <errno.h>
8 #include <fcntl.h> 8 #include <fcntl.h>
9 #if defined(USE_GCONF) 9 #if defined(USE_GCONF)
10 #include <gconf/gconf-client.h> 10 #include <gconf/gconf-client.h>
(...skipping 504 matching lines...) Expand 10 before | Expand all | Expand 10 after
515 } 515 }
516 DCHECK(!client_); 516 DCHECK(!client_);
517 #if defined(DLOPEN_GSETTINGS) 517 #if defined(DLOPEN_GSETTINGS)
518 if (gio_handle_) { 518 if (gio_handle_) {
519 dlclose(gio_handle_); 519 dlclose(gio_handle_);
520 gio_handle_ = NULL; 520 gio_handle_ = NULL;
521 } 521 }
522 #endif 522 #endif
523 } 523 }
524 524
525 bool SchemaExists(const char* schema_name) {
526 const gchar* const* schemas = g_settings_list_schemas();
527 while (*schemas) {
528 if (strcmp(schema_name, reinterpret_cast<const char*>(schemas)) == 0)
529 return true;
530 schemas++;
531 }
532 return false;
533 }
534
525 // LoadAndCheckVersion() must be called *before* Init()! 535 // LoadAndCheckVersion() must be called *before* Init()!
526 bool LoadAndCheckVersion(base::Environment* env); 536 bool LoadAndCheckVersion(base::Environment* env);
527 537
528 virtual bool Init(MessageLoop* glib_default_loop, 538 virtual bool Init(MessageLoop* glib_default_loop,
529 MessageLoopForIO* file_loop) { 539 MessageLoopForIO* file_loop) {
530 DCHECK(MessageLoop::current() == glib_default_loop); 540 DCHECK(MessageLoop::current() == glib_default_loop);
531 DCHECK(!client_); 541 DCHECK(!client_);
532 DCHECK(!loop_); 542 DCHECK(!loop_);
533 client_ = g_settings_new("org.gnome.system.proxy"); 543
534 if (!client_) { 544 if (!SchemaExists("org.gnome.system.proxy") ||
545 !(client_ = g_settings_new("org.gnome.system.proxy"))) {
535 // It's not clear whether/when this can return NULL. 546 // It's not clear whether/when this can return NULL.
536 LOG(ERROR) << "Unable to create a gsettings client"; 547 LOG(ERROR) << "Unable to create a gsettings client";
537 return false; 548 return false;
538 } 549 }
539 loop_ = glib_default_loop; 550 loop_ = glib_default_loop;
540 // We assume these all work if the above call worked. 551 // We assume these all work if the above call worked.
541 http_client_ = g_settings_get_child(client_, "http"); 552 http_client_ = g_settings_get_child(client_, "http");
542 https_client_ = g_settings_get_child(client_, "https"); 553 https_client_ = g_settings_get_child(client_, "https");
543 ftp_client_ = g_settings_get_child(client_, "ftp"); 554 ftp_client_ = g_settings_get_child(client_, "ftp");
544 socks_client_ = g_settings_get_child(client_, "socks"); 555 socks_client_ = g_settings_get_child(client_, "socks");
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after
670 // conflict both because they are identical and also due to scoping. The 681 // conflict both because they are identical and also due to scoping. The
671 // scoping will also ensure that these get used instead of the global ones. 682 // scoping will also ensure that these get used instead of the global ones.
672 struct _GSettings; 683 struct _GSettings;
673 typedef struct _GSettings GSettings; 684 typedef struct _GSettings GSettings;
674 GSettings* (*g_settings_new)(const gchar* schema); 685 GSettings* (*g_settings_new)(const gchar* schema);
675 GSettings* (*g_settings_get_child)(GSettings* settings, const gchar* name); 686 GSettings* (*g_settings_get_child)(GSettings* settings, const gchar* name);
676 gboolean (*g_settings_get_boolean)(GSettings* settings, const gchar* key); 687 gboolean (*g_settings_get_boolean)(GSettings* settings, const gchar* key);
677 gchar* (*g_settings_get_string)(GSettings* settings, const gchar* key); 688 gchar* (*g_settings_get_string)(GSettings* settings, const gchar* key);
678 gint (*g_settings_get_int)(GSettings* settings, const gchar* key); 689 gint (*g_settings_get_int)(GSettings* settings, const gchar* key);
679 gchar** (*g_settings_get_strv)(GSettings* settings, const gchar* key); 690 gchar** (*g_settings_get_strv)(GSettings* settings, const gchar* key);
691 const gchar* const* (*g_settings_list_schemas)();
680 692
681 // The library handle. 693 // The library handle.
682 void* gio_handle_; 694 void* gio_handle_;
683 695
684 // Load a symbol from |gio_handle_| and store it into |*func_ptr|. 696 // Load a symbol from |gio_handle_| and store it into |*func_ptr|.
685 bool LoadSymbol(const char* name, void** func_ptr) { 697 bool LoadSymbol(const char* name, void** func_ptr) {
686 dlerror(); 698 dlerror();
687 *func_ptr = dlsym(gio_handle_, name); 699 *func_ptr = dlsym(gio_handle_, name);
688 const char* error = dlerror(); 700 const char* error = dlerror();
689 if (error) { 701 if (error) {
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after
798 reinterpret_cast<void**>(&g_settings_new)) || 810 reinterpret_cast<void**>(&g_settings_new)) ||
799 !LoadSymbol("g_settings_get_child", 811 !LoadSymbol("g_settings_get_child",
800 reinterpret_cast<void**>(&g_settings_get_child)) || 812 reinterpret_cast<void**>(&g_settings_get_child)) ||
801 !LoadSymbol("g_settings_get_string", 813 !LoadSymbol("g_settings_get_string",
802 reinterpret_cast<void**>(&g_settings_get_string)) || 814 reinterpret_cast<void**>(&g_settings_get_string)) ||
803 !LoadSymbol("g_settings_get_boolean", 815 !LoadSymbol("g_settings_get_boolean",
804 reinterpret_cast<void**>(&g_settings_get_boolean)) || 816 reinterpret_cast<void**>(&g_settings_get_boolean)) ||
805 !LoadSymbol("g_settings_get_int", 817 !LoadSymbol("g_settings_get_int",
806 reinterpret_cast<void**>(&g_settings_get_int)) || 818 reinterpret_cast<void**>(&g_settings_get_int)) ||
807 !LoadSymbol("g_settings_get_strv", 819 !LoadSymbol("g_settings_get_strv",
808 reinterpret_cast<void**>(&g_settings_get_strv))) { 820 reinterpret_cast<void**>(&g_settings_get_strv)) ||
821 !LoadSymbol("g_settings_list_schemas",
822 reinterpret_cast<void**>(&g_settings_list_schemas))) {
809 VLOG(1) << "Cannot load gsettings API. Will fall back to gconf."; 823 VLOG(1) << "Cannot load gsettings API. Will fall back to gconf.";
810 dlclose(gio_handle_); 824 dlclose(gio_handle_);
811 gio_handle_ = NULL; 825 gio_handle_ = NULL;
812 return false; 826 return false;
813 } 827 }
814 #endif 828 #endif
815 829
816 GSettings* client = g_settings_new("org.gnome.system.proxy"); 830 GSettings* client;
817 if (!client) { 831 if (!SchemaExists("org.gnome.system.proxy") ||
832 !(client = g_settings_new("org.gnome.system.proxy"))) {
818 VLOG(1) << "Cannot create gsettings client. Will fall back to gconf."; 833 VLOG(1) << "Cannot create gsettings client. Will fall back to gconf.";
819 return false; 834 return false;
820 } 835 }
821 g_object_unref(client); 836 g_object_unref(client);
822 837
823 std::string path; 838 std::string path;
824 if (!env->GetVar("PATH", &path)) { 839 if (!env->GetVar("PATH", &path)) {
825 LOG(ERROR) << "No $PATH variable. Assuming no gnome-network-properties."; 840 LOG(ERROR) << "No $PATH variable. Assuming no gnome-network-properties.";
826 } else { 841 } else {
827 // Yes, we're on the UI thread. Yes, we're accessing the file system. 842 // Yes, we're on the UI thread. Yes, we're accessing the file system.
(...skipping 913 matching lines...) Expand 10 before | Expand all | Expand 10 after
1741 void ProxyConfigServiceLinux::RemoveObserver(Observer* observer) { 1756 void ProxyConfigServiceLinux::RemoveObserver(Observer* observer) {
1742 delegate_->RemoveObserver(observer); 1757 delegate_->RemoveObserver(observer);
1743 } 1758 }
1744 1759
1745 ProxyConfigService::ConfigAvailability 1760 ProxyConfigService::ConfigAvailability
1746 ProxyConfigServiceLinux::GetLatestProxyConfig(ProxyConfig* config) { 1761 ProxyConfigServiceLinux::GetLatestProxyConfig(ProxyConfig* config) {
1747 return delegate_->GetLatestProxyConfig(config); 1762 return delegate_->GetLatestProxyConfig(config);
1748 } 1763 }
1749 1764
1750 } // namespace net 1765 } // namespace net
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698