File:  [ELWIX - Embedded LightWeight unIX -] / mqtt / src / Attic / pub.c
Revision 1.1.2.4: download - view: text, annotated - select for diffs - revision graph
Mon Nov 21 15:07:12 2011 UTC (12 years, 8 months ago) by misho
Branches: mqtt1_0
restore retain !!!

    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:  * 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, 
   19: 		u_char Dup, u_char QOS, u_char Retain)
   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;
   60: 	hdr->mqtt_msg.retain = Retain ? 1 : 0;
   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>