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

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 */
1.1.2.4   misho      46:        mid = (mqtt_v_t*) (buf->msg_base + siz);
                     47:        mid->val = htons(msgID);
                     48:        siz += sizeof(mqtt_v_t);
                     49: 
1.1.2.5   misho      50:        /* payload with subscriptions */
                     51:        for (t = Topics; t && t->sub_data; t++) {
                     52:                topic = (mqtthdr_var_t*) (buf->msg_base + siz);
                     53:                topic->var_sb.val = t->sub_sb.val;
                     54:                memcpy(topic->var_data, t->sub_data, ntohs(topic->var_sb.val));
                     55:                siz += MQTTHDR_VAR_SIZEOF(topic);
                     56:                qos = (buf->msg_base + siz);
                     57:                *qos = t->sub_qos;
                     58:                siz++;
                     59:        }
1.1.2.3   misho      60: 
                     61:        /* fixed header */
1.1.2.7 ! misho      62:        MQTTHDR_MSGINIT(hdr);
1.1.2.4   misho      63:        hdr->mqtt_msg.type = MQTT_TYPE_SUBSCRIBE;
1.1.2.3   misho      64:        hdr->mqtt_msg.qos = QOS;
                     65:        hdr->mqtt_msg.dup = Dup ? 1 : 0;
1.1.2.4   misho      66:        hdr->mqtt_msg.retain = 0;
1.1.2.3   misho      67:        *hdr->mqtt_len = mqtt_encodeLen(siz - sizeof(struct mqtthdr));
                     68: 
                     69:        mqtt_msgRealloc(buf, siz);
                     70:        return siz;
1.1.2.2   misho      71: }
1.1.2.6   misho      72: 
                     73: /*
                     74:  * mqtt_msgSUBACK() Create SUBACK message
                     75:  *
                     76:  * @buf = Message buffer
                     77:  * @Topics = MQTT subscription topics
                     78:  * @msgID = MessageID
                     79:  * return: -1 error or >-1 message size for send
                     80:  */
                     81: int
                     82: mqtt_msgSUBACK(mqtt_msg_t * __restrict buf, mqtt_subscr_t * __restrict Topics, u_short msgID)
                     83: {
                     84:        int siz = 0;
                     85:        struct mqtthdr *hdr;
                     86:        mqtt_v_t *v;
                     87:        mqtt_subscr_t *t;
                     88:        u_char *qos;
                     89: 
                     90:        if (!buf || !Topics)
                     91:                return -1;
                     92: 
                     93:        if (mqtt_msgRealloc(buf, MQTTMSG_MAX) == -1)
                     94:                return -1;
                     95:        else {
                     96:                hdr = (struct mqtthdr *) (buf->msg_base + siz);
                     97:                siz += sizeof(struct mqtthdr);
                     98:                v = (mqtt_v_t*) (buf->msg_base + siz);
                     99:                siz += sizeof(mqtt_v_t);
                    100:        }
                    101: 
                    102:        /* MessageID */
                    103:        v->val = htons(msgID);
                    104: 
                    105:        /* QoS payload from subscriptions */
                    106:        for (t = Topics; t && t->sub_data; t++) {
                    107:                qos = (buf->msg_base + siz);
                    108:                *qos = t->sub_qos;
                    109:                siz++;
                    110:        }
                    111: 
                    112:        /* fixed header */
1.1.2.7 ! misho     113:        MQTTHDR_MSGINIT(hdr);
1.1.2.6   misho     114:        hdr->mqtt_msg.type = MQTT_TYPE_SUBACK;
                    115:        *hdr->mqtt_len = mqtt_encodeLen(siz - sizeof(struct mqtthdr));
                    116: 
                    117:        mqtt_msgRealloc(buf, siz);
                    118:        return siz;
                    119: }
1.1.2.7 ! misho     120: 
        !           121: /*
        !           122:  * mqtt_msgUNSUBSCRIBE() Create UNSUBSCRIBE message
        !           123:  *
        !           124:  * @buf = Message buffer
        !           125:  * @Topics = MQTT subscription topics
        !           126:  * @msgID = MessageID
        !           127:  * @Dup = Duplicate message
        !           128:  * @QOS = QoS
        !           129:  * return: -1 error or >-1 message size for send
        !           130:  */
        !           131: int
        !           132: mqtt_msgUNSUBSCRIBE(mqtt_msg_t * __restrict buf, mqtt_subscr_t * __restrict Topics, 
        !           133:                u_short msgID, u_char Dup, u_char QOS)
        !           134: {
        !           135:        int siz = 0;
        !           136:        struct mqtthdr *hdr;
        !           137:        mqtthdr_var_t *topic;
        !           138:        mqtt_v_t *mid;
        !           139:        mqtt_subscr_t *t;
        !           140: 
        !           141:        if (!buf || !Topics)
        !           142:                return -1;
        !           143:        if (QOS > MQTT_QOS_EXACTLY) {
        !           144:                mqtt_SetErr(EINVAL, "Error:: invalid QoS parameter");
        !           145:                return -1;
        !           146:        }
        !           147:        if (!msgID && QOS != MQTT_QOS_ONCE) {
        !           148:                mqtt_SetErr(EINVAL, "Error:: invalid MessageID parameter must be >0");
        !           149:                return -1;
        !           150:        }
        !           151: 
        !           152:        if (mqtt_msgRealloc(buf, MQTTMSG_MAX) == -1)
        !           153:                return -1;
        !           154:        else {
        !           155:                hdr = (struct mqtthdr *) (buf->msg_base + siz);
        !           156:                siz += sizeof(struct mqtthdr);
        !           157:        }
        !           158: 
        !           159:        /* variable header */
        !           160:        mid = (mqtt_v_t*) (buf->msg_base + siz);
        !           161:        mid->val = htons(msgID);
        !           162:        siz += sizeof(mqtt_v_t);
        !           163: 
        !           164:        /* payload with subscriptions */
        !           165:        for (t = Topics; t && t->sub_data; t++) {
        !           166:                topic = (mqtthdr_var_t*) (buf->msg_base + siz);
        !           167:                topic->var_sb.val = t->sub_sb.val;
        !           168:                memcpy(topic->var_data, t->sub_data, ntohs(topic->var_sb.val));
        !           169:                siz += MQTTHDR_VAR_SIZEOF(topic);
        !           170:        }
        !           171: 
        !           172:        /* fixed header */
        !           173:        MQTTHDR_MSGINIT(hdr);
        !           174:        hdr->mqtt_msg.type = MQTT_TYPE_UNSUBSCRIBE;
        !           175:        hdr->mqtt_msg.qos = QOS;
        !           176:        hdr->mqtt_msg.dup = Dup ? 1 : 0;
        !           177:        hdr->mqtt_msg.retain = 0;
        !           178:        *hdr->mqtt_len = mqtt_encodeLen(siz - sizeof(struct mqtthdr));
        !           179: 
        !           180:        mqtt_msgRealloc(buf, siz);
        !           181:        return siz;
        !           182: }
        !           183: 
        !           184: /*
        !           185:  * mqtt_msgUNSUBACK() Create UNSUBACK message
        !           186:  *
        !           187:  * @buf = Message buffer
        !           188:  * @msgID = MessageID
        !           189:  * return: -1 error or >-1 message size for send
        !           190:  */
        !           191: int
        !           192: mqtt_msgUNSUBACK(mqtt_msg_t * __restrict buf, u_short msgID)
        !           193: {
        !           194:        int siz = 0;
        !           195:        struct mqtthdr *hdr;
        !           196:        mqtt_v_t *v;
        !           197: 
        !           198:        if (!buf)
        !           199:                return -1;
        !           200: 
        !           201:        if (mqtt_msgRealloc(buf, sizeof(struct mqtthdr) + sizeof(mqtt_v_t)) == -1)
        !           202:                return -1;
        !           203:        else {
        !           204:                hdr = (struct mqtthdr *) (buf->msg_base + siz);
        !           205:                siz += sizeof(struct mqtthdr);
        !           206:                v = (mqtt_v_t*) (buf->msg_base + siz);
        !           207:                siz += sizeof(mqtt_v_t);
        !           208:        }
        !           209: 
        !           210:        /* fixed header */
        !           211:        MQTTHDR_MSGINIT(hdr);
        !           212:        hdr->mqtt_msg.type = MQTT_TYPE_UNSUBACK;
        !           213:        *hdr->mqtt_len = sizeof(mqtt_v_t);
        !           214: 
        !           215:        /* MessageID */
        !           216:        v->val = htons(msgID);
        !           217: 
        !           218:        return siz;
        !           219: }

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