--- Makefile.plugins | 7 ++ configure.ac | 10 +++ plugins/proxygconf.c | 183 ++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 200 insertions(+), 0 deletions(-) create mode 100644 plugins/proxygconf.c
diff --git a/Makefile.plugins b/Makefile.plugins index 4ca78d3..2f15d85 100644 --- a/Makefile.plugins +++ b/Makefile.plugins @@ -230,6 +230,13 @@ plugins_ntpd_la_LDFLAGS = $(plugin_ldflags) endif endif +if PROXYGCONF +plugin_LTLIBRARIES += plugins/proxygconf.la +plugin_objects += $(plugins_proxygconf_la_OBJECTS) +plugins_proxygconf_la_CFLAGS = $(plugin_cflags) @GCONF_CFLAGS@ +plugins_proxygconf_la_LDFLAGS = $(plugin_ldflags) @GCONF_LIBS@ +endif + EXTRA_DIST += plugins/polkit.policy scripts/dhclient.conf plugins/connman.policy: plugins/polkit.policy diff --git a/configure.ac b/configure.ac index 6923aa1..ddba330 100644 --- a/configure.ac +++ b/configure.ac @@ -368,5 +368,15 @@ AC_ARG_ENABLE(datafiles, AC_HELP_STRING([--disable-datafiles], [enable_datafiles=${enableval}]) AM_CONDITIONAL(DATAFILES, test "${enable_datafiles}" != "no") +AC_ARG_ENABLE(proxygconf, AC_HELP_STRING([--enable-proxygconf], + [enable proxy GConf support]), [enable_proxygconf=${enableval}]) +AM_CONDITIONAL(PROXYGCONF, test "${enable_proxygconf}" = "yes") +if (test "${enable_proxygconf}" = "yes"); then + PKG_CHECK_MODULES(GCONF, gconf-2.0, dummy=yes, + AC_MSG_ERROR(gconf library is required)) + AC_SUBST(GCONF_CFLAGS) + AC_SUBST(GCONF_LIBS) +fi + AC_OUTPUT(Makefile include/version.h src/connman.service scripts/connman doc/version.xml connman.pc) diff --git a/plugins/proxygconf.c b/plugins/proxygconf.c new file mode 100644 index 0000000..2987567 --- /dev/null +++ b/plugins/proxygconf.c @@ -0,0 +1,183 @@ +/* + * Save proxy settings to gconf. + * + * Copyright (C) 2010 Nokia Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <stdio.h> + +#define CONNMAN_API_SUBJECT_TO_CHANGE +#include <connman/plugin.h> +#include <connman/storage.h> +#include <connman/log.h> + +#include <gconf/gconf-client.h> + +#define CONF_PROXY "/system/proxy" +#define HTTP_PROXY "/system/http_proxy" + + +static void set(GConfClient *gconf, + const char *host_path, const char *host, + const char *port_path, uint16_t port) +{ + if (host && host[0]) { + gconf_client_set_string(gconf, host_path, host, NULL); + if (port_path) + gconf_client_set_int(gconf, port_path, port, NULL); + } else { + gconf_client_unset(gconf, host_path, NULL); + if (port_path) + gconf_client_unset(gconf, port_path, NULL); + } +} + +static void clear_entries(GConfClient *gconf) +{ + gconf_client_unset(gconf, CONF_PROXY "/mode", NULL); + gconf_client_unset(gconf, CONF_PROXY "/secure_host", NULL); + gconf_client_unset(gconf, CONF_PROXY "/secure_port", NULL); + gconf_client_unset(gconf, CONF_PROXY "/ftp_host", NULL); + gconf_client_unset(gconf, CONF_PROXY "/ftp_port", NULL); + gconf_client_unset(gconf, CONF_PROXY "/socks_host", NULL); + gconf_client_unset(gconf, CONF_PROXY "/socks_port", NULL); + gconf_client_unset(gconf, CONF_PROXY "/rtsp_host", NULL); + gconf_client_unset(gconf, CONF_PROXY "/rtsp_port", NULL); + + gconf_client_unset(gconf, HTTP_PROXY "/host", NULL); + gconf_client_unset(gconf, HTTP_PROXY "/port", NULL); + gconf_client_unset(gconf, HTTP_PROXY "/ignore_hosts", NULL); + gconf_client_unset(gconf, HTTP_PROXY "/use_http_proxy", NULL); +} + +static int proxy_save(struct connman_service *service) +{ + GConfClient *gconf; + struct connman_manual_proxy *proxy; + enum connman_service_proxy_method method; + + DBG(""); + + gconf = gconf_client_get_default(); + + proxy = connman_service_get_default_proxy(service, &method); + if (!proxy) { + clear_entries(gconf); + goto out; + } + + if (method != CONNMAN_SERVICE_PROXY_METHOD_MANUAL) { + clear_entries(gconf); + goto out; + } + + set(gconf, CONF_PROXY "/mode", "manual", NULL, 0); + + set(gconf, CONF_PROXY "/secure_host", proxy->https, + CONF_PROXY "/secure_port", proxy->https_port); + + set(gconf, CONF_PROXY "/ftp_host", proxy->ftp, + CONF_PROXY "/ftp_port", proxy->ftp_port); + + set(gconf, CONF_PROXY "/socks_host", proxy->socks, + CONF_PROXY "/socks_port", proxy->socks_port); + + set(gconf, CONF_PROXY "/rtsp_host", proxy->rtsp, + CONF_PROXY "/rtsp_port", proxy->rtsp_port); + + if (proxy->http) + gconf_client_set_bool(gconf, + HTTP_PROXY "/use_http_proxy", + TRUE, NULL); + else + gconf_client_unset(gconf, HTTP_PROXY "/use_http_proxy", NULL); + + set(gconf, HTTP_PROXY "/host", proxy->http, + HTTP_PROXY "/port", proxy->http_port); + + if (proxy->ignore) + gconf_client_set_list(gconf, HTTP_PROXY "/ignore_hosts", + GCONF_VALUE_STRING, proxy->ignore, NULL); + else + gconf_client_unset(gconf, HTTP_PROXY "/ignore_hosts", NULL); + +out: + gconf_client_suggest_sync(gconf, NULL); + g_object_unref(gconf); + return -1; +} + +static int proxy_clear(struct connman_service *service) +{ + GConfClient *gconf; + struct connman_manual_proxy *proxy; + enum connman_service_proxy_method method; + + DBG(""); + + gconf = gconf_client_get_default(); + + proxy = connman_service_get_default_proxy(service, &method); + if (!proxy) { + clear_entries(gconf); + goto out; + } + proxy = connman_service_get_default_proxy(service, &method); + if (!proxy) { + clear_entries(gconf); + goto out; + } + + clear_entries(gconf); + +out: + gconf_client_suggest_sync(gconf, NULL); + g_object_unref(gconf); + return -1; +} + +static struct connman_storage proxygconf_storage = { + .name = "proxygconf", + .priority = CONNMAN_STORAGE_PRIORITY_HIGH, + .service_load = proxy_clear, + .service_save = proxy_save, +}; + +static int proxygconf_init(void) +{ + DBG(""); + + g_type_init(); + + if (connman_storage_register(&proxygconf_storage) < 0) + connman_error("Failed to register proxy gconf storage"); + + return 0; +} + +static void proxygconf_exit(void) +{ + connman_storage_unregister(&proxygconf_storage); +} + +CONNMAN_PLUGIN_DEFINE(proxygconf, "Proxy GConf plugin", VERSION, + CONNMAN_PLUGIN_PRIORITY_DEFAULT, + proxygconf_init, proxygconf_exit) -- 1.7.0.4 _______________________________________________ connman mailing list connman@connman.net http://lists.connman.net/listinfo/connman