| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262 |
- /////////////////////////////////////////////////////////////////////////////
- /// @file event.h
- /// Declaration of MQTT event-related classes
- /// @date July 6, 2024
- /// @author Frank Pagliughi
- /////////////////////////////////////////////////////////////////////////////
- /*******************************************************************************
- * Copyright (c) 2024 Frank Pagliughi <fpagliughi@mindspring.com>
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v2.0
- * and Eclipse Distribution License v1.0 which accompany this distribution.
- *
- * The Eclipse Public License is available at
- * http://www.eclipse.org/legal/epl-v20.html
- * and the Eclipse Distribution License is available at
- * http://www.eclipse.org/org/documents/edl-v10.php.
- *
- * Contributors:
- * Frank Pagliughi - initial implementation and documentation
- *******************************************************************************/
- #ifndef __mqtt_event_h
- #define __mqtt_event_h
- #include <variant>
- #include "mqtt/message.h"
- #include "mqtt/properties.h"
- #include "mqtt/reason_code.h"
- #include "mqtt/types.h"
- namespace mqtt {
- /////////////////////////////////////////////////////////////////////////////
- /** Event for when the client is connected/reconnected */
- struct connected_event
- {
- string cause;
- };
- /** Event for when the connection is lost */
- struct connection_lost_event
- {
- string cause;
- };
- /** Event for when we receive a DISCONNECT packet from the server */
- struct disconnected_event
- {
- properties props;
- ReasonCode reasonCode;
- };
- /** Event for when the consumer queue is shutdown from another thread */
- struct shutdown_event
- {
- };
- /* Event for when a message arrives is just a message pointer */
- /////////////////////////////////////////////////////////////////////////////
- /**
- * An MQTT event.
- *
- * This is used by the client consumer to pass events and state changes from
- * the client to the application without the need for any additional
- * callbacks or client queries.
- *
- * Each instance carries the relevant data for specific event that caused
- * it. For example an incoming message event contains a shared pointer to
- * the message that arrived.
- *
- * The supported event types are:
- * @li **message** A message arrived from the server.
- * @li **connected** The client connected. If the client was configured for
- * automatic reconnects, this can be from a reconnection. (No data)
- * @li **connection lost** The client lost the connection. (No data)
- * @li **disconnected** (v5) The client received a DISCONNECT packet from
- * the server. This includes the reason code and properties for the
- * disconnect.
- */
- class event
- {
- public:
- /** The variant type for any possible event. */
- using event_type = std::variant<
- const_message_ptr, connected_event, connection_lost_event, disconnected_event,
- shutdown_event>;
- private:
- event_type evt_{};
- public:
- /**
- * Constructs an empty event.
- * This shows as a message, but the message pointer is null.
- */
- event() {}
- /**
- * Constructs an event from an event type variant.
- * @param evt The event type variant.
- */
- event(event_type evt) : evt_{std::move(evt)} {}
- /**
- * Constructs a message event.
- * @param msg A shared message pointer.
- */
- event(message_ptr msg) : evt_{std::move(msg)} {}
- /**
- * Constructs a message event.
- * @param msg A shared const message pointer.
- */
- event(const_message_ptr msg) : evt_{std::move(msg)} {}
- /**
- * Constructs a 'connected' event.
- * @param evt A connected event.
- */
- event(connected_event evt) : evt_{std::move(evt)} {}
- /**
- * Constructs a 'connection lost' event.
- * @param evt A connection lost event.
- */
- event(connection_lost_event evt) : evt_{std::move(evt)} {}
- /**
- * Constructs a 'disconnected' event.
- * @param evt A disconnected event.
- */
- event(disconnected_event evt) : evt_{std::move(evt)} {}
- /**
- * Constructs a 'shutdown' event.
- * @param evt A shutdown event.
- */
- event(shutdown_event evt) : evt_{std::move(evt)} {}
- /**
- * Copy constructor.
- * @param evt The event to copy.
- */
- event(const event& evt) : evt_{evt.evt_} {}
- /**
- * Move constructor.
- * @param evt The event to move.
- */
- event(event&& evt) : evt_{std::move(evt.evt_)} {}
- /**
- * Assignment from an event type variant.
- * @param evt The event type variant.
- * @return A reference to this object.
- */
- event& operator=(event_type evt) {
- evt_ = std::move(evt);
- return *this;
- }
- /**
- * Copy assignment.
- * @param rhs The event to copy.
- * @return A reference to this object.
- */
- event& operator=(const event& rhs) {
- if (&rhs != this)
- evt_ = rhs.evt_;
- return *this;
- }
- /**
- * Move assignment.
- * @param rhs The event to move.
- * @return A reference to this object.
- */
- event& operator=(event&& rhs) {
- if (&rhs != this)
- evt_ = std::move(rhs.evt_);
- return *this;
- }
- /**
- * Determines if this event is an incoming message.
- * @return @em true if this event is an incoming message, @em false
- * otherwise.
- */
- bool is_message() const { return std::holds_alternative<const_message_ptr>(evt_); }
- /**
- * Determines if this event is a client (re)connection.
- * @return @em true if this event is a client connection, @em false
- * otherwise.
- */
- bool is_connected() const { return std::holds_alternative<connected_event>(evt_); }
- /**
- * Determines if this event is a client connection lost.
- * @return @em true if this event is a client connection lost, @em false
- * otherwise.
- */
- bool is_connection_lost() const {
- return std::holds_alternative<connection_lost_event>(evt_);
- }
- /**
- * Determines if this event is a client disconnected.
- * @return @em true if this event is a client disconnected, @em false
- * otherwise.
- */
- bool is_disconnected() const { return std::holds_alternative<disconnected_event>(evt_); }
- /**
- * Determines if this event is an internal shutdown request.
- * @return @em true if this event is a shutdown request, @em false
- * otherwise.
- */
- bool is_shutdown() const { return std::holds_alternative<disconnected_event>(evt_); }
- /**
- * Determines if this is any type of client disconnect or shutdown.
- * @return @em true if this event is any type of client disconnect such
- * as a 'connection lost', 'disconnected', or shutdown event.
- */
- bool is_any_disconnect() const {
- return std::holds_alternative<connection_lost_event>(evt_) ||
- std::holds_alternative<disconnected_event>(evt_) ||
- std::holds_alternative<shutdown_event>(evt_);
- }
- /**
- * Gets the message from the event, iff this is a message event.
- * @return A message pointer, if this is a message event.
- * @throw std::bad_variant_access if this is not a 'message' event.
- */
- const_message_ptr get_message() { return std::get<const_message_ptr>(evt_); }
- /**
- * Gets the underlying information for a disconnected event iff this is
- * a 'disconnected' event.
- * This contains the reason code and properties that the server sent in
- * the DISCONNECT packet.
- * @return The disconnected event object containing information about
- * why the server disconnected.
- * @throw std::bad_variant_access if this is not a 'disconnected' event.
- */
- disconnected_event get_disconnected() { return std::get<disconnected_event>(evt_); }
- /**
- * Gets a pointer to the message in the event, iff this is a message
- * event.
- * @return A pointer to a message pointer, if this is a message event.
- * Returns nulltr if this is not a message event.
- */
- constexpr std::add_pointer_t<const_message_ptr> get_message_if() noexcept {
- return std::get_if<const_message_ptr>(&evt_);
- }
- /**
- * Gets a pointer the underlying information for a disconnected event,
- * iff this is a 'disconnected' event.
- * This contains the reason code and properties that the server sent in
- * the DISCONNECT packet.
- * @return The disconnected event object containing information about
- * why the server disconnected.
- * @throw std::bad_variant_access if this is not a 'disconnected' event.
- */
- constexpr std::add_pointer_t<disconnected_event> get_disconnected_if() noexcept {
- return std::get_if<disconnected_event>(&evt_);
- }
- };
- /////////////////////////////////////////////////////////////////////////////
- } // namespace mqtt
- #endif // __mqtt_event_h
|