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