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