//-------------------------------------------- mqttsn_return_code_t mqttsn_subscribe_decode(mqttsn_fixed_header_t *fixhdr, mqttsn_subscribe_header_t *subscribe) { mqttsn_flags_decode(&subscribe->flags, &fixhdr->rem_buf[0]); subscribe->msg_id = ntohs(*((uint16_t *)&fixhdr->rem_buf[1])); if (subscribe->flags.topic_id_type == MQTTSN_TOPIC_NAME) { subscribe->name_length = fixhdr->rem_len - 3; subscribe->name = &fixhdr->rem_buf[3]; subscribe->sub_item = list_sub_add_replace(subscribe->sub_list, subscribe->name, subscribe->name_length, subscribe->flags.qos); if (list_sub_has_wildcard(subscribe->sub_item) == 0) subscribe->pub_item = list_pub_add_ignore(subscribe->pub_list, subscribe->name, subscribe->name_length, NULL, 0, 0); #if 0 // maybe it's not needed else subscribe->topic_id = 0; #endif } if (subscribe->flags.topic_id_type == MQTTSN_PREDEF_TOPIC_ID) { subscribe->topic_id = ntohs(*((unsigned short *)&fixhdr->rem_buf[3])); subscribe->pub_item = list_pub_find_topic_id(subscribe->pub_list, subscribe->topic_id); if (subscribe->pub_item == NULL) { dprintf("invalid subtopic, topic_id:%d, qos:%d, msg_id:%d\n", subscribe->topic_id, subscribe->flags.qos, subscribe->msg_id); return MQTTSN_REFUSED_INVALID_TOPIC_ID; } subscribe->sub_item = list_sub_add_replace(subscribe->sub_list, subscribe->pub_item->name, subscribe->pub_item->name_len, subscribe->flags.qos); } if (subscribe->flags.topic_id_type == MQTTSN_SHORT_TOPIC_NAME) return MQTTSN_REFUSED_NOT_SUPPORTED; dprintf("subtopic:%.*s, topic_id:%d, qos:%d, msg_id:%d\n", subscribe->sub_item->name_len, subscribe->sub_item->name, subscribe->topic_id, subscribe->flags.qos, subscribe->msg_id); return MQTTSN_ACCEPTED; }
//-------------------------------------------- void mqtt_subscribe_decode(mqtt_fixed_header_t *fixhdr, mqtt_subscribe_header_t *subscribe) { size_t len; subscribe->qos_size = 0; subscribe->msg_id = ntohs(*((unsigned short *)&fixhdr->rem_buf[0])); for (len = 0; len < fixhdr->rem_len - 2;) { uint16_t name_len = ntohs(*((unsigned short *)(&fixhdr->rem_buf[2] + len))); uint8_t *name = fixhdr->rem_buf + 2 + len + 2; uint8_t qos = *(fixhdr->rem_buf + 2 + len + 2 + name_len); list_sub_add_replace(subscribe->sub_list, name, name_len, qos/*, &changed*/); list_sub_add_replace(&subscribe->sub_item, name, name_len, qos/*, &changed*/); dprintf("subtopic:%.*s, qos:%d\n", name_len, name, qos); subscribe->qos_size++; len += name_len + 3; } assert(2 + len == fixhdr->rem_len); }