285 {
286 bool sendDisconnectFlag = true;
287
288 if (connack.getReturnCode() == 0) {
290 VLOG(0) << "MQTT Subscribe";
291
292 try {
293 std::list<iot::mqtt::Topic> topicList;
296 std::back_inserter(topicList),
297 [
qoSDefault = this->qoSDefault](
const std::string& compositTopic) -> iot::mqtt::Topic {
298 std::size_t pos = compositTopic.rfind("##");
299
300 const std::string topic = compositTopic.substr(0, pos);
301 uint8_t qoS = qoSDefault;
302
303 if (pos != std::string::npos) {
304 try {
305 qoS = getQos(compositTopic.substr(pos + 2));
306 } catch (const std::logic_error& error) {
307 VLOG(0) << "[" << Color::Code::FG_RED << "Error" << Color::Code::FG_DEFAULT
308 << "] Malformed composit topic: " << compositTopic << "\n"
309 << error.what();
310 throw;
311 }
312 }
313 VLOG(0) << " t: " << static_cast<int>(qoS) << " | " << topic;
314 return iot::mqtt::Topic(topic, qoS);
315 });
316 sendSubscribe(topicList);
317
318 sendDisconnectFlag = false;
319 } catch (const std::logic_error&) {
320 }
321 }
322
324 VLOG(0) << "MQTT Publish";
325
326 std::size_t pos =
pubTopic.rfind(
"##");
327
328 const std::string topic =
pubTopic.substr(0, pos);
329
331
332 try {
333 if (pos != std::string::npos) {
334 try {
336 } catch (const std::logic_error& error) {
337 VLOG(0) << "[" << Color::Code::FG_RED << "Error" << Color::Code::FG_DEFAULT
338 <<
"] Malformed composit topic: " <<
pubTopic <<
"\n"
339 << error.what();
340 throw;
341 }
342 }
344
345 sendDisconnectFlag = qoS > 0 ? false : sendDisconnectFlag;
346 } catch (const std::logic_error&) {
347 }
348 }
349 if (sendDisconnectFlag) {
350 sendDisconnect();
351 }
352 } else {
353 sendDisconnect();
354 }
355 }
static uint8_t getQos(const std::string &qoSString)