summaryrefslogtreecommitdiff
path: root/meta/recipes-connectivity/connman/connman-gnome/0002-Update-for-ConnMan-0.79-API-changes.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta/recipes-connectivity/connman/connman-gnome/0002-Update-for-ConnMan-0.79-API-changes.patch')
-rw-r--r--meta/recipes-connectivity/connman/connman-gnome/0002-Update-for-ConnMan-0.79-API-changes.patch865
1 files changed, 865 insertions, 0 deletions
diff --git a/meta/recipes-connectivity/connman/connman-gnome/0002-Update-for-ConnMan-0.79-API-changes.patch b/meta/recipes-connectivity/connman/connman-gnome/0002-Update-for-ConnMan-0.79-API-changes.patch
new file mode 100644
index 000000000..fe87b5b71
--- /dev/null
+++ b/meta/recipes-connectivity/connman/connman-gnome/0002-Update-for-ConnMan-0.79-API-changes.patch
@@ -0,0 +1,865 @@
+From 8b8fd038474def8452354105b40738a402f28d19 Mon Sep 17 00:00:00 2001
+Message-Id: <8b8fd038474def8452354105b40738a402f28d19.1334369310.git.paul.eggleton@linux.intel.com>
+In-Reply-To: <cover.1334369310.git.paul.eggleton@linux.intel.com>
+References: <cover.1334369310.git.paul.eggleton@linux.intel.com>
+From: Paul Eggleton <paul.eggleton@linux.intel.com>
+Date: Thu, 12 Apr 2012 00:35:00 +0100
+Subject: [PATCH 2/6] Update for ConnMan 0.79 API changes
+
+* Use Manager.GetServices method instead of Manager.Services property
+* Use Manager.GetTechnologies / Technology.Powered instead of
+ Manager.EnabledTechnologies method
+* Use Technology.Powered property instead of Manager.EnableTechnology
+ and Manager.DisableTechnology methods
+* Use Technology.Scan method instead of Manager.RequestScan method
+* Listen for ServicesAdded, ServicesRemoved, TechnologyAdded and
+ TechnologyRemoved signals instead of monitoring the old Services
+ and EnabledTechnologies properties
+
+Also remove unused code relating to the old API.
+
+Upstream-Status: Submitted
+
+Signed-off-by: Paul Eggleton <paul.eggleton@linux.intel.com>
+---
+ common/connman-client.c | 90 ++-----------
+ common/connman-client.h | 12 +-
+ common/connman-dbus.c | 359 +++++++++++++++++++++++++++--------------------
+ common/connman-dbus.h | 1 +
+ common/connman-dbus.xml | 17 +--
+ common/marshal.list | 2 +
+ properties/cellular.c | 6 +-
+ properties/ethernet.c | 8 +-
+ properties/main.c | 14 +--
+ properties/wifi.c | 8 +-
+ 10 files changed, 245 insertions(+), 272 deletions(-)
+
+diff --git a/common/connman-client.c b/common/connman-client.c
+index 407aea0..9d755c4 100644
+--- a/common/connman-client.c
++++ b/common/connman-client.c
+@@ -112,9 +112,7 @@ static void connman_client_init(ConnmanClient *client)
+ G_TYPE_STRING, /* address */
+ G_TYPE_STRING, /* netmask */
+ G_TYPE_STRING, /* gateway */
+- G_TYPE_BOOLEAN, /* ethernet enabled */
+- G_TYPE_BOOLEAN, /* wifi enabled */
+- G_TYPE_BOOLEAN, /* cellular enabled */
++ G_TYPE_BOOLEAN, /* powered */
+ G_TYPE_BOOLEAN);/* offline */
+
+ g_object_set_data(G_OBJECT(priv->store),
+@@ -288,7 +286,7 @@ void connman_client_set_powered(ConnmanClient *client, const gchar *device,
+ DBusGProxy *proxy;
+ GValue value = { 0 };
+
+- DBG("client %p", client);
++ DBG("client %p device %s", client, device);
+
+ if (device == NULL)
+ return;
+@@ -300,64 +298,34 @@ void connman_client_set_powered(ConnmanClient *client, const gchar *device,
+ g_value_init(&value, G_TYPE_BOOLEAN);
+ g_value_set_boolean(&value, powered);
+
+- connman_set_property(proxy, "Powered", &value, NULL);
+-
+- g_object_unref(proxy);
+-}
+-
+-static gboolean device_scan(GtkTreeModel *model, GtkTreePath *path,
+- GtkTreeIter *iter, gpointer user_data)
+-{
+- DBusGProxy *proxy;
+-
+- gtk_tree_model_get(model, iter, CONNMAN_COLUMN_PROXY, &proxy, -1);
+-
+- if (proxy == NULL)
+- return FALSE;
+-
+- if (g_str_equal(dbus_g_proxy_get_interface(proxy),
+- CONNMAN_SERVICE_INTERFACE) == FALSE)
+- return FALSE;
+-
+- connman_propose_scan(proxy, NULL);
++ GError *error = NULL;
++ gboolean ret = connman_set_property(proxy, "Powered", &value, &error);
++ if( error )
++ fprintf (stderr, "error: %s\n", error->message);
+
+ g_object_unref(proxy);
+-
+- return FALSE;
+ }
+
+-void connman_client_propose_scan(ConnmanClient *client, const gchar *device)
++void connman_client_scan(ConnmanClient *client, const gchar *device,
++ connman_scan_reply callback, gpointer user_data)
+ {
+ ConnmanClientPrivate *priv = CONNMAN_CLIENT_GET_PRIVATE(client);
+ DBusGProxy *proxy;
+
+- DBG("client %p", client);
++ DBG("client %p device %s", client, device);
+
+- if (device == NULL) {
+- gtk_tree_model_foreach(GTK_TREE_MODEL(priv->store),
+- device_scan, NULL);
++ if (device == NULL)
+ return;
+- }
+
+ proxy = connman_dbus_get_proxy(priv->store, device);
+ if (proxy == NULL)
+ return;
+
+- connman_propose_scan(proxy, NULL);
++ connman_scan_async(proxy, callback, user_data);
+
+ g_object_unref(proxy);
+ }
+
+-void connman_client_request_scan(ConnmanClient *client, char *scantype,
+- connman_request_scan_reply callback, gpointer userdata)
+-{
+- ConnmanClientPrivate *priv = CONNMAN_CLIENT_GET_PRIVATE(client);
+-
+- DBG("client %p", client);
+-
+- connman_request_scan_async(priv->manager, scantype, callback, userdata);
+-}
+-
+ gboolean connman_client_get_offline_status(ConnmanClient *client)
+ {
+ GHashTable *hash;
+@@ -600,39 +568,3 @@ void connman_client_remove(ConnmanClient *client, const gchar *network)
+
+ g_object_unref(proxy);
+ }
+-
+-void connman_client_enable_technology(ConnmanClient *client, const char *network,
+- const gchar *technology)
+-{
+- ConnmanClientPrivate *priv = CONNMAN_CLIENT_GET_PRIVATE(client);
+- DBusGProxy *proxy;
+-
+- if (network== NULL)
+- return;
+-
+- proxy = connman_dbus_get_proxy(priv->store, network);
+- if (proxy == NULL)
+- return;
+-
+- connman_enable_technology(proxy, technology, NULL);
+-
+- g_object_unref(proxy);
+-}
+-
+-void connman_client_disable_technology(ConnmanClient *client, const char *network,
+- const gchar *technology)
+-{
+- 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_disable_technology(proxy, technology, NULL);
+-
+- g_object_unref(proxy);
+-}
+diff --git a/common/connman-client.h b/common/connman-client.h
+index 15fa098..6fe772c 100644
+--- a/common/connman-client.h
++++ b/common/connman-client.h
+@@ -69,7 +69,8 @@ void connman_client_set_powered(ConnmanClient *client, const gchar *device,
+ gboolean powered);
+ gboolean connman_client_set_ipv4(ConnmanClient *client, const gchar *device,
+ struct ipv4_config *ipv4_config);
+-void connman_client_propose_scan(ConnmanClient *client, const gchar *device);
++void connman_client_scan(ConnmanClient *client, const gchar *device,
++ connman_scan_reply callback, gpointer user_data);
+
+ void connman_client_connect(ConnmanClient *client, const gchar *network);
+ void connman_client_disconnect(ConnmanClient *client, const gchar *network);
+@@ -89,8 +90,6 @@ void connman_client_set_callback(ConnmanClient *client,
+
+ void connman_client_remove(ConnmanClient *client, const gchar *network);
+
+-void connman_client_request_scan(ConnmanClient *client, char *scantype,
+- connman_request_scan_reply callback, gpointer userdata);
+ gboolean connman_client_get_offline_status(ConnmanClient *client);
+ void connman_client_set_offlinemode(ConnmanClient *client, gboolean status);
+
+@@ -114,11 +113,8 @@ enum {
+ CONNMAN_COLUMN_ADDRESS, /* G_TYPE_STRING */
+ CONNMAN_COLUMN_NETMASK, /* G_TYPE_STRING */
+ CONNMAN_COLUMN_GATEWAY, /* G_TYPE_STRING */
+-
+- CONNMAN_COLUMN_ETHERNET_ENABLED,/* G_TYPE_STRING */
+- CONNMAN_COLUMN_WIFI_ENABLED, /* G_TYPE_STRING */
+- CONNMAN_COLUMN_CELLULAR_ENABLED,/* G_TYPE_STRING */
+- CONNMAN_COLUMN_OFFLINEMODE, /* G_TYPE_STRING */
++ CONNMAN_COLUMN_POWERED, /* G_TYPE_BOOLEAN */
++ CONNMAN_COLUMN_OFFLINEMODE, /* G_TYPE_BOOLEAN */
+
+ _CONNMAN_NUM_COLUMNS
+ };
+diff --git a/common/connman-dbus.c b/common/connman-dbus.c
+index 6669749..4eb77b6 100644
+--- a/common/connman-dbus.c
++++ b/common/connman-dbus.c
+@@ -28,6 +28,8 @@
+ #include "connman-dbus.h"
+ #include "connman-dbus-glue.h"
+
++#include "marshal.h"
++
+ #ifdef DEBUG
+ #define DBG(fmt, arg...) printf("%s:%s() " fmt "\n", __FILE__, __FUNCTION__ , ## arg)
+ #else
+@@ -164,22 +166,6 @@ gboolean connman_dbus_get_iter(GtkTreeStore *store, const gchar *path,
+ return get_iter_from_path(store, iter, path);
+ }
+
+-static void iterate_list(const GValue *value, gpointer user_data)
+-{
+- GSList **list = user_data;
+- gchar *path = g_value_dup_boxed(value);
+-
+- if (path == NULL)
+- return;
+-
+- *list = g_slist_append(*list, path);
+-}
+-
+-static gint compare_path(gconstpointer a, gconstpointer b)
+-{
+- return g_strcmp0(a, b);
+-}
+-
+ static guint get_type(const GValue *value)
+ {
+ const char *type = value ? g_value_get_string(value) : NULL;
+@@ -217,95 +203,76 @@ static const gchar *type2icon(guint type)
+ return NULL;
+ }
+
+-static void enabled_technologies_changed(GtkTreeStore *store, GValue *value)
++static void tech_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;
+- gboolean ethernet_enabled_prev, ethernet_enabled = FALSE;
+- gboolean wifi_enabled_prev, wifi_enabled = FALSE;
+- gboolean cellular_enabled_prev, cellular_enabled = FALSE;
+- gchar **tech = g_value_get_boxed (value);
+- guint i;
+
+- if (value == NULL)
+- return;
+-
+- for (i = 0; i < g_strv_length(tech); i++) {
+- DBG("technology: %s", *(tech+i));
+- if (g_str_equal("ethernet", *(tech + i)))
+- ethernet_enabled = TRUE;
+- else if (g_str_equal ("wifi", *(tech + i)))
+- wifi_enabled = TRUE;
+- else if (g_str_equal ("cellular", *(tech + i)))
+- cellular_enabled = TRUE;
+- }
++ DBG("store %p proxy %p property %s", store, proxy, property);
+
+- get_iter_from_type(store, &iter, CONNMAN_TYPE_LABEL_ETHERNET);
+- gtk_tree_model_get(GTK_TREE_MODEL(store), &iter,
+- CONNMAN_COLUMN_ETHERNET_ENABLED, &ethernet_enabled_prev, -1);
+- if (ethernet_enabled_prev != ethernet_enabled)
+- gtk_tree_store_set(store, &iter,
+- CONNMAN_COLUMN_ETHERNET_ENABLED, ethernet_enabled, -1);
++ if (property == NULL || value == NULL)
++ return;
+
+- get_iter_from_type(store, &iter, CONNMAN_TYPE_LABEL_WIFI);
+- gtk_tree_model_get(GTK_TREE_MODEL(store), &iter,
+- CONNMAN_COLUMN_WIFI_ENABLED, &wifi_enabled_prev, -1);
+- if (wifi_enabled_prev != wifi_enabled)
+- gtk_tree_store_set(store, &iter,
+- CONNMAN_COLUMN_WIFI_ENABLED, wifi_enabled, -1);
++ if (get_iter_from_path(store, &iter, path) == FALSE)
++ return;
+
+- get_iter_from_type(store, &iter, CONNMAN_TYPE_LABEL_CELLULAR);
+- gtk_tree_model_get(GTK_TREE_MODEL(store), &iter,
+- CONNMAN_COLUMN_CELLULAR_ENABLED, &cellular_enabled_prev, -1);
+- if (cellular_enabled_prev != cellular_enabled)
++ if (g_str_equal(property, "Powered") == TRUE) {
++ gboolean powered = g_value_get_boolean(value);
+ gtk_tree_store_set(store, &iter,
+- CONNMAN_COLUMN_CELLULAR_ENABLED, cellular_enabled, -1);
++ CONNMAN_COLUMN_POWERED, powered, -1);
++ }
+ }
+
+-static void enabled_technologies_properties(GtkTreeStore *store, DBusGProxy *proxy, GValue *value)
++static void tech_properties(DBusGProxy *proxy, GHashTable *hash,
++ GError *error, gpointer user_data)
+ {
++ GtkTreeStore *store = user_data;
+ GtkTreeIter iter;
+- gboolean ethernet_enabled = FALSE;
+- gboolean wifi_enabled = FALSE;
+- gboolean cellular_enabled = FALSE;
+- gchar **tech = g_value_get_boxed (value);
+- guint i;
+-
+- for (i = 0; i < g_strv_length (tech); i++) {
+- DBG("technology: %s", *(tech+i));
+- if (g_str_equal("ethernet", *(tech + i)))
+- ethernet_enabled = TRUE;
+- else if (g_str_equal ("wifi", *(tech + i)))
+- wifi_enabled = TRUE;
+- else if (g_str_equal ("cellular", *(tech + i)))
+- cellular_enabled = TRUE;
+- }
++ gboolean powered = FALSE;
++ GValue *propval = 0;
++ const char *techtype = 0;
+
+- if (get_iter_from_type(store, &iter, CONNMAN_TYPE_LABEL_ETHERNET) == FALSE)
+- gtk_tree_store_append(store, &iter, NULL);
++ propval = g_hash_table_lookup(hash, "Type");
++ techtype = propval ? g_value_get_string(propval) : NULL;
+
+- gtk_tree_store_set(store, &iter,
+- CONNMAN_COLUMN_PROXY, proxy,
+- CONNMAN_COLUMN_ETHERNET_ENABLED, ethernet_enabled,
+- CONNMAN_COLUMN_TYPE, CONNMAN_TYPE_LABEL_ETHERNET,
+- -1);
++ propval = g_hash_table_lookup(hash, "Powered");
++ powered = propval ? g_value_get_boolean(propval) : FALSE;
+
+- if (get_iter_from_type(store, &iter, CONNMAN_TYPE_LABEL_WIFI) == FALSE)
+- gtk_tree_store_append(store, &iter, NULL);
++ if (g_str_equal("ethernet", techtype))
++ {
++ if (get_iter_from_type(store, &iter, CONNMAN_TYPE_LABEL_ETHERNET) == FALSE)
++ gtk_tree_store_append(store, &iter, NULL);
+
+- gtk_tree_store_set(store, &iter,
+- CONNMAN_COLUMN_PROXY, proxy,
+- CONNMAN_COLUMN_WIFI_ENABLED, wifi_enabled,
+- CONNMAN_COLUMN_TYPE, CONNMAN_TYPE_LABEL_WIFI,
+- -1);
++ gtk_tree_store_set(store, &iter,
++ CONNMAN_COLUMN_PROXY, proxy,
++ CONNMAN_COLUMN_POWERED, powered,
++ CONNMAN_COLUMN_TYPE, CONNMAN_TYPE_LABEL_ETHERNET,
++ -1);
++ }
++ else if (g_str_equal ("wifi", techtype))
++ {
++ if (get_iter_from_type(store, &iter, CONNMAN_TYPE_LABEL_WIFI) == FALSE)
++ gtk_tree_store_append(store, &iter, NULL);
+
+- if (get_iter_from_type(store, &iter, CONNMAN_TYPE_LABEL_CELLULAR) == FALSE)
+- gtk_tree_store_append(store, &iter, NULL);
++ gtk_tree_store_set(store, &iter,
++ CONNMAN_COLUMN_PROXY, proxy,
++ CONNMAN_COLUMN_POWERED, powered,
++ CONNMAN_COLUMN_TYPE, CONNMAN_TYPE_LABEL_WIFI,
++ -1);
++ }
++ else if (g_str_equal ("3g", techtype))
++ {
++ if (get_iter_from_type(store, &iter, CONNMAN_TYPE_LABEL_CELLULAR) == FALSE)
++ gtk_tree_store_append(store, &iter, NULL);
+
+- gtk_tree_store_set(store, &iter,
+- CONNMAN_COLUMN_PROXY, proxy,
+- CONNMAN_COLUMN_CELLULAR_ENABLED, cellular_enabled,
+- CONNMAN_COLUMN_TYPE, CONNMAN_TYPE_LABEL_CELLULAR,
+- -1);
++ gtk_tree_store_set(store, &iter,
++ CONNMAN_COLUMN_PROXY, proxy,
++ CONNMAN_COLUMN_POWERED, powered,
++ CONNMAN_COLUMN_TYPE, CONNMAN_TYPE_LABEL_CELLULAR,
++ -1);
++ }
+ }
+
+ static void offline_mode_changed(GtkTreeStore *store, GValue *value)
+@@ -319,6 +286,39 @@ static void offline_mode_changed(GtkTreeStore *store, GValue *value)
+ -1);
+ }
+
++static void tech_added(DBusGProxy *proxy, DBusGObjectPath *path,
++ GHashTable *hash, gpointer user_data)
++{
++ GtkTreeStore *store = user_data;
++ GtkTreeIter iter;
++ DBG("store %p proxy %p hash %p", store, proxy, hash);
++
++ if (!get_iter_from_path(store, &iter, path)) {
++ DBusGProxy *tech_proxy = dbus_g_proxy_new_for_name(connection,
++ CONNMAN_SERVICE, path,
++ CONNMAN_TECHNOLOGY_INTERFACE);
++ if (tech_proxy == NULL)
++ return;
++
++ tech_properties(tech_proxy, hash, NULL, user_data);
++
++ dbus_g_proxy_add_signal(tech_proxy, "PropertyChanged",
++ G_TYPE_STRING, G_TYPE_VALUE, G_TYPE_INVALID);
++ dbus_g_proxy_connect_signal(tech_proxy, "PropertyChanged",
++ G_CALLBACK(tech_changed), store, NULL);
++ }
++}
++
++static void tech_removed(DBusGProxy *proxy, DBusGObjectPath *path,
++ gpointer user_data)
++{
++ GtkTreeStore *store = user_data;
++ GtkTreeIter iter;
++
++ if (get_iter_from_path(store, &iter, path))
++ gtk_tree_store_remove(store, &iter);
++}
++
+ static void offline_mode_properties(GtkTreeStore *store, DBusGProxy *proxy, GValue *value)
+ {
+ GtkTreeIter iter;
+@@ -401,59 +401,8 @@ static void service_changed(DBusGProxy *proxy, const char *property,
+ }
+ }
+
+-static void property_update(GtkTreeStore *store, const GValue *value,
+- connman_get_properties_reply callback)
+-{
+- GSList *list, *link, *old_list, *new_list = NULL;
+-
+- DBG("store %p", store);
+-
+- old_list = g_object_get_data(G_OBJECT(store), "Services");
+-
+- dbus_g_type_collection_value_iterate(value, iterate_list, &new_list);
+-
+- g_object_set_data(G_OBJECT(store), "Services", 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,
+- CONNMAN_SERVICE_INTERFACE);
+- if (proxy == NULL)
+- continue;
+-
+- DBG("getting %s properties", "Services");
+-
+- connman_get_properties_async(proxy, callback, store);
+- }
+-
+- for (list = old_list; list; list = list->next) {
+- gchar *path = list->data;
+- GtkTreeIter iter;
+-
+- DBG("old path %s", path);
+-
+- 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 service_properties(DBusGProxy *proxy, GHashTable *hash,
+- GError *error, gpointer user_data)
++ gpointer user_data)
+ {
+ GtkTreeStore *store = user_data;
+ GValue *value;
+@@ -468,7 +417,7 @@ static void service_properties(DBusGProxy *proxy, GHashTable *hash,
+
+ DBG("store %p proxy %p hash %p", store, proxy, hash);
+
+- if (error != NULL || hash == NULL)
++ if (hash == NULL)
+ goto done;
+
+ value = g_hash_table_lookup(hash, "Name");
+@@ -572,11 +521,7 @@ static void manager_changed(DBusGProxy *proxy, const char *property,
+ if (property == NULL || value == NULL)
+ return;
+
+- if (g_str_equal(property, "Services") == TRUE)
+- property_update(store, value, service_properties);
+- else if (g_str_equal(property, "EnabledTechnologies") == TRUE)
+- enabled_technologies_changed(store, value);
+- else if (g_str_equal(property, "OfflineMode") == TRUE)
++ if (g_str_equal(property, "OfflineMode") == TRUE)
+ offline_mode_changed(store, value);
+ }
+
+@@ -591,23 +536,89 @@ static void manager_properties(DBusGProxy *proxy, GHashTable *hash,
+ if (error != NULL || hash == NULL)
+ return;
+
+- value = g_hash_table_lookup(hash, "Services");
+- if (value != NULL)
+- property_update(store, value, service_properties);
+-
+- value = g_hash_table_lookup(hash, "EnabledTechnologies");
+- if (value != NULL)
+- enabled_technologies_properties(store, proxy, value);
+-
+ value = g_hash_table_lookup(hash, "OfflineMode");
+ if (value != NULL)
+ offline_mode_properties(store, proxy, value);
+ }
+
++static void manager_services(DBusGProxy *proxy, GPtrArray *array,
++ GError *error, gpointer user_data)
++{
++ int i;
++
++ DBG("proxy %p array %p", proxy, array);
++
++ if (error != NULL || array == NULL)
++ return;
++
++ for (i = 0; i < array->len; i++)
++ {
++ GValueArray *item = g_ptr_array_index(array, i);
++
++ DBusGObjectPath *path = (DBusGObjectPath *)g_value_get_boxed(g_value_array_get_nth(item, 0));
++ DBusGProxy *service_proxy = dbus_g_proxy_new_for_name(connection,
++ CONNMAN_SERVICE, path,
++ CONNMAN_SERVICE_INTERFACE);
++ if (service_proxy == NULL)
++ continue;
++
++ GHashTable *props = (GHashTable *)g_value_get_boxed(g_value_array_get_nth(item, 1));
++ service_properties(service_proxy, props, user_data);
++ }
++}
++
++static void manager_technologies(DBusGProxy *proxy, GPtrArray *array,
++ GError *error, gpointer user_data)
++{
++ int i;
++
++ DBG("proxy %p array %p", proxy, array);
++
++ if (error != NULL || array == NULL)
++ return;
++
++ for (i = 0; i < array->len; i++)
++ {
++ GValueArray *item = g_ptr_array_index(array, i);
++
++ DBusGObjectPath *path = (DBusGObjectPath *)g_value_get_boxed(g_value_array_get_nth(item, 0));
++ GHashTable *props = (GHashTable *)g_value_get_boxed(g_value_array_get_nth(item, 1));
++
++ tech_added(proxy, path, props, user_data);
++ }
++}
++
++static void services_added(DBusGProxy *proxy, GPtrArray *array,
++ gpointer user_data)
++{
++ DBG("proxy %p array %p", proxy, array);
++
++ manager_services(proxy, array, NULL, user_data);
++}
++
++static void services_removed(DBusGProxy *proxy, GPtrArray *array,
++ gpointer user_data)
++{
++ GtkTreeStore *store = user_data;
++ GtkTreeIter iter;
++ int i;
++
++ DBG("store %p proxy %p array %p", store, proxy, array);
++
++ for (i = 0; i < array->len; i++)
++ {
++ DBusGObjectPath *path = (DBusGObjectPath *)g_ptr_array_index(array, i);
++
++ if (get_iter_from_path(store, &iter, path))
++ gtk_tree_store_remove(store, &iter);
++ }
++}
++
+ DBusGProxy *connman_dbus_create_manager(DBusGConnection *conn,
+ GtkTreeStore *store)
+ {
+ DBusGProxy *proxy;
++ GType otype;
+
+ connection = dbus_g_connection_ref(conn);
+
+@@ -620,11 +631,49 @@ DBusGProxy *connman_dbus_create_manager(DBusGConnection *conn,
+ G_TYPE_STRING, G_TYPE_VALUE, G_TYPE_INVALID);
+ dbus_g_proxy_connect_signal(proxy, "PropertyChanged",
+ G_CALLBACK(manager_changed), store, NULL);
+-
++
++ otype = dbus_g_type_get_struct("GValueArray", DBUS_TYPE_G_OBJECT_PATH, DBUS_TYPE_G_DICTIONARY, G_TYPE_INVALID);
++ otype = dbus_g_type_get_collection("GPtrArray", otype);
++ dbus_g_object_register_marshaller(marshal_VOID__BOXED, G_TYPE_NONE, otype, G_TYPE_INVALID);
++
++ dbus_g_proxy_add_signal(proxy, "ServicesAdded",
++ otype, G_TYPE_INVALID);
++ dbus_g_proxy_connect_signal(proxy, "ServicesAdded",
++ G_CALLBACK(services_added), store, NULL);
++
++ otype = DBUS_TYPE_G_OBJECT_PATH_ARRAY;
++ dbus_g_object_register_marshaller(marshal_VOID__BOXED, G_TYPE_NONE, otype, G_TYPE_INVALID);
++
++ dbus_g_proxy_add_signal(proxy, "ServicesRemoved",
++ otype, G_TYPE_INVALID);
++ dbus_g_proxy_connect_signal(proxy, "ServicesRemoved",
++ G_CALLBACK(services_removed), store, NULL);
++
++ dbus_g_object_register_marshaller(marshal_VOID__STRING_BOXED, G_TYPE_NONE, DBUS_TYPE_G_OBJECT_PATH, DBUS_TYPE_G_DICTIONARY, G_TYPE_INVALID);
++ dbus_g_proxy_add_signal(proxy, "TechnologyAdded",
++ DBUS_TYPE_G_OBJECT_PATH, DBUS_TYPE_G_DICTIONARY, G_TYPE_INVALID);
++ dbus_g_proxy_connect_signal(proxy, "TechnologyAdded",
++ G_CALLBACK(tech_added), store, NULL);
++
++ dbus_g_object_register_marshaller(marshal_VOID__STRING, G_TYPE_NONE, DBUS_TYPE_G_OBJECT_PATH, G_TYPE_INVALID);
++ dbus_g_proxy_add_signal(proxy, "TechnologyRemoved",
++ DBUS_TYPE_G_OBJECT_PATH, G_TYPE_INVALID);
++ dbus_g_proxy_connect_signal(proxy, "TechnologyRemoved",
++ G_CALLBACK(tech_removed), store, NULL);
++
++
+ DBG("getting manager properties");
+
+ connman_get_properties_async(proxy, manager_properties, store);
+
++ DBG("getting technologies");
++
++ connman_get_technologies_async(proxy, manager_technologies, store);
++
++ DBG("getting services");
++
++ connman_get_services_async(proxy, manager_services, store);
++
+ return proxy;
+ }
+
+diff --git a/common/connman-dbus.h b/common/connman-dbus.h
+index cfca50e..c1b5091 100644
+--- a/common/connman-dbus.h
++++ b/common/connman-dbus.h
+@@ -32,6 +32,7 @@
+
+ #define CONNMAN_PROFILE_INTERFACE CONNMAN_SERVICE ".Profile"
+ #define CONNMAN_SERVICE_INTERFACE CONNMAN_SERVICE ".Service"
++#define CONNMAN_TECHNOLOGY_INTERFACE CONNMAN_SERVICE ".Technology"
+
+ DBusGProxy *connman_dbus_create_manager(DBusGConnection *connection,
+ GtkTreeStore *store);
+diff --git a/common/connman-dbus.xml b/common/connman-dbus.xml
+index e20cb3b..56b9582 100644
+--- a/common/connman-dbus.xml
++++ b/common/connman-dbus.xml
+@@ -5,26 +5,23 @@
+ <method name="GetProperties">
+ <arg type="a{sv}" direction="out"/>
+ </method>
++ <method name="GetServices">
++ <arg type="a(oa{sv})" direction="out"/>
++ </method>
++ <method name="GetTechnologies">
++ <arg type="a(oa{sv})" direction="out"/>
++ </method>
+ <method name="SetProperty">
+ <arg type="s"/>
+ <arg type="v"/>
+ </method>
+- <method name="ProposeScan">
+- </method>
+ <method name="Connect">
+ </method>
+ <method name="Disconnect">
+ </method>
+ <method name="Remove">
+ </method>
+- <method name="RequestScan">
+- <arg type="s"/>
+- </method>
+- <method name="EnableTechnology">
+- <arg type="s"/>
+- </method>
+- <method name="DisableTechnology">
+- <arg type="s"/>
++ <method name="Scan">
+ </method>
+ </interface>
+ </node>
+diff --git a/common/marshal.list b/common/marshal.list
+index e72aa4b..8b174d0 100644
+--- a/common/marshal.list
++++ b/common/marshal.list
+@@ -1 +1,3 @@
+ VOID:STRING,BOXED
++VOID:BOXED
++VOID:STRING
+diff --git a/properties/cellular.c b/properties/cellular.c
+index 7bbfb89..4d27e0e 100644
+--- a/properties/cellular.c
++++ b/properties/cellular.c
+@@ -59,9 +59,9 @@ static void switch_callback(GtkWidget *editable, gpointer user_data)
+ const gchar *label = gtk_button_get_label(GTK_BUTTON(data->cellular_button));
+
+ if (g_str_equal(label, "Disable"))
+- connman_client_disable_technology(data->client, data->device, "cellular");
++ connman_client_set_powered(data->client, data->device, FALSE);
+ else
+- connman_client_enable_technology(data->client, data->device, "cellular");
++ connman_client_set_powered(data->client, data->device, TRUE);
+ }
+
+ void add_cellular_switch_button(GtkWidget *mainbox, GtkTreeIter *iter,
+@@ -75,7 +75,7 @@ void add_cellular_switch_button(GtkWidget *mainbox, GtkTreeIter *iter,
+ gboolean cellular_enabled;
+
+ gtk_tree_model_get(data->model, iter,
+- CONNMAN_COLUMN_CELLULAR_ENABLED, &cellular_enabled,
++ CONNMAN_COLUMN_POWERED, &cellular_enabled,
+ -1);
+
+ vbox = gtk_vbox_new(TRUE, 0);
+diff --git a/properties/ethernet.c b/properties/ethernet.c
+index d7f91d9..31db7a0 100644
+--- a/properties/ethernet.c
++++ b/properties/ethernet.c
+@@ -59,9 +59,9 @@ static void switch_callback(GtkWidget *editable, gpointer user_data)
+ struct config_data *data = user_data;
+ const gchar *label = gtk_button_get_label(GTK_BUTTON(data->ethernet_button));
+ if (g_str_equal(label, "Disable"))
+- connman_client_disable_technology(data->client, data->device, "ethernet");
+- else if (g_str_equal(label, "Enable"))
+- connman_client_enable_technology(data->client, data->device, "ethernet");
++ connman_client_set_powered(data->client, data->device, FALSE);
++ else
++ connman_client_set_powered(data->client, data->device, TRUE);
+ }
+
+ void add_ethernet_switch_button(GtkWidget *mainbox, GtkTreeIter *iter,
+@@ -75,7 +75,7 @@ void add_ethernet_switch_button(GtkWidget *mainbox, GtkTreeIter *iter,
+ gboolean ethernet_enabled;
+
+ gtk_tree_model_get(data->model, iter,
+- CONNMAN_COLUMN_ETHERNET_ENABLED, &ethernet_enabled,
++ CONNMAN_COLUMN_POWERED, &ethernet_enabled,
+ -1);
+
+ vbox = gtk_vbox_new(TRUE, 0);
+diff --git a/properties/main.c b/properties/main.c
+index 088684a..e266f03 100644
+--- a/properties/main.c
++++ b/properties/main.c
+@@ -40,18 +40,14 @@ static void status_update(GtkTreeModel *model, GtkTreePath *path,
+ struct config_data *data = user_data;
+ guint type;
+ const char *name = NULL, *_name = NULL, *state = NULL;
+- gboolean ethernet_enabled;
+- gboolean wifi_enabled;
+- gboolean cellular_enabled;
++ gboolean powered;
+ gboolean offline_mode;
+
+ gtk_tree_model_get(model, iter,
+ CONNMAN_COLUMN_STATE, &state,
+ CONNMAN_COLUMN_NAME, &name,
+ CONNMAN_COLUMN_TYPE, &type,
+- CONNMAN_COLUMN_ETHERNET_ENABLED, &ethernet_enabled,
+- CONNMAN_COLUMN_WIFI_ENABLED, &wifi_enabled,
+- CONNMAN_COLUMN_CELLULAR_ENABLED, &cellular_enabled,
++ CONNMAN_COLUMN_POWERED, &powered,
+ CONNMAN_COLUMN_OFFLINEMODE, &offline_mode,
+ -1);
+
+@@ -103,14 +99,14 @@ static void status_update(GtkTreeModel *model, GtkTreePath *path,
+ } else if (type == CONNMAN_TYPE_LABEL_ETHERNET) {
+ if (!data->ethernet_button)
+ return;
+- if (ethernet_enabled)
++ if (powered)
+ gtk_button_set_label(GTK_BUTTON(data->ethernet_button), _("Disable"));
+ else
+ gtk_button_set_label(GTK_BUTTON(data->ethernet_button), _("Enable"));
+ } else if (type == CONNMAN_TYPE_LABEL_WIFI) {
+ if (!data->wifi_button)
+ return;
+- if (wifi_enabled) {
++ if (powered) {
+ gtk_button_set_label(GTK_BUTTON(data->wifi_button), _("Disable"));
+ gtk_widget_set_sensitive(data->scan_button, 1);
+ } else {
+@@ -120,7 +116,7 @@ static void status_update(GtkTreeModel *model, GtkTreePath *path,
+ } else if (type == CONNMAN_TYPE_LABEL_CELLULAR) {
+ if (!data->cellular_button)
+ return;
+- if (cellular_enabled)
++ if (powered)
+ gtk_button_set_label(GTK_BUTTON(data->cellular_button), _("Disable"));
+ else
+ gtk_button_set_label(GTK_BUTTON(data->cellular_button), _("Enable"));
+diff --git a/properties/wifi.c b/properties/wifi.c
+index 85922a3..038d35a 100644
+--- a/properties/wifi.c
++++ b/properties/wifi.c
+@@ -96,9 +96,9 @@ static void switch_callback(GtkWidget *editable, gpointer user_data)
+ const gchar *label = gtk_button_get_label(GTK_BUTTON(data->wifi_button));
+
+ if (g_str_equal(label, "Disable"))
+- connman_client_disable_technology(data->client, data->device, "wifi");
++ connman_client_set_powered(data->client, data->device, FALSE);
+ else
+- connman_client_enable_technology(data->client, data->device, "wifi");
++ connman_client_set_powered(data->client, data->device, TRUE);
+ }
+
+ static void scan_reply_cb(DBusGProxy *proxy, GError *error,
+@@ -115,7 +115,7 @@ static void scan_callback(GtkWidget *button, gpointer user_data)
+ {
+ struct config_data *data = user_data;
+ gtk_widget_set_sensitive(button, 0);
+- connman_client_request_scan(data->client, "", scan_reply_cb, button);
++ connman_client_scan(data->client, data->device, scan_reply_cb, button);
+ }
+
+ void add_wifi_switch_button(GtkWidget *mainbox, GtkTreeIter *iter,
+@@ -129,7 +129,7 @@ void add_wifi_switch_button(GtkWidget *mainbox, GtkTreeIter *iter,
+ gboolean wifi_enabled;
+
+ gtk_tree_model_get(data->model, iter,
+- CONNMAN_COLUMN_WIFI_ENABLED, &wifi_enabled,
++ CONNMAN_COLUMN_POWERED, &wifi_enabled,
+ -1);
+
+ vbox = gtk_vbox_new(TRUE, 0);
+--
+1.7.5.4
+