aop_unsuback.hpp 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  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_AOP_UNSUBACK_HPP__
  11. #define __ASIO2_MQTT_AOP_UNSUBACK_HPP__
  12. #if defined(_MSC_VER) && (_MSC_VER >= 1200)
  13. #pragma once
  14. #endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
  15. #include <asio2/base/iopool.hpp>
  16. #include <asio2/base/detail/function_traits.hpp>
  17. #include <asio2/base/detail/util.hpp>
  18. #include <asio2/mqtt/message.hpp>
  19. namespace asio2::detail
  20. {
  21. template<class caller_t, class args_t>
  22. class mqtt_aop_unsuback
  23. {
  24. friend caller_t;
  25. protected:
  26. // must be server
  27. template<class Message, bool IsClient = args_t::is_client>
  28. inline std::enable_if_t<!IsClient, void>
  29. _after_unsuback_callback(
  30. error_code& ec, std::shared_ptr<caller_t>& caller_ptr, caller_t* caller, mqtt::message& om,
  31. Message& msg)
  32. {
  33. detail::ignore_unused(ec, caller_ptr, caller, om, msg);
  34. ASIO2_ASSERT(false && "server should't recv the unsuback message");
  35. // if server recvd unsuback message, disconnect
  36. ec = mqtt::make_error_code(mqtt::error::malformed_packet);
  37. }
  38. template<class Message, bool IsClient = args_t::is_client>
  39. inline std::enable_if_t<IsClient, void>
  40. _after_unsuback_callback(
  41. error_code& ec, std::shared_ptr<caller_t>& caller_ptr, caller_t* caller, mqtt::message& om,
  42. Message& msg)
  43. {
  44. detail::ignore_unused(ec, caller_ptr, caller, om, msg);
  45. using message_type [[maybe_unused]] = typename detail::remove_cvref_t<Message>;
  46. using key_type = std::pair<mqtt::control_packet_type, mqtt::two_byte_integer::value_type>;
  47. key_type key{ mqtt::control_packet_type::unsubscribe, msg.packet_id() };
  48. if (auto it = caller->unsubscribed_topics_.find(key); it != caller->unsubscribed_topics_.end())
  49. {
  50. mqtt::utf8_string_set& topics = it->second;
  51. topics.for_each([caller](mqtt::utf8_string& topic) mutable
  52. {
  53. caller->subs_map().erase(topic, "");
  54. });
  55. caller->unsubscribed_topics_.erase(it);
  56. }
  57. }
  58. // must be client
  59. inline void _before_user_callback_impl(
  60. error_code& ec, std::shared_ptr<caller_t>& caller_ptr, caller_t* caller, mqtt::message& om,
  61. mqtt::v3::unsuback& msg)
  62. {
  63. detail::ignore_unused(ec, caller_ptr, caller, om, msg);
  64. }
  65. // must be client
  66. inline void _before_user_callback_impl(
  67. error_code& ec, std::shared_ptr<caller_t>& caller_ptr, caller_t* caller, mqtt::message& om,
  68. mqtt::v4::unsuback& msg)
  69. {
  70. detail::ignore_unused(ec, caller_ptr, caller, om, msg);
  71. }
  72. // must be client
  73. inline void _before_user_callback_impl(
  74. error_code& ec, std::shared_ptr<caller_t>& caller_ptr, caller_t* caller, mqtt::message& om,
  75. mqtt::v5::unsuback& msg)
  76. {
  77. detail::ignore_unused(ec, caller_ptr, caller, om, msg);
  78. }
  79. inline void _after_user_callback_impl(
  80. error_code& ec, std::shared_ptr<caller_t>& caller_ptr, caller_t* caller, mqtt::message& om,
  81. mqtt::v3::unsuback& msg)
  82. {
  83. if (_after_unsuback_callback(ec, caller_ptr, caller, om, msg); ec)
  84. return;
  85. }
  86. inline void _after_user_callback_impl(
  87. error_code& ec, std::shared_ptr<caller_t>& caller_ptr, caller_t* caller, mqtt::message& om,
  88. mqtt::v4::unsuback& msg)
  89. {
  90. if (_after_unsuback_callback(ec, caller_ptr, caller, om, msg); ec)
  91. return;
  92. }
  93. inline void _after_user_callback_impl(
  94. error_code& ec, std::shared_ptr<caller_t>& caller_ptr, caller_t* caller, mqtt::message& om,
  95. mqtt::v5::unsuback& msg)
  96. {
  97. if (_after_unsuback_callback(ec, caller_ptr, caller, om, msg); ec)
  98. return;
  99. }
  100. };
  101. }
  102. #endif // !__ASIO2_MQTT_AOP_UNSUBACK_HPP__