1341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker/*
2341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker * Copyright 2018 The Android Open Source Project
3341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker *
4341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker * Licensed under the Apache License, Version 2.0 (the "License");
5341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker * you may not use this file except in compliance with the License.
6341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker * You may obtain a copy of the License at
7341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker *
8341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker *      http://www.apache.org/licenses/LICENSE-2.0
9341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker *
10341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker * Unless required by applicable law or agreed to in writing, software
11341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker * distributed under the License is distributed on an "AS IS" BASIS,
12341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker * See the License for the specific language governing permissions and
14341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker * limitations under the License.
15341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker */
16341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker
17341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker#pragma once
18341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker
19341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker#include "avrcp_packet.h"
20341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker
21341ab2befa059e859cdc67655d83bac14980ea9eAjay Panickernamespace bluetooth {
22341ab2befa059e859cdc67655d83bac14980ea9eAjay Panickernamespace avrcp {
23341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker
24341ab2befa059e859cdc67655d83bac14980ea9eAjay Panickerclass PassThroughPacketBuilder : public PacketBuilder {
25341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker public:
26341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  virtual ~PassThroughPacketBuilder() = default;
27341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker
28341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  static std::unique_ptr<PassThroughPacketBuilder> MakeBuilder(
29341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker      bool response, bool pushed, uint8_t operation_id);
30341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker
31341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  virtual size_t size() const override;
32341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  virtual bool Serialize(
33341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker      const std::shared_ptr<::bluetooth::Packet>& pkt) override;
34341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker
35341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker private:
36341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  bool pushed_;
37341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  uint8_t opperation_id_;
38341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker
39341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  PassThroughPacketBuilder(bool response, bool pushed, uint8_t opperation_id)
40341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker      : PacketBuilder(response ? CType::ACCEPTED : CType::CONTROL, 0x09, 0x00,
41341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker                      Opcode::PASS_THROUGH),
42341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker        pushed_(pushed),
43341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker        opperation_id_(opperation_id){};
44341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker};
45341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker
46341ab2befa059e859cdc67655d83bac14980ea9eAjay Panickerclass PassThroughPacket : public Packet {
47341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker public:
48341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  virtual ~PassThroughPacket() = default;
49341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker
50341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  /**
51341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker   * Pass Through Packet Layout
52341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker   *   AvrcpPacket:
53341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker   *     CType c_type_;
54341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker   *     uint8_t subunit_type_ : 5;
55341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker   *     uint8_t subunit_id_ : 3;
56341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker   *     Opcode opcode_;
57341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker   *   PassThroughPacket:
58341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker   *     uint8_t state : 1;
59341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker   *     uint8_t opperation_id : 7;
60341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker   *     uint8_t data_length;
61341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker   */
628f7377353db29efe0a506123deec03d70935957aAjay Panicker  static constexpr size_t kMinSize() { return Packet::kMinSize() + 2; }
63341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker
64341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  // Getter Functions
6505c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker  KeyState GetKeyState() const;
66341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  uint8_t GetOperationId() const;
67341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker
68341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  // Overloaded Functions
69341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  virtual bool IsValid() const override;
70341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  virtual std::string ToString() const override;
71341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker
72341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker protected:
73341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  using Packet::Packet;
74341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker};
75341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker
76341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker}  // namespace avrcp
77341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker}  // namespace bluetooth