diff options
author | Marcel Holtmann <marcel@holtmann.org> | 2008-01-08 09:08:51 +0100 |
---|---|---|
committer | Marcel Holtmann <marcel@holtmann.org> | 2008-01-08 09:08:51 +0100 |
commit | 71659e568974110780b089838357b81e9c59f08d (patch) | |
tree | 527912245f0db05a4ab1eb4f4749c234e778f0df | |
parent | 135808a562ba22067aff4f07b525eecd9387be35 (diff) | |
download | connman-gnome-71659e568974110780b089838357b81e9c59f08d.tar.gz |
Add state and signal summary helper
-rw-r--r-- | common/client.c | 83 | ||||
-rw-r--r-- | common/client.h | 3 |
2 files changed, 84 insertions, 2 deletions
diff --git a/common/client.c b/common/client.c index 0894bd1..d39819e 100644 --- a/common/client.c +++ b/common/client.c @@ -42,6 +42,62 @@ static GtkTreeStore *store = NULL; +static client_state_callback state_callback = NULL; +static guint current_state = CLIENT_STATE_UNKNOWN; +static gint current_signal = -1; + +static void execute_state_callback(void) +{ + GtkTreeModel *model = GTK_TREE_MODEL(store); + GtkTreeIter iter; + gboolean cont; + guint new_state = CLIENT_STATE_UNKNOWN; + gint new_signal = -1; + + if (state_callback == NULL) + return; + + cont = gtk_tree_model_get_iter_first(model, &iter); + + while (cont == TRUE) { + gboolean active; + guint type, state, signal; + + gtk_tree_model_get(model, &iter, + CLIENT_COLUMN_ACTIVE, &active, + CLIENT_COLUMN_TYPE, &type, + CLIENT_COLUMN_STATE, &state, + CLIENT_COLUMN_SIGNAL, &signal, -1); + + if (active == TRUE) { + switch (new_state) { + case CLIENT_STATE_ENABLED: + case CLIENT_STATE_CARRIER: + case CLIENT_STATE_READY: + break; + default: + new_state = state; + break; + } + + switch (type) { + case CLIENT_TYPE_80211: + if ((gint) signal > new_signal) + new_signal = signal; + break; + } + } + + cont = gtk_tree_model_iter_next(model, &iter); + } + + if (current_state != new_state || current_signal != new_signal) { + current_state = new_state; + current_signal = new_signal; + state_callback(new_state, new_signal); + } +} + static guint string_to_type(const char *type) { if (g_ascii_strcasecmp(type, "80203") == 0) @@ -258,6 +314,8 @@ static void properties_notify(DBusGProxy *object, CLIENT_COLUMN_STATE, state, CLIENT_COLUMN_SIGNAL, signal, CLIENT_COLUMN_POLICY, policy, -1); + + execute_state_callback(); } static void update_interface(DBusGProxy *proxy, @@ -291,6 +349,8 @@ static void state_changed(DBusGProxy *system, const char *state, gtk_tree_store_set(store, &iter, CLIENT_COLUMN_STATE, string_to_state(state), -1); + + execute_state_callback(); } static void signal_changed(DBusGProxy *system, unsigned int signal, @@ -304,6 +364,8 @@ static void signal_changed(DBusGProxy *system, unsigned int signal, return; gtk_tree_store_set(store, &iter, CLIENT_COLUMN_SIGNAL, signal, -1); + + execute_state_callback(); } static void policy_changed(DBusGProxy *system, const char *policy, @@ -362,7 +424,9 @@ static void add_interface(DBusGProxy *manager, const char *path) if (strcmp(object_path, path) == 0) { gtk_tree_store_set(store, &iter, - CLIENT_COLUMN_ACTIVE, TRUE, -1); + CLIENT_COLUMN_ACTIVE, TRUE, + CLIENT_COLUMN_STATE, + CLIENT_STATE_UNKNOWN, -1); update_interface(proxy, model, &iter); return; } @@ -374,7 +438,9 @@ static void add_interface(DBusGProxy *manager, const char *path) gtk_tree_store_insert_with_values(store, &iter, NULL, -1, CLIENT_COLUMN_ACTIVE, TRUE, - CLIENT_COLUMN_PROXY, proxy, -1); + CLIENT_COLUMN_PROXY, proxy, + CLIENT_COLUMN_STATE, + CLIENT_STATE_UNKNOWN, -1); index = gtk_tree_model_get_string_from_iter(model, &iter); @@ -417,6 +483,8 @@ static void interface_added(DBusGProxy *manager, const char *path, gpointer user_data) { add_interface(manager, path); + + execute_state_callback(); } static gboolean disable_interface(GtkTreeModel *model, GtkTreePath *path, @@ -453,6 +521,8 @@ static void interface_removed(DBusGProxy *manager, const char *path, { gtk_tree_model_foreach(GTK_TREE_MODEL(store), disable_interface, (gpointer) path); + + execute_state_callback(); } static DBusGProxy *create_manager(DBusGConnection *conn) @@ -499,6 +569,8 @@ static void name_owner_changed(DBusGProxy *system, const char *name, if (strcmp(name, CONNMAN_SERVICE) == 0 && *new == '\0') gtk_tree_model_foreach(GTK_TREE_MODEL(store), disable_interface, NULL); + + execute_state_callback(); } static DBusGProxy *create_system(DBusGConnection *conn) @@ -566,6 +638,13 @@ void client_set_userdata(const gchar *index, gpointer user_data) user_data, -1); } +void client_set_state_callback(client_state_callback callback) +{ + state_callback = callback; + + execute_state_callback(); +} + GtkTreeModel *client_get_model(void) { return gtk_tree_model_filter_new(GTK_TREE_MODEL(store), NULL); diff --git a/common/client.h b/common/client.h index 720a872..05dad93 100644 --- a/common/client.h +++ b/common/client.h @@ -71,6 +71,9 @@ void client_cleanup(void); void client_set_userdata(const gchar *index, gpointer user_data); +typedef void (* client_state_callback) (guint state, gint signal); +void client_set_state_callback(client_state_callback callback); + GtkTreeModel *client_get_model(void); GtkTreeModel *client_get_active_model(void); |