83 lines
1.7 KiB
C
83 lines
1.7 KiB
C
#include "c_string.h"
|
|
#include "c_stdlib.h"
|
|
#include "c_stdio.h"
|
|
#include "msg_queue.h"
|
|
|
|
msg_queue_t *msg_enqueue(msg_queue_t **head, mqtt_message_t *msg, uint16_t msg_id, int msg_type, int publish_qos){
|
|
if(!head){
|
|
return NULL;
|
|
}
|
|
if (!msg || !msg->data || msg->length == 0){
|
|
NODE_DBG("empty message\n");
|
|
return NULL;
|
|
}
|
|
msg_queue_t *node = (msg_queue_t *)c_zalloc(sizeof(msg_queue_t));
|
|
if(!node){
|
|
NODE_DBG("not enough memory\n");
|
|
return NULL;
|
|
}
|
|
|
|
node->msg.data = (uint8_t *)c_zalloc(msg->length);
|
|
if(!node->msg.data){
|
|
NODE_DBG("not enough memory\n");
|
|
c_free(node);
|
|
return NULL;
|
|
}
|
|
c_memcpy(node->msg.data, msg->data, msg->length);
|
|
node->msg.length = msg->length;
|
|
node->next = NULL;
|
|
node->msg_id = msg_id;
|
|
node->msg_type = msg_type;
|
|
node->publish_qos = publish_qos;
|
|
|
|
msg_queue_t *tail = *head;
|
|
if(tail){
|
|
while(tail->next!=NULL) tail = tail->next;
|
|
tail->next = node;
|
|
} else {
|
|
*head = node;
|
|
}
|
|
return node;
|
|
}
|
|
|
|
void msg_destroy(msg_queue_t *node){
|
|
if(!node) return;
|
|
if(node->msg.data){
|
|
c_free(node->msg.data);
|
|
node->msg.data = NULL;
|
|
}
|
|
c_free(node);
|
|
}
|
|
|
|
msg_queue_t * msg_dequeue(msg_queue_t **head){
|
|
if(!head || !*head){
|
|
return NULL;
|
|
}
|
|
msg_queue_t *node = *head; // fetch head.
|
|
*head = node->next; // update head.
|
|
node->next = NULL;
|
|
return node;
|
|
}
|
|
|
|
msg_queue_t * msg_peek(msg_queue_t **head){
|
|
if(!head || !*head){
|
|
return NULL;
|
|
}
|
|
return *head; // fetch head.
|
|
}
|
|
|
|
int msg_size(msg_queue_t **head){
|
|
if(!head || !*head){
|
|
return 0;
|
|
}
|
|
int i = 1;
|
|
msg_queue_t *tail = *head;
|
|
if(tail){
|
|
while(tail->next!=NULL){
|
|
tail = tail->next;
|
|
i++;
|
|
}
|
|
}
|
|
return i;
|
|
}
|