[PATCH BlueZ 06/19] android/avrcp-lib: Add GetPlayerAttributeText structs

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

 



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

---
 android/avrcp-lib.c | 68 ++++++++++++++++++++++++++++++++++++-----------------
 1 file changed, 46 insertions(+), 22 deletions(-)

diff --git a/android/avrcp-lib.c b/android/avrcp-lib.c
index 2b22c44..f2cd137 100644
--- a/android/avrcp-lib.c
+++ b/android/avrcp-lib.c
@@ -127,6 +127,23 @@ struct set_value_req {
 	struct attr_value values[0];
 } __attribute__ ((packed));
 
+struct get_attribute_text_req {
+	uint8_t number;
+	uint8_t attrs[0];
+} __attribute__ ((packed));
+
+struct text_value {
+	uint8_t attr;
+	uint16_t charset;
+	uint8_t len;
+	char data[0];
+} __attribute__ ((packed));
+
+struct get_attribute_text_rsp {
+	uint8_t number;
+	struct text_value values[0];
+} __attribute__ ((packed));
+
 struct avrcp_control_handler {
 	uint8_t id;
 	uint8_t code;
@@ -568,20 +585,26 @@ static ssize_t get_attribute_text(struct avrcp *session, uint8_t transaction,
 					void *user_data)
 {
 	struct avrcp_player *player = user_data;
+	struct get_attribute_text_req *req;
 
 	DBG("");
 
-	if (!params || params_len != 1 + params[0])
+	if (!player->ind || !player->ind->get_attribute_text)
+		return -ENOSYS;
+
+	if (!params || params_len < sizeof(*req))
 		return -EINVAL;
 
-	if (!check_attributes(params[0], &params[1]))
+	req = (void *) params;
+	if (params_len != sizeof(*req) + req->number)
 		return -EINVAL;
 
-	if (!player->ind || !player->ind->get_attribute_text)
-		return -ENOSYS;
+	if (!check_attributes(req->number, req->attrs))
+		return -EINVAL;
 
-	return player->ind->get_attribute_text(session, transaction, params[0],
-						&params[1], player->user_data);
+	return player->ind->get_attribute_text(session, transaction,
+						req->number, req->attrs,
+						player->user_data);
 }
 
 static ssize_t list_values(struct avrcp *session, uint8_t transaction,
@@ -1680,24 +1703,25 @@ static int parse_text_rsp(struct avrcp_header *pdu, uint8_t *number,
 
 	params_len = pdu->params_len - 1;
 	for (i = 0, ptr = &pdu->params[1]; i < *number && params_len > 0; i++) {
-		uint8_t len;
+		struct text_value *val;
 
-		if (params_len < 4)
+		if (params_len < sizeof(*val))
 			goto fail;
 
-		attrs[i] = ptr[0];
-		len = ptr[3];
+		val = (void *) ptr;
 
-		params_len -= 4;
-		ptr += 4;
+		attrs[i] = val->attr;
 
-		if (len > params_len)
+		params_len -= sizeof(*val);
+		ptr += sizeof(*val);
+
+		if (val->len > params_len)
 			goto fail;
 
-		if (len > 0) {
-			text[i] = g_strndup((const char *) &ptr[4], len);
-			params_len -= len;
-			ptr += len;
+		if (val->len > 0) {
+			text[i] = g_strndup(val->data, val->len);
+			params_len -= val->len;
+			ptr += val->len;
 		}
 	}
 
@@ -2819,7 +2843,7 @@ int avrcp_get_player_attribute_text_rsp(struct avrcp *session,
 					uint8_t *attrs, const char **text)
 {
 	struct iovec iov[1 + AVRCP_ATTRIBUTE_LAST * 2];
-	uint8_t val[AVRCP_ATTRIBUTE_LAST][4];
+	struct text_value val[AVRCP_ATTRIBUTE_LAST];
 	int i;
 
 	if (number > AVRCP_ATTRIBUTE_LAST)
@@ -2838,11 +2862,11 @@ int avrcp_get_player_attribute_text_rsp(struct avrcp *session,
 		if (text[i])
 			len = strlen(text[i]);
 
-		val[i][0] = attrs[i];
-		put_be16(AVRCP_CHARSET_UTF8, &val[i][1]);
-		val[i][3] = len;
+		val[i].attr = attrs[i];
+		put_be16(AVRCP_CHARSET_UTF8, &val[i].charset);
+		val[i].len = len;
 
-		iov[i + 1].iov_base = val[i];
+		iov[i + 1].iov_base = &val[i];
 		iov[i + 1].iov_len = sizeof(val[i]);
 
 		iov[i + 2].iov_base = (void *) text[i];
-- 
1.9.3

--
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