1/* 2 * Copyright 2018 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17#pragma once 18 19#include "avrcp_browse_packet.h" 20 21namespace bluetooth { 22namespace avrcp { 23 24class GetFolderItemsResponseBuilder : public BrowsePacketBuilder { 25 public: 26 virtual ~GetFolderItemsResponseBuilder() = default; 27 static std::unique_ptr<GetFolderItemsResponseBuilder> MakePlayerListBuilder( 28 Status status, uint16_t uid_counter, size_t mtu); 29 static std::unique_ptr<GetFolderItemsResponseBuilder> MakeVFSBuilder( 30 Status status, uint16_t uid_counter, size_t mtu); 31 static std::unique_ptr<GetFolderItemsResponseBuilder> MakeNowPlayingBuilder( 32 Status status, uint16_t uid_counter, size_t mtu); 33 34 virtual size_t size() const override; 35 virtual bool Serialize( 36 const std::shared_ptr<::bluetooth::Packet>& pkt) override; 37 38 // Returns false if adding an item would exceed the MTU 39 bool AddMediaPlayer(MediaPlayerItem item); 40 bool AddSong(MediaElementItem item); 41 bool AddFolder(FolderItem item); 42 43 protected: 44 Scope scope_; 45 std::vector<MediaListItem> items_; 46 Status status_; 47 uint16_t uid_counter_; 48 size_t mtu_; 49 50 GetFolderItemsResponseBuilder(Scope scope, Status status, 51 uint16_t uid_counter, size_t mtu) 52 : BrowsePacketBuilder(BrowsePdu::GET_FOLDER_ITEMS), 53 scope_(scope), 54 status_(status), 55 uid_counter_(uid_counter), 56 mtu_(mtu){}; 57 58 private: 59 void PushMediaListItem(const std::shared_ptr<::bluetooth::Packet>& pkt, 60 const MediaListItem& item); 61 void PushMediaPlayerItem(const std::shared_ptr<::bluetooth::Packet>& pkt, 62 const MediaPlayerItem& item); 63 void PushMediaElementItem(const std::shared_ptr<::bluetooth::Packet>& pkt, 64 const MediaElementItem& item); 65 void PushFolderItem(const std::shared_ptr<::bluetooth::Packet>& pkt, 66 const FolderItem& item); 67}; 68 69class GetFolderItemsRequest : public BrowsePacket { 70 public: 71 virtual ~GetFolderItemsRequest() = default; 72 73 /** 74 * Avrcp Change Path Packet Layout 75 * BrowsePacket: 76 * uint8_t pdu_; 77 * uint16_t length_; 78 * GetFolderItemsRequest: 79 * uint8_t scope_; 80 * uint32_t start_item_; 81 * uint32_t end_item_; 82 * uint8_t attr_count_; 83 * uint32_t[] attr_requested_; 84 */ 85 static constexpr size_t kMinSize() { return BrowsePacket::kMinSize() + 10; } 86 87 Scope GetScope() const; 88 uint32_t GetStartItem() const; 89 uint32_t GetEndItem() const; 90 uint8_t GetNumAttributes() const; 91 std::vector<Attribute> GetAttributesRequested() const; 92 93 virtual bool IsValid() const override; 94 virtual std::string ToString() const override; 95 96 protected: 97 using BrowsePacket::BrowsePacket; 98}; 99 100class GetFolderItemsRequestBuilder : public BrowsePacketBuilder { 101 public: 102 virtual ~GetFolderItemsRequestBuilder() = default; 103 104 static std::unique_ptr<GetFolderItemsRequestBuilder> MakeBuilder( 105 Scope scope, uint32_t start_item, uint32_t end_item, 106 const std::set<Attribute>& requested_attrs); 107 108 virtual size_t size() const override; 109 virtual bool Serialize( 110 const std::shared_ptr<::bluetooth::Packet>& pkt) override; 111 112 protected: 113 GetFolderItemsRequestBuilder(Scope scope, uint32_t start_item, 114 uint32_t end_item, 115 const std::set<Attribute>& requested_attrs) 116 : BrowsePacketBuilder(BrowsePdu::GET_FOLDER_ITEMS), 117 scope_(scope), 118 start_item_(start_item), 119 end_item_(end_item), 120 requested_attrs_(requested_attrs){}; 121 122 Scope scope_; 123 uint32_t start_item_; 124 uint32_t end_item_; 125 std::set<Attribute> requested_attrs_; 126}; 127 128} // namespace avrcp 129} // namespace bluetooth