diff options
author | Vikrampal Yadav <vikram.pal@samsung.com> | 2014-08-26 19:50:50 +0530 |
---|---|---|
committer | Luiz Augusto von Dentz <luiz.von.dentz@intel.com> | 2014-09-05 13:16:43 +0300 |
commit | 5a52a580b6eff3ad0cf46d9b733877f34e41106a (patch) | |
tree | 964889113f4afa741f038de30a428abb7b9b55fb /monitor/avctp.c | |
parent | 3e45317f7475d76372f3452ad1653c9a18c9a0f8 (diff) | |
download | bluez-5a52a580b6eff3ad0cf46d9b733877f34e41106a.tar.gz |
monitor: Add AVRCP GetPlayerApplicationSettingAttributeText support
Support for decoding AVRCP GetPlayerApplicationSettingAttributeText
added in Bluetooth monitor.
Diffstat (limited to 'monitor/avctp.c')
-rw-r--r-- | monitor/avctp.c | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/monitor/avctp.c b/monitor/avctp.c index 4876baeb7..6c695b4e1 100644 --- a/monitor/avctp.c +++ b/monitor/avctp.c @@ -29,6 +29,7 @@ #include <stdio.h> #include <stdlib.h> #include <string.h> +#include <ctype.h> #include <inttypes.h> #include <bluetooth/bluetooth.h> @@ -483,6 +484,39 @@ static const char *value2str(uint8_t attr, uint8_t value) } } +static const char *charset2str(uint16_t charset) +{ + switch (charset) { + case 1: + case 2: + return "Reserved"; + case 3: + return "ASCII"; + case 4: + return "ISO_8859-1"; + case 5: + return "ISO_8859-2"; + case 6: + return "ISO_8859-3"; + case 7: + return "ISO_8859-4"; + case 8: + return "ISO_8859-5"; + case 9: + return "ISO_8859-6"; + case 10: + return "ISO_8859-7"; + case 11: + return "ISO_8859-8"; + case 12: + return "ISO_8859-9"; + case 106: + return "UTF-8"; + default: + return "Unknown"; + } +} + static bool avrcp_passthrough_packet(struct l2cap_frame *frame) { packet_hexdump(frame->data, frame->size); @@ -689,6 +723,69 @@ static bool avrcp_set_player_value(struct l2cap_frame *frame, uint8_t ctype, return true; } +static bool avrcp_get_player_attribute_text(struct l2cap_frame *frame, + uint8_t ctype, uint8_t len, + uint8_t indent) +{ + uint8_t num; + + if (!l2cap_frame_get_u8(frame, &num)) + return false; + + print_field("%*cAttributeCount: 0x%02x", (indent - 8), ' ', num); + + if (ctype > AVC_CTYPE_GENERAL_INQUIRY) + goto response; + + for (; num > 0; num--) { + uint8_t attr; + + if (!l2cap_frame_get_u8(frame, &attr)) + return false; + + print_field("%*cAttributeID: 0x%02x (%s)", (indent - 8), + ' ', attr, attr2str(attr)); + } + + return true; + +response: + for (; num > 0; num--) { + uint8_t attr, len; + uint16_t charset; + + if (!l2cap_frame_get_u8(frame, &attr)) + return false; + + print_field("%*cAttributeID: 0x%02x (%s)", (indent - 8), + ' ', attr, attr2str(attr)); + + if (!l2cap_frame_get_be16(frame, &charset)) + return false; + + print_field("%*cCharsetID: 0x%04x (%s)", (indent - 8), + ' ', charset, charset2str(charset)); + + if (!l2cap_frame_get_u8(frame, &len)) + return false; + + print_field("%*cStringLength: 0x%02x", (indent - 8), ' ', len); + + printf("String: "); + for (; len > 0; len--) { + uint8_t c; + + if (!l2cap_frame_get_u8(frame, &c)) + return false; + + printf("%1c", isprint(c) ? c : '.'); + } + printf("\n"); + } + + return true; +} + struct avrcp_ctrl_pdu_data { uint8_t pduid; bool (*func) (struct l2cap_frame *frame, uint8_t ctype, uint8_t len, @@ -701,6 +798,7 @@ static const struct avrcp_ctrl_pdu_data avrcp_ctrl_pdu_table[] = { { 0x12, avrcp_list_player_values }, { 0x13, avrcp_get_current_player_value }, { 0x14, avrcp_set_player_value }, + { 0x15, avrcp_get_player_attribute_text }, { } }; |