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 <set>
20 #include <vector>
21 
22 #include "avrcp_browse_packet.h"
23 
24 namespace bluetooth {
25 namespace avrcp {
26 
27 template <class Builder>
28 class AttributesResponseBuilderTestUser;
29 
30 class GetItemAttributesResponseBuilder : public BrowsePacketBuilder {
31 public:
32   virtual ~GetItemAttributesResponseBuilder() = default;
33   using Builder = std::unique_ptr<GetItemAttributesResponseBuilder>;
34   static Builder MakeBuilder(Status status, size_t mtu);
35 
36   size_t AddAttributeEntry(AttributeEntry entry);
37   size_t AddAttributeEntry(Attribute, const std::string&);
38 
clear()39   virtual void clear() { entries_.clear(); }
40 
kHeaderSize()41   static constexpr size_t kHeaderSize() {
42     size_t len = BrowsePacket::kMinSize();
43     len += 1;  // Status
44     len += 1;  // Number of attributes
45     return len;
46   }
47 
kErrorHeaderSize()48   static constexpr size_t kErrorHeaderSize() {
49     size_t len = BrowsePacket::kMinSize();
50     len += 1;  // Status
51     return len;
52   }
53 
54   virtual size_t size() const override;
55   virtual bool Serialize(const std::shared_ptr<::bluetooth::Packet>& pkt) override;
56 
57 private:
58   Status status_;
59   size_t mtu_;
60   std::set<AttributeEntry> entries_;
61   friend class AttributesResponseBuilderTestUser<GetItemAttributesResponseBuilder>;
62 
GetItemAttributesResponseBuilder(Status status,size_t mtu)63   GetItemAttributesResponseBuilder(Status status, size_t mtu)
64       : BrowsePacketBuilder(BrowsePdu::GET_ITEM_ATTRIBUTES), status_(status), mtu_(mtu) {}
65 };
66 
67 class GetItemAttributesRequest : public BrowsePacket {
68 public:
69   virtual ~GetItemAttributesRequest() = default;
70 
71   /**
72    * Avrcp Change Path Packet Layout
73    *   BrowsePacket:
74    *     uint8_t pdu_;
75    *     uint16_t length_;
76    *   GetItemAttributesRequest:
77    *     uint8_t scope_;
78    *     uint64_t uid_;
79    *     uint16_t uid_counter_;
80    *     uint8_t attr_count_;
81    *     uint32_t[] attr_requested_;
82    */
kMinSize()83   static constexpr size_t kMinSize() { return BrowsePacket::kMinSize() + 12; }
84 
85   Scope GetScope() const;
86   uint64_t GetUid() const;
87   uint16_t GetUidCounter() const;
88   uint8_t GetNumAttributes() const;  // If this value is zero, then all attributes are requested
89   std::vector<Attribute> GetAttributesRequested() const;
90 
91   virtual bool IsValid() const override;
92   virtual std::string ToString() const override;
93 
94 protected:
95   using BrowsePacket::BrowsePacket;
96 };
97 
98 }  // namespace avrcp
99 }  // namespace bluetooth
100