reason_code.hpp 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422
  1. // Copyright Takatoshi Kondo 2018
  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. #if !defined(MQTT_REASON_CODE_HPP)
  7. #define MQTT_REASON_CODE_HPP
  8. #include <cstdint>
  9. #include <ostream>
  10. #include <mqtt/namespace.hpp>
  11. #include <mqtt/subscribe_options.hpp>
  12. namespace MQTT_NS {
  13. enum class suback_return_code : std::uint8_t {
  14. success_maximum_qos_0 = 0x00,
  15. success_maximum_qos_1 = 0x01,
  16. success_maximum_qos_2 = 0x02,
  17. failure = 0x80,
  18. };
  19. constexpr
  20. char const* suback_return_code_to_str(suback_return_code v) {
  21. switch(v)
  22. {
  23. case suback_return_code::success_maximum_qos_0: return "success_maximum_qos_0";
  24. case suback_return_code::success_maximum_qos_1: return "success_maximum_qos_1";
  25. case suback_return_code::success_maximum_qos_2: return "success_maximum_qos_2";
  26. case suback_return_code::failure: return "failure";
  27. default: return "unknown_suback_return_code";
  28. }
  29. }
  30. inline
  31. std::ostream& operator<<(std::ostream& os, suback_return_code val)
  32. {
  33. os << suback_return_code_to_str(val);
  34. return os;
  35. }
  36. constexpr suback_return_code qos_to_suback_return_code(qos q) {
  37. return static_cast<suback_return_code>(q);
  38. }
  39. namespace v5 {
  40. enum class connect_reason_code : std::uint8_t {
  41. success = 0x00,
  42. unspecified_error = 0x80,
  43. malformed_packet = 0x81,
  44. protocol_error = 0x82,
  45. implementation_specific_error = 0x83,
  46. unsupported_protocol_version = 0x84,
  47. client_identifier_not_valid = 0x85,
  48. bad_user_name_or_password = 0x86,
  49. not_authorized = 0x87,
  50. server_unavailable = 0x88,
  51. server_busy = 0x89,
  52. banned = 0x8a,
  53. server_shutting_down = 0x8b,
  54. bad_authentication_method = 0x8c,
  55. topic_name_invalid = 0x90,
  56. packet_too_large = 0x95,
  57. quota_exceeded = 0x97,
  58. payload_format_invalid = 0x99,
  59. retain_not_supported = 0x9a,
  60. qos_not_supported = 0x9b,
  61. use_another_server = 0x9c,
  62. server_moved = 0x9d,
  63. connection_rate_exceeded = 0x9f,
  64. };
  65. constexpr
  66. char const* connect_reason_code_to_str(connect_reason_code v) {
  67. switch(v)
  68. {
  69. case connect_reason_code::success: return "success";
  70. case connect_reason_code::unspecified_error: return "unspecified_error";
  71. case connect_reason_code::malformed_packet: return "malformed_packet";
  72. case connect_reason_code::protocol_error: return "protocol_error";
  73. case connect_reason_code::implementation_specific_error: return "implementation_specific_error";
  74. case connect_reason_code::unsupported_protocol_version: return "unsupported_protocol_version";
  75. case connect_reason_code::client_identifier_not_valid: return "client_identifier_not_valid";
  76. case connect_reason_code::bad_user_name_or_password: return "bad_user_name_or_password";
  77. case connect_reason_code::not_authorized: return "not_authorized";
  78. case connect_reason_code::server_unavailable: return "server_unavailable";
  79. case connect_reason_code::server_busy: return "server_busy";
  80. case connect_reason_code::banned: return "banned";
  81. case connect_reason_code::server_shutting_down: return "server_shutting_down";
  82. case connect_reason_code::bad_authentication_method: return "bad_authentication_method";
  83. case connect_reason_code::topic_name_invalid: return "topic_name_invalid";
  84. case connect_reason_code::packet_too_large: return "packet_too_large";
  85. case connect_reason_code::quota_exceeded: return "quota_exceeded";
  86. case connect_reason_code::payload_format_invalid: return "payload_format_invalid";
  87. case connect_reason_code::retain_not_supported: return "retain_not_supported";
  88. case connect_reason_code::qos_not_supported: return "qos_not_supported";
  89. case connect_reason_code::use_another_server: return "use_another_server";
  90. case connect_reason_code::server_moved: return "server_moved";
  91. case connect_reason_code::connection_rate_exceeded: return "connection_rate_exceeded";
  92. default: return "unknown_connect_reason_code";
  93. }
  94. }
  95. inline
  96. std::ostream& operator<<(std::ostream& os, connect_reason_code val)
  97. {
  98. os << connect_reason_code_to_str(val);
  99. return os;
  100. }
  101. enum class disconnect_reason_code : std::uint8_t {
  102. normal_disconnection = 0x00,
  103. disconnect_with_will_message = 0x04,
  104. unspecified_error = 0x80,
  105. malformed_packet = 0x81,
  106. protocol_error = 0x82,
  107. implementation_specific_error = 0x83,
  108. not_authorized = 0x87,
  109. server_busy = 0x89,
  110. server_shutting_down = 0x8b,
  111. keep_alive_timeout = 0x8d,
  112. session_taken_over = 0x8e,
  113. topic_filter_invalid = 0x8f,
  114. topic_name_invalid = 0x90,
  115. receive_maximum_exceeded = 0x93,
  116. topic_alias_invalid = 0x94,
  117. packet_too_large = 0x95,
  118. message_rate_too_high = 0x96,
  119. quota_exceeded = 0x97,
  120. administrative_action = 0x98,
  121. payload_format_invalid = 0x99,
  122. retain_not_supported = 0x9a,
  123. qos_not_supported = 0x9b,
  124. use_another_server = 0x9c,
  125. server_moved = 0x9d,
  126. shared_subscriptions_not_supported = 0x9e,
  127. connection_rate_exceeded = 0x9f,
  128. maximum_connect_time = 0xa0,
  129. subscription_identifiers_not_supported = 0xa1,
  130. wildcard_subscriptions_not_supported = 0xa2,
  131. };
  132. constexpr
  133. char const* disconnect_reason_code_to_str(disconnect_reason_code v) {
  134. switch(v)
  135. {
  136. case disconnect_reason_code::normal_disconnection: return "normal_disconnection";
  137. case disconnect_reason_code::disconnect_with_will_message: return "disconnect_with_will_message";
  138. case disconnect_reason_code::unspecified_error: return "unspecified_error";
  139. case disconnect_reason_code::malformed_packet: return "malformed_packet";
  140. case disconnect_reason_code::protocol_error: return "protocol_error";
  141. case disconnect_reason_code::implementation_specific_error: return "implementation_specific_error";
  142. case disconnect_reason_code::not_authorized: return "not_authorized";
  143. case disconnect_reason_code::server_busy: return "server_busy";
  144. case disconnect_reason_code::server_shutting_down: return "server_shutting_down";
  145. case disconnect_reason_code::keep_alive_timeout: return "keep_alive_timeout";
  146. case disconnect_reason_code::session_taken_over: return "session_taken_over";
  147. case disconnect_reason_code::topic_filter_invalid: return "topic_filter_invalid";
  148. case disconnect_reason_code::topic_name_invalid: return "topic_name_invalid";
  149. case disconnect_reason_code::receive_maximum_exceeded: return "receive_maximum_exceeded";
  150. case disconnect_reason_code::topic_alias_invalid: return "topic_alias_invalid";
  151. case disconnect_reason_code::packet_too_large: return "packet_too_large";
  152. case disconnect_reason_code::message_rate_too_high: return "message_rate_too_high";
  153. case disconnect_reason_code::quota_exceeded: return "quota_exceeded";
  154. case disconnect_reason_code::administrative_action: return "administrative_action";
  155. case disconnect_reason_code::payload_format_invalid: return "payload_format_invalid";
  156. case disconnect_reason_code::retain_not_supported: return "retain_not_supported";
  157. case disconnect_reason_code::qos_not_supported: return "qos_not_supported";
  158. case disconnect_reason_code::use_another_server: return "use_another_server";
  159. case disconnect_reason_code::server_moved: return "server_moved";
  160. case disconnect_reason_code::shared_subscriptions_not_supported: return "shared_subscriptions_not_supported";
  161. case disconnect_reason_code::connection_rate_exceeded: return "connection_rate_exceeded";
  162. case disconnect_reason_code::maximum_connect_time: return "maximum_connect_time";
  163. case disconnect_reason_code::subscription_identifiers_not_supported: return "subscription_identifiers_not_supported";
  164. case disconnect_reason_code::wildcard_subscriptions_not_supported: return "wildcard_subscriptions_not_supported";
  165. default: return "unknown_disconnect_reason_code";
  166. }
  167. }
  168. inline
  169. std::ostream& operator<<(std::ostream& os, disconnect_reason_code val)
  170. {
  171. os << disconnect_reason_code_to_str(val);
  172. return os;
  173. }
  174. enum class suback_reason_code : std::uint8_t {
  175. granted_qos_0 = 0x00,
  176. granted_qos_1 = 0x01,
  177. granted_qos_2 = 0x02,
  178. unspecified_error = 0x80,
  179. implementation_specific_error = 0x83,
  180. not_authorized = 0x87,
  181. topic_filter_invalid = 0x8f,
  182. packet_identifier_in_use = 0x91,
  183. quota_exceeded = 0x97,
  184. shared_subscriptions_not_supported = 0x9e,
  185. subscription_identifiers_not_supported = 0xa1,
  186. wildcard_subscriptions_not_supported = 0xa2,
  187. };
  188. constexpr
  189. char const* suback_reason_code_to_str(suback_reason_code v) {
  190. switch(v)
  191. {
  192. case suback_reason_code::granted_qos_0: return "granted_qos_0";
  193. case suback_reason_code::granted_qos_1: return "granted_qos_1";
  194. case suback_reason_code::granted_qos_2: return "granted_qos_2";
  195. case suback_reason_code::unspecified_error: return "unspecified_error";
  196. case suback_reason_code::implementation_specific_error: return "implementation_specific_error";
  197. case suback_reason_code::not_authorized: return "not_authorized";
  198. case suback_reason_code::topic_filter_invalid: return "topic_filter_invalid";
  199. case suback_reason_code::packet_identifier_in_use: return "packet_identifier_in_use";
  200. case suback_reason_code::quota_exceeded: return "quota_exceeded";
  201. case suback_reason_code::shared_subscriptions_not_supported: return "shared_subscriptions_not_supported";
  202. case suback_reason_code::subscription_identifiers_not_supported: return "subscription_identifiers_not_supported";
  203. case suback_reason_code::wildcard_subscriptions_not_supported: return "wildcard_subscriptions_not_supported";
  204. default: return "unknown_suback_reason_code";
  205. }
  206. }
  207. inline
  208. std::ostream& operator<<(std::ostream& os, suback_reason_code val)
  209. {
  210. os << suback_reason_code_to_str(val);
  211. return os;
  212. }
  213. constexpr suback_reason_code qos_to_suback_reason_code(qos q) {
  214. return static_cast<suback_reason_code>(q);
  215. }
  216. enum class unsuback_reason_code : std::uint8_t {
  217. success = 0x00,
  218. no_subscription_existed = 0x11,
  219. unspecified_error = 0x80,
  220. implementation_specific_error = 0x83,
  221. not_authorized = 0x87,
  222. topic_filter_invalid = 0x8f,
  223. packet_identifier_in_use = 0x91,
  224. };
  225. constexpr
  226. char const* unsuback_reason_code_to_str(unsuback_reason_code v) {
  227. switch(v)
  228. {
  229. case unsuback_reason_code::success: return "success";
  230. case unsuback_reason_code::no_subscription_existed: return "no_subscription_existed";
  231. case unsuback_reason_code::unspecified_error: return "unspecified_error";
  232. case unsuback_reason_code::implementation_specific_error: return "implementation_specific_error";
  233. case unsuback_reason_code::not_authorized: return "not_authorized";
  234. case unsuback_reason_code::topic_filter_invalid: return "topic_filter_invalid";
  235. case unsuback_reason_code::packet_identifier_in_use: return "packet_identifier_in_use";
  236. default: return "unknown_unsuback_reason_code";
  237. }
  238. }
  239. inline
  240. std::ostream& operator<<(std::ostream& os, unsuback_reason_code val)
  241. {
  242. os << unsuback_reason_code_to_str(val);
  243. return os;
  244. }
  245. enum class puback_reason_code : std::uint8_t {
  246. success = 0x00,
  247. no_matching_subscribers = 0x10,
  248. unspecified_error = 0x80,
  249. implementation_specific_error = 0x83,
  250. not_authorized = 0x87,
  251. topic_name_invalid = 0x90,
  252. packet_identifier_in_use = 0x91,
  253. quota_exceeded = 0x97,
  254. payload_format_invalid = 0x99,
  255. };
  256. constexpr
  257. char const* puback_reason_code_to_str(puback_reason_code v) {
  258. switch(v)
  259. {
  260. case puback_reason_code::success: return "success";
  261. case puback_reason_code::no_matching_subscribers: return "no_matching_subscribers";
  262. case puback_reason_code::unspecified_error: return "unspecified_error";
  263. case puback_reason_code::implementation_specific_error: return "implementation_specific_error";
  264. case puback_reason_code::not_authorized: return "not_authorized";
  265. case puback_reason_code::topic_name_invalid: return "topic_name_invalid";
  266. case puback_reason_code::packet_identifier_in_use: return "packet_identifier_in_use";
  267. case puback_reason_code::quota_exceeded: return "quota_exceeded";
  268. case puback_reason_code::payload_format_invalid: return "payload_format_invalid";
  269. default: return "unknown_puback_reason_code";
  270. }
  271. }
  272. constexpr
  273. bool is_error(puback_reason_code v) {
  274. return static_cast<std::uint8_t>(v) >= 0x80;
  275. }
  276. inline
  277. std::ostream& operator<<(std::ostream& os, puback_reason_code val)
  278. {
  279. os << puback_reason_code_to_str(val);
  280. return os;
  281. }
  282. enum class pubrec_reason_code : std::uint8_t {
  283. success = 0x00,
  284. no_matching_subscribers = 0x10,
  285. unspecified_error = 0x80,
  286. implementation_specific_error = 0x83,
  287. not_authorized = 0x87,
  288. topic_name_invalid = 0x90,
  289. packet_identifier_in_use = 0x91,
  290. quota_exceeded = 0x97,
  291. payload_format_invalid = 0x99,
  292. };
  293. constexpr
  294. char const* pubrec_reason_code_to_str(pubrec_reason_code v) {
  295. switch(v)
  296. {
  297. case pubrec_reason_code::success: return "success";
  298. case pubrec_reason_code::no_matching_subscribers: return "no_matching_subscribers";
  299. case pubrec_reason_code::unspecified_error: return "unspecified_error";
  300. case pubrec_reason_code::implementation_specific_error: return "implementation_specific_error";
  301. case pubrec_reason_code::not_authorized: return "not_authorized";
  302. case pubrec_reason_code::topic_name_invalid: return "topic_name_invalid";
  303. case pubrec_reason_code::packet_identifier_in_use: return "packet_identifier_in_use";
  304. case pubrec_reason_code::quota_exceeded: return "quota_exceeded";
  305. case pubrec_reason_code::payload_format_invalid: return "payload_format_invalid";
  306. default: return "unknown_pubrec_reason_code";
  307. }
  308. }
  309. constexpr
  310. bool is_error(pubrec_reason_code v) {
  311. return static_cast<std::uint8_t>(v) >= 0x80;
  312. }
  313. inline
  314. std::ostream& operator<<(std::ostream& os, pubrec_reason_code val)
  315. {
  316. os << pubrec_reason_code_to_str(val);
  317. return os;
  318. }
  319. enum class pubrel_reason_code : std::uint8_t {
  320. success = 0x00,
  321. packet_identifier_not_found = 0x92,
  322. };
  323. constexpr
  324. char const* pubrel_reason_code_to_str(pubrel_reason_code v) {
  325. switch(v)
  326. {
  327. case pubrel_reason_code::success: return "success";
  328. case pubrel_reason_code::packet_identifier_not_found: return "packet_identifier_not_found";
  329. default: return "unknown_pubrel_reason_code";
  330. }
  331. }
  332. inline
  333. std::ostream& operator<<(std::ostream& os, pubrel_reason_code val)
  334. {
  335. os << pubrel_reason_code_to_str(val);
  336. return os;
  337. }
  338. enum class pubcomp_reason_code : std::uint8_t {
  339. success = 0x00,
  340. packet_identifier_not_found = 0x92,
  341. };
  342. constexpr
  343. char const* pubcomp_reason_code_to_str(pubcomp_reason_code v) {
  344. switch(v)
  345. {
  346. case pubcomp_reason_code::success: return "success";
  347. case pubcomp_reason_code::packet_identifier_not_found: return "packet_identifier_not_found";
  348. default: return "unknown_pubcomp_reason_code";
  349. }
  350. }
  351. inline
  352. std::ostream& operator<<(std::ostream& os, pubcomp_reason_code val)
  353. {
  354. os << pubcomp_reason_code_to_str(val);
  355. return os;
  356. }
  357. enum class auth_reason_code : std::uint8_t {
  358. success = 0x00,
  359. continue_authentication = 0x18,
  360. re_authenticate = 0x19,
  361. };
  362. constexpr
  363. char const* auth_reason_code_to_str(auth_reason_code v) {
  364. switch(v)
  365. {
  366. case auth_reason_code::success: return "success";
  367. case auth_reason_code::continue_authentication: return "continue_authentication";
  368. case auth_reason_code::re_authenticate: return "re_authenticate";
  369. default: return "unknown_auth_reason_code";
  370. }
  371. }
  372. inline
  373. std::ostream& operator<<(std::ostream& os, auth_reason_code val)
  374. {
  375. os << auth_reason_code_to_str(val);
  376. return os;
  377. }
  378. } // v5
  379. } // namespace MQTT_NS
  380. #endif // MQTT_REASON_CODE_HPP