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 197bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker#include <set> 208f7377353db29efe0a506123deec03d70935957aAjay Panicker 218f7377353db29efe0a506123deec03d70935957aAjay Panicker#include "avrcp_browse_packet.h" 228f7377353db29efe0a506123deec03d70935957aAjay Panicker 238f7377353db29efe0a506123deec03d70935957aAjay Panickernamespace bluetooth { 248f7377353db29efe0a506123deec03d70935957aAjay Panickernamespace avrcp { 258f7377353db29efe0a506123deec03d70935957aAjay Panicker 268f7377353db29efe0a506123deec03d70935957aAjay Panickerclass GetItemAttributesResponseBuilder : public BrowsePacketBuilder { 278f7377353db29efe0a506123deec03d70935957aAjay Panicker public: 288f7377353db29efe0a506123deec03d70935957aAjay Panicker virtual ~GetItemAttributesResponseBuilder() = default; 298f7377353db29efe0a506123deec03d70935957aAjay Panicker 308f7377353db29efe0a506123deec03d70935957aAjay Panicker static std::unique_ptr<GetItemAttributesResponseBuilder> MakeBuilder( 317bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker Status status, size_t mtu); 328f7377353db29efe0a506123deec03d70935957aAjay Panicker 337bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker bool AddAttributeEntry(AttributeEntry entry); 347bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker bool AddAttributeEntry(Attribute, std::string); 358f7377353db29efe0a506123deec03d70935957aAjay Panicker 368f7377353db29efe0a506123deec03d70935957aAjay Panicker virtual size_t size() const override; 378f7377353db29efe0a506123deec03d70935957aAjay Panicker virtual bool Serialize( 388f7377353db29efe0a506123deec03d70935957aAjay Panicker const std::shared_ptr<::bluetooth::Packet>& pkt) override; 398f7377353db29efe0a506123deec03d70935957aAjay Panicker 408f7377353db29efe0a506123deec03d70935957aAjay Panicker private: 418f7377353db29efe0a506123deec03d70935957aAjay Panicker Status status_; 427bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker size_t mtu_; 437bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker std::set<AttributeEntry> entries_; 448f7377353db29efe0a506123deec03d70935957aAjay Panicker 457bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker GetItemAttributesResponseBuilder(Status status, size_t mtu) 467bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker : BrowsePacketBuilder(BrowsePdu::GET_ITEM_ATTRIBUTES), 477bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker status_(status), 487bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker mtu_(mtu) {} 498f7377353db29efe0a506123deec03d70935957aAjay Panicker}; 508f7377353db29efe0a506123deec03d70935957aAjay Panicker 518f7377353db29efe0a506123deec03d70935957aAjay Panickerclass GetItemAttributesRequest : public BrowsePacket { 528f7377353db29efe0a506123deec03d70935957aAjay Panicker public: 538f7377353db29efe0a506123deec03d70935957aAjay Panicker virtual ~GetItemAttributesRequest() = default; 548f7377353db29efe0a506123deec03d70935957aAjay Panicker 558f7377353db29efe0a506123deec03d70935957aAjay Panicker /** 568f7377353db29efe0a506123deec03d70935957aAjay Panicker * Avrcp Change Path Packet Layout 578f7377353db29efe0a506123deec03d70935957aAjay Panicker * BrowsePacket: 588f7377353db29efe0a506123deec03d70935957aAjay Panicker * uint8_t pdu_; 598f7377353db29efe0a506123deec03d70935957aAjay Panicker * uint16_t length_; 608f7377353db29efe0a506123deec03d70935957aAjay Panicker * GetItemAttributesRequest: 618f7377353db29efe0a506123deec03d70935957aAjay Panicker * uint8_t scope_; 628f7377353db29efe0a506123deec03d70935957aAjay Panicker * uint64_t uid_; 638f7377353db29efe0a506123deec03d70935957aAjay Panicker * uint16_t uid_counter_; 648f7377353db29efe0a506123deec03d70935957aAjay Panicker * uint8_t attr_count_; 658f7377353db29efe0a506123deec03d70935957aAjay Panicker * uint32_t[] attr_requested_; 668f7377353db29efe0a506123deec03d70935957aAjay Panicker */ 678f7377353db29efe0a506123deec03d70935957aAjay Panicker static constexpr size_t kMinSize() { return BrowsePacket::kMinSize() + 12; } 688f7377353db29efe0a506123deec03d70935957aAjay Panicker 698f7377353db29efe0a506123deec03d70935957aAjay Panicker Scope GetScope() const; 708f7377353db29efe0a506123deec03d70935957aAjay Panicker uint64_t GetUid() const; 718f7377353db29efe0a506123deec03d70935957aAjay Panicker uint16_t GetUidCounter() const; 728f7377353db29efe0a506123deec03d70935957aAjay Panicker uint8_t GetNumAttributes() 738f7377353db29efe0a506123deec03d70935957aAjay Panicker const; // If this value is zero, then all attributes are requested 748f7377353db29efe0a506123deec03d70935957aAjay Panicker std::vector<Attribute> GetAttributesRequested() const; 758f7377353db29efe0a506123deec03d70935957aAjay Panicker 768f7377353db29efe0a506123deec03d70935957aAjay Panicker virtual bool IsValid() const override; 778f7377353db29efe0a506123deec03d70935957aAjay Panicker virtual std::string ToString() const override; 788f7377353db29efe0a506123deec03d70935957aAjay Panicker 798f7377353db29efe0a506123deec03d70935957aAjay Panicker protected: 808f7377353db29efe0a506123deec03d70935957aAjay Panicker using BrowsePacket::BrowsePacket; 818f7377353db29efe0a506123deec03d70935957aAjay Panicker}; 828f7377353db29efe0a506123deec03d70935957aAjay Panicker 838f7377353db29efe0a506123deec03d70935957aAjay Panicker} // namespace avrcp 848f7377353db29efe0a506123deec03d70935957aAjay Panicker} // namespace bluetooth