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
198f7377353db29efe0a506123deec03d70935957aAjay Panicker#include "avrcp_browse_packet.h"
208f7377353db29efe0a506123deec03d70935957aAjay Panicker
218f7377353db29efe0a506123deec03d70935957aAjay Panickernamespace bluetooth {
228f7377353db29efe0a506123deec03d70935957aAjay Panickernamespace avrcp {
238f7377353db29efe0a506123deec03d70935957aAjay Panicker
248f7377353db29efe0a506123deec03d70935957aAjay Panickerclass GetFolderItemsResponseBuilder : public BrowsePacketBuilder {
258f7377353db29efe0a506123deec03d70935957aAjay Panicker public:
268f7377353db29efe0a506123deec03d70935957aAjay Panicker  virtual ~GetFolderItemsResponseBuilder() = default;
278f7377353db29efe0a506123deec03d70935957aAjay Panicker  static std::unique_ptr<GetFolderItemsResponseBuilder> MakePlayerListBuilder(
287bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker      Status status, uint16_t uid_counter, size_t mtu);
298f7377353db29efe0a506123deec03d70935957aAjay Panicker  static std::unique_ptr<GetFolderItemsResponseBuilder> MakeVFSBuilder(
307bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker      Status status, uint16_t uid_counter, size_t mtu);
318f7377353db29efe0a506123deec03d70935957aAjay Panicker  static std::unique_ptr<GetFolderItemsResponseBuilder> MakeNowPlayingBuilder(
327bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker      Status status, uint16_t uid_counter, size_t mtu);
338f7377353db29efe0a506123deec03d70935957aAjay Panicker
348f7377353db29efe0a506123deec03d70935957aAjay Panicker  virtual size_t size() const override;
358f7377353db29efe0a506123deec03d70935957aAjay Panicker  virtual bool Serialize(
368f7377353db29efe0a506123deec03d70935957aAjay Panicker      const std::shared_ptr<::bluetooth::Packet>& pkt) override;
378f7377353db29efe0a506123deec03d70935957aAjay Panicker
387bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker  // Returns false if adding an item would exceed the MTU
397bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker  bool AddMediaPlayer(MediaPlayerItem item);
407bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker  bool AddSong(MediaElementItem item);
417bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker  bool AddFolder(FolderItem item);
428f7377353db29efe0a506123deec03d70935957aAjay Panicker
438f7377353db29efe0a506123deec03d70935957aAjay Panicker protected:
448f7377353db29efe0a506123deec03d70935957aAjay Panicker  Scope scope_;
458f7377353db29efe0a506123deec03d70935957aAjay Panicker  std::vector<MediaListItem> items_;
468f7377353db29efe0a506123deec03d70935957aAjay Panicker  Status status_;
478f7377353db29efe0a506123deec03d70935957aAjay Panicker  uint16_t uid_counter_;
487bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker  size_t mtu_;
498f7377353db29efe0a506123deec03d70935957aAjay Panicker
508f7377353db29efe0a506123deec03d70935957aAjay Panicker  GetFolderItemsResponseBuilder(Scope scope, Status status,
517bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker                                uint16_t uid_counter, size_t mtu)
528f7377353db29efe0a506123deec03d70935957aAjay Panicker      : BrowsePacketBuilder(BrowsePdu::GET_FOLDER_ITEMS),
538f7377353db29efe0a506123deec03d70935957aAjay Panicker        scope_(scope),
548f7377353db29efe0a506123deec03d70935957aAjay Panicker        status_(status),
557bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker        uid_counter_(uid_counter),
567bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker        mtu_(mtu){};
578f7377353db29efe0a506123deec03d70935957aAjay Panicker
588f7377353db29efe0a506123deec03d70935957aAjay Panicker private:
598f7377353db29efe0a506123deec03d70935957aAjay Panicker  void PushMediaListItem(const std::shared_ptr<::bluetooth::Packet>& pkt,
608f7377353db29efe0a506123deec03d70935957aAjay Panicker                         const MediaListItem& item);
618f7377353db29efe0a506123deec03d70935957aAjay Panicker  void PushMediaPlayerItem(const std::shared_ptr<::bluetooth::Packet>& pkt,
628f7377353db29efe0a506123deec03d70935957aAjay Panicker                           const MediaPlayerItem& item);
638f7377353db29efe0a506123deec03d70935957aAjay Panicker  void PushMediaElementItem(const std::shared_ptr<::bluetooth::Packet>& pkt,
648f7377353db29efe0a506123deec03d70935957aAjay Panicker                            const MediaElementItem& item);
658f7377353db29efe0a506123deec03d70935957aAjay Panicker  void PushFolderItem(const std::shared_ptr<::bluetooth::Packet>& pkt,
668f7377353db29efe0a506123deec03d70935957aAjay Panicker                      const FolderItem& item);
678f7377353db29efe0a506123deec03d70935957aAjay Panicker};
688f7377353db29efe0a506123deec03d70935957aAjay Panicker
698f7377353db29efe0a506123deec03d70935957aAjay Panickerclass GetFolderItemsRequest : public BrowsePacket {
708f7377353db29efe0a506123deec03d70935957aAjay Panicker public:
718f7377353db29efe0a506123deec03d70935957aAjay Panicker  virtual ~GetFolderItemsRequest() = default;
728f7377353db29efe0a506123deec03d70935957aAjay Panicker
738f7377353db29efe0a506123deec03d70935957aAjay Panicker  /**
748f7377353db29efe0a506123deec03d70935957aAjay Panicker   * Avrcp Change Path Packet Layout
758f7377353db29efe0a506123deec03d70935957aAjay Panicker   *   BrowsePacket:
768f7377353db29efe0a506123deec03d70935957aAjay Panicker   *     uint8_t pdu_;
778f7377353db29efe0a506123deec03d70935957aAjay Panicker   *     uint16_t length_;
788f7377353db29efe0a506123deec03d70935957aAjay Panicker   *   GetFolderItemsRequest:
798f7377353db29efe0a506123deec03d70935957aAjay Panicker   *     uint8_t scope_;
808f7377353db29efe0a506123deec03d70935957aAjay Panicker   *     uint32_t start_item_;
818f7377353db29efe0a506123deec03d70935957aAjay Panicker   *     uint32_t end_item_;
828f7377353db29efe0a506123deec03d70935957aAjay Panicker   *     uint8_t attr_count_;
838f7377353db29efe0a506123deec03d70935957aAjay Panicker   *     uint32_t[] attr_requested_;
848f7377353db29efe0a506123deec03d70935957aAjay Panicker   */
858f7377353db29efe0a506123deec03d70935957aAjay Panicker  static constexpr size_t kMinSize() { return BrowsePacket::kMinSize() + 10; }
868f7377353db29efe0a506123deec03d70935957aAjay Panicker
878f7377353db29efe0a506123deec03d70935957aAjay Panicker  Scope GetScope() const;
888f7377353db29efe0a506123deec03d70935957aAjay Panicker  uint32_t GetStartItem() const;
898f7377353db29efe0a506123deec03d70935957aAjay Panicker  uint32_t GetEndItem() const;
908f7377353db29efe0a506123deec03d70935957aAjay Panicker  uint8_t GetNumAttributes() const;
918f7377353db29efe0a506123deec03d70935957aAjay Panicker  std::vector<Attribute> GetAttributesRequested() const;
928f7377353db29efe0a506123deec03d70935957aAjay Panicker
938f7377353db29efe0a506123deec03d70935957aAjay Panicker  virtual bool IsValid() const override;
948f7377353db29efe0a506123deec03d70935957aAjay Panicker  virtual std::string ToString() const override;
958f7377353db29efe0a506123deec03d70935957aAjay Panicker
968f7377353db29efe0a506123deec03d70935957aAjay Panicker protected:
978f7377353db29efe0a506123deec03d70935957aAjay Panicker  using BrowsePacket::BrowsePacket;
988f7377353db29efe0a506123deec03d70935957aAjay Panicker};
998f7377353db29efe0a506123deec03d70935957aAjay Panicker
1008b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panickerclass GetFolderItemsRequestBuilder : public BrowsePacketBuilder {
1018b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker public:
1028b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker  virtual ~GetFolderItemsRequestBuilder() = default;
1038b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker
1048b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker  static std::unique_ptr<GetFolderItemsRequestBuilder> MakeBuilder(
1058b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker      Scope scope, uint32_t start_item, uint32_t end_item,
1068b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker      const std::set<Attribute>& requested_attrs);
1078b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker
1088b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker  virtual size_t size() const override;
1098b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker  virtual bool Serialize(
1108b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker      const std::shared_ptr<::bluetooth::Packet>& pkt) override;
1118b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker
1128b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker protected:
1138b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker  GetFolderItemsRequestBuilder(Scope scope, uint32_t start_item,
1148b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker                               uint32_t end_item,
1158b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker                               const std::set<Attribute>& requested_attrs)
1168b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker      : BrowsePacketBuilder(BrowsePdu::GET_FOLDER_ITEMS),
1178b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker        scope_(scope),
1188b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker        start_item_(start_item),
1198b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker        end_item_(end_item),
1208b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker        requested_attrs_(requested_attrs){};
1218b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker
1228b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker  Scope scope_;
1238b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker  uint32_t start_item_;
1248b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker  uint32_t end_item_;
1258b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker  std::set<Attribute> requested_attrs_;
1268b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker};
1278b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker
1288f7377353db29efe0a506123deec03d70935957aAjay Panicker}  // namespace avrcp
1298f7377353db29efe0a506123deec03d70935957aAjay Panicker}  // namespace bluetooth