--- mqtt/src/Attic/recv.c 2011/11/22 14:49:07 1.1 +++ mqtt/src/Attic/recv.c 2012/01/27 15:05:38 1.2 @@ -0,0 +1,75 @@ +#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; +}