Files
2025-07-14 22:24:27 +08:00

161 lines
5.0 KiB
C++

// Copyright 2023 Dexter.Wan. All Rights Reserved.
// EMail: 45141961@qq.com
#ifndef __mqtt_topic_h
#define __mqtt_topic_h
#include "MQTTAsync.h"
#include "delivery_token.h"
#include "subscribe_options.h"
#include "message.h"
#include "types.h"
#include <vector>
namespace mqtt {
class iasync_client;
/////////////////////////////////////////////////////////////////////////////
/**
* Represents a topic destination, used for publish/subscribe messaging.
*/
class topic
{
/** The client to which this topic is connected */
iasync_client& cli_;
/** The topic name */
string name_;
/** The default QoS */
int qos_;
/** The default retined flag */
bool retained_;
public:
/** A smart/shared pointer to this class. */
using ptr_t = std::shared_ptr<topic>;
/** A smart/shared pointer to this class. */
using const_ptr_t = std::shared_ptr<const topic>;
/**
* Construct an MQTT topic destination for messages.
* @param cli Client to which the topic is attached
* @param name The topic string
* @param qos The default QoS for publishing.
* @param retained The default retained flag for the topic.
*/
topic(iasync_client& cli, const string& name,
int qos=message::DFLT_QOS, bool retained=message::DFLT_RETAINED)
: cli_(cli), name_(name), qos_(qos), retained_(retained) {}
/**
* Creates a new topic
* @param cli Client to which the topic is attached
* @param name The topic string
* @param qos The default QoS for publishing.
* @param retained The default retained flag for the topic.
* @return A shared pointer to the topic.
*/
static ptr_t create(iasync_client& cli, const string& name,
int qos=message::DFLT_QOS,
bool retained=message::DFLT_RETAINED) {
return std::make_shared<topic>(cli, name, qos, retained);
}
/**
* Gets a reference to the MQTT client used by this topic
* @return The MQTT client used by this topic
*/
iasync_client& get_client() { return cli_; }
/**
* Gets the name of the topic.
* @return The name of the topic.
*/
const string& get_name() const { return name_; }
/**
* Gets the default quality of service for this topic.
* @return The default quality of service for this topic.
*/
int get_qos() const { return qos_; }
/**
* Gets the default retained flag used for this topic.
* @return The default retained flag used for this topic.
*/
bool get_retained() const { return retained_; }
/**
* Sets the default quality of service for this topic.
* @param qos The default quality of service for this topic.
*/
void set_qos(int qos) {
message::validate_qos(qos);
qos_ = qos;
}
/**
* Sets the default retained flag used for this topic.
* @param retained The default retained flag used for this topic.
*/
void set_retained(bool retained) { retained_ = retained; }
/**
* Publishes a message on the topic using the default QoS and retained
* flag.
* @param payload the bytes to use as the message payload
* @param n the number of bytes in the payload
* @return The delivery token used to track and wait for the publish to
* complete.
*/
delivery_token_ptr publish(const void* payload, size_t n);
/**
* Publishes a message on the topic.
* @param payload the bytes to use as the message payload
* @param n the number of bytes in the payload
* @param qos the Quality of Service to deliver the message at. Valid
* values are 0, 1 or 2.
* @param retained whether or not this message should be retained by the
* server.
* @return The delivery token used to track and wait for the publish to
* complete.
*/
delivery_token_ptr publish(const void* payload, size_t n,
int qos, bool retained);
/**
* Publishes a message on the topic using the default QoS and retained
* flag.
* @param payload the bytes to use as the message payload
* @return The delivery token used to track and wait for the publish to
* complete.
*/
delivery_token_ptr publish(binary_ref payload);
/**
* Publishes a message on the topic.
* @param payload the bytes to use as the message payload
* @param qos the Quality of Service to deliver the message at. Valid
* values are 0, 1 or 2.
* @param retained whether or not this message should be retained by the
* server.
* @return The delivery token used to track and wait for the publish to
* complete.
*/
delivery_token_ptr publish(binary_ref payload, int qos, bool retained);
/**
* Subscribe to the topic.
* @return A token used to track the progress of the operation.
*/
token_ptr subscribe(const subscribe_options& opts=subscribe_options());
/**
* Returns a string representation of this topic.
* @return The name of the topic
*/
string to_string() const { return name_; }
};
/** A smart/shared pointer to a topic object. */
using topic_ptr = topic::ptr_t ;
/** A smart/shared pointer to a const topic object. */
using const_topic_ptr = topic::const_ptr_t ;
/////////////////////////////////////////////////////////////////////////////
// end namespace mqtt
}
#endif // __mqtt_topic_h