Annotation of mqtt/src/sub.c, revision 1.1.2.5

1.1.2.1   misho       1: #include "global.h"
                      2: 
                      3: 
                      4: /* ------------------------------------------------------------------- */
                      5: 
1.1.2.5 ! misho       6: /*
        !             7:  * mqtt_msgSUBSCRIBE() Create SUBSCRIBE message
        !             8:  *
        !             9:  * @buf = Message buffer
        !            10:  * @Topics = MQTT subscription topics
        !            11:  * @msgID = MessageID
        !            12:  * @Dup = Duplicate message
        !            13:  * @QOS = QoS
        !            14:  * return: -1 error or >-1 message size for send
        !            15:  */
1.1.2.2   misho      16: int
1.1.2.5 ! misho      17: mqtt_msgSUBSCRIBE(mqtt_msg_t * __restrict buf, mqtt_subscr_t * __restrict Topics, 
        !            18:                u_short msgID, u_char Dup, u_char QOS)
1.1.2.2   misho      19: {
1.1.2.3   misho      20:        int siz = 0;
                     21:        struct mqtthdr *hdr;
                     22:        mqtthdr_var_t *topic;
                     23:        mqtt_v_t *mid;
1.1.2.5 ! misho      24:        mqtt_subscr_t *t;
        !            25:        u_char *qos;
1.1.2.3   misho      26: 
1.1.2.5 ! misho      27:        if (!buf || !Topics)
1.1.2.3   misho      28:                return -1;
                     29:        if (QOS > MQTT_QOS_EXACTLY) {
                     30:                mqtt_SetErr(EINVAL, "Error:: invalid QoS parameter");
                     31:                return -1;
                     32:        }
                     33:        if (!msgID && QOS != MQTT_QOS_ONCE) {
                     34:                mqtt_SetErr(EINVAL, "Error:: invalid MessageID parameter must be >0");
                     35:                return -1;
                     36:        }
                     37: 
                     38:        if (mqtt_msgRealloc(buf, MQTTMSG_MAX) == -1)
                     39:                return -1;
                     40:        else {
                     41:                hdr = (struct mqtthdr *) (buf->msg_base + siz);
                     42:                siz += sizeof(struct mqtthdr);
                     43:        }
                     44: 
                     45:        /* variable header */
                     46: 
1.1.2.4   misho      47:        mid = (mqtt_v_t*) (buf->msg_base + siz);
                     48:        mid->val = htons(msgID);
                     49:        siz += sizeof(mqtt_v_t);
                     50: 
1.1.2.5 ! misho      51:        /* payload with subscriptions */
        !            52: 
        !            53:        for (t = Topics; t && t->sub_data; t++) {
        !            54:                topic = (mqtthdr_var_t*) (buf->msg_base + siz);
        !            55:                topic->var_sb.val = t->sub_sb.val;
        !            56:                memcpy(topic->var_data, t->sub_data, ntohs(topic->var_sb.val));
        !            57:                siz += MQTTHDR_VAR_SIZEOF(topic);
        !            58:                qos = (buf->msg_base + siz);
        !            59:                *qos = t->sub_qos;
        !            60:                siz++;
        !            61:        }
1.1.2.3   misho      62: 
                     63:        /* fixed header */
                     64: 
1.1.2.4   misho      65:        hdr->mqtt_msg.type = MQTT_TYPE_SUBSCRIBE;
1.1.2.3   misho      66:        hdr->mqtt_msg.qos = QOS;
                     67:        hdr->mqtt_msg.dup = Dup ? 1 : 0;
1.1.2.4   misho      68:        hdr->mqtt_msg.retain = 0;
1.1.2.3   misho      69:        *hdr->mqtt_len = mqtt_encodeLen(siz - sizeof(struct mqtthdr));
                     70: 
                     71:        mqtt_msgRealloc(buf, siz);
                     72:        return siz;
1.1.2.2   misho      73: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>