32#include "contiki-lib.h"
41MEMB(prop_lists_mem,
struct mqtt_prop_list, MQTT_PROP_MAX_OUT_PROP_LISTS);
42MEMB(props_mem,
struct mqtt_prop_out_property, MQTT_PROP_MAX_OUT_PROPS);
55encode_prop_fixed_len_int(
struct mqtt_prop_out_property **prop_out,
60 DBG(
"MQTT - Creating %d-byte int property %i\n", len, val);
62 if(len > MQTT_PROP_MAX_PROP_LENGTH) {
63 DBG(
"MQTT - Error, property too long (max %i bytes)", MQTT_PROP_MAX_PROP_LENGTH);
67 for(i = len - 1; i >= 0; i--) {
68 (*prop_out)->val[i] = val & 0x00FF;
72 (*prop_out)->property_len = len;
76encode_prop_utf8(
struct mqtt_prop_out_property **prop_out,
81 DBG(
"MQTT - Encoding UTF-8 Property %s\n", str);
82 str_len = strlen(str);
85 if((str_len + 2) > MQTT_PROP_MAX_PROP_LENGTH) {
86 DBG(
"MQTT - Error, property too long (max %i bytes)", MQTT_PROP_MAX_PROP_LENGTH);
90 (*prop_out)->val[0] = str_len >> 8;
91 (*prop_out)->val[1] = str_len & 0x00FF;
92 memcpy((*prop_out)->val + 2, str, str_len);
94 (*prop_out)->property_len = str_len + 2;
98encode_prop_binary(
struct mqtt_prop_out_property **prop_out,
99 const char *data,
int data_len)
101 DBG(
"MQTT - Encoding Binary Data (%d bytes)\n", data_len);
103 if((data_len + 2) > MQTT_PROP_MAX_PROP_LENGTH) {
104 DBG(
"MQTT - Error, property too long (max %i bytes)", MQTT_PROP_MAX_PROP_LENGTH);
108 (*prop_out)->val[0] = data_len >> 8;
109 (*prop_out)->val[1] = data_len & 0x00FF;
110 memcpy((*prop_out)->val + 2, data, data_len);
112 (*prop_out)->property_len = data_len + 2;
116encode_prop_var_byte_int(
struct mqtt_prop_out_property **prop_out,
121 DBG(
"MQTT - Encoding Variable Byte Integer %d\n", val);
123 mqtt_encode_var_byte_int(
128 (*prop_out)->property_len = id_len;
132mqtt_prop_encode(
struct mqtt_prop_out_property **prop_out, mqtt_vhdr_prop_t prop_id,
135 DBG(
"MQTT - Creating property with ID %i\n", prop_id);
138 DBG(
"MQTT - Error, property target NULL!\n");
142 (*prop_out)->property_len = 0;
143 (*prop_out)->id = prop_id;
147 case MQTT_VHDR_PROP_PAYLOAD_FMT_IND:
148 case MQTT_VHDR_PROP_REQ_PROBLEM_INFO:
149 case MQTT_VHDR_PROP_REQ_RESP_INFO: {
152 val = va_arg(args,
int);
153 encode_prop_fixed_len_int(prop_out, val, 1);
157 case MQTT_VHDR_PROP_RECEIVE_MAX:
158 case MQTT_VHDR_PROP_TOPIC_ALIAS_MAX:
159 case MQTT_VHDR_PROP_TOPIC_ALIAS: {
162 val = va_arg(args,
int);
163 encode_prop_fixed_len_int(prop_out, val, 2);
167 case MQTT_VHDR_PROP_MSG_EXP_INT:
168 case MQTT_VHDR_PROP_SESS_EXP_INT:
169 case MQTT_VHDR_PROP_WILL_DELAY_INT:
170 case MQTT_VHDR_PROP_MAX_PKT_SZ: {
173 val = va_arg(args,
int);
174 encode_prop_fixed_len_int(prop_out, val, 4);
178 case MQTT_VHDR_PROP_CONTENT_TYPE:
179 case MQTT_VHDR_PROP_RESP_TOPIC:
180 case MQTT_VHDR_PROP_AUTH_METHOD: {
183 str = va_arg(args,
const char *);
184 encode_prop_utf8(prop_out, str);
188 case MQTT_VHDR_PROP_CORRELATION_DATA:
189 case MQTT_VHDR_PROP_AUTH_DATA: {
193 data = va_arg(args,
const char *);
194 data_len = va_arg(args,
int);
196 encode_prop_binary(prop_out, data, data_len);
200 case MQTT_VHDR_PROP_SUB_ID: {
203 val = va_arg(args,
int);
205 encode_prop_var_byte_int(prop_out, val);
209 case MQTT_VHDR_PROP_USER_PROP: {
215 name = va_arg(args,
const char *);
216 value = va_arg(args,
const char *);
218 name_len = strlen(name);
219 val_len = strlen(
value);
221 DBG(
"MQTT - Encoding User Property '%s: %s'\n", name,
value);
224 if((name_len + val_len + 4) > MQTT_PROP_MAX_PROP_LENGTH) {
225 DBG(
"MQTT - Error, property '%i' too long (max %i bytes)", prop_id, MQTT_PROP_MAX_PROP_LENGTH);
229 (*prop_out)->val[0] = name_len >> 8;
230 (*prop_out)->val[1] = name_len & 0x00FF;
231 memcpy((*prop_out)->val + 2, name, strlen(name));
232 (*prop_out)->val[name_len + 2] = val_len >> 8;
233 (*prop_out)->val[name_len + 3] = val_len & 0x00FF;
234 memcpy((*prop_out)->val + name_len + 4,
value, strlen(
value));
236 (*prop_out)->property_len = strlen(name) + strlen(
value) + 4;
240 DBG(
"MQTT - Error, no such property '%i'\n", prop_id);
245 DBG(
"MQTT - Property encoded length %i\n", (*prop_out)->property_len);
247 return (*prop_out)->property_len;
252mqtt_prop_decode_input_props(
struct mqtt_connection *conn)
254 uint8_t prop_len_bytes;
256 DBG(
"MQTT - Parsing input properties\n");
259 if(((conn->in_packet.fhdr & 0xF0) == MQTT_FHDR_MSG_TYPE_PINGREQ) ||
260 ((conn->in_packet.fhdr & 0xF0) == MQTT_FHDR_MSG_TYPE_PINGRESP)) {
264 DBG(
"MQTT - Getting length\n");
267 mqtt_decode_var_byte_int(conn->in_packet.payload_start,
268 conn->in_packet.remaining_length - (conn->in_packet.payload_start - conn->in_packet.payload),
269 NULL, NULL, &conn->in_packet.properties_len);
271 if(prop_len_bytes == 0) {
272 DBG(
"MQTT - Error decoding input properties (out of bounds)\n");
276 DBG(
"MQTT - Received %i VBI property bytes\n", prop_len_bytes);
277 DBG(
"MQTT - Input properties length %i\n", conn->in_packet.properties_len);
282 conn->in_packet.properties_enc_len = prop_len_bytes;
284 conn->in_packet.props_start = conn->in_packet.payload_start + prop_len_bytes;
285 conn->in_packet.payload_start += prop_len_bytes;
286 conn->in_packet.curr_props_pos = conn->in_packet.props_start;
288 DBG(
"MQTT - First byte of first prop %i\n", *conn->in_packet.curr_props_pos);
290 conn->in_packet.has_props = 1;
295decode_prop_utf8(
struct mqtt_connection *conn,
296 uint8_t *buf_in, uint32_t buf_in_len,
302 if(buf_in_len < MQTT_STRING_LEN_SIZE) {
303 DBG(
"MQTT - Error, truncated UTF8 string property\n");
307 len = (buf_in[0] << 8) + buf_in[1];
309 DBG(
"MQTT - Decoding %d-char UTF8 string property\n", len);
312 if(len + MQTT_STRING_LEN_SIZE > buf_in_len) {
313 DBG(
"MQTT - Error, UTF8 string property exceeds input\n");
318 if((len + MQTT_STRING_LEN_SIZE + 1) > MQTT_PROP_MAX_PROP_LENGTH) {
319 DBG(
"MQTT - Error, property too long (max %i bytes)", MQTT_PROP_MAX_PROP_LENGTH);
323 memcpy(data, buf_in, len + MQTT_STRING_LEN_SIZE);
324 data[len + MQTT_STRING_LEN_SIZE] =
'\0';
327 return len + MQTT_STRING_LEN_SIZE;
331decode_prop_fixed_len_int(
struct mqtt_connection *conn,
332 uint8_t *buf_in, uint32_t buf_in_len,
int len,
338 DBG(
"MQTT - Decoding %d-byte int property\n", len);
340 if(len > MQTT_PROP_MAX_PROP_LENGTH) {
341 DBG(
"MQTT - Error, property too long (max %i bytes)", MQTT_PROP_MAX_PROP_LENGTH);
346 if((uint32_t)len > buf_in_len) {
347 DBG(
"MQTT - Error, int property exceeds input\n");
354 data_out = (uint32_t *)data;
356 for(i = 0; i < 4; i++) {
357 *data_out = *data_out << 8;
360 *data_out += buf_in[i];
368decode_prop_vbi(
struct mqtt_connection *conn,
369 uint8_t *buf_in, uint32_t buf_in_len,
372 uint8_t prop_len_bytes;
374 DBG(
"MQTT - Decoding Variable Byte Integer property\n");
383 mqtt_decode_var_byte_int(buf_in, buf_in_len < 4 ? buf_in_len : 4,
384 NULL, NULL, (uint16_t *)data);
386 if(prop_len_bytes == 0) {
387 DBG(
"MQTT - Error decoding Variable Byte Integer\n");
391 if(prop_len_bytes > MQTT_PROP_MAX_PROP_LENGTH) {
392 DBG(
"MQTT - Error, property too long (max %i bytes)", MQTT_PROP_MAX_PROP_LENGTH);
396 return prop_len_bytes;
400decode_prop_binary_data(
struct mqtt_connection *conn,
401 uint8_t *buf_in, uint32_t buf_in_len,
406 DBG(
"MQTT - Decoding Binary Data property\n");
409 if(buf_in_len < MQTT_STRING_LEN_SIZE) {
410 DBG(
"MQTT - Error, truncated Binary Data property\n");
414 data_len = (buf_in[0] << 8) + buf_in[1];
417 DBG(
"MQTT - Error decoding Binary Data property length\n");
422 if(data_len + MQTT_STRING_LEN_SIZE > buf_in_len) {
423 DBG(
"MQTT - Error, Binary Data property exceeds input\n");
427 if((data_len + MQTT_STRING_LEN_SIZE) > MQTT_PROP_MAX_PROP_LENGTH) {
428 DBG(
"MQTT - Error, property too long (max %i bytes)", MQTT_PROP_MAX_PROP_LENGTH);
432 memcpy(data, buf_in, data_len + MQTT_STRING_LEN_SIZE);
434 return data_len + MQTT_STRING_LEN_SIZE;
438decode_prop_utf8_pair(
struct mqtt_connection *conn,
439 uint8_t *buf_in, uint32_t buf_in_len,
447 if(buf_in_len < MQTT_STRING_LEN_SIZE) {
448 DBG(
"MQTT - Error, truncated UTF8 string pair property\n");
452 len1 = (buf_in[0] << 8) + buf_in[1];
457 if(len1 + 2 * MQTT_STRING_LEN_SIZE > buf_in_len) {
458 DBG(
"MQTT - Error, UTF8 string pair property exceeds input\n");
462 len2 = (buf_in[len1 + MQTT_STRING_LEN_SIZE] << 8) + buf_in[len1 + MQTT_STRING_LEN_SIZE + 1];
463 total_len = len1 + len2;
465 DBG(
"MQTT - Decoding %d-char UTF8 string pair property (%i + %i)\n", total_len, len1, len2);
468 if(total_len + 2 * MQTT_STRING_LEN_SIZE > buf_in_len) {
469 DBG(
"MQTT - Error, UTF8 string pair property exceeds input\n");
473 if((total_len + 2 * MQTT_STRING_LEN_SIZE) > MQTT_PROP_MAX_PROP_LENGTH) {
474 DBG(
"MQTT - Error, property too long (max %i bytes)", MQTT_PROP_MAX_PROP_LENGTH);
478 memcpy(data, buf_in, total_len + 2 * MQTT_STRING_LEN_SIZE);
481 return total_len + 2 * MQTT_STRING_LEN_SIZE;
485parse_prop(
struct mqtt_connection *conn,
486 mqtt_vhdr_prop_t prop_id, uint8_t *buf_in, uint32_t buf_in_len,
490 case MQTT_VHDR_PROP_PAYLOAD_FMT_IND:
491 case MQTT_VHDR_PROP_REQ_PROBLEM_INFO:
492 case MQTT_VHDR_PROP_REQ_RESP_INFO:
493 case MQTT_VHDR_PROP_MAX_QOS:
494 case MQTT_VHDR_PROP_RETAIN_AVAIL:
495 case MQTT_VHDR_PROP_WILD_SUB_AVAIL:
496 case MQTT_VHDR_PROP_SUB_ID_AVAIL:
497 case MQTT_VHDR_PROP_SHARED_SUB_AVAIL: {
498 return decode_prop_fixed_len_int(conn, buf_in, buf_in_len, 1, data);
500 case MQTT_VHDR_PROP_RECEIVE_MAX:
501 case MQTT_VHDR_PROP_TOPIC_ALIAS_MAX:
502 case MQTT_VHDR_PROP_SERVER_KEEP_ALIVE: {
503 return decode_prop_fixed_len_int(conn, buf_in, buf_in_len, 2, data);
505 case MQTT_VHDR_PROP_MSG_EXP_INT:
506 case MQTT_VHDR_PROP_SESS_EXP_INT:
507 case MQTT_VHDR_PROP_WILL_DELAY_INT:
508 case MQTT_VHDR_PROP_MAX_PKT_SZ: {
509 return decode_prop_fixed_len_int(conn, buf_in, buf_in_len, 4, data);
511 case MQTT_VHDR_PROP_CONTENT_TYPE:
512 case MQTT_VHDR_PROP_RESP_TOPIC:
513 case MQTT_VHDR_PROP_AUTH_METHOD:
514 case MQTT_VHDR_PROP_ASSIGNED_CLIENT_ID:
515 case MQTT_VHDR_PROP_RESP_INFO:
516 case MQTT_VHDR_PROP_SERVER_REFERENCE:
517 case MQTT_VHDR_PROP_REASON_STRING: {
518 return decode_prop_utf8(conn, buf_in, buf_in_len, data);
520 case MQTT_VHDR_PROP_CORRELATION_DATA:
521 case MQTT_VHDR_PROP_AUTH_DATA: {
522 return decode_prop_binary_data(conn, buf_in, buf_in_len, data);
524 case MQTT_VHDR_PROP_SUB_ID: {
525 return decode_prop_vbi(conn, buf_in, buf_in_len, data);
527 case MQTT_VHDR_PROP_USER_PROP: {
528 return decode_prop_utf8_pair(conn, buf_in, buf_in_len, data);
531 DBG(
"MQTT - Error, no such property '%i'", prop_id);
540mqtt_get_next_in_prop(
struct mqtt_connection *conn,
541 mqtt_vhdr_prop_t *prop_id, uint8_t *data)
544 uint8_t prop_id_len_bytes;
545 uint16_t prop_id_decode;
546 uint32_t props_offset;
547 uint32_t props_avail;
548 uint32_t props_consumed;
549 uint32_t buf_remaining;
551 if(!conn->in_packet.has_props) {
552 DBG(
"MQTT - Message has no input properties");
556 DBG(
"MQTT - Curr prop pos %i; len %i; byte %i\n", (conn->in_packet.curr_props_pos - conn->in_packet.props_start),
557 conn->in_packet.properties_len,
558 *conn->in_packet.curr_props_pos);
569 (uint32_t)(conn->in_packet.props_start - conn->in_packet.payload);
570 if(conn->in_packet.payload_pos <= props_offset) {
571 DBG(
"MQTT - Message has no more input properties\n");
575 props_avail = conn->in_packet.payload_pos - props_offset;
576 if(conn->in_packet.properties_len < props_avail) {
577 props_avail = conn->in_packet.properties_len;
581 (uint32_t)(conn->in_packet.curr_props_pos - conn->in_packet.props_start);
582 if(props_consumed >= props_avail) {
583 DBG(
"MQTT - Message has no more input properties\n");
587 buf_remaining = props_avail - props_consumed;
590 mqtt_decode_var_byte_int(conn->in_packet.curr_props_pos,
592 NULL, NULL, (uint16_t *)&prop_id_decode);
594 if(prop_id_len_bytes == 0 || prop_id_len_bytes >= buf_remaining) {
595 DBG(
"MQTT - Error decoding property ID (out of bounds)\n");
599 *prop_id = prop_id_decode;
601 DBG(
"MQTT - Decoded property ID %i (encoded using %i bytes)\n", *prop_id, prop_id_len_bytes);
603 prop_len = parse_prop(conn, *prop_id,
604 conn->in_packet.curr_props_pos + prop_id_len_bytes,
605 buf_remaining - prop_id_len_bytes, data);
607 DBG(
"MQTT - Decoded property len %i bytes\n", prop_len);
609 conn->in_packet.curr_props_pos += prop_id_len_bytes + prop_len;
615mqtt_prop_parse_connack_props(
struct mqtt_connection *conn)
618 mqtt_vhdr_prop_t prop_id;
619 uint8_t data[MQTT_PROP_MAX_PROP_LENGTH];
622 DBG(
"MQTT - Parsing CONNACK properties for server capabilities\n");
624 prop_len = mqtt_get_next_in_prop(conn, &prop_id, data);
627 case MQTT_VHDR_PROP_RETAIN_AVAIL: {
628 val_int = (uint32_t)*data;
630 conn->srv_feature_en &= ~MQTT_CAP_RETAIN_AVAIL;
634 case MQTT_VHDR_PROP_WILD_SUB_AVAIL: {
635 val_int = (uint32_t)*data;
637 conn->srv_feature_en &= ~MQTT_CAP_WILD_SUB_AVAIL;
641 case MQTT_VHDR_PROP_SUB_ID_AVAIL: {
642 val_int = (uint32_t)*data;
644 conn->srv_feature_en &= ~MQTT_CAP_SUB_ID_AVAIL;
648 case MQTT_VHDR_PROP_SHARED_SUB_AVAIL: {
649 val_int = (uint32_t)*data;
651 conn->srv_feature_en &= ~MQTT_CAP_SHARED_SUB_AVAIL;
656 DBG(
"MQTT - Error, unexpected CONNACK property '%i'", prop_id);
661 prop_len = mqtt_get_next_in_prop(conn, &prop_id, data);
666mqtt_prop_parse_auth_props(
struct mqtt_connection *conn,
struct mqtt_prop_auth_event *event)
669 mqtt_vhdr_prop_t prop_id;
670 uint8_t data[MQTT_PROP_MAX_PROP_LENGTH];
672 DBG(
"MQTT - Parsing CONNACK properties for server capabilities\n");
674 event->auth_data.len = 0;
675 event->auth_method.length = 0;
677 prop_len = mqtt_get_next_in_prop(conn, &prop_id, data);
680 case MQTT_VHDR_PROP_AUTH_DATA: {
681 event->auth_data.len = prop_len - 2;
682 memcpy(event->auth_data.data, data, prop_len - 2);
685 case MQTT_VHDR_PROP_AUTH_METHOD: {
686 event->auth_method.length = prop_len - 2;
687 memcpy(event->auth_method.string, data, prop_len - 2);
691 DBG(
"MQTT - Unhandled AUTH property '%i'", prop_id);
696 prop_len = mqtt_get_next_in_prop(conn, &prop_id, data);
701mqtt_prop_print_input_props(
struct mqtt_connection *conn)
704 mqtt_vhdr_prop_t prop_id;
705 uint8_t data[MQTT_PROP_MAX_PROP_LENGTH];
708 DBG(
"MQTT - Printing all input properties\n");
710 prop_len = mqtt_get_next_in_prop(conn, &prop_id, data);
712 DBG(
"MQTT - Property ID %i, length %i\n", prop_id, prop_len);
715 case MQTT_VHDR_PROP_PAYLOAD_FMT_IND:
716 case MQTT_VHDR_PROP_REQ_PROBLEM_INFO:
717 case MQTT_VHDR_PROP_REQ_RESP_INFO:
718 case MQTT_VHDR_PROP_MSG_EXP_INT:
719 case MQTT_VHDR_PROP_SESS_EXP_INT:
720 case MQTT_VHDR_PROP_WILL_DELAY_INT:
721 case MQTT_VHDR_PROP_MAX_PKT_SZ:
722 case MQTT_VHDR_PROP_RECEIVE_MAX:
723 case MQTT_VHDR_PROP_TOPIC_ALIAS_MAX:
724 case MQTT_VHDR_PROP_SUB_ID: {
725 DBG(
"MQTT - Decoded property value '%i'\n", (uint32_t)*data);
728 case MQTT_VHDR_PROP_CONTENT_TYPE:
729 case MQTT_VHDR_PROP_RESP_TOPIC:
730 case MQTT_VHDR_PROP_AUTH_METHOD: {
731 DBG(
"MQTT - Decoded property value ");
732 DBG(
"(%i %i) %s", data[0], data[1], data + MQTT_STRING_LEN_SIZE);
736 case MQTT_VHDR_PROP_CORRELATION_DATA:
737 case MQTT_VHDR_PROP_AUTH_DATA: {
738 DBG(
"MQTT - Decoded property value (%i %i) ", data[0], data[1]);
739 for(i = 2; i < prop_len; i++) {
745 case MQTT_VHDR_PROP_USER_PROP: {
750 len1 = (data[0] << 8) + data[1];
751 len2 = (data[len1 + MQTT_STRING_LEN_SIZE] << 8) + data[len1 + MQTT_STRING_LEN_SIZE + 1];
753 DBG(
"MQTT - Decoded property value [(%i %i) %.*s, (%i %i) %.*s]",
754 data[0], data[1], len1, data + MQTT_STRING_LEN_SIZE,
755 data[len1 + MQTT_STRING_LEN_SIZE], data[len1 + MQTT_STRING_LEN_SIZE + 1], len2, data + len1 + 2 * MQTT_STRING_LEN_SIZE);
760 DBG(
"MQTT - Error, no such property '%i'\n", prop_id);
765 prop_len = mqtt_get_next_in_prop(conn, &prop_id, data);
774mqtt_prop_create_list(
struct mqtt_prop_list **prop_list_out)
776 DBG(
"MQTT - Creating Property List\n");
778#if MQTT_PROP_USE_MEMB
782 if(!(*prop_list_out)) {
783 DBG(
"MQTT - Error, allocated too many property lists (max %i)\n", MQTT_PROP_MAX_OUT_PROP_LISTS);
787 DBG(
"MQTT - Allocated Property list\n");
791 DBG(
"MQTT - mem %p prop_list\n", *prop_list_out);
793 (*prop_list_out)->properties_len = 0;
794 (*prop_list_out)->properties_len_enc_bytes = 1;
802mqtt_prop_print_list(
struct mqtt_prop_list *prop_list, mqtt_vhdr_prop_t prop_id)
804 struct mqtt_prop_out_property *prop;
806 if(prop_list == NULL || prop_list->props == NULL) {
807 DBG(
"MQTT - Prop list empty\n");
809 prop = (
struct mqtt_prop_out_property *)
list_head(prop_list->props);
812 if(prop != NULL && (prop->id == prop_id || prop_id == MQTT_VHDR_PROP_ANY)) {
813 DBG(
"Property %p ID %i len %i\n", prop, prop->id, prop->property_len);
816 }
while(prop != NULL);
821mqtt_prop_register_internal(
struct mqtt_prop_list **prop_list,
822#
if !MQTT_PROP_USE_MEMB
823 struct mqtt_prop_out_property *prop,
826 mqtt_vhdr_prop_t prop_id,
827 struct mqtt_prop_out_property **prop_out, ...)
831 DBG(
"MQTT - Error encoding prop %i on msg %i; list NULL\n", prop_id, msg);
835 DBG(
"MQTT - prop list %p\n", *prop_list);
836 DBG(
"MQTT - prop list->list %p\n", (*prop_list)->props);
838#if MQTT_PROP_USE_MEMB
839 struct mqtt_prop_out_property *prop =
memb_alloc(&props_mem);
843 DBG(
"MQTT - Error, allocated too many properties (max %i)\n", MQTT_PROP_MAX_OUT_PROPS);
848 DBG(
"MQTT - Allocated prop %p\n", prop);
851 va_start(args, prop_out);
852 uint32_t prop_len = mqtt_prop_encode(&prop, prop_id, args);
855 DBG(
"MQTT - Adding prop %p to prop_list %p\n", prop, *prop_list);
856 list_add((*prop_list)->props, prop);
857 (*prop_list)->properties_len += 1;
858 (*prop_list)->properties_len += prop_len;
859 mqtt_encode_var_byte_int(
860 (*prop_list)->properties_len_enc,
861 &((*prop_list)->properties_len_enc_bytes),
862 (*prop_list)->properties_len);
863 DBG(
"MQTT - New prop_list length %i\n", (*prop_list)->properties_len);
865 DBG(
"MQTT - Error encoding prop %i on msg %i\n", prop_id, msg);
866#if MQTT_PROP_USE_MEMB
883mqtt_remove_prop(
struct mqtt_prop_list **prop_list,
884 struct mqtt_prop_out_property *prop)
886 if(prop != NULL && prop_list != NULL &&
list_contains((*prop_list)->props, prop)) {
887 DBG(
"MQTT - Removing property %p from list %p\n", prop, *prop_list);
893 (*prop_list)->properties_len -= prop->property_len;
894 (*prop_list)->properties_len -= 1;
896 mqtt_encode_var_byte_int(
897 (*prop_list)->properties_len_enc,
898 &((*prop_list)->properties_len_enc_bytes),
899 (*prop_list)->properties_len);
902#if MQTT_PROP_USE_MEMB
907 DBG(
"MQTT - Cannot remove property\n");
913mqtt_prop_clear_list(
struct mqtt_prop_list **prop_list)
915 struct mqtt_prop_out_property *prop;
917 DBG(
"MQTT - Clearing Property List\n");
919 if(prop_list == NULL ||
list_length((*prop_list)->props) == 0) {
920 DBG(
"MQTT - Prop list empty\n");
923 prop = (
struct mqtt_prop_out_property *)
list_head((*prop_list)->props);
927 (void)mqtt_remove_prop(prop_list, prop);
929 prop = (
struct mqtt_prop_out_property *)
list_head((*prop_list)->props);
930 }
while(prop != NULL);
935 if((*prop_list)->properties_len != 0 || (*prop_list)->properties_len_enc_bytes != 1) {
936 DBG(
"MQTT - Something went wrong when clearing property list!\n");
static int value(int type)
static void * list_item_next(const void *item)
Get the next item following this item.
int list_length(const_list_t list)
Get the length of a list.
void list_add(list_t list, void *item)
Add an item at the end of a list.
void list_remove(list_t list, const void *item)
Remove a specific element from a list.
bool list_contains(const_list_t list, const void *item)
Check if the list contains an item.
#define LIST_STRUCT_INIT(struct_ptr, name)
Initialize a linked list that is part of a structure.
static void * list_head(const_list_t list)
Get a pointer to the first element of a list.
int memb_free(struct memb *m, void *ptr)
Deallocate a memory block from a memory block previously declared with MEMB().
void * memb_alloc(struct memb *m)
Allocate a memory block from a block of memory declared with MEMB().
void memb_init(struct memb *m)
Initialize a memory block that was declared with MEMB().
#define MEMB(name, structure, num)
Declare a memory block.
Memory block allocation routines.
Header file for the Contiki MQTT engine.