diff options
author | Dongxiao Xu <dongxiao.xu@intel.com> | 2010-09-10 16:49:14 +0800 |
---|---|---|
committer | Richard Purdie <rpurdie@linux.intel.com> | 2010-09-10 11:52:50 +0100 |
commit | 30c2b0bb84f215b2aed43d774120c70712b59729 (patch) | |
tree | baccf810252efbc3feb7f938d57c3bb6bae03a95 /meta/recipes-connectivity | |
parent | 566de26cf56d6aaea017315cb927d42ed00b3c96 (diff) | |
download | openembedded-core-30c2b0bb84f215b2aed43d774120c70712b59729.tar.gz openembedded-core-30c2b0bb84f215b2aed43d774120c70712b59729.tar.bz2 openembedded-core-30c2b0bb84f215b2aed43d774120c70712b59729.zip |
connman-gnome: Add some functionality.
Add offline mode.
Add ethernet/wifi enable/disable functionality.
Classify each service (ethernet, wifi) into certain group.
Do some code clean up.
Signed-off-by: Dongxiao Xu <dongxiao.xu@intel.com>
Diffstat (limited to 'meta/recipes-connectivity')
-rw-r--r-- | meta/recipes-connectivity/connman/connman-gnome/connman-gnome.patch | 1716 | ||||
-rw-r--r-- | meta/recipes-connectivity/connman/connman-gnome_0.5.bb | 2 |
2 files changed, 1134 insertions, 584 deletions
diff --git a/meta/recipes-connectivity/connman/connman-gnome/connman-gnome.patch b/meta/recipes-connectivity/connman/connman-gnome/connman-gnome.patch index 52b105e477..2fe8bb80fb 100644 --- a/meta/recipes-connectivity/connman/connman-gnome/connman-gnome.patch +++ b/meta/recipes-connectivity/connman/connman-gnome/connman-gnome.patch @@ -12,13 +12,23 @@ end user. Signed-off-by: Dongxiao Xu <dongxiao.xu@intel.com> diff --git a/applet/main.c b/applet/main.c -index 2a9b36e..1243a41 100644 +index 2a9b36e..08d394c 100644 --- a/applet/main.c +++ b/applet/main.c -@@ -108,138 +108,8 @@ static void toggled_callback(GtkWidget *button, gpointer user_data) - gtk_entry_set_visibility(GTK_ENTRY(entry), mode); +@@ -98,279 +98,21 @@ static void settings_callback(GtkWidget *item, gpointer user_data) + g_printerr("Couldn't execute command: %s\n", command); } +-static void toggled_callback(GtkWidget *button, gpointer user_data) +-{ +- GtkWidget *entry = user_data; +- gboolean mode; +- +- mode = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button)); +- +- gtk_entry_set_visibility(GTK_ENTRY(entry), mode); +-} +- -static void passphrase_dialog(const char *path, const char *name) -{ - GtkWidget *dialog; @@ -149,25 +159,49 @@ index 2a9b36e..1243a41 100644 - return menu; -} - - static GtkWidget *append_menuitem(GtkMenu *menu, const char *ssid, +-static GtkWidget *append_menuitem(GtkMenu *menu, const char *ssid, - guint security, guint strength) -+ gchar *security, guint strength) - { - GtkWidget *item; - GtkWidget *hbox; -@@ -263,7 +133,7 @@ static GtkWidget *append_menuitem(GtkMenu *menu, const char *ssid, - image = gtk_image_new_from_stock(GTK_STOCK_DIALOG_AUTHENTICATION, - GTK_ICON_SIZE_MENU); - gtk_misc_set_alignment(GTK_MISC(image), 1.0, 0.5); +-{ +- GtkWidget *item; +- GtkWidget *hbox; +- GtkWidget *label; +- GtkWidget *image; +- GtkWidget *progress; +- +- item = gtk_check_menu_item_new(); +- gtk_check_menu_item_set_draw_as_radio(GTK_CHECK_MENU_ITEM(item), TRUE); +- +- hbox = gtk_hbox_new(FALSE, 6); +- gtk_container_add(GTK_CONTAINER(item), hbox); +- gtk_widget_show(hbox); +- +- label = gtk_label_new(NULL); +- gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); +- gtk_label_set_text(GTK_LABEL(label), ssid); +- gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 0); +- gtk_widget_show(label); +- +- image = gtk_image_new_from_stock(GTK_STOCK_DIALOG_AUTHENTICATION, +- GTK_ICON_SIZE_MENU); +- gtk_misc_set_alignment(GTK_MISC(image), 1.0, 0.5); - if (security != CONNMAN_SECURITY_NONE) { -+ if (security && g_str_equal(security, "none") != TRUE) { - gtk_box_pack_start(GTK_BOX(hbox), image, FALSE, FALSE, 0); - gtk_widget_show(image); - } -@@ -281,96 +151,21 @@ static GtkWidget *append_menuitem(GtkMenu *menu, const char *ssid, - return item; - } - +- gtk_box_pack_start(GTK_BOX(hbox), image, FALSE, FALSE, 0); +- gtk_widget_show(image); +- } +- +- progress = gtk_progress_bar_new(); +- gtk_widget_set_size_request(progress, 100, -1); +- gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(progress), +- (double) strength / 100); +- gtk_box_pack_end(GTK_BOX(hbox), progress, FALSE, TRUE, 0); +- gtk_widget_show(progress); +- +- gtk_widget_show(item); +- gtk_menu_shell_append(GTK_MENU_SHELL(menu), item); +- +- return item; +-} +- -static void enumerate_networks(GtkMenu *menu, - GtkTreeModel *model, GtkTreeIter *parent) -{ @@ -265,7 +299,7 @@ index 2a9b36e..1243a41 100644 gtk_widget_show(item); gtk_menu_shell_append(GTK_MENU_SHELL(menu), item); -@@ -387,16 +182,17 @@ static void update_status(GtkTreeModel *model) +@@ -387,16 +129,17 @@ static void update_status(GtkTreeModel *model) cont = gtk_tree_model_get_iter_first(model, &iter); while (cont == TRUE) { @@ -286,7 +320,7 @@ index 2a9b36e..1243a41 100644 break; cont = gtk_tree_model_iter_next(model, &iter); -@@ -453,7 +249,7 @@ int main(int argc, char *argv[]) +@@ -453,7 +196,7 @@ int main(int argc, char *argv[]) g_set_application_name(_("Connection Manager")); @@ -393,10 +427,10 @@ index ff3a996..8d74a46 100644 connman-dbus-glue.h \ instance-glue.h diff --git a/common/connman-client.c b/common/connman-client.c -index aad0a22..96f9388 100644 +index aad0a22..4f9cf64 100644 --- a/common/connman-client.c +++ b/common/connman-client.c -@@ -98,10 +98,9 @@ static void connman_client_init(ConnmanClient *client) +@@ -98,13 +98,13 @@ static void connman_client_init(ConnmanClient *client) priv->store = gtk_tree_store_new(_CONNMAN_NUM_COLUMNS, G_TYPE_OBJECT, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_UINT, @@ -406,11 +440,33 @@ index aad0a22..96f9388 100644 - G_TYPE_STRING); + G_TYPE_STRING, G_TYPE_UINT, G_TYPE_STRING, + G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, -+ G_TYPE_STRING, G_TYPE_STRING); ++ G_TYPE_STRING, G_TYPE_STRING, ++ G_TYPE_BOOLEAN, G_TYPE_BOOLEAN, G_TYPE_BOOLEAN); g_object_set_data(G_OBJECT(priv->store), - "State", g_strdup("unavailable")); -@@ -197,7 +196,7 @@ static gboolean device_filter(GtkTreeModel *model, +- "State", g_strdup("unavailable")); ++ "State", g_strdup("unavailable")); + + priv->dbus = dbus_g_proxy_new_for_name(connection, DBUS_SERVICE_DBUS, + DBUS_PATH_DBUS, DBUS_INTERFACE_DBUS); +@@ -191,13 +191,23 @@ static gboolean device_filter(GtkTreeModel *model, + { + DBusGProxy *proxy; + gboolean active; ++ guint type; + +- gtk_tree_model_get(model, iter, CONNMAN_COLUMN_PROXY, &proxy, -1); ++ gtk_tree_model_get(model, iter, CONNMAN_COLUMN_PROXY, &proxy, ++ CONNMAN_COLUMN_TYPE, &type, ++ -1); ++ ++ switch (type) { ++ case CONNMAN_TYPE_LABEL_ETHERNET: ++ case CONNMAN_TYPE_LABEL_WIFI: ++ case CONNMAN_TYPE_SYSCONFIG: ++ return TRUE; ++ } + if (proxy == NULL) return FALSE; @@ -419,7 +475,7 @@ index aad0a22..96f9388 100644 dbus_g_proxy_get_interface(proxy)); g_object_unref(proxy); -@@ -231,10 +230,10 @@ static gboolean device_network_filter(GtkTreeModel *model, +@@ -231,10 +241,10 @@ static gboolean device_network_filter(GtkTreeModel *model, if (proxy == NULL) return FALSE; @@ -432,7 +488,7 @@ index aad0a22..96f9388 100644 dbus_g_proxy_get_interface(proxy)); g_object_unref(proxy); -@@ -277,7 +276,7 @@ GtkTreeModel *connman_client_get_network_model(ConnmanClient *client, +@@ -277,7 +287,7 @@ GtkTreeModel *connman_client_get_network_model(ConnmanClient *client, gtk_tree_model_get(GTK_TREE_MODEL(priv->store), &iter, CONNMAN_COLUMN_PROXY, &proxy, -1); @@ -441,7 +497,7 @@ index aad0a22..96f9388 100644 dbus_g_proxy_get_interface(proxy)) == TRUE) found = g_str_has_prefix(dbus_g_proxy_get_path(proxy), device); -@@ -314,7 +313,7 @@ static gboolean connection_filter(GtkTreeModel *model, +@@ -314,7 +324,7 @@ static gboolean connection_filter(GtkTreeModel *model, if (proxy == NULL) return FALSE; @@ -450,13 +506,13 @@ index aad0a22..96f9388 100644 dbus_g_proxy_get_interface(proxy)); g_object_unref(proxy); -@@ -337,12 +336,19 @@ GtkTreeModel *connman_client_get_connection_model(ConnmanClient *client) +@@ -337,28 +347,37 @@ GtkTreeModel *connman_client_get_connection_model(ConnmanClient *client) return model; } -void connman_client_set_policy(ConnmanClient *client, const gchar *device, - const gchar *policy) -+void connman_client_set_ipv4(ConnmanClient *client, const gchar *device, ++gboolean connman_client_set_ipv4(ConnmanClient *client, const gchar *device, + struct ipv4_config *ipv4_config) { ConnmanClientPrivate *priv = CONNMAN_CLIENT_GET_PRIVATE(client); @@ -472,9 +528,14 @@ index aad0a22..96f9388 100644 DBG("client %p", client); -@@ -353,10 +359,10 @@ void connman_client_set_policy(ConnmanClient *client, const gchar *device, + if (device == NULL) +- return; ++ return FALSE; + + proxy = connman_dbus_get_proxy(priv->store, device); if (proxy == NULL) - return; +- return; ++ return FALSE; - g_value_init(&value, G_TYPE_STRING); - g_value_set_string(&value, policy); @@ -485,43 +546,96 @@ index aad0a22..96f9388 100644 + ret = connman_set_property(proxy, "IPv4.Configuration", &value, NULL); g_object_unref(proxy); ++ ++ return ret; } -@@ -389,26 +395,22 @@ static gboolean device_scan(GtkTreeModel *model, GtkTreePath *path, - GtkTreeIter *iter, gpointer user_data) + + void connman_client_set_powered(ConnmanClient *client, const gchar *device, +@@ -385,98 +404,128 @@ void connman_client_set_powered(ConnmanClient *client, const gchar *device, + g_object_unref(proxy); + } + +-static gboolean device_scan(GtkTreeModel *model, GtkTreePath *path, +- GtkTreeIter *iter, gpointer user_data) ++void connman_client_request_scan(ConnmanClient *client, char *scantype, ++ connman_request_scan_reply callback, gpointer userdata) { - DBusGProxy *proxy; +- DBusGProxy *proxy; - gboolean enabled; ++ ConnmanClientPrivate *priv = CONNMAN_CLIENT_GET_PRIVATE(client); - gtk_tree_model_get(model, iter, CONNMAN_COLUMN_PROXY, &proxy, +- gtk_tree_model_get(model, iter, CONNMAN_COLUMN_PROXY, &proxy, - CONNMAN_COLUMN_ENABLED, &enabled, -1); -+ -1); ++ DBG("client %p", client); - if (proxy == NULL) - return FALSE; +- if (proxy == NULL) +- return FALSE; ++ connman_request_scan_async(priv->manager, scantype, callback, userdata); ++} - if (g_str_equal(dbus_g_proxy_get_interface(proxy), +- if (g_str_equal(dbus_g_proxy_get_interface(proxy), - CONNMAN_DEVICE_INTERFACE) == FALSE) - return FALSE; -- ++gboolean connman_client_get_offline_status(ConnmanClient *client) ++{ ++ GHashTable *hash; ++ GValue *value; ++ ConnmanClientPrivate *priv = CONNMAN_CLIENT_GET_PRIVATE(client); ++ gboolean ret; + - if (enabled == FALSE) -+ CONNMAN_SERVICE_INTERFACE) == FALSE) - return FALSE; +- return FALSE; ++ DBG("client %p", client); - connman_propose_scan(proxy, NULL); +- connman_propose_scan(proxy, NULL); ++ ret = connman_get_properties(priv->manager, &hash, NULL); - g_object_unref(proxy); +- g_object_unref(proxy); ++ if (ret == FALSE) ++ goto done; ++ ++ value = g_hash_table_lookup(hash, "OfflineMode"); ++ ret = value ? g_value_get_boolean(value) : FALSE; ++ ++done: ++ return ret; - return FALSE; -+ return TRUE; } - void connman_client_propose_scan(ConnmanClient *client, const gchar *device) -@@ -437,46 +439,85 @@ static gboolean network_disconnect(GtkTreeModel *model, GtkTreePath *path, +-void connman_client_propose_scan(ConnmanClient *client, const gchar *device) ++void connman_client_set_offlinemode(ConnmanClient *client, gboolean status) + { + ConnmanClientPrivate *priv = CONNMAN_CLIENT_GET_PRIVATE(client); +- DBusGProxy *proxy; ++ GValue value = { 0 }; + + DBG("client %p", client); + +- if (device == NULL) { +- gtk_tree_model_foreach(GTK_TREE_MODEL(priv->store), +- device_scan, NULL); +- return; +- } +- +- proxy = connman_dbus_get_proxy(priv->store, device); +- if (proxy == NULL) +- return; +- +- connman_propose_scan(proxy, NULL); ++ g_value_init(&value, G_TYPE_BOOLEAN); ++ g_value_set_boolean(&value, status); + +- g_object_unref(proxy); ++ connman_set_property(priv->manager, "OfflineMode", &value, NULL); + } + + static gboolean network_disconnect(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer user_data) { DBusGProxy *proxy; - gboolean enabled; -+ gchar *name; ++ char *name; + guint type; gtk_tree_model_get(model, iter, CONNMAN_COLUMN_PROXY, &proxy, @@ -600,20 +714,14 @@ index aad0a22..96f9388 100644 + if (proxy == NULL) + goto done; + -+ /* Set an unusually long timeout because the Connect -+ * method doesn't return until there has been either -+ * success or an error. -+ */ -+ dbus_g_proxy_set_default_timeout(proxy, 120000); + connman_connect_async(proxy, callback, userdata); -+ dbus_g_proxy_set_default_timeout(proxy, -1); + +done: + return; } static void connman_client_disconnect_all(ConnmanClient *client) -@@ -487,32 +528,37 @@ static void connman_client_disconnect_all(ConnmanClient *client) +@@ -487,32 +536,37 @@ static void connman_client_disconnect_all(ConnmanClient *client) network_disconnect, NULL); } @@ -657,7 +765,7 @@ index aad0a22..96f9388 100644 DBG("client %p", client); -@@ -548,56 +594,37 @@ gchar *connman_client_get_passphrase(ConnmanClient *client, const gchar *network +@@ -548,41 +602,60 @@ gchar *connman_client_get_passphrase(ConnmanClient *client, const gchar *network return passphrase; } @@ -682,51 +790,114 @@ index aad0a22..96f9388 100644 - return; + goto done; -+ DBG("passphrase %s", passphrase); g_value_init(&value, G_TYPE_STRING); g_value_set_string(&value, passphrase); - connman_set_property(proxy, "WiFi.Passphrase", &value, NULL); -- -- g_value_unset(&value); -- -- g_object_unref(proxy); --} -- ++ ret = connman_set_property(proxy, "Passphrase", &value, NULL); + + g_value_unset(&value); + + g_object_unref(proxy); ++done: ++ return ret; + } + -void connman_client_set_remember(ConnmanClient *client, const gchar *network, - gboolean remember) --{ -- ConnmanClientPrivate *priv = CONNMAN_CLIENT_GET_PRIVATE(client); ++void connman_client_set_callback(ConnmanClient *client, ++ ConnmanClientCallback callback, gpointer user_data) + { + ConnmanClientPrivate *priv = CONNMAN_CLIENT_GET_PRIVATE(client); - DBusGProxy *proxy; - GValue value = { 0 }; -- -- DBG("client %p", client); -- -- if (network == NULL) -- return; -- -- proxy = connman_dbus_get_proxy(priv->store, network); -- if (proxy == NULL) -- return; -- ++ gchar *state; + + DBG("client %p", client); + ++ priv->callback = callback; ++ priv->userdata = user_data; ++ ++ g_object_set_data(G_OBJECT(priv->store), "callback", callback); ++ g_object_set_data(G_OBJECT(priv->store), "userdata", user_data); ++ ++ state = g_object_get_data(G_OBJECT(priv->store), "State"); ++ if (state != NULL && priv->callback != NULL) ++ priv->callback(state, priv->userdata); ++} ++ ++void connman_client_remove(ConnmanClient *client, const gchar *network) ++{ ++ ConnmanClientPrivate *priv = CONNMAN_CLIENT_GET_PRIVATE(client); ++ DBusGProxy *proxy; ++ + if (network == NULL) + return; + +@@ -590,31 +663,46 @@ void connman_client_set_remember(ConnmanClient *client, const gchar *network, + if (proxy == NULL) + return; + - g_value_init(&value, G_TYPE_BOOLEAN); - g_value_set_boolean(&value, remember); -- ++ connman_remove(proxy, NULL); ++ ++ g_object_unref(proxy); ++} ++ ++void connman_client_enable_technology(ConnmanClient *client, const char *network, ++ const gchar *technology) ++{ ++ ConnmanClientPrivate *priv = CONNMAN_CLIENT_GET_PRIVATE(client); ++ DBusGProxy *proxy; ++ int ret; + - connman_set_property(proxy, "Remember", &value, NULL); -+ ret = connman_set_property(proxy, "Passphrase", &value, NULL); -+ DBG("passphrase setting succeeded? %d", ret); -+ DBG("false is ? %d", FALSE); ++ if (network== NULL) ++ return; - g_value_unset(&value); +- g_value_unset(&value); ++ proxy = connman_dbus_get_proxy(priv->store, network); ++ if (proxy == NULL) ++ return; ++ ++ ret = connman_enable_technology(proxy, technology, NULL); g_object_unref(proxy); -+done: -+ return ret; } - void connman_client_set_callback(ConnmanClient *client, +-void connman_client_set_callback(ConnmanClient *client, +- ConnmanClientCallback callback, gpointer user_data) ++void connman_client_disable_technology(ConnmanClient *client, const char *network, ++ const gchar *technology) + { + ConnmanClientPrivate *priv = CONNMAN_CLIENT_GET_PRIVATE(client); +- gchar *state; ++ DBusGProxy *proxy; ++ int ret; + +- DBG("client %p", client); + +- priv->callback = callback; +- priv->userdata = user_data; ++ if (network == NULL) ++ return; + +- g_object_set_data(G_OBJECT(priv->store), "callback", callback); +- g_object_set_data(G_OBJECT(priv->store), "userdata", user_data); ++ proxy = connman_dbus_get_proxy(priv->store, network); ++ if (proxy == NULL) ++ return; + +- state = g_object_get_data(G_OBJECT(priv->store), "State"); +- if (state != NULL && priv->callback != NULL) +- priv->callback(state, priv->userdata); ++ ret = connman_disable_technology(proxy, technology, NULL); ++ ++ g_object_unref(proxy); + } diff --git a/common/connman-client.h b/common/connman-client.h -index f30dae4..f3ac1d3 100644 +index f30dae4..00c328a 100644 --- a/common/connman-client.h +++ b/common/connman-client.h @@ -23,6 +23,7 @@ @@ -778,15 +949,26 @@ index f30dae4..f3ac1d3 100644 const gchar *passphrase); void connman_client_set_remember(ConnmanClient *client, const gchar *network, gboolean remember); -@@ -81,22 +91,27 @@ typedef void (* ConnmanClientCallback) (const char *status, void *user_data); +@@ -81,37 +91,63 @@ typedef void (* ConnmanClientCallback) (const char *status, void *user_data); void connman_client_set_callback(ConnmanClient *client, ConnmanClientCallback callback, gpointer user_data); -+void connman_client_set_ipv4(ConnmanClient *client, const gchar *device, ++gboolean connman_client_set_ipv4(ConnmanClient *client, const gchar *device, + struct ipv4_config *ipv4_config); + +gboolean connman_dbus_get_iter(GtkTreeStore *store, const gchar *path, + GtkTreeIter *iter); ++void connman_client_remove(ConnmanClient *client, const gchar *network); ++ ++void connman_client_request_scan(ConnmanClient *client, char *scantype, ++ connman_request_scan_reply callback, gpointer userdata); ++gboolean connman_client_get_offline_status(ConnmanClient *client); ++void connman_client_set_offlinemode(ConnmanClient *client, gboolean status); ++ ++void connman_client_enable_technology(ConnmanClient *client, const char *network, ++ const gchar *technology); ++void connman_client_disable_technology(ConnmanClient *client, const char *network, ++ const gchar *technology); enum { CONNMAN_COLUMN_PROXY, /* G_TYPE_OBJECT */ + CONNMAN_COLUMN_STATE, /* G_TYPE_STRING */ @@ -811,12 +993,29 @@ index f30dae4..f3ac1d3 100644 + CONNMAN_COLUMN_ADDRESS, /* G_TYPE_STRING */ + CONNMAN_COLUMN_NETMASK, /* G_TYPE_STRING */ + CONNMAN_COLUMN_GATEWAY, /* G_TYPE_STRING */ ++ ++ CONNMAN_COLUMN_ETHERNET_ENABLED, /* G_TYPE_BOOLEAN */ ++ CONNMAN_COLUMN_WIFI_ENABLED, /* G_TYPE_BOOLEAN */ ++ ++ CONNMAN_COLUMN_OFFLINEMODE, /* G_TYPE_BOOLEAN */ ++ + _CONNMAN_NUM_COLUMNS, + }; enum { -@@ -108,10 +123,7 @@ enum { + CONNMAN_TYPE_UNKNOWN, ++ + CONNMAN_TYPE_ETHERNET, + CONNMAN_TYPE_WIFI, + CONNMAN_TYPE_WIMAX, + CONNMAN_TYPE_BLUETOOTH, ++ ++ CONNMAN_TYPE_LABEL_ETHERNET, ++ CONNMAN_TYPE_LABEL_WIFI, ++ ++ CONNMAN_TYPE_SYSCONFIG, ++ _CONNMAN_NUM_TYPE, }; enum { @@ -829,25 +1028,38 @@ index f30dae4..f3ac1d3 100644 }; diff --git a/common/connman-dbus.c b/common/connman-dbus.c -index 9eba7ae..83f4e57 100644 +index 9eba7ae..bf1778f 100644 --- a/common/connman-dbus.c +++ b/common/connman-dbus.c -@@ -159,20 +159,22 @@ static gint compare_path(gconstpointer a, gconstpointer b) - return g_strcmp0(a, b); +@@ -137,6 +137,27 @@ DBusGProxy *connman_dbus_get_proxy(GtkTreeStore *store, const gchar *path) + return proxy; } -+static gint compare_list(gchar *path_a, gchar *path_b, gpointer user_data) ++static gboolean compare_type(GtkTreeStore *store, GtkTreeIter *iter, ++ gconstpointer user_data) +{ -+ return g_strcmp0(path_a, path_b); ++ guint type_target = GPOINTER_TO_UINT(user_data); ++ guint type; ++ gboolean found = FALSE; ++ ++ gtk_tree_model_get(GTK_TREE_MODEL(store), iter, ++ CONNMAN_COLUMN_TYPE, &type, -1); ++ ++ if (type != CONNMAN_TYPE_UNKNOWN) ++ found = (type == type_target); ++ ++ return found; +} + ++static gboolean get_iter_from_type(GtkTreeStore *store, GtkTreeIter *iter, guint type) ++{ ++ return iter_search(store, iter, NULL, compare_type, GUINT_TO_POINTER(type)); ++} + - static void property_update(GtkTreeStore *store, const GValue *value, - const char *key, connman_get_properties_reply callback) + gboolean connman_dbus_get_iter(GtkTreeStore *store, const gchar *path, + GtkTreeIter *iter) { -- GSList *list, *link, *old_list, *new_list = NULL; -+ GSList *list, *link, *old_list, *new_list = NULL, *sorted_list = NULL; - const char *iface; +@@ -167,12 +188,7 @@ static void property_update(GtkTreeStore *store, const GValue *value, DBG("store %p key %s", store, key); @@ -857,25 +1069,11 @@ index 9eba7ae..83f4e57 100644 - iface = CONNMAN_DEVICE_INTERFACE; - else - iface = CONNMAN_NETWORK_INTERFACE; -+ if (g_str_equal(key, "Services") == TRUE) -+ iface = CONNMAN_SERVICE_INTERFACE; ++ iface = CONNMAN_SERVICE_INTERFACE; old_list = g_object_get_data(G_OBJECT(store), key); -@@ -180,7 +182,11 @@ static void property_update(GtkTreeStore *store, const GValue *value, - - g_object_set_data(G_OBJECT(store), key, new_list); - -- for (list = new_list; list; list = list->next) { -+ sorted_list = g_slist_sort_with_data(new_list, -+ (GCompareDataFunc)compare_list, store); -+ g_object_set_data(G_OBJECT(store), "Services", sorted_list); -+ -+ for (list = sorted_list; list; list = list->next) { - gchar *path = list->data; - DBusGProxy *proxy; - -@@ -205,25 +211,12 @@ static void property_update(GtkTreeStore *store, const GValue *value, +@@ -205,25 +221,12 @@ static void property_update(GtkTreeStore *store, const GValue *value, for (list = old_list; list; list = list->next) { gchar *path = list->data; GtkTreeIter iter; @@ -902,7 +1100,7 @@ index 9eba7ae..83f4e57 100644 g_free(path); } -@@ -263,48 +256,19 @@ static const gchar *type2icon(guint type) +@@ -263,155 +266,115 @@ static const gchar *type2icon(guint type) return NULL; } @@ -943,26 +1141,34 @@ index 9eba7ae..83f4e57 100644 -} - -static void network_changed(DBusGProxy *proxy, const char *property, -+static void service_changed(DBusGProxy *proxy, const char *property, - GValue *value, gpointer user_data) +- GValue *value, gpointer user_data) ++static void enabled_technologies_changed(GtkTreeStore *store, GValue *value) { - GtkTreeStore *store = user_data; - const char *path = dbus_g_proxy_get_path(proxy); +- GtkTreeStore *store = user_data; +- const char *path = dbus_g_proxy_get_path(proxy); GtkTreeIter iter; -+ GHashTable *ipv4; -+ const gchar *method, *addr, *netmask, *gateway; -+ GValue *ipv4_method, *ipv4_address, *ipv4_netmask, *ipv4_gateway; -+ -+ const gchar *state, *icon, *name, *security, *passphrase; -+ guint strength, type; -+ - - DBG("store %p proxy %p property %s", store, proxy, property); ++ gboolean ethernet_enabled_prev, ethernet_enabled = FALSE; ++ gboolean wifi_enabled_prev, wifi_enabled = FALSE; ++ gchar **tech = g_value_get_boxed (value); ++ gint i; ++ gboolean ret; -@@ -314,141 +278,92 @@ static void network_changed(DBusGProxy *proxy, const char *property, - if (get_iter_from_path(store, &iter, path) == FALSE) +- DBG("store %p proxy %p property %s", store, proxy, property); +- +- if (property == NULL || value == NULL) ++ if (value == NULL) return; +- if (get_iter_from_path(store, &iter, path) == FALSE) +- return; ++ for (i = 0; i < g_strv_length (tech); i++) ++ { ++ if (g_str_equal("ethernet", *(tech + i))) ++ ethernet_enabled = TRUE; ++ else if (g_str_equal ("wifi", *(tech + i))) ++ wifi_enabled = TRUE; ++ } + - if (g_str_equal(property, "Connected") == TRUE) { - gboolean connected = g_value_get_boolean(value); - gtk_tree_store_set(store, &iter, @@ -973,18 +1179,30 @@ index 9eba7ae..83f4e57 100644 - CONNMAN_COLUMN_INRANGE, inrange, -1); - } else if (g_str_equal(property, "Remember") == TRUE) { - gboolean remember = g_value_get_boolean(value); -- gtk_tree_store_set(store, &iter, ++ get_iter_from_type(store, &iter, CONNMAN_TYPE_LABEL_ETHERNET); ++ gtk_tree_model_get(GTK_TREE_MODEL(store), &iter, ++ CONNMAN_COLUMN_ETHERNET_ENABLED, ðernet_enabled_prev, -1); ++ if (ethernet_enabled_prev != ethernet_enabled) + gtk_tree_store_set(store, &iter, - CONNMAN_COLUMN_REMEMBER, remember, -1); - } else if (g_str_equal(property, "Strength") == TRUE) { - guint strength = g_value_get_uchar(value); -- gtk_tree_store_set(store, &iter, ++ CONNMAN_COLUMN_ETHERNET_ENABLED, ethernet_enabled, -1); ++ ++ ret = get_iter_from_type(store, &iter, CONNMAN_TYPE_LABEL_WIFI); ++ gtk_tree_model_get(GTK_TREE_MODEL(store), &iter, ++ CONNMAN_COLUMN_WIFI_ENABLED, &wifi_enabled_prev, -1); ++ if (wifi_enabled_prev != wifi_enabled) + gtk_tree_store_set(store, &iter, - CONNMAN_COLUMN_STRENGTH, strength, -1); - } --} -- ++ CONNMAN_COLUMN_WIFI_ENABLED, wifi_enabled, -1); + } + -static void network_properties(DBusGProxy *proxy, GHashTable *hash, - GError *error, gpointer user_data) --{ ++static void enabled_technologies_properties(GtkTreeStore *store, DBusGProxy *proxy, GValue *value) + { - GtkTreeStore *store = user_data; - GValue *value; - const gchar *device, *name, *secret; @@ -999,131 +1217,130 @@ index 9eba7ae..83f4e57 100644 - - value = g_hash_table_lookup(hash, "Device"); - device = value ? g_value_get_boxed(value) : NULL; -+ if (g_str_equal(property, "IPv4") == TRUE) { - +- - value = g_hash_table_lookup(hash, "Name"); - name = value ? g_value_get_string(value) : NULL; - - value = g_hash_table_lookup(hash, "Connected"); - connected = value ? g_value_get_boolean(value) : FALSE; -+ ipv4 = g_value_get_boxed (value); -+ if (!ipv4) -+ return; - +- - value = g_hash_table_lookup(hash, "Available"); - inrange = value ? g_value_get_boolean(value) : FALSE; -+ ipv4_method = g_hash_table_lookup (ipv4, "Method"); -+ method = ipv4_method ? g_value_get_string(ipv4_method) : NULL; ++ GtkTreeIter iter; ++ gboolean ethernet_enabled = FALSE; ++ gboolean wifi_enabled = FALSE; ++ gchar **tech = g_value_get_boxed (value); ++ gint i; ++ ++ for (i = 0; i < g_strv_length (tech); i++) ++ { ++ if (g_str_equal("ethernet", *(tech + i))) ++ ethernet_enabled = TRUE; ++ else if (g_str_equal ("wifi", *(tech + i))) ++ wifi_enabled = TRUE; ++ } - value = g_hash_table_lookup(hash, "Remember"); - remember = value ? g_value_get_boolean(value) : FALSE; -+ ipv4_address = g_hash_table_lookup (ipv4, "Address"); -+ addr = ipv4_address ? g_value_get_string(ipv4_address) : NULL; ++ if (get_iter_from_type(store, &iter, CONNMAN_TYPE_LABEL_ETHERNET) == FALSE) ++ gtk_tree_store_append(store, &iter, NULL); - value = g_hash_table_lookup(hash, "Strength"); - strength = value ? g_value_get_uchar(value) : 0; -+ ipv4_netmask = g_hash_table_lookup (ipv4, "Netmask"); -+ netmask = ipv4_netmask ? g_value_get_string(ipv4_netmask) : NULL; ++ gtk_tree_store_set(store, &iter, ++ CONNMAN_COLUMN_PROXY, proxy, ++ CONNMAN_COLUMN_ETHERNET_ENABLED, ethernet_enabled, ++ CONNMAN_COLUMN_TYPE, CONNMAN_TYPE_LABEL_ETHERNET, ++ -1); - value = g_hash_table_lookup(hash, "WiFi.Security"); - security = get_security(value); -+ ipv4_gateway = g_hash_table_lookup (ipv4, "Gateway"); -+ gateway = ipv4_gateway ? g_value_get_string(ipv4_gateway) : NULL; ++ if (get_iter_from_type(store, &iter, CONNMAN_TYPE_LABEL_WIFI) == FALSE) ++ gtk_tree_store_append(store, &iter, NULL); - value = g_hash_table_lookup(hash, "WiFi.Passphrase"); - secret = value ? g_value_get_string(value) : NULL; -- ++ gtk_tree_store_set(store, &iter, ++ CONNMAN_COLUMN_PROXY, proxy, ++ CONNMAN_COLUMN_WIFI_ENABLED, wifi_enabled, ++ CONNMAN_COLUMN_TYPE, CONNMAN_TYPE_LABEL_WIFI, ++ -1); ++} + - DBG("name %s strength %d", name, strength); -- ++static void offline_mode_changed(GtkTreeStore *store, GValue *value) ++{ ++ GtkTreeIter iter; ++ gboolean offline_mode = g_value_get_boolean(value); + - if (get_iter_from_path(store, &parent, device) == FALSE) - return; -- ++ get_iter_from_type(store, &iter, CONNMAN_TYPE_SYSCONFIG); ++ gtk_tree_store_set(store, &iter, ++ CONNMAN_COLUMN_OFFLINEMODE, offline_mode, ++ -1); ++} + - if (get_iter_from_proxy(store, &iter, proxy) == FALSE) { - gtk_tree_store_insert_with_values(store, &iter, &parent, -1, - CONNMAN_COLUMN_PROXY, proxy, -+ 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) { -+ state = value ? g_value_get_string(value) : NULL; -+ gtk_tree_store_set(store, &iter, -+ CONNMAN_COLUMN_STATE, state, -+ -1); -+ } else if (g_str_equal(property, "Name") == TRUE) { -+ name = value ? g_value_get_string(value) : NULL; -+ gtk_tree_store_set(store, &iter, - CONNMAN_COLUMN_NAME, name, +- CONNMAN_COLUMN_NAME, name, - CONNMAN_COLUMN_ENABLED, connected, - CONNMAN_COLUMN_INRANGE, inrange, - CONNMAN_COLUMN_REMEMBER, remember, - CONNMAN_COLUMN_STRENGTH, strength, -+ -1); -+ } else if (g_str_equal(property, "Type") == TRUE) { -+ type = get_type(value); -+ icon = type2icon(type); -+ gtk_tree_store_set(store, &iter, -+ CONNMAN_COLUMN_TYPE, type, -+ CONNMAN_COLUMN_ICON, icon, -+ -1); -+ } else if (g_str_equal(property, "Security") == TRUE) { -+ security = value ? g_value_get_string(value) : NULL; -+ gtk_tree_store_set(store, &iter, - CONNMAN_COLUMN_SECURITY, security, +- CONNMAN_COLUMN_SECURITY, security, - CONNMAN_COLUMN_PASSPHRASE, secret, -1); -- ++static void offline_mode_properties(GtkTreeStore *store, DBusGProxy *proxy, GValue *value) ++{ ++ GtkTreeIter iter; ++ gboolean offline_mode = g_value_get_boolean(value); + - dbus_g_proxy_add_signal(proxy, "PropertyChanged", - G_TYPE_STRING, G_TYPE_VALUE, G_TYPE_INVALID); - dbus_g_proxy_connect_signal(proxy, "PropertyChanged", - G_CALLBACK(network_changed), store, NULL); - } else -+ -1); -+ } else if (g_str_equal(property, "PassPhrase") == TRUE) { -+ passphrase = value ? g_value_get_string(value) : NULL; -+ gtk_tree_store_set(store, &iter, -+ CONNMAN_COLUMN_PASSPHRASE, passphrase, -+ -1); -+ } else if (g_str_equal(property, "Strength") == TRUE) { -+ strength = value ? g_value_get_uchar(value) : 0; - gtk_tree_store_set(store, &iter, +- gtk_tree_store_set(store, &iter, - CONNMAN_COLUMN_NAME, name, - CONNMAN_COLUMN_ENABLED, connected, - CONNMAN_COLUMN_INRANGE, inrange, - CONNMAN_COLUMN_REMEMBER, remember, - CONNMAN_COLUMN_STRENGTH, strength, +- CONNMAN_COLUMN_STRENGTH, strength, - CONNMAN_COLUMN_SECURITY, security, - CONNMAN_COLUMN_PASSPHRASE, secret, -1); -- ++ if (get_iter_from_type(store, &iter, CONNMAN_TYPE_SYSCONFIG) == FALSE) ++ gtk_tree_store_insert(store, &iter, NULL, 0); + -done: - g_object_unref(proxy); -+ -1); -+ } ++ gtk_tree_store_set(store, &iter, ++ CONNMAN_COLUMN_PROXY, proxy, ++ CONNMAN_COLUMN_TYPE, CONNMAN_TYPE_SYSCONFIG, ++ CONNMAN_COLUMN_OFFLINEMODE, offline_mode, ++ -1); } -static void device_changed(DBusGProxy *proxy, const char *property, -- GValue *value, gpointer user_data) -+static void service_properties(DBusGProxy *proxy, GHashTable *hash, -+ GError *error, gpointer user_data) ++static void service_changed(DBusGProxy *proxy, const char *property, + GValue *value, gpointer user_data) { GtkTreeStore *store = user_data; const char *path = dbus_g_proxy_get_path(proxy); -- GtkTreeIter iter; - -- DBG("store %p proxy %p property %s", store, proxy, property); -+ const gchar *state, *icon, *name, *security, *passphrase; -+ guint strength, type; - -- if (property == NULL || value == NULL) -- return; -- -- if (get_iter_from_path(store, &iter, path) == FALSE) -- return; + GtkTreeIter iter; + GHashTable *ipv4; ++ const char *method, *addr, *netmask, *gateway; + GValue *ipv4_method, *ipv4_address, *ipv4_netmask, *ipv4_gateway; -+ const gchar *method, *addr, *netmask, *gateway; ++ ++ const char *state, *icon, *name, *security, *passphrase; ++ guint strength, type; ++ + + DBG("store %p proxy %p property %s", store, proxy, property); + +@@ -421,165 +384,167 @@ static void device_changed(DBusGProxy *proxy, const char *property, + if (get_iter_from_path(store, &iter, path) == FALSE) + return; - if (g_str_equal(property, "Policy") == TRUE) { - guint policy = get_policy(value); @@ -1136,44 +1353,47 @@ index 9eba7ae..83f4e57 100644 - } else if (g_str_equal(property, "Networks") == TRUE) - property_update(store, value, path, network_properties); -} -+ GtkTreeIter iter; - +- -static void device_properties(DBusGProxy *proxy, GHashTable *hash, - GError *error, gpointer user_data) -{ - GtkTreeStore *store = user_data; - const char *path = dbus_g_proxy_get_path(proxy); - GValue *value; +- GValue *value; - const gchar *name, *icon; - guint type, policy; - gboolean powered; - GtkTreeIter iter; +- +- DBG("store %p proxy %p hash %p", store, proxy, hash); ++ if (g_str_equal(property, "IPv4") == TRUE) { - DBG("store %p proxy %p hash %p", store, proxy, hash); -+ DBG("path %s", path); - - if (error != NULL || hash == NULL) - goto done; - -+ value = g_hash_table_lookup(hash, "State"); -+ state = value ? g_value_get_string(value) : NULL; -+ - value = g_hash_table_lookup(hash, "Name"); - name = value ? g_value_get_string(value) : NULL; - -@@ -456,129 +371,69 @@ static void device_properties(DBusGProxy *proxy, GHashTable *hash, - type = get_type(value); - icon = type2icon(type); +- if (error != NULL || hash == NULL) +- goto done; +- +- value = g_hash_table_lookup(hash, "Name"); +- name = value ? g_value_get_string(value) : NULL; +- +- value = g_hash_table_lookup(hash, "Type"); +- type = get_type(value); +- icon = type2icon(type); ++ ipv4 = g_value_get_boxed (value); ++ if (!ipv4) ++ return; - value = g_hash_table_lookup(hash, "Policy"); - policy = get_policy(value); -- ++ ipv4_method = g_hash_table_lookup (ipv4, "Method"); ++ method = ipv4_method ? g_value_get_string(ipv4_method) : NULL; + - value = g_hash_table_lookup(hash, "Powered"); - powered = value ? g_value_get_boolean(value) : FALSE; -- ++ ipv4_address = g_hash_table_lookup (ipv4, "Address"); ++ addr = ipv4_address ? g_value_get_string(ipv4_address) : NULL; + - DBG("name %s type %d icon %s", name, type, icon); -+ value = g_hash_table_lookup(hash, "Security"); -+ security = value ? g_value_get_string(value) : NULL; ++ ipv4_netmask = g_hash_table_lookup (ipv4, "Netmask"); ++ netmask = ipv4_netmask ? g_value_get_string(ipv4_netmask) : NULL; - if (get_iter_from_proxy(store, &iter, proxy) == FALSE) { - gtk_tree_store_insert_with_values(store, &iter, NULL, -1, @@ -1183,16 +1403,37 @@ index 9eba7ae..83f4e57 100644 - CONNMAN_COLUMN_TYPE, type, - CONNMAN_COLUMN_ENABLED, powered, - CONNMAN_COLUMN_POLICY, policy, -1); -- ++ ipv4_gateway = g_hash_table_lookup (ipv4, "Gateway"); ++ gateway = ipv4_gateway ? g_value_get_string(ipv4_gateway) : NULL; + - dbus_g_proxy_add_signal(proxy, "PropertyChanged", - G_TYPE_STRING, G_TYPE_VALUE, G_TYPE_INVALID); - dbus_g_proxy_connect_signal(proxy, "PropertyChanged", - G_CALLBACK(device_changed), store, NULL); - } else -- gtk_tree_store_set(store, &iter, -- CONNMAN_COLUMN_NAME, name, ++ 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) { ++ state = value ? g_value_get_string(value) : NULL; ++ gtk_tree_store_set(store, &iter, ++ CONNMAN_COLUMN_STATE, state, ++ -1); ++ } else if (g_str_equal(property, "Name") == TRUE) { ++ name = value ? g_value_get_string(value) : NULL; + gtk_tree_store_set(store, &iter, + CONNMAN_COLUMN_NAME, name, - CONNMAN_COLUMN_ICON, icon, -- CONNMAN_COLUMN_TYPE, type, ++ -1); ++ } else if (g_str_equal(property, "Type") == TRUE) { ++ type = get_type(value); ++ icon = type2icon(type); ++ gtk_tree_store_set(store, &iter, + CONNMAN_COLUMN_TYPE, type, - CONNMAN_COLUMN_ENABLED, powered, - CONNMAN_COLUMN_POLICY, policy, -1); - @@ -1215,123 +1456,175 @@ index 9eba7ae..83f4e57 100644 - - if (property == NULL || value == NULL) - return; -+ value = g_hash_table_lookup(hash, "PassPhrase"); -+ passphrase = value ? g_value_get_string(value) : NULL; - +- - if (get_iter_from_path(store, &iter, path) == FALSE) - return; - - if (g_str_equal(property, "Default") == TRUE) { - gboolean enabled = g_value_get_boolean(value); -- gtk_tree_store_set(store, &iter, ++ CONNMAN_COLUMN_ICON, icon, ++ -1); ++ } else if (g_str_equal(property, "Security") == TRUE) { ++ security = value ? g_value_get_string(value) : NULL; ++ gtk_tree_store_set(store, &iter, ++ CONNMAN_COLUMN_SECURITY, security, ++ -1); ++ } else if (g_str_equal(property, "PassPhrase") == TRUE) { ++ passphrase = value ? g_value_get_string(value) : NULL; + gtk_tree_store_set(store, &iter, - CONNMAN_COLUMN_ENABLED, enabled, -1); -- } else if (g_str_equal(property, "Strength") == TRUE) { ++ CONNMAN_COLUMN_PASSPHRASE, passphrase, ++ -1); + } else if (g_str_equal(property, "Strength") == TRUE) { - guint strength = g_value_get_uchar(value); -- gtk_tree_store_set(store, &iter, ++ strength = value ? g_value_get_uchar(value) : 0; + gtk_tree_store_set(store, &iter, - CONNMAN_COLUMN_STRENGTH, strength, -1); -- } --} -- ++ CONNMAN_COLUMN_STRENGTH, strength, ++ -1); + } + } + -static void connection_properties(DBusGProxy *proxy, GHashTable *hash, -- GError *error, gpointer user_data) --{ -- GtkTreeStore *store = user_data; ++static void service_properties(DBusGProxy *proxy, GHashTable *hash, + GError *error, gpointer user_data) + { + GtkTreeStore *store = user_data; - GValue *value; - guint type, strength; - gboolean enabled; - const char *device, *address; -- GtkTreeIter iter; -+ value = g_hash_table_lookup(hash, "Strength"); -+ strength = value ? g_value_get_uchar(value) : 0; ++ ++ const char *state, *icon, *name, *security, *passphrase; ++ guint strength, type; ++ ++ GHashTable *ipv4; ++ GValue *ipv4_method, *ipv4_address, *ipv4_netmask, *ipv4_gateway; ++ const char *method, *addr, *netmask, *gateway; ++ + GtkTreeIter iter; -- DBG("store %p proxy %p hash %p", store, proxy, hash); -+ value = g_hash_table_lookup(hash, "IPv4.Configuration"); -+ ipv4 = g_value_get_boxed (value); ++ GValue *value; ++ + DBG("store %p proxy %p hash %p", store, proxy, hash); -- if (error != NULL || hash == NULL) -+ if (!ipv4) + if (error != NULL || hash == NULL) goto done; -- value = g_hash_table_lookup(hash, "Type"); -- type = get_type(value); -+ ipv4_method = g_hash_table_lookup (ipv4, "Method"); -+ method = ipv4_method ? g_value_get_string(ipv4_method) : NULL; ++ value = g_hash_table_lookup(hash, "State"); ++ state = value ? g_value_get_string(value) : NULL; ++ ++ value = g_hash_table_lookup(hash, "Name"); ++ name = value ? g_value_get_string(value) : NULL; ++ + value = g_hash_table_lookup(hash, "Type"); + type = get_type(value); ++ icon = type2icon(type); ++ ++ value = g_hash_table_lookup(hash, "Security"); ++ security = value ? g_value_get_string(value) : NULL; ++ ++ value = g_hash_table_lookup(hash, "PassPhrase"); ++ passphrase = value ? g_value_get_string(value) : NULL; -- value = g_hash_table_lookup(hash, "Strength"); -- strength = value ? g_value_get_uchar(value) : 0; -+ ipv4_address = g_hash_table_lookup (ipv4, "Address"); -+ addr = ipv4_address ? g_value_get_string(ipv4_address) : NULL; + value = g_hash_table_lookup(hash, "Strength"); + strength = value ? g_value_get_uchar(value) : 0; - value = g_hash_table_lookup(hash, "Default"); - enabled = value ? g_value_get_boolean(value) : FALSE; -+ ipv4_netmask = g_hash_table_lookup (ipv4, "Netmask"); -+ netmask = ipv4_netmask ? g_value_get_string(ipv4_netmask) : NULL; ++ value = g_hash_table_lookup(hash, "IPv4.Configuration"); ++ ipv4 = g_value_get_boxed (value); - value = g_hash_table_lookup(hash, "IPv4.Address"); - address = value ? g_value_get_string(value) : NULL; -+ ipv4_gateway = g_hash_table_lookup (ipv4, "Gateway"); -+ gateway = ipv4_gateway ? g_value_get_string(ipv4_gateway) : NULL; ++ if (!ipv4) ++ goto done; - DBG("type %d address %s", type, address); -+ DBG("name %s type %d icon %s state %s", name, type, icon, state); ++ ipv4_method = g_hash_table_lookup (ipv4, "Method"); ++ method = ipv4_method ? g_value_get_string(ipv4_method) : NULL; - if (get_iter_from_proxy(store, &iter, proxy) == FALSE) { - gtk_tree_store_insert_with_values(store, &iter, NULL, -1, - CONNMAN_COLUMN_PROXY, proxy, -+ CONNMAN_COLUMN_NAME, name, -+ CONNMAN_COLUMN_ICON, icon, - CONNMAN_COLUMN_TYPE, type, +- if (get_iter_from_proxy(store, &iter, proxy) == FALSE) { +- gtk_tree_store_insert_with_values(store, &iter, NULL, -1, +- CONNMAN_COLUMN_PROXY, proxy, +- CONNMAN_COLUMN_TYPE, type, - CONNMAN_COLUMN_ENABLED, enabled, -+ CONNMAN_COLUMN_STATE, state, -+ CONNMAN_COLUMN_SECURITY, security, -+ CONNMAN_COLUMN_PASSPHRASE, passphrase, - CONNMAN_COLUMN_STRENGTH, strength, +- CONNMAN_COLUMN_STRENGTH, strength, - CONNMAN_COLUMN_ADDRESS, address, -1); -+ CONNMAN_COLUMN_METHOD, method, -+ CONNMAN_COLUMN_ADDRESS, addr, -+ CONNMAN_COLUMN_NETMASK, netmask, -+ CONNMAN_COLUMN_GATEWAY, gateway, -+ -1); ++ ipv4_address = g_hash_table_lookup (ipv4, "Address"); ++ addr = ipv4_address ? g_value_get_string(ipv4_address) : NULL; - dbus_g_proxy_add_signal(proxy, "PropertyChanged", - G_TYPE_STRING, G_TYPE_VALUE, G_TYPE_INVALID); - dbus_g_proxy_connect_signal(proxy, "PropertyChanged", +- dbus_g_proxy_add_signal(proxy, "PropertyChanged", +- G_TYPE_STRING, G_TYPE_VALUE, G_TYPE_INVALID); +- dbus_g_proxy_connect_signal(proxy, "PropertyChanged", - G_CALLBACK(connection_changed), store, NULL); -+ G_CALLBACK(service_changed), store, NULL); - } else - gtk_tree_store_set(store, &iter, -+ CONNMAN_COLUMN_NAME, name, -+ CONNMAN_COLUMN_ICON, icon, - CONNMAN_COLUMN_TYPE, type, +- } else +- gtk_tree_store_set(store, &iter, +- CONNMAN_COLUMN_TYPE, type, - CONNMAN_COLUMN_ENABLED, enabled, - CONNMAN_COLUMN_STRENGTH, strength, -1); -- ++ ipv4_netmask = g_hash_table_lookup (ipv4, "Netmask"); ++ netmask = ipv4_netmask ? g_value_get_string(ipv4_netmask) : NULL; + - value = g_hash_table_lookup(hash, "Device"); - device = value ? g_value_get_boxed(value) : NULL; -- ++ ipv4_gateway = g_hash_table_lookup (ipv4, "Gateway"); ++ gateway = ipv4_gateway ? g_value_get_string(ipv4_gateway) : NULL; + - DBG("device %s", device); -- ++ DBG("name %s type %d icon %s state %s", name, type, icon, state); + - gtk_tree_store_set(store, &iter, CONNMAN_COLUMN_DEVICE, device, -1); -- ++ if (get_iter_from_proxy(store, &iter, proxy) == FALSE) { ++ GtkTreeIter label_iter; ++ guint label_type; + - if (get_iter_from_path(store, &iter, device) == TRUE) { - gtk_tree_store_set(store, &iter, - CONNMAN_COLUMN_DEVICE, device, - CONNMAN_COLUMN_INRANGE, TRUE, - CONNMAN_COLUMN_ADDRESS, address, -1); -- } -+ CONNMAN_COLUMN_STATE, state, -+ CONNMAN_COLUMN_SECURITY, security, -+ CONNMAN_COLUMN_PASSPHRASE, passphrase, -+ CONNMAN_COLUMN_STRENGTH, strength, -+ CONNMAN_COLUMN_METHOD, method, -+ CONNMAN_COLUMN_ADDRESS, addr, -+ CONNMAN_COLUMN_NETMASK, netmask, -+ CONNMAN_COLUMN_GATEWAY, gateway, -+ -1); ++ switch (type) { ++ case CONNMAN_TYPE_ETHERNET: ++ label_type = CONNMAN_TYPE_LABEL_ETHERNET; ++ break; ++ case CONNMAN_TYPE_WIFI: ++ label_type = CONNMAN_TYPE_LABEL_WIFI; ++ break; ++ default: ++ label_type = CONNMAN_TYPE_UNKNOWN; ++ break; ++ } ++ ++ get_iter_from_type(store, &label_iter, label_type); ++ ++ gtk_tree_store_insert_after(store, &iter, NULL, &label_iter); ++ ++ dbus_g_proxy_add_signal(proxy, "PropertyChanged", ++ G_TYPE_STRING, G_TYPE_VALUE, G_TYPE_INVALID); ++ dbus_g_proxy_connect_signal(proxy, "PropertyChanged", ++ G_CALLBACK(service_changed), store, NULL); + } ++ gtk_tree_store_set(store, &iter, ++ CONNMAN_COLUMN_PROXY, proxy, ++ CONNMAN_COLUMN_NAME, name, ++ CONNMAN_COLUMN_ICON, icon, ++ CONNMAN_COLUMN_TYPE, type, ++ CONNMAN_COLUMN_STATE, state, ++ CONNMAN_COLUMN_SECURITY, security, ++ CONNMAN_COLUMN_PASSPHRASE, passphrase, ++ CONNMAN_COLUMN_STRENGTH, strength, ++ CONNMAN_COLUMN_METHOD, method, ++ CONNMAN_COLUMN_ADDRESS, addr, ++ CONNMAN_COLUMN_NETMASK, netmask, ++ CONNMAN_COLUMN_GATEWAY, gateway, ++ -1); ++ done: g_object_unref(proxy); -@@ -594,25 +449,8 @@ static void manager_changed(DBusGProxy *proxy, const char *property, + } +@@ -594,25 +559,12 @@ static void manager_changed(DBusGProxy *proxy, const char *property, if (property == NULL || value == NULL) return; @@ -1356,10 +1649,14 @@ index 9eba7ae..83f4e57 100644 - property_update(store, value, property, device_properties); + if (g_str_equal(property, "Services") == TRUE) { + property_update(store, value, property, service_properties); ++ } else if (g_str_equal(property, "EnabledTechnologies") == TRUE) { ++ enabled_technologies_changed(store, value); ++ } else if (g_str_equal(property, "OfflineMode") == TRUE) { ++ offline_mode_changed(store, value); } } -@@ -620,31 +458,16 @@ static void manager_properties(DBusGProxy *proxy, GHashTable *hash, +@@ -620,31 +572,24 @@ static void manager_properties(DBusGProxy *proxy, GHashTable *hash, GError *error, gpointer user_data) { GtkTreeStore *store = user_data; @@ -1379,39 +1676,59 @@ index 9eba7ae..83f4e57 100644 - callback = g_object_get_data(G_OBJECT(store), "callback"); - if (callback) - callback(state, NULL); -- ++ value = g_hash_table_lookup(hash, "Services"); ++ if (value != NULL) ++ property_update(store, value, "Services", service_properties); + - value = g_hash_table_lookup(hash, "Devices"); -- if (value != NULL) ++ value = g_hash_table_lookup(hash, "EnabledTechnologies"); + if (value != NULL) - property_update(store, value, "Devices", device_properties); -- ++ enabled_technologies_properties(store, proxy, value); + - value = g_hash_table_lookup(hash, "Connections"); -+ value = g_hash_table_lookup(hash, "Services"); ++ value = g_hash_table_lookup(hash, "OfflineMode"); if (value != NULL) - property_update(store, value, - "Connections", connection_properties); -+ property_update(store, value, "Services", service_properties); ++ offline_mode_properties(store, proxy, value); } DBusGProxy *connman_dbus_create_manager(DBusGConnection *conn, diff --git a/common/connman-dbus.h b/common/connman-dbus.h -index a9fa51c..47179da 100644 +index a9fa51c..dc07650 100644 --- a/common/connman-dbus.h +++ b/common/connman-dbus.h -@@ -30,10 +30,10 @@ - #define CONNMAN_MANAGER_INTERFACE CONNMAN_SERVICE ".Manager" +@@ -31,7 +31,7 @@ #define CONNMAN_MANAGER_PATH "/" --#define CONNMAN_PROFILE_INTERFACE CONNMAN_SERVICE ".Profile" + #define CONNMAN_PROFILE_INTERFACE CONNMAN_SERVICE ".Profile" -#define CONNMAN_DEVICE_INTERFACE CONNMAN_SERVICE ".Device" --#define CONNMAN_NETWORK_INTERFACE CONNMAN_SERVICE ".Network" --#define CONNMAN_CONNECTION_INTERFACE CONNMAN_SERVICE ".Connection" -+//#define CONNMAN_PROFILE_INTERFACE CONNMAN_SERVICE ".Profile" +#define CONNMAN_SERVICE_INTERFACE CONNMAN_SERVICE ".Service" -+//#define CONNMAN_NETWORK_INTERFACE CONNMAN_SERVICE ".Network" -+//#define CONNMAN_CONNECTION_INTERFACE CONNMAN_SERVICE ".Connection" - - DBusGProxy *connman_dbus_create_manager(DBusGConnection *connection, - GtkTreeStore *store); + #define CONNMAN_NETWORK_INTERFACE CONNMAN_SERVICE ".Network" + #define CONNMAN_CONNECTION_INTERFACE CONNMAN_SERVICE ".Connection" + +diff --git a/common/connman-dbus.xml b/common/connman-dbus.xml +index 9fefd55..e20cb3b 100644 +--- a/common/connman-dbus.xml ++++ b/common/connman-dbus.xml +@@ -15,5 +15,16 @@ + </method> + <method name="Disconnect"> + </method> ++ <method name="Remove"> ++ </method> ++ <method name="RequestScan"> ++ <arg type="s"/> ++ </method> ++ <method name="EnableTechnology"> ++ <arg type="s"/> ++ </method> ++ <method name="DisableTechnology"> ++ <arg type="s"/> ++ </method> + </interface> + </node> diff --git a/common/demo.c b/common/demo.c deleted file mode 100644 index 5e3924f..0000000 @@ -2451,7 +2768,7 @@ index 1eb1c3d..0000000 - data->dialog = dialog; -} diff --git a/properties/advanced.h b/properties/advanced.h -index f85f10d..a180b98 100644 +index f85f10d..42b439f 100644 --- a/properties/advanced.h +++ b/properties/advanced.h @@ -23,6 +23,7 @@ struct config_data { @@ -2462,11 +2779,13 @@ index f85f10d..a180b98 100644 GtkWidget *title; GtkWidget *label; GtkWidget *button; -@@ -45,15 +46,26 @@ struct config_data { +@@ -45,15 +46,34 @@ struct config_data { GtkWidget *value[3]; GtkWidget *entry[3]; } ipv4; -+ +-}; + +-void create_advanced_dialog(struct config_data *data, guint type); + struct ipv4_config ipv4_config; + + struct { @@ -2478,25 +2797,32 @@ index f85f10d..a180b98 100644 + GtkWidget *connect; + GtkWidget *disconnect; + } wifi; -+ -+ gboolean connecting; - }; - - void create_advanced_dialog(struct config_data *data, guint type); -void add_ethernet_policy(GtkWidget *mainbox, struct config_data *data); -void update_ethernet_policy(struct config_data *data, guint policy); -+void add_ethernet_policy(GtkWidget *mainbox, GtkTreeIter *iter, struct config_data *data); -+void update_ethernet_ipv4(struct config_data *data, guint policy); ++ GtkWidget *ethernet_button; ++ GtkWidget *wifi_button; -void add_wifi_policy(GtkWidget *mainbox, struct config_data *data); ++ GtkWidget *scan_button; ++ GtkWidget *offline_button; ++}; ++ ++void add_ethernet_policy(GtkWidget *mainbox, GtkTreeIter *iter, struct config_data *data); ++void update_ethernet_ipv4(struct config_data *data, guint policy); ++ +void add_wifi_policy(GtkWidget *mainbox, GtkTreeIter *iter, struct config_data *data); void update_wifi_policy(struct config_data *data, guint policy); -- + -gboolean separator_function(GtkTreeModel *model, - GtkTreeIter *iter, gpointer user_data); ++void add_ethernet_switch_button(GtkWidget *mainbox, GtkTreeIter *iter, ++ struct config_data *data); ++ ++void add_wifi_switch_button(GtkWidget *mainbox, GtkTreeIter *iter, ++ struct config_data *data); diff --git a/properties/ethernet.c b/properties/ethernet.c -index d5c948d..1901ee6 100644 +index d5c948d..d443ca1 100644 --- a/properties/ethernet.c +++ b/properties/ethernet.c @@ -23,6 +23,7 @@ @@ -2507,7 +2833,7 @@ index d5c948d..1901ee6 100644 #include <glib/gi18n.h> #include <gtk/gtk.h> -@@ -30,93 +31,167 @@ +@@ -30,93 +31,220 @@ #include "advanced.h" @@ -2562,17 +2888,68 @@ index d5c948d..1901ee6 100644 + 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); ++} ++ ++static void switch_callback(GtkWidget *editable, gpointer user_data) ++{ ++ struct config_data *data = user_data; ++ const gchar *label = gtk_button_get_label(GTK_BUTTON(data->ethernet_button)); ++ if (g_str_equal(label, "Disable")) ++ connman_client_disable_technology(data->client, data->device, "ethernet"); ++ else if (g_str_equal(label, "Enable")) ++ connman_client_enable_technology(data->client, data->device, "ethernet"); } -void add_ethernet_policy(GtkWidget *mainbox, struct config_data *data) ++void add_ethernet_switch_button(GtkWidget *mainbox, GtkTreeIter *iter, ++ struct config_data *data) ++{ ++ GtkWidget *vbox; ++ GtkWidget *table; ++ GtkWidget *label; ++ GtkWidget *buttonbox; ++ GtkWidget *button; ++ gboolean ethernet_enabled; ++ ++ gtk_tree_model_get(data->model, iter, ++ CONNMAN_COLUMN_ETHERNET_ENABLED, ðernet_enabled, ++ -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(1, 1, 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(_("Enable/Disable Wired Networks.")); ++ gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 0, 1); ++ ++ buttonbox = gtk_hbutton_box_new(); ++ gtk_button_box_set_layout(GTK_BUTTON_BOX(buttonbox), GTK_BUTTONBOX_CENTER); ++ gtk_box_pack_start(GTK_BOX(mainbox), buttonbox, FALSE, FALSE, 0); ++ ++ button = gtk_button_new(); ++ data->ethernet_button = button; ++ ++ if (ethernet_enabled) ++ gtk_button_set_label(GTK_BUTTON(button), _("Disable")); ++ else ++ gtk_button_set_label(GTK_BUTTON(button), _("Enable")); ++ ++ gtk_container_add(GTK_CONTAINER(buttonbox), button); ++ g_signal_connect(G_OBJECT(button), "clicked", ++ G_CALLBACK(switch_callback), data); ++} ++ +void add_ethernet_policy(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; + @@ -2589,7 +2966,8 @@ index d5c948d..1901ee6 100644 + CONNMAN_COLUMN_NETMASK, &ipv4_config.netmask, + CONNMAN_COLUMN_GATEWAY, &ipv4_config.gateway, + -1); -+ + +- vbox = gtk_vbox_new(FALSE, 0); + 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); @@ -2725,7 +3103,7 @@ index d5c948d..1901ee6 100644 break; default: gtk_combo_box_set_active(GTK_COMBO_BOX(combo), -1); -@@ -124,9 +199,5 @@ void update_ethernet_policy(struct config_data *data, guint policy) +@@ -124,9 +252,5 @@ void update_ethernet_policy(struct config_data *data, guint policy) } g_signal_handlers_unblock_by_func(G_OBJECT(combo), @@ -2737,22 +3115,24 @@ index d5c948d..1901ee6 100644 + G_CALLBACK(changed_callback), data); } diff --git a/properties/main.c b/properties/main.c -index 01439e6..3701f16 100644 +index 01439e6..6b389bc 100644 --- a/properties/main.c +++ b/properties/main.c -@@ -33,102 +33,54 @@ +@@ -32,103 +32,139 @@ + static ConnmanClient *client; static GtkWidget *interface_notebook; ++static struct config_data *current_data; -static void update_status(struct config_data *data, - guint type, gboolean inrange, guint policy, - const gchar *network, const gchar *address) -+static void get_state_realtime(GtkTreeModel *model, GtkTreePath *path, ++static void status_update(GtkTreeModel *model, GtkTreePath *path, + GtkTreeIter *iter, gpointer user_data) { - const char *str; - gchar *markup, *info = NULL; -- + - switch (type) { - case CONNMAN_TYPE_ETHERNET: - if (inrange == TRUE) { @@ -2760,60 +3140,91 @@ index 01439e6..3701f16 100644 - info = g_strdup_printf(_("%s is currently active " - "and has the IP address %s."), - N_("Ethernet"), address); +- } else { +- str = N_("Cable Unplugged"); +- info = g_strdup_printf(_("The cable for %s is " +- "not plugged in."), N_("Ethernet")); +- } +- break; + struct config_data *data = user_data; -+ guint type, strength; -+ const gchar *name = NULL, *_name = NULL, *state = NULL; -+ -+ if (data->wifi.name) -+ _name = gtk_label_get_text(GTK_LABEL(data->wifi.name)); -+ -+ gtk_tree_model_get(model, iter, CONNMAN_COLUMN_STRENGTH, &strength, ++ guint type; ++ const char *name = NULL, *_name = NULL, *state = NULL; ++ gboolean ethernet_enabled; ++ gboolean wifi_enabled; ++ gboolean offline_mode; + +- case CONNMAN_TYPE_WIFI: +- if (inrange == TRUE) { +- str = N_("Connected"); +- info = g_strdup_printf(_("%s is currently active " +- "and has the IP address %s."), +- N_("Wireless"), address); +- } else +- str = N_("Not Connected"); +- break; ++ gtk_tree_model_get(model, iter, + CONNMAN_COLUMN_STATE, &state, + CONNMAN_COLUMN_NAME, &name, + CONNMAN_COLUMN_TYPE, &type, ++ CONNMAN_COLUMN_ETHERNET_ENABLED, ðernet_enabled, ++ CONNMAN_COLUMN_WIFI_ENABLED, &wifi_enabled, ++ CONNMAN_COLUMN_OFFLINEMODE, &offline_mode, + -1); + -+ if (name && _name && g_str_equal(name, _name) == TRUE && data->connecting) { ++ if (type == CONNMAN_TYPE_WIFI) { ++ if (data->wifi.name) ++ _name = gtk_label_get_text(GTK_LABEL(data->wifi.name)); ++ ++ if (!(name && _name && g_str_equal(name, _name))) ++ return; + +- default: +- if (inrange == TRUE) +- str = N_("Connected"); + if (g_str_equal(state, "failure") == TRUE) { + gtk_label_set_text(GTK_LABEL(data->wifi.connect_info), + _("connection failed")); + gtk_widget_show(data->wifi.connect_info); + gtk_widget_show(data->wifi.connect); + gtk_widget_hide(data->wifi.disconnect); -+ data->connecting = 0; + } else if (g_str_equal(state, "idle") == TRUE) { + gtk_widget_hide(data->wifi.connect_info); + gtk_widget_show(data->wifi.connect); + gtk_widget_hide(data->wifi.disconnect); -+ data->connecting = 0; - } else { -- str = N_("Cable Unplugged"); -- info = g_strdup_printf(_("The cable for %s is " -- "not plugged in."), N_("Ethernet")); ++ } else { + gtk_widget_hide(data->wifi.connect_info); + gtk_widget_hide(data->wifi.connect); + gtk_widget_show(data->wifi.disconnect); - } -- break; -- -- case CONNMAN_TYPE_WIFI: -- if (inrange == TRUE) { -- str = N_("Connected"); -- info = g_strdup_printf(_("%s is currently active " -- "and has the IP address %s."), -- N_("Wireless"), address); -- } else -- str = N_("Not Connected"); -- break; -- -- default: -- if (inrange == TRUE) -- str = N_("Connected"); -- else ++ } ++ } else if (type == CONNMAN_TYPE_LABEL_ETHERNET) { ++ if (!data->ethernet_button) ++ return; ++ if (ethernet_enabled) ++ gtk_button_set_label(GTK_BUTTON(data->ethernet_button), _("Disable")); + else - str = N_("Not Connected"); - break; ++ gtk_button_set_label(GTK_BUTTON(data->ethernet_button), _("Enable")); ++ } else if (type == CONNMAN_TYPE_LABEL_WIFI) { ++ if (!data->wifi_button) ++ return; ++ if (wifi_enabled) { ++ gtk_button_set_label(GTK_BUTTON(data->wifi_button), _("Disable")); ++ gtk_widget_set_sensitive(data->scan_button, 1); ++ } else { ++ gtk_button_set_label(GTK_BUTTON(data->wifi_button), _("Enable")); ++ gtk_widget_set_sensitive(data->scan_button, 0); ++ } ++ } else if (type == CONNMAN_TYPE_SYSCONFIG) { ++ if (!data->offline_button) ++ return; ++ if (offline_mode) ++ gtk_button_set_label(GTK_BUTTON(data->offline_button), _("OnlineMode")); ++ else ++ gtk_button_set_label(GTK_BUTTON(data->offline_button), _("OfflineMode")); } -- ++} + - markup = g_strdup_printf("<b>%s</b>", str); - gtk_label_set_markup(GTK_LABEL(data->title), markup); - g_free(markup); @@ -2832,30 +3243,72 @@ index 01439e6..3701f16 100644 - default: - break; - } --} -- ++static void set_offline_callback(GtkWidget *button, gpointer user_data) ++{ ++ struct config_data *data = user_data; ++ const gchar *label = gtk_button_get_label(GTK_BUTTON(data->offline_button)); ++ if (g_str_equal(label, "OnlineMode")) ++ connman_client_set_offlinemode(client, 0); ++ else if (g_str_equal(label, "OfflineMode")) ++ connman_client_set_offlinemode(client, 1); + } + -static void update_config(struct config_data *data) --{ ++static void add_system_config(GtkWidget *mainbox, GtkTreeIter *iter, ++ struct config_data *data) + { - GtkTreeIter iter; - guint type; - gchar *network; -- ++ GtkWidget *vbox; ++ GtkWidget *table; ++ GtkWidget *label; ++ GtkWidget *buttonbox; ++ GtkWidget *button; ++ gboolean offline_mode; + - if (gtk_tree_model_get_iter_from_string(data->model, - &iter, data->index) == FALSE) - return; -- ++ 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); + - gtk_tree_model_get(data->model, &iter, - CONNMAN_COLUMN_TYPE, &type, - CONNMAN_COLUMN_NAME, &network, -1); -- ++ table = gtk_table_new(1, 1, 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); + - g_free(network); -} -- ++ label = gtk_label_new(_("System Configuration")); ++ gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 0, 1); + -static void advanced_callback(GtkWidget *button, gpointer user_data) -{ - struct config_data *data = user_data; -- ++ buttonbox = gtk_hbutton_box_new(); ++ gtk_button_box_set_layout(GTK_BUTTON_BOX(buttonbox), GTK_BUTTONBOX_CENTER); ++ gtk_box_pack_start(GTK_BOX(mainbox), buttonbox, FALSE, FALSE, 0); ++ ++ gtk_tree_model_get(data->model, iter, ++ CONNMAN_COLUMN_OFFLINEMODE, &offline_mode, ++ -1); ++ ++ button = gtk_button_new(); ++ data->offline_button = button; ++ if (offline_mode) ++ gtk_button_set_label(GTK_BUTTON(button), _("OnlineMode")); ++ else ++ gtk_button_set_label(GTK_BUTTON(button), _("OfflineMode")); + - gtk_widget_show_all(data->dialog); ++ gtk_container_add(GTK_CONTAINER(buttonbox), button); ++ g_signal_connect(G_OBJECT(button), "clicked", ++ G_CALLBACK(set_offline_callback), data); } static struct config_data *create_config(GtkTreeModel *model, @@ -2873,12 +3326,11 @@ index 01439e6..3701f16 100644 - gchar *markup, *vendor = NULL, *product = NULL; - gchar *network = NULL, *address = NULL; + guint type; -+ gchar *vendor = NULL, *product = NULL; -+ gchar *address = NULL, *state = NULL; ++ char *state = NULL; data = g_try_new0(struct config_data, 1); if (data == NULL) -@@ -137,14 +89,16 @@ static struct config_data *create_config(GtkTreeModel *model, +@@ -137,15 +173,10 @@ static struct config_data *create_config(GtkTreeModel *model, data->client = client; gtk_tree_model_get(model, iter, @@ -2888,24 +3340,25 @@ index 01439e6..3701f16 100644 - CONNMAN_COLUMN_NETWORK, &network, - CONNMAN_COLUMN_ADDRESS, &address, - CONNMAN_COLUMN_POLICY, &policy, -1); +- +- data->device = g_strdup(dbus_g_proxy_get_path(proxy)); +- g_object_unref(proxy); + CONNMAN_COLUMN_PROXY, &proxy, + CONNMAN_COLUMN_TYPE, &type, -+ CONNMAN_COLUMN_ADDRESS, &address, + CONNMAN_COLUMN_STATE, &state, + -1); - data->device = g_strdup(dbus_g_proxy_get_path(proxy)); -+ data->model = model; -+ data->index = gtk_tree_model_get_string_from_iter(model, iter); -+ - g_object_unref(proxy); - mainbox = gtk_vbox_new(FALSE, 6); -@@ -163,12 +117,14 @@ static struct config_data *create_config(GtkTreeModel *model, + data->widget = mainbox; +@@ -163,12 +194,27 @@ static struct config_data *create_config(GtkTreeModel *model, gtk_box_pack_start(GTK_BOX(mainbox), label, FALSE, FALSE, 0); data->label = label; + data->window = user_data; ++ data->model = model; ++ data->index = gtk_tree_model_get_string_from_iter(model, iter); ++ data->device = g_strdup(dbus_g_proxy_get_path(proxy)); ++ g_object_unref(proxy); + switch (type) { case CONNMAN_TYPE_ETHERNET: @@ -2915,10 +3368,19 @@ index 01439e6..3701f16 100644 case CONNMAN_TYPE_WIFI: - add_wifi_policy(mainbox, data); + add_wifi_policy(mainbox, iter, data); ++ break; ++ case CONNMAN_TYPE_LABEL_ETHERNET: ++ add_ethernet_switch_button(mainbox, iter, data); ++ break; ++ case CONNMAN_TYPE_LABEL_WIFI: ++ add_wifi_switch_button(mainbox, iter, data); ++ break; ++ case CONNMAN_TYPE_SYSCONFIG: ++ add_system_config(mainbox, iter, data); break; default: break; -@@ -183,32 +139,12 @@ static struct config_data *create_config(GtkTreeModel *model, +@@ -183,34 +229,10 @@ static struct config_data *create_config(GtkTreeModel *model, gtk_misc_set_alignment(GTK_MISC(label), 0.0, 1.0); gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 0); @@ -2941,19 +3403,21 @@ index 01439e6..3701f16 100644 - update_status(data, type, inrange, policy, network, address); - - g_free(network); - g_free(address); - +- g_free(address); +- - data->model = model; - data->index = gtk_tree_model_get_string_from_iter(model, iter); - gtk_widget_show_all(mainbox); +- g_free(product); +- g_free(vendor); + g_signal_connect(G_OBJECT(model), "row-changed", -+ G_CALLBACK(get_state_realtime), data); - g_free(product); - g_free(vendor); ++ G_CALLBACK(status_update), data); -@@ -230,67 +166,56 @@ static void select_callback(GtkTreeSelection *selection, gpointer user_data) + return data; + } +@@ -230,112 +252,108 @@ static void select_callback(GtkTreeSelection *selection, gpointer user_data) return; } @@ -2961,42 +3425,50 @@ index 01439e6..3701f16 100644 - data = create_config(model, &iter, user_data); - if (data == NULL) - return; -- ++ if (current_data) { ++ g_signal_handlers_disconnect_by_func(G_OBJECT(model), ++ G_CALLBACK(status_update), current_data); ++ g_free(current_data); ++ } ++ data = create_config(model, &iter, user_data); ++ if (data == NULL) ++ return; + - page = gtk_notebook_append_page(GTK_NOTEBOOK(notebook), - data->widget, NULL); - } else { - update_config(data); -- ++ current_data = data; + - page = gtk_notebook_page_num(GTK_NOTEBOOK(notebook), - data->widget); - } -+ data = create_config(model, &iter, user_data); -+ if (data == NULL) -+ return; - + page = gtk_notebook_append_page(GTK_NOTEBOOK(notebook), -+ data->widget, NULL); - gtk_notebook_set_current_page(GTK_NOTEBOOK(notebook), page); ++ data->widget, NULL); + gtk_notebook_set_current_page(GTK_NOTEBOOK(notebook), page); +- gtk_widget_show(notebook); } -static void row_changed(GtkTreeModel *model, GtkTreePath *path, - GtkTreeIter *iter, gpointer user_data) --{ -- guint type; ++static void device_to_text(GtkTreeViewColumn *column, GtkCellRenderer *cell, ++ GtkTreeModel *model, GtkTreeIter *iter, gpointer data) + { + guint type; - gboolean powered, inrange; -- -- gtk_tree_model_get(model, iter, CONNMAN_COLUMN_TYPE, &type, ++ char *markup, *name, *state; ++ const char *title; + + gtk_tree_model_get(model, iter, CONNMAN_COLUMN_TYPE, &type, - CONNMAN_COLUMN_ENABLED, &powered, - CONNMAN_COLUMN_INRANGE, &inrange, -1); -} - -static void state_to_icon(GtkTreeViewColumn *column, GtkCellRenderer *cell, - GtkTreeModel *model, GtkTreeIter *iter, gpointer data) -+static void strength_to_icon(GtkTreeViewColumn *column, GtkCellRenderer *cell, -+ GtkTreeModel *model, GtkTreeIter *iter, gpointer data) - { +-{ - gboolean inrange; - - gtk_tree_model_get(model, iter, CONNMAN_COLUMN_INRANGE, &inrange, -1); @@ -3005,36 +3477,17 @@ index 01439e6..3701f16 100644 - g_object_set(cell, "icon-name", GTK_STOCK_YES, NULL); - else - g_object_set(cell, "icon-name", NULL, NULL); -+ GdkPixbuf *pix; -+ guint strength, type; -+ gchar *name; -+ -+ gtk_tree_model_get(model, iter, CONNMAN_COLUMN_STRENGTH, &strength, -+ CONNMAN_COLUMN_TYPE, &type, -+ -1); -+ -+ if (type == CONNMAN_TYPE_WIFI) { -+ name = (gchar *)g_strdup_printf("%s/connman-signal-0%d.png", -+ ICONDIR, (strength-1)/20+1); -+ pix = gdk_pixbuf_new_from_file(name, NULL); -+ g_object_set(cell, "pixbuf", pix, NULL); -+ } else -+ g_object_set(cell, "pixbuf", NULL, NULL); - } - +-} +- -static void type_to_text(GtkTreeViewColumn *column, GtkCellRenderer *cell, - GtkTreeModel *model, GtkTreeIter *iter, gpointer data) -+static void device_to_text(GtkTreeViewColumn *column, GtkCellRenderer *cell, -+ GtkTreeModel *model, GtkTreeIter *iter, gpointer data) - { - guint type; +-{ +- guint type; - gboolean powered, inrange; - gchar *markup; - const char *title, *info; -+ gchar *markup, *name, *state; -+ const char *title; - - gtk_tree_model_get(model, iter, CONNMAN_COLUMN_TYPE, &type, +- +- gtk_tree_model_get(model, iter, CONNMAN_COLUMN_TYPE, &type, - CONNMAN_COLUMN_ENABLED, &powered, - CONNMAN_COLUMN_INRANGE, &inrange, -1); + CONNMAN_COLUMN_NAME, &name, @@ -3044,70 +3497,102 @@ index 01439e6..3701f16 100644 switch (type) { case CONNMAN_TYPE_ETHERNET: title = N_("Ethernet"); ++ markup = g_strdup_printf(" %s\n", title); break; case CONNMAN_TYPE_WIFI: - title = N_("Wireless"); + /* Show the AP name */ + title = N_(name); ++ if (g_str_equal(state, "association") == TRUE) ++ state = "associating..."; ++ else if (g_str_equal(state, "configuration") == TRUE) ++ state = "configurating..."; ++ else if (g_str_equal(state, "ready") == TRUE || ++ g_str_equal(state, "online") == TRUE) ++ state = "connnected"; ++ else ++ state = ""; ++ markup = g_strdup_printf(" %s\n %s", title, state); ++ break; case CONNMAN_TYPE_WIMAX: title = N_("WiMAX"); -@@ -303,21 +228,27 @@ static void type_to_text(GtkTreeViewColumn *column, GtkCellRenderer *cell, ++ markup = g_strdup_printf(" %s\n", title); + break; + case CONNMAN_TYPE_BLUETOOTH: + title = N_("Bluetooth"); ++ markup = g_strdup_printf(" %s\n", title); ++ break; ++ case CONNMAN_TYPE_LABEL_ETHERNET: ++ title = N_("Wired Networks"); ++ markup = g_strdup_printf("<b>\n%s\n</b>", title); ++ break; ++ case CONNMAN_TYPE_LABEL_WIFI: ++ title = N_("Wireless Networks"); ++ markup = g_strdup_printf("<b>\n%s\n</b>", title); ++ break; ++ case CONNMAN_TYPE_SYSCONFIG: ++ title = N_("System Configuration"); ++ markup = g_strdup_printf("<b>\n%s\n</b>", title); + break; + default: + title = N_("Unknown"); ++ markup = g_strdup_printf(" %s\n", title); break; } - if (powered == TRUE) { - if (inrange == TRUE) - info = N_("Connected"); -+ /* Set wifi connection status. */ -+ if (type == CONNMAN_TYPE_WIFI) { -+ if (g_str_equal(state, "association") == TRUE) -+ state = "associating..."; -+ else if (g_str_equal(state, "configuration") == TRUE) -+ state = "configurating..."; -+ else if (g_str_equal(state, "ready") == TRUE || -+ g_str_equal(state, "online") == TRUE) -+ state = "connnected"; - else +- else - info = N_("Not Connected"); -+ state = ""; -+ markup = g_strdup_printf("<b>%s</b>\n%s\n", title, state); - } else +- } else - info = N_("Disabled"); -+ markup = g_strdup_printf("<b>%s</b>\n", title); - +- - markup = g_strdup_printf("<b>%s</b>\n<small>%s</small>", title, info); g_object_set(cell, "markup", markup, NULL); - g_free(markup); +- g_free(markup); } static void type_to_icon(GtkTreeViewColumn *column, GtkCellRenderer *cell, - GtkTreeModel *model, GtkTreeIter *iter, gpointer data) + GtkTreeModel *model, GtkTreeIter *iter, gpointer data) { - guint type; +- guint type; ++ guint type, strength; ++ char *name; + +- gtk_tree_model_get(model, iter, CONNMAN_COLUMN_TYPE, &type, -1); ++ gtk_tree_model_get(model, iter, CONNMAN_COLUMN_TYPE, &type, ++ CONNMAN_COLUMN_STRENGTH, &strength, ++ -1); -@@ -326,16 +257,16 @@ static void type_to_icon(GtkTreeViewColumn *column, GtkCellRenderer *cell, switch (type) { - case CONNMAN_TYPE_ETHERNET: +- case CONNMAN_TYPE_ETHERNET: ++ case CONNMAN_TYPE_WIFI: ++ name = g_strdup_printf("connman-signal-0%d", (strength-1)/20+1); ++ g_object_set(cell, "icon-name", name, ++ "stock-size", 4, NULL); ++ break; ++ case CONNMAN_TYPE_LABEL_ETHERNET: g_object_set(cell, "icon-name", "network-wired", - "stock-size", 5, NULL); -+ "stock-size", 5, NULL); ++ "stock-size", 4, NULL); break; - case CONNMAN_TYPE_WIFI: - case CONNMAN_TYPE_WIMAX: +- case CONNMAN_TYPE_WIFI: +- case CONNMAN_TYPE_WIMAX: ++ case CONNMAN_TYPE_LABEL_WIFI: g_object_set(cell, "icon-name", "network-wireless", - "stock-size", 5, NULL); -+ "stock-size", 5, NULL); - break; - case CONNMAN_TYPE_BLUETOOTH: - g_object_set(cell, "icon-name", "bluetooth", +- break; +- case CONNMAN_TYPE_BLUETOOTH: +- g_object_set(cell, "icon-name", "bluetooth", - "stock-size", 5, NULL); -+ "stock-size", 5, NULL); ++ "stock-size", 4, NULL); break; default: g_object_set(cell, "icon-name", NULL, NULL); -@@ -362,9 +293,9 @@ static GtkWidget *create_interfaces(GtkWidget *window) +@@ -362,40 +380,34 @@ static GtkWidget *create_interfaces(GtkWidget *window) scrolled = gtk_scrolled_window_new(NULL, NULL); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled), @@ -3119,7 +3604,18 @@ index 01439e6..3701f16 100644 gtk_box_pack_start(GTK_BOX(hbox), scrolled, FALSE, TRUE, 0); tree = gtk_tree_view_new(); -@@ -381,21 +312,19 @@ static GtkWidget *create_interfaces(GtkWidget *window) + gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(tree), FALSE); + gtk_tree_view_set_show_expanders(GTK_TREE_VIEW(tree), FALSE); + gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(tree), TRUE); +- gtk_widget_set_size_request(tree, 180, -1); ++ gtk_widget_set_size_request(tree, 220, -1); + gtk_container_add(GTK_CONTAINER(scrolled), tree); + + + column = gtk_tree_view_column_new(); + gtk_tree_view_column_set_expand(column, TRUE); + gtk_tree_view_column_set_spacing(column, 4); ++ gtk_tree_view_column_set_alignment(column, 0); gtk_tree_view_append_column(GTK_TREE_VIEW(tree), column); renderer = gtk_cell_renderer_pixbuf_new(); @@ -3127,28 +3623,30 @@ index 01439e6..3701f16 100644 gtk_tree_view_column_pack_start(column, renderer, FALSE); gtk_tree_view_column_set_cell_data_func(column, renderer, - state_to_icon, NULL, NULL); -- -- renderer = gtk_cell_renderer_text_new(); ++ type_to_icon, NULL, NULL); + + renderer = gtk_cell_renderer_text_new(); - gtk_tree_view_column_pack_start(column, renderer, TRUE); - gtk_tree_view_column_set_cell_data_func(column, renderer, - type_to_text, NULL, NULL); -+ strength_to_icon, NULL, NULL); - - renderer = gtk_cell_renderer_pixbuf_new(); +- +- renderer = gtk_cell_renderer_pixbuf_new(); - gtk_tree_view_column_pack_end(column, renderer, FALSE); + gtk_tree_view_column_pack_start(column, renderer, FALSE); gtk_tree_view_column_set_cell_data_func(column, renderer, - type_to_icon, NULL, NULL); -+ type_to_icon, NULL, NULL); - -+ renderer = gtk_cell_renderer_text_new(); -+ gtk_tree_view_column_pack_start(column, renderer, FALSE); -+ gtk_tree_view_column_set_cell_data_func(column, renderer, +- + device_to_text, NULL, NULL); interface_notebook = gtk_notebook_new(); gtk_notebook_set_show_tabs(GTK_NOTEBOOK(interface_notebook), FALSE); -@@ -410,16 +339,13 @@ static GtkWidget *create_interfaces(GtkWidget *window) +@@ -405,21 +417,19 @@ static GtkWidget *create_interfaces(GtkWidget *window) + + model = connman_client_get_device_model(client); + gtk_tree_view_set_model(GTK_TREE_VIEW(tree), model); ++ + g_object_unref(model); + selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(tree)); gtk_tree_selection_set_mode(selection, GTK_SELECTION_SINGLE); g_signal_connect(G_OBJECT(selection), "changed", @@ -3167,7 +3665,7 @@ index 01439e6..3701f16 100644 { gtk_widget_destroy(window); -@@ -451,7 +377,7 @@ static GtkWidget *create_window(void) +@@ -451,7 +461,7 @@ static GtkWidget *create_window(void) gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER); gtk_window_set_default_size(GTK_WINDOW(window), 580, 380); g_signal_connect(G_OBJECT(window), "delete-event", @@ -3176,7 +3674,7 @@ index 01439e6..3701f16 100644 vbox = gtk_vbox_new(FALSE, 12); gtk_container_set_border_width(GTK_CONTAINER(vbox), 12); -@@ -467,12 +393,12 @@ static GtkWidget *create_window(void) +@@ -467,12 +477,12 @@ static GtkWidget *create_window(void) button = gtk_button_new_from_stock(GTK_STOCK_CLOSE); gtk_container_add(GTK_CONTAINER(buttonbox), button); g_signal_connect(G_OBJECT(button), "clicked", @@ -3191,8 +3689,17 @@ index 01439e6..3701f16 100644 gtk_widget_show_all(window); +@@ -487,6 +497,8 @@ int main(int argc, char *argv[]) + bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8"); + textdomain(GETTEXT_PACKAGE); + ++ current_data = NULL; ++ + gtk_init(&argc, &argv); + + gtk_window_set_default_icon_name("network-wireless"); diff --git a/properties/wifi.c b/properties/wifi.c -index 320dce4..3d3cee8 100644 +index 320dce4..42fe7d2 100644 --- a/properties/wifi.c +++ b/properties/wifi.c @@ -23,6 +23,7 @@ @@ -3228,7 +3735,7 @@ index 320dce4..3d3cee8 100644 static void changed_callback(GtkWidget *editable, gpointer user_data) { struct config_data *data = user_data; -@@ -37,98 +56,310 @@ static void changed_callback(GtkWidget *editable, gpointer user_data) +@@ -37,98 +56,357 @@ static void changed_callback(GtkWidget *editable, gpointer user_data) active = gtk_combo_box_get_active(GTK_COMBO_BOX(data->policy.config)); @@ -3251,92 +3758,163 @@ index 320dce4..3d3cee8 100644 +static void connect_reply_cb(DBusGProxy *proxy, GError *error, + gpointer user_data) +{ -+ struct config_data *data = user_data; + if (error) -+ { -+ gtk_label_set_text(GTK_LABEL(data->wifi.connect_info), -+ _("connection failed")); -+ gtk_widget_show(data->wifi.connect_info); -+ gtk_widget_show(data->wifi.connect); -+ gtk_widget_hide(data->wifi.disconnect); -+ data->connecting = 0; + g_error_free(error); -+ } +} + +static void connect_callback(GtkWidget *editable, gpointer user_data) +{ + struct config_data *data = user_data; + -+ const gchar *passphrase; -+ + gboolean ret; + gint active; + -+ gtk_widget_hide(data->wifi.connect); -+ gtk_widget_show(data->wifi.disconnect); -+ -+ data->connecting = 1; -+ + if (data->wifi.passphrase) { -+ passphrase = gtk_entry_get_text(GTK_ENTRY(data->wifi.passphrase)); ++ char *passphrase; ++ passphrase = (gchar *)gtk_entry_get_text(GTK_ENTRY(data->wifi.passphrase)); + ret = connman_client_set_passphrase(data->client, data->device, + passphrase); -+ } + -+ connman_client_connect_async(data->client, data->device, connect_reply_cb, data); ++ if (ret == FALSE) { ++ return; ++ } + } + + 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; ++ ret = connman_client_set_ipv4(data->client, data->device, &data->ipv4_config); ++ if (ret == FALSE) { ++ return; ++ } + -+ connman_client_set_ipv4(data->client, data->device, &data->ipv4_config); ++ connman_client_connect_async(data->client, data->device, connect_reply_cb, data); + } + +-void add_wifi_policy(GtkWidget *mainbox, struct config_data *data) ++static void disconnect_callback(GtkWidget *editable, gpointer user_data) ++{ ++ struct config_data *data = user_data; + ++ connman_client_disconnect(data->client, data->device); +} + -+static void disconnect_callback(GtkWidget *editable, gpointer user_data) ++static void switch_callback(GtkWidget *editable, gpointer user_data) +{ + struct config_data *data = user_data; -+ gboolean ret; ++ const gchar *label = gtk_button_get_label(GTK_BUTTON(data->wifi_button)); + -+ data->connecting = 0; ++ if (g_str_equal(label, "Disable")) ++ connman_client_disable_technology(data->client, data->device, "wifi"); ++ else ++ connman_client_enable_technology(data->client, data->device, "wifi"); ++} + -+ ret = connman_client_disconnect(data->client, data->device); -+ if (ret == TRUE) { -+ gtk_widget_show(data->wifi.connect); -+ gtk_widget_hide(data->wifi.disconnect); - } - } - --void add_wifi_policy(GtkWidget *mainbox, struct config_data *data) -+static void wifi_ipconfig(GtkWidget *table, struct config_data *data, GtkTreeIter *iter) ++static void scan_reply_cb(DBusGProxy *proxy, GError *error, ++ gpointer user_data) ++{ ++ GtkWidget *button = user_data; ++ gtk_widget_set_sensitive(button, 1); ++ ++ if (error) ++ g_error_free(error); ++} ++ ++static void scan_callback(GtkWidget *button, gpointer user_data) ++{ ++ struct config_data *data = user_data; ++ gtk_widget_set_sensitive(button, 0); ++ connman_client_request_scan(data->client, "", scan_reply_cb, button); ++} ++ ++void add_wifi_switch_button(GtkWidget *mainbox, GtkTreeIter *iter, ++ struct config_data *data) { GtkWidget *vbox; -- GtkWidget *table; -+ GtkWidget *dialog; -+ GtkWidget *entry; + GtkWidget *table; GtkWidget *label; - GtkWidget *combo; +- GtkWidget *combo; + GtkWidget *buttonbox; + GtkWidget *button; -+ DBusGProxy *proxy; ++ gboolean wifi_enabled; - vbox = gtk_vbox_new(FALSE, 0); -- gtk_container_set_border_width(GTK_CONTAINER(vbox), 24); -- gtk_box_pack_start(GTK_BOX(mainbox), vbox, FALSE, FALSE, 0); ++ gtk_tree_model_get(data->model, iter, ++ CONNMAN_COLUMN_WIFI_ENABLED, &wifi_enabled, ++ -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(1, 1, 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); + +-#if 0 +- label = gtk_label_new(_("Network Name:")); +- gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_RIGHT); +- gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5); ++ label = gtk_label_new(_("Configure Wifi Networks.")); + gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 0, 1); + +- combo = gtk_combo_box_new_text(); +- gtk_combo_box_append_text(GTK_COMBO_BOX(combo), "Guest"); +- gtk_combo_box_append_text(GTK_COMBO_BOX(combo), ""); +- gtk_combo_box_append_text(GTK_COMBO_BOX(combo), "Off"); +- 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); +- data->policy.config = combo; +-#endif ++ buttonbox = gtk_hbutton_box_new(); ++ gtk_button_box_set_layout(GTK_BUTTON_BOX(buttonbox), GTK_BUTTONBOX_CENTER); ++ gtk_box_pack_start(GTK_BOX(mainbox), buttonbox, FALSE, FALSE, 0); ++ ++ button = gtk_button_new(); ++ data->wifi_button = button; ++ ++ if (wifi_enabled) ++ gtk_button_set_label(GTK_BUTTON(button), _("Disable")); ++ else ++ gtk_button_set_label(GTK_BUTTON(button), _("Enable")); ++ ++ gtk_container_add(GTK_CONTAINER(buttonbox), button); ++ g_signal_connect(G_OBJECT(button), "clicked", ++ G_CALLBACK(switch_callback), data); ++ ++ button = gtk_button_new_with_label(_("Scan")); ++ data->scan_button = button; ++ ++ if (!wifi_enabled) ++ gtk_widget_set_sensitive(button, 0); ++ ++ gtk_container_add(GTK_CONTAINER(buttonbox), button); ++ g_signal_connect(G_OBJECT(button), "clicked", ++ G_CALLBACK(scan_callback), data); ++} ++ ++ ++static void wifi_ipconfig(GtkWidget *table, struct config_data *data, GtkTreeIter *iter) ++{ ++ GtkWidget *entry; ++ GtkWidget *label; ++ GtkWidget *combo; ++ DBusGProxy *proxy; ++ + struct ipv4_config ipv4_config = { + .method = NULL, + .address = NULL, + .netmask = NULL, + .gateway = NULL, + }; - -- 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); -- gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, FALSE, 0); ++ + gtk_tree_model_get(data->model, iter, + CONNMAN_COLUMN_PROXY, &proxy, + CONNMAN_COLUMN_METHOD, &ipv4_config.method, @@ -3345,19 +3923,16 @@ index 320dce4..3d3cee8 100644 + CONNMAN_COLUMN_GATEWAY, &ipv4_config.gateway, + -1); --#if 0 -- label = gtk_label_new(_("Network Name:")); + 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); -+ label = gtk_label_new(_("Configuration:")); + gtk_table_attach_defaults(GTK_TABLE(table), label, 1, 2, 3, 4); -+// gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_LEFT); -+// gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.0); + data->ipv4.label[0] = label; combo = gtk_combo_box_new_text(); -- gtk_combo_box_append_text(GTK_COMBO_BOX(combo), "Guest"); +- gtk_combo_box_append_text(GTK_COMBO_BOX(combo), "Automatically"); +- gtk_combo_box_append_text(GTK_COMBO_BOX(combo), "Manually"); - 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"); @@ -3369,27 +3944,13 @@ index 320dce4..3d3cee8 100644 + + gtk_table_attach_defaults(GTK_TABLE(table), combo, 2, 4, 3, 4); data->policy.config = combo; --#endif -- 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); +- label = gtk_label_new(NULL); +- gtk_label_set_line_wrap(GTK_LABEL(label), TRUE); + label = gtk_label_new(_("IP address:")); + gtk_table_attach_defaults(GTK_TABLE(table), label, 1, 2, 4, 5); -+// gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_LEFT); -+// gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.0); + data->ipv4.label[0] = label; - -- 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), "Manually"); -- gtk_combo_box_append_text(GTK_COMBO_BOX(combo), ""); -- gtk_combo_box_append_text(GTK_COMBO_BOX(combo), "Off"); -- 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); -- data->policy.config = combo; ++ + entry = gtk_entry_new(); + gtk_entry_set_max_length (GTK_ENTRY (entry), 15); + if (ipv4_config.address) @@ -3399,12 +3960,8 @@ index 320dce4..3d3cee8 100644 + + label = gtk_label_new(_("Netmask:")); + gtk_table_attach_defaults(GTK_TABLE(table), label, 1, 2, 5, 6); -+// gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_LEFT); -+// gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.0); + data->ipv4.label[1] = label; - -- label = gtk_label_new(NULL); -- gtk_label_set_line_wrap(GTK_LABEL(label), TRUE); ++ + entry = gtk_entry_new(); + gtk_entry_set_max_length (GTK_ENTRY (entry), 15); + if (ipv4_config.netmask) @@ -3414,8 +3971,6 @@ index 320dce4..3d3cee8 100644 + + label = gtk_label_new(_("Gateway:")); + gtk_table_attach_defaults(GTK_TABLE(table), label, 1, 2, 6, 7); -+// gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_LEFT); -+// gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.0); + data->ipv4.label[2] = label; + + entry = gtk_entry_new(); @@ -3454,7 +4009,7 @@ index 320dce4..3d3cee8 100644 + GtkWidget *entry; + GtkWidget *button; + -+ const gchar *name, *security, *icon, *state; ++ const char *name, *security, *icon, *state; + guint strength; + + gtk_tree_model_get(data->model, iter, @@ -3465,6 +4020,9 @@ index 320dce4..3d3cee8 100644 + CONNMAN_COLUMN_STRENGTH, &strength, + -1); + ++ if (g_str_equal(state, "failure") == TRUE) ++ connman_client_remove(data->client, data->device); ++ + 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); @@ -3475,31 +4033,24 @@ index 320dce4..3d3cee8 100644 + + label = gtk_label_new(_("Access Point:")); + gtk_table_attach_defaults(GTK_TABLE(table), label, 1, 2, 0, 1); -+// gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_LEFT); -+// gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.0); + + label = gtk_label_new(_(name)); + gtk_table_attach_defaults(GTK_TABLE(table), label, 2, 4, 0, 1); -+ gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_LEFT); + gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_LEFT); + gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); + data->wifi.name = label; + + label = gtk_label_new(_("Security:")); + gtk_table_attach_defaults(GTK_TABLE(table), label, 1, 2, 1, 2); -+// gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_LEFT); -+// gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.0); + + label = gtk_label_new(_(security)); + gtk_table_attach_defaults(GTK_TABLE(table), label, 2, 4, 1, 2); - gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_LEFT); ++ gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_LEFT); + gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); + data->wifi.security = label; + + label = gtk_label_new(_("Passphrase:")); + gtk_table_attach_defaults(GTK_TABLE(table), label, 1, 2, 2, 3); -+// gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_LEFT); -+// gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.0); -+ + + if (g_str_equal(security, "none") != TRUE && + g_str_equal(security, "unknown") != TRUE) { @@ -3532,7 +4083,9 @@ index 320dce4..3d3cee8 100644 - data->policy.label = label; + gtk_widget_hide(label); + data->wifi.connect_info = label; -+ + +- g_signal_connect(G_OBJECT(combo), "changed", +- G_CALLBACK(changed_callback), data); + button = gtk_button_new_with_label(_("Connect")); + gtk_table_attach_defaults(GTK_TABLE(table), button, 3, 4, 8, 9); + g_signal_connect(G_OBJECT(button), "clicked", @@ -3557,17 +4110,14 @@ index 320dce4..3d3cee8 100644 + } + + wifi_ipconfig(table, data, iter); - -- g_signal_connect(G_OBJECT(combo), "changed", -- G_CALLBACK(changed_callback), data); } -void update_wifi_policy(struct config_data *data, guint policy) +void update_wifi_ipv4(struct config_data *data, guint policy) { GtkWidget *combo = data->policy.config; +- gchar *info = NULL; + GtkWidget *entry[3]; - gchar *info = NULL; + int i; + + for (i = 0; i < 3; i++) @@ -3599,14 +4149,14 @@ index 320dce4..3d3cee8 100644 break; default: gtk_combo_box_set_active(GTK_COMBO_BOX(combo), -1); -@@ -136,9 +367,7 @@ void update_wifi_policy(struct config_data *data, guint policy) +@@ -136,9 +414,5 @@ void update_wifi_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); + G_CALLBACK(changed_callback), data); - - g_free(info); } diff --git a/meta/recipes-connectivity/connman/connman-gnome_0.5.bb b/meta/recipes-connectivity/connman/connman-gnome_0.5.bb index 6958ee57bb..7660048111 100644 --- a/meta/recipes-connectivity/connman/connman-gnome_0.5.bb +++ b/meta/recipes-connectivity/connman/connman-gnome_0.5.bb @@ -6,7 +6,7 @@ LIC_FILES_CHKSUM = "file://COPYING;md5=eb723b61539feef013de476e68b5c50a \ file://properties/main.c;beginline=1;endline=20;md5=50c77c81871308b033ab7a1504626afb \ file://common/connman-dbus.c;beginline=1;endline=20;md5=de6b485c0e717a0236402d220187717a" DEPENDS = "gtk+ dbus" -PR = "r0" +PR = "r1" RRECOMMENDS_${PN} = "python python-dbus connman connman-plugin-ethernet connman-plugin-loopback connman-plugin-udhcp connman-plugin-wifi connman-plugin-fake connman-plugin-bluetooth connman-plugin-dnsproxy" |