#include "global.h"
/* ------------------------------------------------------------------- */
int
mqtt_msgSUBSCRIBE(mqtt_msg_t * __restrict buf, const char *csTopic, u_short msgID,
u_char Dup, u_char QOS)
{
int siz = 0;
struct mqtthdr *hdr;
mqtthdr_var_t *topic;
mqtt_v_t *mid;
if (!buf || !csTopic)
return -1;
if (QOS > MQTT_QOS_EXACTLY) {
mqtt_SetErr(EINVAL, "Error:: invalid QoS parameter");
return -1;
}
if (!msgID && QOS != MQTT_QOS_ONCE) {
mqtt_SetErr(EINVAL, "Error:: invalid MessageID parameter must be >0");
return -1;
}
if (mqtt_msgRealloc(buf, MQTTMSG_MAX) == -1)
return -1;
else {
hdr = (struct mqtthdr *) (buf->msg_base + siz);
siz += sizeof(struct mqtthdr);
}
/* variable header */
mid = (mqtt_v_t*) (buf->msg_base + siz);
mid->val = htons(msgID);
siz += sizeof(mqtt_v_t);
topic = (mqtthdr_var_t*) (buf->msg_base + siz);
topic->var_sb.val = htons(strlen(csTopic));
memcpy(topic->var_data, csTopic, ntohs(topic->var_sb.val));
siz += MQTTHDR_VAR_SIZEOF(topic);
/* fixed header */
hdr->mqtt_msg.type = MQTT_TYPE_SUBSCRIBE;
hdr->mqtt_msg.qos = QOS;
hdr->mqtt_msg.dup = Dup ? 1 : 0;
hdr->mqtt_msg.retain = 0;
*hdr->mqtt_len = mqtt_encodeLen(siz - sizeof(struct mqtthdr));
mqtt_msgRealloc(buf, siz);
return siz;
}
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>