/* * 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) */ #if defined(ASIO2_ENABLE_SSL) || defined(ASIO2_USE_SSL) #ifndef __ASIO2_MQTTS_SERVER_HPP__ #define __ASIO2_MQTTS_SERVER_HPP__ #if defined(_MSC_VER) && (_MSC_VER >= 1200) #pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include #include #include namespace asio2::detail { struct template_args_mqtts_server { static constexpr bool is_session = false; static constexpr bool is_client = false; static constexpr bool is_server = true; }; ASIO2_CLASS_FORWARD_DECLARE_BASE; ASIO2_CLASS_FORWARD_DECLARE_TCP_BASE; ASIO2_CLASS_FORWARD_DECLARE_TCP_SERVER; template class mqtts_server_impl_t : public ssl_context_cp , public mqtt_server_impl_t { ASIO2_CLASS_FRIEND_DECLARE_BASE; ASIO2_CLASS_FRIEND_DECLARE_TCP_BASE; ASIO2_CLASS_FRIEND_DECLARE_TCP_SERVER; public: using super = mqtt_server_impl_t ; using self = mqtts_server_impl_t; using session_type = session_t; public: /** * @brief constructor */ template explicit mqtts_server_impl_t( asio::ssl::context::method method, Args&&... args ) : ssl_context_cp(method) , super(std::forward(args)...) { } /** * @brief constructor */ template explicit mqtts_server_impl_t(Args&&... args) : ssl_context_cp(ASIO2_DEFAULT_SSL_METHOD) , super(std::forward(args)...) { } /** * @brief constructor */ explicit mqtts_server_impl_t() : ssl_context_cp(ASIO2_DEFAULT_SSL_METHOD) , super() { } /** * @brief destructor */ ~mqtts_server_impl_t() { this->stop(); } public: /** * @brief bind ssl handshake listener * @param fun - a user defined callback function. * @param obj - a pointer or reference to a class object, this parameter can be none. * if fun is nonmember function, the obj param must be none, otherwise the obj must be the * the class object's pointer or reference. * Function signature : void(std::shared_ptr& session_ptr) */ template inline derived_t & bind_handshake(F&& fun, C&&... obj) { this->listener_.bind(event_type::handshake, observer_t&>( std::forward(fun), std::forward(obj)...)); return (this->derived()); } protected: template inline std::shared_ptr _make_session(Args&&... args) { return super::_make_session(std::forward(args)..., *this); } }; } namespace asio2 { template using mqtts_server_impl_t = detail::mqtts_server_impl_t; /** * @brief ssl mqtt server * @throws constructor maybe throw exception "Too many open files" (exception code : 24) * asio::error::no_descriptors - Too many open files */ template class mqtts_server_t : public detail::mqtts_server_impl_t, session_t> { public: using detail::mqtts_server_impl_t, session_t>::mqtts_server_impl_t; }; /** * @brief ssl mqtt server * @throws constructor maybe throw exception "Too many open files" (exception code : 24) * asio::error::no_descriptors - Too many open files */ using mqtts_server = mqtts_server_t; } #if defined(ASIO2_INCLUDE_RATE_LIMIT) #include namespace asio2 { template class mqtts_rate_server_t : public asio2::mqtts_server_impl_t, session_t> { public: using asio2::mqtts_server_impl_t, session_t>::mqtts_server_impl_t; }; using mqtts_rate_server = mqtts_rate_server_t; } #endif #include #endif // !__ASIO2_MQTTS_SERVER_HPP__ #endif