2019-07-21 23:58:21 +02:00
|
|
|
#include <string.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <stdio.h>
|
2015-03-29 18:24:09 +02:00
|
|
|
#include "msg_queue.h"
|
2019-07-21 23:58:21 +02:00
|
|
|
#include "user_config.h"
|
2015-03-29 18:24:09 +02:00
|
|
|
|
|
|
|
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;
|
|
|
|
}
|
2019-07-21 23:58:21 +02:00
|
|
|
msg_queue_t *node = (msg_queue_t *)calloc(1,sizeof(msg_queue_t));
|
2015-03-29 18:24:09 +02:00
|
|
|
if(!node){
|
|
|
|
NODE_DBG("not enough memory\n");
|
|
|
|
return NULL;
|
|
|
|
}
|
2019-02-17 19:26:29 +01:00
|
|
|
|
2021-01-05 12:07:09 +01:00
|
|
|
node->sent = 0;
|
|
|
|
|
2019-07-21 23:58:21 +02:00
|
|
|
node->msg.data = (uint8_t *)calloc(1,msg->length);
|
2015-03-29 18:24:09 +02:00
|
|
|
if(!node->msg.data){
|
|
|
|
NODE_DBG("not enough memory\n");
|
2019-07-21 23:58:21 +02:00
|
|
|
free(node);
|
2015-03-29 18:24:09 +02:00
|
|
|
return NULL;
|
|
|
|
}
|
2019-07-21 23:58:21 +02:00
|
|
|
memcpy(node->msg.data, msg->data, msg->length);
|
2015-03-29 18:24:09 +02:00
|
|
|
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){
|
2019-07-21 23:58:21 +02:00
|
|
|
free(node->msg.data);
|
2015-03-29 18:24:09 +02:00
|
|
|
node->msg.data = NULL;
|
|
|
|
}
|
2019-07-21 23:58:21 +02:00
|
|
|
free(node);
|
2015-03-29 18:24:09 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
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;
|
|
|
|
}
|
2015-03-31 17:38:28 +02:00
|
|
|
|
|
|
|
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;
|
|
|
|
}
|