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