File:  [ELWIX - Embedded LightWeight unIX -] / mqtt / src / Attic / recv.c
Revision 1.2: download - view: text, annotated - select for diffs - revision graph
Fri Jan 27 15:05:38 2012 UTC (12 years, 4 months ago) by misho
Branches: MAIN
CVS tags: mqtt1_1, HEAD
added new files

#include "global.h"


/* ------------------------------------------------------------------- */

/*
 * mqttInitCallbacks() Init callback array for dispatcher
 *
 * return: NULL error or !=NULL allocated callback array, after use free with mqttFiniCallbacks()
 */
mqtt_cb_t *
mqttInitCallbacks(void)
{
	mqtt_cb_t *cb = NULL;

	cb = malloc((MQTT_TYPE_MAX + 1) * sizeof(mqtt_cb_t));
	if (!cb) {
		LOGERR;
		return NULL;
	} else
		memset(cb, 0, (MQTT_TYPE_MAX + 1) * sizeof(mqtt_cb_t));

	return cb;
}

/*
 * mqttFiniCallbacks() Free callback array
 *
 * @cb = Callback array
 * return: none
 */
void
mqttFiniCallbacks(mqtt_cb_t ** __restrict cb)
{
	if (!cb)
		return;

	if ((*cb)[MQTT_TYPE_MAX])
		(*cb)[MQTT_TYPE_MAX](*cb);

	free(*cb);
	*cb = NULL;
}

/*
 * mqttDispatcher() MQTT Message type dispatcher
 *
 * @cb = Callback array
 * @buf = Received MQTT message
 * return: -1 error or >-1 return value from executed callback
 */
inline int
mqttDispatcher(mqtt_cb_t * __restrict cb, mqtt_msg_t * __restrict buf)
{
	struct mqtthdr *hdr;

	if (!cb || !buf)
		return -1;
	if (buf->msg_len < sizeof(struct mqtthdr)) {
		mqtt_SetErr(EINVAL, "Error:: message is too small ...");
		return -1;
	}

	hdr = (struct mqtthdr *) buf->msg_base;
	if (hdr->mqtt_msg.type > MQTT_TYPE_MAX) {
		mqtt_SetErr(ENOSYS, "Error:: message type %d not implemented", hdr->mqtt_msg.type);
		return -1;
	}

	if (cb[hdr->mqtt_msg.type])
		return cb[hdr->mqtt_msg.type](buf);

	mqtt_SetErr(ENOTSUP, "Error:: Unsupported message type %d", hdr->mqtt_msg.type);
	return -1;
}

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