[evolution-data-server] Bug #655728 - Read proxy settings from GSettings since Gnome 3
- From: Milan Crha <mcrha src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evolution-data-server] Bug #655728 - Read proxy settings from GSettings since Gnome 3
- Date: Tue, 6 Sep 2011 15:36:22 +0000 (UTC)
commit 079197de6a5434e1c36010404ce1bba377a8ab71
Author: Milan Crha <mcrha redhat com>
Date: Tue Sep 6 17:35:03 2011 +0200
Bug #655728 - Read proxy settings from GSettings since Gnome 3
libedataserver/e-proxy.c | 493 +++++++++++++++++++++++++++++++++------------
1 files changed, 361 insertions(+), 132 deletions(-)
---
diff --git a/libedataserver/e-proxy.c b/libedataserver/e-proxy.c
index 19bde39..83260be 100644
--- a/libedataserver/e-proxy.c
+++ b/libedataserver/e-proxy.c
@@ -75,32 +75,33 @@ enum ProxyType {
#define KEY_GCONF_EVO_SOCKS_PORT PATH_GCONF_EVO_NETWORK_CONFIG "/socks_port"
#define KEY_GCONF_EVO_AUTOCONFIG_URL PATH_GCONF_EVO_NETWORK_CONFIG "/autoconfig_url"
-#define PATH_GCONF_SYS_PROXY "/system/proxy"
-#define PATH_GCONF_SYS_HTTP_PROXY "/system/http_proxy"
-
-#define KEY_GCONF_SYS_USE_HTTP_PROXY PATH_GCONF_SYS_HTTP_PROXY "/use_http_proxy"
-#define KEY_GCONF_SYS_HTTP_HOST PATH_GCONF_SYS_HTTP_PROXY "/host"
-#define KEY_GCONF_SYS_HTTP_PORT PATH_GCONF_SYS_HTTP_PROXY "/port"
-#define KEY_GCONF_SYS_HTTP_USE_AUTH PATH_GCONF_SYS_HTTP_PROXY "/use_authentication"
-#define KEY_GCONF_SYS_HTTP_AUTH_USER PATH_GCONF_SYS_HTTP_PROXY "/authentication_user"
-#define KEY_GCONF_SYS_HTTP_AUTH_PWD PATH_GCONF_SYS_HTTP_PROXY "/authentication_password"
-#define KEY_GCONF_SYS_HTTP_IGNORE_HOSTS PATH_GCONF_SYS_HTTP_PROXY "/ignore_hosts"
-#define KEY_GCONF_SYS_HTTPS_HOST PATH_GCONF_SYS_PROXY "/secure_host"
-#define KEY_GCONF_SYS_HTTPS_PORT PATH_GCONF_SYS_PROXY "/secure_port"
-#define KEY_GCONF_SYS_SOCKS_HOST PATH_GCONF_SYS_PROXY "/socks_host"
-#define KEY_GCONF_SYS_SOCKS_PORT PATH_GCONF_SYS_PROXY "/socks_port"
-#define KEY_GCONF_SYS_AUTOCONFIG_URL PATH_GCONF_SYS_PROXY "/autoconfig_url"
-#define KEY_GCONF_SYS_MODE PATH_GCONF_SYS_PROXY "/mode"
-
-#define RIGHT_KEY(sufix) (priv->type == PROXY_TYPE_SYSTEM ? KEY_GCONF_SYS_ ## sufix : KEY_GCONF_EVO_ ## sufix)
+typedef enum {
+ E_PROXY_KEY_MODE,
+ E_PROXY_KEY_USE_HTTP_PROXY,
+ E_PROXY_KEY_HTTP_HOST,
+ E_PROXY_KEY_HTTP_PORT,
+ E_PROXY_KEY_HTTP_USE_AUTH,
+ E_PROXY_KEY_HTTP_AUTH_USER,
+ E_PROXY_KEY_HTTP_AUTH_PWD,
+ E_PROXY_KEY_HTTP_IGNORE_HOSTS,
+ E_PROXY_KEY_HTTPS_HOST,
+ E_PROXY_KEY_HTTPS_PORT,
+ E_PROXY_KEY_SOCKS_HOST,
+ E_PROXY_KEY_SOCKS_PORT,
+ E_PROXY_KEY_AUTOCONFIG_URL
+} EProxyKey;
struct _EProxyPrivate {
SoupURI *uri_http, *uri_https;
- guint notify_id_evo, notify_id_sys, notify_id_sys_http; /* conxn id of gconf_client_notify_add */
+ guint notify_id_evo; /* conxn id of gconf_client_notify_add */
GSList * ign_hosts; /* List of hostnames. (Strings) */
GSList * ign_addrs; /* List of hostaddrs. (ProxyHostAddrs) */
gboolean use_proxy; /* Is our-proxy enabled? */
enum ProxyType type;
+ GSettings *proxy_settings;
+ GSettings *proxy_http_settings;
+ GSettings *proxy_https_settings;
+ GSettings *proxy_socks_settings;
};
/* Enum definition is copied from gnome-vfs/modules/http-proxy.c */
@@ -148,83 +149,167 @@ ep_free_proxy_host_addr (ProxyHostAddr *host)
}
}
-static void
-e_proxy_dispose (GObject *object)
+static gboolean
+ep_read_key_boolean (EProxy *proxy, EProxyKey key, GConfClient *client)
{
- EProxyPrivate *priv;
- GConfClient * client;
-
- priv = E_PROXY (object)->priv;
+ gboolean res = FALSE;
- client = gconf_client_get_default ();
+ g_return_val_if_fail (proxy != NULL, FALSE);
+ g_return_val_if_fail (E_IS_PROXY (proxy), FALSE);
+ g_return_val_if_fail (proxy->priv != NULL, FALSE);
- if (priv->notify_id_evo > 0) {
- gconf_client_notify_remove (client, priv->notify_id_evo);
- priv->notify_id_evo = 0;
+ switch (key) {
+ case E_PROXY_KEY_USE_HTTP_PROXY:
+ if (proxy->priv->type == PROXY_TYPE_SYSTEM)
+ /* it's not used in the UI, thus behave like always set to TRUE */
+ res = TRUE; /* g_settings_get_boolean (proxy->priv->proxy_http_settings, "enabled"); */
+ else
+ res = gconf_client_get_bool (client, KEY_GCONF_EVO_USE_HTTP_PROXY, NULL);
+ break;
+ case E_PROXY_KEY_HTTP_USE_AUTH:
+ if (proxy->priv->type == PROXY_TYPE_SYSTEM)
+ res = g_settings_get_boolean (proxy->priv->proxy_http_settings, "use-authentication");
+ else
+ res = gconf_client_get_bool (client, KEY_GCONF_EVO_HTTP_USE_AUTH, NULL);
+ break;
+ default:
+ g_warn_if_reached ();
+ break;
}
- if (priv->notify_id_sys > 0) {
- gconf_client_notify_remove (client, priv->notify_id_sys);
- priv->notify_id_sys = 0;
- }
+ return res;
+}
- if (priv->notify_id_sys_http > 0) {
- gconf_client_notify_remove (client, priv->notify_id_sys_http);
- priv->notify_id_sys_http = 0;
- }
+static gint
+ep_read_key_int (EProxy *proxy, EProxyKey key, GConfClient *client)
+{
+ gint res = 0;
- g_object_unref (client);
+ g_return_val_if_fail (proxy != NULL, 0);
+ g_return_val_if_fail (E_IS_PROXY (proxy), 0);
+ g_return_val_if_fail (proxy->priv != NULL, 0);
- if (priv->uri_http)
- soup_uri_free (priv->uri_http);
+ switch (key) {
+ case E_PROXY_KEY_HTTP_PORT:
+ if (proxy->priv->type == PROXY_TYPE_SYSTEM)
+ res = g_settings_get_int (proxy->priv->proxy_http_settings, "port");
+ else
+ res = gconf_client_get_int (client, KEY_GCONF_EVO_HTTP_PORT, NULL);
+ break;
+ case E_PROXY_KEY_HTTPS_PORT:
+ if (proxy->priv->type == PROXY_TYPE_SYSTEM)
+ res = g_settings_get_int (proxy->priv->proxy_https_settings, "port");
+ else
+ res = gconf_client_get_int (client, KEY_GCONF_EVO_HTTPS_PORT, NULL);
+ break;
+ case E_PROXY_KEY_SOCKS_PORT:
+ if (proxy->priv->type == PROXY_TYPE_SYSTEM)
+ res = g_settings_get_int (proxy->priv->proxy_socks_settings, "port");
+ else
+ res = gconf_client_get_int (client, KEY_GCONF_EVO_SOCKS_PORT, NULL);
+ break;
+ default:
+ g_warn_if_reached ();
+ break;
+ }
- if (priv->uri_https)
- soup_uri_free (priv->uri_https);
+ return res;
+}
- g_slist_foreach (priv->ign_hosts, (GFunc) g_free, NULL);
- g_slist_free (priv->ign_hosts);
+/* free returned pointer with g_free() */
+static gchar *
+ep_read_key_string (EProxy *proxy, EProxyKey key, GConfClient *client)
+{
+ gchar *res = NULL;
- g_slist_foreach (priv->ign_addrs, (GFunc) ep_free_proxy_host_addr, NULL);
- g_slist_free (priv->ign_addrs);
+ g_return_val_if_fail (proxy != NULL, NULL);
+ g_return_val_if_fail (E_IS_PROXY (proxy), NULL);
+ g_return_val_if_fail (proxy->priv != NULL, NULL);
- /* Chain up to parent's dispose() method. */
- G_OBJECT_CLASS (e_proxy_parent_class)->dispose (object);
+ switch (key) {
+ case E_PROXY_KEY_MODE:
+ if (proxy->priv->type == PROXY_TYPE_SYSTEM)
+ res = g_settings_get_string (proxy->priv->proxy_settings, "mode");
+ else
+ g_warn_if_reached ();
+ break;
+ case E_PROXY_KEY_HTTP_HOST:
+ if (proxy->priv->type == PROXY_TYPE_SYSTEM)
+ res = g_settings_get_string (proxy->priv->proxy_http_settings, "host");
+ else
+ res = gconf_client_get_string (client, KEY_GCONF_EVO_HTTP_HOST, NULL);
+ break;
+ case E_PROXY_KEY_HTTPS_HOST:
+ if (proxy->priv->type == PROXY_TYPE_SYSTEM)
+ res = g_settings_get_string (proxy->priv->proxy_https_settings, "host");
+ else
+ res = gconf_client_get_string (client, KEY_GCONF_EVO_HTTPS_HOST, NULL);
+ break;
+ case E_PROXY_KEY_SOCKS_HOST:
+ if (proxy->priv->type == PROXY_TYPE_SYSTEM)
+ res = g_settings_get_string (proxy->priv->proxy_socks_settings, "host");
+ else
+ res = gconf_client_get_string (client, KEY_GCONF_EVO_SOCKS_HOST, NULL);
+ break;
+ case E_PROXY_KEY_HTTP_AUTH_USER:
+ if (proxy->priv->type == PROXY_TYPE_SYSTEM)
+ res = g_settings_get_string (proxy->priv->proxy_http_settings, "authentication-user");
+ else
+ res = gconf_client_get_string (client, KEY_GCONF_EVO_HTTP_AUTH_USER, NULL);
+ break;
+ case E_PROXY_KEY_HTTP_AUTH_PWD:
+ if (proxy->priv->type == PROXY_TYPE_SYSTEM)
+ res = g_settings_get_string (proxy->priv->proxy_http_settings, "authentication-password");
+ else
+ res = gconf_client_get_string (client, KEY_GCONF_EVO_HTTP_AUTH_PWD, NULL);
+ break;
+ case E_PROXY_KEY_AUTOCONFIG_URL:
+ if (proxy->priv->type == PROXY_TYPE_SYSTEM)
+ res = g_settings_get_string (proxy->priv->proxy_settings, "autoconfig-url");
+ else
+ res = gconf_client_get_string (client, KEY_GCONF_EVO_AUTOCONFIG_URL, NULL);
+ break;
+ default:
+ g_warn_if_reached ();
+ break;
+ }
+
+ return res;
}
-static void
-e_proxy_class_init (EProxyClass *class)
+/* list of newly allocated strings, use g_free() for each member and free list itself too */
+static GSList *
+ep_read_key_list (EProxy *proxy, EProxyKey key, GConfClient *client)
{
- GObjectClass *object_class;
+ GSList *res = NULL;
- g_type_class_add_private (class, sizeof (EProxyPrivate));
+ g_return_val_if_fail (proxy != NULL, NULL);
+ g_return_val_if_fail (E_IS_PROXY (proxy), NULL);
+ g_return_val_if_fail (proxy->priv != NULL, NULL);
- object_class = G_OBJECT_CLASS (class);
- object_class->dispose = e_proxy_dispose;
+ switch (key) {
+ case E_PROXY_KEY_HTTP_IGNORE_HOSTS:
+ if (proxy->priv->type == PROXY_TYPE_SYSTEM) {
+ gchar **strv;
+ gint ii;
- /**
- * EProxy::changed:
- * @proxy: the #EProxy which emitted the signal
- *
- * Emitted when proxy settings in gconf changes.
- **/
- signals[CHANGED] = g_signal_new (
- "changed",
- G_OBJECT_CLASS_TYPE (object_class),
- G_SIGNAL_RUN_FIRST,
- G_STRUCT_OFFSET (EProxyClass, changed),
- NULL, NULL,
- g_cclosure_marshal_VOID__VOID,
- G_TYPE_NONE, 0);
+ strv = g_settings_get_strv (proxy->priv->proxy_settings, "ignore-hosts");
+ for (ii = 0; strv && strv[ii]; ii++) {
+ res = g_slist_prepend (res, g_strdup (strv[ii]));
+ }
-}
+ g_strfreev (strv);
-static void
-e_proxy_init (EProxy *proxy)
-{
- proxy->priv = G_TYPE_INSTANCE_GET_PRIVATE (
- proxy, E_TYPE_PROXY, EProxyPrivate);
+ res = g_slist_reverse (res);
+ } else
+ res = gconf_client_get_list (client, KEY_GCONF_EVO_HTTP_IGNORE_HOSTS, GCONF_VALUE_STRING, NULL);
+ break;
+ default:
+ g_warn_if_reached ();
+ break;
+ }
- proxy->priv->type = PROXY_TYPE_SYSTEM;
+ return res;
}
static gboolean
@@ -526,6 +611,14 @@ ep_change_uri (SoupURI **soup_uri,
} else if (*soup_uri) {
gchar *old = soup_uri_to_string (*soup_uri, FALSE);
+ if (old && *old) {
+ gint len = strlen (old);
+
+ /* remove ending slash, if there */
+ if (old[len - 1] == '/')
+ old[len - 1] = 0;
+ }
+
changed = old && uri && g_ascii_strcasecmp (old, uri) != 0;
if (changed) {
soup_uri_free (*soup_uri);
@@ -578,15 +671,14 @@ update_proxy_uri (const gchar *uri,
}
static void
-ep_set_proxy (GConfClient *client,
- gpointer user_data,
+ep_set_proxy (EProxy *proxy,
gboolean regen_ign_host_list)
{
gchar *proxy_server, *uri_http = NULL, *uri_https = NULL;
gint proxy_port, old_type;
- EProxy * proxy = (EProxy *) user_data;
EProxyPrivate * priv = proxy->priv;
GSList *ignore;
+ GConfClient *client = gconf_client_get_default ();
gboolean changed = FALSE, sys_manual = TRUE;
old_type = priv->type;
@@ -596,7 +688,7 @@ ep_set_proxy (GConfClient *client,
changed = priv->type != old_type;
if (priv->type == PROXY_TYPE_SYSTEM) {
- gchar *mode = gconf_client_get_string (client, KEY_GCONF_SYS_MODE, NULL);
+ gchar *mode = ep_read_key_string (proxy, E_PROXY_KEY_MODE, client);
/* supporting only manual system proxy setting */
sys_manual = mode && g_str_equal (mode, "manual");
@@ -604,32 +696,36 @@ ep_set_proxy (GConfClient *client,
g_free (mode);
}
- priv->use_proxy = gconf_client_get_bool (client, RIGHT_KEY (USE_HTTP_PROXY), NULL);
+ priv->use_proxy = ep_read_key_boolean (proxy, E_PROXY_KEY_USE_HTTP_PROXY, client);
if (!priv->use_proxy || priv->type == PROXY_TYPE_NO_PROXY || !sys_manual) {
changed = ep_change_uri (&priv->uri_http, NULL) || changed;
changed = ep_change_uri (&priv->uri_https, NULL) || changed;
goto emit_signal;
}
- proxy_server = gconf_client_get_string (client, RIGHT_KEY (HTTP_HOST), NULL);
- proxy_port = gconf_client_get_int (client, RIGHT_KEY (HTTP_PORT), NULL);
- if (proxy_server != NULL && *proxy_server && !g_ascii_isspace (*proxy_server))
- uri_http = g_strdup_printf (
- "http://%s:%d", proxy_server, proxy_port);
- else
+ proxy_server = ep_read_key_string (proxy, E_PROXY_KEY_HTTP_HOST, client);
+ proxy_port = ep_read_key_int (proxy, E_PROXY_KEY_HTTP_PORT, client);
+ if (proxy_server != NULL && *proxy_server && !g_ascii_isspace (*proxy_server)) {
+ if (proxy_port > 0)
+ uri_http = g_strdup_printf ("http://%s:%d", proxy_server, proxy_port);
+ else
+ uri_http = g_strdup_printf ("http://%s", proxy_server);
+ } else
uri_http = NULL;
g_free (proxy_server);
d(g_print ("ep_set_proxy: uri_http: %s\n", uri_http));
- proxy_server = gconf_client_get_string (client, RIGHT_KEY (HTTPS_HOST), NULL);
- proxy_port = gconf_client_get_int (client, RIGHT_KEY (HTTPS_PORT), NULL);
- if (proxy_server != NULL && *proxy_server && !g_ascii_isspace (*proxy_server))
- uri_https = g_strdup_printf (
- "https://%s:%d", proxy_server, proxy_port);
- else
+ proxy_server = ep_read_key_string (proxy, E_PROXY_KEY_HTTPS_HOST, client);
+ proxy_port = ep_read_key_int (proxy, E_PROXY_KEY_HTTPS_PORT, client);
+ if (proxy_server != NULL && *proxy_server && !g_ascii_isspace (*proxy_server)) {
+ if (proxy_port > 0)
+ uri_https = g_strdup_printf ("https://%s:%d", proxy_server, proxy_port);
+ else
+ uri_https = g_strdup_printf ("https://%s", proxy_server);
+ } else
uri_https = NULL;
g_free (proxy_server);
- d(g_print ("ep_set_proxy: uri_http: %s\n", uri_http));
+ d(g_print ("ep_set_proxy: uri_https: %s\n", uri_https));
if (regen_ign_host_list) {
if (priv->ign_hosts) {
@@ -644,7 +740,7 @@ ep_set_proxy (GConfClient *client,
priv->ign_addrs = NULL;
}
- ignore = gconf_client_get_list (client, RIGHT_KEY (HTTP_IGNORE_HOSTS), GCONF_VALUE_STRING, NULL);
+ ignore = ep_read_key_list (proxy, E_PROXY_KEY_HTTP_IGNORE_HOSTS, client);
if (ignore) {
g_slist_foreach (ignore, (GFunc) ep_parse_ignore_host, proxy);
g_slist_foreach (ignore, (GFunc) g_free, NULL);
@@ -652,11 +748,11 @@ ep_set_proxy (GConfClient *client,
}
}
- if (gconf_client_get_bool (client, RIGHT_KEY (HTTP_USE_AUTH), NULL)) {
+ if (ep_read_key_boolean (proxy, E_PROXY_KEY_HTTP_USE_AUTH, client)) {
gchar *proxy_user, *proxy_pw, *tmp = NULL, *tmps = NULL;
- proxy_user = gconf_client_get_string (client, RIGHT_KEY (HTTP_AUTH_USER), NULL);
- proxy_pw = gconf_client_get_string (client, RIGHT_KEY (HTTP_AUTH_PWD), NULL);
+ proxy_user = ep_read_key_string (proxy, E_PROXY_KEY_HTTP_AUTH_USER, client);
+ proxy_pw = ep_read_key_string (proxy, E_PROXY_KEY_HTTP_AUTH_PWD, client);
if (uri_http && proxy_user && *proxy_user) {
tmp = uri_http;
@@ -676,16 +772,15 @@ ep_set_proxy (GConfClient *client,
changed = ep_change_uri (&priv->uri_http, uri_http) || changed;
changed = ep_change_uri (&priv->uri_https, uri_https) || changed;
- d(g_print ("system-proxy: uri_http: %s; uri_https: %s\n", uri_http ? uri_http : "[null]", uri_https ? uri_https : "[null]"));
emit_signal:
+ d(g_print ("%s: changed:%d uri_http: %s; uri_https: %s\n", G_STRFUNC, changed ? 1 : 0, uri_http ? uri_http : "[null]", uri_https ? uri_https : "[null]"));
if (changed)
g_signal_emit (proxy, signals[CHANGED], 0);
g_free (uri_http);
g_free (uri_https);
-
- return;
+ g_object_unref (client);
}
static void
@@ -705,39 +800,186 @@ ep_setting_changed (GConfClient *client,
key = gconf_entry_get_key (entry);
if (g_str_equal (key, KEY_GCONF_EVO_PROXY_TYPE)) {
- ep_set_proxy (client, user_data, FALSE);
+ ep_set_proxy (user_data, FALSE);
d(g_print ("e-proxy.c:ep_settings_changed: proxy type changed\n"));
- } else if (g_str_equal (key, RIGHT_KEY (USE_HTTP_PROXY)) ||
- g_str_equal (key, RIGHT_KEY (HTTP_IGNORE_HOSTS)) ||
- g_str_equal (key, RIGHT_KEY (HTTP_HOST)) ||
- g_str_equal (key, RIGHT_KEY (HTTP_PORT))) {
+ } else if (priv->type == PROXY_TYPE_SYSTEM) {
+ return;
+ }
+
+ if (g_str_equal (key, KEY_GCONF_EVO_USE_HTTP_PROXY) ||
+ g_str_equal (key, KEY_GCONF_EVO_HTTP_IGNORE_HOSTS) ||
+ g_str_equal (key, KEY_GCONF_EVO_HTTP_HOST) ||
+ g_str_equal (key, KEY_GCONF_EVO_HTTP_PORT)) {
gboolean regen_ign_host_list = FALSE;
- if (g_str_equal (key, RIGHT_KEY (HTTP_IGNORE_HOSTS)))
+ if (g_str_equal (key, KEY_GCONF_EVO_HTTP_IGNORE_HOSTS))
regen_ign_host_list = TRUE;
- ep_set_proxy (client, user_data, regen_ign_host_list);
+ ep_set_proxy (proxy, regen_ign_host_list);
d(g_print ("e-proxy.c:ep_settings_changed: proxy settings changed\n"));
- } else if (g_str_equal (key, RIGHT_KEY (HTTP_AUTH_USER)) ||
- g_str_equal (key, RIGHT_KEY (HTTP_AUTH_PWD)) ||
- g_str_equal (key, RIGHT_KEY (HTTP_USE_AUTH))) {
+ } else if (g_str_equal (key, KEY_GCONF_EVO_HTTP_AUTH_USER) ||
+ g_str_equal (key, KEY_GCONF_EVO_HTTP_AUTH_PWD) ||
+ g_str_equal (key, KEY_GCONF_EVO_HTTP_USE_AUTH)) {
- ep_set_proxy (client, user_data, FALSE);
+ ep_set_proxy (proxy, FALSE);
d(g_print ("e-proxy.c:ep_settings_changed: auth settings changed\n"));
- } else if (g_str_equal (key, RIGHT_KEY (HTTPS_HOST)) ||
- g_str_equal (key, RIGHT_KEY (HTTPS_PORT))) {
+ } else if (g_str_equal (key, KEY_GCONF_EVO_HTTPS_HOST) ||
+ g_str_equal (key, KEY_GCONF_EVO_HTTPS_PORT)) {
- ep_set_proxy (client, user_data, FALSE);
+ ep_set_proxy (proxy, FALSE);
d(g_print ("e-proxy.c:ep_settings_changed: https\n"));
- } else if (g_str_equal (key, RIGHT_KEY (SOCKS_HOST)) ||
- g_str_equal (key, RIGHT_KEY (SOCKS_PORT)) ||
- g_str_equal (key, RIGHT_KEY (AUTOCONFIG_URL))) {
+ } else if (g_str_equal (key, KEY_GCONF_EVO_SOCKS_HOST) ||
+ g_str_equal (key, KEY_GCONF_EVO_SOCKS_PORT) ||
+ g_str_equal (key, KEY_GCONF_EVO_AUTOCONFIG_URL)) {
- /* ep_set_proxy (client, user_data, FALSE); */
+ /* ep_set_proxy (proxy, FALSE); */
d(g_print ("e-proxy.c:ep_settings_changed: socks/autoconf-url changed\n"));
}
}
+static void
+ep_sys_proxy_changed_cb (GSettings *settings, const gchar *key, EProxy *proxy)
+{
+ g_return_if_fail (proxy != NULL);
+
+ if (proxy->priv->type != PROXY_TYPE_SYSTEM)
+ return;
+
+ ep_set_proxy (proxy, g_strcmp0 (key, "ignore-hosts") == 0);
+}
+
+static void
+ep_sys_proxy_http_changed_cb (GSettings *settings, const gchar *key, EProxy *proxy)
+{
+ g_return_if_fail (proxy != NULL);
+
+ if (proxy->priv->type != PROXY_TYPE_SYSTEM)
+ return;
+
+ ep_set_proxy (proxy, FALSE);
+}
+
+static void
+ep_sys_proxy_https_changed_cb (GSettings *settings, const gchar *key, EProxy *proxy)
+{
+ g_return_if_fail (proxy != NULL);
+
+ if (proxy->priv->type != PROXY_TYPE_SYSTEM)
+ return;
+
+ ep_set_proxy (proxy, FALSE);
+}
+
+static void
+ep_sys_proxy_socks_changed_cb (GSettings *settings, const gchar *key, EProxy *proxy)
+{
+ g_return_if_fail (proxy != NULL);
+
+ if (proxy->priv->type != PROXY_TYPE_SYSTEM)
+ return;
+
+ ep_set_proxy (proxy, FALSE);
+}
+
+static void
+e_proxy_dispose (GObject *object)
+{
+ EProxyPrivate *priv;
+ GConfClient * client;
+
+ priv = E_PROXY (object)->priv;
+
+ client = gconf_client_get_default ();
+
+ if (priv->notify_id_evo > 0) {
+ gconf_client_notify_remove (client, priv->notify_id_evo);
+ priv->notify_id_evo = 0;
+ }
+
+ g_object_unref (client);
+
+ if (priv->proxy_settings) {
+ g_object_unref (priv->proxy_settings);
+ priv->proxy_settings = NULL;
+ }
+
+ if (priv->proxy_http_settings) {
+ g_object_unref (priv->proxy_http_settings);
+ priv->proxy_http_settings = NULL;
+ }
+
+ if (priv->proxy_https_settings) {
+ g_object_unref (priv->proxy_https_settings);
+ priv->proxy_https_settings = NULL;
+ }
+
+ if (priv->proxy_socks_settings) {
+ g_object_unref (priv->proxy_socks_settings);
+ priv->proxy_socks_settings = NULL;
+ }
+
+ if (priv->uri_http)
+ soup_uri_free (priv->uri_http);
+
+ if (priv->uri_https)
+ soup_uri_free (priv->uri_https);
+
+ g_slist_foreach (priv->ign_hosts, (GFunc) g_free, NULL);
+ g_slist_free (priv->ign_hosts);
+
+ g_slist_foreach (priv->ign_addrs, (GFunc) ep_free_proxy_host_addr, NULL);
+ g_slist_free (priv->ign_addrs);
+
+ /* Chain up to parent's dispose() method. */
+ G_OBJECT_CLASS (e_proxy_parent_class)->dispose (object);
+}
+
+static void
+e_proxy_class_init (EProxyClass *class)
+{
+ GObjectClass *object_class;
+
+ g_type_class_add_private (class, sizeof (EProxyPrivate));
+
+ object_class = G_OBJECT_CLASS (class);
+ object_class->dispose = e_proxy_dispose;
+
+ /**
+ * EProxy::changed:
+ * @proxy: the #EProxy which emitted the signal
+ *
+ * Emitted when proxy settings in gconf changes.
+ **/
+ signals[CHANGED] = g_signal_new (
+ "changed",
+ G_OBJECT_CLASS_TYPE (object_class),
+ G_SIGNAL_RUN_FIRST,
+ G_STRUCT_OFFSET (EProxyClass, changed),
+ NULL, NULL,
+ g_cclosure_marshal_VOID__VOID,
+ G_TYPE_NONE, 0);
+
+}
+
+static void
+e_proxy_init (EProxy *proxy)
+{
+ proxy->priv = G_TYPE_INSTANCE_GET_PRIVATE (
+ proxy, E_TYPE_PROXY, EProxyPrivate);
+
+ proxy->priv->type = PROXY_TYPE_SYSTEM;
+
+ proxy->priv->proxy_settings = g_settings_new ("org.gnome.system.proxy");
+ proxy->priv->proxy_http_settings = g_settings_get_child (proxy->priv->proxy_settings, "http");
+ proxy->priv->proxy_https_settings = g_settings_get_child (proxy->priv->proxy_settings, "https");
+ proxy->priv->proxy_socks_settings = g_settings_get_child (proxy->priv->proxy_settings, "socks");
+
+ g_signal_connect (proxy->priv->proxy_settings, "changed", G_CALLBACK (ep_sys_proxy_changed_cb), proxy);
+ g_signal_connect (proxy->priv->proxy_http_settings, "changed", G_CALLBACK (ep_sys_proxy_http_changed_cb), proxy);
+ g_signal_connect (proxy->priv->proxy_https_settings, "changed", G_CALLBACK (ep_sys_proxy_https_changed_cb), proxy);
+ g_signal_connect (proxy->priv->proxy_socks_settings, "changed", G_CALLBACK (ep_sys_proxy_socks_changed_cb), proxy);
+}
+
/**
* e_proxy_new:
*
@@ -774,26 +1016,13 @@ e_proxy_setup_proxy (EProxy *proxy)
gconf_client_add_dir (
client, PATH_GCONF_EVO_NETWORK_CONFIG,
GCONF_CLIENT_PRELOAD_ONELEVEL, NULL);
- /* and system proxy setup changes */
- gconf_client_add_dir (
- client, PATH_GCONF_SYS_PROXY,
- GCONF_CLIENT_PRELOAD_ONELEVEL, NULL);
- gconf_client_add_dir (
- client, PATH_GCONF_SYS_HTTP_PROXY,
- GCONF_CLIENT_PRELOAD_ONELEVEL, NULL);
proxy->priv->notify_id_evo = gconf_client_notify_add (
client, PATH_GCONF_EVO_NETWORK_CONFIG,
ep_setting_changed, (gpointer) proxy, NULL, NULL);
- proxy->priv->notify_id_sys = gconf_client_notify_add (
- client, PATH_GCONF_SYS_PROXY,
- ep_setting_changed, (gpointer) proxy, NULL, NULL);
- proxy->priv->notify_id_sys_http = gconf_client_notify_add (
- client, PATH_GCONF_SYS_HTTP_PROXY,
- ep_setting_changed, (gpointer) proxy, NULL, NULL);
}
- ep_set_proxy (client, proxy, TRUE);
+ ep_set_proxy (proxy, TRUE);
g_object_unref (client);
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]