Annotation of mqtt/src/pub.c, revision 1.1.2.7
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
1.1.2.4 misho 14: * @Retain = Retain message
1.1.2.5 misho 15: * @pData = Publish data into topic
16: * @datlen = Publish data length
1.1.2.2 misho 17: * return: -1 error or >-1 message size for send
18: */
19: int
20: mqtt_msgPUBLISH(mqtt_msg_t * __restrict buf, const char *csTopic, u_short msgID,
1.1.2.5 misho 21: u_char Dup, u_char QOS, u_char Retain, const void *pData, u_short datlen)
1.1.2.2 misho 22: {
23: int siz = 0;
24: struct mqtthdr *hdr;
25: mqtthdr_var_t *topic;
26: mqtt_v_t *mid;
1.1.2.5 misho 27: void *data;
1.1.2.2 misho 28:
29: if (!buf || !csTopic)
30: return -1;
31: if (QOS > MQTT_QOS_EXACTLY) {
32: mqtt_SetErr(EINVAL, "Error:: invalid QoS parameter");
33: return -1;
34: }
35: if (!msgID && QOS != MQTT_QOS_ONCE) {
36: mqtt_SetErr(EINVAL, "Error:: invalid MessageID parameter must be >0");
37: return -1;
38: }
39:
40: if (mqtt_msgRealloc(buf, MQTTMSG_MAX) == -1)
41: return -1;
42: else {
43: hdr = (struct mqtthdr *) (buf->msg_base + siz);
44: siz += sizeof(struct mqtthdr);
45: }
46:
47: /* variable header */
48: topic = (mqtthdr_var_t*) (buf->msg_base + siz);
49: topic->var_sb.val = htons(strlen(csTopic));
50: memcpy(topic->var_data, csTopic, ntohs(topic->var_sb.val));
51: siz += MQTTHDR_VAR_SIZEOF(topic);
52:
53: mid = (mqtt_v_t*) (buf->msg_base + siz);
54: mid->val = htons(msgID);
55: siz += sizeof(mqtt_v_t);
56:
1.1.2.5 misho 57: /* load with data */
58: if (pData && datlen) {
59: data = buf->msg_base + siz;
60: memcpy(data, pData, datlen);
61: siz += datlen;
62: }
63:
1.1.2.2 misho 64: /* fixed header */
1.1.2.6 misho 65: MQTTHDR_MSGINIT(hdr);
1.1.2.2 misho 66: hdr->mqtt_msg.type = MQTT_TYPE_PUBLISH;
67: hdr->mqtt_msg.qos = QOS;
68: hdr->mqtt_msg.dup = Dup ? 1 : 0;
1.1.2.4 misho 69: hdr->mqtt_msg.retain = Retain ? 1 : 0;
1.1.2.2 misho 70: *hdr->mqtt_len = mqtt_encodeLen(siz - sizeof(struct mqtthdr));
71:
72: mqtt_msgRealloc(buf, siz);
73: return siz;
74: }
75:
76: static int
77: _mqtt_msgPUB_(mqtt_msg_t * __restrict buf, u_char cmd, u_short msgID)
78: {
79: int siz = 0;
80: struct mqtthdr *hdr;
81: mqtt_v_t *v;
82:
83: if (!buf)
84: return -1;
85:
86: if (mqtt_msgRealloc(buf, sizeof(struct mqtthdr) + sizeof(mqtt_v_t)) == -1)
87: return -1;
88: else {
89: hdr = (struct mqtthdr *) (buf->msg_base + siz);
90: siz += sizeof(struct mqtthdr);
91: v = (mqtt_v_t*) (buf->msg_base + siz);
92: siz += sizeof(mqtt_v_t);
93: }
94:
95: /* fixed header */
1.1.2.6 misho 96: MQTTHDR_MSGINIT(hdr);
1.1.2.2 misho 97: hdr->mqtt_msg.type = cmd;
98: *hdr->mqtt_len = sizeof(mqtt_v_t);
99:
100: /* MessageID */
101: v->val = htons(msgID);
102:
103: return siz;
104: }
105:
106: /*
107: * mqtt_msgPUBACK() Create PUBACK message
108: *
109: * @buf = Message buffer
110: * @msgID = MessageID
111: * return: -1 error or >-1 message size for send
112: */
113: inline int
114: mqtt_msgPUBACK(mqtt_msg_t * __restrict buf, u_short msgID)
115: {
116: return _mqtt_msgPUB_(buf, MQTT_TYPE_PUBACK, msgID);
117: }
118:
119: /*
120: * mqtt_msgPUBREC() Create PUBREC message
121: *
122: * @buf = Message buffer
123: * @msgID = MessageID
124: * return: -1 error or >-1 message size for send
125: */
126: inline int
127: mqtt_msgPUBREC(mqtt_msg_t * __restrict buf, u_short msgID)
128: {
129: return _mqtt_msgPUB_(buf, MQTT_TYPE_PUBREC, msgID);
130: }
131:
132: /*
133: * mqtt_msgPUBREL() Create PUBREL message
134: *
135: * @buf = Message buffer
136: * @msgID = MessageID
137: * return: -1 error or >-1 message size for send
138: */
139: inline int
140: mqtt_msgPUBREL(mqtt_msg_t * __restrict buf, u_short msgID)
141: {
142: return _mqtt_msgPUB_(buf, MQTT_TYPE_PUBREL, msgID);
143: }
144:
145: /*
146: * mqtt_msgPUBCOMP() Create PUBCOMP message
147: *
148: * @buf = Message buffer
149: * @msgID = MessageID
150: * return: -1 error or >-1 message size for send
151: */
152: inline int
153: mqtt_msgPUBCOMP(mqtt_msg_t * __restrict buf, u_short msgID)
154: {
155: return _mqtt_msgPUB_(buf, MQTT_TYPE_PUBCOMP, msgID);
156: }
1.1.2.7 ! misho 157:
! 158:
! 159: /* ============= decode ============ */
! 160:
! 161: /*
! 162: * mqtt_readPUBACK() Read PUBACK message
! 163: *
! 164: * @buf = Message buffer
! 165: * return: -1 error or MessageID
! 166: */
! 167: u_short
! 168: mqtt_readPUBACK(mqtt_msg_t * __restrict buf)
! 169: {
! 170: int len, ret;
! 171: struct mqtthdr *hdr;
! 172: mqtt_v_t *v;
! 173: caddr_t pos;
! 174:
! 175: hdr = _mqtt_readHEADER(buf, MQTT_TYPE_PUBACK, &ret, &len);
! 176: if (!hdr)
! 177: return (u_short) -1;
! 178: if (len < sizeof(mqtt_v_t)) {
! 179: mqtt_SetErr(EINVAL, "Error:: short message length %d", len);
! 180: return (u_short) -1;
! 181: } else {
! 182: pos = buf->msg_base + ret + 1;
! 183: v = (mqtt_v_t*) pos;
! 184: }
! 185:
! 186: return ntohs(v->val);
! 187: }
! 188:
! 189: /*
! 190: * mqtt_readPUBREC() Read PUBREC message
! 191: *
! 192: * @buf = Message buffer
! 193: * return: -1 error or MessageID
! 194: */
! 195: u_short
! 196: mqtt_readPUBREC(mqtt_msg_t * __restrict buf)
! 197: {
! 198: int len, ret;
! 199: struct mqtthdr *hdr;
! 200: mqtt_v_t *v;
! 201: caddr_t pos;
! 202:
! 203: hdr = _mqtt_readHEADER(buf, MQTT_TYPE_PUBREC, &ret, &len);
! 204: if (!hdr)
! 205: return (u_short) -1;
! 206: if (len < sizeof(mqtt_v_t)) {
! 207: mqtt_SetErr(EINVAL, "Error:: short message length %d", len);
! 208: return (u_short) -1;
! 209: } else {
! 210: pos = buf->msg_base + ret + 1;
! 211: v = (mqtt_v_t*) pos;
! 212: }
! 213:
! 214: return ntohs(v->val);
! 215: }
! 216:
! 217: /*
! 218: * mqtt_readPUBREL() Read PUBREL message
! 219: *
! 220: * @buf = Message buffer
! 221: * return: -1 error or MessageID
! 222: */
! 223: u_short
! 224: mqtt_readPUBREL(mqtt_msg_t * __restrict buf)
! 225: {
! 226: int len, ret;
! 227: struct mqtthdr *hdr;
! 228: mqtt_v_t *v;
! 229: caddr_t pos;
! 230:
! 231: hdr = _mqtt_readHEADER(buf, MQTT_TYPE_PUBREL, &ret, &len);
! 232: if (!hdr)
! 233: return (u_short) -1;
! 234: if (len < sizeof(mqtt_v_t)) {
! 235: mqtt_SetErr(EINVAL, "Error:: short message length %d", len);
! 236: return (u_short) -1;
! 237: } else {
! 238: pos = buf->msg_base + ret + 1;
! 239: v = (mqtt_v_t*) pos;
! 240: }
! 241:
! 242: return ntohs(v->val);
! 243: }
! 244:
! 245: /*
! 246: * mqtt_readPUBCOMP() Read PUBCOMP message
! 247: *
! 248: * @buf = Message buffer
! 249: * return: -1 error or MessageID
! 250: */
! 251: u_short
! 252: mqtt_readPUBCOMP(mqtt_msg_t * __restrict buf)
! 253: {
! 254: int len, ret;
! 255: struct mqtthdr *hdr;
! 256: mqtt_v_t *v;
! 257: caddr_t pos;
! 258:
! 259: hdr = _mqtt_readHEADER(buf, MQTT_TYPE_PUBCOMP, &ret, &len);
! 260: if (!hdr)
! 261: return (u_short) -1;
! 262: if (len < sizeof(mqtt_v_t)) {
! 263: mqtt_SetErr(EINVAL, "Error:: short message length %d", len);
! 264: return (u_short) -1;
! 265: } else {
! 266: pos = buf->msg_base + ret + 1;
! 267: v = (mqtt_v_t*) pos;
! 268: }
! 269:
! 270: return ntohs(v->val);
! 271: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>