Support both dhcp and manual configurations.

Signed-off-by: Dongxiao Xu <dongxiao...@intel.com>
---
 common/connman-client.c |   36 ++++++++++-
 common/connman-client.h |   17 +++++
 common/connman-dbus.c   |   65 ++++++++++++++++++-
 properties/Makefile.am  |    2 +-
 properties/advanced.h   |    6 +-
 properties/ethernet.c   |  162 +++++++++++++++++++++++++++++++----------------
 properties/main.c       |    2 +-
 7 files changed, 227 insertions(+), 63 deletions(-)

diff --git a/common/connman-client.c b/common/connman-client.c
index 59f6318..3c203cb 100644
--- a/common/connman-client.c
+++ b/common/connman-client.c
@@ -119,7 +119,10 @@ static void connman_client_init(ConnmanClient *client)
                                G_TYPE_UINT,    /* strength */
                                G_TYPE_UINT,    /* security */
                                G_TYPE_STRING,  /* passphrase */
-                               G_TYPE_STRING); /* address */
+                               G_TYPE_STRING,  /* method */
+                               G_TYPE_STRING,  /* address */
+                               G_TYPE_STRING,  /* netmask */
+                               G_TYPE_STRING); /* gateway */
 
        gtk_tree_sortable_set_default_sort_func(GTK_TREE_SORTABLE(priv->store),
                                                compare_index, NULL, NULL);
@@ -277,6 +280,37 @@ void connman_client_set_policy(ConnmanClient *client, 
const gchar *device,
        g_object_unref(proxy);
 }
 
+gboolean connman_client_set_ipv4(ConnmanClient *client, const gchar *device,
+                               struct ipv4_config *ipv4_config)
+{
+       ConnmanClientPrivate *priv = CONNMAN_CLIENT_GET_PRIVATE(client);
+       DBusGProxy *proxy;
+       GValue value = { 0 };
+       gboolean ret;
+       GHashTable *ipv4 = g_hash_table_new(g_str_hash, g_str_equal);
+
+       g_hash_table_insert(ipv4, "Method",  (gpointer)ipv4_config->method);
+       g_hash_table_insert(ipv4, "Address", (gpointer)ipv4_config->address);
+       g_hash_table_insert(ipv4, "Netmask", (gpointer)ipv4_config->netmask);
+       g_hash_table_insert(ipv4, "Gateway", (gpointer)ipv4_config->gateway);
+
+       DBG("client %p", client);
+
+       if (device == NULL)
+               return FALSE;
+
+       proxy = connman_dbus_get_proxy(priv->store, device);
+       if (proxy == NULL)
+               return FALSE;
+       g_value_init(&value, DBUS_TYPE_G_STRING_STRING_HASHTABLE);
+       g_value_set_boxed(&value, ipv4);
+       ret = connman_set_property(proxy, "IPv4.Configuration", &value, NULL);
+
+       g_object_unref(proxy);
+
+       return ret;
+}
+
 void connman_client_set_powered(ConnmanClient *client, const gchar *device,
                                                        gboolean powered)
 {
diff --git a/common/connman-client.h b/common/connman-client.h
index 7251265..d756619 100644
--- a/common/connman-client.h
+++ b/common/connman-client.h
@@ -49,6 +49,13 @@ struct _ConnmanClientClass {
        GObjectClass parent_class;
 };
 
+struct ipv4_config {
+       const gchar *method;
+       const gchar *address;
+       const gchar *netmask;
+       const gchar *gateway;
+};
+
 GType connman_client_get_type(void);
 
 ConnmanClient *connman_client_new(void);
@@ -61,6 +68,8 @@ void connman_client_set_policy(ConnmanClient *client, const 
gchar *device,
                                                        const gchar *policy);
 void connman_client_set_powered(ConnmanClient *client, const gchar *device,
                                                        gboolean powered);
+gboolean connman_client_set_ipv4(ConnmanClient *client, const gchar *device,
+                               struct ipv4_config *ipv4_config);
 void connman_client_propose_scan(ConnmanClient *client, const gchar *device);
 
 void connman_client_connect(ConnmanClient *client, const gchar *network);
@@ -89,7 +98,10 @@ enum {
        CONNMAN_COLUMN_STRENGTH,        /* G_TYPE_UINT    */
        CONNMAN_COLUMN_SECURITY,        /* G_TYPE_UINT    */
        CONNMAN_COLUMN_PASSPHRASE,      /* G_TYPE_STRING  */
+       CONNMAN_COLUMN_METHOD,          /* G_TYPE_STRING  */
        CONNMAN_COLUMN_ADDRESS,         /* G_TYPE_STRING  */
+       CONNMAN_COLUMN_NETMASK,         /* G_TYPE_STRING  */
+       CONNMAN_COLUMN_GATEWAY,         /* G_TYPE_STRING  */
        _CONNMAN_NUM_COLUMNS
 };
 
@@ -103,6 +115,11 @@ enum {
 };
 
 enum {
+       CONNMAN_POLICY_DHCP,
+       CONNMAN_POLICY_MANUAL,
+};
+
+enum {
        CONNMAN_STATE_UNKNOWN,
        CONNMAN_STATE_IDLE,
        CONNMAN_STATE_CARRIER,
diff --git a/common/connman-dbus.c b/common/connman-dbus.c
index d753830..549c567 100644
--- a/common/connman-dbus.c
+++ b/common/connman-dbus.c
@@ -240,6 +240,10 @@ static void service_changed(DBusGProxy *proxy, const char 
*property,
        GtkTreeStore *store = user_data;
        const char *path = dbus_g_proxy_get_path(proxy);
        GtkTreeIter iter;
+       GHashTable *ipv4;
+       const char *method, *addr, *netmask, *gateway;
+       GValue *ipv4_method, *ipv4_address, *ipv4_netmask, *ipv4_gateway;
+
 
        DBG("store %p proxy %p property %s", store, proxy, property);
 
@@ -249,7 +253,30 @@ static void service_changed(DBusGProxy *proxy, const char 
*property,
        if (get_iter_from_path(store, &iter, path) == FALSE)
                return;
 
-       if (g_str_equal(property, "State") == TRUE) {
+       if (g_str_equal(property, "IPv4") == TRUE) {
+               ipv4 = g_value_get_boxed (value);
+               if (!ipv4)
+                       return;
+
+               ipv4_method = g_hash_table_lookup (ipv4, "Method");
+               method = ipv4_method ? g_value_get_string(ipv4_method) : NULL;
+
+               ipv4_address = g_hash_table_lookup (ipv4, "Address");
+               addr = ipv4_address ? g_value_get_string(ipv4_address) : NULL;
+
+               ipv4_netmask = g_hash_table_lookup (ipv4, "Netmask");
+               netmask = ipv4_netmask ? g_value_get_string(ipv4_netmask) : 
NULL;
+
+               ipv4_gateway = g_hash_table_lookup (ipv4, "Gateway");
+               gateway = ipv4_gateway ? g_value_get_string(ipv4_gateway) : 
NULL;
+
+               gtk_tree_store_set(store, &iter,
+                                       CONNMAN_COLUMN_METHOD, method,
+                                       CONNMAN_COLUMN_ADDRESS, addr,
+                                       CONNMAN_COLUMN_NETMASK, netmask,
+                                       CONNMAN_COLUMN_GATEWAY, gateway,
+                                       -1);
+       } else if (g_str_equal(property, "State") == TRUE) {
                guint state = get_state(value);
                gtk_tree_store_set(store, &iter,
                                        CONNMAN_COLUMN_STATE, state, -1);
@@ -342,6 +369,10 @@ static void service_properties(DBusGProxy *proxy, 
GHashTable *hash,
        gboolean favorite;
        GtkTreeIter iter;
 
+       GHashTable *ipv4;
+       GValue *ipv4_method, *ipv4_address, *ipv4_netmask, *ipv4_gateway;
+       const char *method, *addr, *netmask, *gateway;
+
        DBG("store %p proxy %p hash %p", store, proxy, hash);
 
        if (error != NULL || hash == NULL)
@@ -368,6 +399,24 @@ static void service_properties(DBusGProxy *proxy, 
GHashTable *hash,
 
        DBG("name %s type %d icon %s", name, type, icon);
 
+       value = g_hash_table_lookup(hash, "IPv4.Configuration");
+       ipv4 = g_value_get_boxed (value);
+
+       if (!ipv4)
+               goto done;
+
+       ipv4_method = g_hash_table_lookup (ipv4, "Method");
+       method = ipv4_method ? g_value_get_string(ipv4_method) : NULL;
+
+       ipv4_address = g_hash_table_lookup (ipv4, "Address");
+       addr = ipv4_address ? g_value_get_string(ipv4_address) : NULL;
+
+       ipv4_netmask = g_hash_table_lookup (ipv4, "Netmask");
+       netmask = ipv4_netmask ? g_value_get_string(ipv4_netmask) : NULL;
+
+       ipv4_gateway = g_hash_table_lookup (ipv4, "Gateway");
+       gateway = ipv4_gateway ? g_value_get_string(ipv4_gateway) : NULL;
+
        if (get_iter_from_proxy(store, &iter, proxy) == FALSE) {
                gtk_tree_store_insert_with_values(store, &iter, NULL, -1,
                                        CONNMAN_COLUMN_PROXY, proxy,
@@ -377,7 +426,12 @@ static void service_properties(DBusGProxy *proxy, 
GHashTable *hash,
                                        CONNMAN_COLUMN_STATE, state,
                                        CONNMAN_COLUMN_FAVORITE, favorite,
                                        CONNMAN_COLUMN_STRENGTH, strength,
-                                       CONNMAN_COLUMN_SECURITY, security, -1);
+                                       CONNMAN_COLUMN_SECURITY, security,
+                                       CONNMAN_COLUMN_METHOD, method,
+                                       CONNMAN_COLUMN_ADDRESS, addr,
+                                       CONNMAN_COLUMN_NETMASK, netmask,
+                                       CONNMAN_COLUMN_GATEWAY, gateway,
+                                       -1);
 
                dbus_g_proxy_add_signal(proxy, "PropertyChanged",
                                G_TYPE_STRING, G_TYPE_VALUE, G_TYPE_INVALID);
@@ -391,7 +445,12 @@ static void service_properties(DBusGProxy *proxy, 
GHashTable *hash,
                                        CONNMAN_COLUMN_STATE, state,
                                        CONNMAN_COLUMN_FAVORITE, favorite,
                                        CONNMAN_COLUMN_STRENGTH, strength,
-                                       CONNMAN_COLUMN_SECURITY, security, -1);
+                                       CONNMAN_COLUMN_SECURITY, security,
+                                       CONNMAN_COLUMN_METHOD, method,
+                                       CONNMAN_COLUMN_ADDRESS, addr,
+                                       CONNMAN_COLUMN_NETMASK, netmask,
+                                       CONNMAN_COLUMN_GATEWAY, gateway,
+                                       -1);
 
 done:
        g_object_unref(proxy);
diff --git a/properties/Makefile.am b/properties/Makefile.am
index c6839e8..38060a3 100644
--- a/properties/Makefile.am
+++ b/properties/Makefile.am
@@ -1,5 +1,5 @@
 
-noinst_PROGRAMS = connman-properties
+bin_PROGRAMS = connman-properties
 
 connman_properties_SOURCES = main.c advanced.h ethernet.c
 
diff --git a/properties/advanced.h b/properties/advanced.h
index 324ec13..fdf6996 100644
--- a/properties/advanced.h
+++ b/properties/advanced.h
@@ -45,6 +45,8 @@ struct config_data {
                GtkWidget *value[3];
                GtkWidget *entry[3];
        } ipv4;
+
+       struct ipv4_config ipv4_config;
 };
 
 static inline gboolean separator_function(GtkTreeModel *model,
@@ -63,8 +65,8 @@ static inline gboolean separator_function(GtkTreeModel *model,
        return result;
 }
 
-void add_ethernet_policy(GtkWidget *mainbox, struct config_data *data);
-void update_ethernet_policy(struct config_data *data, guint policy);
+void add_ethernet_service(GtkWidget *mainbox, GtkTreeIter *iter, struct 
config_data *data);
+void update_ethernet_ipv4(struct config_data *data, guint policy);
 
 void add_wifi_policy(GtkWidget *mainbox, struct config_data *data);
 void update_wifi_policy(struct config_data *data, guint policy);
diff --git a/properties/ethernet.c b/properties/ethernet.c
index 8f60761..e85a005 100644
--- a/properties/ethernet.c
+++ b/properties/ethernet.c
@@ -32,94 +32,151 @@
 
 static void changed_callback(GtkWidget *editable, gpointer user_data)
 {
-#if 0
        struct config_data *data = user_data;
        gint active;
 
        active = gtk_combo_box_get_active(GTK_COMBO_BOX(data->policy.config));
 
-       switch (active) {
-       case 0:
-               connman_client_set_policy(data->client, data->device, "auto");
-               update_ethernet_policy(data, CONNMAN_POLICY_AUTO);
-               break;
-       case 1:
-               connman_client_set_policy(data->client, data->device, "ignore");
-               update_ethernet_policy(data, CONNMAN_POLICY_IGNORE);
-               break;
-       case 3:
-               connman_client_set_policy(data->client, data->device, "off");
-               update_ethernet_policy(data, CONNMAN_POLICY_OFF);
-               break;
-       }
-#endif
+       update_ethernet_ipv4(data, active);
+}
+
+static void apply_callback(GtkWidget *editable, gpointer user_data)
+{
+       struct config_data *data = user_data;
+       gint active;
+
+       active = gtk_combo_box_get_active(GTK_COMBO_BOX(data->policy.config));
+       data->ipv4_config.method = active ? "manual" : "dhcp";
+       data->ipv4_config.address = active ? 
gtk_entry_get_text(GTK_ENTRY(data->ipv4.entry[0])) : NULL;
+       data->ipv4_config.netmask = active ? 
gtk_entry_get_text(GTK_ENTRY(data->ipv4.entry[1])) : NULL;
+       data->ipv4_config.gateway = active ? 
gtk_entry_get_text(GTK_ENTRY(data->ipv4.entry[2])) : NULL;
+
+       connman_client_set_ipv4(data->client, data->device, &data->ipv4_config);
 }
 
-void add_ethernet_policy(GtkWidget *mainbox, struct config_data *data)
+void add_ethernet_service(GtkWidget *mainbox, GtkTreeIter *iter, struct 
config_data *data)
 {
        GtkWidget *vbox;
        GtkWidget *table;
        GtkWidget *label;
        GtkWidget *combo;
 
-       vbox = gtk_vbox_new(FALSE, 0);
+       GtkWidget *entry;
+       GtkWidget *button;
+
+       struct ipv4_config ipv4_config = {
+               .method  = NULL,
+               .address = NULL,
+               .netmask = NULL,
+               .gateway = NULL,
+       };
+
+       gtk_tree_model_get(data->model, iter,
+                       CONNMAN_COLUMN_METHOD, &ipv4_config.method,
+                       CONNMAN_COLUMN_ADDRESS, &ipv4_config.address,
+                       CONNMAN_COLUMN_NETMASK, &ipv4_config.netmask,
+                       CONNMAN_COLUMN_GATEWAY, &ipv4_config.gateway,
+                       -1);
+
+       vbox = gtk_vbox_new(TRUE, 0);
+
        gtk_container_set_border_width(GTK_CONTAINER(vbox), 24);
        gtk_box_pack_start(GTK_BOX(mainbox), vbox, FALSE, FALSE, 0);
 
-       table = gtk_table_new(2, 4, FALSE);
-       gtk_table_set_row_spacings(GTK_TABLE(table), 8);
-       gtk_table_set_col_spacings(GTK_TABLE(table), 8);
+       table = gtk_table_new(5, 5, TRUE);
+       gtk_table_set_row_spacings(GTK_TABLE(table), 10);
+       gtk_table_set_col_spacings(GTK_TABLE(table), 10);
        gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, FALSE, 0);
 
        label = gtk_label_new(_("Configuration:"));
-       gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_RIGHT);
-       gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5);
-       gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 0, 1);
+       gtk_table_attach_defaults(GTK_TABLE(table), label, 1, 2, 0, 1);
 
        combo = gtk_combo_box_new_text();
-       gtk_combo_box_append_text(GTK_COMBO_BOX(combo), "Automatically");
-       gtk_combo_box_append_text(GTK_COMBO_BOX(combo), "Ignore Interface");
-       gtk_combo_box_append_text(GTK_COMBO_BOX(combo), "");
-       gtk_combo_box_append_text(GTK_COMBO_BOX(combo), "Off");
+       gtk_combo_box_append_text(GTK_COMBO_BOX(combo), "DHCP");
+       gtk_combo_box_append_text(GTK_COMBO_BOX(combo), "MANUAL");
        gtk_combo_box_set_row_separator_func(GTK_COMBO_BOX(combo),
                                        separator_function, NULL, NULL);
-       gtk_table_attach_defaults(GTK_TABLE(table), combo, 1, 4, 0, 1);
+       gtk_table_attach_defaults(GTK_TABLE(table), combo, 2, 4, 0, 1);
        data->policy.config = combo;
 
-       label = gtk_label_new(NULL);
-       gtk_label_set_line_wrap(GTK_LABEL(label), TRUE);
-       gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_LEFT);
-       gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.0);
-       gtk_table_attach_defaults(GTK_TABLE(table), label, 1, 4, 1, 2);
-       gtk_widget_set_size_request(label, 180, -1);
-       data->policy.label = label;
+       label = gtk_label_new(_("IP address:"));
+       gtk_table_attach_defaults(GTK_TABLE(table), label, 1, 2, 1, 2);
+       data->ipv4.label[0] = label;
+
+       entry = gtk_entry_new();
+       gtk_entry_set_max_length (GTK_ENTRY (entry), 15);
+       if (ipv4_config.address)
+               gtk_entry_set_text(GTK_ENTRY(entry), ipv4_config.address);
+       gtk_table_attach_defaults(GTK_TABLE(table), entry, 2, 4, 1, 2);
+       data->ipv4.entry[0] = entry;
+
+       label = gtk_label_new(_("Netmask:"));
+       gtk_table_attach_defaults(GTK_TABLE(table), label, 1, 2, 2, 3);
+       data->ipv4.label[1] = label;
+
+       entry = gtk_entry_new();
+       gtk_entry_set_max_length (GTK_ENTRY (entry), 15);
+       if (ipv4_config.netmask)
+               gtk_entry_set_text(GTK_ENTRY(entry), ipv4_config.netmask);
+       gtk_table_attach_defaults(GTK_TABLE(table), entry, 2, 4, 2, 3);
+       data->ipv4.entry[1] = entry;
+
+       label = gtk_label_new(_("Gateway:"));
+       gtk_table_attach_defaults(GTK_TABLE(table), label, 1, 2, 3, 4);
+       data->ipv4.label[2] = label;
+
+       entry = gtk_entry_new();
+       gtk_entry_set_max_length (GTK_ENTRY (entry), 15);
+       if (ipv4_config.gateway)
+               gtk_entry_set_text(GTK_ENTRY(entry), ipv4_config.gateway);
+       gtk_table_attach_defaults(GTK_TABLE(table), entry, 2, 4, 3, 4);
+       data->ipv4.entry[2] = entry;
+
+       data->ipv4_config = ipv4_config;
+
+       button = gtk_button_new_with_label(_("Apply"));
+       gtk_table_attach_defaults(GTK_TABLE(table), button, 3, 4, 4, 5);
+       g_signal_connect(G_OBJECT(button), "clicked",
+                       G_CALLBACK(apply_callback), data);
+
+       data->button = button;
+
+       if (g_str_equal(ipv4_config.method, "dhcp") == TRUE)
+               update_ethernet_ipv4(data, CONNMAN_POLICY_DHCP);
+       else
+               update_ethernet_ipv4(data, CONNMAN_POLICY_MANUAL);
 
        g_signal_connect(G_OBJECT(combo), "changed",
-                               G_CALLBACK(changed_callback), data);
+                       G_CALLBACK(changed_callback), data);
 }
 
-void update_ethernet_policy(struct config_data *data, guint policy)
+void update_ethernet_ipv4(struct config_data *data, guint policy)
 {
-#if 0
        GtkWidget *combo = data->policy.config;
-       gchar *info = NULL;
+       GtkWidget *entry[3];
+       int i;
+
+       for (i = 0; i < 3; i++)
+               entry[i] = data->ipv4.entry[i];
 
        g_signal_handlers_block_by_func(G_OBJECT(combo),
                                        G_CALLBACK(changed_callback), data);
 
        switch (policy) {
-       case CONNMAN_POLICY_OFF:
-               gtk_combo_box_set_active(GTK_COMBO_BOX(combo), 3);
+       case CONNMAN_POLICY_DHCP:
+               gtk_combo_box_set_active(GTK_COMBO_BOX(combo), 0);
+               for (i = 0; i < 3; i++) {
+                       gtk_entry_set_editable(GTK_ENTRY(entry[i]), 0);
+                       gtk_widget_set_sensitive(entry[i], 0);
+                       gtk_entry_set_text(GTK_ENTRY(entry[i]), _(""));
+               }
                break;
-       case CONNMAN_POLICY_IGNORE:
+       case CONNMAN_POLICY_MANUAL:
                gtk_combo_box_set_active(GTK_COMBO_BOX(combo), 1);
-               info = g_strdup_printf(_("Ignore the interface and don't "
-                               "make any attempts for configuration."));
-               break;
-       case CONNMAN_POLICY_AUTO:
-               gtk_combo_box_set_active(GTK_COMBO_BOX(combo), 0);
-               info = g_strdup_printf(_("Detect carrier and then "
-                               "automatically configure the interface."));
+               for (i = 0; i < 3; i++) {
+                       gtk_entry_set_editable(GTK_ENTRY(entry[i]), 1);
+                       gtk_widget_set_sensitive(entry[i], 1);
+               }
                break;
        default:
                gtk_combo_box_set_active(GTK_COMBO_BOX(combo), -1);
@@ -128,9 +185,4 @@ void update_ethernet_policy(struct config_data *data, guint 
policy)
 
        g_signal_handlers_unblock_by_func(G_OBJECT(combo),
                                        G_CALLBACK(changed_callback), data);
-
-       gtk_label_set_markup(GTK_LABEL(data->policy.label), info);
-
-       g_free(info);
-#endif
 }
diff --git a/properties/main.c b/properties/main.c
index 614329f..49bb218 100644
--- a/properties/main.c
+++ b/properties/main.c
@@ -97,7 +97,7 @@ static struct config_data *create_config(GtkTreeModel *model,
 
        switch (type) {
        case CONNMAN_TYPE_ETHERNET:
-               add_ethernet_policy(mainbox, data);
+               add_ethernet_service(mainbox, iter, data);
                break;
        case CONNMAN_TYPE_WIFI:
 //             add_wifi_policy(mainbox, data);
-- 
1.7.1

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

Reply via email to