[Retain] Fix bug in last retained msg and add retain commands to tinytests

This commit is contained in:
Francois BIOT
2023-04-17 02:40:15 +02:00
parent 42d89cdf06
commit 6b9d764c23
3 changed files with 44 additions and 9 deletions

View File

@@ -957,14 +957,19 @@ void MqttBroker::retainDrop()
void MqttBroker::retain(const Topic& topic, const MqttMessage& msg)
{
debug("MqttBroker::retain msg_type=" << _HEX(msg.type()));
debug("MqttBroker::retain msg_type=" << _HEX(msg.type()) << ", retain_size=" << retain_size);
if (retain_size==0 or msg.type() != MqttMessage::Publish) return;
if (msg.flags() & 1) // flag RETAIN
{
debug(" retaining " << topic.str());
if (retained.find(topic) == retained.end()) retainDrop();
auto old = retained.find(topic);
if (old == retained.end())
retainDrop();
else
retained.erase(old);
// FIXME if payload size == 0 remove message from retained
Retain r(micros(), msg);
r.msg.retained();
retained.insert({ topic, std::move(r)});
}
}

View File

@@ -133,6 +133,7 @@ class MqttMessage
const char* end() const { return &buffer[0]+buffer.size(); }
const char* getVHeader() const { return &buffer[vheader]; }
void complete() { encodeLength(); }
void retained() { if ((buffer[0] & 0xF)==Publish) buffer[0] |= 1; }
void reset();
@@ -346,7 +347,9 @@ class MqttBroker
bool connected() const { return remote_broker ? remote_broker->connected() : false; }
size_t clientsCount() const { return clients.size(); }
void retain(uint8_t size) { retain_size = size; }
uint8_t retain() { return retain_size; }
void retain(uint8_t size) { retain_size = size; if (size==0) retained.clear(); }
uint8_t retainCount() const { return retained.size(); }
void dump(string indent="")
{