• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //
2 // Copyright 2015 The Android Open Source Project
3 //
4 // Licensed under the Apache License, Version 2.0 (the "License");
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
7 //
8 // http://www.apache.org/licenses/LICENSE-2.0
9 //
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an "AS IS" BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
15 //
16 
17 #pragma once
18 
19 #include <cstdint>
20 #include <vector>
21 
22 extern "C" {
23 #include "hci/include/hci_hal.h"
24 }  // extern "C"
25 
26 namespace test_vendor_lib {
27 
28 // Abstract base class that is subclassed to provide type-specifc accessors on
29 // data. Manages said data's memory and guarantees the data's persistence for IO
30 // operations.
31 class Packet {
32  public:
33   virtual ~Packet() = default;
34 
35   // Returns the size in octets of the entire packet, which consists of the type
36   // octet, the header, and the payload.
37   size_t GetPacketSize() const;
38 
39   const std::vector<uint8_t>& GetPayload() const;
40 
41   uint8_t GetPayloadSize() const;
42 
43   const std::vector<uint8_t>& GetHeader() const;
44 
45   uint8_t GetHeaderSize() const;
46 
47   serial_data_type_t GetType() const;
48 
49   // Validates the packet by checking that the payload size in the header is
50   // accurate. If the size is not valid, returns false. Otherwise, the data in
51   // |header| and |payload| is copied into |header_| and |payload_|
52   // respectively. If an error occurs while the data is being copied, the
53   // contents of |header| and |payload| are guaranteed to be preserved. The
54   // packet object will assume ownership of the copied data for its entire
55   // lifetime.
56   bool Encode(const std::vector<uint8_t>& header,
57               const std::vector<uint8_t>& payload);
58 
59  protected:
60   // Constructs an empty packet of type |type|. A call to Encode() shall be made
61   // to check and fill in the packet's data.
62   Packet(serial_data_type_t type);
63 
64  private:
65   // Underlying containers for storing the actual packet, broken down into the
66   // packet header and the packet payload. Data is copied into the vectors
67   // during the constructor and becomes accessible (read only) to children
68   // through GetHeader() and GetPayload().
69   std::vector<uint8_t> header_;
70 
71   std::vector<uint8_t> payload_;
72 
73   // The packet type is one of DATA_TYPE_ACL, DATA_TYPE_COMMAND,
74   // DATA_TYPE_EVENT, or DATA_TYPE_SCO.
75   serial_data_type_t type_;
76 };
77 
78 }  // namespace test_vendor_lib
79