File:  [ELWIX - Embedded LightWeight unIX -] / mqtt / src / Attic / sub.c
Revision 1.1.2.7: download - view: text, annotated - select for diffs - revision graph
Tue Nov 22 14:00:09 2011 UTC (12 years, 7 months ago) by misho
Branches: mqtt1_0
add sanity checks & inits for fixed header
finish sub* support

    1: #include "global.h"
    2: 
    3: 
    4: /* ------------------------------------------------------------------- */
    5: 
    6: /*
    7:  * mqtt_msgSUBSCRIBE() Create SUBSCRIBE message
    8:  *
    9:  * @buf = Message buffer
   10:  * @Topics = MQTT subscription topics
   11:  * @msgID = MessageID
   12:  * @Dup = Duplicate message
   13:  * @QOS = QoS
   14:  * return: -1 error or >-1 message size for send
   15:  */
   16: int
   17: mqtt_msgSUBSCRIBE(mqtt_msg_t * __restrict buf, mqtt_subscr_t * __restrict Topics, 
   18: 		u_short msgID, u_char Dup, u_char QOS)
   19: {
   20: 	int siz = 0;
   21: 	struct mqtthdr *hdr;
   22: 	mqtthdr_var_t *topic;
   23: 	mqtt_v_t *mid;
   24: 	mqtt_subscr_t *t;
   25: 	u_char *qos;
   26: 
   27: 	if (!buf || !Topics)
   28: 		return -1;
   29: 	if (QOS > MQTT_QOS_EXACTLY) {
   30: 		mqtt_SetErr(EINVAL, "Error:: invalid QoS parameter");
   31: 		return -1;
   32: 	}
   33: 	if (!msgID && QOS != MQTT_QOS_ONCE) {
   34: 		mqtt_SetErr(EINVAL, "Error:: invalid MessageID parameter must be >0");
   35: 		return -1;
   36: 	}
   37: 
   38: 	if (mqtt_msgRealloc(buf, MQTTMSG_MAX) == -1)
   39: 		return -1;
   40: 	else {
   41: 		hdr = (struct mqtthdr *) (buf->msg_base + siz);
   42: 		siz += sizeof(struct mqtthdr);
   43: 	}
   44: 
   45: 	/* variable header */
   46: 	mid = (mqtt_v_t*) (buf->msg_base + siz);
   47: 	mid->val = htons(msgID);
   48: 	siz += sizeof(mqtt_v_t);
   49: 
   50: 	/* payload with subscriptions */
   51: 	for (t = Topics; t && t->sub_data; t++) {
   52: 		topic = (mqtthdr_var_t*) (buf->msg_base + siz);
   53: 		topic->var_sb.val = t->sub_sb.val;
   54: 		memcpy(topic->var_data, t->sub_data, ntohs(topic->var_sb.val));
   55: 		siz += MQTTHDR_VAR_SIZEOF(topic);
   56: 		qos = (buf->msg_base + siz);
   57: 		*qos = t->sub_qos;
   58: 		siz++;
   59: 	}
   60: 
   61: 	/* fixed header */
   62: 	MQTTHDR_MSGINIT(hdr);
   63: 	hdr->mqtt_msg.type = MQTT_TYPE_SUBSCRIBE;
   64: 	hdr->mqtt_msg.qos = QOS;
   65: 	hdr->mqtt_msg.dup = Dup ? 1 : 0;
   66: 	hdr->mqtt_msg.retain = 0;
   67: 	*hdr->mqtt_len = mqtt_encodeLen(siz - sizeof(struct mqtthdr));
   68: 
   69: 	mqtt_msgRealloc(buf, siz);
   70: 	return siz;
   71: }
   72: 
   73: /*
   74:  * mqtt_msgSUBACK() Create SUBACK message
   75:  *
   76:  * @buf = Message buffer
   77:  * @Topics = MQTT subscription topics
   78:  * @msgID = MessageID
   79:  * return: -1 error or >-1 message size for send
   80:  */
   81: int
   82: mqtt_msgSUBACK(mqtt_msg_t * __restrict buf, mqtt_subscr_t * __restrict Topics, u_short msgID)
   83: {
   84: 	int siz = 0;
   85: 	struct mqtthdr *hdr;
   86: 	mqtt_v_t *v;
   87: 	mqtt_subscr_t *t;
   88: 	u_char *qos;
   89: 
   90: 	if (!buf || !Topics)
   91: 		return -1;
   92: 
   93: 	if (mqtt_msgRealloc(buf, MQTTMSG_MAX) == -1)
   94: 		return -1;
   95: 	else {
   96: 		hdr = (struct mqtthdr *) (buf->msg_base + siz);
   97: 		siz += sizeof(struct mqtthdr);
   98: 		v = (mqtt_v_t*) (buf->msg_base + siz);
   99: 		siz += sizeof(mqtt_v_t);
  100: 	}
  101: 
  102: 	/* MessageID */
  103: 	v->val = htons(msgID);
  104: 
  105: 	/* QoS payload from subscriptions */
  106: 	for (t = Topics; t && t->sub_data; t++) {
  107: 		qos = (buf->msg_base + siz);
  108: 		*qos = t->sub_qos;
  109: 		siz++;
  110: 	}
  111: 
  112: 	/* fixed header */
  113: 	MQTTHDR_MSGINIT(hdr);
  114: 	hdr->mqtt_msg.type = MQTT_TYPE_SUBACK;
  115: 	*hdr->mqtt_len = mqtt_encodeLen(siz - sizeof(struct mqtthdr));
  116: 
  117: 	mqtt_msgRealloc(buf, siz);
  118: 	return siz;
  119: }
  120: 
  121: /*
  122:  * mqtt_msgUNSUBSCRIBE() Create UNSUBSCRIBE message
  123:  *
  124:  * @buf = Message buffer
  125:  * @Topics = MQTT subscription topics
  126:  * @msgID = MessageID
  127:  * @Dup = Duplicate message
  128:  * @QOS = QoS
  129:  * return: -1 error or >-1 message size for send
  130:  */
  131: int
  132: mqtt_msgUNSUBSCRIBE(mqtt_msg_t * __restrict buf, mqtt_subscr_t * __restrict Topics, 
  133: 		u_short msgID, u_char Dup, u_char QOS)
  134: {
  135: 	int siz = 0;
  136: 	struct mqtthdr *hdr;
  137: 	mqtthdr_var_t *topic;
  138: 	mqtt_v_t *mid;
  139: 	mqtt_subscr_t *t;
  140: 
  141: 	if (!buf || !Topics)
  142: 		return -1;
  143: 	if (QOS > MQTT_QOS_EXACTLY) {
  144: 		mqtt_SetErr(EINVAL, "Error:: invalid QoS parameter");
  145: 		return -1;
  146: 	}
  147: 	if (!msgID && QOS != MQTT_QOS_ONCE) {
  148: 		mqtt_SetErr(EINVAL, "Error:: invalid MessageID parameter must be >0");
  149: 		return -1;
  150: 	}
  151: 
  152: 	if (mqtt_msgRealloc(buf, MQTTMSG_MAX) == -1)
  153: 		return -1;
  154: 	else {
  155: 		hdr = (struct mqtthdr *) (buf->msg_base + siz);
  156: 		siz += sizeof(struct mqtthdr);
  157: 	}
  158: 
  159: 	/* variable header */
  160: 	mid = (mqtt_v_t*) (buf->msg_base + siz);
  161: 	mid->val = htons(msgID);
  162: 	siz += sizeof(mqtt_v_t);
  163: 
  164: 	/* payload with subscriptions */
  165: 	for (t = Topics; t && t->sub_data; t++) {
  166: 		topic = (mqtthdr_var_t*) (buf->msg_base + siz);
  167: 		topic->var_sb.val = t->sub_sb.val;
  168: 		memcpy(topic->var_data, t->sub_data, ntohs(topic->var_sb.val));
  169: 		siz += MQTTHDR_VAR_SIZEOF(topic);
  170: 	}
  171: 
  172: 	/* fixed header */
  173: 	MQTTHDR_MSGINIT(hdr);
  174: 	hdr->mqtt_msg.type = MQTT_TYPE_UNSUBSCRIBE;
  175: 	hdr->mqtt_msg.qos = QOS;
  176: 	hdr->mqtt_msg.dup = Dup ? 1 : 0;
  177: 	hdr->mqtt_msg.retain = 0;
  178: 	*hdr->mqtt_len = mqtt_encodeLen(siz - sizeof(struct mqtthdr));
  179: 
  180: 	mqtt_msgRealloc(buf, siz);
  181: 	return siz;
  182: }
  183: 
  184: /*
  185:  * mqtt_msgUNSUBACK() Create UNSUBACK message
  186:  *
  187:  * @buf = Message buffer
  188:  * @msgID = MessageID
  189:  * return: -1 error or >-1 message size for send
  190:  */
  191: int
  192: mqtt_msgUNSUBACK(mqtt_msg_t * __restrict buf, u_short msgID)
  193: {
  194: 	int siz = 0;
  195: 	struct mqtthdr *hdr;
  196: 	mqtt_v_t *v;
  197: 
  198: 	if (!buf)
  199: 		return -1;
  200: 
  201: 	if (mqtt_msgRealloc(buf, sizeof(struct mqtthdr) + sizeof(mqtt_v_t)) == -1)
  202: 		return -1;
  203: 	else {
  204: 		hdr = (struct mqtthdr *) (buf->msg_base + siz);
  205: 		siz += sizeof(struct mqtthdr);
  206: 		v = (mqtt_v_t*) (buf->msg_base + siz);
  207: 		siz += sizeof(mqtt_v_t);
  208: 	}
  209: 
  210: 	/* fixed header */
  211: 	MQTTHDR_MSGINIT(hdr);
  212: 	hdr->mqtt_msg.type = MQTT_TYPE_UNSUBACK;
  213: 	*hdr->mqtt_len = sizeof(mqtt_v_t);
  214: 
  215: 	/* MessageID */
  216: 	v->val = htons(msgID);
  217: 
  218: 	return siz;
  219: }

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