diff options
author | Marcel Holtmann <marcel@holtmann.org> | 2009-05-14 08:19:48 -0700 |
---|---|---|
committer | Marcel Holtmann <marcel@holtmann.org> | 2009-05-14 08:19:48 -0700 |
commit | ca654a9bffd6507740904165d6f71cc4ec8cb61c (patch) | |
tree | 0b5f528c5d6aad2f76877c966e46727c4781c915 | |
parent | c2e53bc9997ae6174cc889055eab0c6fac58bb82 (diff) | |
download | connman-gnome-ca654a9bffd6507740904165d6f71cc4ec8cb61c.tar.gz |
Start conversion to use service interface
-rw-r--r-- | common/connman-client.c | 231 | ||||
-rw-r--r-- | common/connman-client.h | 26 | ||||
-rw-r--r-- | common/connman-dbus.c | 392 | ||||
-rw-r--r-- | common/connman-dbus.h | 1 | ||||
-rw-r--r-- | common/test-client.c | 309 |
5 files changed, 396 insertions, 563 deletions
diff --git a/common/connman-client.c b/common/connman-client.c index aad0a22..73fdd92 100644 --- a/common/connman-client.c +++ b/common/connman-client.c @@ -45,6 +45,7 @@ struct _ConnmanClientPrivate { GtkTreeStore *store; DBusGProxy *dbus; DBusGProxy *manager; + GHashTable *services; ConnmanClientCallback callback; gpointer userdata; }; @@ -90,18 +91,41 @@ done: static DBusGConnection *connection = NULL; +static gint compare_index(GtkTreeModel *model, GtkTreeIter *iter1, + GtkTreeIter *iter2, gpointer user_data) +{ + guint index1, index2; + + gtk_tree_model_get(model, iter1, CONNMAN_COLUMN_INDEX, &index1, -1); + gtk_tree_model_get(model, iter2, CONNMAN_COLUMN_INDEX, &index2, -1); + + return (gint) index2 - (gint) index1; +} + static void connman_client_init(ConnmanClient *client) { ConnmanClientPrivate *priv = CONNMAN_CLIENT_GET_PRIVATE(client); DBG("client %p", 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); + priv->store = gtk_tree_store_new(_CONNMAN_NUM_COLUMNS, + G_TYPE_OBJECT, /* proxy */ + G_TYPE_UINT, /* index */ + G_TYPE_STRING, /* name */ + G_TYPE_STRING, /* icon */ + G_TYPE_UINT, /* type */ + G_TYPE_UINT, /* state */ + G_TYPE_BOOLEAN, /* favorite */ + G_TYPE_UINT, /* strength */ + G_TYPE_UINT, /* security */ + G_TYPE_STRING); /* passphrase */ + + gtk_tree_sortable_set_default_sort_func(GTK_TREE_SORTABLE(priv->store), + compare_index, NULL, NULL); + + gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(priv->store), + GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID, + GTK_SORT_DESCENDING); g_object_set_data(G_OBJECT(priv->store), "State", g_strdup("unavailable")); @@ -186,157 +210,6 @@ GtkTreeModel *connman_client_get_model(ConnmanClient *client) return model; } -static gboolean device_filter(GtkTreeModel *model, - GtkTreeIter *iter, gpointer user_data) -{ - DBusGProxy *proxy; - gboolean active; - - gtk_tree_model_get(model, iter, CONNMAN_COLUMN_PROXY, &proxy, -1); - - if (proxy == NULL) - return FALSE; - - active = g_str_equal(CONNMAN_DEVICE_INTERFACE, - dbus_g_proxy_get_interface(proxy)); - - g_object_unref(proxy); - - return active; -} - -GtkTreeModel *connman_client_get_device_model(ConnmanClient *client) -{ - ConnmanClientPrivate *priv = CONNMAN_CLIENT_GET_PRIVATE(client); - GtkTreeModel *model; - - DBG("client %p", client); - - model = gtk_tree_model_filter_new(GTK_TREE_MODEL(priv->store), NULL); - - gtk_tree_model_filter_set_visible_func(GTK_TREE_MODEL_FILTER(model), - device_filter, NULL, NULL); - - return model; -} - -static gboolean device_network_filter(GtkTreeModel *model, - GtkTreeIter *iter, gpointer user_data) -{ - DBusGProxy *proxy; - gboolean active; - - gtk_tree_model_get(model, iter, CONNMAN_COLUMN_PROXY, &proxy, -1); - - if (proxy == NULL) - return FALSE; - - active = g_str_equal(CONNMAN_DEVICE_INTERFACE, - dbus_g_proxy_get_interface(proxy)); - if (active == FALSE) - active = g_str_equal(CONNMAN_NETWORK_INTERFACE, - dbus_g_proxy_get_interface(proxy)); - - g_object_unref(proxy); - - return active; -} - -GtkTreeModel *connman_client_get_device_network_model(ConnmanClient *client) -{ - ConnmanClientPrivate *priv = CONNMAN_CLIENT_GET_PRIVATE(client); - GtkTreeModel *model; - - DBG("client %p", client); - - model = gtk_tree_model_filter_new(GTK_TREE_MODEL(priv->store), NULL); - - gtk_tree_model_filter_set_visible_func(GTK_TREE_MODEL_FILTER(model), - device_network_filter, NULL, NULL); - - return model; -} - -GtkTreeModel *connman_client_get_network_model(ConnmanClient *client, - const gchar *device) -{ - ConnmanClientPrivate *priv = CONNMAN_CLIENT_GET_PRIVATE(client); - GtkTreeModel *model; - GtkTreePath *path; - GtkTreeIter iter; - gboolean cont, found = FALSE; - - DBG("client %p", client); - - cont = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(priv->store), - &iter); - - while (cont == TRUE) { - DBusGProxy *proxy; - - gtk_tree_model_get(GTK_TREE_MODEL(priv->store), &iter, - CONNMAN_COLUMN_PROXY, &proxy, -1); - - if (g_str_equal(CONNMAN_DEVICE_INTERFACE, - dbus_g_proxy_get_interface(proxy)) == TRUE) - found = g_str_has_prefix(dbus_g_proxy_get_path(proxy), - device); - - g_object_unref(proxy); - - if (found == TRUE) - break; - - cont = gtk_tree_model_iter_next(GTK_TREE_MODEL(priv->store), - &iter); - } - - if (found == TRUE) { - path = gtk_tree_model_get_path(GTK_TREE_MODEL(priv->store), - &iter); - model = gtk_tree_model_filter_new(GTK_TREE_MODEL(priv->store), - path); - gtk_tree_path_free(path); - } else - model = NULL; - - return model; -} - -static gboolean connection_filter(GtkTreeModel *model, - GtkTreeIter *iter, gpointer user_data) -{ - DBusGProxy *proxy; - gboolean active; - - gtk_tree_model_get(model, iter, CONNMAN_COLUMN_PROXY, &proxy, -1); - - if (proxy == NULL) - return FALSE; - - active = g_str_equal(CONNMAN_CONNECTION_INTERFACE, - dbus_g_proxy_get_interface(proxy)); - - g_object_unref(proxy); - - return active; -} - -GtkTreeModel *connman_client_get_connection_model(ConnmanClient *client) -{ - ConnmanClientPrivate *priv = CONNMAN_CLIENT_GET_PRIVATE(client); - GtkTreeModel *model; - - DBG("client %p", client); - - model = gtk_tree_model_filter_new(GTK_TREE_MODEL(priv->store), NULL); - - gtk_tree_model_filter_set_visible_func(GTK_TREE_MODEL_FILTER(model), - connection_filter, NULL, NULL); - - return model; -} - void connman_client_set_policy(ConnmanClient *client, const gchar *device, const gchar *policy) { @@ -389,10 +262,8 @@ 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); + gtk_tree_model_get(model, iter, CONNMAN_COLUMN_PROXY, &proxy, -1); if (proxy == NULL) return FALSE; @@ -401,9 +272,6 @@ static gboolean device_scan(GtkTreeModel *model, GtkTreePath *path, CONNMAN_DEVICE_INTERFACE) == FALSE) return FALSE; - if (enabled == FALSE) - return FALSE; - connman_propose_scan(proxy, NULL); g_object_unref(proxy); @@ -437,10 +305,8 @@ static gboolean network_disconnect(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); + gtk_tree_model_get(model, iter, CONNMAN_COLUMN_PROXY, &proxy, -1); if (proxy == NULL) return FALSE; @@ -449,12 +315,11 @@ static gboolean network_disconnect(GtkTreeModel *model, GtkTreePath *path, CONNMAN_NETWORK_INTERFACE) == FALSE) return FALSE; - if (enabled == TRUE) - connman_disconnect(proxy, NULL); + connman_disconnect(proxy, NULL); g_object_unref(proxy); - return enabled; + return TRUE; } void connman_client_connect(ConnmanClient *client, const gchar *network) @@ -567,33 +432,7 @@ void connman_client_set_passphrase(ConnmanClient *client, const gchar *network, 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); + connman_set_property(proxy, "Passphrase", &value, NULL); g_value_unset(&value); diff --git a/common/connman-client.h b/common/connman-client.h index f30dae4..500c288 100644 --- a/common/connman-client.h +++ b/common/connman-client.h @@ -54,11 +54,6 @@ GType connman_client_get_type(void); ConnmanClient *connman_client_new(void); GtkTreeModel *connman_client_get_model(ConnmanClient *client); -GtkTreeModel *connman_client_get_device_model(ConnmanClient *client); -GtkTreeModel *connman_client_get_device_network_model(ConnmanClient *client); -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); @@ -83,19 +78,15 @@ void connman_client_set_callback(ConnmanClient *client, 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_ENABLED, /* G_TYPE_BOOLEAN */ - CONNMAN_COLUMN_INRANGE, /* G_TYPE_BOOLEAN */ - CONNMAN_COLUMN_REMEMBER, /* G_TYPE_BOOLEAN */ + CONNMAN_COLUMN_STATE, /* G_TYPE_UINT */ + CONNMAN_COLUMN_FAVORITE, /* G_TYPE_BOOLEAN */ CONNMAN_COLUMN_STRENGTH, /* G_TYPE_UINT */ CONNMAN_COLUMN_SECURITY, /* G_TYPE_UINT */ CONNMAN_COLUMN_PASSPHRASE, /* G_TYPE_STRING */ - CONNMAN_COLUMN_NETWORK, - CONNMAN_COLUMN_ADDRESS, - CONNMAN_COLUMN_POLICY, - CONNMAN_COLUMN_DEVICE, _CONNMAN_NUM_COLUMNS }; @@ -108,11 +99,12 @@ enum { }; enum { - CONNMAN_POLICY_UNKNOWN, - CONNMAN_POLICY_IGNORE, - CONNMAN_POLICY_OFF, - CONNMAN_POLICY_AUTO, - CONNMAN_POLICY_MANUAL, + CONNMAN_STATE_UNKNOWN, + CONNMAN_STATE_IDLE, + CONNMAN_STATE_CARRIER, + CONNMAN_STATE_ASSOCIATION, + CONNMAN_STATE_CONFIGURATION, + CONNMAN_STATE_READY, }; enum { diff --git a/common/connman-dbus.c b/common/connman-dbus.c index 9eba7ae..89c93f3 100644 --- a/common/connman-dbus.c +++ b/common/connman-dbus.c @@ -151,7 +151,7 @@ static void iterate_list(const GValue *value, gpointer user_data) if (path == NULL) return; - *list = g_slist_prepend(*list, path); + *list = g_slist_append(*list, path); } static gint compare_path(gconstpointer a, gconstpointer b) @@ -159,77 +159,6 @@ static gint compare_path(gconstpointer a, gconstpointer b) return g_strcmp0(a, 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; - 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; - - old_list = g_object_get_data(G_OBJECT(store), key); - - dbus_g_type_collection_value_iterate(value, iterate_list, &new_list); - - g_object_set_data(G_OBJECT(store), key, new_list); - - for (list = new_list; list; list = list->next) { - gchar *path = list->data; - DBusGProxy *proxy; - - DBG("new path %s", path); - - link = g_slist_find_custom(old_list, path, compare_path); - if (link != NULL) { - g_free(link->data); - old_list = g_slist_delete_link(old_list, link); - } - - proxy = dbus_g_proxy_new_for_name(connection, - CONNMAN_SERVICE, path, iface); - if (proxy == NULL) - continue; - - DBG("getting %s properties", key); - - connman_get_properties_async(proxy, callback, store); - } - - for (list = old_list; list; list = list->next) { - gchar *path = list->data; - GtkTreeIter iter; - gchar *device = NULL; - - DBG("old path %s", path); - - if (get_iter_from_path(store, &iter, path) == TRUE) { - if (g_str_equal(key, "Connections") == TRUE) - gtk_tree_model_get(GTK_TREE_MODEL(store), &iter, - CONNMAN_COLUMN_DEVICE, &device, -1); - - gtk_tree_store_remove(store, &iter); - } - - if (get_iter_from_path(store, &iter, device) == TRUE) { - gtk_tree_store_set(store, &iter, - CONNMAN_COLUMN_INRANGE, FALSE, - CONNMAN_COLUMN_ADDRESS, NULL, -1); - } - - g_free(device); - g_free(path); - } - - g_slist_free(old_list); -} - static guint get_type(const GValue *value) { const char *type = value ? g_value_get_string(value) : NULL; @@ -263,22 +192,24 @@ static const gchar *type2icon(guint type) return NULL; } -static guint get_policy(const GValue *value) +static guint get_state(const GValue *value) { - const char *policy = value ? g_value_get_string(value) : NULL; - - if (policy == NULL) - return CONNMAN_POLICY_UNKNOWN; - else if (g_str_equal(policy, "ignore") == TRUE) - return CONNMAN_POLICY_IGNORE; - else if (g_str_equal(policy, "off") == TRUE) - return CONNMAN_POLICY_OFF; - else if (g_str_equal(policy, "auto") == TRUE) - return CONNMAN_POLICY_AUTO; - else if (g_str_equal(policy, "manual") == TRUE) - return CONNMAN_POLICY_MANUAL; - - return CONNMAN_POLICY_UNKNOWN; + const char *type = value ? g_value_get_string(value) : NULL; + + if (type == NULL) + return CONNMAN_STATE_UNKNOWN; + else if (g_str_equal(type, "idle") == TRUE) + return CONNMAN_STATE_IDLE; + else if (g_str_equal(type, "carrier") == TRUE) + return CONNMAN_STATE_CARRIER; + else if (g_str_equal(type, "association") == TRUE) + return CONNMAN_STATE_ASSOCIATION; + else if (g_str_equal(type, "configuration") == TRUE) + return CONNMAN_STATE_CONFIGURATION; + else if (g_str_equal(type, "ready") == TRUE) + return CONNMAN_STATE_READY; + + return CONNMAN_STATE_UNKNOWN; } static guint get_security(const GValue *value) @@ -299,7 +230,7 @@ static guint get_security(const GValue *value) return CONNMAN_SECURITY_UNKNOWN; } -static void network_changed(DBusGProxy *proxy, const char *property, +static void service_changed(DBusGProxy *proxy, const char *property, GValue *value, gpointer user_data) { GtkTreeStore *store = user_data; @@ -314,18 +245,14 @@ static void network_changed(DBusGProxy *proxy, const char *property, if (get_iter_from_path(store, &iter, path) == FALSE) return; - if (g_str_equal(property, "Connected") == TRUE) { - gboolean connected = g_value_get_boolean(value); - gtk_tree_store_set(store, &iter, - CONNMAN_COLUMN_ENABLED, connected, -1); - } else if (g_str_equal(property, "Available") == TRUE) { - gboolean inrange = g_value_get_boolean(value); + if (g_str_equal(property, "State") == TRUE) { + guint state = get_state(value); gtk_tree_store_set(store, &iter, - CONNMAN_COLUMN_INRANGE, inrange, -1); - } else if (g_str_equal(property, "Remember") == TRUE) { - gboolean remember = g_value_get_boolean(value); + 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_REMEMBER, remember, -1); + CONNMAN_COLUMN_FAVORITE, favorite, -1); } else if (g_str_equal(property, "Strength") == TRUE) { guint strength = g_value_get_uchar(value); gtk_tree_store_set(store, &iter, @@ -333,115 +260,82 @@ static void network_changed(DBusGProxy *proxy, const char *property, } } -static void network_properties(DBusGProxy *proxy, GHashTable *hash, - GError *error, gpointer user_data) +static void property_update(GtkTreeStore *store, const GValue *value, + connman_get_properties_reply callback) { - GtkTreeStore *store = user_data; - GValue *value; - const gchar *device, *name, *secret; - gboolean connected, inrange, remember; - guint strength, security; - GtkTreeIter iter, parent; - - DBG("store %p proxy %p hash %p", store, proxy, hash); - - if (error != NULL || hash == NULL) - goto done; - - value = g_hash_table_lookup(hash, "Device"); - device = value ? g_value_get_boxed(value) : NULL; - - value = g_hash_table_lookup(hash, "Name"); - name = value ? g_value_get_string(value) : NULL; + GSList *list, *link, *old_list, *new_list = NULL; + guint index = 0; - value = g_hash_table_lookup(hash, "Connected"); - connected = value ? g_value_get_boolean(value) : FALSE; + DBG("store %p", store); - value = g_hash_table_lookup(hash, "Available"); - inrange = value ? g_value_get_boolean(value) : FALSE; + old_list = g_object_get_data(G_OBJECT(store), "Services"); - value = g_hash_table_lookup(hash, "Remember"); - remember = value ? g_value_get_boolean(value) : FALSE; + dbus_g_type_collection_value_iterate(value, iterate_list, &new_list); - value = g_hash_table_lookup(hash, "Strength"); - strength = value ? g_value_get_uchar(value) : 0; + g_object_set_data(G_OBJECT(store), "Services", new_list); - value = g_hash_table_lookup(hash, "WiFi.Security"); - security = get_security(value); + for (list = new_list; list; list = list->next) { + gchar *path = list->data; + DBusGProxy *proxy; + GtkTreeIter iter; - value = g_hash_table_lookup(hash, "WiFi.Passphrase"); - secret = value ? g_value_get_string(value) : NULL; + DBG("new path %s", path); - DBG("name %s strength %d", name, strength); + link = g_slist_find_custom(old_list, path, compare_path); + if (link != NULL) { + g_free(link->data); + old_list = g_slist_delete_link(old_list, link); + } - if (get_iter_from_path(store, &parent, device) == FALSE) - return; + proxy = dbus_g_proxy_new_for_name(connection, + CONNMAN_SERVICE, path, + CONNMAN_SERVICE_INTERFACE); + if (proxy == NULL) + continue; - if (get_iter_from_proxy(store, &iter, proxy) == FALSE) { - gtk_tree_store_insert_with_values(store, &iter, &parent, -1, + if (get_iter_from_proxy(store, &iter, proxy) == FALSE) { + gtk_tree_store_insert_with_values(store, &iter, NULL, -1, CONNMAN_COLUMN_PROXY, proxy, - CONNMAN_COLUMN_NAME, name, - CONNMAN_COLUMN_ENABLED, connected, - CONNMAN_COLUMN_INRANGE, inrange, - CONNMAN_COLUMN_REMEMBER, remember, - CONNMAN_COLUMN_STRENGTH, strength, - CONNMAN_COLUMN_SECURITY, security, - CONNMAN_COLUMN_PASSPHRASE, secret, -1); + CONNMAN_COLUMN_INDEX, index, -1); - dbus_g_proxy_add_signal(proxy, "PropertyChanged", + dbus_g_proxy_add_signal(proxy, "PropertyChanged", G_TYPE_STRING, G_TYPE_VALUE, G_TYPE_INVALID); - dbus_g_proxy_connect_signal(proxy, "PropertyChanged", - G_CALLBACK(network_changed), store, NULL); - } else - 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_SECURITY, security, - CONNMAN_COLUMN_PASSPHRASE, secret, -1); + dbus_g_proxy_connect_signal(proxy, "PropertyChanged", + G_CALLBACK(service_changed), store, NULL); + } else + gtk_tree_store_set(store, &iter, + CONNMAN_COLUMN_INDEX, index, -1); -done: - g_object_unref(proxy); -} + DBG("getting %s properties", "Services"); -static void device_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; + connman_get_properties_async(proxy, callback, store); - DBG("store %p proxy %p property %s", store, proxy, property); + index++; + } - if (property == NULL || value == NULL) - return; + for (list = old_list; list; list = list->next) { + gchar *path = list->data; + GtkTreeIter iter; - if (get_iter_from_path(store, &iter, path) == FALSE) - return; + DBG("old path %s", path); - if (g_str_equal(property, "Policy") == TRUE) { - guint policy = get_policy(value); - gtk_tree_store_set(store, &iter, - CONNMAN_COLUMN_POLICY, policy, -1); - } else if (g_str_equal(property, "Powered") == TRUE) { - gboolean powered = g_value_get_boolean(value); - gtk_tree_store_set(store, &iter, - CONNMAN_COLUMN_ENABLED, powered, -1); - } else if (g_str_equal(property, "Networks") == TRUE) - property_update(store, value, path, network_properties); + if (get_iter_from_path(store, &iter, path) == TRUE) + gtk_tree_store_remove(store, &iter); + + g_free(path); + } + + g_slist_free(old_list); } -static void device_properties(DBusGProxy *proxy, GHashTable *hash, +static void service_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; const gchar *name, *icon; - guint type, policy; - gboolean powered; + guint type, state, strength, security; + gboolean favorite; GtkTreeIter iter; DBG("store %p proxy %p hash %p", store, proxy, hash); @@ -456,11 +350,17 @@ static void device_properties(DBusGProxy *proxy, GHashTable *hash, type = get_type(value); icon = type2icon(type); - value = g_hash_table_lookup(hash, "Policy"); - policy = get_policy(value); + value = g_hash_table_lookup(hash, "State"); + state = get_state(value); + + value = g_hash_table_lookup(hash, "Favorite"); + favorite = value ? g_value_get_boolean(value) : FALSE; - value = g_hash_table_lookup(hash, "Powered"); - powered = value ? g_value_get_boolean(value) : FALSE; + value = g_hash_table_lookup(hash, "Strength"); + strength= value ? g_value_get_uchar(value) : 0; + + value = g_hash_table_lookup(hash, "Security"); + security = get_security(value); DBG("name %s type %d icon %s", name, type, icon); @@ -470,115 +370,24 @@ static void device_properties(DBusGProxy *proxy, GHashTable *hash, CONNMAN_COLUMN_NAME, name, CONNMAN_COLUMN_ICON, icon, CONNMAN_COLUMN_TYPE, type, - CONNMAN_COLUMN_ENABLED, powered, - CONNMAN_COLUMN_POLICY, policy, -1); + CONNMAN_COLUMN_STATE, state, + CONNMAN_COLUMN_FAVORITE, favorite, + CONNMAN_COLUMN_STRENGTH, strength, + CONNMAN_COLUMN_SECURITY, security, -1); dbus_g_proxy_add_signal(proxy, "PropertyChanged", G_TYPE_STRING, G_TYPE_VALUE, G_TYPE_INVALID); dbus_g_proxy_connect_signal(proxy, "PropertyChanged", - G_CALLBACK(device_changed), store, NULL); + G_CALLBACK(service_changed), store, NULL); } else gtk_tree_store_set(store, &iter, CONNMAN_COLUMN_NAME, name, CONNMAN_COLUMN_ICON, icon, CONNMAN_COLUMN_TYPE, type, - CONNMAN_COLUMN_ENABLED, powered, - CONNMAN_COLUMN_POLICY, policy, -1); - - value = g_hash_table_lookup(hash, "Networks"); - if (value != NULL) - property_update(store, value, path, network_properties); - -done: - g_object_unref(proxy); -} - -static void connection_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); - - if (property == NULL || value == NULL) - return; - - if (get_iter_from_path(store, &iter, path) == FALSE) - return; - - if (g_str_equal(property, "Default") == TRUE) { - gboolean enabled = g_value_get_boolean(value); - gtk_tree_store_set(store, &iter, - CONNMAN_COLUMN_ENABLED, enabled, -1); - } else if (g_str_equal(property, "Strength") == TRUE) { - guint strength = g_value_get_uchar(value); - gtk_tree_store_set(store, &iter, - CONNMAN_COLUMN_STRENGTH, strength, -1); - } -} - -static void connection_properties(DBusGProxy *proxy, GHashTable *hash, - GError *error, gpointer user_data) -{ - GtkTreeStore *store = user_data; - GValue *value; - guint type, strength; - gboolean enabled; - const char *device, *address; - GtkTreeIter iter; - - DBG("store %p proxy %p hash %p", store, proxy, hash); - - if (error != NULL || hash == NULL) - goto done; - - value = g_hash_table_lookup(hash, "Type"); - type = get_type(value); - - value = g_hash_table_lookup(hash, "Strength"); - strength = value ? g_value_get_uchar(value) : 0; - - value = g_hash_table_lookup(hash, "Default"); - enabled = value ? g_value_get_boolean(value) : FALSE; - - value = g_hash_table_lookup(hash, "IPv4.Address"); - address = value ? g_value_get_string(value) : NULL; - - DBG("type %d address %s", type, address); - - if (get_iter_from_proxy(store, &iter, proxy) == FALSE) { - gtk_tree_store_insert_with_values(store, &iter, NULL, -1, - CONNMAN_COLUMN_PROXY, proxy, - CONNMAN_COLUMN_TYPE, type, - CONNMAN_COLUMN_ENABLED, enabled, + CONNMAN_COLUMN_STATE, state, + CONNMAN_COLUMN_FAVORITE, favorite, CONNMAN_COLUMN_STRENGTH, strength, - CONNMAN_COLUMN_ADDRESS, address, -1); - - dbus_g_proxy_add_signal(proxy, "PropertyChanged", - G_TYPE_STRING, G_TYPE_VALUE, G_TYPE_INVALID); - dbus_g_proxy_connect_signal(proxy, "PropertyChanged", - G_CALLBACK(connection_changed), store, NULL); - } else - gtk_tree_store_set(store, &iter, - CONNMAN_COLUMN_TYPE, type, - CONNMAN_COLUMN_ENABLED, enabled, - CONNMAN_COLUMN_STRENGTH, strength, -1); - - value = g_hash_table_lookup(hash, "Device"); - device = value ? g_value_get_boxed(value) : NULL; - - DBG("device %s", device); - - gtk_tree_store_set(store, &iter, CONNMAN_COLUMN_DEVICE, device, -1); - - if (get_iter_from_path(store, &iter, device) == TRUE) { - gtk_tree_store_set(store, &iter, - CONNMAN_COLUMN_DEVICE, device, - CONNMAN_COLUMN_INRANGE, TRUE, - CONNMAN_COLUMN_ADDRESS, address, -1); - } + CONNMAN_COLUMN_SECURITY, security, -1); done: g_object_unref(proxy); @@ -609,10 +418,8 @@ static void manager_changed(DBusGProxy *proxy, const char *property, userdata = g_object_get_data(G_OBJECT(store), "userdata"); if (callback) callback(state, userdata); - } else if (g_str_equal(property, "Connections") == TRUE) { - property_update(store, value, property, connection_properties); - } else if (g_str_equal(property, "Devices") == TRUE) { - property_update(store, value, property, device_properties); + } else if (g_str_equal(property, "Services") == TRUE) { + property_update(store, value, service_properties); } } @@ -637,14 +444,9 @@ static void manager_properties(DBusGProxy *proxy, GHashTable *hash, if (callback) callback(state, NULL); - value = g_hash_table_lookup(hash, "Devices"); - if (value != NULL) - property_update(store, value, "Devices", device_properties); - - value = g_hash_table_lookup(hash, "Connections"); + value = g_hash_table_lookup(hash, "Services"); if (value != NULL) - property_update(store, value, - "Connections", connection_properties); + property_update(store, value, service_properties); } DBusGProxy *connman_dbus_create_manager(DBusGConnection *conn, diff --git a/common/connman-dbus.h b/common/connman-dbus.h index a9fa51c..c16ca09 100644 --- a/common/connman-dbus.h +++ b/common/connman-dbus.h @@ -31,6 +31,7 @@ #define CONNMAN_MANAGER_PATH "/" #define CONNMAN_PROFILE_INTERFACE CONNMAN_SERVICE ".Profile" +#define CONNMAN_SERVICE_INTERFACE CONNMAN_SERVICE ".Service" #define CONNMAN_DEVICE_INTERFACE CONNMAN_SERVICE ".Device" #define CONNMAN_NETWORK_INTERFACE CONNMAN_SERVICE ".Network" #define CONNMAN_CONNECTION_INTERFACE CONNMAN_SERVICE ".Connection" diff --git a/common/test-client.c b/common/test-client.c index a78823f..6db5883 100644 --- a/common/test-client.c +++ b/common/test-client.c @@ -30,78 +30,251 @@ static ConnmanClient *client; -static void proxy_to_text(GtkTreeViewColumn *column, GtkCellRenderer *cell, - GtkTreeModel *model, GtkTreeIter *iter, gpointer data) +static const gchar *type2str(guint type) { - DBusGProxy *proxy; - gchar *markup; - - gtk_tree_model_get(model, iter, CONNMAN_COLUMN_PROXY, &proxy, -1); + switch (type) { + case CONNMAN_TYPE_UNKNOWN: + return "Unknown"; + case CONNMAN_TYPE_ETHERNET: + return "Ethernet"; + case CONNMAN_TYPE_WIFI: + return "WiFi"; + case CONNMAN_TYPE_WIMAX: + return "WiMAX"; + case CONNMAN_TYPE_BLUETOOTH: + return "Bluetooth"; + } + + return NULL; +} - markup = g_strdup_printf("<b>%s</b>\n" - "<span size=\"xx-small\">%s\n\n</span>", - dbus_g_proxy_get_interface(proxy), - dbus_g_proxy_get_path(proxy)); - g_object_set(cell, "markup", markup, NULL); - g_free(markup); +static const gchar *state2str(guint state) +{ + switch (state) { + case CONNMAN_STATE_UNKNOWN: + return "Unknown"; + case CONNMAN_STATE_IDLE: + return "Not connected"; + case CONNMAN_STATE_CARRIER: + return "Carrier detected"; + case CONNMAN_STATE_ASSOCIATION: + return "Trying to connect"; + case CONNMAN_STATE_CONFIGURATION: + return "Running configuration"; + case CONNMAN_STATE_READY: + return "Connected"; + } + + return NULL; +} - g_object_unref(proxy); +static const gchar *security2str(guint security) +{ + switch (security) { + case CONNMAN_SECURITY_UNKNOWN: + return "Unknown"; + case CONNMAN_SECURITY_NONE: + return "No"; + case CONNMAN_SECURITY_WEP: + return "WEP"; + case CONNMAN_SECURITY_WPA: + return "WPA"; + case CONNMAN_SECURITY_WPA2: + return "WPA2"; + } + + return NULL; } -static void name_to_text(GtkTreeViewColumn *column, GtkCellRenderer *cell, +static void service_to_text(GtkTreeViewColumn *column, GtkCellRenderer *cell, GtkTreeModel *model, GtkTreeIter *iter, gpointer data) { - gchar *name, *icon; + gchar *name; guint type; + gboolean favorite; gchar *markup; gtk_tree_model_get(model, iter, CONNMAN_COLUMN_NAME, &name, - CONNMAN_COLUMN_ICON, &icon, - CONNMAN_COLUMN_TYPE, &type, -1); + CONNMAN_COLUMN_TYPE, &type, + CONNMAN_COLUMN_FAVORITE, &favorite, -1); - markup = g_strdup_printf("Name: %s\nIcon: %s\nType: %d", - name, icon, type); + markup = g_strdup_printf("<b>%s</b>\n" + "<span size=\"small\">%s service%s</span>", + name ? name : type2str(type), type2str(type), + favorite == TRUE ? " *" : ""); g_object_set(cell, "markup", markup, NULL); g_free(markup); - g_free(icon); g_free(name); } static void status_to_text(GtkTreeViewColumn *column, GtkCellRenderer *cell, GtkTreeModel *model, GtkTreeIter *iter, gpointer data) { - gboolean enabled, inrange, remember; + guint state, strength, security; gchar *markup; - gtk_tree_model_get(model, iter, CONNMAN_COLUMN_ENABLED, &enabled, - CONNMAN_COLUMN_INRANGE, &inrange, - CONNMAN_COLUMN_REMEMBER, &remember, -1); + gtk_tree_model_get(model, iter, CONNMAN_COLUMN_STATE, &state, + CONNMAN_COLUMN_STRENGTH, &strength, + CONNMAN_COLUMN_SECURITY, &security, -1); - markup = g_strdup_printf("Enabled: %d\n" - "InRange: %d\nRemember: %d", - enabled, inrange, remember); + markup = g_strdup_printf("<b>%s</b>\n" + "<span size=\"small\">%d%% - %s protection</span>", + state == CONNMAN_STATE_UNKNOWN ? "" : state2str(state), + strength, security2str(security)); g_object_set(cell, "markup", markup, NULL); g_free(markup); } -static void network_to_text(GtkTreeViewColumn *column, GtkCellRenderer *cell, - GtkTreeModel *model, GtkTreeIter *iter, gpointer data) +static void drag_data_get(GtkWidget *widget, GdkDragContext *context, + GtkSelectionData *data, guint info, + guint time, gpointer user_data) { - guint strength, security; - gchar *secret; - gchar *markup; + printf("drag-data-get\n"); +} - gtk_tree_model_get(model, iter, CONNMAN_COLUMN_STRENGTH, &strength, - CONNMAN_COLUMN_SECURITY, &security, - CONNMAN_COLUMN_PASSPHRASE, &secret, -1); +static void drag_data_received(GtkWidget *widget, GdkDragContext *context, + gint x, gint y, GtkSelectionData *data, + guint info, guint time, gpointer user_data) +{ + GtkTreePath *path; - markup = g_strdup_printf("Strength: %d\nSecurity: %d\nSecret: %s", - strength, security, secret); - g_object_set(cell, "markup", markup, NULL); - g_free(markup); + printf("drag-data-received %d,%d\n", x, y); + + if (gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(widget), + x, y, &path, NULL, NULL, NULL) == FALSE) + return; + + printf("path %s\n", gtk_tree_path_to_string(path)); - g_free(secret); + gtk_tree_path_free(path); +} + +static gboolean drag_drop(GtkWidget *widget, GdkDragContext *drag_context, + gint x, gint y, guint time, gpointer user_data) +{ + printf("drag-drop %d,%d\n", x, y); + + return FALSE; +} + +static void connect_callback(GtkWidget *widget, gpointer user_data) +{ + g_print("connect\n"); +} + +static void disconnect_callback(GtkWidget *widget, gpointer user_data) +{ + g_print("disconnect\n"); +} + +static void remove_callback(GtkWidget *widget, gpointer user_data) +{ + g_print("remove\n"); +} + +static void show_popup(GtkWidget *widget, + GdkEventButton *event, gpointer userdata) +{ + GtkWidget *menu; + GtkWidget *item; + + menu = gtk_menu_new(); + + item = gtk_menu_item_new_with_label("Connect"); + gtk_menu_shell_append(GTK_MENU_SHELL(menu), item); + g_signal_connect(G_OBJECT(item), "activate", + G_CALLBACK(connect_callback), NULL); + + item = gtk_menu_item_new_with_label("Disconnect"); + gtk_menu_shell_append(GTK_MENU_SHELL(menu), item); + g_signal_connect(G_OBJECT(item), "activate", + G_CALLBACK(disconnect_callback), NULL); + + item = gtk_menu_item_new_with_label("Remove"); + gtk_menu_shell_append(GTK_MENU_SHELL(menu), item); + g_signal_connect(G_OBJECT(item), "activate", + G_CALLBACK(remove_callback), NULL); + + gtk_widget_show_all(menu); + + gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, + (event != NULL) ? event->button : 0, + gdk_event_get_time((GdkEvent*) event)); +} + +static gboolean button_pressed(GtkWidget *widget, + GdkEventButton *event, gpointer user_data) +{ + GtkTreeSelection *selection; + GtkTreePath *path; + + if (event->type != GDK_BUTTON_PRESS) + return FALSE; + + if (event->button != 3) + return FALSE; + + selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(widget)); + + if (gtk_tree_selection_count_selected_rows(selection) != 1) + return FALSE; + + if (gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(widget), + (gint) event->x, (gint) event->y, + &path, NULL, NULL, NULL) == FALSE) + return FALSE; + + gtk_tree_selection_unselect_all(selection); + gtk_tree_selection_select_path(selection, path); + + gtk_tree_path_free(path); + + show_popup(widget, event, user_data); + + return TRUE; +} + +static gboolean popup_callback(GtkWidget *widget, gpointer user_data) +{ + GtkTreeSelection *selection; + + selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(widget)); + + if (gtk_tree_selection_count_selected_rows(selection) != 1) + return FALSE; + + show_popup(widget, NULL, user_data); + + return TRUE; +} + +static void select_callback(GtkTreeSelection *selection, gpointer user_data) +{ + GtkTreeView *tree = user_data; + GtkTreeModel *model; + GtkTreeIter iter; + gboolean selected, favorite = FALSE; + const GtkTargetEntry row_targets[] = { + { "resorting", GTK_TARGET_SAME_WIDGET, 0 } + }; + + selected = gtk_tree_selection_get_selected(selection, &model, &iter); + if (selected == TRUE) + gtk_tree_model_get(model, &iter, + CONNMAN_COLUMN_FAVORITE, &favorite, -1); + + if (favorite == TRUE) { + gtk_tree_view_enable_model_drag_source(tree, GDK_BUTTON1_MASK, + row_targets, G_N_ELEMENTS(row_targets), + GDK_ACTION_MOVE); + gtk_tree_view_enable_model_drag_dest(tree, + row_targets, G_N_ELEMENTS(row_targets), + GDK_ACTION_MOVE); + } else { + gtk_tree_view_unset_rows_drag_source(tree); + gtk_tree_view_unset_rows_drag_dest(tree); + } } static GtkWidget *create_tree(void) @@ -109,35 +282,61 @@ static GtkWidget *create_tree(void) GtkWidget *tree; GtkTreeModel *model; GtkTreeSelection *selection; + GtkTreeViewColumn *column; + GtkCellRenderer *renderer; tree = gtk_tree_view_new(); + gtk_tree_view_set_show_expanders(GTK_TREE_VIEW(tree), FALSE); gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(tree), TRUE); gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(tree), TRUE); - - gtk_tree_view_insert_column_with_data_func(GTK_TREE_VIEW(tree), -1, - "Proxy", gtk_cell_renderer_text_new(), - proxy_to_text, NULL, NULL); - - gtk_tree_view_insert_column_with_data_func(GTK_TREE_VIEW(tree), -1, - "Name", gtk_cell_renderer_text_new(), - name_to_text, NULL, NULL); + gtk_tree_view_set_grid_lines(GTK_TREE_VIEW(tree), + GTK_TREE_VIEW_GRID_LINES_NONE); + + column = gtk_tree_view_column_new(); + gtk_tree_view_column_set_title(column, "Service"); + gtk_tree_view_column_set_expand(column, TRUE); + gtk_tree_view_column_set_spacing(column, 6); + gtk_tree_view_column_set_min_width(column, 250); + gtk_tree_view_append_column(GTK_TREE_VIEW(tree), column); + + renderer = gtk_cell_renderer_pixbuf_new(); + gtk_tree_view_column_pack_start(column, renderer, FALSE); + gtk_tree_view_column_add_attribute(column, renderer, + "icon-name", CONNMAN_COLUMN_ICON); + + renderer = gtk_cell_renderer_text_new(); + gtk_tree_view_column_pack_end(column, renderer, TRUE); + gtk_tree_view_column_set_cell_data_func(column, renderer, + service_to_text, NULL, NULL); gtk_tree_view_insert_column_with_data_func(GTK_TREE_VIEW(tree), -1, "Status", gtk_cell_renderer_text_new(), - status_to_text, NULL, NULL); - - gtk_tree_view_insert_column_with_data_func(GTK_TREE_VIEW(tree), -1, - "Network", gtk_cell_renderer_text_new(), - network_to_text, NULL, NULL); + status_to_text, NULL, NULL); model = connman_client_get_model(client); gtk_tree_view_set_model(GTK_TREE_VIEW(tree), model); g_object_unref(model); + gtk_tree_view_set_search_column(GTK_TREE_VIEW(tree), + CONNMAN_COLUMN_NAME); + selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(tree)); gtk_tree_selection_set_mode(selection, GTK_SELECTION_SINGLE); - gtk_tree_view_expand_all(GTK_TREE_VIEW(tree)); + g_signal_connect(G_OBJECT(selection), "changed", + G_CALLBACK(select_callback), tree); + + g_signal_connect(G_OBJECT(tree), "button-press-event", + G_CALLBACK(button_pressed), NULL); + g_signal_connect(G_OBJECT(tree), "popup-menu", + G_CALLBACK(popup_callback), NULL); + + g_signal_connect(G_OBJECT(tree), "drag-drop", + G_CALLBACK(drag_drop), NULL); + g_signal_connect(G_OBJECT(tree), "drag-data-get", + G_CALLBACK(drag_data_get), selection); + g_signal_connect(G_OBJECT(tree), "drag-data-received", + G_CALLBACK(drag_data_received), NULL); return tree; } @@ -177,7 +376,7 @@ static GtkWidget *create_window(void) window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(window), "Client Test"); gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER); - gtk_window_set_default_size(GTK_WINDOW(window), 800, 600); + gtk_window_set_default_size(GTK_WINDOW(window), 480, 400); g_signal_connect(G_OBJECT(window), "delete-event", G_CALLBACK(delete_callback), NULL); |