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 ChangePathResponseBuilder : public BrowsePacketBuilder {
258f7377353db29efe0a506123deec03d70935957aAjay Panicker public:
268f7377353db29efe0a506123deec03d70935957aAjay Panicker  virtual ~ChangePathResponseBuilder() = default;
278f7377353db29efe0a506123deec03d70935957aAjay Panicker
288f7377353db29efe0a506123deec03d70935957aAjay Panicker  static std::unique_ptr<ChangePathResponseBuilder> MakeBuilder(
298f7377353db29efe0a506123deec03d70935957aAjay Panicker      Status status, uint32_t num_items_in_folder);
308f7377353db29efe0a506123deec03d70935957aAjay Panicker
318f7377353db29efe0a506123deec03d70935957aAjay Panicker  virtual size_t size() const override;
328f7377353db29efe0a506123deec03d70935957aAjay Panicker  virtual bool Serialize(
338f7377353db29efe0a506123deec03d70935957aAjay Panicker      const std::shared_ptr<::bluetooth::Packet>& pkt) override;
348f7377353db29efe0a506123deec03d70935957aAjay Panicker
358f7377353db29efe0a506123deec03d70935957aAjay Panicker private:
368f7377353db29efe0a506123deec03d70935957aAjay Panicker  Status status_;
378f7377353db29efe0a506123deec03d70935957aAjay Panicker  uint32_t num_items_in_folder_;
388f7377353db29efe0a506123deec03d70935957aAjay Panicker
398f7377353db29efe0a506123deec03d70935957aAjay Panicker  ChangePathResponseBuilder(Status status, uint32_t num_items_in_folder)
408f7377353db29efe0a506123deec03d70935957aAjay Panicker      : BrowsePacketBuilder(BrowsePdu::CHANGE_PATH),
418f7377353db29efe0a506123deec03d70935957aAjay Panicker        status_(status),
428f7377353db29efe0a506123deec03d70935957aAjay Panicker        num_items_in_folder_(num_items_in_folder) {}
438f7377353db29efe0a506123deec03d70935957aAjay Panicker};
448f7377353db29efe0a506123deec03d70935957aAjay Panicker
458f7377353db29efe0a506123deec03d70935957aAjay Panickerclass ChangePathRequest : public BrowsePacket {
468f7377353db29efe0a506123deec03d70935957aAjay Panicker public:
478f7377353db29efe0a506123deec03d70935957aAjay Panicker  virtual ~ChangePathRequest() = default;
488f7377353db29efe0a506123deec03d70935957aAjay Panicker
498f7377353db29efe0a506123deec03d70935957aAjay Panicker  /**
508f7377353db29efe0a506123deec03d70935957aAjay Panicker   * Avrcp Change Path Packet Layout
518f7377353db29efe0a506123deec03d70935957aAjay Panicker   *   BrowsePacket:
528f7377353db29efe0a506123deec03d70935957aAjay Panicker   *     uint8_t pdu_;
538f7377353db29efe0a506123deec03d70935957aAjay Panicker   *     uint16_t length_;
548f7377353db29efe0a506123deec03d70935957aAjay Panicker   *   ChangePathRequest:
558f7377353db29efe0a506123deec03d70935957aAjay Panicker   *     uint16_t uid_counter_;
568f7377353db29efe0a506123deec03d70935957aAjay Panicker   *     uint8_t direction_;
578f7377353db29efe0a506123deec03d70935957aAjay Panicker   *     uint64_t folder_uid_;
588f7377353db29efe0a506123deec03d70935957aAjay Panicker   */
598f7377353db29efe0a506123deec03d70935957aAjay Panicker  static constexpr size_t kMinSize() { return BrowsePacket::kMinSize() + 11; }
608f7377353db29efe0a506123deec03d70935957aAjay Panicker
618f7377353db29efe0a506123deec03d70935957aAjay Panicker  uint16_t GetUidCounter() const;
628f7377353db29efe0a506123deec03d70935957aAjay Panicker  Direction GetDirection() const;
638f7377353db29efe0a506123deec03d70935957aAjay Panicker  uint64_t GetUid() const;
648f7377353db29efe0a506123deec03d70935957aAjay Panicker
658f7377353db29efe0a506123deec03d70935957aAjay Panicker  virtual bool IsValid() const override;
668f7377353db29efe0a506123deec03d70935957aAjay Panicker  virtual std::string ToString() const override;
678f7377353db29efe0a506123deec03d70935957aAjay Panicker
688f7377353db29efe0a506123deec03d70935957aAjay Panicker protected:
698f7377353db29efe0a506123deec03d70935957aAjay Panicker  using BrowsePacket::BrowsePacket;
708f7377353db29efe0a506123deec03d70935957aAjay Panicker};
718f7377353db29efe0a506123deec03d70935957aAjay Panicker
728b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panickerclass ChangePathRequestBuilder : public BrowsePacketBuilder {
738b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker public:
748b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker  virtual ~ChangePathRequestBuilder() = default;
758b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker
768b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker  static std::unique_ptr<ChangePathRequestBuilder> MakeBuilder(
778b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker      uint16_t uid_counter, Direction direction, uint64_t folder_uid);
788b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker
798b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker  virtual size_t size() const override;
808b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker  virtual bool Serialize(
818b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker      const std::shared_ptr<::bluetooth::Packet>& pkt) override;
828b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker
838b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker private:
848b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker  ChangePathRequestBuilder(uint16_t uid_counter, Direction direction,
858b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker                           uint64_t folder_uid)
868b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker      : BrowsePacketBuilder(BrowsePdu::CHANGE_PATH),
878b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker        uid_counter_(uid_counter),
888b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker        direction_(direction),
898b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker        folder_uid_(folder_uid){};
908b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker
918b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker  uint16_t uid_counter_;
928b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker  Direction direction_;
938b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker  uint64_t folder_uid_;
948b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker};
958b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker
968f7377353db29efe0a506123deec03d70935957aAjay Panicker}  // namespace avrcp
978f7377353db29efe0a506123deec03d70935957aAjay Panicker}  // namespace bluetooth