File:  [ELWIX - Embedded LightWeight unIX -] / mqtt / src / Attic / pub.c
Revision 1.1.2.6: 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_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:  * @pData = Publish data into topic
   16:  * @datlen = Publish data length
   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, 
   21: 		u_char Dup, u_char QOS, u_char Retain, const void *pData, u_short datlen)
   22: {
   23: 	int siz = 0;
   24: 	struct mqtthdr *hdr;
   25: 	mqtthdr_var_t *topic;
   26: 	mqtt_v_t *mid;
   27: 	void *data;
   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: 
   57: 	/* load with data */
   58: 	if (pData && datlen) {
   59: 		data = buf->msg_base + siz;
   60: 		memcpy(data, pData, datlen);
   61: 		siz += datlen;
   62: 	}
   63: 
   64: 	/* fixed header */
   65: 	MQTTHDR_MSGINIT(hdr);
   66: 	hdr->mqtt_msg.type = MQTT_TYPE_PUBLISH;
   67: 	hdr->mqtt_msg.qos = QOS;
   68: 	hdr->mqtt_msg.dup = Dup ? 1 : 0;
   69: 	hdr->mqtt_msg.retain = Retain ? 1 : 0;
   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 */
   96: 	MQTTHDR_MSGINIT(hdr);
   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: }

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