Add support for setting proxy configuration method
authorMarcel Holtmann <marcel@holtmann.org>
Wed, 22 Sep 2010 03:48:28 +0000 (12:48 +0900)
committerMarcel Holtmann <marcel@holtmann.org>
Wed, 22 Sep 2010 03:48:28 +0000 (12:48 +0900)
doc/service-api.txt
src/connman.h
src/ipconfig.c
src/service.c
test/list-services
test/monitor-services

index c1dd541..c4e1495 100644 (file)
@@ -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]
index 591e4f7..21bf9e9 100644 (file)
@@ -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(
index dbf8f5a..0a7eb8b 100644 (file)
@@ -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)
 {
index 427ebcc..42aac9f 100644 (file)
@@ -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")) {
 
index a894092..88eea69 100755 (executable)
@@ -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"]:
index 05d1e1d..ceeba79 100755 (executable)
@@ -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"]: