123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247 |
- /////////////////////////////////////////////////////////////////////////////
- /// @file response_options.h
- /// Implementation of the class 'response_options'
- /// @date 26-Aug-2016
- /////////////////////////////////////////////////////////////////////////////
- #ifndef __mqtt_response_options_h
- #define __mqtt_response_options_h
- #include "MQTTAsync.h"
- #include "mqtt/token.h"
- #include "mqtt/delivery_token.h"
- #include "subscribe_options.h"
- namespace mqtt {
- class token_test;
- /////////////////////////////////////////////////////////////////////////////
- // response_options
- /////////////////////////////////////////////////////////////////////////////
- /**
- * The response options for various asynchronous calls.
- *
- * This is an internal data structure, only used within the library.
- * Therefore it is not totally fleshed out, but rather only exposes the
- * functionality currently required by the library.
- *
- * Note, too, in the C lib, this became a place to add MQTT v5 options for
- * the outgoing calls without breaking the API, so is also referred to as the
- * "call options".
- */
- class response_options
- {
- /** The underlying C structure */
- MQTTAsync_responseOptions opts_;
- /** The token to which we are connected */
- token::weak_ptr_t tok_;
- /** Packet Properties (Subscribe/Unsubscribe) */
- properties props_;
- /** A list of subscription options for subscribe-many */
- std::vector<MQTTSubscribe_options> subOpts_;
- /** The client has special access */
- friend class async_client;
- /** Update the underlying C struct to match our data */
- void update_c_struct();
- public:
- /**
- * Create an empty response object.
- * @param mqttVersion The MQTT version for the response.
- */
- explicit response_options(int mqttVersion=MQTTVERSION_DEFAULT);
- /**
- * Creates a response object with the specified callbacks.
- * @param tok A token to be used as the context.
- * @param mqttVersion The MQTT version for the response.
- */
- response_options(const token_ptr& tok, int mqttVersion=MQTTVERSION_DEFAULT);
- /**
- * Copy constructor.
- * @param other The other options to copy to this one.
- */
- response_options(const response_options& other);
- /**
- * Copy operator.
- * @param rhs The other options to copy to this one.
- */
- response_options& operator=(const response_options& rhs);
- /**
- * Expose the underlying C struct for the unit tests.
- */
- #if defined(UNIT_TESTS)
- const MQTTAsync_responseOptions& c_struct() const { return opts_; }
- #endif
- /**
- * Sets the MQTT protocol version used for the response.
- * This sets up proper callbacks for MQTT v5 or versions prior to that.
- * @param mqttVersion The MQTT version used by the connection.
- */
- void set_mqtt_version(int mqttVersion);
- /**
- * Sets the callback context to a generic token.
- * @param tok The token to be used as the callback context.
- */
- void set_token(const token_ptr& tok);
- /**
- * Sets the properties for the connect.
- * @param props The properties to place into the message.
- */
- void set_properties(const properties& props) {
- props_ = props;
- opts_.properties = props_.c_struct();
- }
- /**
- * Moves the properties for the connect.
- * @param props The properties to move into the connect object.
- */
- void set_properties(properties&& props) {
- props_ = std::move(props);
- opts_.properties = props_.c_struct();
- }
- /**
- * Sets the options for a single topic subscription.
- * @param opts The subscribe options.
- */
- void set_subscribe_options(const subscribe_options& opts);
- /**
- * Sets the options for a multi-topic subscription.
- * @param opts A vector of the subscribe options.
- */
- void set_subscribe_options(const std::vector<subscribe_options>& opts);
- };
- /////////////////////////////////////////////////////////////////////////////
- /**
- * Class to build response options.
- */
- class response_options_builder
- {
- /** The underlying options */
- response_options opts_;
- public:
- /** This class */
- using self = response_options_builder;
- /**
- * Default constructor.
- */
- explicit response_options_builder(int mqttVersion=MQTTVERSION_DEFAULT)
- : opts_(mqttVersion) {}
- /**
- * Sets the MQTT protocol version used for the response.
- * This sets up proper callbacks for MQTT v5 or versions prior to that.
- * @param mqttVersion The MQTT version used by the connection.
- */
- auto mqtt_version(int mqttVersion) -> self& {
- opts_.set_mqtt_version(mqttVersion);
- return *this;
- }
- /**
- * Sets the callback context to a generic token.
- * @param tok The token to be used as the callback context.
- */
- auto token(const token_ptr& tok) -> self& {
- opts_.set_token(tok);
- return *this;
- }
- /**
- * Sets the properties for the response options.
- * @param props The properties for the response options.
- */
- auto properties(mqtt::properties&& props) -> self& {
- opts_.set_properties(std::move(props));
- return *this;
- }
- /**
- * Sets the properties for the disconnect message.
- * @param props The properties for the disconnect message.
- */
- auto properties(const mqtt::properties& props) -> self& {
- opts_.set_properties(props);
- return *this;
- }
- /**
- * Sets the options for a single topic subscription.
- * @param opts The subscribe options.
- */
- auto subscribe_opts(const subscribe_options& opts) -> self& {
- opts_.set_subscribe_options(opts);
- return *this;
- }
- /**
- * Sets the options for a multi-topic subscription.
- * @param opts A vector of the subscribe options.
- */
- auto subscribe_opts(const std::vector<subscribe_options>& opts) -> self& {
- opts_.set_subscribe_options(opts);
- return *this;
- }
- /**
- * Finish building the options and return them.
- * @return The option struct as built.
- */
- response_options finalize() { return opts_; }
- };
- /////////////////////////////////////////////////////////////////////////////
- // delivery_response_options
- /////////////////////////////////////////////////////////////////////////////
- /**
- * The response options for asynchronous calls targeted at delivery.
- * Each of these objects is tied to a specific delivery_token.
- */
- class delivery_response_options
- {
- /** The underlying C structure */
- MQTTAsync_responseOptions opts_;
- /** The delivery token to which we are connected */
- delivery_token::weak_ptr_t dtok_;
- /** The client has special access */
- friend class async_client;
- public:
- /**
- * Create an empty delivery response object.
- */
- delivery_response_options(int mqttVersion=MQTTVERSION_DEFAULT);
- /**
- * Creates a response object tied to the specific delivery token.
- * @param dtok A delivery token to be used as the context.
- * @param mqttVersion The MQTT version for the response
- */
- delivery_response_options(const delivery_token_ptr& dtok,
- int mqttVersion=MQTTVERSION_DEFAULT);
- /**
- * Expose the underlying C struct for the unit tests.
- */
- #if defined(UNIT_TESTS)
- const MQTTAsync_responseOptions& c_struct() const { return opts_; }
- #endif
- /**
- * Sets the callback context to a delivery token.
- * @param dtok The delivery token to be used as the callback context.
- */
- void set_token(const delivery_token_ptr& dtok) {
- dtok_ = dtok;
- opts_.context = dtok.get();
- }
- };
- /////////////////////////////////////////////////////////////////////////////
- // end namespace 'mqtt'
- }
- #endif // __mqtt_response_options_h
|