Annotation of mqtt/src/conn.c, revision 1.1.2.1

1.1.2.1 ! misho       1: #include "global.h"
        !             2: 
        !             3: 
        !             4: /* ------------------------------------------------------------------- */
        !             5: 
        !             6: /*
        !             7:  * mqtt_msgCONNECT() Create CONNECT message
        !             8:  *
        !             9:  * @buf = Message buffer
        !            10:  * @csConnID = ConnectID
        !            11:  * @csUser = Username if !=NULL
        !            12:  * @csPass = Password for Username, only if csUser is set
        !            13:  * @csWillTopic = Will Topic if !=NULL Will Flags set into message
        !            14:  * @csWillMessage = Will Message, may be NULL
        !            15:  * @ClrSess = Clear Session subscriptions after disconnect
        !            16:  * @WillQOS = Will QOS if csWillTopic is set
        !            17:  * @WillRetain = Will Retain Will Message if csWillTopic is set
        !            18:  * return: -1 error or >-1 message size for send
        !            19:  */
        !            20: int
        !            21: mqtt_msgCONNECT(mqtt_msg_t * __restrict buf, const char *csConnID, 
        !            22:                const char *csUser, const char *csPass, 
        !            23:                const char *csWillTopic, const char *csWillMessage, 
        !            24:                char ClrSess, char WillQOS, char WillRetain)
        !            25: {
        !            26:        int siz = 0;
        !            27:        struct mqtthdr *hdr;
        !            28:        mqtthdr_var_t *var, *cid, *topic, *wmsg, *user, *pass;
        !            29:        mqtthdr_protover_t *proto;
        !            30:        mqtthdr_connflgs_t *flags;
        !            31:        mqtt_v_t *ka;
        !            32: 
        !            33:        if (!buf || !csConnID)
        !            34:                return -1;
        !            35:        if (strlen(csConnID) > 23) {
        !            36:                mqtt_SetErr(EINVAL, "Error:: invalid argument ConnID is too long (max 23 bytes)");
        !            37:                return -1;
        !            38:        }
        !            39:        if (csUser && strlen(csUser) > 12) {
        !            40:                mqtt_SetErr(EINVAL, "Error:: invalid argument Username is too long (max 12 bytes)");
        !            41:                return -1;
        !            42:        }
        !            43:        if (csPass && strlen(csPass) > 12) {
        !            44:                mqtt_SetErr(EINVAL, "Error:: invalid argument Password is too long (max 12 bytes)");
        !            45:                return -1;
        !            46:        }
        !            47:        if (WillQOS < MQTT_QOS_ONCE && WillQOS > MQTT_QOS_EXACTLY) {
        !            48:                mqtt_SetErr(EINVAL, "Error:: invalid argument WillQOS - unknown QOS value");
        !            49:                return -1;
        !            50:        }
        !            51: 
        !            52:        if (mqtt_msgRealloc(buf, BUFSIZ) == -1)
        !            53:                return -1;
        !            54:        else {
        !            55:                hdr = (struct mqtthdr *) (buf->msg_base + siz);
        !            56:                siz += 2;
        !            57:                var = (mqtthdr_var_t*) (buf->msg_base + siz);
        !            58:                siz += 8;
        !            59:                proto = buf->msg_base + siz;
        !            60:                siz++;
        !            61:                flags = (mqtthdr_connflgs_t*) (buf->msg_base + siz);
        !            62:                siz++;
        !            63:                ka = (mqtt_v_t*) (buf->msg_base + siz);
        !            64:                siz += sizeof(mqtt_v_t);
        !            65:        }
        !            66: 
        !            67:        /* fixed header */
        !            68:        hdr->mqtt_msg.type = MQTT_TYPE_CONNECT;
        !            69:        *hdr->mqtt_len = 0;
        !            70: 
        !            71:        /* variable header */
        !            72:        var->var_sb.sb.l = 6;
        !            73:        memcpy(var->var_data, MQTT_CONN_STR, 6);
        !            74: 
        !            75:        *proto = MQTT_PROTO_VER;
        !            76: 
        !            77:        /* CONNECT header */
        !            78:        flags->clean_sess = ClrSess ? 1 : 0;
        !            79:        if (csUser) {
        !            80:                flags->username = 1;
        !            81:                flags->password = csPass ? 1 : 0;
        !            82:        } else {
        !            83:                flags->username = 0;
        !            84:                flags->password = 0;
        !            85:        }
        !            86:        if (csWillTopic) {
        !            87:                flags->will_flg = 1;
        !            88:                flags->will_qos = WillQOS;
        !            89:                flags->will_retain = WillRetain ? 1 : 0;
        !            90:        } else {
        !            91:                flags->will_flg = 0;
        !            92:                flags->will_qos = 0;
        !            93:                flags->will_retain = 0;
        !            94:        }
        !            95: 
        !            96:        ka->sb.l = MQTT_KEEPALIVE;
        !            97: 
        !            98:        /* ConnID */
        !            99:        cid = (mqtthdr_var_t*) (buf->msg_base + siz);
        !           100:        cid->var_sb.val = htons(strlen(csConnID));
        !           101:        siz += MQTTHDR_VAR_SIZEOF(cid);
        !           102:        memcpy(cid->var_data, csConnID, ntohs(cid->var_sb.val));
        !           103: 
        !           104:        /* If Will Flags setup */
        !           105:        if (csWillTopic) {
        !           106:                topic = (mqtthdr_var_t*) (buf->msg_base + siz);
        !           107:                topic->var_sb.val = htons(strlen(csWillTopic));
        !           108:                memcpy(topic->var_data, csWillTopic, ntohs(topic->var_sb.val));
        !           109:                siz += MQTTHDR_VAR_SIZEOF(topic);
        !           110: 
        !           111:                wmsg = (mqtthdr_var_t*) (buf->msg_base + siz);
        !           112:                if (csWillMessage) {
        !           113:                        wmsg->var_sb.val = htons(strlen(csWillMessage));
        !           114:                        memcpy(wmsg->var_data, csWillMessage, ntohs(wmsg->var_sb.val));
        !           115:                } else
        !           116:                        wmsg->var_sb.val = 0;
        !           117:                siz += MQTTHDR_VAR_SIZEOF(wmsg);
        !           118:        }
        !           119: 
        !           120:        /* If defined Username & Password */
        !           121:        if (csUser) {
        !           122:                user = (mqtthdr_var_t*) (buf->msg_base + siz);
        !           123:                user->var_sb.val = htons(strlen(csUser));
        !           124:                memcpy(user->var_data, csUser, ntohs(user->var_sb.val));
        !           125:                siz += MQTTHDR_VAR_SIZEOF(user);
        !           126: 
        !           127:                if (csPass) {
        !           128:                        pass = (mqtthdr_var_t*) (buf->msg_base + siz);
        !           129:                        pass->var_sb.val = htons(strlen(csPass));
        !           130:                        memcpy(pass->var_data, csPass, ntohs(pass->var_sb.val));
        !           131:                        siz += MQTTHDR_VAR_SIZEOF(pass);
        !           132:                }
        !           133:        }
        !           134: 
        !           135:        *hdr->mqtt_len = mqtt_encodeLen(siz - 2);
        !           136:        mqtt_msgRealloc(buf, siz);
        !           137:        return siz;
        !           138: }

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