mqtt_cpp
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
control_packet_type.hpp
Go to the documentation of this file.
1 // Copyright Takatoshi Kondo 2015
2 //
3 // Distributed under the Boost Software License, Version 1.0.
4 // (See accompanying file LICENSE_1_0.txt or copy at
5 // http://www.boost.org/LICENSE_1_0.txt)
6 
7 #if !defined(MQTT_CONTROL_PACKET_TYPE_HPP)
8 #define MQTT_CONTROL_PACKET_TYPE_HPP
9 
10 #include <cstdint>
11 #include <ostream>
12 
13 #include <mqtt/namespace.hpp>
14 #include <mqtt/optional.hpp>
15 
16 namespace MQTT_NS {
17 
18 enum class control_packet_type : std::uint8_t {
19 
20  // reserved = 0b0000000,
21  connect = 0b00010000, // 1
22  connack = 0b00100000, // 2
23  publish = 0b00110000, // 3
24  puback = 0b01000000, // 4
25  pubrec = 0b01010000, // 5
26  pubrel = 0b01100000, // 6
27  pubcomp = 0b01110000, // 7
28  subscribe = 0b10000000, // 8
29  suback = 0b10010000, // 9
30  unsubscribe = 0b10100000, // 10
31  unsuback = 0b10110000, // 11
32  pingreq = 0b11000000, // 12
33  pingresp = 0b11010000, // 13
34  disconnect = 0b11100000, // 14
35  auth = 0b11110000, // 15
36 
37 };
38 
39 constexpr control_packet_type get_control_packet_type(std::uint8_t v) {
40  return static_cast<control_packet_type>(v & 0b11110000);
41 }
42 
43 constexpr
45  switch(v)
46  {
47  // case control_packet_type::reserved: return "reserved";
48  case control_packet_type::connect: return "connect";
49  case control_packet_type::connack: return "connack";
50  case control_packet_type::publish: return "publish";
51  case control_packet_type::puback: return "puback";
52  case control_packet_type::pubrec: return "pubrec";
53  case control_packet_type::pubrel: return "pubrel";
54  case control_packet_type::pubcomp: return "pubcomp";
55  case control_packet_type::subscribe: return "subscribe";
56  case control_packet_type::suback: return "suback";
57  case control_packet_type::pingreq: return "pingreq";
58  case control_packet_type::pingresp: return "pingresp";
59  case control_packet_type::disconnect: return "disconnect";
60  case control_packet_type::auth: return "auth";
61  default: return "unknown_control_packet_type";
62  }
63 }
64 
65 inline
66 std::ostream& operator<<(std::ostream& os, control_packet_type val)
67 {
68  os << control_packet_type_to_str(val);
69  return os;
70 }
71 
72 enum class control_packet_reserved_bits : std::uint8_t {
73  connect = 0b00000000,
74  connack = 0b00000000,
75  // publish = dup qos retain,
76  puback = 0b00000000,
77  pubrec = 0b00000000,
78  pubrel = 0b00000010,
79  pubcomp = 0b00000000,
80  subscribe = 0b00000010,
81  suback = 0b00000000,
82  unsubscribe = 0b00000010,
83  unsuback = 0b00000000,
84  pingreq = 0b00000000,
85  pingresp = 0b00000000,
86  disconnect = 0b00000000,
87  auth = 0b00000000,
88 };
89 
90 inline optional<control_packet_type> get_control_packet_type_with_check(std::uint8_t v) {
91  auto cpt = static_cast<control_packet_type>(v & 0b11110000);
92  auto valid =
93  [&] {
94  auto rsv = static_cast<control_packet_reserved_bits>(v & 0b00001111);
95  switch (cpt) {
101  return true;
126  default:
127  return false;
128  }
129  } ();
130  if (valid) return cpt;
131  return nullopt;
132 }
133 
134 } // namespace MQTT_NS
135 
136 #endif // MQTT_CONTROL_PACKET_TYPE_HPP
Definition: any.hpp:27
constexpr char const * control_packet_type_to_str(control_packet_type v)
Definition: control_packet_type.hpp:44
control_packet_type
Definition: control_packet_type.hpp:18
constexpr control_packet_type get_control_packet_type(std::uint8_t v)
Definition: control_packet_type.hpp:39
std::ostream & operator<<(std::ostream &os, connect_return_code val)
Definition: connect_return_code.hpp:43
control_packet_reserved_bits
Definition: control_packet_type.hpp:72
optional< control_packet_type > get_control_packet_type_with_check(std::uint8_t v)
Definition: control_packet_type.hpp:90