18f7377353db29efe0a506123deec03d70935957aAjay Panicker/* 28f7377353db29efe0a506123deec03d70935957aAjay Panicker * Copyright 2018 The Android Open Source Project 38f7377353db29efe0a506123deec03d70935957aAjay Panicker * 48f7377353db29efe0a506123deec03d70935957aAjay Panicker * Licensed under the Apache License, Version 2.0 (the "License"); 58f7377353db29efe0a506123deec03d70935957aAjay Panicker * you may not use this file except in compliance with the License. 68f7377353db29efe0a506123deec03d70935957aAjay Panicker * You may obtain a copy of the License at 78f7377353db29efe0a506123deec03d70935957aAjay Panicker * 88f7377353db29efe0a506123deec03d70935957aAjay Panicker * http://www.apache.org/licenses/LICENSE-2.0 98f7377353db29efe0a506123deec03d70935957aAjay Panicker * 108f7377353db29efe0a506123deec03d70935957aAjay Panicker * Unless required by applicable law or agreed to in writing, software 118f7377353db29efe0a506123deec03d70935957aAjay Panicker * distributed under the License is distributed on an "AS IS" BASIS, 128f7377353db29efe0a506123deec03d70935957aAjay Panicker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 138f7377353db29efe0a506123deec03d70935957aAjay Panicker * See the License for the specific language governing permissions and 148f7377353db29efe0a506123deec03d70935957aAjay Panicker * limitations under the License. 158f7377353db29efe0a506123deec03d70935957aAjay Panicker */ 168f7377353db29efe0a506123deec03d70935957aAjay Panicker 178f7377353db29efe0a506123deec03d70935957aAjay Panicker#pragma once 188f7377353db29efe0a506123deec03d70935957aAjay Panicker 198f7377353db29efe0a506123deec03d70935957aAjay Panicker#include "avrcp_browse_packet.h" 208f7377353db29efe0a506123deec03d70935957aAjay Panicker 218f7377353db29efe0a506123deec03d70935957aAjay Panickernamespace bluetooth { 228f7377353db29efe0a506123deec03d70935957aAjay Panickernamespace avrcp { 238f7377353db29efe0a506123deec03d70935957aAjay Panicker 248f7377353db29efe0a506123deec03d70935957aAjay Panickerclass GetFolderItemsResponseBuilder : public BrowsePacketBuilder { 258f7377353db29efe0a506123deec03d70935957aAjay Panicker public: 268f7377353db29efe0a506123deec03d70935957aAjay Panicker virtual ~GetFolderItemsResponseBuilder() = default; 278f7377353db29efe0a506123deec03d70935957aAjay Panicker static std::unique_ptr<GetFolderItemsResponseBuilder> MakePlayerListBuilder( 287bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker Status status, uint16_t uid_counter, size_t mtu); 298f7377353db29efe0a506123deec03d70935957aAjay Panicker static std::unique_ptr<GetFolderItemsResponseBuilder> MakeVFSBuilder( 307bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker Status status, uint16_t uid_counter, size_t mtu); 318f7377353db29efe0a506123deec03d70935957aAjay Panicker static std::unique_ptr<GetFolderItemsResponseBuilder> MakeNowPlayingBuilder( 327bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker Status status, uint16_t uid_counter, size_t mtu); 338f7377353db29efe0a506123deec03d70935957aAjay Panicker 348f7377353db29efe0a506123deec03d70935957aAjay Panicker virtual size_t size() const override; 358f7377353db29efe0a506123deec03d70935957aAjay Panicker virtual bool Serialize( 368f7377353db29efe0a506123deec03d70935957aAjay Panicker const std::shared_ptr<::bluetooth::Packet>& pkt) override; 378f7377353db29efe0a506123deec03d70935957aAjay Panicker 387bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker // Returns false if adding an item would exceed the MTU 397bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker bool AddMediaPlayer(MediaPlayerItem item); 407bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker bool AddSong(MediaElementItem item); 417bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker bool AddFolder(FolderItem item); 428f7377353db29efe0a506123deec03d70935957aAjay Panicker 438f7377353db29efe0a506123deec03d70935957aAjay Panicker protected: 448f7377353db29efe0a506123deec03d70935957aAjay Panicker Scope scope_; 458f7377353db29efe0a506123deec03d70935957aAjay Panicker std::vector<MediaListItem> items_; 468f7377353db29efe0a506123deec03d70935957aAjay Panicker Status status_; 478f7377353db29efe0a506123deec03d70935957aAjay Panicker uint16_t uid_counter_; 487bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker size_t mtu_; 498f7377353db29efe0a506123deec03d70935957aAjay Panicker 508f7377353db29efe0a506123deec03d70935957aAjay Panicker GetFolderItemsResponseBuilder(Scope scope, Status status, 517bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker uint16_t uid_counter, size_t mtu) 528f7377353db29efe0a506123deec03d70935957aAjay Panicker : BrowsePacketBuilder(BrowsePdu::GET_FOLDER_ITEMS), 538f7377353db29efe0a506123deec03d70935957aAjay Panicker scope_(scope), 548f7377353db29efe0a506123deec03d70935957aAjay Panicker status_(status), 557bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker uid_counter_(uid_counter), 567bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker mtu_(mtu){}; 578f7377353db29efe0a506123deec03d70935957aAjay Panicker 588f7377353db29efe0a506123deec03d70935957aAjay Panicker private: 598f7377353db29efe0a506123deec03d70935957aAjay Panicker void PushMediaListItem(const std::shared_ptr<::bluetooth::Packet>& pkt, 608f7377353db29efe0a506123deec03d70935957aAjay Panicker const MediaListItem& item); 618f7377353db29efe0a506123deec03d70935957aAjay Panicker void PushMediaPlayerItem(const std::shared_ptr<::bluetooth::Packet>& pkt, 628f7377353db29efe0a506123deec03d70935957aAjay Panicker const MediaPlayerItem& item); 638f7377353db29efe0a506123deec03d70935957aAjay Panicker void PushMediaElementItem(const std::shared_ptr<::bluetooth::Packet>& pkt, 648f7377353db29efe0a506123deec03d70935957aAjay Panicker const MediaElementItem& item); 658f7377353db29efe0a506123deec03d70935957aAjay Panicker void PushFolderItem(const std::shared_ptr<::bluetooth::Packet>& pkt, 668f7377353db29efe0a506123deec03d70935957aAjay Panicker const FolderItem& item); 678f7377353db29efe0a506123deec03d70935957aAjay Panicker}; 688f7377353db29efe0a506123deec03d70935957aAjay Panicker 698f7377353db29efe0a506123deec03d70935957aAjay Panickerclass GetFolderItemsRequest : public BrowsePacket { 708f7377353db29efe0a506123deec03d70935957aAjay Panicker public: 718f7377353db29efe0a506123deec03d70935957aAjay Panicker virtual ~GetFolderItemsRequest() = default; 728f7377353db29efe0a506123deec03d70935957aAjay Panicker 738f7377353db29efe0a506123deec03d70935957aAjay Panicker /** 748f7377353db29efe0a506123deec03d70935957aAjay Panicker * Avrcp Change Path Packet Layout 758f7377353db29efe0a506123deec03d70935957aAjay Panicker * BrowsePacket: 768f7377353db29efe0a506123deec03d70935957aAjay Panicker * uint8_t pdu_; 778f7377353db29efe0a506123deec03d70935957aAjay Panicker * uint16_t length_; 788f7377353db29efe0a506123deec03d70935957aAjay Panicker * GetFolderItemsRequest: 798f7377353db29efe0a506123deec03d70935957aAjay Panicker * uint8_t scope_; 808f7377353db29efe0a506123deec03d70935957aAjay Panicker * uint32_t start_item_; 818f7377353db29efe0a506123deec03d70935957aAjay Panicker * uint32_t end_item_; 828f7377353db29efe0a506123deec03d70935957aAjay Panicker * uint8_t attr_count_; 838f7377353db29efe0a506123deec03d70935957aAjay Panicker * uint32_t[] attr_requested_; 848f7377353db29efe0a506123deec03d70935957aAjay Panicker */ 858f7377353db29efe0a506123deec03d70935957aAjay Panicker static constexpr size_t kMinSize() { return BrowsePacket::kMinSize() + 10; } 868f7377353db29efe0a506123deec03d70935957aAjay Panicker 878f7377353db29efe0a506123deec03d70935957aAjay Panicker Scope GetScope() const; 888f7377353db29efe0a506123deec03d70935957aAjay Panicker uint32_t GetStartItem() const; 898f7377353db29efe0a506123deec03d70935957aAjay Panicker uint32_t GetEndItem() const; 908f7377353db29efe0a506123deec03d70935957aAjay Panicker uint8_t GetNumAttributes() const; 918f7377353db29efe0a506123deec03d70935957aAjay Panicker std::vector<Attribute> GetAttributesRequested() const; 928f7377353db29efe0a506123deec03d70935957aAjay Panicker 938f7377353db29efe0a506123deec03d70935957aAjay Panicker virtual bool IsValid() const override; 948f7377353db29efe0a506123deec03d70935957aAjay Panicker virtual std::string ToString() const override; 958f7377353db29efe0a506123deec03d70935957aAjay Panicker 968f7377353db29efe0a506123deec03d70935957aAjay Panicker protected: 978f7377353db29efe0a506123deec03d70935957aAjay Panicker using BrowsePacket::BrowsePacket; 988f7377353db29efe0a506123deec03d70935957aAjay Panicker}; 998f7377353db29efe0a506123deec03d70935957aAjay Panicker 1008b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panickerclass GetFolderItemsRequestBuilder : public BrowsePacketBuilder { 1018b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker public: 1028b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker virtual ~GetFolderItemsRequestBuilder() = default; 1038b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker 1048b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker static std::unique_ptr<GetFolderItemsRequestBuilder> MakeBuilder( 1058b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker Scope scope, uint32_t start_item, uint32_t end_item, 1068b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker const std::set<Attribute>& requested_attrs); 1078b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker 1088b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker virtual size_t size() const override; 1098b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker virtual bool Serialize( 1108b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker const std::shared_ptr<::bluetooth::Packet>& pkt) override; 1118b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker 1128b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker protected: 1138b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker GetFolderItemsRequestBuilder(Scope scope, uint32_t start_item, 1148b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker uint32_t end_item, 1158b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker const std::set<Attribute>& requested_attrs) 1168b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker : BrowsePacketBuilder(BrowsePdu::GET_FOLDER_ITEMS), 1178b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker scope_(scope), 1188b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker start_item_(start_item), 1198b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker end_item_(end_item), 1208b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker requested_attrs_(requested_attrs){}; 1218b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker 1228b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker Scope scope_; 1238b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker uint32_t start_item_; 1248b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker uint32_t end_item_; 1258b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker std::set<Attribute> requested_attrs_; 1268b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker}; 1278b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker 1288f7377353db29efe0a506123deec03d70935957aAjay Panicker} // namespace avrcp 1298f7377353db29efe0a506123deec03d70935957aAjay Panicker} // namespace bluetooth