/* * Copyright (c) 2017-2023 zhllxt * * author : zhllxt * email : 37792738@qq.com * * Distributed under the Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) */ #ifndef __ASIO2_MQTT_HANDLER_HPP__ #define __ASIO2_MQTT_HANDLER_HPP__ #if defined(_MSC_VER) && (_MSC_VER >= 1200) #pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace asio2::detail { ASIO2_CLASS_FORWARD_DECLARE_BASE; ASIO2_CLASS_FORWARD_DECLARE_TCP_BASE; ASIO2_CLASS_FORWARD_DECLARE_TCP_SERVER; ASIO2_CLASS_FORWARD_DECLARE_TCP_SESSION; ASIO2_CLASS_FORWARD_DECLARE_TCP_CLIENT; template class mqtt_handler_t : public mqtt_aop_auth , public mqtt_aop_connack , public mqtt_aop_connect , public mqtt_aop_disconnect , public mqtt_aop_pingreq , public mqtt_aop_pingresp , public mqtt_aop_puback , public mqtt_aop_pubcomp , public mqtt_aop_publish , public mqtt_aop_pubrec , public mqtt_aop_pubrel , public mqtt_aop_suback , public mqtt_aop_subscribe , public mqtt_aop_unsuback , public mqtt_aop_unsubscribe { friend caller_t; ASIO2_CLASS_FRIEND_DECLARE_BASE; ASIO2_CLASS_FRIEND_DECLARE_TCP_BASE; ASIO2_CLASS_FRIEND_DECLARE_TCP_SERVER; ASIO2_CLASS_FRIEND_DECLARE_TCP_SESSION; ASIO2_CLASS_FRIEND_DECLARE_TCP_CLIENT; protected: using mqtt_aop_auth ::_before_user_callback_impl; using mqtt_aop_connack ::_before_user_callback_impl; using mqtt_aop_connect ::_before_user_callback_impl; using mqtt_aop_disconnect ::_before_user_callback_impl; using mqtt_aop_pingreq ::_before_user_callback_impl; using mqtt_aop_pingresp ::_before_user_callback_impl; using mqtt_aop_puback ::_before_user_callback_impl; using mqtt_aop_pubcomp ::_before_user_callback_impl; using mqtt_aop_publish ::_before_user_callback_impl; using mqtt_aop_pubrec ::_before_user_callback_impl; using mqtt_aop_pubrel ::_before_user_callback_impl; using mqtt_aop_suback ::_before_user_callback_impl; using mqtt_aop_subscribe ::_before_user_callback_impl; using mqtt_aop_unsuback ::_before_user_callback_impl; using mqtt_aop_unsubscribe::_before_user_callback_impl; using mqtt_aop_auth ::_after_user_callback_impl; using mqtt_aop_connack ::_after_user_callback_impl; using mqtt_aop_connect ::_after_user_callback_impl; using mqtt_aop_disconnect ::_after_user_callback_impl; using mqtt_aop_pingreq ::_after_user_callback_impl; using mqtt_aop_pingresp ::_after_user_callback_impl; using mqtt_aop_puback ::_after_user_callback_impl; using mqtt_aop_pubcomp ::_after_user_callback_impl; using mqtt_aop_publish ::_after_user_callback_impl; using mqtt_aop_pubrec ::_after_user_callback_impl; using mqtt_aop_pubrel ::_after_user_callback_impl; using mqtt_aop_suback ::_after_user_callback_impl; using mqtt_aop_subscribe ::_after_user_callback_impl; using mqtt_aop_unsuback ::_after_user_callback_impl; using mqtt_aop_unsubscribe::_after_user_callback_impl; template inline void _before_user_callback_impl( error_code& ec, std::shared_ptr& caller_ptr, caller_t* caller, mqtt::message& om, Message& msg) { detail::ignore_unused(ec, caller_ptr, caller, om, msg); ASIO2_ASSERT(false); } template inline void _after_user_callback_impl( error_code& ec, std::shared_ptr& caller_ptr, caller_t* caller, mqtt::message& om, Message& msg) { detail::ignore_unused(ec, caller_ptr, caller, om, msg); ASIO2_ASSERT(false); } template inline void _before_user_callback_impl( error_code& ec, std::shared_ptr& caller_ptr, caller_t* caller, mqtt::message& om, Message& msg, Response& rep) { detail::ignore_unused(ec, caller_ptr, caller, om, msg, rep); ASIO2_ASSERT(false); } template inline void _after_user_callback_impl( error_code& ec, std::shared_ptr& caller_ptr, caller_t* caller, mqtt::message& om, Message& msg, Response& rep) { detail::ignore_unused(ec, caller_ptr, caller, om, msg, rep); ASIO2_ASSERT(false); } template inline void _before_user_callback( error_code& ec, std::shared_ptr& caller_ptr, caller_t* caller, mqtt::message& om, Message& msg) { detail::ignore_unused(ec, caller_ptr, caller, om, msg); using message_type [[maybe_unused]] = typename detail::remove_cvref_t; if constexpr (std::is_same_v) { std::visit([&ec, &caller_ptr, &caller, &om](auto& pm) mutable { caller->_before_user_callback_impl(ec, caller_ptr, caller, om, pm); }, msg.variant()); } else { caller->_before_user_callback_impl(ec, caller_ptr, caller, om, msg); } } template inline void _after_user_callback( error_code& ec, std::shared_ptr& caller_ptr, caller_t* caller, mqtt::message& om, Message& msg) { detail::ignore_unused(ec, caller_ptr, caller, om, msg); using message_type [[maybe_unused]] = typename detail::remove_cvref_t; if constexpr (std::is_same_v) { std::visit([&ec, &caller_ptr, &caller, &om](auto& pm) mutable { caller->_after_user_callback_impl(ec, caller_ptr, caller, om, pm); }, msg.variant()); } else { caller->_after_user_callback_impl(ec, caller_ptr, caller, om, msg); } } template inline void _before_user_callback_with_message( error_code& ec, std::shared_ptr& caller_ptr, caller_t* caller, mqtt::message& om, Message& msg, Response& rep) { detail::ignore_unused(ec, caller_ptr, caller, om, msg, rep); using message_type [[maybe_unused]] = typename detail::remove_cvref_t; using response_type [[maybe_unused]] = typename detail::remove_cvref_t; if constexpr (std::is_same_v) { if (!rep.empty()) { std::visit([&ec, &caller_ptr, &caller, &om, &rep](auto& pm) mutable { std::visit([&ec, &caller_ptr, &caller, &om, &pm](auto& pr) mutable { caller->_before_user_callback_impl(ec, caller_ptr, caller, om, pm, pr); }, rep.variant()); }, msg.variant()); } } else { std::visit([&ec, &caller_ptr, &caller, &om, &rep](auto& pm) mutable { caller->_before_user_callback_impl(ec, caller_ptr, caller, om, pm, rep); }, msg.variant()); } } template inline void _before_user_callback_with_packet( error_code& ec, std::shared_ptr& caller_ptr, caller_t* caller, mqtt::message& om, Message& msg, Response& rep) { detail::ignore_unused(ec, caller_ptr, caller, om, msg, rep); using message_type [[maybe_unused]] = typename detail::remove_cvref_t; using response_type [[maybe_unused]] = typename detail::remove_cvref_t; if constexpr (std::is_same_v) { if (!rep.empty()) { std::visit([&ec, &caller_ptr, &caller, &om, &msg](auto& pr) mutable { caller->_before_user_callback_impl(ec, caller_ptr, caller, om, msg, pr); }, rep.variant()); } } else { caller->_before_user_callback_impl(ec, caller_ptr, caller, om, msg, rep); } } template inline void _before_user_callback( error_code& ec, std::shared_ptr& caller_ptr, caller_t* caller, mqtt::message& om, Message& msg, Response& rep) { using message_type [[maybe_unused]] = typename detail::remove_cvref_t; using response_type [[maybe_unused]] = typename detail::remove_cvref_t; if constexpr (std::is_same_v) { this->_before_user_callback_with_message(ec, caller_ptr, caller, om, msg, rep); } else { this->_before_user_callback_with_packet(ec, caller_ptr, caller, om, msg, rep); } } template inline void _after_user_callback_with_message( error_code& ec, std::shared_ptr& caller_ptr, caller_t* caller, mqtt::message& om, Message& msg, Response& rep) { detail::ignore_unused(ec, caller_ptr, caller, om, msg, rep); using message_type [[maybe_unused]] = typename detail::remove_cvref_t; using response_type [[maybe_unused]] = typename detail::remove_cvref_t; if constexpr (std::is_same_v) { if (!rep.empty()) { std::visit([&ec, &caller_ptr, &caller, &om, &rep](auto& pm) mutable { std::visit([&ec, &caller_ptr, &caller, &om, &pm](auto& pr) mutable { caller->_after_user_callback_impl(ec, caller_ptr, caller, om, pm, pr); }, rep.variant()); }, msg.variant()); } } else { std::visit([&ec, &caller_ptr, &caller, &om, &rep](auto& pm) mutable { caller->_after_user_callback_impl(ec, caller_ptr, caller, om, pm, rep); }, msg.variant()); } } template inline void _after_user_callback_with_packet( error_code& ec, std::shared_ptr& caller_ptr, caller_t* caller, mqtt::message& om, Message& msg, Response& rep) { detail::ignore_unused(ec, caller_ptr, caller, om, msg, rep); using message_type [[maybe_unused]] = typename detail::remove_cvref_t; using response_type [[maybe_unused]] = typename detail::remove_cvref_t; if constexpr (std::is_same_v) { if (!rep.empty()) { std::visit([&ec, &caller_ptr, &caller, &om, &msg](auto& pr) mutable { caller->_after_user_callback_impl(ec, caller_ptr, caller, om, msg, pr); }, rep.variant()); } } else { caller->_after_user_callback_impl(ec, caller_ptr, caller, om, msg, rep); } } template inline void _after_user_callback( error_code& ec, std::shared_ptr& caller_ptr, caller_t* caller, mqtt::message& om, Message& msg, Response& rep) { using message_type [[maybe_unused]] = typename detail::remove_cvref_t; using response_type [[maybe_unused]] = typename detail::remove_cvref_t; if constexpr (std::is_same_v) { this->_after_user_callback_with_message(ec, caller_ptr, caller, om, msg, rep); } else { this->_after_user_callback_with_packet(ec, caller_ptr, caller, om, msg, rep); } } }; } #include #endif // !__ASIO2_MQTT_HANDLER_HPP__