[PATCH BlueZ v2 4/5] client: Add support for org.bluez.Bearer.{BREDR, LE}1

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

 



From: Luiz Augusto von Dentz <luiz.von.dentz@xxxxxxxxx>

This adds support for printing properties related to
org.bluez.Bearer.{BREDR, LE}1:

> info XX:XX:XX:XX:XX:XX
...
	BREDR.Paired: yes
	BREDR.Bonded: yes
	BREDR.Connected: no
	LE.Paired: yes
	LE.Bonded: yes
	LE.Connected: no
...
[CHG] BREDR XX:XX:XX:XX:XX:XX Connected: yes
---
 client/main.c | 124 +++++++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 122 insertions(+), 2 deletions(-)

diff --git a/client/main.c b/client/main.c
index d99a5158e35a..09df7b37c46f 100644
--- a/client/main.c
+++ b/client/main.c
@@ -58,6 +58,7 @@ struct adapter {
 	GDBusProxy *adv_monitor_proxy;
 	GList *devices;
 	GList *sets;
+	GList *bearers;
 };
 
 static struct adapter *default_ctrl;
@@ -452,6 +453,36 @@ static void set_added(GDBusProxy *proxy)
 	bt_shell_set_env(g_dbus_proxy_get_path(proxy), proxy);
 }
 
+static void print_bearer(GDBusProxy *proxy, const char *label,
+					const char *description)
+{
+	bt_shell_printf("%s%s%s%s %s\n",
+				description ? "[" : "",
+				description ? : "",
+				description ? "] " : "",
+				label,
+				g_dbus_proxy_get_path(proxy));
+}
+
+static void bearer_added(GDBusProxy *proxy)
+{
+	struct adapter *adapter = find_parent(proxy);
+
+	if (!adapter)
+		return;
+
+	adapter->bearers = g_list_append(adapter->bearers, proxy);
+
+	if (!strcmp(g_dbus_proxy_get_interface(proxy),
+			"org.bluez.Bearer.BREDR1"))
+		print_bearer(proxy, "BREDR", COLORED_NEW);
+	else if (!strcmp(g_dbus_proxy_get_interface(proxy),
+			"org.bluez.Bearer.LE1"))
+		print_bearer(proxy, "LE", COLORED_NEW);
+
+	bt_shell_set_env(g_dbus_proxy_get_path(proxy), proxy);
+}
+
 static void proxy_added(GDBusProxy *proxy, void *user_data)
 {
 	const char *interface;
@@ -489,6 +520,10 @@ static void proxy_added(GDBusProxy *proxy, void *user_data)
 		admon_manager_added(proxy);
 	} else if (!strcmp(interface, "org.bluez.DeviceSet1")) {
 		set_added(proxy);
+	} else if (!strcmp(interface, "org.bluez.Bearer.BREDR1")) {
+		bearer_added(proxy);
+	} else if (!strcmp(interface, "org.bluez.Bearer.LE1")) {
+		bearer_added(proxy);
 	}
 }
 
@@ -540,6 +575,7 @@ static void adapter_removed(GDBusProxy *proxy)
 			ctrl_list = g_list_remove_link(ctrl_list, ll);
 			g_list_free(adapter->devices);
 			g_list_free(adapter->sets);
+			g_list_free(adapter->bearers);
 			g_free(adapter);
 			g_list_free(ll);
 			return;
@@ -560,6 +596,19 @@ static void set_removed(GDBusProxy *proxy)
 	bt_shell_set_env(g_dbus_proxy_get_path(proxy), NULL);
 }
 
+static void bearer_removed(GDBusProxy *proxy)
+{
+	struct adapter *adapter = find_parent(proxy);
+
+	if (!adapter)
+		return;
+
+	adapter->bearers = g_list_remove(adapter->bearers, proxy);
+
+	print_set(proxy, COLORED_DEL);
+	bt_shell_set_env(g_dbus_proxy_get_path(proxy), NULL);
+}
+
 static void proxy_removed(GDBusProxy *proxy, void *user_data)
 {
 	const char *interface;
@@ -602,6 +651,10 @@ static void proxy_removed(GDBusProxy *proxy, void *user_data)
 		adv_monitor_remove_manager(dbus_conn);
 	} else if (!strcmp(interface, "org.bluez.DeviceSet1")) {
 		set_removed(proxy);
+	} else if (!strcmp(interface, "org.bluez.Bearer.BREDR1")) {
+		bearer_removed(proxy);
+	} else if (!strcmp(interface, "org.bluez.Bearer.LE1")) {
+		bearer_removed(proxy);
 	}
 }
 
@@ -619,6 +672,20 @@ static struct adapter *find_ctrl(GList *source, const char *path)
 	return NULL;
 }
 
+static GDBusProxy *find_proxies_by_path(GList *source, const char *path)
+{
+	GList *list;
+
+	for (list = g_list_first(source); list; list = g_list_next(list)) {
+		GDBusProxy *proxy = list->data;
+
+		if (strcmp(g_dbus_proxy_get_path(proxy), path) == 0)
+			return proxy;
+	}
+
+	return NULL;
+}
+
 static void property_changed(GDBusProxy *proxy, const char *name,
 					DBusMessageIter *iter, void *user_data)
 {
@@ -703,6 +770,36 @@ static void property_changed(GDBusProxy *proxy, const char *name,
 
 		print_iter(str, name, iter);
 		g_free(str);
+	} else if (!strcmp(interface, "org.bluez.Bearer.BREDR1") ||
+			!strcmp(interface, "org.bluez.Bearer.LE1")) {
+		if (default_ctrl &&
+				proxy_is_child(proxy, default_ctrl->proxy)) {
+			DBusMessageIter addr_iter;
+			GDBusProxy *dev;
+			char *str;
+			bool le = !strcmp(interface, "org.bluez.Bearer.LE1");
+
+			dev = find_proxies_by_path(default_ctrl->devices,
+						g_dbus_proxy_get_path(proxy));
+			if (!dev)
+				return;
+
+			if (g_dbus_proxy_get_property(dev, "Address",
+							&addr_iter)) {
+				const char *address;
+
+				dbus_message_iter_get_basic(&addr_iter,
+								&address);
+				str = g_strdup_printf("[" COLORED_CHG
+							"] %s %s ",
+							le ? "LE" : "BREDR",
+							address);
+			} else
+				str = g_strdup("");
+
+			print_iter(str, name, iter);
+			g_free(str);
+		}
 	}
 }
 
@@ -753,14 +850,17 @@ static struct adapter *find_ctrl_by_address(GList *source, const char *address)
 	return NULL;
 }
 
-static GDBusProxy *find_proxies_by_path(GList *source, const char *path)
+static GDBusProxy *find_proxies_by_iface(GList *source, const char *path,
+							const char *iface)
 {
 	GList *list;
 
 	for (list = g_list_first(source); list; list = g_list_next(list)) {
 		GDBusProxy *proxy = list->data;
 
-		if (strcmp(g_dbus_proxy_get_path(proxy), path) == 0)
+		if (!strcmp(g_dbus_proxy_get_path(proxy), path) &&
+				!strcmp(g_dbus_proxy_get_interface(proxy),
+					iface))
 			return proxy;
 	}
 
@@ -1728,6 +1828,7 @@ static void cmd_info(int argc, char *argv[])
 {
 	GDBusProxy *proxy;
 	GDBusProxy *battery_proxy;
+	GDBusProxy *bearer;
 	DBusMessageIter iter;
 	const char *address;
 
@@ -1779,6 +1880,25 @@ static void cmd_info(int argc, char *argv[])
 	print_property_with_label(battery_proxy, "Percentage",
 					"Battery Percentage");
 
+	bearer = find_proxies_by_iface(default_ctrl->bearers,
+				      g_dbus_proxy_get_path(proxy),
+				      "org.bluez.Bearer.BREDR1");
+	if (bearer) {
+		print_property_with_label(proxy, "Paired", "BREDR.Paired");
+		print_property_with_label(proxy, "Bonded", "BREDR.Bonded");
+		print_property_with_label(proxy, "Connected",
+							"BREDR.Connected");
+	}
+
+	bearer = find_proxies_by_iface(default_ctrl->bearers,
+				      g_dbus_proxy_get_path(proxy),
+				      "org.bluez.Bearer.LE1");
+	if (bearer) {
+		print_property_with_label(proxy, "Paired", "LE.Paired");
+		print_property_with_label(proxy, "Bonded", "LE.Bonded");
+		print_property_with_label(proxy, "Connected", "LE.Connected");
+	}
+
 	return bt_shell_noninteractive_quit(EXIT_SUCCESS);
 }
 
-- 
2.50.0





[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