/*------------------------------------------------------- Upstream MQTTSnUnsubscribe -------------------------------------------------------*/ void GatewayControlTask::handleSnUnsubscribe(Event* ev, ClientNode* clnode, MQTTSnMessage* msg){ printf(FORMAT2, currentDateTime(), "UNSUBSCRIBE", LEFTARROW, clnode->getNodeId()->c_str(), msgPrint(msg)); MQTTSnUnsubscribe* sUnsubscribe = new MQTTSnUnsubscribe(); MQTTUnsubscribe* unsubscribe = new MQTTUnsubscribe(); sUnsubscribe->absorb(msg); uint8_t topicIdType = sUnsubscribe->getFlags() & 0x03; unsubscribe->setMessageId(sUnsubscribe->getMsgId()); if(topicIdType != MQTTSN_FLAG_TOPICID_TYPE_RESV){ if(topicIdType == MQTTSN_FLAG_TOPICID_TYPE_SHORT){ unsubscribe->setTopicName(sUnsubscribe->getTopicName()); // TopicName }else if(clnode->getTopics()->getTopic(sUnsubscribe->getTopicId())){ if(topicIdType == MQTTSN_FLAG_TOPICID_TYPE_PREDEFINED) goto uslbl1; unsubscribe->setTopicName(sUnsubscribe->getTopicName()); } clnode->setBrokerSendMessage(unsubscribe); Event* ev1 = new Event(); ev1->setBrokerSendEvent(clnode); _res->getBrokerSendQue()->post(ev1); // UNSUBSCRIBE to Broker delete sUnsubscribe; return; } /*-- Irregular TopicIdType or MQTTSN_FLAG_TOPICID_TYPE_PREDEFINED --*/ uslbl1: if(sUnsubscribe->getMsgId()){ MQTTSnUnsubAck* sUnsuback = new MQTTSnUnsubAck(); sUnsuback->setMsgId(sUnsubscribe->getMsgId()); clnode->setClientSendMessage(sUnsuback); Event* evun = new Event(); evun->setClientSendEvent(clnode); printf(FORMAT1, currentDateTime(), "UNSUBACK", RIGHTARROW, clnode->getNodeId()->c_str(), msgPrint(sUnsuback)); _res->getClientSendQue()->post(evun); // Send UNSUBACK to Client } delete sUnsubscribe; }