mqtt_handler.hpp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341
  1. /*
  2. * Copyright (c) 2017-2023 zhllxt
  3. *
  4. * author : zhllxt
  5. * email : 37792738@qq.com
  6. *
  7. * Distributed under the Boost Software License, Version 1.0. (See accompanying
  8. * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  9. */
  10. #ifndef __ASIO2_MQTT_HANDLER_HPP__
  11. #define __ASIO2_MQTT_HANDLER_HPP__
  12. #if defined(_MSC_VER) && (_MSC_VER >= 1200)
  13. #pragma once
  14. #endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
  15. #include <asio2/base/detail/push_options.hpp>
  16. #include <asio2/base/define.hpp>
  17. #include <asio2/base/error.hpp>
  18. #include <asio2/mqtt/detail/mqtt_topic_util.hpp>
  19. #include <asio2/mqtt/detail/mqtt_subscription_map.hpp>
  20. #include <asio2/mqtt/detail/mqtt_shared_target.hpp>
  21. #include <asio2/mqtt/detail/mqtt_retained_message.hpp>
  22. #include <asio2/mqtt/detail/mqtt_offline_message.hpp>
  23. #include <asio2/mqtt/aop/aop_auth.hpp>
  24. #include <asio2/mqtt/aop/aop_connack.hpp>
  25. #include <asio2/mqtt/aop/aop_connect.hpp>
  26. #include <asio2/mqtt/aop/aop_disconnect.hpp>
  27. #include <asio2/mqtt/aop/aop_pingreq.hpp>
  28. #include <asio2/mqtt/aop/aop_pingresp.hpp>
  29. #include <asio2/mqtt/aop/aop_puback.hpp>
  30. #include <asio2/mqtt/aop/aop_pubcomp.hpp>
  31. #include <asio2/mqtt/aop/aop_publish.hpp>
  32. #include <asio2/mqtt/aop/aop_pubrec.hpp>
  33. #include <asio2/mqtt/aop/aop_pubrel.hpp>
  34. #include <asio2/mqtt/aop/aop_suback.hpp>
  35. #include <asio2/mqtt/aop/aop_subscribe.hpp>
  36. #include <asio2/mqtt/aop/aop_unsuback.hpp>
  37. #include <asio2/mqtt/aop/aop_unsubscribe.hpp>
  38. namespace asio2::detail
  39. {
  40. ASIO2_CLASS_FORWARD_DECLARE_BASE;
  41. ASIO2_CLASS_FORWARD_DECLARE_TCP_BASE;
  42. ASIO2_CLASS_FORWARD_DECLARE_TCP_SERVER;
  43. ASIO2_CLASS_FORWARD_DECLARE_TCP_SESSION;
  44. ASIO2_CLASS_FORWARD_DECLARE_TCP_CLIENT;
  45. template<class caller_t, class args_t>
  46. class mqtt_handler_t
  47. : public mqtt_aop_auth <caller_t, args_t>
  48. , public mqtt_aop_connack <caller_t, args_t>
  49. , public mqtt_aop_connect <caller_t, args_t>
  50. , public mqtt_aop_disconnect <caller_t, args_t>
  51. , public mqtt_aop_pingreq <caller_t, args_t>
  52. , public mqtt_aop_pingresp <caller_t, args_t>
  53. , public mqtt_aop_puback <caller_t, args_t>
  54. , public mqtt_aop_pubcomp <caller_t, args_t>
  55. , public mqtt_aop_publish <caller_t, args_t>
  56. , public mqtt_aop_pubrec <caller_t, args_t>
  57. , public mqtt_aop_pubrel <caller_t, args_t>
  58. , public mqtt_aop_suback <caller_t, args_t>
  59. , public mqtt_aop_subscribe <caller_t, args_t>
  60. , public mqtt_aop_unsuback <caller_t, args_t>
  61. , public mqtt_aop_unsubscribe<caller_t, args_t>
  62. {
  63. friend caller_t;
  64. ASIO2_CLASS_FRIEND_DECLARE_BASE;
  65. ASIO2_CLASS_FRIEND_DECLARE_TCP_BASE;
  66. ASIO2_CLASS_FRIEND_DECLARE_TCP_SERVER;
  67. ASIO2_CLASS_FRIEND_DECLARE_TCP_SESSION;
  68. ASIO2_CLASS_FRIEND_DECLARE_TCP_CLIENT;
  69. protected:
  70. using mqtt_aop_auth <caller_t, args_t>::_before_user_callback_impl;
  71. using mqtt_aop_connack <caller_t, args_t>::_before_user_callback_impl;
  72. using mqtt_aop_connect <caller_t, args_t>::_before_user_callback_impl;
  73. using mqtt_aop_disconnect <caller_t, args_t>::_before_user_callback_impl;
  74. using mqtt_aop_pingreq <caller_t, args_t>::_before_user_callback_impl;
  75. using mqtt_aop_pingresp <caller_t, args_t>::_before_user_callback_impl;
  76. using mqtt_aop_puback <caller_t, args_t>::_before_user_callback_impl;
  77. using mqtt_aop_pubcomp <caller_t, args_t>::_before_user_callback_impl;
  78. using mqtt_aop_publish <caller_t, args_t>::_before_user_callback_impl;
  79. using mqtt_aop_pubrec <caller_t, args_t>::_before_user_callback_impl;
  80. using mqtt_aop_pubrel <caller_t, args_t>::_before_user_callback_impl;
  81. using mqtt_aop_suback <caller_t, args_t>::_before_user_callback_impl;
  82. using mqtt_aop_subscribe <caller_t, args_t>::_before_user_callback_impl;
  83. using mqtt_aop_unsuback <caller_t, args_t>::_before_user_callback_impl;
  84. using mqtt_aop_unsubscribe<caller_t, args_t>::_before_user_callback_impl;
  85. using mqtt_aop_auth <caller_t, args_t>::_after_user_callback_impl;
  86. using mqtt_aop_connack <caller_t, args_t>::_after_user_callback_impl;
  87. using mqtt_aop_connect <caller_t, args_t>::_after_user_callback_impl;
  88. using mqtt_aop_disconnect <caller_t, args_t>::_after_user_callback_impl;
  89. using mqtt_aop_pingreq <caller_t, args_t>::_after_user_callback_impl;
  90. using mqtt_aop_pingresp <caller_t, args_t>::_after_user_callback_impl;
  91. using mqtt_aop_puback <caller_t, args_t>::_after_user_callback_impl;
  92. using mqtt_aop_pubcomp <caller_t, args_t>::_after_user_callback_impl;
  93. using mqtt_aop_publish <caller_t, args_t>::_after_user_callback_impl;
  94. using mqtt_aop_pubrec <caller_t, args_t>::_after_user_callback_impl;
  95. using mqtt_aop_pubrel <caller_t, args_t>::_after_user_callback_impl;
  96. using mqtt_aop_suback <caller_t, args_t>::_after_user_callback_impl;
  97. using mqtt_aop_subscribe <caller_t, args_t>::_after_user_callback_impl;
  98. using mqtt_aop_unsuback <caller_t, args_t>::_after_user_callback_impl;
  99. using mqtt_aop_unsubscribe<caller_t, args_t>::_after_user_callback_impl;
  100. template<class Message>
  101. inline void _before_user_callback_impl(
  102. error_code& ec, std::shared_ptr<caller_t>& caller_ptr, caller_t* caller, mqtt::message& om, Message& msg)
  103. {
  104. detail::ignore_unused(ec, caller_ptr, caller, om, msg);
  105. ASIO2_ASSERT(false);
  106. }
  107. template<class Message>
  108. inline void _after_user_callback_impl(
  109. error_code& ec, std::shared_ptr<caller_t>& caller_ptr, caller_t* caller, mqtt::message& om, Message& msg)
  110. {
  111. detail::ignore_unused(ec, caller_ptr, caller, om, msg);
  112. ASIO2_ASSERT(false);
  113. }
  114. template<class Message, class Response>
  115. inline void _before_user_callback_impl(
  116. error_code& ec, std::shared_ptr<caller_t>& caller_ptr, caller_t* caller, mqtt::message& om, Message& msg, Response& rep)
  117. {
  118. detail::ignore_unused(ec, caller_ptr, caller, om, msg, rep);
  119. ASIO2_ASSERT(false);
  120. }
  121. template<class Message, class Response>
  122. inline void _after_user_callback_impl(
  123. error_code& ec, std::shared_ptr<caller_t>& caller_ptr, caller_t* caller, mqtt::message& om, Message& msg, Response& rep)
  124. {
  125. detail::ignore_unused(ec, caller_ptr, caller, om, msg, rep);
  126. ASIO2_ASSERT(false);
  127. }
  128. template<class Message>
  129. inline void _before_user_callback(
  130. error_code& ec, std::shared_ptr<caller_t>& caller_ptr, caller_t* caller, mqtt::message& om, Message& msg)
  131. {
  132. detail::ignore_unused(ec, caller_ptr, caller, om, msg);
  133. using message_type [[maybe_unused]] = typename detail::remove_cvref_t<Message>;
  134. if constexpr (std::is_same_v<message_type, mqtt::message>)
  135. {
  136. std::visit([&ec, &caller_ptr, &caller, &om](auto& pm) mutable
  137. {
  138. caller->_before_user_callback_impl(ec, caller_ptr, caller, om, pm);
  139. }, msg.variant());
  140. }
  141. else
  142. {
  143. caller->_before_user_callback_impl(ec, caller_ptr, caller, om, msg);
  144. }
  145. }
  146. template<class Message>
  147. inline void _after_user_callback(
  148. error_code& ec, std::shared_ptr<caller_t>& caller_ptr, caller_t* caller, mqtt::message& om, Message& msg)
  149. {
  150. detail::ignore_unused(ec, caller_ptr, caller, om, msg);
  151. using message_type [[maybe_unused]] = typename detail::remove_cvref_t<Message>;
  152. if constexpr (std::is_same_v<message_type, mqtt::message>)
  153. {
  154. std::visit([&ec, &caller_ptr, &caller, &om](auto& pm) mutable
  155. {
  156. caller->_after_user_callback_impl(ec, caller_ptr, caller, om, pm);
  157. }, msg.variant());
  158. }
  159. else
  160. {
  161. caller->_after_user_callback_impl(ec, caller_ptr, caller, om, msg);
  162. }
  163. }
  164. template<class Message, class Response>
  165. inline void _before_user_callback_with_message(
  166. error_code& ec, std::shared_ptr<caller_t>& caller_ptr, caller_t* caller, mqtt::message& om, Message& msg, Response& rep)
  167. {
  168. detail::ignore_unused(ec, caller_ptr, caller, om, msg, rep);
  169. using message_type [[maybe_unused]] = typename detail::remove_cvref_t<Message>;
  170. using response_type [[maybe_unused]] = typename detail::remove_cvref_t<Response>;
  171. if constexpr (std::is_same_v<response_type, mqtt::message>)
  172. {
  173. if (!rep.empty())
  174. {
  175. std::visit([&ec, &caller_ptr, &caller, &om, &rep](auto& pm) mutable
  176. {
  177. std::visit([&ec, &caller_ptr, &caller, &om, &pm](auto& pr) mutable
  178. {
  179. caller->_before_user_callback_impl(ec, caller_ptr, caller, om, pm, pr);
  180. }, rep.variant());
  181. }, msg.variant());
  182. }
  183. }
  184. else
  185. {
  186. std::visit([&ec, &caller_ptr, &caller, &om, &rep](auto& pm) mutable
  187. {
  188. caller->_before_user_callback_impl(ec, caller_ptr, caller, om, pm, rep);
  189. }, msg.variant());
  190. }
  191. }
  192. template<class Message, class Response>
  193. inline void _before_user_callback_with_packet(
  194. error_code& ec, std::shared_ptr<caller_t>& caller_ptr, caller_t* caller, mqtt::message& om, Message& msg, Response& rep)
  195. {
  196. detail::ignore_unused(ec, caller_ptr, caller, om, msg, rep);
  197. using message_type [[maybe_unused]] = typename detail::remove_cvref_t<Message>;
  198. using response_type [[maybe_unused]] = typename detail::remove_cvref_t<Response>;
  199. if constexpr (std::is_same_v<response_type, mqtt::message>)
  200. {
  201. if (!rep.empty())
  202. {
  203. std::visit([&ec, &caller_ptr, &caller, &om, &msg](auto& pr) mutable
  204. {
  205. caller->_before_user_callback_impl(ec, caller_ptr, caller, om, msg, pr);
  206. }, rep.variant());
  207. }
  208. }
  209. else
  210. {
  211. caller->_before_user_callback_impl(ec, caller_ptr, caller, om, msg, rep);
  212. }
  213. }
  214. template<class Message, class Response>
  215. inline void _before_user_callback(
  216. error_code& ec, std::shared_ptr<caller_t>& caller_ptr, caller_t* caller, mqtt::message& om, Message& msg, Response& rep)
  217. {
  218. using message_type [[maybe_unused]] = typename detail::remove_cvref_t<Message>;
  219. using response_type [[maybe_unused]] = typename detail::remove_cvref_t<Response>;
  220. if constexpr (std::is_same_v<message_type, mqtt::message>)
  221. {
  222. this->_before_user_callback_with_message(ec, caller_ptr, caller, om, msg, rep);
  223. }
  224. else
  225. {
  226. this->_before_user_callback_with_packet(ec, caller_ptr, caller, om, msg, rep);
  227. }
  228. }
  229. template<class Message, class Response>
  230. inline void _after_user_callback_with_message(
  231. error_code& ec, std::shared_ptr<caller_t>& caller_ptr, caller_t* caller, mqtt::message& om, Message& msg, Response& rep)
  232. {
  233. detail::ignore_unused(ec, caller_ptr, caller, om, msg, rep);
  234. using message_type [[maybe_unused]] = typename detail::remove_cvref_t<Message>;
  235. using response_type [[maybe_unused]] = typename detail::remove_cvref_t<Response>;
  236. if constexpr (std::is_same_v<response_type, mqtt::message>)
  237. {
  238. if (!rep.empty())
  239. {
  240. std::visit([&ec, &caller_ptr, &caller, &om, &rep](auto& pm) mutable
  241. {
  242. std::visit([&ec, &caller_ptr, &caller, &om, &pm](auto& pr) mutable
  243. {
  244. caller->_after_user_callback_impl(ec, caller_ptr, caller, om, pm, pr);
  245. }, rep.variant());
  246. }, msg.variant());
  247. }
  248. }
  249. else
  250. {
  251. std::visit([&ec, &caller_ptr, &caller, &om, &rep](auto& pm) mutable
  252. {
  253. caller->_after_user_callback_impl(ec, caller_ptr, caller, om, pm, rep);
  254. }, msg.variant());
  255. }
  256. }
  257. template<class Message, class Response>
  258. inline void _after_user_callback_with_packet(
  259. error_code& ec, std::shared_ptr<caller_t>& caller_ptr, caller_t* caller, mqtt::message& om, Message& msg, Response& rep)
  260. {
  261. detail::ignore_unused(ec, caller_ptr, caller, om, msg, rep);
  262. using message_type [[maybe_unused]] = typename detail::remove_cvref_t<Message>;
  263. using response_type [[maybe_unused]] = typename detail::remove_cvref_t<Response>;
  264. if constexpr (std::is_same_v<response_type, mqtt::message>)
  265. {
  266. if (!rep.empty())
  267. {
  268. std::visit([&ec, &caller_ptr, &caller, &om, &msg](auto& pr) mutable
  269. {
  270. caller->_after_user_callback_impl(ec, caller_ptr, caller, om, msg, pr);
  271. }, rep.variant());
  272. }
  273. }
  274. else
  275. {
  276. caller->_after_user_callback_impl(ec, caller_ptr, caller, om, msg, rep);
  277. }
  278. }
  279. template<class Message, class Response>
  280. inline void _after_user_callback(
  281. error_code& ec, std::shared_ptr<caller_t>& caller_ptr, caller_t* caller, mqtt::message& om, Message& msg, Response& rep)
  282. {
  283. using message_type [[maybe_unused]] = typename detail::remove_cvref_t<Message>;
  284. using response_type [[maybe_unused]] = typename detail::remove_cvref_t<Response>;
  285. if constexpr (std::is_same_v<message_type, mqtt::message>)
  286. {
  287. this->_after_user_callback_with_message(ec, caller_ptr, caller, om, msg, rep);
  288. }
  289. else
  290. {
  291. this->_after_user_callback_with_packet(ec, caller_ptr, caller, om, msg, rep);
  292. }
  293. }
  294. };
  295. }
  296. #include <asio2/base/detail/pop_options.hpp>
  297. #endif // !__ASIO2_MQTT_HANDLER_HPP__