diff mbox series

[BlueZ,5/5] media: Rework support of Vendor to use uint32_t as type

Message ID 20230123235649.3231488-5-luiz.dentz@gmail.com
State New
Headers show
Series [BlueZ,1/5] profiles: Add Support for Metadata, CID and VID | expand

Commit Message

Luiz Augusto von Dentz Jan. 23, 2023, 11:56 p.m. UTC
From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>

This reworks the handlings of Vendor property to use a single uint32_t.
---
 client/player.c        | 24 +++++++++++++++++-------
 profiles/audio/media.c | 37 +++++++++++++++++--------------------
 2 files changed, 34 insertions(+), 27 deletions(-)
diff mbox series

Patch

diff --git a/client/player.c b/client/player.c
index bab563eec592..65cac3b50376 100644
--- a/client/player.c
+++ b/client/player.c
@@ -1868,13 +1868,18 @@  static gboolean endpoint_get_capabilities(const GDBusPropertyTable *property,
 	return TRUE;
 }
 
+struct vendor {
+	uint16_t cid;
+	uint16_t vid;
+} __packed;
+
 static gboolean endpoint_get_vendor(const GDBusPropertyTable *property,
 					DBusMessageIter *iter, void *data)
 {
 	struct endpoint *ep = data;
+	struct vendor vendor = { ep->cid, ep->vid };
 
-	dbus_message_iter_append_basic(iter, DBUS_TYPE_UINT16, &ep->cid);
-	dbus_message_iter_append_basic(iter, DBUS_TYPE_UINT16, &ep->vid);
+	dbus_message_iter_append_basic(iter, DBUS_TYPE_UINT32, &vendor);
 
 	return TRUE;
 }
@@ -1891,7 +1896,7 @@  static const GDBusPropertyTable endpoint_properties[] = {
 	{ "UUID", "s", endpoint_get_uuid, NULL, NULL },
 	{ "Codec", "y", endpoint_get_codec, NULL, NULL },
 	{ "Capabilities", "ay", endpoint_get_capabilities, NULL, NULL },
-	{ "Vendor", "qq", endpoint_get_vendor, NULL, endpoint_vendor_exists },
+	{ "Vendor", "u", endpoint_get_vendor, NULL, endpoint_vendor_exists },
 	{ }
 };
 
@@ -1909,7 +1914,14 @@  static void register_endpoint_setup(DBusMessageIter *iter, void *user_data)
 
 	g_dbus_dict_append_entry(&dict, "Codec", DBUS_TYPE_BYTE, &ep->codec);
 
-	if (ep->caps->iov_len) {
+	if (ep->cid && ep->vid) {
+		struct vendor vendor = { ep->cid, ep->vid };
+
+		g_dbus_dict_append_entry(&dict, "Vendor", DBUS_TYPE_UINT32,
+						 &vendor);
+	}
+
+	if (ep->caps) {
 		g_dbus_dict_append_basic_array(&dict, DBUS_TYPE_STRING, &key,
 					DBUS_TYPE_BYTE, &ep->caps->iov_base,
 					ep->caps->iov_len);
@@ -2113,9 +2125,7 @@  static void cmd_register_endpoint(int argc, char *argv[])
 					g_list_length(local_endpoints));
 	local_endpoints = g_list_append(local_endpoints, ep);
 
-	if (g_strstr_len(argv[2], -1, ":")) {
-		bt_shell_printf("Found split\r\n");
-
+	if (strrchr(argv[2], ':')) {
 		list = g_strsplit(argv[2], ":", 2);
 
 		ep->codec = 0xff;
diff --git a/profiles/audio/media.c b/profiles/audio/media.c
index 76a378e69401..889cd59b00f9 100644
--- a/profiles/audio/media.c
+++ b/profiles/audio/media.c
@@ -1379,6 +1379,11 @@  media_endpoint_create(struct media_adapter *adapter,
 	return endpoint;
 }
 
+struct vendor {
+	uint16_t cid;
+	uint16_t vid;
+} __packed;
+
 static int parse_properties(DBusMessageIter *props, const char **uuid,
 				gboolean *delay_reporting, uint8_t *codec,
 				uint16_t *cid, uint16_t *vid,
@@ -1388,6 +1393,7 @@  static int parse_properties(DBusMessageIter *props, const char **uuid,
 {
 	gboolean has_uuid = FALSE;
 	gboolean has_codec = FALSE;
+	struct vendor vendor;
 
 	while (dbus_message_iter_get_arg_type(props) == DBUS_TYPE_DICT_ENTRY) {
 		const char *key;
@@ -1412,14 +1418,11 @@  static int parse_properties(DBusMessageIter *props, const char **uuid,
 			dbus_message_iter_get_basic(&value, codec);
 			has_codec = TRUE;
 		} else if (strcasecmp(key, "Vendor") == 0) {
-			if (var != DBUS_TYPE_UINT16)
+			if (var != DBUS_TYPE_UINT32)
 				return -EINVAL;
-			dbus_message_iter_get_basic(&value, cid);
-			dbus_message_iter_next(&value);
-			var = dbus_message_iter_get_arg_type(&value);
-			if (var != DBUS_TYPE_UINT16)
-				return -EINVAL;
-			dbus_message_iter_get_basic(&value, vid);
+			dbus_message_iter_get_basic(&value, &vendor);
+			*cid = vendor.cid;
+			*vid = vendor.vid;
 		} else if (strcasecmp(key, "DelayReporting") == 0) {
 			if (var != DBUS_TYPE_BOOLEAN)
 				return -EINVAL;
@@ -2543,8 +2546,7 @@  static void app_register_endpoint(void *data, void *user_data)
 	const char *uuid;
 	gboolean delay_reporting = FALSE;
 	uint8_t codec;
-	uint16_t cid = 0;
-	uint16_t vid = 0;
+	struct vendor vendor;
 	struct bt_bap_pac_qos qos;
 	uint8_t *capabilities = NULL;
 	int size = 0;
@@ -2577,16 +2579,10 @@  static void app_register_endpoint(void *data, void *user_data)
 	dbus_message_iter_get_basic(&iter, &codec);
 
 	if (g_dbus_proxy_get_property(proxy, "Vendor", &iter)) {
-		if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_UINT16)
+		if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_UINT32)
 			goto fail;
 
-		dbus_message_iter_get_basic(&iter, &cid);
-
-		dbus_message_iter_next(&iter);
-		if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_UINT16)
-			goto fail;
-
-		dbus_message_iter_get_basic(&iter, &vid);
+		dbus_message_iter_get_basic(&iter, &vendor);
 	}
 
 	/* DelayReporting and Capabilities are considered optional */
@@ -2666,9 +2662,10 @@  static void app_register_endpoint(void *data, void *user_data)
 	}
 
 	endpoint = media_endpoint_create(app->adapter, app->sender, path, uuid,
-						delay_reporting, codec, cid,
-						vid, &qos, capabilities,
-						size, metadata, metadata_size,
+						delay_reporting, codec,
+						vendor.cid, vendor.vid, &qos,
+						capabilities, size,
+						metadata, metadata_size,
 						&app->err);
 	if (!endpoint) {
 		error("Unable to register endpoint %s:%s: %s", app->sender,