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 
21 namespace bluetooth {
22 namespace avrcp {
23 
24 class GetFolderItemsResponseBuilder : public BrowsePacketBuilder {
25 public:
26   virtual ~GetFolderItemsResponseBuilder() = default;
27   static std::unique_ptr<GetFolderItemsResponseBuilder> MakePlayerListBuilder(Status status,
28                                                                               uint16_t uid_counter,
29                                                                               size_t mtu);
30   static std::unique_ptr<GetFolderItemsResponseBuilder> MakeVFSBuilder(Status status,
31                                                                        uint16_t uid_counter,
32                                                                        size_t mtu);
33   static std::unique_ptr<GetFolderItemsResponseBuilder> MakeNowPlayingBuilder(Status status,
34                                                                               uint16_t uid_counter,
35                                                                               size_t mtu);
36 
37   virtual size_t size() const override;
38   virtual bool Serialize(const std::shared_ptr<::bluetooth::Packet>& pkt) override;
39 
40   // Returns false if adding an item would exceed the MTU
41   bool AddMediaPlayer(MediaPlayerItem item);
42   bool AddSong(MediaElementItem item);
43   bool AddFolder(FolderItem item);
44 
45 protected:
46   Scope scope_;
47   std::vector<MediaListItem> items_;
48   Status status_;
49   uint16_t uid_counter_;
50   size_t mtu_;
51 
GetFolderItemsResponseBuilder(Scope scope,Status status,uint16_t uid_counter,size_t mtu)52   GetFolderItemsResponseBuilder(Scope scope, Status status, uint16_t uid_counter, size_t mtu)
53       : BrowsePacketBuilder(BrowsePdu::GET_FOLDER_ITEMS),
54         scope_(scope),
55         status_(status),
56         uid_counter_(uid_counter),
57         mtu_(mtu) {}
58 
59 private:
60   void PushMediaListItem(const std::shared_ptr<::bluetooth::Packet>& pkt,
61                          const MediaListItem& item);
62   void PushMediaPlayerItem(const std::shared_ptr<::bluetooth::Packet>& pkt,
63                            const MediaPlayerItem& item);
64   void PushMediaElementItem(const std::shared_ptr<::bluetooth::Packet>& pkt,
65                             const MediaElementItem& item);
66   void PushFolderItem(const std::shared_ptr<::bluetooth::Packet>& pkt, const FolderItem& item);
67 };
68 
69 class 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    */
kMinSize()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 
100 class 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(const std::shared_ptr<::bluetooth::Packet>& pkt) override;
110 
111 protected:
GetFolderItemsRequestBuilder(Scope scope,uint32_t start_item,uint32_t end_item,const std::set<Attribute> & requested_attrs)112   GetFolderItemsRequestBuilder(Scope scope, uint32_t start_item, uint32_t end_item,
113                                const std::set<Attribute>& requested_attrs)
114       : BrowsePacketBuilder(BrowsePdu::GET_FOLDER_ITEMS),
115         scope_(scope),
116         start_item_(start_item),
117         end_item_(end_item),
118         requested_attrs_(requested_attrs) {}
119 
120   Scope scope_;
121   uint32_t start_item_;
122   uint32_t end_item_;
123   std::set<Attribute> requested_attrs_;
124 };
125 
126 }  // namespace avrcp
127 }  // namespace bluetooth
128