Annotation of mqtt/src/pub.c, revision 1.1.2.4
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.2 misho 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,
1.1.2.4 ! misho 19: u_char Dup, u_char QOS, u_char Retain)
1.1.2.2 misho 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;
1.1.2.4 ! misho 60: hdr->mqtt_msg.retain = Retain ? 1 : 0;
1.1.2.2 misho 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>