[PATCH BlueZ] client: Add better support for managing devices of multiple controllers

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Previously devices list was cleared when selecting new default
controller. Now devices list is preserverd allowing to list and suggest
devices for default controller even after changing the default
controller.
---
 client/main.c | 56 ++++++++++++++++++++++++++++++++++++--------------------
 1 file changed, 36 insertions(+), 20 deletions(-)

diff --git a/client/main.c b/client/main.c
index 056331f..e1d8eeb 100644
--- a/client/main.c
+++ b/client/main.c
@@ -63,6 +63,7 @@ static GDBusProxy *default_dev;
 static GDBusProxy *default_attr;
 static GList *ctrl_list;
 static GList *dev_list;
+static GList *default_ctrl_dev_list;
 
 static guint input = 0;
 
@@ -358,6 +359,24 @@ static gboolean service_is_child(GDBusProxy *service)
 	return FALSE;
 }
 
+static void update_default_ctrl_dev_list(void)
+{
+	GList *list;
+
+	if (default_ctrl_dev_list) {
+		g_list_free(default_ctrl_dev_list);
+		default_ctrl_dev_list = NULL;
+	}
+
+	for (list = g_list_first(dev_list); list; list = g_list_next(list)) {
+		GDBusProxy *proxy = list->data;
+
+		if (device_is_child(proxy, default_ctrl) == TRUE) 
+			default_ctrl_dev_list = g_list_append(default_ctrl_dev_list, 
+					proxy);
+	}
+}
+
 static void set_default_device(GDBusProxy *proxy, const char *attribute)
 {
 	char *desc = NULL;
@@ -418,9 +437,8 @@ static void proxy_added(GDBusProxy *proxy, void *user_data)
 	interface = g_dbus_proxy_get_interface(proxy);
 
 	if (!strcmp(interface, "org.bluez.Device1")) {
-		if (device_is_child(proxy, default_ctrl) == TRUE)
-			device_added(proxy);
-
+		device_added(proxy);
+		update_default_ctrl_dev_list();
 	} else if (!strcmp(interface, "org.bluez.Adapter1")) {
 		ctrl_list = g_list_append(ctrl_list, proxy);
 
@@ -466,14 +484,13 @@ static void proxy_removed(GDBusProxy *proxy, void *user_data)
 	interface = g_dbus_proxy_get_interface(proxy);
 
 	if (!strcmp(interface, "org.bluez.Device1")) {
-		if (device_is_child(proxy, default_ctrl) == TRUE) {
-			dev_list = g_list_remove(dev_list, proxy);
+		dev_list = g_list_remove(dev_list, proxy);
 
-			print_device(proxy, COLORED_DEL);
+		print_device(proxy, COLORED_DEL);
+		update_default_ctrl_dev_list();
 
-			if (default_dev == proxy)
-				set_default_device(NULL, NULL);
-		}
+		if (default_dev == proxy)
+			set_default_device(NULL, NULL);
 	} else if (!strcmp(interface, "org.bluez.Adapter1")) {
 		ctrl_list = g_list_remove(ctrl_list, proxy);
 
@@ -482,9 +499,7 @@ static void proxy_removed(GDBusProxy *proxy, void *user_data)
 		if (default_ctrl == proxy) {
 			default_ctrl = NULL;
 			set_default_device(NULL, NULL);
-
-			g_list_free(dev_list);
-			dev_list = NULL;
+			update_default_ctrl_dev_list();
 		}
 	} else if (!strcmp(interface, "org.bluez.AgentManager1")) {
 		if (agent_manager == proxy) {
@@ -734,16 +749,14 @@ static void cmd_select(const char *arg)
 
 	default_ctrl = proxy;
 	print_adapter(proxy, NULL);
-
-	g_list_free(dev_list);
-	dev_list = NULL;
+	update_default_ctrl_dev_list();
 }
 
 static void cmd_devices(const char *arg)
 {
 	GList *list;
 
-	for (list = g_list_first(dev_list); list; list = g_list_next(list)) {
+	for (list = g_list_first(default_ctrl_dev_list); list; list = g_list_next(list)) {
 		GDBusProxy *proxy = list->data;
 		print_device(proxy, NULL);
 	}
@@ -753,7 +766,7 @@ static void cmd_paired_devices(const char *arg)
 {
 	GList *list;
 
-	for (list = g_list_first(dev_list); list; list = g_list_next(list)) {
+	for (list = g_list_first(default_ctrl_dev_list); list; list = g_list_next(list)) {
 		GDBusProxy *proxy = list->data;
 		DBusMessageIter iter;
 		dbus_bool_t paired;
@@ -1439,22 +1452,24 @@ static void cmd_remove(const char *arg)
 	if (strcmp(arg, "*") == 0) {
 		GList *list;
 
-		for (list = g_list_first(dev_list); list; list = g_list_next(list)) {
+		for (list = g_list_first(default_ctrl_dev_list); list; list = g_list_next(list)) {
 			GDBusProxy *proxy = list->data;
 
 			remove_device(proxy);
 		}
+		update_default_ctrl_dev_list();
 
 		return;
 	}
 
-	proxy = find_proxy_by_address(dev_list, arg);
+	proxy = find_proxy_by_address(default_ctrl_dev_list, arg);
 	if (!proxy) {
 		rl_printf("Device %s not available\n", arg);
 		return;
 	}
 
 	remove_device(proxy);
+	update_default_ctrl_dev_list();
 }
 
 static void connect_reply(DBusMessage *message, void *user_data)
@@ -1755,7 +1770,7 @@ static char *ctrl_generator(const char *text, int state)
 
 static char *dev_generator(const char *text, int state)
 {
-	return generic_generator(text, state, dev_list, "Address");
+	return generic_generator(text, state, default_ctrl_dev_list, "Address");
 }
 
 static char *attribute_generator(const char *text, int state)
@@ -2156,6 +2171,7 @@ int main(int argc, char *argv[])
 
 	g_list_free_full(ctrl_list, proxy_leak);
 	g_list_free_full(dev_list, proxy_leak);
+	g_list_free(default_ctrl_dev_list);
 
 	g_free(auto_register_agent);
 
-- 
2.7.4

--
To unsubscribe from this list: send the line "unsubscribe linux-bluetooth" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Bluez Devel]     [Linux Wireless Networking]     [Linux Wireless Personal Area Networking]     [Linux ATH6KL]     [Linux USB Devel]     [Linux Media Drivers]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Big List of Linux Books]

  Powered by Linux