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