msg_queue.c 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. #include <string.h>
  2. #include <stdlib.h>
  3. #include <stdio.h>
  4. #include "msg_queue.h"
  5. #include "user_config.h"
  6. msg_queue_t *msg_enqueue(msg_queue_t **head, mqtt_message_t *msg, uint16_t msg_id, int msg_type, int publish_qos){
  7. if(!head){
  8. return NULL;
  9. }
  10. if (!msg || !msg->data || msg->length == 0){
  11. NODE_DBG("empty message\n");
  12. return NULL;
  13. }
  14. msg_queue_t *node = (msg_queue_t *)calloc(1,sizeof(msg_queue_t));
  15. if(!node){
  16. NODE_DBG("not enough memory\n");
  17. return NULL;
  18. }
  19. node->sent = 0;
  20. node->msg.data = (uint8_t *)calloc(1,msg->length);
  21. if(!node->msg.data){
  22. NODE_DBG("not enough memory\n");
  23. free(node);
  24. return NULL;
  25. }
  26. memcpy(node->msg.data, msg->data, msg->length);
  27. node->msg.length = msg->length;
  28. node->next = NULL;
  29. node->msg_id = msg_id;
  30. node->msg_type = msg_type;
  31. node->publish_qos = publish_qos;
  32. msg_queue_t *tail = *head;
  33. if(tail){
  34. while(tail->next!=NULL) tail = tail->next;
  35. tail->next = node;
  36. } else {
  37. *head = node;
  38. }
  39. return node;
  40. }
  41. void msg_destroy(msg_queue_t *node){
  42. if(!node) return;
  43. if(node->msg.data){
  44. free(node->msg.data);
  45. node->msg.data = NULL;
  46. }
  47. free(node);
  48. }
  49. msg_queue_t * msg_dequeue(msg_queue_t **head){
  50. if(!head || !*head){
  51. return NULL;
  52. }
  53. msg_queue_t *node = *head; // fetch head.
  54. *head = node->next; // update head.
  55. node->next = NULL;
  56. return node;
  57. }
  58. msg_queue_t * msg_peek(msg_queue_t **head){
  59. if(!head || !*head){
  60. return NULL;
  61. }
  62. return *head; // fetch head.
  63. }
  64. int msg_size(msg_queue_t **head){
  65. if(!head || !*head){
  66. return 0;
  67. }
  68. int i = 1;
  69. msg_queue_t *tail = *head;
  70. if(tail){
  71. while(tail->next!=NULL){
  72. tail = tail->next;
  73. i++;
  74. }
  75. }
  76. return i;
  77. }