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(
56       const std::shared_ptr<::bluetooth::Packet>& pkt) override;
57 
58  private:
59   Status status_;
60   size_t mtu_;
61   std::set<AttributeEntry> entries_;
62   friend class AttributesResponseBuilderTestUser<
63       GetItemAttributesResponseBuilder>;
64 
GetItemAttributesResponseBuilder(Status status,size_t mtu)65   GetItemAttributesResponseBuilder(Status status, size_t mtu)
66       : BrowsePacketBuilder(BrowsePdu::GET_ITEM_ATTRIBUTES),
67         status_(status),
68         mtu_(mtu) {}
69 };
70 
71 class GetItemAttributesRequest : public BrowsePacket {
72  public:
73   virtual ~GetItemAttributesRequest() = default;
74 
75   /**
76    * Avrcp Change Path Packet Layout
77    *   BrowsePacket:
78    *     uint8_t pdu_;
79    *     uint16_t length_;
80    *   GetItemAttributesRequest:
81    *     uint8_t scope_;
82    *     uint64_t uid_;
83    *     uint16_t uid_counter_;
84    *     uint8_t attr_count_;
85    *     uint32_t[] attr_requested_;
86    */
kMinSize()87   static constexpr size_t kMinSize() { return BrowsePacket::kMinSize() + 12; }
88 
89   Scope GetScope() const;
90   uint64_t GetUid() const;
91   uint16_t GetUidCounter() const;
92   uint8_t GetNumAttributes()
93       const;  // If this value is zero, then all attributes are requested
94   std::vector<Attribute> GetAttributesRequested() const;
95 
96   virtual bool IsValid() const override;
97   virtual std::string ToString() const override;
98 
99  protected:
100   using BrowsePacket::BrowsePacket;
101 };
102 
103 }  // namespace avrcp
104 }  // namespace bluetooth
105