Hi,

Here is a patch for pacrunner plugin. I tested it (against patched pacrunner 
which handles manual config - the previous patch I sent for pacrunner daemon) 
and it works fine.
So now it handles direct/manual/auto as specified.

However, pacrunner advertises proxy configuration only when service change 
occurs, would be better if it also does this when proxy has changed on this 
same service. Have to investigate for this.

Best regards,

Tomasz

---
 include/service.h   |    4 ++
 plugins/pacrunner.c |   77 ++++++++++++++++++++++++++++++++++++++++++--------
 src/service.c       |   30 +++++++++++++++++++-
 3 files changed, 97 insertions(+), 14 deletions(-)

diff --git a/include/service.h b/include/service.h
index 8c0e892..16d10f2 100644
--- a/include/service.h
+++ b/include/service.h
@@ -102,6 +102,10 @@ char *connman_service_get_interface(struct connman_service 
*service);
 
 const char *connman_service_get_domainname(struct connman_service *service);
 const char *connman_service_get_nameserver(struct connman_service *service);
+enum connman_service_proxy_method connman_service_get_proxy_method(struct 
connman_service *service);
+char **connman_service_get_proxy_servers(struct connman_service *service);
+char **connman_service_get_proxy_excludes(struct connman_service *service);
+const char *connman_service_get_proxy_url(struct connman_service *service);
 const char *connman_service_get_proxy_autoconfig(struct connman_service 
*service);
 
 #ifdef __cplusplus
diff --git a/plugins/pacrunner.c b/plugins/pacrunner.c
index 3a21011..c9bb119 100644
--- a/plugins/pacrunner.c
+++ b/plugins/pacrunner.c
@@ -73,6 +73,16 @@ static void append_string(DBusMessageIter *iter, void 
*user_data)
        dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING, user_data);
 }
 
+static void append_string_list(DBusMessageIter *iter, void *user_data)
+{
+       int i;
+       char **list = user_data;
+
+       for (i = 0; list[i] != NULL; i++)
+               dbus_message_iter_append_basic(iter,
+                                       DBUS_TYPE_STRING, &list[i]);
+}
+
 static void create_proxy_configuration(void)
 {
        DBusMessage *msg;
@@ -80,7 +90,9 @@ static void create_proxy_configuration(void)
        DBusPendingCall *call;
        dbus_bool_t result;
        char *interface;
+       const char *method;
        const char *str;
+       char **str_list;
 
        if (default_service == NULL)
                return;
@@ -97,6 +109,58 @@ static void create_proxy_configuration(void)
        dbus_message_iter_init_append(msg, &iter);
        connman_dbus_dict_open(&iter, &dict);
 
+       switch(connman_service_get_proxy_method(default_service)) {
+       case CONNMAN_SERVICE_PROXY_METHOD_UNKNOWN:
+               /* fall through */
+       case CONNMAN_SERVICE_PROXY_METHOD_DIRECT:
+               method= "direct";
+               break;
+       case CONNMAN_SERVICE_PROXY_METHOD_MANUAL:
+               method = "manual";
+
+               str_list = connman_service_get_proxy_servers(default_service);
+               if (str_list != NULL) {
+                       connman_dbus_dict_append_array(&dict, "Servers",
+                                       DBUS_TYPE_STRING, append_string_list,
+                                       str_list);
+
+                       g_strfreev(str_list);
+               }
+               else {
+                       method = "direct";
+                       break;
+               }
+
+               str_list = connman_service_get_proxy_excludes(default_service);
+               if (str_list != NULL) {
+                       connman_dbus_dict_append_array(&dict, "Excludes",
+                                       DBUS_TYPE_STRING, append_string_list,
+                                       str_list);
+
+                       g_strfreev(str_list);
+               }
+
+               break;
+       case CONNMAN_SERVICE_PROXY_METHOD_AUTO:
+               method = "auto";
+
+               str = connman_service_get_proxy_url(default_service);
+               if (str == NULL)
+                       str = connman_service_get_proxy_autoconfig(
+                                                       default_service);
+
+               if (str != NULL)
+                       connman_dbus_dict_append_basic(&dict, "URL",
+                                               DBUS_TYPE_STRING, &str);
+               else
+                       method = "direct";
+
+               break;
+       }
+
+       connman_dbus_dict_append_basic(&dict, "Method",
+                               DBUS_TYPE_STRING, &method);
+
        interface = connman_service_get_interface(default_service);
        if (interface != NULL) {
                connman_dbus_dict_append_basic(&dict, "Interface",
@@ -104,19 +168,6 @@ static void create_proxy_configuration(void)
                g_free(interface);
        }
 
-       str = connman_service_get_proxy_autoconfig(default_service);
-       if (str != NULL) {
-               const char *method = "auto";
-               connman_dbus_dict_append_basic(&dict, "Method",
-                                               DBUS_TYPE_STRING, &method);
-               connman_dbus_dict_append_basic(&dict, "URL",
-                                               DBUS_TYPE_STRING, &str);
-       } else {
-               const char *method = "direct";
-               connman_dbus_dict_append_basic(&dict, "Method",
-                                               DBUS_TYPE_STRING, &method);
-       }
-
        str = connman_service_get_domainname(default_service);
        if (str != NULL)
                connman_dbus_dict_append_array(&dict, "Domains",
diff --git a/src/service.c b/src/service.c
index 1cb292f..65efc34 100644
--- a/src/service.c
+++ b/src/service.c
@@ -1527,6 +1527,33 @@ const char *connman_service_get_nameserver(struct 
connman_service *service)
        return service->nameserver;
 }
 
+enum connman_service_proxy_method connman_service_get_proxy_method(
+                                       struct connman_service *service)
+{
+       if (service == NULL)
+               return CONNMAN_SERVICE_PROXY_METHOD_UNKNOWN;
+
+       return service->proxy;
+}
+
+char **connman_service_get_proxy_servers(struct connman_service *service)
+{
+       return g_strdupv(service->proxies);
+}
+
+char **connman_service_get_proxy_excludes(struct connman_service *service)
+{
+       return g_strdupv(service->excludes);
+}
+
+const char *connman_service_get_proxy_url(struct connman_service *service)
+{
+       if (service == NULL)
+               return NULL;
+
+       return service->pac;
+}
+
 void __connman_service_set_proxy_autoconfig(struct connman_service *service,
                                                        const char *url)
 {
@@ -1540,7 +1567,8 @@ void __connman_service_set_proxy_autoconfig(struct 
connman_service *service,
        proxy_changed(service);
 }
 
-const char *connman_service_get_proxy_autoconfig(struct connman_service 
*service)
+const char *connman_service_get_proxy_autoconfig(
+                                       struct connman_service *service)
 {
        if (service == NULL)
                return NULL;
-- 
1.7.1

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

Reply via email to