aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDongxiao Xu <dongxiao.xu@intel.com>2011-03-25 15:19:42 +0800
committerSamuel Ortiz <sameo@linux.intel.com>2011-03-25 12:19:49 +0100
commitf0862551c6295ad5c166745e91f21bda1fc9a50e (patch)
tree007dcd86593b2706236ad9ea1214cf01ac7c8a9b
parentdf71c62ff6db8f928ec51d73f303a3abd0171a02 (diff)
downloadconnman-gnome-f0862551c6295ad5c166745e91f21bda1fc9a50e.tar.gz
Enable wifi service
Support both dhcp and manual configurations. Support realtime status update.
-rw-r--r--common/connman-client.c92
-rw-r--r--common/connman-client.h16
-rw-r--r--common/connman-dbus.c68
-rw-r--r--common/connman-dbus.xml2
-rw-r--r--properties/Makefile.am2
-rw-r--r--properties/advanced.h13
-rw-r--r--properties/main.c91
-rw-r--r--properties/wifi.c315
8 files changed, 414 insertions, 185 deletions
diff --git a/common/connman-client.c b/common/connman-client.c
index 3c203cb..915931e 100644
--- a/common/connman-client.c
+++ b/common/connman-client.c
@@ -114,10 +114,10 @@ static void connman_client_init(ConnmanClient *client)
G_TYPE_STRING, /* name */
G_TYPE_STRING, /* icon */
G_TYPE_UINT, /* type */
- G_TYPE_UINT, /* state */
+ G_TYPE_STRING, /* state */
G_TYPE_BOOLEAN, /* favorite */
G_TYPE_UINT, /* strength */
- G_TYPE_UINT, /* security */
+ G_TYPE_STRING, /* security */
G_TYPE_STRING, /* passphrase */
G_TYPE_STRING, /* method */
G_TYPE_STRING, /* address */
@@ -256,30 +256,6 @@ GtkTreeModel *connman_client_get_device_model(ConnmanClient *client)
return model;
}
-void connman_client_set_policy(ConnmanClient *client, const gchar *device,
- const gchar *policy)
-{
- ConnmanClientPrivate *priv = CONNMAN_CLIENT_GET_PRIVATE(client);
- DBusGProxy *proxy;
- GValue value = { 0 };
-
- DBG("client %p", client);
-
- if (device == NULL)
- return;
-
- proxy = connman_dbus_get_proxy(priv->store, device);
- if (proxy == NULL)
- return;
-
- g_value_init(&value, G_TYPE_STRING);
- g_value_set_string(&value, policy);
-
- connman_set_property(proxy, "Policy", &value, NULL);
-
- g_object_unref(proxy);
-}
-
gboolean connman_client_set_ipv4(ConnmanClient *client, const gchar *device,
struct ipv4_config *ipv4_config)
{
@@ -391,18 +367,18 @@ static gboolean network_disconnect(GtkTreeModel *model, GtkTreePath *path,
-1);
if (proxy == NULL)
- return FALSE;
+ return TRUE;
if (g_str_equal(dbus_g_proxy_get_interface(proxy),
CONNMAN_SERVICE_INTERFACE) == FALSE)
- return FALSE;
+ return TRUE;
if (type == CONNMAN_TYPE_WIFI)
connman_disconnect(proxy, NULL);
g_object_unref(proxy);
- return TRUE;
+ return FALSE;
}
void connman_client_connect(ConnmanClient *client, const gchar *network)
@@ -427,6 +403,31 @@ void connman_client_connect(ConnmanClient *client, const gchar *network)
g_object_unref(proxy);
}
+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;
+
+ connman_connect_async(proxy, callback, userdata);
+
+done:
+ return;
+}
+
static void connman_client_disconnect_all(ConnmanClient *client)
{
ConnmanClientPrivate *priv = CONNMAN_CLIENT_GET_PRIVATE(client);
@@ -456,11 +457,11 @@ void connman_client_disconnect(ConnmanClient *client, const gchar *network)
g_object_unref(proxy);
}
-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);
@@ -496,30 +497,34 @@ 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);
if (network == NULL)
- return;
+ goto done;
proxy = connman_dbus_get_proxy(priv->store, network);
if (proxy == NULL)
- return;
+ goto done;
g_value_init(&value, G_TYPE_STRING);
g_value_set_string(&value, passphrase);
- connman_set_property(proxy, "Passphrase", &value, NULL);
+ ret = connman_set_property(proxy, "Passphrase", &value, NULL);
g_value_unset(&value);
g_object_unref(proxy);
+
+done:
+ return ret;
}
void connman_client_set_callback(ConnmanClient *client,
@@ -540,3 +545,20 @@ void connman_client_set_callback(ConnmanClient *client,
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;
+
+ proxy = connman_dbus_get_proxy(priv->store, network);
+ if (proxy == NULL)
+ return;
+
+ connman_remove(proxy, NULL);
+
+ g_object_unref(proxy);
+}
diff --git a/common/connman-client.h b/common/connman-client.h
index d756619..592da4f 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
@@ -64,8 +65,6 @@ GtkTreeModel *connman_client_get_model(ConnmanClient *client);
GtkTreeModel *connman_client_get_device_model(ConnmanClient *client);
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);
gboolean connman_client_set_ipv4(ConnmanClient *client, const gchar *device,
@@ -74,10 +73,11 @@ 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);
-
-guint connman_client_get_security(ConnmanClient *client, const gchar *network);
+gchar *connman_client_get_security(ConnmanClient *client, const gchar *network);
+void connman_client_connect_async(ConnmanClient *client, const gchar *network,
+ connman_connect_reply callback, gpointer userdata);
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);
@@ -87,16 +87,18 @@ typedef void (* ConnmanClientCallback) (const char *status, void *user_data);
void connman_client_set_callback(ConnmanClient *client,
ConnmanClientCallback callback, gpointer user_data);
+void connman_client_remove(ConnmanClient *client, const gchar *network);
+
enum {
CONNMAN_COLUMN_PROXY, /* G_TYPE_OBJECT */
CONNMAN_COLUMN_INDEX, /* G_TYPE_UINT */
CONNMAN_COLUMN_NAME, /* G_TYPE_STRING */
CONNMAN_COLUMN_ICON, /* G_TYPE_STRING */
CONNMAN_COLUMN_TYPE, /* G_TYPE_UINT */
- CONNMAN_COLUMN_STATE, /* G_TYPE_UINT */
+ CONNMAN_COLUMN_STATE, /* G_TYPE_STRING */
CONNMAN_COLUMN_FAVORITE, /* G_TYPE_BOOLEAN */
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_METHOD, /* G_TYPE_STRING */
CONNMAN_COLUMN_ADDRESS, /* G_TYPE_STRING */
diff --git a/common/connman-dbus.c b/common/connman-dbus.c
index 549c567..2b5be36 100644
--- a/common/connman-dbus.c
+++ b/common/connman-dbus.c
@@ -194,46 +194,6 @@ static const gchar *type2icon(guint type)
return NULL;
}
-static guint get_state(const GValue *value)
-{
- const char *state = value ? g_value_get_string(value) : NULL;
-
- if (state == NULL)
- return CONNMAN_STATE_UNKNOWN;
- else if (g_str_equal(state, "idle") == TRUE)
- return CONNMAN_STATE_IDLE;
- else if (g_str_equal(state, "carrier") == TRUE)
- return CONNMAN_STATE_CARRIER;
- else if (g_str_equal(state, "association") == TRUE)
- return CONNMAN_STATE_ASSOCIATION;
- else if (g_str_equal(state, "configuration") == TRUE)
- return CONNMAN_STATE_CONFIGURATION;
- else if (g_str_equal(state, "ready") == TRUE)
- return CONNMAN_STATE_READY;
- else if (g_str_equal(state, "failure") == TRUE)
- return CONNMAN_STATE_FAILURE;
-
- return CONNMAN_STATE_UNKNOWN;
-}
-
-static guint get_security(const GValue *value)
-{
- const char *security = value ? g_value_get_string(value) : NULL;
-
- if (security == NULL)
- return CONNMAN_SECURITY_UNKNOWN;
- else if (g_str_equal(security, "none") == TRUE)
- return CONNMAN_SECURITY_NONE;
- else if (g_str_equal(security, "wep") == TRUE)
- return CONNMAN_SECURITY_WEP;
- else if (g_str_equal(security, "wpa") == TRUE)
- return CONNMAN_SECURITY_WPA;
- else if (g_str_equal(security, "rsn") == TRUE)
- return CONNMAN_SECURITY_RSN;
-
- return CONNMAN_SECURITY_UNKNOWN;
-}
-
static void service_changed(DBusGProxy *proxy, const char *property,
GValue *value, gpointer user_data)
{
@@ -244,7 +204,6 @@ static void service_changed(DBusGProxy *proxy, const char *property,
const char *method, *addr, *netmask, *gateway;
GValue *ipv4_method, *ipv4_address, *ipv4_netmask, *ipv4_gateway;
-
DBG("store %p proxy %p property %s", store, proxy, property);
if (property == NULL || value == NULL)
@@ -277,13 +236,23 @@ static void service_changed(DBusGProxy *proxy, const char *property,
CONNMAN_COLUMN_GATEWAY, gateway,
-1);
} else if (g_str_equal(property, "State") == TRUE) {
- guint state = get_state(value);
+ const char *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, "Favorite") == TRUE) {
gboolean favorite = g_value_get_boolean(value);
gtk_tree_store_set(store, &iter,
CONNMAN_COLUMN_FAVORITE, favorite, -1);
+ } else if (g_str_equal(property, "Security") == TRUE) {
+ const char *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) {
+ const char *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) {
guint strength = g_value_get_uchar(value);
gtk_tree_store_set(store, &iter,
@@ -364,8 +333,8 @@ static void service_properties(DBusGProxy *proxy, GHashTable *hash,
{
GtkTreeStore *store = user_data;
GValue *value;
- const gchar *name, *icon;
- guint type, state, strength, security;
+ const gchar *name, *icon, *passphrase, *security, *state;
+ guint type, strength;
gboolean favorite;
GtkTreeIter iter;
@@ -386,16 +355,19 @@ static void service_properties(DBusGProxy *proxy, GHashTable *hash,
icon = type2icon(type);
value = g_hash_table_lookup(hash, "State");
- state = get_state(value);
+ state = value ? g_value_get_string(value) : NULL;
value = g_hash_table_lookup(hash, "Favorite");
favorite = value ? g_value_get_boolean(value) : FALSE;
value = g_hash_table_lookup(hash, "Strength");
- strength= value ? g_value_get_uchar(value) : 0;
+ strength = value ? g_value_get_uchar(value) : 0;
value = g_hash_table_lookup(hash, "Security");
- security = get_security(value);
+ security = value ? g_value_get_string(value) : NULL;
+
+ value = g_hash_table_lookup(hash, "PassPhrase");
+ passphrase = value ? g_value_get_string(value) : NULL;
DBG("name %s type %d icon %s", name, type, icon);
@@ -427,6 +399,7 @@ static void service_properties(DBusGProxy *proxy, GHashTable *hash,
CONNMAN_COLUMN_FAVORITE, favorite,
CONNMAN_COLUMN_STRENGTH, strength,
CONNMAN_COLUMN_SECURITY, security,
+ CONNMAN_COLUMN_PASSPHRASE, passphrase,
CONNMAN_COLUMN_METHOD, method,
CONNMAN_COLUMN_ADDRESS, addr,
CONNMAN_COLUMN_NETMASK, netmask,
@@ -446,6 +419,7 @@ static void service_properties(DBusGProxy *proxy, GHashTable *hash,
CONNMAN_COLUMN_FAVORITE, favorite,
CONNMAN_COLUMN_STRENGTH, strength,
CONNMAN_COLUMN_SECURITY, security,
+ CONNMAN_COLUMN_PASSPHRASE, passphrase,
CONNMAN_COLUMN_METHOD, method,
CONNMAN_COLUMN_ADDRESS, addr,
CONNMAN_COLUMN_NETMASK, netmask,
diff --git a/common/connman-dbus.xml b/common/connman-dbus.xml
index 9fefd55..845f1a3 100644
--- a/common/connman-dbus.xml
+++ b/common/connman-dbus.xml
@@ -15,5 +15,7 @@
</method>
<method name="Disconnect">
</method>
+ <method name="Remove">
+ </method>
</interface>
</node>
diff --git a/properties/Makefile.am b/properties/Makefile.am
index 38060a3..fc1b8c6 100644
--- a/properties/Makefile.am
+++ b/properties/Makefile.am
@@ -1,7 +1,7 @@
bin_PROGRAMS = connman-properties
-connman_properties_SOURCES = main.c advanced.h ethernet.c
+connman_properties_SOURCES = main.c advanced.h ethernet.c wifi.c
connman_properties_LDADD = $(top_builddir)/common/libcommon.a \
@GTK_LIBS@ @DBUS_LIBS@
diff --git a/properties/advanced.h b/properties/advanced.h
index fdf6996..f70da4e 100644
--- a/properties/advanced.h
+++ b/properties/advanced.h
@@ -23,6 +23,7 @@ struct config_data {
ConnmanClient *client;
GtkWidget *widget;
+ GtkWidget *table;
GtkWidget *title;
GtkWidget *label;
GtkWidget *button;
@@ -47,6 +48,16 @@ struct config_data {
} ipv4;
struct ipv4_config ipv4_config;
+
+ struct {
+ GtkWidget *name;
+ GtkWidget *security;
+ GtkWidget *strength;
+ GtkWidget *passphrase;
+ GtkWidget *connect_info;
+ GtkWidget *connect;
+ GtkWidget *disconnect;
+ } wifi;
};
static inline gboolean separator_function(GtkTreeModel *model,
@@ -68,5 +79,5 @@ static inline gboolean separator_function(GtkTreeModel *model,
void add_ethernet_service(GtkWidget *mainbox, GtkTreeIter *iter, struct config_data *data);
void update_ethernet_ipv4(struct config_data *data, guint policy);
-void add_wifi_policy(GtkWidget *mainbox, struct config_data *data);
+void add_wifi_service(GtkWidget *mainbox, GtkTreeIter *iter, struct config_data *data);
void update_wifi_policy(struct config_data *data, guint policy);
diff --git a/properties/main.c b/properties/main.c
index 49bb218..aa99fc6 100644
--- a/properties/main.c
+++ b/properties/main.c
@@ -32,22 +32,44 @@
static ConnmanClient *client;
static GtkWidget *interface_notebook;
+static struct config_data *current_data;
-static void update_config(struct config_data *data)
+static void status_update(GtkTreeModel *model, GtkTreePath *path,
+ GtkTreeIter *iter, gpointer user_data)
{
- GtkTreeIter iter;
+ struct config_data *data = user_data;
guint type;
- gchar *network;
+ const char *name = NULL, *_name = NULL, *state = NULL;
- if (gtk_tree_model_get_iter_from_string(data->model,
- &iter, data->index) == FALSE)
- return;
+ gtk_tree_model_get(model, iter,
+ CONNMAN_COLUMN_STATE, &state,
+ CONNMAN_COLUMN_NAME, &name,
+ CONNMAN_COLUMN_TYPE, &type,
+ -1);
- gtk_tree_model_get(data->model, &iter,
- CONNMAN_COLUMN_TYPE, &type,
- CONNMAN_COLUMN_NAME, &network, -1);
+ if (type == CONNMAN_TYPE_WIFI) {
+ if (data->wifi.name)
+ _name = gtk_label_get_text(GTK_LABEL(data->wifi.name));
- g_free(network);
+ if (!(name && _name && g_str_equal(name, _name)))
+ return;
+
+ 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);
+ } 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);
+ } else {
+ gtk_widget_hide(data->wifi.connect_info);
+ gtk_widget_hide(data->wifi.connect);
+ gtk_widget_show(data->wifi.disconnect);
+ }
+ }
}
static struct config_data *create_config(GtkTreeModel *model,
@@ -100,7 +122,7 @@ static struct config_data *create_config(GtkTreeModel *model,
add_ethernet_service(mainbox, iter, data);
break;
case CONNMAN_TYPE_WIFI:
-// add_wifi_policy(mainbox, data);
+ add_wifi_service(mainbox, iter, data);
break;
default:
break;
@@ -117,6 +139,9 @@ static struct config_data *create_config(GtkTreeModel *model,
gtk_widget_show_all(mainbox);
+ g_signal_connect(G_OBJECT(model), "row-changed",
+ G_CALLBACK(status_update), data);
+
return data;
}
@@ -135,19 +160,21 @@ static void select_callback(GtkTreeSelection *selection, gpointer user_data)
return;
}
- if (data == NULL) {
- 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);
- page = gtk_notebook_page_num(GTK_NOTEBOOK(notebook),
- data->widget);
- }
+ current_data = data;
+
+ page = gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
+ data->widget, NULL);
gtk_notebook_set_current_page(GTK_NOTEBOOK(notebook), page);
@@ -168,22 +195,36 @@ static void device_to_text(GtkTreeViewColumn *column, GtkCellRenderer *cell,
switch (type) {
case CONNMAN_TYPE_ETHERNET:
title = N_("Ethernet");
+ markup = g_strdup_printf(" %s\n", title);
break;
case CONNMAN_TYPE_WIFI:
- title = N_("WIFI");
+ /* 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");
+ markup = g_strdup_printf(" %s\n", title);
break;
case CONNMAN_TYPE_BLUETOOTH:
title = N_("Bluetooth");
+ markup = g_strdup_printf(" %s\n", title);
break;
default:
title = N_("Unknown");
+ markup = g_strdup_printf(" %s\n", title);
break;
}
- markup = g_strdup_printf(" %s\n", title);
g_object_set(cell, "markup", markup, NULL);
g_free(markup);
}
@@ -350,6 +391,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 b34df51..1fc8121 100644
--- a/properties/wifi.c
+++ b/properties/wifi.c
@@ -23,6 +23,7 @@
#include <config.h>
#endif
+#include <dbus/dbus-glib.h>
#include <glib/gi18n.h>
#include <gtk/gtk.h>
@@ -30,108 +31,287 @@
#include "advanced.h"
+static void update_wifi_ipv4(struct config_data *data, guint policy);
+
static void changed_callback(GtkWidget *editable, gpointer user_data)
{
-#if 0
struct config_data *data = user_data;
gint active;
active = gtk_combo_box_get_active(GTK_COMBO_BOX(data->policy.config));
- switch (active) {
- case 0:
- connman_client_set_policy(data->client, data->device, "auto");
- update_wifi_policy(data, CONNMAN_POLICY_AUTO);
- break;
- case 1:
- connman_client_set_policy(data->client, data->device, "manual");
- update_wifi_policy(data, CONNMAN_POLICY_MANUAL);
- break;
- case 3:
- connman_client_set_policy(data->client, data->device, "off");
- update_wifi_policy(data, CONNMAN_POLICY_OFF);
- break;
+ update_wifi_ipv4(data, active);
+}
+
+static void connect_reply_cb(DBusGProxy *proxy, GError *error,
+ gpointer user_data)
+{
+ if (error)
+ g_error_free(error);
+}
+
+static void connect_callback(GtkWidget *editable, gpointer user_data)
+{
+ struct config_data *data = user_data;
+
+ gboolean ret;
+ gint active;
+
+ if (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);
+
+ if (ret == FALSE) {
+ return;
+ }
}
-#endif
+
+ 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_connect_async(data->client, data->device, connect_reply_cb, 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 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,
+ };
+
+ gtk_tree_model_get(data->model, iter,
+ CONNMAN_COLUMN_PROXY, &proxy,
+ CONNMAN_COLUMN_METHOD, &ipv4_config.method,
+ CONNMAN_COLUMN_ADDRESS, &ipv4_config.address,
+ CONNMAN_COLUMN_NETMASK, &ipv4_config.netmask,
+ CONNMAN_COLUMN_GATEWAY, &ipv4_config.gateway,
+ -1);
+ label = gtk_label_new(_("Configuration:"));
+ gtk_table_attach_defaults(GTK_TABLE(table), label, 1, 2, 3, 4);
+ data->ipv4.label[0] = label;
+
+ combo = gtk_combo_box_new_text();
+ gtk_combo_box_append_text(GTK_COMBO_BOX(combo), "DHCP");
+ gtk_combo_box_append_text(GTK_COMBO_BOX(combo), "Manual");
+
+ gtk_combo_box_set_row_separator_func(GTK_COMBO_BOX(combo),
+ separator_function, NULL, NULL);
+ gtk_table_attach_defaults(GTK_TABLE(table), combo, 2, 4, 3, 4);
+ data->policy.config = combo;
+
+ label = gtk_label_new(_("IP address:"));
+ gtk_table_attach_defaults(GTK_TABLE(table), label, 1, 2, 4, 5);
+ data->ipv4.label[0] = label;
+
+ entry = gtk_entry_new();
+ gtk_entry_set_max_length (GTK_ENTRY (entry), 15);
+ if (ipv4_config.address)
+ gtk_entry_set_text(GTK_ENTRY(entry), ipv4_config.address);
+ gtk_table_attach_defaults(GTK_TABLE(table), entry, 2, 4, 4, 5);
+ data->ipv4.entry[0] = entry;
+
+
+ label = gtk_label_new(_("Netmask:"));
+ gtk_table_attach_defaults(GTK_TABLE(table), label, 1, 2, 5, 6);
+ data->ipv4.label[1] = label;
+
+ entry = gtk_entry_new();
+ gtk_entry_set_max_length (GTK_ENTRY (entry), 15);
+ if (ipv4_config.netmask)
+ gtk_entry_set_text(GTK_ENTRY(entry), ipv4_config.netmask);
+ gtk_table_attach_defaults(GTK_TABLE(table), entry, 2, 4, 5, 6);
+ data->ipv4.entry[1] = entry;
+
+ label = gtk_label_new(_("Gateway:"));
+ gtk_table_attach_defaults(GTK_TABLE(table), label, 1, 2, 6, 7);
+ data->ipv4.label[2] = label;
+
+ entry = gtk_entry_new();
+ gtk_entry_set_max_length (GTK_ENTRY (entry), 15);
+ if (ipv4_config.gateway)
+ gtk_entry_set_text(GTK_ENTRY(entry), ipv4_config.gateway);
+ gtk_table_attach_defaults(GTK_TABLE(table), entry, 2, 4, 6, 7);
+ data->ipv4.entry[2] = entry;
+
+ data->ipv4_config = ipv4_config;
+
+ if (g_str_equal(ipv4_config.method, "dhcp") == TRUE)
+ update_wifi_ipv4(data, CONNMAN_POLICY_DHCP);
+ else
+ update_wifi_ipv4(data, CONNMAN_POLICY_MANUAL);
+
+ g_signal_connect(G_OBJECT(combo), "changed",
+ G_CALLBACK(changed_callback), data);
+}
+
+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);
}
-void add_wifi_policy(GtkWidget *mainbox, struct config_data *data)
+void add_wifi_service(GtkWidget *mainbox, GtkTreeIter *iter, struct config_data *data)
{
GtkWidget *vbox;
GtkWidget *table;
GtkWidget *label;
- GtkWidget *combo;
+ GtkWidget *entry;
+ GtkWidget *button;
+
+ const char *name, *security, *icon, *state;
+ guint strength;
- vbox = gtk_vbox_new(FALSE, 0);
+ gtk_tree_model_get(data->model, iter,
+ CONNMAN_COLUMN_NAME, &name,
+ CONNMAN_COLUMN_SECURITY, &security,
+ CONNMAN_COLUMN_ICON, &icon,
+ CONNMAN_COLUMN_STATE, &state,
+ 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);
- 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(10, 5, TRUE);
gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, FALSE, 0);
+ data->table = table;
-#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);
- gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 0, 1);
+ label = gtk_label_new(_("Access Point:"));
+ gtk_table_attach_defaults(GTK_TABLE(table), label, 1, 2, 0, 1);
- combo = gtk_combo_box_new_text();
- gtk_combo_box_append_text(GTK_COMBO_BOX(combo), "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
-
- 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(_(name));
+ gtk_table_attach_defaults(GTK_TABLE(table), label, 2, 4, 0, 1);
+ 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;
- 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;
+ label = gtk_label_new(_("Security:"));
+ gtk_table_attach_defaults(GTK_TABLE(table), label, 1, 2, 1, 2);
- label = gtk_label_new(NULL);
- gtk_label_set_line_wrap(GTK_LABEL(label), TRUE);
+ 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_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);
+
+ if (g_str_equal(security, "none") != TRUE &&
+ g_str_equal(security, "unknown") != TRUE) {
+ entry = gtk_entry_new();
+ gtk_entry_set_max_length (GTK_ENTRY (entry), 64);
+ gtk_table_attach_defaults(GTK_TABLE(table), entry, 2, 4, 2, 3);
+ gtk_entry_set_visibility(GTK_ENTRY(entry), 0);
+ data->wifi.passphrase = entry;
+
+ button = gtk_check_button_new_with_label(_("Show input"));
+ gtk_table_attach_defaults(GTK_TABLE(table), button, 4, 5, 2, 3);
+
+ g_signal_connect(G_OBJECT(button), "toggled",
+ G_CALLBACK(toggled_callback), entry);
+
+
+ } else {
+ label = gtk_label_new(_("none"));
+ gtk_table_attach_defaults(GTK_TABLE(table), label, 2, 4, 2, 3);
+ gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_LEFT);
+ gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
+ data->wifi.passphrase = NULL;
+ }
+
+ label = gtk_label_new(_(""));
+ gtk_table_attach_defaults(GTK_TABLE(table), label, 2, 3, 8, 9);
gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.0);
- gtk_table_attach_defaults(GTK_TABLE(table), label, 1, 4, 1, 2);
- gtk_widget_set_size_request(label, 180, -1);
- data->policy.label = label;
+ 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",
+ G_CALLBACK(connect_callback), data);
+ gtk_widget_set_no_show_all(button, TRUE);
+ data->wifi.connect = button;
+
+ button = gtk_button_new_with_label(_("Disconnect"));
+ gtk_table_attach_defaults(GTK_TABLE(table), button, 3, 4, 8, 9);
+ g_signal_connect(G_OBJECT(button), "clicked",
+ G_CALLBACK(disconnect_callback), data);
+ data->wifi.disconnect = button;
+ gtk_widget_set_no_show_all(button, TRUE);
+
+ if (g_str_equal(state, "failure") == TRUE
+ || g_str_equal(state, "idle") == TRUE) {
+ gtk_widget_show(data->wifi.connect);
+ gtk_widget_hide(data->wifi.disconnect);
+ } else {
+ gtk_widget_hide(data->wifi.connect);
+ gtk_widget_show(data->wifi.disconnect);
+ }
+
+ wifi_ipconfig(table, data, iter);
}
-void update_wifi_policy(struct config_data *data, guint policy)
+void update_wifi_ipv4(struct config_data *data, guint policy)
{
-#if 0
GtkWidget *combo = data->policy.config;
- gchar *info = NULL;
+ GtkWidget *entry[3];
+ int i;
+
+ for (i = 0; i < 3; i++)
+ entry[i] = data->ipv4.entry[i];
+
g_signal_handlers_block_by_func(G_OBJECT(combo),
- G_CALLBACK(changed_callback), data);
+ G_CALLBACK(changed_callback), data);
switch (policy) {
- case CONNMAN_POLICY_OFF:
- gtk_combo_box_set_active(GTK_COMBO_BOX(combo), 3);
+ case CONNMAN_POLICY_DHCP:
+ gtk_combo_box_set_active(GTK_COMBO_BOX(combo), 0);
+ for (i = 0; i < 3; i++) {
+ gtk_entry_set_editable(GTK_ENTRY(entry[i]), 0);
+ gtk_widget_set_sensitive(entry[i], 0);
+ }
break;
case CONNMAN_POLICY_MANUAL:
gtk_combo_box_set_active(GTK_COMBO_BOX(combo), 1);
- break;
- case CONNMAN_POLICY_AUTO:
- gtk_combo_box_set_active(GTK_COMBO_BOX(combo), 0);
+ for (i = 0; i < 3; i++) {
+ gtk_entry_set_editable(GTK_ENTRY(entry[i]), 1);
+ gtk_widget_set_sensitive(entry[i], 1);
+ }
break;
default:
gtk_combo_box_set_active(GTK_COMBO_BOX(combo), -1);
@@ -140,9 +320,4 @@ 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);
-#endif
}