---
 src/service.c |   47 +++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 45 insertions(+), 2 deletions(-)

diff --git a/src/service.c b/src/service.c
index bde767f..b812dfc 100644
--- a/src/service.c
+++ b/src/service.c
@@ -103,6 +103,7 @@ struct connman_service {
        enum connman_service_proxy proxy;
        char **proxies;
        char **excludes;
+       char *pac;
 };
 
 static void append_path(gpointer value, gpointer user_data)
@@ -904,9 +905,12 @@ static void append_proxy(DBusMessageIter *iter, void 
*user_data)
                                        DBUS_TYPE_STRING, append_excludes,
                                        service);
                break;
+       case CONNMAN_SERVICE_PROXY_AUTO:
+               pac = service->pac;
        case CONNMAN_SERVICE_PROXY_AUTO_CONFIG:
-               connman_dbus_dict_append_basic(iter, "URL", DBUS_TYPE_STRING,
-                                       &pac);
+               if (pac != NULL)
+                       connman_dbus_dict_append_basic(iter, "URL",
+                                               DBUS_TYPE_STRING, &pac);
                break;
        default:
                goto done;
@@ -938,6 +942,11 @@ static void append_proxyconfig(DBusMessageIter *iter, void 
*user_data)
                                                DBUS_TYPE_STRING,
                                                append_excludes, service);
                break;
+       case CONNMAN_SERVICE_PROXY_AUTO:
+               if (service->pac != NULL)
+                       connman_dbus_dict_append_basic(iter, "URL",
+                                       DBUS_TYPE_STRING, &service->pac);
+               break;
        default:
                goto done;
        }
@@ -1603,6 +1612,7 @@ static int update_proxy_configuration(struct 
connman_service *service,
        enum connman_service_proxy method;
        GString *servers_str = NULL;
        GString *excludes_str = NULL;
+       const char *url = NULL;
 
        method = CONNMAN_SERVICE_PROXY_UNKNOWN;
 
@@ -1637,6 +1647,12 @@ static int update_proxy_configuration(struct 
connman_service *service,
 
                        dbus_message_iter_get_basic(&variant, &val);
                        method = string2proxymethod(val);
+               } else if (g_str_equal(key, "URL") == TRUE) {
+                       if (type != DBUS_TYPE_STRING)
+                               return update_proxy_cleanup(servers_str,
+                                                       excludes_str);
+
+                       dbus_message_iter_get_basic(&variant, &url);
                } else if (g_str_equal(key, "Servers") == TRUE) {
                        DBusMessageIter str_array;
 
@@ -1729,6 +1745,18 @@ static int update_proxy_configuration(struct 
connman_service *service,
                        method = CONNMAN_SERVICE_PROXY_DIRECT;
 
                break;
+       case CONNMAN_SERVICE_PROXY_AUTO:
+               g_free(service->pac);
+
+               if (url != NULL && strlen(url) > 0)
+                       service->pac = g_strdup(url);
+               else
+                       service->pac = NULL;
+
+               /* If service->pac == NULL and if we are connected, we should
+                  start WPAD */
+
+               break;
        default:
                return update_proxy_cleanup(servers_str, excludes_str);
        }
@@ -2528,6 +2556,7 @@ static void service_free(gpointer user_data)
 
        g_free(service->nameserver);
        g_free(service->domainname);
+       g_free(service->pac);
        g_free(service->mcc);
        g_free(service->mnc);
        g_free(service->apn);
@@ -4298,6 +4327,13 @@ static int service_load(struct connman_service *service)
                service->excludes = NULL;
        }
 
+       str = g_key_file_get_string(keyfile,
+                               service->identifier, "Proxy.URL", NULL);
+       if (str != NULL) {
+               g_free(service->pac);
+               service->pac = str;
+       }
+
 done:
        g_key_file_free(keyfile);
 
@@ -4488,6 +4524,13 @@ update:
                g_key_file_remove_key(keyfile, service->identifier,
                                                "Proxy.Excludes", NULL);
 
+       if (service->pac != NULL && strlen(service->pac) > 0)
+               g_key_file_set_string(keyfile, service->identifier,
+                                       "Proxy.URL", service->pac);
+       else
+               g_key_file_remove_key(keyfile, service->identifier,
+                                                       "Proxy.URL", NULL);
+
        data = g_key_file_to_data(keyfile, &length, NULL);
 
        if (g_file_set_contents(pathname, data, length, NULL) == FALSE)
-- 
1.7.1

_______________________________________________
connman mailing list
connman@connman.net
http://lists.connman.net/listinfo/connman

Reply via email to