From 908cef92eb166148b50e6b5a647a586b79aa259c Mon Sep 17 00:00:00 2001 From: Marcel Holtmann Date: Wed, 22 Sep 2010 12:48:28 +0900 Subject: [PATCH] Add support for setting proxy configuration method --- doc/service-api.txt | 9 ++++++ src/connman.h | 4 +++ src/ipconfig.c | 85 +++++++++++++++++++++++++++++++++++++++++++++++++++ src/service.c | 37 +++++++++++++++++++++- test/list-services | 3 +- test/monitor-services | 4 +-- 6 files changed, 138 insertions(+), 4 deletions(-) diff --git a/doc/service-api.txt b/doc/service-api.txt index c1dd541..c4e1495 100644 --- a/doc/service-api.txt +++ b/doc/service-api.txt @@ -417,6 +417,15 @@ Properties string State [readonly] Automatic proxy configuration URL. + dict Proxy.Configuration [readwrite] + + Same values as Proxy property. The Proxy represents + the actual system configuration while this allows + user configuration. + + Currently only setting Method to either "direct" + or "auto" is supported. + dict Provider [readonly] string Host [readonly] diff --git a/src/connman.h b/src/connman.h index 591e4f7..21bf9e9 100644 --- a/src/connman.h +++ b/src/connman.h @@ -230,6 +230,10 @@ int __connman_ipconfig_set_config(struct connman_ipconfig *ipconfig, enum connman_ipconfig_type type, DBusMessageIter *array); void __connman_ipconfig_append_proxy(struct connman_ipconfig *ipconfig, DBusMessageIter *iter); +void __connman_ipconfig_append_proxyconfig(struct connman_ipconfig *ipconfig, + DBusMessageIter *iter); +int __connman_ipconfig_set_proxyconfig(struct connman_ipconfig *ipconfig, + DBusMessageIter *array); void __connman_ipconfig_append_ethernet(struct connman_ipconfig *ipconfig, DBusMessageIter *iter); enum connman_ipconfig_method __connman_ipconfig_get_method( diff --git a/src/ipconfig.c b/src/ipconfig.c index dbf8f5a..0a7eb8b 100644 --- a/src/ipconfig.c +++ b/src/ipconfig.c @@ -73,6 +73,8 @@ struct connman_ipdevice { GSList *address_list; char *ipv4_gateway; char *ipv6_gateway; + + char *proxy; char *pac; struct connman_ipconfig *config; @@ -303,6 +305,7 @@ static void free_ipdevice(gpointer data) free_address_list(ipdevice); g_free(ipdevice->ipv4_gateway); g_free(ipdevice->ipv6_gateway); + g_free(ipdevice->proxy); g_free(ipdevice->pac); g_free(ipdevice->address); @@ -1624,6 +1627,88 @@ done: DBUS_TYPE_STRING, &method); } +void __connman_ipconfig_append_proxyconfig(struct connman_ipconfig *ipconfig, + DBusMessageIter *iter) +{ + struct connman_ipdevice *ipdevice; + const char *method = "auto"; + + ipdevice = g_hash_table_lookup(ipdevice_hash, + GINT_TO_POINTER(ipconfig->index)); + if (ipdevice == NULL) + goto done; + + if (ipdevice->proxy == NULL) + goto done; + + method = ipdevice->proxy; + +done: + connman_dbus_dict_append_basic(iter, "Method", + DBUS_TYPE_STRING, &method); +} + +int __connman_ipconfig_set_proxyconfig(struct connman_ipconfig *ipconfig, + DBusMessageIter *array) +{ + struct connman_ipdevice *ipdevice; + DBusMessageIter dict; + const char *method; + + DBG("ipconfig %p", ipconfig); + + ipdevice = g_hash_table_lookup(ipdevice_hash, + GINT_TO_POINTER(ipconfig->index)); + if (ipdevice == NULL) + return -ENXIO; + + if (dbus_message_iter_get_arg_type(array) != DBUS_TYPE_ARRAY) + return -EINVAL; + + dbus_message_iter_recurse(array, &dict); + + while (dbus_message_iter_get_arg_type(&dict) == DBUS_TYPE_DICT_ENTRY) { + DBusMessageIter entry; + const char *key; + int type; + + dbus_message_iter_recurse(&dict, &entry); + + if (dbus_message_iter_get_arg_type(&entry) != DBUS_TYPE_STRING) + return -EINVAL; + + dbus_message_iter_get_basic(&entry, &key); + dbus_message_iter_next(&entry); + + type = dbus_message_iter_get_arg_type(&entry); + + if (g_str_equal(key, "Method") == TRUE) { + if (type != DBUS_TYPE_STRING) + return -EINVAL; + + dbus_message_iter_get_basic(&entry, &method); + if (strlen(method) == 0) + method = NULL; + } + + dbus_message_iter_next(&dict); + } + + DBG("method %s", method); + + if (method == NULL) + return -EINVAL; + + if (g_str_equal(method, "auto") == FALSE && + g_str_equal(method, "direct") == FALSE) + return -EINVAL; + + g_free(ipdevice->proxy); + ipdevice->proxy = g_strdup(method); + + return 0; +} + void __connman_ipconfig_append_ethernet(struct connman_ipconfig *ipconfig, DBusMessageIter *iter) { diff --git a/src/service.c b/src/service.c index 427ebcc..42aac9f 100644 --- a/src/service.c +++ b/src/service.c @@ -944,6 +944,14 @@ static void append_proxy(DBusMessageIter *iter, void *user_data) __connman_ipconfig_append_proxy(service->ipconfig, iter); } +static void append_proxyconfig(DBusMessageIter *iter, void *user_data) +{ + struct connman_service *service = user_data; + + if (service->ipconfig != NULL) + __connman_ipconfig_append_proxyconfig(service->ipconfig, iter); +} + static void append_provider(DBusMessageIter *iter, void *user_data) { struct connman_service *service = user_data; @@ -1026,6 +1034,15 @@ static void proxy_changed(struct connman_service *service) append_proxy, service); } +static void proxy_configuration_changed(struct connman_service *service) +{ + connman_dbus_property_changed_dict(service->path, + CONNMAN_SERVICE_INTERFACE, "Proxy.Configuration", + append_proxyconfig, service); + + proxy_changed(service); +} + static void link_changed(struct connman_service *service) { connman_dbus_property_changed_dict(service->path, @@ -1415,7 +1432,11 @@ static void append_properties(DBusMessageIter *dict, dbus_bool_t limited, connman_dbus_dict_append_dict(dict, "Proxy", append_proxy, service); - connman_dbus_dict_append_dict(dict, "Provider", append_provider, service); + connman_dbus_dict_append_dict(dict, "Proxy.Configuration", + append_proxyconfig, service); + + connman_dbus_dict_append_dict(dict, "Provider", + append_provider, service); } static void append_struct(gpointer value, gpointer user_data) @@ -1743,6 +1764,20 @@ static DBusMessage *set_property(DBusConnection *conn, domain_configuration_changed(service); __connman_storage_save_service(service); + } else if (g_str_equal(name, "Proxy.Configuration") == TRUE) { + int err; + + if (service->ipconfig == NULL) + return __connman_error_invalid_property(msg); + + err = __connman_ipconfig_set_proxyconfig(service->ipconfig, + &value); + if (err < 0) + return __connman_error_failed(msg, -err); + + proxy_configuration_changed(service); + + __connman_storage_save_service(service); } else if (g_str_equal(name, "IPv4.Configuration") == TRUE || g_str_equal(name, "IPv6.Configuration")) { diff --git a/test/list-services b/test/list-services index a894092..88eea69 100755 --- a/test/list-services +++ b/test/list-services @@ -38,7 +38,8 @@ for path in properties["Services"]: for key in properties.keys(): if key in ["IPv4", "IPv4.Configuration", "IPv6", "IPv6.Configuration", - "Proxy", "Ethernet", "Provider"]: + "Proxy", "Proxy.Configuration", + "Ethernet", "Provider"]: val = extract_values(properties[key]) elif key in ["Nameservers", "Nameservers.Configuration", "Domains", "Domains.Configuration"]: diff --git a/test/monitor-services b/test/monitor-services index 05d1e1d..ceeba79 100755 --- a/test/monitor-services +++ b/test/monitor-services @@ -29,8 +29,8 @@ def property_changed(name, value, path): val = val + " " + i[i.rfind("/") + 1:] val = val + " ]" elif name in ["IPv4", "IPv4.Configuration", - "IPv6", "IPv6.Configuration", - "Proxy", "Ethernet"]: + "IPv6", "IPv6.Configuration", + "Proxy", "Proxy.Configuration", "Ethernet"]: val = extract_values(value) elif name in ["Nameservers", "Nameservers.Configuration", "Domains", "Domains.Configuration"]: -- 2.7.4