Refactor set_property's Proxy.Configuration to a separate function.
---
 src/connman.h |   3 ++
 src/service.c | 169 +++++++++++++++++++++++++++++-----------------------------
 2 files changed, 88 insertions(+), 84 deletions(-)

diff --git a/src/connman.h b/src/connman.h
index 914c623..eb83d8a 100644
--- a/src/connman.h
+++ b/src/connman.h
@@ -767,6 +767,9 @@ bool __connman_service_set_timeservers_conf(struct 
connman_service *service,
                                                        char **nameservers);
 bool __connman_service_set_domains_conf(struct connman_service *service,
                                                        char **domains);
+bool __connman_service_set_proxy_conf(struct connman_service *service,
+                               enum connman_service_proxy_method method,
+                               char *url, char **servers, char **excludes);
 void __connman_service_set_hidden(struct connman_service *service);
 void __connman_service_set_hostname(struct connman_service *service,
                                                const char *hostname);
diff --git a/src/service.c b/src/service.c
index 7929113..e9107c2 100644
--- a/src/service.c
+++ b/src/service.c
@@ -2589,6 +2589,72 @@ bool __connman_service_set_domains_conf(struct 
connman_service *service,
        return true;
 }
 
+bool __connman_service_set_proxy_conf(struct connman_service *service,
+                               enum connman_service_proxy_method method,
+                               char *url, char **servers, char **excludes)
+{
+       switch (method) {
+       case CONNMAN_SERVICE_PROXY_METHOD_DIRECT:
+               break;
+       case CONNMAN_SERVICE_PROXY_METHOD_MANUAL:
+               if (!servers)
+                       goto error;
+
+               g_strfreev(service->proxies);
+               servers = remove_empty_strings(servers);
+               service->proxies = servers;
+
+               g_strfreev(service->excludes);
+               service->excludes = NULL;
+
+               if (excludes) {
+                       excludes = remove_empty_strings(excludes);
+                       service->excludes = excludes;
+               }
+
+               break;
+       case CONNMAN_SERVICE_PROXY_METHOD_AUTO:
+               g_free(service->pac);
+
+               if (url && strlen(url) > 0)
+                       service->pac = g_strstrip(g_strdup(url));
+               else
+                       service->pac = NULL;
+
+               /* if we are connected:
+                  - if service->pac == NULL
+                  - if __connman_ipconfig_get_proxy_autoconfig(
+                  service->ipconfig) == NULL
+                  --> We should start WPAD */
+
+               break;
+       case CONNMAN_SERVICE_PROXY_METHOD_UNKNOWN:
+               goto error;
+       }
+
+       g_free(url);
+
+       if (method != CONNMAN_SERVICE_PROXY_METHOD_MANUAL) {
+               g_strfreev(servers);
+               g_strfreev(excludes);
+       }
+
+       service->proxy_config = method;
+       proxy_configuration_changed(service);
+       __connman_notifier_proxy_changed(service);
+
+       service_save(service);
+
+       return true;
+
+error:
+       g_free(url);
+       g_strfreev(servers);
+       g_strfreev(excludes);
+
+       return false;
+}
+
 void __connman_service_set_hidden(struct connman_service *service)
 {
        if (!service || service->hidden)
@@ -3065,6 +3131,8 @@ static int update_proxy_configuration(struct 
connman_service *service,
        enum connman_service_proxy_method method;
        GString *servers_str = NULL;
        GString *excludes_str = NULL;
+       char **servers = NULL;
+       char **excludes = NULL;
        const char *url = NULL;
 
        method = CONNMAN_SERVICE_PROXY_METHOD_UNKNOWN;
@@ -3079,13 +3147,13 @@ static int update_proxy_configuration(struct 
connman_service *service,
                dbus_message_iter_recurse(&dict, &entry);
 
                if (dbus_message_iter_get_arg_type(&entry) != DBUS_TYPE_STRING)
-                       goto error;
+                       return -EINVAL;
 
                dbus_message_iter_get_basic(&entry, &key);
                dbus_message_iter_next(&entry);
 
                if (dbus_message_iter_get_arg_type(&entry) != DBUS_TYPE_VARIANT)
-                       goto error;
+                       return -EINVAL;
 
                dbus_message_iter_recurse(&entry, &variant);
 
@@ -3095,24 +3163,24 @@ static int update_proxy_configuration(struct 
connman_service *service,
                        const char *val;
 
                        if (type != DBUS_TYPE_STRING)
-                               goto error;
+                               return -EINVAL;
 
                        dbus_message_iter_get_basic(&variant, &val);
                        method = string2proxymethod(val);
                } else if (g_str_equal(key, "URL")) {
                        if (type != DBUS_TYPE_STRING)
-                               goto error;
+                               return -EINVAL;
 
                        dbus_message_iter_get_basic(&variant, &url);
                } else if (g_str_equal(key, "Servers")) {
                        DBusMessageIter str_array;
 
                        if (type != DBUS_TYPE_ARRAY)
-                               goto error;
+                               return -EINVAL;
 
                        servers_str = g_string_new(NULL);
                        if (!servers_str)
-                               goto error;
+                               return -ENOMEM;
 
                        dbus_message_iter_recurse(&variant, &str_array);
 
@@ -3130,15 +3198,18 @@ static int update_proxy_configuration(struct 
connman_service *service,
 
                                dbus_message_iter_next(&str_array);
                        }
+                       if (servers_str->len > 0)
+                               servers = g_strsplit(servers_str->str, " ", 0);
+                       g_string_free(servers_str, TRUE);
                } else if (g_str_equal(key, "Excludes")) {
                        DBusMessageIter str_array;
 
                        if (type != DBUS_TYPE_ARRAY)
-                               goto error;
+                               return -EINVAL;
 
                        excludes_str = g_string_new(NULL);
                        if (!excludes_str)
-                               goto error;
+                               return -ENOMEM;
 
                        dbus_message_iter_recurse(&variant, &str_array);
 
@@ -3156,83 +3227,19 @@ static int update_proxy_configuration(struct 
connman_service *service,
 
                                dbus_message_iter_next(&str_array);
                        }
+                       if (excludes_str && excludes_str->len > 1)
+                               excludes = g_strsplit(excludes_str->str, " ", 
0);
+                       g_string_free(excludes_str, TRUE);
                }
 
                dbus_message_iter_next(&dict);
        }
 
-       switch (method) {
-       case CONNMAN_SERVICE_PROXY_METHOD_DIRECT:
-               break;
-       case CONNMAN_SERVICE_PROXY_METHOD_MANUAL:
-               if (!servers_str && !service->proxies)
-                       goto error;
-
-               if (servers_str) {
-                       g_strfreev(service->proxies);
-
-                       if (servers_str->len > 0) {
-                               char **proxies = g_strsplit_set(
-                                       servers_str->str, " ", 0);
-                               proxies = remove_empty_strings(proxies);
-                               service->proxies = proxies;
-                       } else
-                               service->proxies = NULL;
-               }
-
-               if (excludes_str) {
-                       g_strfreev(service->excludes);
-
-                       if (excludes_str->len > 0) {
-                               char **excludes = g_strsplit_set(
-                                       excludes_str->str, " ", 0);
-                               excludes = remove_empty_strings(excludes);
-                               service->excludes = excludes;
-                       } else
-                               service->excludes = NULL;
-               }
-
-               if (!service->proxies)
-                       method = CONNMAN_SERVICE_PROXY_METHOD_DIRECT;
-
-               break;
-       case CONNMAN_SERVICE_PROXY_METHOD_AUTO:
-               g_free(service->pac);
-
-               if (url && strlen(url) > 0)
-                       service->pac = g_strstrip(g_strdup(url));
-               else
-                       service->pac = NULL;
-
-               /* if we are connected:
-                  - if service->pac == NULL
-                  - if __connman_ipconfig_get_proxy_autoconfig(
-                  service->ipconfig) == NULL
-                  --> We should start WPAD */
-
-               break;
-       case CONNMAN_SERVICE_PROXY_METHOD_UNKNOWN:
-               goto error;
-       }
-
-       if (servers_str)
-               g_string_free(servers_str, TRUE);
-
-       if (excludes_str)
-               g_string_free(excludes_str, TRUE);
-
-       service->proxy_config = method;
+       if (!__connman_service_set_proxy_conf(service, method, g_strdup(url),
+                                               servers, excludes))
+               return -EINVAL;
 
        return 0;
-
-error:
-       if (servers_str)
-               g_string_free(servers_str, TRUE);
-
-       if (excludes_str)
-               g_string_free(excludes_str, TRUE);
-
-       return -EINVAL;
 }
 
 int __connman_service_reset_ipconfig(struct connman_service *service,
@@ -3480,12 +3487,6 @@ static DBusMessage *set_property(DBusConnection *conn,
 
                if (err < 0)
                        return __connman_error_failed(msg, -err);
-
-               proxy_configuration_changed(service);
-
-               __connman_notifier_proxy_changed(service);
-
-               service_save(service);
        } else if (g_str_equal(name, "IPv4.Configuration") ||
                        g_str_equal(name, "IPv6.Configuration")) {
 
-- 
2.5.3

_______________________________________________
connman mailing list
connman@connman.net
https://lists.connman.net/mailman/listinfo/connman

Reply via email to