diff options
author | Luiz Augusto von Dentz <luiz.von.dentz@intel.com> | 2014-10-07 13:56:33 +0300 |
---|---|---|
committer | Luiz Augusto von Dentz <luiz.von.dentz@intel.com> | 2014-10-10 17:00:41 +0300 |
commit | ac0a57dde84cfbd4e95d37ef1f43a29057e31088 (patch) | |
tree | c0f4f93a1b08edbc62819dc28cfd941dc5a64bb4 /android/avrcp-lib.c | |
parent | 29e7e9ee95028f2fa170d5f03eac3a3874c68ffd (diff) | |
download | bluez-ac0a57dde84cfbd4e95d37ef1f43a29057e31088.tar.gz |
android/avrcp-lib: Add support for SetBrowsedPlayer PDU
Diffstat (limited to 'android/avrcp-lib.c')
-rw-r--r-- | android/avrcp-lib.c | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/android/avrcp-lib.c b/android/avrcp-lib.c index 9a074ae4c..835049701 100644 --- a/android/avrcp-lib.c +++ b/android/avrcp-lib.c @@ -1243,6 +1243,30 @@ static void avrcp_set_control_handlers(struct avrcp *session, session->control_data = user_data; } +static ssize_t set_browsed(struct avrcp *session, uint8_t transaction, + uint16_t params_len, uint8_t *params, + void *user_data) +{ + struct avrcp_player *player = user_data; + struct set_browsed_req *req; + uint16_t id; + + DBG(""); + + if (!player->ind || !player->ind->set_browsed) + return -ENOSYS; + + if (!params || params_len != sizeof(*req)) + return -EINVAL; + + req = (void *) params; + + id = get_be16(&req->id); + + return player->ind->set_browsed(session, transaction, id, + player->user_data); +} + static ssize_t get_folder_items(struct avrcp *session, uint8_t transaction, uint16_t params_len, uint8_t *params, void *user_data) @@ -1449,6 +1473,7 @@ static ssize_t add_to_now_playing(struct avrcp *session, uint8_t transaction, } static const struct avrcp_browsing_handler browsing_handlers[] = { + { AVRCP_SET_BROWSED_PLAYER, set_browsed }, { AVRCP_GET_FOLDER_ITEMS, get_folder_items }, { AVRCP_CHANGE_PATH, change_path }, { AVRCP_GET_ITEM_ATTRIBUTES, get_item_attributes }, @@ -3295,6 +3320,58 @@ int avrcp_set_addressed_player_rsp(struct avrcp *session, uint8_t transaction, &iov, 1); } +int avrcp_set_browsed_player_rsp(struct avrcp *session, uint8_t transaction, + uint8_t status, uint16_t counter, + uint32_t items, uint8_t depth, + const char **folders) +{ + struct iovec iov[UINT8_MAX * 2 + 1]; + struct set_browsed_rsp rsp; + uint16_t len[UINT8_MAX]; + int i; + + if (status != AVRCP_STATUS_SUCCESS) { + iov[0].iov_base = &status; + iov[0].iov_len = sizeof(status); + return avrcp_send_browsing(session, transaction, + AVRCP_SET_BROWSED_PLAYER, + iov, 1); + } + + rsp.status = status; + put_be16(counter, &rsp.counter); + put_be32(items, &rsp.items); + put_be16(AVRCP_CHARSET_UTF8, &rsp.charset); + rsp.depth = depth; + + iov[0].iov_base = &rsp; + iov[0].iov_len = sizeof(rsp); + + if (!depth) + return avrcp_send_browsing(session, transaction, + AVRCP_SET_BROWSED_PLAYER, + iov, 1); + + for (i = 0; i < depth; i++) { + if (!folders[i]) + return -EINVAL; + + len[i] = strlen(folders[i]); + + iov[i * 2 + 2].iov_base = (void *) folders[i]; + iov[i * 2 + 2].iov_len = len[i]; + + put_be16(len[i], &len[i]); + + iov[i * 2 + 1].iov_base = &len[i]; + iov[i * 2 + 1].iov_len = sizeof(len[i]); + } + + return avrcp_send_browsing(session, transaction, + AVRCP_SET_BROWSED_PLAYER, iov, + depth * 2 + 1); +} + int avrcp_get_folder_items_rsp(struct avrcp *session, uint8_t transaction, uint16_t counter, uint8_t number, uint8_t *type, uint16_t *len, |