diff options
| author | Dongxiao Xu <dongxiao.xu@intel.com> | 2010-08-26 13:37:52 +0800 |
|---|---|---|
| committer | Richard Purdie <rpurdie@linux.intel.com> | 2010-08-27 15:46:55 +0100 |
| commit | ca4a58a4eb66e6e08f358de7f8869a35389ee605 (patch) | |
| tree | 915bdde88c353517b1763907ca41c02745635bc2 /meta | |
| parent | f6917ad47b0425f9ccb3965aa9220ed3ba0e49ec (diff) | |
| download | openembedded-core-ca4a58a4eb66e6e08f358de7f8869a35389ee605.tar.gz openembedded-core-ca4a58a4eb66e6e08f358de7f8869a35389ee605.tar.bz2 openembedded-core-ca4a58a4eb66e6e08f358de7f8869a35389ee605.zip | |
connman: Use connman as default network management tool
Upgrade connman to version 0.56
Modify connman-gnome to match the recent version of connman
Deprecate networkmanager
Signed-off-by: Dongxiao Xu <dongxiao.xu@intel.com>
Diffstat (limited to 'meta')
14 files changed, 3683 insertions, 73 deletions
diff --git a/meta/packages/resolvconf/resolvconf_1.43.bb b/meta/packages/resolvconf/resolvconf_1.43.bb index 2c210ef1ec..f751f17e0e 100644 --- a/meta/packages/resolvconf/resolvconf_1.43.bb +++ b/meta/packages/resolvconf/resolvconf_1.43.bb @@ -9,6 +9,7 @@ AUTHOR = "Thomas Hood" HOMEPAGE = "http://packages.debian.org/resolvconf" DEPENDS = "bash" RDEPENDS = "bash" +PR = "r1" SRC_URI = "${DEBIAN_MIRROR}/main/r/resolvconf/resolvconf_${PV}.tar.gz" @@ -17,7 +18,7 @@ do_compile () { } do_install () { - install -d ${D}${sysconfdir} ${D}${sbindir} ${D}${base_sbindir} ${D}${localstatedir}/run/resolvconf/interface + install -d ${D}${sysconfdir} ${D}${sbindir} ${D}${base_sbindir} ${D}${localstatedir}/volatile/run/resolvconf/interface install -d ${D}${mandir}/man8 ${D}${docdir}/${P} cp -pPR etc/* ${D}${sysconfdir}/ install -m 0755 bin/resolvconf ${D}${base_sbindir}/ diff --git a/meta/recipes-connectivity/connman/files/connman b/meta/recipes-connectivity/connman/connman-0.56/connman index f8154f68f9..f8154f68f9 100755 --- a/meta/recipes-connectivity/connman/files/connman +++ b/meta/recipes-connectivity/connman/connman-0.56/connman diff --git a/meta/recipes-connectivity/connman/files/dbusperms.patch b/meta/recipes-connectivity/connman/connman-0.56/dbusperms.patch index 100af0367b..100af0367b 100644 --- a/meta/recipes-connectivity/connman/files/dbusperms.patch +++ b/meta/recipes-connectivity/connman/connman-0.56/dbusperms.patch diff --git a/meta/recipes-connectivity/connman/connman-gnome/connman-applet.desktop b/meta/recipes-connectivity/connman/connman-gnome/connman-applet.desktop new file mode 100644 index 0000000000..83d96ee67d --- /dev/null +++ b/meta/recipes-connectivity/connman/connman-gnome/connman-applet.desktop @@ -0,0 +1,10 @@ +[Desktop Entry] +Encoding=UTF-8 +Name=Connection Manager +Comment=Connection Manager applet +Icon=stock_internet +Exec=connman-applet +Terminal=false +Type=Application +Categories=Network;GTK; + diff --git a/meta/recipes-connectivity/connman/connman-gnome/connman-gnome.patch b/meta/recipes-connectivity/connman/connman-gnome/connman-gnome.patch new file mode 100644 index 0000000000..52b105e477 --- /dev/null +++ b/meta/recipes-connectivity/connman/connman-gnome/connman-gnome.patch @@ -0,0 +1,3612 @@ +connman-gnome: Change the code to fit recent connman + +The recent connman changes from "device" based to "service" based. +Therefore most of the interaction protocol between connman and +connman-gnome has changed. This commit uses the new dbus interface +to interact with connman. With this change, connman-gnome could +do wired and wireless interface configurations with latest connman. + +Besides, some UI is re-designed to be more neat and friendly to +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 +--- 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); + } + +-static void passphrase_dialog(const char *path, const char *name) +-{ +- GtkWidget *dialog; +- GtkWidget *button; +- GtkWidget *image; +- GtkWidget *label; +- GtkWidget *entry; +- GtkWidget *table; +- GtkWidget *vbox; +- +- dialog = gtk_dialog_new(); +- gtk_window_set_title(GTK_WINDOW(dialog), _("Enter passphrase")); +- gtk_window_set_resizable(GTK_WINDOW(dialog), FALSE); +- gtk_window_set_position(GTK_WINDOW(dialog), GTK_WIN_POS_CENTER); +- gtk_window_set_keep_above(GTK_WINDOW(dialog), TRUE); +- gtk_window_set_urgency_hint(GTK_WINDOW(dialog), TRUE); +- gtk_dialog_set_has_separator(GTK_DIALOG(dialog), FALSE); +- +- button = gtk_dialog_add_button(GTK_DIALOG(dialog), +- GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT); +- button = gtk_dialog_add_button(GTK_DIALOG(dialog), +- GTK_STOCK_OK, GTK_RESPONSE_ACCEPT); +- gtk_widget_grab_default(button); +- +- table = gtk_table_new(5, 2, FALSE); +- gtk_table_set_row_spacings(GTK_TABLE(table), 4); +- gtk_table_set_col_spacings(GTK_TABLE(table), 20); +- gtk_container_set_border_width(GTK_CONTAINER(table), 12); +- gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), table); +- image = gtk_image_new_from_icon_name(GTK_STOCK_DIALOG_AUTHENTICATION, +- GTK_ICON_SIZE_DIALOG); +- gtk_misc_set_alignment(GTK_MISC(image), 0.0, 0.0); +- gtk_table_attach(GTK_TABLE(table), image, 0, 1, 0, 5, +- GTK_SHRINK, GTK_FILL, 0, 0); +- vbox = gtk_vbox_new(FALSE, 6); +- +- label = gtk_label_new(_("Network requires input of a passphrase:")); +- gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.0); +- gtk_container_add(GTK_CONTAINER(vbox), label); +- gtk_table_attach(GTK_TABLE(table), vbox, 1, 2, 0, 1, +- GTK_EXPAND | GTK_FILL, GTK_SHRINK, 0, 0); +- +- entry = gtk_entry_new(); +- gtk_entry_set_max_length(GTK_ENTRY(entry), 120); +- gtk_entry_set_width_chars(GTK_ENTRY(entry), 20); +- gtk_entry_set_visibility(GTK_ENTRY(entry), FALSE); +- gtk_entry_set_activates_default(GTK_ENTRY(entry), TRUE); +- gtk_container_add(GTK_CONTAINER(vbox), entry); +- +- button = gtk_check_button_new_with_label(_("Show input")); +- gtk_container_add(GTK_CONTAINER(vbox), button); +- +- g_signal_connect(G_OBJECT(button), "toggled", +- G_CALLBACK(toggled_callback), entry); +- +- button = gtk_check_button_new_with_label(_("Remember network")); +- gtk_container_add(GTK_CONTAINER(vbox), button); +- +- gtk_widget_show_all(dialog); +- +- if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) { +- const gchar *passphrase; +- gboolean remember; +- +- passphrase = gtk_entry_get_text(GTK_ENTRY(entry)); +- remember = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button)); +- +- connman_client_set_passphrase(client, path, passphrase); +- connman_client_set_remember(client, path, remember); +- +- status_prepare(); +- connman_client_connect(client, path); +- } +- +- gtk_widget_destroy(dialog); +-} +- +-static void activate_callback(GtkWidget *item, gpointer user_data) +-{ +- const gchar *path = user_data; +- guint security; +- gchar *passphrase; +- +- security = connman_client_get_security(client, path); +- if (security == CONNMAN_SECURITY_UNKNOWN) +- return; +- +- if (security == CONNMAN_SECURITY_NONE) { +- status_prepare(); +- connman_client_connect(client, path); +- return; +- } +- +- passphrase = connman_client_get_passphrase(client, path); +- if (passphrase != NULL) { +- g_free(passphrase); +- +- status_prepare(); +- connman_client_connect(client, path); +- return; +- } +- +- passphrase_dialog(path, NULL); +-} +- +-static void disconnect_callback(GtkWidget *item, gpointer user_data) +-{ +- connman_client_disconnect(client, NULL); +-} +- +-static GtkWidget *create_popupmenu(void) +-{ +- GtkWidget *menu; +- GtkWidget *item; +- +- menu = gtk_menu_new(); +- +- item = gtk_image_menu_item_new_from_stock(GTK_STOCK_PREFERENCES, NULL); +- g_signal_connect(item, "activate", G_CALLBACK(settings_callback), NULL); +- gtk_widget_show(item); +- gtk_menu_shell_append(GTK_MENU_SHELL(menu), item); +- +- item = gtk_image_menu_item_new_from_stock(GTK_STOCK_ABOUT, NULL); +- g_signal_connect(item, "activate", G_CALLBACK(about_callback), NULL); +- gtk_widget_show(item); +- gtk_menu_shell_append(GTK_MENU_SHELL(menu), item); +- +- return menu; +-} +- + 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); +- 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; + } + +-static void enumerate_networks(GtkMenu *menu, +- GtkTreeModel *model, GtkTreeIter *parent) +-{ +- GtkTreeIter iter; +- gboolean cont; +- +- cont = gtk_tree_model_iter_children(model, &iter, parent); +- +- while (cont == TRUE) { +- GtkWidget *item; +- DBusGProxy *proxy; +- guint strength, security; +- gchar *name, *path; +- gboolean inrange, connected; +- +- gtk_tree_model_get(model, &iter, +- CONNMAN_COLUMN_PROXY, &proxy, +- CONNMAN_COLUMN_NAME, &name, +- CONNMAN_COLUMN_INRANGE, &inrange, +- CONNMAN_COLUMN_ENABLED, &connected, +- CONNMAN_COLUMN_STRENGTH, &strength, +- CONNMAN_COLUMN_SECURITY, &security, -1); +- +- if (connected == TRUE || inrange == TRUE) { +- item = append_menuitem(menu, name, security, strength); +- gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(item), +- connected); +- +- path = g_strdup(dbus_g_proxy_get_path(proxy)); +- g_signal_connect(item, "activate", +- G_CALLBACK(activate_callback), path); +- } +- +- g_free(name); +- +- cont = gtk_tree_model_iter_next(model, &iter); +- } +-} +- + static gboolean menu_callback(GtkMenu *menu) + { +- GtkTreeModel *model; +- GtkTreeIter parent; + GtkWidget *item; +- gboolean cont; +- +- connman_client_propose_scan(client, NULL); +- +- model = connman_client_get_device_network_model(client); +- +- cont = gtk_tree_model_get_iter_first(model, &parent); +- +- while (cont == TRUE) { +- guint type; +- gchar *name; +- +- gtk_tree_model_get(model, &parent, +- CONNMAN_COLUMN_TYPE, &type, +- CONNMAN_COLUMN_NAME, &name, -1); +- +- switch (type) { +- case CONNMAN_TYPE_WIFI: +- case CONNMAN_TYPE_WIMAX: +- enumerate_networks(menu, model, &parent); +- break; +- default: +- break; +- } +- +- g_free(name); +- +- cont = gtk_tree_model_iter_next(model, &parent); +- } +- +- g_object_unref(model); + + item = gtk_separator_menu_item_new(); + gtk_widget_show(item); + gtk_menu_shell_append(GTK_MENU_SHELL(menu), item); + +- item = gtk_menu_item_new_with_label(_("Disconnect Network")); +- g_signal_connect(item, "activate", +- G_CALLBACK(disconnect_callback), NULL); ++ item = gtk_image_menu_item_new_from_stock(GTK_STOCK_PREFERENCES, NULL); ++ g_signal_connect(item, "activate", G_CALLBACK(settings_callback), NULL); + gtk_widget_show(item); + gtk_menu_shell_append(GTK_MENU_SHELL(menu), item); + +- item = gtk_menu_item_new_with_label(_("Join Other Network...")); +- gtk_widget_set_sensitive(item, FALSE); +- //g_signal_connect(item, "activate", +- // G_CALLBACK(join_callback), NULL); ++ item = gtk_image_menu_item_new_from_stock(GTK_STOCK_ABOUT, NULL); ++ g_signal_connect(item, "activate", G_CALLBACK(about_callback), NULL); + gtk_widget_show(item); + gtk_menu_shell_append(GTK_MENU_SHELL(menu), item); + +@@ -387,16 +182,17 @@ static void update_status(GtkTreeModel *model) + cont = gtk_tree_model_get_iter_first(model, &iter); + + while (cont == TRUE) { +- gboolean enabled; ++ gchar *state; + + gtk_tree_model_get(model, &iter, + CONNMAN_COLUMN_TYPE, &type, + CONNMAN_COLUMN_STRENGTH, &strength, +- CONNMAN_COLUMN_ENABLED, &enabled, -1); ++ CONNMAN_COLUMN_STATE, &state, -1); + + online = TRUE; + +- if (enabled == TRUE) ++ if ((type == CONNMAN_TYPE_ETHERNET && (g_str_equal(state, "idle") || g_str_equal(state, "online"))) || ++ (type == CONNMAN_TYPE_WIFI && (g_str_equal(state, "ready") || g_str_equal(state, "online")))) + break; + + cont = gtk_tree_model_iter_next(model, &iter); +@@ -453,7 +249,7 @@ int main(int argc, char *argv[]) + + g_set_application_name(_("Connection Manager")); + +- status_init(menu_callback, create_popupmenu()); ++ status_init(menu_callback); + + client = connman_client_new(); + model = connman_client_get_connection_model(client); +diff --git a/applet/status.c b/applet/status.c +index ef11bcc..13ec752 100644 +--- a/applet/status.c ++++ b/applet/status.c +@@ -170,19 +170,6 @@ static void activate_callback(GObject *object, gpointer user_data) + GTK_STATUS_ICON(object), 1, activate_time); + } + +-static void popup_callback(GObject *object, guint button, +- guint activate_time, gpointer user_data) +-{ +- GtkMenu *menu = user_data; +- +- if (menu == NULL) +- return; +- +- gtk_menu_popup(menu, NULL, NULL, +- gtk_status_icon_position_menu, +- GTK_STATUS_ICON(object), button, activate_time); +-} +- + static GtkIconTheme *icontheme; + static IconAnimation *animation; + static GdkPixbuf *pixbuf_notifier; +@@ -190,7 +177,7 @@ static GdkPixbuf *pixbuf_none; + static GdkPixbuf *pixbuf_wired; + static GdkPixbuf *pixbuf_signal[5]; + +-int status_init(StatusCallback activate, GtkWidget *popup) ++int status_init(StatusCallback activate) + { + GdkScreen *screen; + +@@ -219,9 +206,6 @@ int status_init(StatusCallback activate, GtkWidget *popup) + g_signal_connect(statusicon, "activate", + G_CALLBACK(activate_callback), activate); + +- g_signal_connect(statusicon, "popup-menu", +- G_CALLBACK(popup_callback), popup); +- + return 0; + } + +@@ -292,8 +276,6 @@ void status_config(void) + + static void set_ready(gint signal) + { +- int index; +- + available = TRUE; + + if (signal < 0) { +@@ -302,12 +284,7 @@ static void set_ready(gint signal) + return; + } + +- if (signal == 0) +- index = 0; +- else +- index = 3; +- +- gtk_status_icon_set_from_pixbuf(statusicon, pixbuf_signal[index]); ++ gtk_status_icon_set_from_pixbuf(statusicon, pixbuf_signal[4]); + gtk_status_icon_set_tooltip(statusicon, NULL); + } + +diff --git a/applet/status.h b/applet/status.h +index 772a7b2..8a3c83c 100644 +--- a/applet/status.h ++++ b/applet/status.h +@@ -21,7 +21,7 @@ + + typedef gboolean (* StatusCallback) (GtkMenu *menu); + +-int status_init(StatusCallback activate, GtkWidget *popup); ++int status_init(StatusCallback activate); + void status_cleanup(void); + + void status_unavailable(void); +diff --git a/common/Makefile.am b/common/Makefile.am +index ff3a996..8d74a46 100644 +--- a/common/Makefile.am ++++ b/common/Makefile.am +@@ -5,13 +5,6 @@ libcommon_a_SOURCES = connman-dbus.c connman-dbus.h \ + connman-client.h connman-client.c \ + instance.h instance.c + +-noinst_PROGRAMS = connman-demo test-client +- +-connman_demo_SOURCES = demo.c +-connman_demo_LDADD = libcommon.a @GTK_LIBS@ @DBUS_LIBS@ +- +-test_client_LDADD = libcommon.a @GTK_LIBS@ @DBUS_LIBS@ +- + BUILT_SOURCES = marshal.h marshal.c \ + connman-dbus-glue.h \ + instance-glue.h +diff --git a/common/connman-client.c b/common/connman-client.c +index aad0a22..96f9388 100644 +--- a/common/connman-client.c ++++ b/common/connman-client.c +@@ -98,10 +98,9 @@ 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, +- G_TYPE_BOOLEAN, G_TYPE_BOOLEAN, G_TYPE_BOOLEAN, +- G_TYPE_UINT, G_TYPE_UINT, G_TYPE_STRING, +- G_TYPE_STRING, G_TYPE_STRING, G_TYPE_UINT, +- 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_object_set_data(G_OBJECT(priv->store), + "State", g_strdup("unavailable")); +@@ -197,7 +196,7 @@ static gboolean device_filter(GtkTreeModel *model, + if (proxy == NULL) + return FALSE; + +- active = g_str_equal(CONNMAN_DEVICE_INTERFACE, ++ active = g_str_equal(CONNMAN_SERVICE_INTERFACE, + dbus_g_proxy_get_interface(proxy)); + + g_object_unref(proxy); +@@ -231,10 +230,10 @@ static gboolean device_network_filter(GtkTreeModel *model, + if (proxy == NULL) + return FALSE; + +- active = g_str_equal(CONNMAN_DEVICE_INTERFACE, ++ active = g_str_equal(CONNMAN_SERVICE_INTERFACE, + dbus_g_proxy_get_interface(proxy)); + if (active == FALSE) +- active = g_str_equal(CONNMAN_NETWORK_INTERFACE, ++ active = g_str_equal(CONNMAN_SERVICE_INTERFACE, + dbus_g_proxy_get_interface(proxy)); + + g_object_unref(proxy); +@@ -277,7 +276,7 @@ GtkTreeModel *connman_client_get_network_model(ConnmanClient *client, + gtk_tree_model_get(GTK_TREE_MODEL(priv->store), &iter, + CONNMAN_COLUMN_PROXY, &proxy, -1); + +- if (g_str_equal(CONNMAN_DEVICE_INTERFACE, ++ if (g_str_equal(CONNMAN_SERVICE_INTERFACE, + 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, + if (proxy == NULL) + return FALSE; + +- active = g_str_equal(CONNMAN_CONNECTION_INTERFACE, ++ active = g_str_equal(CONNMAN_SERVICE_INTERFACE, + dbus_g_proxy_get_interface(proxy)); + + g_object_unref(proxy); +@@ -337,12 +336,19 @@ 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, ++ struct ipv4_config *ipv4_config) + { + ConnmanClientPrivate *priv = CONNMAN_CLIENT_GET_PRIVATE(client); + DBusGProxy *proxy; + GValue value = { 0 }; ++ gboolean ret; ++ GHashTable *ipv4 = g_hash_table_new(g_str_hash, g_str_equal); ++ ++ g_hash_table_insert(ipv4, "Method", (gpointer)ipv4_config->method); ++ g_hash_table_insert(ipv4, "Address", (gpointer)ipv4_config->address); ++ g_hash_table_insert(ipv4, "Netmask", (gpointer)ipv4_config->netmask); ++ g_hash_table_insert(ipv4, "Gateway", (gpointer)ipv4_config->gateway); + + DBG("client %p", client); + +@@ -353,10 +359,10 @@ void connman_client_set_policy(ConnmanClient *client, const gchar *device, + if (proxy == NULL) + return; + +- g_value_init(&value, G_TYPE_STRING); +- g_value_set_string(&value, policy); ++ g_value_init(&value, DBUS_TYPE_G_STRING_STRING_HASHTABLE); ++ g_value_set_boxed(&value, ipv4); + +- connman_set_property(proxy, "Policy", &value, NULL); ++ ret = connman_set_property(proxy, "IPv4.Configuration", &value, NULL); + + g_object_unref(proxy); + } +@@ -389,26 +395,22 @@ static gboolean device_scan(GtkTreeModel *model, GtkTreePath *path, + GtkTreeIter *iter, gpointer user_data) + { + DBusGProxy *proxy; +- gboolean enabled; + + gtk_tree_model_get(model, iter, CONNMAN_COLUMN_PROXY, &proxy, +- CONNMAN_COLUMN_ENABLED, &enabled, -1); ++ -1); + + if (proxy == NULL) + return FALSE; + + if (g_str_equal(dbus_g_proxy_get_interface(proxy), +- CONNMAN_DEVICE_INTERFACE) == FALSE) +- return FALSE; +- +- if (enabled == FALSE) ++ CONNMAN_SERVICE_INTERFACE) == FALSE) + return FALSE; + + connman_propose_scan(proxy, NULL); + + g_object_unref(proxy); + +- 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, + GtkTreeIter *iter, gpointer user_data) + { + DBusGProxy *proxy; +- gboolean enabled; ++ gchar *name; ++ guint type; + + gtk_tree_model_get(model, iter, CONNMAN_COLUMN_PROXY, &proxy, +- CONNMAN_COLUMN_ENABLED, &enabled, -1); ++ CONNMAN_COLUMN_NAME, &name, ++ CONNMAN_COLUMN_TYPE, &type, ++ -1); + + if (proxy == NULL) +- return FALSE; ++ return TRUE; + + if (g_str_equal(dbus_g_proxy_get_interface(proxy), +- CONNMAN_NETWORK_INTERFACE) == FALSE) +- return FALSE; ++ CONNMAN_SERVICE_INTERFACE) == FALSE) ++ return TRUE; + +- if (enabled == TRUE) ++ if (type == CONNMAN_TYPE_WIFI) + connman_disconnect(proxy, NULL); + + g_object_unref(proxy); + +- return enabled; ++ return FALSE; + } + +-void connman_client_connect(ConnmanClient *client, const gchar *network) ++gboolean connman_client_connect(ConnmanClient *client, const gchar *network) + { + ConnmanClientPrivate *priv = CONNMAN_CLIENT_GET_PRIVATE(client); + DBusGProxy *proxy; ++ gboolean ret = FALSE; + + DBG("client %p", client); ++ DBG("network %s", network); + + if (network == NULL) +- return; ++ goto done; + + gtk_tree_model_foreach(GTK_TREE_MODEL(priv->store), + network_disconnect, NULL); + + proxy = connman_dbus_get_proxy(priv->store, network); + if (proxy == NULL) +- return; ++ goto done; + +- connman_connect(proxy, NULL); ++ ret = connman_connect(proxy, NULL); + + g_object_unref(proxy); ++ ++done: ++ return ret; ++} ++ ++void connman_client_connect_async(ConnmanClient *client, const gchar *network, ++ connman_connect_reply callback, gpointer userdata) ++{ ++ ConnmanClientPrivate *priv = CONNMAN_CLIENT_GET_PRIVATE(client); ++ DBusGProxy *proxy; ++ ++ DBG("client %p", client); ++ DBG("network %s", network); ++ ++ if (network == NULL) ++ goto done; ++ ++ gtk_tree_model_foreach(GTK_TREE_MODEL(priv->store), ++ network_disconnect, NULL); ++ ++ proxy = connman_dbus_get_proxy(priv->store, network); ++ 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) + network_disconnect, NULL); + } + +-void connman_client_disconnect(ConnmanClient *client, const gchar *network) ++gboolean connman_client_disconnect(ConnmanClient *client, const gchar *network) + { + ConnmanClientPrivate *priv = CONNMAN_CLIENT_GET_PRIVATE(client); + DBusGProxy *proxy; ++ gboolean ret = FALSE; + + DBG("client %p", client); + + if (network == NULL) { ++ ret = TRUE; + connman_client_disconnect_all(client); +- return; ++ goto done; + } + + proxy = connman_dbus_get_proxy(priv->store, network); + if (proxy == NULL) +- return; ++ goto done; + +- connman_disconnect(proxy, NULL); ++ ret = connman_disconnect(proxy, NULL); + + g_object_unref(proxy); ++ ++done: ++ return ret; + } + +-guint connman_client_get_security(ConnmanClient *client, const gchar *network) ++gchar *connman_client_get_security(ConnmanClient *client, const gchar *network) + { + ConnmanClientPrivate *priv = CONNMAN_CLIENT_GET_PRIVATE(client); + GtkTreeIter iter; +- guint security; ++ gchar *security; + + DBG("client %p", client); + +@@ -548,56 +594,37 @@ gchar *connman_client_get_passphrase(ConnmanClient *client, const gchar *network + return passphrase; + } + +-void connman_client_set_passphrase(ConnmanClient *client, const gchar *network, ++gboolean connman_client_set_passphrase(ConnmanClient *client, const gchar *network, + const gchar *passphrase) + { + ConnmanClientPrivate *priv = CONNMAN_CLIENT_GET_PRIVATE(client); + DBusGProxy *proxy; + GValue value = { 0 }; ++ gboolean ret = FALSE; + + DBG("client %p", client); ++ DBG("network %p", network); + + if (network == NULL) +- return; ++ goto done; + + proxy = connman_dbus_get_proxy(priv->store, network); + if (proxy == NULL) +- 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); +-} +- +-void connman_client_set_remember(ConnmanClient *client, const gchar *network, +- gboolean remember) +-{ +- 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; +- +- g_value_init(&value, G_TYPE_BOOLEAN); +- g_value_set_boolean(&value, remember); +- +- 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); + + g_value_unset(&value); + + g_object_unref(proxy); ++done: ++ return ret; + } + + void connman_client_set_callback(ConnmanClient *client, +diff --git a/common/connman-client.h b/common/connman-client.h +index f30dae4..f3ac1d3 100644 +--- a/common/connman-client.h ++++ b/common/connman-client.h +@@ -23,6 +23,7 @@ + #define __CONNMAN_CLIENT_H + + #include <gtk/gtk.h> ++#include "connman-dbus-glue.h" + + G_BEGIN_DECLS + +@@ -49,6 +50,13 @@ struct _ConnmanClientClass { + GObjectClass parent_class; + }; + ++struct ipv4_config { ++ const gchar *method; ++ const gchar *address; ++ const gchar *netmask; ++ const gchar *gateway; ++}; ++ + GType connman_client_get_type(void); + + ConnmanClient *connman_client_new(void); +@@ -60,18 +68,20 @@ GtkTreeModel *connman_client_get_network_model(ConnmanClient *client, + const gchar *device); + GtkTreeModel *connman_client_get_connection_model(ConnmanClient *client); + +-void connman_client_set_policy(ConnmanClient *client, const gchar *device, +- const gchar *policy); + void connman_client_set_powered(ConnmanClient *client, const gchar *device, + gboolean powered); + void connman_client_propose_scan(ConnmanClient *client, const gchar *device); + +-void connman_client_connect(ConnmanClient *client, const gchar *network); +-void connman_client_disconnect(ConnmanClient *client, const gchar *network); ++gboolean connman_client_connect(ConnmanClient *client, const gchar *network); ++ ++void connman_client_connect_async(ConnmanClient *client, const gchar *network, ++ connman_connect_reply callback, gpointer userdata); + +-guint connman_client_get_security(ConnmanClient *client, const gchar *network); ++gboolean connman_client_disconnect(ConnmanClient *client, const gchar *network); ++ ++gchar *connman_client_get_security(ConnmanClient *client, const gchar *network); + gchar *connman_client_get_passphrase(ConnmanClient *client, const gchar *network); +-void connman_client_set_passphrase(ConnmanClient *client, const gchar *network, ++gboolean connman_client_set_passphrase(ConnmanClient *client, const gchar *network, + 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); + void connman_client_set_callback(ConnmanClient *client, + ConnmanClientCallback callback, gpointer user_data); + ++void 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); + enum { + CONNMAN_COLUMN_PROXY, /* G_TYPE_OBJECT */ ++ CONNMAN_COLUMN_STATE, /* G_TYPE_STRING */ + CONNMAN_COLUMN_NAME, /* G_TYPE_STRING */ +- CONNMAN_COLUMN_ICON, /* G_TYPE_STRING */ + CONNMAN_COLUMN_TYPE, /* G_TYPE_UINT */ +- CONNMAN_COLUMN_ENABLED, /* G_TYPE_BOOLEAN */ +- CONNMAN_COLUMN_INRANGE, /* G_TYPE_BOOLEAN */ +- CONNMAN_COLUMN_REMEMBER, /* G_TYPE_BOOLEAN */ ++ CONNMAN_COLUMN_ICON, /* G_TYPE_STRING */ + CONNMAN_COLUMN_STRENGTH, /* G_TYPE_UINT */ +- CONNMAN_COLUMN_SECURITY, /* G_TYPE_UINT */ ++ CONNMAN_COLUMN_SECURITY, /* G_TYPE_STRING */ + CONNMAN_COLUMN_PASSPHRASE, /* G_TYPE_STRING */ +- CONNMAN_COLUMN_NETWORK, +- CONNMAN_COLUMN_ADDRESS, +- CONNMAN_COLUMN_POLICY, +- CONNMAN_COLUMN_DEVICE, +- _CONNMAN_NUM_COLUMNS ++ ++ CONNMAN_COLUMN_METHOD, /* G_TYPE_STRING */ ++ CONNMAN_COLUMN_ADDRESS, /* G_TYPE_STRING */ ++ CONNMAN_COLUMN_NETMASK, /* G_TYPE_STRING */ ++ CONNMAN_COLUMN_GATEWAY, /* G_TYPE_STRING */ ++ _CONNMAN_NUM_COLUMNS, ++ + }; + + enum { +@@ -108,10 +123,7 @@ enum { + }; + + enum { +- CONNMAN_POLICY_UNKNOWN, +- CONNMAN_POLICY_IGNORE, +- CONNMAN_POLICY_OFF, +- CONNMAN_POLICY_AUTO, ++ CONNMAN_POLICY_DHCP, + CONNMAN_POLICY_MANUAL, + }; + +diff --git a/common/connman-dbus.c b/common/connman-dbus.c +index 9eba7ae..83f4e57 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); + } + ++static gint compare_list(gchar *path_a, gchar *path_b, gpointer user_data) ++{ ++ return g_strcmp0(path_a, path_b); ++} ++ ++ + static void property_update(GtkTreeStore *store, const GValue *value, + const char *key, connman_get_properties_reply callback) + { +- GSList *list, *link, *old_list, *new_list = NULL; ++ GSList *list, *link, *old_list, *new_list = NULL, *sorted_list = NULL; + const char *iface; + + DBG("store %p key %s", store, key); + +- if (g_str_equal(key, "Connections") == TRUE) +- iface = CONNMAN_CONNECTION_INTERFACE; +- else if (g_str_equal(key, "Devices") == TRUE) +- iface = CONNMAN_DEVICE_INTERFACE; +- else +- iface = CONNMAN_NETWORK_INTERFACE; ++ if (g_str_equal(key, "Services") == TRUE) ++ 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; + DB |
