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 | |
| 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>
| -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) { |
