BugFix: Wild card of Topic + and # handling.

Signed-off-by: tomoaki <tomoaki@tomy-tech.com>
This commit is contained in:
tomoaki
2017-01-17 15:36:02 +09:00
parent bd59fca1a2
commit e05d205843
4 changed files with 19 additions and 15 deletions

View File

@@ -49,6 +49,7 @@ void MQTTGWPublishHandler::handlePublish(Client* client, MQTTGWPacket* packet)
/* create MQTTSN_topicid */
MQTTSN_topicid topicId;
uint16_t id = 0;
if (pub.topiclen == 2)
{
@@ -61,11 +62,14 @@ void MQTTGWPublishHandler::handlePublish(Client* client, MQTTGWPacket* packet)
topicId.type = MQTTSN_TOPIC_TYPE_NORMAL;
topicId.data.long_.len = pub.topiclen;
topicId.data.long_.name = pub.topic;
unsigned short id = client->getTopics()->getTopicId(&topicId);
topicId.data.id = id;
id = client->getTopics()->getTopicId(&topicId);
}
if (topicId.data.id == 0)
if (id > 0)
{
topicId.data.id = id;
}
else
{
/* This message might be subscribed with wild card. */
Topic* topic = client->getTopics()->match(&topicId);
@@ -85,7 +89,7 @@ void MQTTGWPublishHandler::handlePublish(Client* client, MQTTGWPacket* packet)
/* add the Topic and get a TopicId */
topic = client->getTopics()->add(&topicId);
uint16_t id = topic->getTopicId();
id = topic->getTopicId();
if (id > 0)
{

View File

@@ -136,7 +136,7 @@ void BrokerRecvTask::run(void)
client->getNetwork()->close();
delete packet;
/* delete client when the client is not authorized on & session is clean */
/* delete client when the client is not authorized & session is clean */
_gateway->getClientList()->erase(client);
if ( client )

View File

@@ -830,7 +830,7 @@ Topics::~Topics()
}
}
uint16_t Topics::getTopicId(MQTTSN_topicid* topicid)
uint16_t Topics::getTopicId(const MQTTSN_topicid* topicid)
{
if (topicid->type != MQTTSN_TOPIC_TYPE_NORMAL)
{
@@ -863,7 +863,7 @@ Topic* Topics::getTopic(uint16_t id)
return 0;
}
Topic* Topics::getTopic(MQTTSN_topicid* topicid)
Topic* Topics::getTopic(const MQTTSN_topicid* topicid)
{
Topic* p = _first;
while (p)
@@ -877,7 +877,7 @@ Topic* Topics::getTopic(MQTTSN_topicid* topicid)
return 0;
}
Topic* Topics::add(MQTTSN_topicid* topicid)
Topic* Topics::add(const MQTTSN_topicid* topicid)
{
Topic* topic;
uint16_t id = 0;
@@ -901,7 +901,7 @@ Topic* Topics::add(MQTTSN_topicid* topicid)
}
Topic* Topics::add(string* topicName)
Topic* Topics::add(const string* topicName)
{
Topic* topic = 0;
@@ -942,7 +942,7 @@ uint16_t Topics::getNextTopicId()
return ++_nextTopicId == 0xffff ? _nextTopicId += 2 : _nextTopicId;
}
Topic* Topics::match(MQTTSN_topicid* topicid)
Topic* Topics::match(const MQTTSN_topicid* topicid)
{
if (topicid->type != MQTTSN_TOPIC_TYPE_NORMAL)
{

View File

@@ -127,13 +127,13 @@ class Topics
public:
Topics();
~Topics();
Topic* add(MQTTSN_topicid* topicid);
Topic* add(string* topic);
uint16_t getTopicId(MQTTSN_topicid* topic);
Topic* add(const MQTTSN_topicid* topicid);
Topic* add(const string* topic);
uint16_t getTopicId(const MQTTSN_topicid* topic);
uint16_t getNextTopicId();
Topic* getTopic(uint16_t topicId);
Topic* getTopic(MQTTSN_topicid* topicid);
Topic* match(MQTTSN_topicid* topicid);
Topic* getTopic(const MQTTSN_topicid* topicid);
Topic* match(const MQTTSN_topicid* topicid);
private:
uint16_t _nextTopicId;