Annotation of mqtt/src/pub.c, revision 1.1.2.2
1.1.2.1 misho 1: #include "global.h"
2:
3:
4: /* ------------------------------------------------------------------- */
5:
1.1.2.2 ! misho 6: /*
! 7: * mqtt_msgPUBLISH() Create PUBLISH message
! 8: *
! 9: * @buf = Message buffer
! 10: * @csTopic = Publish topic
! 11: * @msgID = MessageID >0, if QOS != MQTT_QOS_ONCE
! 12: * @Dup = Duplicate message
! 13: * @QOS = QoS
! 14: * @Retain = Retain message
! 15: * return: -1 error or >-1 message size for send
! 16: */
! 17: int
! 18: mqtt_msgPUBLISH(mqtt_msg_t * __restrict buf, const char *csTopic, u_short msgID,
! 19: u_char Dup, u_char QOS, u_char Retain)
! 20: {
! 21: int siz = 0;
! 22: struct mqtthdr *hdr;
! 23: mqtthdr_var_t *topic;
! 24: mqtt_v_t *mid;
! 25:
! 26: if (!buf || !csTopic)
! 27: return -1;
! 28: if (QOS > MQTT_QOS_EXACTLY) {
! 29: mqtt_SetErr(EINVAL, "Error:: invalid QoS parameter");
! 30: return -1;
! 31: }
! 32: if (!msgID && QOS != MQTT_QOS_ONCE) {
! 33: mqtt_SetErr(EINVAL, "Error:: invalid MessageID parameter must be >0");
! 34: return -1;
! 35: }
! 36:
! 37: if (mqtt_msgRealloc(buf, MQTTMSG_MAX) == -1)
! 38: return -1;
! 39: else {
! 40: hdr = (struct mqtthdr *) (buf->msg_base + siz);
! 41: siz += sizeof(struct mqtthdr);
! 42: }
! 43:
! 44: /* variable header */
! 45:
! 46: topic = (mqtthdr_var_t*) (buf->msg_base + siz);
! 47: topic->var_sb.val = htons(strlen(csTopic));
! 48: memcpy(topic->var_data, csTopic, ntohs(topic->var_sb.val));
! 49: siz += MQTTHDR_VAR_SIZEOF(topic);
! 50:
! 51: mid = (mqtt_v_t*) (buf->msg_base + siz);
! 52: mid->val = htons(msgID);
! 53: siz += sizeof(mqtt_v_t);
! 54:
! 55: /* fixed header */
! 56:
! 57: hdr->mqtt_msg.type = MQTT_TYPE_PUBLISH;
! 58: hdr->mqtt_msg.qos = QOS;
! 59: hdr->mqtt_msg.dup = Dup ? 1 : 0;
! 60: hdr->mqtt_msg.retain = Retain ? 1 : 0;
! 61: *hdr->mqtt_len = mqtt_encodeLen(siz - sizeof(struct mqtthdr));
! 62:
! 63: mqtt_msgRealloc(buf, siz);
! 64: return siz;
! 65: }
! 66:
! 67: static int
! 68: _mqtt_msgPUB_(mqtt_msg_t * __restrict buf, u_char cmd, u_short msgID)
! 69: {
! 70: int siz = 0;
! 71: struct mqtthdr *hdr;
! 72: mqtt_v_t *v;
! 73:
! 74: if (!buf)
! 75: return -1;
! 76:
! 77: if (mqtt_msgRealloc(buf, sizeof(struct mqtthdr) + sizeof(mqtt_v_t)) == -1)
! 78: return -1;
! 79: else {
! 80: hdr = (struct mqtthdr *) (buf->msg_base + siz);
! 81: siz += sizeof(struct mqtthdr);
! 82: v = (mqtt_v_t*) (buf->msg_base + siz);
! 83: siz += sizeof(mqtt_v_t);
! 84: }
! 85:
! 86: /* fixed header */
! 87: hdr->mqtt_msg.type = cmd;
! 88: *hdr->mqtt_len = sizeof(mqtt_v_t);
! 89:
! 90: /* MessageID */
! 91: v->val = htons(msgID);
! 92:
! 93: return siz;
! 94: }
! 95:
! 96: /*
! 97: * mqtt_msgPUBACK() Create PUBACK message
! 98: *
! 99: * @buf = Message buffer
! 100: * @msgID = MessageID
! 101: * return: -1 error or >-1 message size for send
! 102: */
! 103: inline int
! 104: mqtt_msgPUBACK(mqtt_msg_t * __restrict buf, u_short msgID)
! 105: {
! 106: return _mqtt_msgPUB_(buf, MQTT_TYPE_PUBACK, msgID);
! 107: }
! 108:
! 109: /*
! 110: * mqtt_msgPUBREC() Create PUBREC message
! 111: *
! 112: * @buf = Message buffer
! 113: * @msgID = MessageID
! 114: * return: -1 error or >-1 message size for send
! 115: */
! 116: inline int
! 117: mqtt_msgPUBREC(mqtt_msg_t * __restrict buf, u_short msgID)
! 118: {
! 119: return _mqtt_msgPUB_(buf, MQTT_TYPE_PUBREC, msgID);
! 120: }
! 121:
! 122: /*
! 123: * mqtt_msgPUBREL() Create PUBREL message
! 124: *
! 125: * @buf = Message buffer
! 126: * @msgID = MessageID
! 127: * return: -1 error or >-1 message size for send
! 128: */
! 129: inline int
! 130: mqtt_msgPUBREL(mqtt_msg_t * __restrict buf, u_short msgID)
! 131: {
! 132: return _mqtt_msgPUB_(buf, MQTT_TYPE_PUBREL, msgID);
! 133: }
! 134:
! 135: /*
! 136: * mqtt_msgPUBCOMP() Create PUBCOMP message
! 137: *
! 138: * @buf = Message buffer
! 139: * @msgID = MessageID
! 140: * return: -1 error or >-1 message size for send
! 141: */
! 142: inline int
! 143: mqtt_msgPUBCOMP(mqtt_msg_t * __restrict buf, u_short msgID)
! 144: {
! 145: return _mqtt_msgPUB_(buf, MQTT_TYPE_PUBCOMP, msgID);
! 146: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>