SNode.C
Loading...
Searching...
No Matches
iot::mqtt::server::broker::RetainTree::TopicLevel Class Reference
Collaboration diagram for iot::mqtt::server::broker::RetainTree::TopicLevel:

Public Member Functions

 TopicLevel (iot::mqtt::server::broker::Broker *broker)
 
void retain (const Message &message, std::string topic)
 
bool release (std::string topic)
 
void appear (const std::string &clientId, std::string topic, uint8_t qoS)
 
std::list< std::pair< std::string, std::string > > getRetainTree () const
 
TopicLevelfromJson (const nlohmann::json &json)
 
nlohmann::json toJson () const
 
void clear ()
 

Private Member Functions

void appear (const std::string &clientId, uint8_t clientQoS)
 
std::list< std::pair< std::string, std::string > > getRetainTree (const std::string &absoluteTopicLevel) const
 

Private Attributes

Message message
 
std::map< std::string, TopicLevelsubTopicLevels
 
iot::mqtt::server::broker::Brokerbroker = nullptr
 

Detailed Description

Definition at line 82 of file RetainTree.h.

Constructor & Destructor Documentation

◆ TopicLevel()

iot::mqtt::server::broker::RetainTree::TopicLevel::TopicLevel ( iot::mqtt::server::broker::Broker broker)
explicit

Definition at line 101 of file RetainTree.cpp.

102 : broker(broker) {
103 }
iot::mqtt::server::broker::Broker * broker
Definition RetainTree.h:107

Referenced by clear(), fromJson(), retain(), and iot::mqtt::server::broker::RetainTree::RetainTree().

Here is the caller graph for this function:

Member Function Documentation

◆ appear() [1/2]

void iot::mqtt::server::broker::RetainTree::TopicLevel::appear ( const std::string &  clientId,
std::string  topic,
uint8_t  qoS 
)

Definition at line 159 of file RetainTree.cpp.

159 {
160 if (topic.empty()) {
161 if (!message.getTopic().empty()) {
162 LOG(INFO) << "MQTT Broker: Retained Topic found:";
163 LOG(INFO) << "MQTT Broker: Topic: " << message.getTopic();
164 LOG(INFO) << "MQTT Broker: Message:\n" << iot::mqtt::Mqtt::toHexString(message.getMessage());
165 LOG(DEBUG) << "MQTT Broker: QoS: " << static_cast<uint16_t>(message.getQoS());
166 LOG(DEBUG) << "MQTT Broker: Client:";
167 LOG(DEBUG) << "MQTT Broker: QoS: " << static_cast<uint16_t>(qoS);
168
169 LOG(INFO) << "MQTT Broker: Distributing message ...";
170 broker->sendPublish(clientId, message, std::min(message.getQoS(), qoS), true);
171 LOG(INFO) << "MQTT Broker: ... distributing message completed";
172 }
173 } else {
174 const std::string topicLevel = topic.substr(0, topic.find('/'));
175
176 topic.erase(0, topicLevel.size() + 1);
177
178 auto foundNode = subTopicLevels.find(topicLevel);
179 if (foundNode != subTopicLevels.end()) {
180 foundNode->second.appear(clientId, topic, qoS);
181 } else if (topicLevel == "+") {
182 for (auto& [notUsed, topicTree] : subTopicLevels) {
183 topicTree.appear(clientId, topic, qoS);
184 }
185 } else if (topicLevel == "#") {
186 appear(clientId, qoS);
187 }
188 }
189 }
static std::string toHexString(const std::vector< char > &data)
Definition Mqtt.cpp:389
void sendPublish(const std::string &clientId, Message &message, uint8_t qoS, bool retain)
Definition Broker.cpp:237
const std::string & getTopic() const
Definition Message.cpp:66
const std::string & getMessage() const
Definition Message.cpp:74
void appear(const std::string &clientId, std::string topic, uint8_t qoS)
std::map< std::string, TopicLevel > subTopicLevels
Definition RetainTree.h:105

References appear(), appear(), iot::mqtt::server::broker::Message::getMessage(), iot::mqtt::server::broker::Message::getQoS(), iot::mqtt::server::broker::Message::getTopic(), message, iot::mqtt::server::broker::Broker::sendPublish(), subTopicLevels, and iot::mqtt::Mqtt::toHexString().

Referenced by iot::mqtt::server::broker::RetainTree::appear(), and appear().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ appear() [2/2]

void iot::mqtt::server::broker::RetainTree::TopicLevel::appear ( const std::string &  clientId,
uint8_t  clientQoS 
)
private

Definition at line 195 of file RetainTree.cpp.

195 {
196 if (!message.getTopic().empty()) {
197 LOG(INFO) << "MQTT Broker: Retained Topic found:";
198 LOG(INFO) << "MQTT Broker: Topic: " << message.getTopic();
199 LOG(INFO) << "MQTT Broker: Message:\n" << iot::mqtt::Mqtt::toHexString(message.getMessage());
200 LOG(DEBUG) << "MQTT Broker: QoS: " << static_cast<uint16_t>(message.getQoS());
201 LOG(DEBUG) << "MQTT Broker: Client:";
202 LOG(DEBUG) << "MQTT Broker: QoS: " << static_cast<uint16_t>(clientQoS);
203
204 LOG(INFO) << "MQTT Broker: Distributing message ...";
205 broker->sendPublish(clientId, message, std::min(message.getQoS(), clientQoS), true);
206 LOG(INFO) << "MQTT Broker: ... distributing message completed";
207 }
208
209 for (auto& [topicLevel, topicTree] : subTopicLevels) {
210 topicTree.appear(clientId, clientQoS);
211 }
212 }

References appear(), iot::mqtt::server::broker::Message::getMessage(), iot::mqtt::server::broker::Message::getQoS(), iot::mqtt::server::broker::Message::getTopic(), message, iot::mqtt::server::broker::Broker::sendPublish(), subTopicLevels, and iot::mqtt::Mqtt::toHexString().

Referenced by appear(), and appear().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ clear()

void iot::mqtt::server::broker::RetainTree::TopicLevel::clear ( )

Definition at line 243 of file RetainTree.cpp.

243 {
244 *this = TopicLevel(broker);
245 }
TopicLevel(iot::mqtt::server::broker::Broker *broker)

References TopicLevel().

Referenced by iot::mqtt::server::broker::RetainTree::clear().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ fromJson()

RetainTree::TopicLevel & iot::mqtt::server::broker::RetainTree::TopicLevel::fromJson ( const nlohmann::json &  json)

Definition at line 105 of file RetainTree.cpp.

105 {
106 subTopicLevels.clear();
107
108 message.fromJson(json.value("message", nlohmann::json()));
109
110 if (json.contains("topic_level")) {
111 for (const auto& topicLevelItem : json["topic_level"].items()) {
112 subTopicLevels.emplace(topicLevelItem.key(), TopicLevel(broker).fromJson(topicLevelItem.value()));
113 }
114 }
115
116 return *this;
117 }
Message & fromJson(const nlohmann::json &json)
Definition Message.cpp:105
TopicLevel & fromJson(const nlohmann::json &json)

References iot::mqtt::server::broker::Message::fromJson(), fromJson(), message, subTopicLevels, and TopicLevel().

Referenced by iot::mqtt::server::broker::RetainTree::fromJson(), and fromJson().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ getRetainTree() [1/2]

std::list< std::pair< std::string, std::string > > iot::mqtt::server::broker::RetainTree::TopicLevel::getRetainTree ( ) const

Definition at line 191 of file RetainTree.cpp.

191 {
192 return getRetainTree("");
193 }
std::list< std::pair< std::string, std::string > > getRetainTree() const

References getRetainTree().

Referenced by iot::mqtt::server::broker::RetainTree::getRetainedTree().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ getRetainTree() [2/2]

std::list< std::pair< std::string, std::string > > iot::mqtt::server::broker::RetainTree::TopicLevel::getRetainTree ( const std::string &  absoluteTopicLevel) const
private

Definition at line 214 of file RetainTree.cpp.

214 {
215 std::list<std::pair<std::string, std::string>> topicLevelTree;
216 for (const auto& [topicLevelName, nextTopicLevel] : subTopicLevels) {
217 const std::string composedAbsoluteTopicLevelName = absoluteTopicLevel + topicLevelName;
218
219 if (!nextTopicLevel.message.getMessage().empty()) {
220 topicLevelTree.emplace_back(composedAbsoluteTopicLevelName, nextTopicLevel.message.getMessage());
221 }
222
223 topicLevelTree.splice(topicLevelTree.end(), nextTopicLevel.getRetainTree(composedAbsoluteTopicLevelName + "/"));
224 }
225
226 return topicLevelTree;
227 }

References iot::mqtt::server::broker::Message::getMessage(), getRetainTree(), message, and subTopicLevels.

Referenced by getRetainTree(), and getRetainTree().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ release()

bool iot::mqtt::server::broker::RetainTree::TopicLevel::release ( std::string  topic)

Definition at line 135 of file RetainTree.cpp.

135 {
136 if (topic.empty()) {
137 LOG(DEBUG) << "MQTT Broker: Release retained:";
138 LOG(DEBUG) << "MQTT Broker: Topic: " << message.getTopic();
139
140 message = Message();
141 } else {
142 const std::string topicLevel = topic.substr(0, topic.find('/'));
143
144 auto&& it = subTopicLevels.find(topicLevel);
145 if (it != subTopicLevels.end()) {
146 topic.erase(0, topicLevel.size() + 1);
147
148 if (it->second.release(topic)) {
149 LOG(DEBUG) << " Erase: " << topicLevel;
150
151 subTopicLevels.erase(it);
152 }
153 }
154 }
155
156 return subTopicLevels.empty() && message.getMessage().empty();
157 }

References iot::mqtt::server::broker::Message::getMessage(), iot::mqtt::server::broker::Message::getTopic(), iot::mqtt::server::broker::Message::Message(), message, iot::mqtt::server::broker::Message::operator=(), release(), and subTopicLevels.

Referenced by iot::mqtt::server::broker::RetainTree::release(), release(), and iot::mqtt::server::broker::RetainTree::retain().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ retain()

void iot::mqtt::server::broker::RetainTree::TopicLevel::retain ( const Message message,
std::string  topic 
)

Definition at line 118 of file RetainTree.cpp.

118 {
119 if (topic.empty()) {
120 LOG(DEBUG) << "MQTT Broker: Retain:";
121 LOG(DEBUG) << "MQTT Broker: Topic: " << message.getTopic();
122 LOG(DEBUG) << "MQTT Broker: Message:\n" << iot::mqtt::Mqtt::toHexString(message.getMessage());
123 LOG(DEBUG) << "MQTT Broker: QoS: " << static_cast<uint16_t>(message.getQoS());
124
125 this->message = message;
126 } else {
127 const std::string topicLevel = topic.substr(0, topic.find('/'));
128
129 topic.erase(0, topicLevel.size() + 1);
130
131 subTopicLevels.insert({topicLevel, RetainTree::TopicLevel(broker)}).first->second.retain(message, topic);
132 }
133 }

References iot::mqtt::server::broker::Message::getMessage(), iot::mqtt::server::broker::Message::getQoS(), iot::mqtt::server::broker::Message::getTopic(), message, iot::mqtt::server::broker::Message::operator=(), retain(), subTopicLevels, iot::mqtt::Mqtt::toHexString(), and TopicLevel().

Referenced by retain(), and iot::mqtt::server::broker::RetainTree::retain().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ toJson()

nlohmann::json iot::mqtt::server::broker::RetainTree::TopicLevel::toJson ( ) const

Definition at line 229 of file RetainTree.cpp.

229 {
230 nlohmann::json json;
231
232 if (!message.getMessage().empty()) {
233 json["message"] = message.toJson();
234 }
235
236 for (const auto& [topicLevel, topicLevelValue] : subTopicLevels) {
237 json["topic_level"][topicLevel] = topicLevelValue.toJson();
238 }
239
240 return json;
241 }
nlohmann::json toJson() const
Definition Message.cpp:94

References iot::mqtt::server::broker::Message::getMessage(), message, subTopicLevels, iot::mqtt::server::broker::Message::toJson(), and toJson().

Referenced by iot::mqtt::server::broker::RetainTree::toJson(), and toJson().

Here is the call graph for this function:
Here is the caller graph for this function:

Member Data Documentation

◆ broker

iot::mqtt::server::broker::Broker* iot::mqtt::server::broker::RetainTree::TopicLevel::broker = nullptr
private

Definition at line 107 of file RetainTree.h.

◆ message

Message iot::mqtt::server::broker::RetainTree::TopicLevel::message
private

Definition at line 103 of file RetainTree.h.

Referenced by appear(), appear(), fromJson(), getRetainTree(), release(), retain(), and toJson().

◆ subTopicLevels

std::map<std::string, TopicLevel> iot::mqtt::server::broker::RetainTree::TopicLevel::subTopicLevels
private

Definition at line 105 of file RetainTree.h.

Referenced by appear(), appear(), fromJson(), getRetainTree(), release(), retain(), and toJson().


The documentation for this class was generated from the following files: