Diff between 024b631ad0b8b48e558d969510da0d0b0cfe88d7 and 9350da3d4ddbe4e924b4e0226f7052955c60520c

Changed Files

File Additions Deletions Status
android/avrcp-lib.c +12 -4 modified
android/avrcp-lib.h +2 -2 modified
unit/test-avrcp.c +21 -20 modified

Full Patch

diff --git a/android/avrcp-lib.c b/android/avrcp-lib.c
index 30d5380..c6f94ca 100644
--- a/android/avrcp-lib.c
+++ b/android/avrcp-lib.c
@@ -170,14 +170,22 @@ static ssize_t handle_vendordep_pdu(struct avctp *conn, uint8_t transaction,
 		goto reject;
 	}
 
-	ret = handler->func(session, transaction, code, params_len,
-					pdu->params, session->control_data);
+	ret = handler->func(session, transaction, params_len, pdu->params,
+							session->control_data);
 	if (ret < 0) {
-		if (ret == -EAGAIN)
+		switch (ret) {
+		case -EAGAIN:
 			return ret;
-		goto reject;
+		case -EINVAL:
+			pdu->params[0] = AVRCP_STATUS_INVALID_PARAM;
+			goto reject;
+		default:
+			pdu->params[0] = AVRCP_STATUS_INTERNAL_ERROR;
+			goto reject;
+		}
 	}
 
+	*code = handler->rsp;
 	pdu->params_len = htons(ret);
 
 	return AVRCP_HEADER_LENGTH + ret;
diff --git a/android/avrcp-lib.h b/android/avrcp-lib.h
index d7a805b..df9f1c6 100644
--- a/android/avrcp-lib.h
+++ b/android/avrcp-lib.h
@@ -79,9 +79,9 @@ struct avrcp;
 struct avrcp_control_handler {
 	uint8_t id;
 	uint8_t code;
+	uint8_t rsp;
 	ssize_t (*func) (struct avrcp *session, uint8_t transaction,
-			uint8_t *code, uint16_t params_len, uint8_t *params,
-			void *user_data);
+			uint16_t params_len, uint8_t *params, void *user_data);
 };
 
 struct avrcp_passthrough_handler {
diff --git a/unit/test-avrcp.c b/unit/test-avrcp.c
index 2d5711b..d8484cd 100644
--- a/unit/test-avrcp.c
+++ b/unit/test-avrcp.c
@@ -31,6 +31,7 @@
 #include <inttypes.h>
 #include <string.h>
 #include <fcntl.h>
+#include <errno.h>
 #include <sys/socket.h>
 
 #include <glib.h>
@@ -293,61 +294,61 @@ static const struct avrcp_passthrough_handler passthrough_handlers[] = {
 };
 
 static ssize_t avrcp_handle_get_capabilities(struct avrcp *session,
-					uint8_t transaction, uint8_t *code,
-					uint16_t params_len, uint8_t *params,
-					void *user_data)
+						uint8_t transaction,
+						uint16_t params_len,
+						uint8_t *params,
+						void *user_data)
 {
 	uint32_t id = 0x001958;
 
 	if (params_len != 1)
-		goto fail;
+		return -EINVAL;
 
 	switch (params[0]) {
 	case CAP_COMPANY_ID:
 		params[1] = 1;
 		hton24(&params[2], id);
-		*code = AVC_CTYPE_STABLE;
 		return 5;
 	}
 
-fail:
-	params[0] = AVRCP_STATUS_INVALID_PARAM;
-	*code = AVC_CTYPE_REJECTED;
-	return 1;
+	return -EINVAL;
 }
 
 static ssize_t avrcp_handle_list_attributes(struct avrcp *session,
-					uint8_t transaction, uint8_t *code,
-					uint16_t params_len, uint8_t *params,
-					void *user_data)
+						uint8_t transaction,
+						uint16_t params_len,
+						uint8_t *params,
+						void *user_data)
 {
 	DBG("");
 
 	params[0] = 0;
-	*code = AVC_CTYPE_STABLE;
 
 	return 1;
 }
 
 static ssize_t avrcp_handle_get_player_attr_text(struct avrcp *session,
-					uint8_t transaction, uint8_t *code,
-					uint16_t params_len, uint8_t *params,
-					void *user_data)
+						uint8_t transaction,
+						uint16_t params_len,
+						uint8_t *params,
+						void *user_data)
 {
 	DBG("");
 
 	params[0] = 0;
-	*code = AVC_CTYPE_STABLE;
 
 	return 1;
 }
 
 static const struct avrcp_control_handler control_handlers[] = {
-		{ AVRCP_GET_CAPABILITIES, AVC_CTYPE_STATUS,
+		{ AVRCP_GET_CAPABILITIES,
+					AVC_CTYPE_STATUS, AVC_CTYPE_STABLE,
 					avrcp_handle_get_capabilities },
-		{ AVRCP_LIST_PLAYER_ATTRIBUTES, AVC_CTYPE_STATUS,
+		{ AVRCP_LIST_PLAYER_ATTRIBUTES,
+					AVC_CTYPE_STATUS, AVC_CTYPE_STABLE,
 					avrcp_handle_list_attributes },
-		{ AVRCP_GET_PLAYER_ATTRIBUTE_TEXT, AVC_CTYPE_STATUS,
+		{ AVRCP_GET_PLAYER_ATTRIBUTE_TEXT,
+					AVC_CTYPE_STATUS, AVC_CTYPE_STABLE,
 					avrcp_handle_get_player_attr_text },
 		{ },
 };