123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258 |
- /////////////////////////////////////////////////////////////////////////////
- /// @file will_options.h
- /// Declaration of MQTT will_options class
- /// @date Jul 7, 2016
- /// @author Guilherme M. Ferreira
- /////////////////////////////////////////////////////////////////////////////
- /*******************************************************************************
- * Copyright (c) 2016 Guilherme M. Ferreira <guilherme.maciel.ferreira@gmail.com>
- * Copyright (c) 2016-2019 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 v1.0
- * and Eclipse Distribution License v1.0 which accompany this distribution.
- *
- * The Eclipse Public License is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * and the Eclipse Distribution License is available at
- * http://www.eclipse.org/org/documents/edl-v10.php.
- *
- * Contributors:
- * Guilherme M. Ferreira - initial implementation and documentation
- * Frank Pagliughi - added copy & move operations
- *******************************************************************************/
- #ifndef __mqtt_will_options_h
- #define __mqtt_will_options_h
- #include "MQTTAsync.h"
- #include "mqtt/types.h"
- #include "mqtt/message.h"
- #include "mqtt/topic.h"
- namespace mqtt {
- class connect_options;
- /////////////////////////////////////////////////////////////////////////////
- /**
- * Holds the set of options that govern the Last Will and Testament feature.
- *
- * @note
- * This wraps struct v1 of the C library's MQTTAsync_willOptions structure.
- * It sets the LWT binary payload, via the 'payload' struct field, and
- leaves the 'message' field as a nullptr.
- */
- class will_options
- {
- /** The default QoS for the LWT, if unspecified */
- static constexpr int DFLT_QOS = 0;
- /** The defalut retained flag for LWT, if unspecified */
- static constexpr bool DFLT_RETAINED = false;
- /** A default C struct to support re-initializing variables */
- static const MQTTAsync_willOptions DFLT_C_STRUCT;
- /** The underlying C LWT options */
- MQTTAsync_willOptions opts_;
- /** LWT message topic **/
- string_ref topic_;
- /** LWT message text */
- binary_ref payload_;
- /**
- * The properties for the LWT message.
- * Strangely, in the C lib, the will properties are not in the
- * willOptions struct, but are rather in the connectOptions.
- */
- properties props_;
- /** The connect options has special access */
- friend class connect_options;
- friend class connect_options_test;
- friend class will_options_test;
- /**
- * Gets a pointer to the C-language NUL-terminated strings for the
- * struct.
- * Some structs, such as this one, require valid pointers at all times,
- * while others expect NULL pointers for missing parameters.
- * So we always return a pointer to a valid C char array, even when
- * empty.
- * @param str The C++ string object.
- * @return Pointer to a NUL terminated string. This is only valid until
- * the next time the string is updated. This is never nullptr.
- */
- const char* c_str(const string_ref& sr) {
- return sr ? sr.to_string().c_str() : nullptr;
- }
- public:
- /** Smart/shared pointer to this class. */
- using ptr_t = std::shared_ptr<will_options>;
- /** Smart/shared pointer to a const object of this class. */
- using const_ptr_t = std::shared_ptr<const will_options>;
- /**
- * Constructs a new object using the default values.
- */
- will_options();
- /**
- * Sets the "Last Will and Testament" (LWT) for the connection.
- * @param top The LWT message is published to the this topic.
- * @param payload The message that is published to the Will Topic.
- * @param payload_len The message size in bytes
- * @param qos The message Quality of Service.
- * @param retained Tell the broker to keep the LWT message after send to
- * subscribers.
- */
- will_options(string_ref top, const void *payload, size_t payload_len,
- int qos=DFLT_QOS, bool retained=DFLT_RETAINED);
- /**
- * Sets the "Last Will and Testament" (LWT) for the connection.
- * @param top The LWT message is published to the this topic.
- * @param payload The message that is published to the Will Topic.
- * @param payload_len The message size in bytes.
- * @param qos The message Quality of Service.
- * @param retained Tell the broker to keep the LWT message after send to
- * subscribers.
- */
- will_options(const topic& top, const void *payload, size_t payload_len,
- int qos=DFLT_QOS, bool retained=DFLT_RETAINED);
- /**
- * Sets the "Last Will and Testament" (LWT) for the connection.
- * @param top The LWT message is published to the this topic.
- * @param payload The message payload that is published to the Will
- * Topic.
- * @param qos The message Quality of Service.
- * @param retained Tell the broker to keep the LWT message after send to
- * subscribers.
- */
- will_options(string_ref top, binary_ref payload,
- int qos=DFLT_QOS, bool retained=DFLT_RETAINED);
- /**
- * Sets the "Last Will and Testament" (LWT) for the connection.
- * @param top The LWT message is published to the this topic.
- * @param payload The message payload that is published to the Will
- * Topic, as a string.
- * @param qos The message Quality of Service.
- * @param retained Tell the broker to keep the LWT message after send to
- * subscribers.
- */
- will_options(string_ref top, const string& payload,
- int qos=DFLT_QOS, bool retained=DFLT_QOS);
- /**
- * Sets the "Last Will and Testament" (LWT) for the connection.
- * @param msg The message that is published to the Will Topic.
- */
- will_options(const message& msg);
- /**
- * Copy constructor for the LWT options.
- * @param opt The other options.
- */
- will_options(const will_options& opt);
- /**
- * Move constructor for the LWT options.
- * @param opt The other options.
- */
- will_options(will_options&& opt);
- /**
- * Copy assignment for the LWT options.
- * @param opt The other options.
- */
- will_options& operator=(const will_options& opt);
- /**
- * Move assignment for the LWT options.
- * @param opt The other options.
- */
- will_options& operator=(will_options&& opt);
- /**
- * Gets the LWT message topic name.
- * @return The LWT message topic name.
- */
- string get_topic() const { return topic_ ? topic_.to_string() : string(); }
- /**
- * Gets the LWT message payload.
- * @return The LWT message payload.
- */
- const binary_ref& get_payload() const { return payload_; }
- /**
- * Gets the LWT message payload as a string.
- * @return The LWT message payload as a string.
- */
- string get_payload_str() const { return payload_ ? payload_.to_string() : string(); }
- /**
- * Gets the QoS value for the LWT message.
- * @return The QoS value for the LWT message.
- */
- int get_qos() const { return opts_.qos; }
- /**
- * Gets the 'retained' flag for the LWT message.
- * @return The 'retained' flag for the LWT message.
- */
- bool is_retained() const { return opts_.retained != 0; }
- /**
- * Gets the LWT message as a message object.
- * @return A pointer to a copy of the LWT message.
- */
- const_message_ptr get_message() const {
- return message::create(topic_, payload_, opts_.qos, to_bool(opts_.retained));
- }
- /**
- * Sets the LWT message topic name.
- * @param top The topic where to sent the message
- */
- void set_topic(string_ref top);
- /**
- * Sets the LWT message text.
- * @param msg The LWT message
- */
- void set_payload(binary_ref msg);
- /**
- * Sets the LWT message text.
- * @param msg The LWT message
- */
- void set_payload(string msg) { set_payload(binary_ref(std::move(msg))); }
- /**
- * Sets the QoS value.
- * @param qos The LWT message QoS
- */
- void set_qos(const int qos) { opts_.qos = qos; }
- /**
- * Sets the retained flag.
- * @param retained Tell the broker to keep the LWT message after send to
- * subscribers.
- */
- void set_retained(bool retained) { opts_.retained = to_int(retained); }
- /**
- * Gets the connect properties.
- * @return A const reference to the properties for the connect.
- */
- const properties& get_properties() const { return props_; }
- /**
- * Sets the properties for the connect.
- * @param props The properties to place into the message.
- */
- void set_properties(const properties& props) { props_ = props; }
- /**
- * Moves the properties for the connect.
- * @param props The properties to move into the connect object.
- */
- void set_properties(properties&& props) { props_ = props; }
- };
- /** Shared pointer to a will options object. */
- using will_options_ptr = will_options::ptr_t;
- /** Shared pointer to a const will options object. */
- using const_will_options_ptr = will_options::const_ptr_t;
- /////////////////////////////////////////////////////////////////////////////
- // end namespace mqtt
- }
- #endif // __mqtt_will_options_h
|