uint16_t Topics::createTopic(string* topic){ if (!getTopic(topic)){ if ( _cnt < MAX_TOPIC_COUNT){ Topic* tp = new Topic(); tp->setTopicName(*topic); if(tp->getTopicLength() == 2){ uint16_t id = getUint16((uint8_t*)tp->getTopicName()); tp->setTopicId(id); }else{ tp->setTopicId(getNextTopicId()); } _topics.push_back(tp); _cnt++; return _nextTopicId; }else{ return 0; } }else{ return getTopicId(topic); } }
/*------------------------------------------------------- * Upstream MQTTSnPublish -------------------------------------------------------*/ void GatewayControlTask::handleSnPublish(Event* ev, ClientNode* clnode, MQTTSnMessage* msg){ printf(BLUE_FORMAT2, currentDateTime(), "PUBLISH", LEFTARROW, clnode->getNodeId()->c_str(), msgPrint(msg)); MQTTSnPublish* sPublish = new MQTTSnPublish(); MQTTPublish* mqMsg = new MQTTPublish(); sPublish->absorb(msg); Topic* tp = clnode->getTopics()->getTopic(sPublish->getTopicId()); if(tp || ((sPublish->getFlags() && MQTTSN_TOPIC_TYPE) == MQTTSN_TOPIC_TYPE_SHORT)){ if(tp){ mqMsg->setTopic(tp->getTopicName()); }else{ string str; mqMsg->setTopic(sPublish->getTopic(&str)); } if(sPublish->getMsgId()){ MQTTSnPubAck* sPuback = new MQTTSnPubAck(); sPuback->setMsgId(sPublish->getMsgId()); sPuback->setTopicId(sPublish->getTopicId()); if(clnode->getWaitedPubAck()){ delete clnode->getWaitedPubAck(); } clnode->setWaitedPubAck(sPuback); mqMsg->setMessageId(sPublish->getMsgId()); } mqMsg->setQos(sPublish->getQos()); if(sPublish->getFlags() && MQTTSN_FLAG_DUP){ mqMsg->setDup(); } if(sPublish->getFlags() && MQTTSN_FLAG_RETAIN){ mqMsg->setRetain(); } mqMsg->setPayload(sPublish->getData() , sPublish->getDataLength()); clnode->setBrokerSendMessage(mqMsg); Event* ev1 = new Event(); ev1->setBrokerSendEvent(clnode); _res->getBrokerSendQue()->post(ev1); }else{ if(sPublish->getMsgId()){ MQTTSnPubAck* sPuback = new MQTTSnPubAck(); sPuback->setMsgId(sPublish->getMsgId()); sPuback->setTopicId(sPublish->getTopicId()); sPuback->setReturnCode(MQTTSN_RC_REJECTED_INVALID_TOPIC_ID); clnode->setClientSendMessage(sPuback); Event* ev1 = new Event(); ev1->setClientSendEvent(clnode); printf(BLUE_FORMAT1, currentDateTime(), "PUBACK", RIGHTARROW, clnode->getNodeId()->c_str(), msgPrint(sPuback)); _res->getClientSendQue()->post(ev1); // Send PubAck INVALID_TOPIC_ID } } delete sPublish; }