A small memory footprint AMQP implimentation

Dependents:   iothub_client_sample_amqp remote_monitoring simplesample_amqp

Committer:
AzureIoTClient
Date:
Fri Jun 30 10:41:22 2017 -0700
Revision:
28:add19eb7defa
Parent:
24:2c59c2d43ebf
Child:
40:f0ceafa8d570
1.1.18

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Azure.IoT Build 0:6ae2f7bca550 1 // Copyright (c) Microsoft. All rights reserved.
Azure.IoT Build 0:6ae2f7bca550 2 // Licensed under the MIT license. See LICENSE file in the project root for full license information.
Azure.IoT Build 0:6ae2f7bca550 3
Azure.IoT Build 0:6ae2f7bca550 4 #include <stdlib.h>
Azure.IoT Build 0:6ae2f7bca550 5 #include <string.h>
AzureIoTClient 24:2c59c2d43ebf 6 #include <stdint.h>
AzureIoTClient 19:000ab4e6a2c1 7 #include "azure_c_shared_utility/optimize_size.h"
AzureIoTClient 20:206846c14c80 8 #include "azure_c_shared_utility/gballoc.h"
AzureIoTClient 24:2c59c2d43ebf 9 #include "azure_c_shared_utility/xlogging.h"
Azure.IoT Build 0:6ae2f7bca550 10 #include "azure_uamqp_c/message.h"
Azure.IoT Build 0:6ae2f7bca550 11 #include "azure_uamqp_c/amqpvalue.h"
Azure.IoT Build 0:6ae2f7bca550 12
Azure.IoT Build 0:6ae2f7bca550 13 typedef struct BODY_AMQP_DATA_TAG
Azure.IoT Build 0:6ae2f7bca550 14 {
AzureIoTClient 28:add19eb7defa 15 unsigned char* body_data_section_bytes;
AzureIoTClient 28:add19eb7defa 16 size_t body_data_section_length;
Azure.IoT Build 0:6ae2f7bca550 17 } BODY_AMQP_DATA;
Azure.IoT Build 0:6ae2f7bca550 18
Azure.IoT Build 0:6ae2f7bca550 19 typedef struct MESSAGE_INSTANCE_TAG
Azure.IoT Build 0:6ae2f7bca550 20 {
AzureIoTClient 28:add19eb7defa 21 BODY_AMQP_DATA* body_amqp_data_items;
AzureIoTClient 28:add19eb7defa 22 size_t body_amqp_data_count;
AzureIoTClient 28:add19eb7defa 23 AMQP_VALUE* body_amqp_sequence_items;
AzureIoTClient 28:add19eb7defa 24 size_t body_amqp_sequence_count;
AzureIoTClient 28:add19eb7defa 25 AMQP_VALUE body_amqp_value;
AzureIoTClient 28:add19eb7defa 26 HEADER_HANDLE header;
AzureIoTClient 28:add19eb7defa 27 delivery_annotations delivery_annotations;
AzureIoTClient 28:add19eb7defa 28 message_annotations message_annotations;
AzureIoTClient 28:add19eb7defa 29 PROPERTIES_HANDLE properties;
AzureIoTClient 28:add19eb7defa 30 application_properties application_properties;
AzureIoTClient 28:add19eb7defa 31 annotations footer;
Azure.IoT Build 0:6ae2f7bca550 32 uint32_t message_format;
Azure.IoT Build 0:6ae2f7bca550 33 } MESSAGE_INSTANCE;
Azure.IoT Build 0:6ae2f7bca550 34
AzureIoTClient 28:add19eb7defa 35 MESSAGE_BODY_TYPE internal_get_body_type(MESSAGE_HANDLE message)
AzureIoTClient 28:add19eb7defa 36 {
AzureIoTClient 28:add19eb7defa 37 MESSAGE_BODY_TYPE result;
AzureIoTClient 28:add19eb7defa 38
AzureIoTClient 28:add19eb7defa 39 if (message->body_amqp_value != NULL)
AzureIoTClient 28:add19eb7defa 40 {
AzureIoTClient 28:add19eb7defa 41 result = MESSAGE_BODY_TYPE_VALUE;
AzureIoTClient 28:add19eb7defa 42 }
AzureIoTClient 28:add19eb7defa 43 else if (message->body_amqp_data_count > 0)
AzureIoTClient 28:add19eb7defa 44 {
AzureIoTClient 28:add19eb7defa 45 result = MESSAGE_BODY_TYPE_DATA;
AzureIoTClient 28:add19eb7defa 46 }
AzureIoTClient 28:add19eb7defa 47 else if (message->body_amqp_sequence_count > 0)
AzureIoTClient 28:add19eb7defa 48 {
AzureIoTClient 28:add19eb7defa 49 result = MESSAGE_BODY_TYPE_SEQUENCE;
AzureIoTClient 28:add19eb7defa 50 }
AzureIoTClient 28:add19eb7defa 51 else
AzureIoTClient 28:add19eb7defa 52 {
AzureIoTClient 28:add19eb7defa 53 result = MESSAGE_BODY_TYPE_NONE;
AzureIoTClient 28:add19eb7defa 54 }
AzureIoTClient 28:add19eb7defa 55
AzureIoTClient 28:add19eb7defa 56 return result;
AzureIoTClient 28:add19eb7defa 57 }
AzureIoTClient 28:add19eb7defa 58
AzureIoTClient 24:2c59c2d43ebf 59 static void free_all_body_data_items(MESSAGE_HANDLE message)
Azure.IoT Build 0:6ae2f7bca550 60 {
AzureIoTClient 28:add19eb7defa 61 size_t i;
Azure.IoT Build 0:6ae2f7bca550 62
AzureIoTClient 28:add19eb7defa 63 for (i = 0; i < message->body_amqp_data_count; i++)
AzureIoTClient 28:add19eb7defa 64 {
AzureIoTClient 28:add19eb7defa 65 if (message->body_amqp_data_items[i].body_data_section_bytes != NULL)
AzureIoTClient 28:add19eb7defa 66 {
AzureIoTClient 28:add19eb7defa 67 free(message->body_amqp_data_items[i].body_data_section_bytes);
AzureIoTClient 28:add19eb7defa 68 }
AzureIoTClient 28:add19eb7defa 69 }
Azure.IoT Build 0:6ae2f7bca550 70
AzureIoTClient 28:add19eb7defa 71 if (message->body_amqp_data_items != NULL)
AzureIoTClient 28:add19eb7defa 72 {
AzureIoTClient 28:add19eb7defa 73 free(message->body_amqp_data_items);
AzureIoTClient 28:add19eb7defa 74 }
AzureIoTClient 28:add19eb7defa 75 message->body_amqp_data_count = 0;
AzureIoTClient 28:add19eb7defa 76 message->body_amqp_data_items = NULL;
Azure.IoT Build 0:6ae2f7bca550 77 }
Azure.IoT Build 0:6ae2f7bca550 78
AzureIoTClient 24:2c59c2d43ebf 79 static void free_all_body_sequence_items(MESSAGE_HANDLE message)
Azure.IoT Build 0:6ae2f7bca550 80 {
AzureIoTClient 28:add19eb7defa 81 size_t i;
Azure.IoT Build 0:6ae2f7bca550 82
AzureIoTClient 28:add19eb7defa 83 for (i = 0; i < message->body_amqp_sequence_count; i++)
AzureIoTClient 28:add19eb7defa 84 {
AzureIoTClient 28:add19eb7defa 85 if (message->body_amqp_sequence_items[i] != NULL)
AzureIoTClient 28:add19eb7defa 86 {
AzureIoTClient 28:add19eb7defa 87 /* Codes_SRS_MESSAGE_01_137: [ Each sequence shall be freed by calling `amqpvalue_destroy`. ]*/
AzureIoTClient 28:add19eb7defa 88 amqpvalue_destroy(message->body_amqp_sequence_items[i]);
AzureIoTClient 28:add19eb7defa 89 }
AzureIoTClient 28:add19eb7defa 90 }
Azure.IoT Build 0:6ae2f7bca550 91
AzureIoTClient 28:add19eb7defa 92 if (message->body_amqp_sequence_items != NULL)
AzureIoTClient 28:add19eb7defa 93 {
AzureIoTClient 28:add19eb7defa 94 free(message->body_amqp_sequence_items);
AzureIoTClient 28:add19eb7defa 95 }
AzureIoTClient 28:add19eb7defa 96 message->body_amqp_sequence_count = 0;
AzureIoTClient 28:add19eb7defa 97 message->body_amqp_sequence_items = NULL;
Azure.IoT Build 0:6ae2f7bca550 98 }
Azure.IoT Build 0:6ae2f7bca550 99
Azure.IoT Build 0:6ae2f7bca550 100 MESSAGE_HANDLE message_create(void)
Azure.IoT Build 0:6ae2f7bca550 101 {
AzureIoTClient 28:add19eb7defa 102 MESSAGE_HANDLE result = (MESSAGE_HANDLE)malloc(sizeof(MESSAGE_INSTANCE));
AzureIoTClient 28:add19eb7defa 103 if (result == NULL)
AzureIoTClient 28:add19eb7defa 104 {
AzureIoTClient 28:add19eb7defa 105 /* Codes_SRS_MESSAGE_01_002: [If allocating memory for the message fails, `message_create` shall fail and return NULL.] */
AzureIoTClient 28:add19eb7defa 106 LogError("Cannot allocate memory for message");
AzureIoTClient 28:add19eb7defa 107 }
AzureIoTClient 28:add19eb7defa 108 else
AzureIoTClient 28:add19eb7defa 109 {
AzureIoTClient 28:add19eb7defa 110 result->header = NULL;
AzureIoTClient 28:add19eb7defa 111 result->delivery_annotations = NULL;
AzureIoTClient 28:add19eb7defa 112 result->message_annotations = NULL;
AzureIoTClient 28:add19eb7defa 113 result->properties = NULL;
AzureIoTClient 28:add19eb7defa 114 result->application_properties = NULL;
AzureIoTClient 28:add19eb7defa 115 result->footer = NULL;
AzureIoTClient 28:add19eb7defa 116 result->body_amqp_data_items = NULL;
AzureIoTClient 28:add19eb7defa 117 result->body_amqp_data_count = 0;
AzureIoTClient 28:add19eb7defa 118 result->body_amqp_value = NULL;
AzureIoTClient 28:add19eb7defa 119 result->body_amqp_sequence_items = NULL;
AzureIoTClient 28:add19eb7defa 120 result->body_amqp_sequence_count = 0;
AzureIoTClient 28:add19eb7defa 121
AzureIoTClient 28:add19eb7defa 122 /* Codes_SRS_MESSAGE_01_135: [ By default a message on which `message_set_message_format` was not called shall have message format set to 0. ]*/
Azure.IoT Build 0:6ae2f7bca550 123 result->message_format = 0;
AzureIoTClient 28:add19eb7defa 124 }
Azure.IoT Build 0:6ae2f7bca550 125
AzureIoTClient 28:add19eb7defa 126 /* Codes_SRS_MESSAGE_01_001: [`message_create` shall create a new AMQP message instance and on success it shall return a non-NULL handle for the newly created message instance.] */
AzureIoTClient 28:add19eb7defa 127 return result;
Azure.IoT Build 0:6ae2f7bca550 128 }
Azure.IoT Build 0:6ae2f7bca550 129
Azure.IoT Build 0:6ae2f7bca550 130 MESSAGE_HANDLE message_clone(MESSAGE_HANDLE source_message)
Azure.IoT Build 0:6ae2f7bca550 131 {
AzureIoTClient 28:add19eb7defa 132 MESSAGE_HANDLE result;
Azure.IoT Build 0:6ae2f7bca550 133
AzureIoTClient 28:add19eb7defa 134 if (source_message == NULL)
AzureIoTClient 28:add19eb7defa 135 {
AzureIoTClient 28:add19eb7defa 136 /* Codes_SRS_MESSAGE_01_062: [If `source_message` is NULL, `message_clone` shall fail and return NULL.] */
AzureIoTClient 28:add19eb7defa 137 LogError("NULL source_message");
AzureIoTClient 28:add19eb7defa 138 result = NULL;
AzureIoTClient 28:add19eb7defa 139 }
AzureIoTClient 28:add19eb7defa 140 else
AzureIoTClient 28:add19eb7defa 141 {
AzureIoTClient 28:add19eb7defa 142 /* Codes_SRS_MESSAGE_01_003: [`message_clone` shall clone a message entirely and on success return a non-NULL handle to the cloned message.] */
AzureIoTClient 28:add19eb7defa 143 result = (MESSAGE_HANDLE)message_create();
AzureIoTClient 28:add19eb7defa 144 if (result == NULL)
AzureIoTClient 28:add19eb7defa 145 {
AzureIoTClient 28:add19eb7defa 146 /* Codes_SRS_MESSAGE_01_004: [If allocating memory for the new cloned message fails, `message_clone` shall fail and return NULL.] */
AzureIoTClient 28:add19eb7defa 147 LogError("Cannot clone message");
AzureIoTClient 28:add19eb7defa 148 }
AzureIoTClient 28:add19eb7defa 149 else
AzureIoTClient 28:add19eb7defa 150 {
AzureIoTClient 24:2c59c2d43ebf 151 result->message_format = source_message->message_format;
Azure.IoT Build 0:6ae2f7bca550 152
AzureIoTClient 28:add19eb7defa 153 if (source_message->header != NULL)
AzureIoTClient 28:add19eb7defa 154 {
AzureIoTClient 28:add19eb7defa 155 /* Codes_SRS_MESSAGE_01_005: [If a header exists on the source message it shall be cloned by using `header_clone`.] */
AzureIoTClient 28:add19eb7defa 156 result->header = header_clone(source_message->header);
AzureIoTClient 28:add19eb7defa 157 if (result->header == NULL)
AzureIoTClient 28:add19eb7defa 158 {
AzureIoTClient 28:add19eb7defa 159 /* Codes_SRS_MESSAGE_01_012: [ If any cloning operation for the members of the source message fails, then `message_clone` shall fail and return NULL. ]*/
AzureIoTClient 28:add19eb7defa 160 LogError("Cannot clone message header");
AzureIoTClient 28:add19eb7defa 161 message_destroy(result);
AzureIoTClient 28:add19eb7defa 162 result = NULL;
AzureIoTClient 28:add19eb7defa 163 }
AzureIoTClient 28:add19eb7defa 164 }
Azure.IoT Build 0:6ae2f7bca550 165
AzureIoTClient 28:add19eb7defa 166 if ((result != NULL) && (source_message->delivery_annotations != NULL))
AzureIoTClient 28:add19eb7defa 167 {
AzureIoTClient 28:add19eb7defa 168 /* Codes_SRS_MESSAGE_01_006: [If delivery annotations exist on the source message they shall be cloned by using `annotations_clone`.] */
AzureIoTClient 28:add19eb7defa 169 result->delivery_annotations = annotations_clone(source_message->delivery_annotations);
AzureIoTClient 28:add19eb7defa 170 if (result->delivery_annotations == NULL)
AzureIoTClient 28:add19eb7defa 171 {
AzureIoTClient 28:add19eb7defa 172 /* Codes_SRS_MESSAGE_01_012: [ If any cloning operation for the members of the source message fails, then `message_clone` shall fail and return NULL. ]*/
AzureIoTClient 28:add19eb7defa 173 LogError("Cannot clone delivery annotations");
AzureIoTClient 28:add19eb7defa 174 message_destroy(result);
AzureIoTClient 28:add19eb7defa 175 result = NULL;
AzureIoTClient 28:add19eb7defa 176 }
AzureIoTClient 28:add19eb7defa 177 }
Azure.IoT Build 0:6ae2f7bca550 178
AzureIoTClient 28:add19eb7defa 179 if ((result != NULL) && (source_message->message_annotations != NULL))
AzureIoTClient 28:add19eb7defa 180 {
AzureIoTClient 28:add19eb7defa 181 /* Codes_SRS_MESSAGE_01_007: [If message annotations exist on the source message they shall be cloned by using `annotations_clone`.] */
AzureIoTClient 28:add19eb7defa 182 result->message_annotations = annotations_clone(source_message->message_annotations);
AzureIoTClient 28:add19eb7defa 183 if (result->message_annotations == NULL)
AzureIoTClient 28:add19eb7defa 184 {
AzureIoTClient 28:add19eb7defa 185 /* Codes_SRS_MESSAGE_01_012: [ If any cloning operation for the members of the source message fails, then `message_clone` shall fail and return NULL. ]*/
AzureIoTClient 28:add19eb7defa 186 LogError("Cannot clone message annotations");
AzureIoTClient 28:add19eb7defa 187 message_destroy(result);
AzureIoTClient 28:add19eb7defa 188 result = NULL;
AzureIoTClient 28:add19eb7defa 189 }
AzureIoTClient 28:add19eb7defa 190 }
Azure.IoT Build 0:6ae2f7bca550 191
AzureIoTClient 28:add19eb7defa 192 if ((result != NULL) && (source_message->properties != NULL))
AzureIoTClient 28:add19eb7defa 193 {
AzureIoTClient 28:add19eb7defa 194 /* Codes_SRS_MESSAGE_01_008: [If message properties exist on the source message they shall be cloned by using `properties_clone`.] */
AzureIoTClient 28:add19eb7defa 195 result->properties = properties_clone(source_message->properties);
AzureIoTClient 28:add19eb7defa 196 if (result->properties == NULL)
AzureIoTClient 28:add19eb7defa 197 {
AzureIoTClient 28:add19eb7defa 198 /* Codes_SRS_MESSAGE_01_012: [ If any cloning operation for the members of the source message fails, then `message_clone` shall fail and return NULL. ]*/
AzureIoTClient 28:add19eb7defa 199 LogError("Cannot clone message properties");
AzureIoTClient 28:add19eb7defa 200 message_destroy(result);
AzureIoTClient 28:add19eb7defa 201 result = NULL;
AzureIoTClient 28:add19eb7defa 202 }
AzureIoTClient 28:add19eb7defa 203 }
Azure.IoT Build 0:6ae2f7bca550 204
AzureIoTClient 28:add19eb7defa 205 if ((result != NULL) && (source_message->application_properties != NULL))
AzureIoTClient 28:add19eb7defa 206 {
AzureIoTClient 28:add19eb7defa 207 /* Codes_SRS_MESSAGE_01_009: [If application properties exist on the source message they shall be cloned by using `amqpvalue_clone`.] */
AzureIoTClient 28:add19eb7defa 208 result->application_properties = amqpvalue_clone(source_message->application_properties);
AzureIoTClient 28:add19eb7defa 209 if (result->application_properties == NULL)
AzureIoTClient 28:add19eb7defa 210 {
AzureIoTClient 28:add19eb7defa 211 /* Codes_SRS_MESSAGE_01_012: [ If any cloning operation for the members of the source message fails, then `message_clone` shall fail and return NULL. ]*/
AzureIoTClient 28:add19eb7defa 212 LogError("Cannot clone application annotations");
AzureIoTClient 28:add19eb7defa 213 message_destroy(result);
AzureIoTClient 28:add19eb7defa 214 result = NULL;
AzureIoTClient 28:add19eb7defa 215 }
AzureIoTClient 28:add19eb7defa 216 }
Azure.IoT Build 0:6ae2f7bca550 217
AzureIoTClient 28:add19eb7defa 218 if ((result != NULL) && (source_message->footer != NULL))
AzureIoTClient 28:add19eb7defa 219 {
AzureIoTClient 28:add19eb7defa 220 /* Codes_SRS_MESSAGE_01_010: [If a footer exists on the source message it shall be cloned by using `annotations_clone`.] */
AzureIoTClient 28:add19eb7defa 221 result->footer = amqpvalue_clone(source_message->footer);
AzureIoTClient 28:add19eb7defa 222 if (result->footer == NULL)
AzureIoTClient 28:add19eb7defa 223 {
AzureIoTClient 28:add19eb7defa 224 /* Codes_SRS_MESSAGE_01_012: [ If any cloning operation for the members of the source message fails, then `message_clone` shall fail and return NULL. ]*/
AzureIoTClient 28:add19eb7defa 225 LogError("Cannot clone message footer");
AzureIoTClient 28:add19eb7defa 226 message_destroy(result);
AzureIoTClient 28:add19eb7defa 227 result = NULL;
AzureIoTClient 28:add19eb7defa 228 }
AzureIoTClient 28:add19eb7defa 229 }
Azure.IoT Build 0:6ae2f7bca550 230
AzureIoTClient 28:add19eb7defa 231 if ((result != NULL) && (source_message->body_amqp_data_count > 0))
AzureIoTClient 28:add19eb7defa 232 {
AzureIoTClient 28:add19eb7defa 233 size_t i;
Azure.IoT Build 0:6ae2f7bca550 234
AzureIoTClient 28:add19eb7defa 235 result->body_amqp_data_items = (BODY_AMQP_DATA*)malloc(source_message->body_amqp_data_count * sizeof(BODY_AMQP_DATA));
AzureIoTClient 28:add19eb7defa 236 if (result->body_amqp_data_items == NULL)
AzureIoTClient 28:add19eb7defa 237 {
AzureIoTClient 28:add19eb7defa 238 /* Codes_SRS_MESSAGE_01_012: [ If any cloning operation for the members of the source message fails, then `message_clone` shall fail and return NULL. ]*/
AzureIoTClient 28:add19eb7defa 239 LogError("Cannot allocate memory for body data sections");
AzureIoTClient 28:add19eb7defa 240 message_destroy(result);
AzureIoTClient 28:add19eb7defa 241 result = NULL;
AzureIoTClient 28:add19eb7defa 242 }
AzureIoTClient 28:add19eb7defa 243 else
AzureIoTClient 28:add19eb7defa 244 {
AzureIoTClient 28:add19eb7defa 245 for (i = 0; i < source_message->body_amqp_data_count; i++)
AzureIoTClient 28:add19eb7defa 246 {
AzureIoTClient 28:add19eb7defa 247 result->body_amqp_data_items[i].body_data_section_length = source_message->body_amqp_data_items[i].body_data_section_length;
Azure.IoT Build 0:6ae2f7bca550 248
AzureIoTClient 28:add19eb7defa 249 /* Codes_SRS_MESSAGE_01_011: [If an AMQP data has been set as message body on the source message it shall be cloned by allocating memory for the binary payload.] */
AzureIoTClient 28:add19eb7defa 250 result->body_amqp_data_items[i].body_data_section_bytes = (unsigned char*)malloc(source_message->body_amqp_data_items[i].body_data_section_length);
AzureIoTClient 28:add19eb7defa 251 if (result->body_amqp_data_items[i].body_data_section_bytes == NULL)
AzureIoTClient 28:add19eb7defa 252 {
AzureIoTClient 28:add19eb7defa 253 LogError("Cannot allocate memory for body data section %u", (unsigned int)i);
AzureIoTClient 28:add19eb7defa 254 break;
AzureIoTClient 28:add19eb7defa 255 }
AzureIoTClient 28:add19eb7defa 256 else
AzureIoTClient 28:add19eb7defa 257 {
AzureIoTClient 28:add19eb7defa 258 (void)memcpy(result->body_amqp_data_items[i].body_data_section_bytes, source_message->body_amqp_data_items[i].body_data_section_bytes, result->body_amqp_data_items[i].body_data_section_length);
AzureIoTClient 28:add19eb7defa 259 }
AzureIoTClient 28:add19eb7defa 260 }
Azure.IoT Build 0:6ae2f7bca550 261
AzureIoTClient 28:add19eb7defa 262 result->body_amqp_data_count = i;
AzureIoTClient 28:add19eb7defa 263 if (i < source_message->body_amqp_data_count)
AzureIoTClient 28:add19eb7defa 264 {
AzureIoTClient 28:add19eb7defa 265 /* Codes_SRS_MESSAGE_01_012: [ If any cloning operation for the members of the source message fails, then `message_clone` shall fail and return NULL. ]*/
AzureIoTClient 28:add19eb7defa 266 message_destroy(result);
AzureIoTClient 28:add19eb7defa 267 result = NULL;
AzureIoTClient 28:add19eb7defa 268 }
AzureIoTClient 28:add19eb7defa 269 }
AzureIoTClient 28:add19eb7defa 270 }
Azure.IoT Build 0:6ae2f7bca550 271
AzureIoTClient 28:add19eb7defa 272 if ((result != NULL) && (source_message->body_amqp_sequence_count > 0))
AzureIoTClient 28:add19eb7defa 273 {
AzureIoTClient 28:add19eb7defa 274 size_t i;
Azure.IoT Build 0:6ae2f7bca550 275
AzureIoTClient 28:add19eb7defa 276 result->body_amqp_sequence_items = (AMQP_VALUE*)malloc(source_message->body_amqp_sequence_count * sizeof(AMQP_VALUE));
AzureIoTClient 28:add19eb7defa 277 if (result->body_amqp_sequence_items == NULL)
AzureIoTClient 28:add19eb7defa 278 {
AzureIoTClient 28:add19eb7defa 279 /* Codes_SRS_MESSAGE_01_012: [ If any cloning operation for the members of the source message fails, then `message_clone` shall fail and return NULL. ]*/
AzureIoTClient 28:add19eb7defa 280 LogError("Cannot allocate memory for body AMQP sequences");
AzureIoTClient 28:add19eb7defa 281 message_destroy(result);
AzureIoTClient 28:add19eb7defa 282 result = NULL;
AzureIoTClient 28:add19eb7defa 283 }
AzureIoTClient 28:add19eb7defa 284 else
AzureIoTClient 28:add19eb7defa 285 {
AzureIoTClient 28:add19eb7defa 286 for (i = 0; i < source_message->body_amqp_sequence_count; i++)
AzureIoTClient 28:add19eb7defa 287 {
AzureIoTClient 28:add19eb7defa 288 /* Codes_SRS_MESSAGE_01_160: [ If AMQP sequences are set as AMQP body they shall be cloned by calling `amqpvalue_clone`. ] */
AzureIoTClient 28:add19eb7defa 289 result->body_amqp_sequence_items[i] = amqpvalue_clone(source_message->body_amqp_sequence_items[i]);
AzureIoTClient 28:add19eb7defa 290 if (result->body_amqp_sequence_items[i] == NULL)
AzureIoTClient 28:add19eb7defa 291 {
AzureIoTClient 28:add19eb7defa 292 LogError("Cannot clone AMQP sequence %u", (unsigned int)i);
AzureIoTClient 28:add19eb7defa 293 break;
AzureIoTClient 28:add19eb7defa 294 }
AzureIoTClient 28:add19eb7defa 295 }
Azure.IoT Build 0:6ae2f7bca550 296
AzureIoTClient 28:add19eb7defa 297 result->body_amqp_sequence_count = i;
AzureIoTClient 28:add19eb7defa 298 if (i < source_message->body_amqp_sequence_count)
AzureIoTClient 28:add19eb7defa 299 {
AzureIoTClient 28:add19eb7defa 300 /* Codes_SRS_MESSAGE_01_012: [ If any cloning operation for the members of the source message fails, then `message_clone` shall fail and return NULL. ]*/
AzureIoTClient 28:add19eb7defa 301 message_destroy(result);
AzureIoTClient 28:add19eb7defa 302 result = NULL;
AzureIoTClient 28:add19eb7defa 303 }
AzureIoTClient 28:add19eb7defa 304 }
AzureIoTClient 28:add19eb7defa 305 }
Azure.IoT Build 0:6ae2f7bca550 306
AzureIoTClient 28:add19eb7defa 307 if ((result != NULL) && (source_message->body_amqp_value != NULL))
AzureIoTClient 28:add19eb7defa 308 {
AzureIoTClient 28:add19eb7defa 309 /* Codes_SRS_MESSAGE_01_159: [If an AMQP value has been set as message body on the source message it shall be cloned by calling `amqpvalue_clone`. ]*/
AzureIoTClient 28:add19eb7defa 310 result->body_amqp_value = amqpvalue_clone(source_message->body_amqp_value);
AzureIoTClient 28:add19eb7defa 311 if (result->body_amqp_value == NULL)
AzureIoTClient 28:add19eb7defa 312 {
AzureIoTClient 28:add19eb7defa 313 /* Codes_SRS_MESSAGE_01_012: [ If any cloning operation for the members of the source message fails, then `message_clone` shall fail and return NULL. ]*/
AzureIoTClient 28:add19eb7defa 314 LogError("Cannot clone body AMQP value");
AzureIoTClient 28:add19eb7defa 315 message_destroy(result);
AzureIoTClient 28:add19eb7defa 316 result = NULL;
AzureIoTClient 28:add19eb7defa 317 }
AzureIoTClient 28:add19eb7defa 318 }
AzureIoTClient 28:add19eb7defa 319 }
AzureIoTClient 28:add19eb7defa 320 }
Azure.IoT Build 0:6ae2f7bca550 321
AzureIoTClient 28:add19eb7defa 322 return result;
Azure.IoT Build 0:6ae2f7bca550 323 }
Azure.IoT Build 0:6ae2f7bca550 324
Azure.IoT Build 0:6ae2f7bca550 325 void message_destroy(MESSAGE_HANDLE message)
Azure.IoT Build 0:6ae2f7bca550 326 {
AzureIoTClient 28:add19eb7defa 327 if (message == NULL)
AzureIoTClient 28:add19eb7defa 328 {
AzureIoTClient 28:add19eb7defa 329 /* Codes_SRS_MESSAGE_01_014: [ If `message` is NULL, `message_destroy` shall do nothing. ]*/
AzureIoTClient 28:add19eb7defa 330 LogError("NULL message");
AzureIoTClient 28:add19eb7defa 331 }
AzureIoTClient 28:add19eb7defa 332 else
AzureIoTClient 28:add19eb7defa 333 {
AzureIoTClient 28:add19eb7defa 334 /* Codes_SRS_MESSAGE_01_013: [ `message_destroy` shall free all resources allocated by the message instance identified by the `message` argument. ]*/
AzureIoTClient 28:add19eb7defa 335 if (message->header != NULL)
AzureIoTClient 28:add19eb7defa 336 {
AzureIoTClient 28:add19eb7defa 337 /* Codes_SRS_MESSAGE_01_015: [ The message header shall be freed by calling `header_destroy`. ]*/
AzureIoTClient 28:add19eb7defa 338 header_destroy(message->header);
AzureIoTClient 28:add19eb7defa 339 }
AzureIoTClient 28:add19eb7defa 340
AzureIoTClient 28:add19eb7defa 341 if (message->delivery_annotations != NULL)
AzureIoTClient 28:add19eb7defa 342 {
AzureIoTClient 28:add19eb7defa 343 /* Codes_SRS_MESSAGE_01_016: [ The delivery annotations shall be freed by calling `annotations_destroy`. ]*/
AzureIoTClient 28:add19eb7defa 344 annotations_destroy(message->delivery_annotations);
AzureIoTClient 28:add19eb7defa 345 }
AzureIoTClient 28:add19eb7defa 346
AzureIoTClient 24:2c59c2d43ebf 347 if (message->message_annotations != NULL)
Azure.IoT Build 0:6ae2f7bca550 348 {
AzureIoTClient 28:add19eb7defa 349 /* Codes_SRS_MESSAGE_01_017: [ The message annotations shall be freed by calling `annotations_destroy`. ]*/
AzureIoTClient 28:add19eb7defa 350 annotations_destroy(message->message_annotations);
AzureIoTClient 28:add19eb7defa 351 }
AzureIoTClient 28:add19eb7defa 352
AzureIoTClient 28:add19eb7defa 353 if (message->properties != NULL)
AzureIoTClient 28:add19eb7defa 354 {
AzureIoTClient 28:add19eb7defa 355 /* Codes_SRS_MESSAGE_01_018: [ The message properties shall be freed by calling `properties_destroy`. ]*/
AzureIoTClient 28:add19eb7defa 356 properties_destroy(message->properties);
AzureIoTClient 28:add19eb7defa 357 }
AzureIoTClient 28:add19eb7defa 358
AzureIoTClient 28:add19eb7defa 359 if (message->application_properties != NULL)
AzureIoTClient 28:add19eb7defa 360 {
AzureIoTClient 28:add19eb7defa 361 /* Codes_SRS_MESSAGE_01_019: [ The application properties shall be freed by calling `amqpvalue_destroy`. ]*/
AzureIoTClient 28:add19eb7defa 362 application_properties_destroy(message->application_properties);
Azure.IoT Build 0:6ae2f7bca550 363 }
Azure.IoT Build 0:6ae2f7bca550 364
AzureIoTClient 28:add19eb7defa 365 if (message->footer != NULL)
AzureIoTClient 28:add19eb7defa 366 {
AzureIoTClient 28:add19eb7defa 367 /* Codes_SRS_MESSAGE_01_020: [ The message footer shall be freed by calling `annotations_destroy`. ]*/
AzureIoTClient 28:add19eb7defa 368 annotations_destroy(message->footer);
AzureIoTClient 28:add19eb7defa 369 }
AzureIoTClient 28:add19eb7defa 370
AzureIoTClient 28:add19eb7defa 371 if (message->body_amqp_value != NULL)
AzureIoTClient 28:add19eb7defa 372 {
AzureIoTClient 28:add19eb7defa 373 /* Codes_SRS_MESSAGE_01_021: [ If the message body is made of an AMQP value, the value shall be freed by calling `amqpvalue_destroy`. ]*/
AzureIoTClient 28:add19eb7defa 374 amqpvalue_destroy(message->body_amqp_value);
AzureIoTClient 28:add19eb7defa 375 }
AzureIoTClient 28:add19eb7defa 376
AzureIoTClient 28:add19eb7defa 377 /* Codes_SRS_MESSAGE_01_136: [ If the message body is made of several AMQP data items, they shall all be freed. ]*/
AzureIoTClient 28:add19eb7defa 378 free_all_body_data_items(message);
AzureIoTClient 28:add19eb7defa 379
AzureIoTClient 28:add19eb7defa 380 /* Codes_SRS_MESSAGE_01_136: [ If the message body is made of several AMQP sequences, they shall all be freed. ]*/
AzureIoTClient 28:add19eb7defa 381 free_all_body_sequence_items(message);
AzureIoTClient 28:add19eb7defa 382 free(message);
AzureIoTClient 28:add19eb7defa 383 }
Azure.IoT Build 0:6ae2f7bca550 384 }
Azure.IoT Build 0:6ae2f7bca550 385
Azure.IoT Build 0:6ae2f7bca550 386 int message_set_header(MESSAGE_HANDLE message, HEADER_HANDLE header)
Azure.IoT Build 0:6ae2f7bca550 387 {
AzureIoTClient 28:add19eb7defa 388 int result;
Azure.IoT Build 0:6ae2f7bca550 389
AzureIoTClient 28:add19eb7defa 390 if (message == NULL)
AzureIoTClient 28:add19eb7defa 391 {
AzureIoTClient 28:add19eb7defa 392 /* Codes_SRS_MESSAGE_01_024: [ If `message` is NULL, `message_set_header` shall fail and return a non-zero value. ]*/
AzureIoTClient 28:add19eb7defa 393 LogError("NULL message");
AzureIoTClient 28:add19eb7defa 394 result = __FAILURE__;
AzureIoTClient 28:add19eb7defa 395 }
AzureIoTClient 28:add19eb7defa 396 else
AzureIoTClient 28:add19eb7defa 397 {
AzureIoTClient 28:add19eb7defa 398 HEADER_HANDLE new_header;
AzureIoTClient 28:add19eb7defa 399
AzureIoTClient 28:add19eb7defa 400 if (header == NULL)
AzureIoTClient 28:add19eb7defa 401 {
AzureIoTClient 28:add19eb7defa 402 /* Codes_SRS_MESSAGE_01_139: [ If `message_header` is NULL, the previously stored header associated with `message` shall be freed. ]*/
AzureIoTClient 28:add19eb7defa 403 if (message->header != NULL)
AzureIoTClient 28:add19eb7defa 404 {
AzureIoTClient 28:add19eb7defa 405 header_destroy(message->header);
AzureIoTClient 28:add19eb7defa 406 message->header = NULL;
AzureIoTClient 28:add19eb7defa 407 }
Azure.IoT Build 0:6ae2f7bca550 408
AzureIoTClient 28:add19eb7defa 409 /* Codes_SRS_MESSAGE_01_023: [ On success it shall return 0. ]*/
AzureIoTClient 28:add19eb7defa 410 result = 0;
AzureIoTClient 28:add19eb7defa 411 }
AzureIoTClient 28:add19eb7defa 412 else
AzureIoTClient 28:add19eb7defa 413 {
AzureIoTClient 28:add19eb7defa 414 /* Codes_SRS_MESSAGE_01_022: [ `message_set_header` shall copy the contents of `message_header` as the header for the message instance identified by message. ]*/
AzureIoTClient 28:add19eb7defa 415 /* Codes_SRS_MESSAGE_01_025: [ Cloning the header shall be done by calling `header_clone`. ]*/
AzureIoTClient 28:add19eb7defa 416 new_header = header_clone(header);
AzureIoTClient 28:add19eb7defa 417 if (new_header == NULL)
AzureIoTClient 28:add19eb7defa 418 {
AzureIoTClient 28:add19eb7defa 419 /* Codes_SRS_MESSAGE_01_026: [ If `header_clone` fails, `message_set_header` shall fail and return a non-zero value. ]*/
AzureIoTClient 28:add19eb7defa 420 LogError("Cannot clone message header");
AzureIoTClient 28:add19eb7defa 421 result = __FAILURE__;
AzureIoTClient 28:add19eb7defa 422 }
AzureIoTClient 28:add19eb7defa 423 else
AzureIoTClient 28:add19eb7defa 424 {
AzureIoTClient 28:add19eb7defa 425 /* Codes_SRS_MESSAGE_01_138: [ If setting the header fails, the previous value shall be preserved. ]*/
AzureIoTClient 28:add19eb7defa 426 /* Only do the free of the previous value if we could clone the new one*/
AzureIoTClient 28:add19eb7defa 427 if (message->header != NULL)
AzureIoTClient 28:add19eb7defa 428 {
AzureIoTClient 28:add19eb7defa 429 header_destroy(message->header);
AzureIoTClient 28:add19eb7defa 430 }
Azure.IoT Build 0:6ae2f7bca550 431
AzureIoTClient 28:add19eb7defa 432 message->header = new_header;
Azure.IoT Build 0:6ae2f7bca550 433
AzureIoTClient 28:add19eb7defa 434 /* Codes_SRS_MESSAGE_01_023: [ On success it shall return 0. ]*/
AzureIoTClient 28:add19eb7defa 435 result = 0;
AzureIoTClient 28:add19eb7defa 436 }
AzureIoTClient 28:add19eb7defa 437 }
AzureIoTClient 28:add19eb7defa 438 }
AzureIoTClient 28:add19eb7defa 439
AzureIoTClient 28:add19eb7defa 440 return result;
Azure.IoT Build 0:6ae2f7bca550 441 }
Azure.IoT Build 0:6ae2f7bca550 442
Azure.IoT Build 0:6ae2f7bca550 443 int message_get_header(MESSAGE_HANDLE message, HEADER_HANDLE* header)
Azure.IoT Build 0:6ae2f7bca550 444 {
AzureIoTClient 28:add19eb7defa 445 int result;
AzureIoTClient 28:add19eb7defa 446
AzureIoTClient 28:add19eb7defa 447 if ((message == NULL) ||
AzureIoTClient 28:add19eb7defa 448 (header == NULL))
AzureIoTClient 28:add19eb7defa 449 {
AzureIoTClient 28:add19eb7defa 450 /* Codes_SRS_MESSAGE_01_029: [ If `message` or `message_header` is NULL, `message_get_header` shall fail and return a non-zero value. ]*/
AzureIoTClient 28:add19eb7defa 451 LogError("Bad arguments: message = %p, header = %p",
AzureIoTClient 28:add19eb7defa 452 message, header);
AzureIoTClient 28:add19eb7defa 453 result = __FAILURE__;
AzureIoTClient 28:add19eb7defa 454 }
AzureIoTClient 28:add19eb7defa 455 else
AzureIoTClient 28:add19eb7defa 456 {
AzureIoTClient 28:add19eb7defa 457 if (message->header == NULL)
AzureIoTClient 28:add19eb7defa 458 {
AzureIoTClient 28:add19eb7defa 459 /* Codes_SRS_MESSAGE_01_143: [ If no header has been set, `message_get_header` shall set `message_header` to NULL. ]*/
AzureIoTClient 28:add19eb7defa 460 *header = NULL;
Azure.IoT Build 0:6ae2f7bca550 461
AzureIoTClient 28:add19eb7defa 462 /* Codes_SRS_MESSAGE_01_028: [ On success, `message_get_header` shall return 0.]*/
AzureIoTClient 28:add19eb7defa 463 result = 0;
AzureIoTClient 28:add19eb7defa 464 }
AzureIoTClient 28:add19eb7defa 465 else
AzureIoTClient 28:add19eb7defa 466 {
AzureIoTClient 28:add19eb7defa 467 /* Codes_SRS_MESSAGE_01_027: [ `message_get_header` shall copy the contents of header for the message instance identified by `message` into the argument `message_header`. ]*/
AzureIoTClient 28:add19eb7defa 468 /* Codes_SRS_MESSAGE_01_030: [ Cloning the header shall be done by calling `header_clone`. ]*/
AzureIoTClient 28:add19eb7defa 469 *header = header_clone(message->header);
AzureIoTClient 28:add19eb7defa 470 if (*header == NULL)
AzureIoTClient 28:add19eb7defa 471 {
AzureIoTClient 28:add19eb7defa 472 /* Codes_SRS_MESSAGE_01_031: [ If `header_clone` fails, `message_get_header` shall fail and return a non-zero value. ]*/
AzureIoTClient 28:add19eb7defa 473 LogError("Cannot clone message header");
AzureIoTClient 28:add19eb7defa 474 result = __FAILURE__;
AzureIoTClient 28:add19eb7defa 475 }
AzureIoTClient 28:add19eb7defa 476 else
AzureIoTClient 28:add19eb7defa 477 {
AzureIoTClient 28:add19eb7defa 478 /* Codes_SRS_MESSAGE_01_028: [ On success, `message_get_header` shall return 0.]*/
AzureIoTClient 28:add19eb7defa 479 result = 0;
AzureIoTClient 28:add19eb7defa 480 }
AzureIoTClient 28:add19eb7defa 481 }
AzureIoTClient 28:add19eb7defa 482 }
Azure.IoT Build 0:6ae2f7bca550 483
AzureIoTClient 28:add19eb7defa 484 return result;
Azure.IoT Build 0:6ae2f7bca550 485 }
Azure.IoT Build 0:6ae2f7bca550 486
AzureIoTClient 28:add19eb7defa 487 int message_set_delivery_annotations(MESSAGE_HANDLE message, delivery_annotations annotations)
Azure.IoT Build 0:6ae2f7bca550 488 {
AzureIoTClient 28:add19eb7defa 489 int result;
Azure.IoT Build 0:6ae2f7bca550 490
AzureIoTClient 28:add19eb7defa 491 if (message == NULL)
AzureIoTClient 28:add19eb7defa 492 {
AzureIoTClient 28:add19eb7defa 493 /* Codes_SRS_MESSAGE_01_034: [ If `message` is NULL, `message_set_delivery_annotations` shall fail and return a non-zero value. ]*/
AzureIoTClient 28:add19eb7defa 494 LogError("NULL message");
AzureIoTClient 28:add19eb7defa 495 result = __FAILURE__;
AzureIoTClient 28:add19eb7defa 496 }
AzureIoTClient 28:add19eb7defa 497 else
AzureIoTClient 28:add19eb7defa 498 {
AzureIoTClient 28:add19eb7defa 499 delivery_annotations new_delivery_annotations;
Azure.IoT Build 0:6ae2f7bca550 500
AzureIoTClient 28:add19eb7defa 501 if (annotations == NULL)
AzureIoTClient 28:add19eb7defa 502 {
AzureIoTClient 28:add19eb7defa 503 /* Codes_SRS_MESSAGE_01_141: [ If `annotations` is NULL, the previously stored delivery annotations associated with `message` shall be freed. ]*/
AzureIoTClient 28:add19eb7defa 504 if (message->delivery_annotations != NULL)
AzureIoTClient 28:add19eb7defa 505 {
AzureIoTClient 28:add19eb7defa 506 annotations_destroy(message->delivery_annotations);
AzureIoTClient 28:add19eb7defa 507 message->delivery_annotations = NULL;
AzureIoTClient 28:add19eb7defa 508 }
AzureIoTClient 28:add19eb7defa 509
AzureIoTClient 28:add19eb7defa 510 /* Codes_SRS_MESSAGE_01_033: [ On success it shall return 0. ]*/
AzureIoTClient 28:add19eb7defa 511 result = 0;
AzureIoTClient 28:add19eb7defa 512 }
AzureIoTClient 28:add19eb7defa 513 else
AzureIoTClient 28:add19eb7defa 514 {
AzureIoTClient 28:add19eb7defa 515 /* Codes_SRS_MESSAGE_01_032: [ `message_set_delivery_annotations` shall copy the contents of `annotations` as the delivery annotations for the message instance identified by `message`. ]*/
AzureIoTClient 28:add19eb7defa 516 /* Codes_SRS_MESSAGE_01_035: [ Cloning the delivery annotations shall be done by calling `annotations_clone`. ]*/
AzureIoTClient 28:add19eb7defa 517 new_delivery_annotations = annotations_clone(annotations);
AzureIoTClient 28:add19eb7defa 518 if (new_delivery_annotations == NULL)
AzureIoTClient 28:add19eb7defa 519 {
AzureIoTClient 28:add19eb7defa 520 /* Codes_SRS_MESSAGE_01_036: [ If `annotations_clone` fails, `message_set_delivery_annotations` shall fail and return a non-zero value. ]*/
AzureIoTClient 28:add19eb7defa 521 LogError("Cannot clone delivery annotations");
AzureIoTClient 28:add19eb7defa 522 result = __FAILURE__;
AzureIoTClient 28:add19eb7defa 523 }
AzureIoTClient 28:add19eb7defa 524 else
AzureIoTClient 28:add19eb7defa 525 {
AzureIoTClient 28:add19eb7defa 526 /* Codes_SRS_MESSAGE_01_140: [** If setting the delivery annotations fails, the previous value shall be preserved. ]*/
AzureIoTClient 28:add19eb7defa 527 /* Only do the free of the previous value if we could clone the new one*/
AzureIoTClient 28:add19eb7defa 528 if (message->delivery_annotations != NULL)
AzureIoTClient 28:add19eb7defa 529 {
AzureIoTClient 28:add19eb7defa 530 annotations_destroy(message->delivery_annotations);
AzureIoTClient 28:add19eb7defa 531 }
AzureIoTClient 24:2c59c2d43ebf 532
AzureIoTClient 28:add19eb7defa 533 message->delivery_annotations = new_delivery_annotations;
Azure.IoT Build 0:6ae2f7bca550 534
AzureIoTClient 28:add19eb7defa 535 /* Codes_SRS_MESSAGE_01_033: [ On success it shall return 0. ]*/
AzureIoTClient 28:add19eb7defa 536 result = 0;
AzureIoTClient 28:add19eb7defa 537 }
AzureIoTClient 28:add19eb7defa 538 }
AzureIoTClient 28:add19eb7defa 539 }
AzureIoTClient 28:add19eb7defa 540
AzureIoTClient 28:add19eb7defa 541 return result;
Azure.IoT Build 0:6ae2f7bca550 542 }
Azure.IoT Build 0:6ae2f7bca550 543
AzureIoTClient 28:add19eb7defa 544 int message_get_delivery_annotations(MESSAGE_HANDLE message, delivery_annotations* annotations)
Azure.IoT Build 0:6ae2f7bca550 545 {
AzureIoTClient 28:add19eb7defa 546 int result;
AzureIoTClient 28:add19eb7defa 547
AzureIoTClient 28:add19eb7defa 548 if ((message == NULL) ||
AzureIoTClient 28:add19eb7defa 549 (annotations == NULL))
AzureIoTClient 28:add19eb7defa 550 {
AzureIoTClient 28:add19eb7defa 551 /* Codes_SRS_MESSAGE_01_039: [ If `message` or `annotations` is NULL, `message_get_delivery_annotations` shall fail and return a non-zero value. ]*/
AzureIoTClient 28:add19eb7defa 552 LogError("Bad arguments: message = %p, annotations = %p",
AzureIoTClient 28:add19eb7defa 553 message, annotations);
AzureIoTClient 28:add19eb7defa 554 result = __FAILURE__;
AzureIoTClient 28:add19eb7defa 555 }
AzureIoTClient 28:add19eb7defa 556 else
AzureIoTClient 28:add19eb7defa 557 {
AzureIoTClient 28:add19eb7defa 558 if (message->delivery_annotations == NULL)
AzureIoTClient 28:add19eb7defa 559 {
AzureIoTClient 28:add19eb7defa 560 /* Codes_SRS_MESSAGE_01_142: [ If no delivery annotations have been set, `message_get_delivery_annotations` shall set `annotations` to NULL. ]*/
AzureIoTClient 28:add19eb7defa 561 *annotations = NULL;
Azure.IoT Build 0:6ae2f7bca550 562
AzureIoTClient 28:add19eb7defa 563 /* Codes_SRS_MESSAGE_01_038: [ On success, `message_get_delivery_annotations` shall return 0. ]*/
AzureIoTClient 28:add19eb7defa 564 result = 0;
AzureIoTClient 28:add19eb7defa 565 }
AzureIoTClient 28:add19eb7defa 566 else
AzureIoTClient 28:add19eb7defa 567 {
AzureIoTClient 28:add19eb7defa 568 /* Codes_SRS_MESSAGE_01_037: [ `message_get_delivery_annotations` shall copy the contents of delivery annotations for the message instance identified by `message` into the argument `annotations`. ]*/
AzureIoTClient 28:add19eb7defa 569 /* Codes_SRS_MESSAGE_01_040: [ Cloning the delivery annotations shall be done by calling `annotations_clone`. ]*/
AzureIoTClient 28:add19eb7defa 570 *annotations = annotations_clone(message->delivery_annotations);
AzureIoTClient 28:add19eb7defa 571 if (*annotations == NULL)
AzureIoTClient 28:add19eb7defa 572 {
AzureIoTClient 28:add19eb7defa 573 /* Codes_SRS_MESSAGE_01_041: [ If `annotations_clone` fails, `message_get_delivery_annotations` shall fail and return a non-zero value. ]*/
AzureIoTClient 28:add19eb7defa 574 LogError("Cannot clone delivery annotations");
AzureIoTClient 28:add19eb7defa 575 result = __FAILURE__;
AzureIoTClient 28:add19eb7defa 576 }
AzureIoTClient 28:add19eb7defa 577 else
AzureIoTClient 28:add19eb7defa 578 {
AzureIoTClient 28:add19eb7defa 579 /* Codes_SRS_MESSAGE_01_038: [ On success, `message_get_delivery_annotations` shall return 0. ]*/
AzureIoTClient 28:add19eb7defa 580 result = 0;
AzureIoTClient 28:add19eb7defa 581 }
AzureIoTClient 28:add19eb7defa 582 }
AzureIoTClient 28:add19eb7defa 583 }
Azure.IoT Build 0:6ae2f7bca550 584
AzureIoTClient 28:add19eb7defa 585 return result;
Azure.IoT Build 0:6ae2f7bca550 586 }
Azure.IoT Build 0:6ae2f7bca550 587
AzureIoTClient 28:add19eb7defa 588 int message_set_message_annotations(MESSAGE_HANDLE message, message_annotations annotations)
Azure.IoT Build 0:6ae2f7bca550 589 {
AzureIoTClient 28:add19eb7defa 590 int result;
Azure.IoT Build 0:6ae2f7bca550 591
AzureIoTClient 28:add19eb7defa 592 if (message == NULL)
AzureIoTClient 28:add19eb7defa 593 {
AzureIoTClient 28:add19eb7defa 594 /* Codes_SRS_MESSAGE_01_044: [ If `message` is NULL, `message_set_message_annotations` shall fail and return a non-zero value. ]*/
AzureIoTClient 28:add19eb7defa 595 LogError("NULL message");
AzureIoTClient 28:add19eb7defa 596 result = __FAILURE__;
AzureIoTClient 28:add19eb7defa 597 }
AzureIoTClient 28:add19eb7defa 598 else
AzureIoTClient 28:add19eb7defa 599 {
AzureIoTClient 28:add19eb7defa 600 if (annotations == NULL)
AzureIoTClient 28:add19eb7defa 601 {
AzureIoTClient 28:add19eb7defa 602 /* Codes_SRS_MESSAGE_01_145: [ If `annotations` is NULL, the previously stored message annotations associated with `message` shall be freed. ]*/
AzureIoTClient 28:add19eb7defa 603 if (message->message_annotations != NULL)
AzureIoTClient 28:add19eb7defa 604 {
AzureIoTClient 28:add19eb7defa 605 annotations_destroy(message->message_annotations);
AzureIoTClient 28:add19eb7defa 606 message->message_annotations = NULL;
AzureIoTClient 28:add19eb7defa 607 }
AzureIoTClient 28:add19eb7defa 608
AzureIoTClient 28:add19eb7defa 609 /* Codes_SRS_MESSAGE_01_043: [ On success it shall return 0. ]*/
AzureIoTClient 28:add19eb7defa 610 result = 0;
AzureIoTClient 28:add19eb7defa 611 }
AzureIoTClient 28:add19eb7defa 612 else
AzureIoTClient 28:add19eb7defa 613 {
AzureIoTClient 28:add19eb7defa 614 message_annotations new_message_annotations;
Azure.IoT Build 0:6ae2f7bca550 615
AzureIoTClient 28:add19eb7defa 616 /* Codes_SRS_MESSAGE_01_042: [ `message_set_message_annotations` shall copy the contents of `annotations` as the message annotations for the message instance identified by `message`. ]*/
AzureIoTClient 28:add19eb7defa 617 /* Codes_SRS_MESSAGE_01_045: [ Cloning the message annotations shall be done by calling `annotations_clone`. ]*/
AzureIoTClient 28:add19eb7defa 618 new_message_annotations = annotations_clone(annotations);
AzureIoTClient 28:add19eb7defa 619 if (new_message_annotations == NULL)
AzureIoTClient 28:add19eb7defa 620 {
AzureIoTClient 28:add19eb7defa 621 /* Codes_SRS_MESSAGE_01_046: [ If `annotations_clone` fails, `message_set_message_annotations` shall fail and return a non-zero value. ]*/
AzureIoTClient 28:add19eb7defa 622 LogError("Cannot clone message annotations");
AzureIoTClient 28:add19eb7defa 623 result = __FAILURE__;
AzureIoTClient 28:add19eb7defa 624 }
AzureIoTClient 28:add19eb7defa 625 else
AzureIoTClient 28:add19eb7defa 626 {
AzureIoTClient 28:add19eb7defa 627 /* Codes_SRS_MESSAGE_01_144: [ If setting the message annotations fails, the previous value shall be preserved. ]*/
AzureIoTClient 28:add19eb7defa 628 /* Only do the free of the previous value if we could clone the new one*/
AzureIoTClient 28:add19eb7defa 629 if (message->message_annotations != NULL)
AzureIoTClient 28:add19eb7defa 630 {
AzureIoTClient 28:add19eb7defa 631 annotations_destroy(message->message_annotations);
AzureIoTClient 28:add19eb7defa 632 }
Azure.IoT Build 0:6ae2f7bca550 633
AzureIoTClient 28:add19eb7defa 634 message->message_annotations = new_message_annotations;
Azure.IoT Build 0:6ae2f7bca550 635
AzureIoTClient 28:add19eb7defa 636 /* Codes_SRS_MESSAGE_01_043: [ On success it shall return 0. ]*/
AzureIoTClient 28:add19eb7defa 637 result = 0;
AzureIoTClient 28:add19eb7defa 638 }
AzureIoTClient 28:add19eb7defa 639 }
AzureIoTClient 28:add19eb7defa 640 }
AzureIoTClient 28:add19eb7defa 641
AzureIoTClient 28:add19eb7defa 642 return result;
Azure.IoT Build 0:6ae2f7bca550 643 }
Azure.IoT Build 0:6ae2f7bca550 644
Azure.IoT Build 0:6ae2f7bca550 645 int message_get_message_annotations(MESSAGE_HANDLE message, annotations* message_annotations)
Azure.IoT Build 0:6ae2f7bca550 646 {
AzureIoTClient 28:add19eb7defa 647 int result;
AzureIoTClient 28:add19eb7defa 648
AzureIoTClient 28:add19eb7defa 649 if ((message == NULL) ||
AzureIoTClient 28:add19eb7defa 650 (message_annotations == NULL))
AzureIoTClient 28:add19eb7defa 651 {
AzureIoTClient 28:add19eb7defa 652 /* Codes_SRS_MESSAGE_01_049: [ If `message` or `annotations` is NULL, `message_get_message_annotations` shall fail and return a non-zero value. ]*/
AzureIoTClient 28:add19eb7defa 653 LogError("Bad arguments: message = %p, message_annotations = %p",
AzureIoTClient 28:add19eb7defa 654 message, message_annotations);
AzureIoTClient 28:add19eb7defa 655 result = __FAILURE__;
AzureIoTClient 28:add19eb7defa 656 }
AzureIoTClient 28:add19eb7defa 657 else
AzureIoTClient 28:add19eb7defa 658 {
AzureIoTClient 28:add19eb7defa 659 if (message->message_annotations == NULL)
AzureIoTClient 28:add19eb7defa 660 {
AzureIoTClient 28:add19eb7defa 661 /* Codes_SRS_MESSAGE_01_146: [ If no message annotations have been set, `message_get_message_annotations` shall set `annotations` to NULL. ]*/
AzureIoTClient 28:add19eb7defa 662 *message_annotations = NULL;
Azure.IoT Build 0:6ae2f7bca550 663
AzureIoTClient 28:add19eb7defa 664 /* Codes_SRS_MESSAGE_01_048: [ On success, `message_get_message_annotations` shall return 0. ]*/
AzureIoTClient 28:add19eb7defa 665 result = 0;
AzureIoTClient 28:add19eb7defa 666 }
AzureIoTClient 28:add19eb7defa 667 else
AzureIoTClient 28:add19eb7defa 668 {
AzureIoTClient 28:add19eb7defa 669 /* Codes_SRS_MESSAGE_01_047: [ `message_get_message_annotations` shall copy the contents of message annotations for the message instance identified by `message` into the argument `annotations`. ]*/
AzureIoTClient 28:add19eb7defa 670 /* Codes_SRS_MESSAGE_01_050: [ Cloning the message annotations shall be done by calling `annotations_clone`. ]*/
AzureIoTClient 28:add19eb7defa 671 *message_annotations = annotations_clone(message->message_annotations);
AzureIoTClient 28:add19eb7defa 672 if (*message_annotations == NULL)
AzureIoTClient 28:add19eb7defa 673 {
AzureIoTClient 28:add19eb7defa 674 /* Codes_SRS_MESSAGE_01_051: [ If `annotations_clone` fails, `message_get_message_annotations` shall fail and return a non-zero value. ]*/
AzureIoTClient 28:add19eb7defa 675 LogError("Cannot clone message annotations");
AzureIoTClient 28:add19eb7defa 676 result = __FAILURE__;
AzureIoTClient 28:add19eb7defa 677 }
AzureIoTClient 28:add19eb7defa 678 else
AzureIoTClient 28:add19eb7defa 679 {
AzureIoTClient 28:add19eb7defa 680 /* Codes_SRS_MESSAGE_01_048: [ On success, `message_get_message_annotations` shall return 0. ]*/
AzureIoTClient 28:add19eb7defa 681 result = 0;
AzureIoTClient 28:add19eb7defa 682 }
AzureIoTClient 28:add19eb7defa 683 }
AzureIoTClient 28:add19eb7defa 684 }
Azure.IoT Build 0:6ae2f7bca550 685
AzureIoTClient 28:add19eb7defa 686 return result;
Azure.IoT Build 0:6ae2f7bca550 687 }
Azure.IoT Build 0:6ae2f7bca550 688
Azure.IoT Build 0:6ae2f7bca550 689 int message_set_properties(MESSAGE_HANDLE message, PROPERTIES_HANDLE properties)
Azure.IoT Build 0:6ae2f7bca550 690 {
AzureIoTClient 28:add19eb7defa 691 int result;
Azure.IoT Build 0:6ae2f7bca550 692
AzureIoTClient 28:add19eb7defa 693 if (message == NULL)
AzureIoTClient 28:add19eb7defa 694 {
AzureIoTClient 28:add19eb7defa 695 /* Codes_SRS_MESSAGE_01_054: [ If `message` is NULL, `message_set_properties` shall fail and return a non-zero value. ]*/
AzureIoTClient 28:add19eb7defa 696 LogError("NULL message");
AzureIoTClient 28:add19eb7defa 697 result = __FAILURE__;
AzureIoTClient 28:add19eb7defa 698 }
AzureIoTClient 28:add19eb7defa 699 else
AzureIoTClient 28:add19eb7defa 700 {
AzureIoTClient 28:add19eb7defa 701 if (properties == NULL)
AzureIoTClient 28:add19eb7defa 702 {
AzureIoTClient 28:add19eb7defa 703 /* Codes_SRS_MESSAGE_01_147: [ If `properties` is NULL, the previously stored message properties associated with `message` shall be freed. ]*/
AzureIoTClient 28:add19eb7defa 704 if (message->properties != NULL)
AzureIoTClient 28:add19eb7defa 705 {
AzureIoTClient 28:add19eb7defa 706 properties_destroy(message->properties);
AzureIoTClient 28:add19eb7defa 707 message->properties = NULL;
AzureIoTClient 28:add19eb7defa 708 }
AzureIoTClient 28:add19eb7defa 709
AzureIoTClient 28:add19eb7defa 710 /* Codes_SRS_MESSAGE_01_053: [ On success it shall return 0. ]*/
AzureIoTClient 28:add19eb7defa 711 result = 0;
AzureIoTClient 28:add19eb7defa 712 }
AzureIoTClient 28:add19eb7defa 713 else
AzureIoTClient 28:add19eb7defa 714 {
AzureIoTClient 28:add19eb7defa 715 PROPERTIES_HANDLE new_properties;
Azure.IoT Build 0:6ae2f7bca550 716
AzureIoTClient 28:add19eb7defa 717 /* Codes_SRS_MESSAGE_01_052: [ `message_set_properties` shall copy the contents of `properties` as the message properties for the message instance identified by `message`. ]*/
AzureIoTClient 28:add19eb7defa 718 /* Codes_SRS_MESSAGE_01_055: [ Cloning the message properties shall be done by calling `properties_clone`. ]*/
AzureIoTClient 28:add19eb7defa 719 new_properties = properties_clone(properties);
AzureIoTClient 28:add19eb7defa 720 if (new_properties == NULL)
AzureIoTClient 28:add19eb7defa 721 {
AzureIoTClient 28:add19eb7defa 722 /* Codes_SRS_MESSAGE_01_056: [ If `properties_clone` fails, `message_set_properties` shall fail and return a non-zero value. ]*/
AzureIoTClient 28:add19eb7defa 723 LogError("Cannot clone message properties");
AzureIoTClient 28:add19eb7defa 724 result = __FAILURE__;
AzureIoTClient 28:add19eb7defa 725 }
AzureIoTClient 28:add19eb7defa 726 else
AzureIoTClient 28:add19eb7defa 727 {
AzureIoTClient 28:add19eb7defa 728 /* Codes_SRS_MESSAGE_01_063: [ If setting the message properties fails, the previous value shall be preserved. ]*/
AzureIoTClient 28:add19eb7defa 729 /* Only do the free of the previous value if we could clone the new one*/
AzureIoTClient 28:add19eb7defa 730 if (message->properties != NULL)
AzureIoTClient 28:add19eb7defa 731 {
AzureIoTClient 28:add19eb7defa 732 properties_destroy(message->properties);
AzureIoTClient 28:add19eb7defa 733 }
Azure.IoT Build 0:6ae2f7bca550 734
AzureIoTClient 28:add19eb7defa 735 message->properties = new_properties;
Azure.IoT Build 0:6ae2f7bca550 736
AzureIoTClient 28:add19eb7defa 737 /* Codes_SRS_MESSAGE_01_053: [ On success it shall return 0. ]*/
AzureIoTClient 28:add19eb7defa 738 result = 0;
AzureIoTClient 28:add19eb7defa 739 }
AzureIoTClient 28:add19eb7defa 740 }
AzureIoTClient 28:add19eb7defa 741 }
AzureIoTClient 28:add19eb7defa 742
AzureIoTClient 28:add19eb7defa 743 return result;
Azure.IoT Build 0:6ae2f7bca550 744 }
Azure.IoT Build 0:6ae2f7bca550 745
Azure.IoT Build 0:6ae2f7bca550 746 int message_get_properties(MESSAGE_HANDLE message, PROPERTIES_HANDLE* properties)
Azure.IoT Build 0:6ae2f7bca550 747 {
AzureIoTClient 28:add19eb7defa 748 int result;
AzureIoTClient 28:add19eb7defa 749
AzureIoTClient 28:add19eb7defa 750 if ((message == NULL) ||
AzureIoTClient 28:add19eb7defa 751 (properties == NULL))
AzureIoTClient 28:add19eb7defa 752 {
AzureIoTClient 28:add19eb7defa 753 /* Codes_SRS_MESSAGE_01_059: [ If `message` or `properties` is NULL, `message_get_properties` shall fail and return a non-zero value. ]*/
AzureIoTClient 28:add19eb7defa 754 LogError("Bad arguments: message = %p, properties = %p",
AzureIoTClient 28:add19eb7defa 755 message, properties);
AzureIoTClient 28:add19eb7defa 756 result = __FAILURE__;
AzureIoTClient 28:add19eb7defa 757 }
AzureIoTClient 28:add19eb7defa 758 else
AzureIoTClient 28:add19eb7defa 759 {
AzureIoTClient 28:add19eb7defa 760 if (message->properties == NULL)
AzureIoTClient 28:add19eb7defa 761 {
AzureIoTClient 28:add19eb7defa 762 /* Codes_SRS_MESSAGE_01_148: [ If no message properties have been set, `message_get_properties` shall set `properties` to NULL. ]*/
AzureIoTClient 28:add19eb7defa 763 *properties = NULL;
Azure.IoT Build 0:6ae2f7bca550 764
AzureIoTClient 28:add19eb7defa 765 /* Codes_SRS_MESSAGE_01_058: [ On success, `message_get_properties` shall return 0. ]*/
AzureIoTClient 28:add19eb7defa 766 result = 0;
AzureIoTClient 28:add19eb7defa 767 }
AzureIoTClient 28:add19eb7defa 768 else
AzureIoTClient 28:add19eb7defa 769 {
AzureIoTClient 28:add19eb7defa 770 /* Codes_SRS_MESSAGE_01_057: [ `message_get_properties` shall copy the contents of message properties for the message instance identified by `message` into the argument `properties`. ]*/
AzureIoTClient 28:add19eb7defa 771 /* Codes_SRS_MESSAGE_01_060: [ Cloning the message properties shall be done by calling `properties_clone`. ]*/
AzureIoTClient 28:add19eb7defa 772 *properties = properties_clone(message->properties);
AzureIoTClient 28:add19eb7defa 773 if (*properties == NULL)
AzureIoTClient 28:add19eb7defa 774 {
AzureIoTClient 28:add19eb7defa 775 /* Codes_SRS_MESSAGE_01_061: [ If `properties_clone` fails, `message_get_properties` shall fail and return a non-zero value. ]*/
AzureIoTClient 28:add19eb7defa 776 LogError("Cannot clone message properties");
AzureIoTClient 28:add19eb7defa 777 result = __FAILURE__;
AzureIoTClient 28:add19eb7defa 778 }
AzureIoTClient 28:add19eb7defa 779 else
AzureIoTClient 28:add19eb7defa 780 {
AzureIoTClient 28:add19eb7defa 781 /* Codes_SRS_MESSAGE_01_058: [ On success, `message_get_properties` shall return 0. ]*/
AzureIoTClient 28:add19eb7defa 782 result = 0;
AzureIoTClient 28:add19eb7defa 783 }
AzureIoTClient 28:add19eb7defa 784 }
AzureIoTClient 28:add19eb7defa 785 }
Azure.IoT Build 0:6ae2f7bca550 786
AzureIoTClient 28:add19eb7defa 787 return result;
Azure.IoT Build 0:6ae2f7bca550 788 }
Azure.IoT Build 0:6ae2f7bca550 789
Azure.IoT Build 0:6ae2f7bca550 790 int message_set_application_properties(MESSAGE_HANDLE message, AMQP_VALUE application_properties)
Azure.IoT Build 0:6ae2f7bca550 791 {
AzureIoTClient 28:add19eb7defa 792 int result;
Azure.IoT Build 0:6ae2f7bca550 793
AzureIoTClient 28:add19eb7defa 794 if (message == NULL)
AzureIoTClient 28:add19eb7defa 795 {
AzureIoTClient 28:add19eb7defa 796 /* Codes_SRS_MESSAGE_01_066: [ If `message` is NULL, `message_set_application_properties` shall fail and return a non-zero value. ]*/
AzureIoTClient 28:add19eb7defa 797 LogError("NULL message");
AzureIoTClient 28:add19eb7defa 798 result = __FAILURE__;
AzureIoTClient 28:add19eb7defa 799 }
AzureIoTClient 28:add19eb7defa 800 else
AzureIoTClient 28:add19eb7defa 801 {
AzureIoTClient 28:add19eb7defa 802 AMQP_VALUE new_application_properties;
AzureIoTClient 28:add19eb7defa 803
AzureIoTClient 28:add19eb7defa 804 /* Tests_SRS_MESSAGE_01_149: [ If `application_properties` is NULL, the previously stored application properties associated with `message` shall be freed. ]*/
AzureIoTClient 28:add19eb7defa 805 if (application_properties == NULL)
AzureIoTClient 28:add19eb7defa 806 {
AzureIoTClient 28:add19eb7defa 807 if (message->application_properties != NULL)
AzureIoTClient 28:add19eb7defa 808 {
AzureIoTClient 28:add19eb7defa 809 amqpvalue_destroy(message->application_properties);
AzureIoTClient 28:add19eb7defa 810 message->application_properties = NULL;
AzureIoTClient 28:add19eb7defa 811 }
Azure.IoT Build 0:6ae2f7bca550 812
AzureIoTClient 28:add19eb7defa 813 /* Codes_SRS_MESSAGE_01_065: [ On success it shall return 0. ]*/
AzureIoTClient 28:add19eb7defa 814 result = 0;
AzureIoTClient 28:add19eb7defa 815 }
AzureIoTClient 28:add19eb7defa 816 else
AzureIoTClient 28:add19eb7defa 817 {
AzureIoTClient 28:add19eb7defa 818 /* Codes_SRS_MESSAGE_01_064: [ `message_set_application_properties` shall copy the contents of `application_properties` as the application properties for the message instance identified by `message`. ]*/
AzureIoTClient 28:add19eb7defa 819 /* Codes_SRS_MESSAGE_01_067: [ Cloning the message properties shall be done by calling `application_properties_clone`. ]*/
AzureIoTClient 28:add19eb7defa 820 new_application_properties = application_properties_clone(application_properties);
AzureIoTClient 28:add19eb7defa 821 if (new_application_properties == NULL)
AzureIoTClient 28:add19eb7defa 822 {
AzureIoTClient 28:add19eb7defa 823 /* Codes_SRS_MESSAGE_01_068: [ If `application_properties_clone` fails, `message_set_application_properties` shall fail and return a non-zero value. ]*/
AzureIoTClient 28:add19eb7defa 824 LogError("Cannot clone application properties");
AzureIoTClient 28:add19eb7defa 825 result = __FAILURE__;
AzureIoTClient 28:add19eb7defa 826 }
AzureIoTClient 28:add19eb7defa 827 else
AzureIoTClient 28:add19eb7defa 828 {
AzureIoTClient 28:add19eb7defa 829 /* Codes_SRS_MESSAGE_01_069: [ If setting the application properties fails, the previous value shall be preserved. ]*/
AzureIoTClient 28:add19eb7defa 830 /* Only do the free of the previous value if we could clone the new one*/
AzureIoTClient 28:add19eb7defa 831 if (message->application_properties != NULL)
AzureIoTClient 28:add19eb7defa 832 {
AzureIoTClient 28:add19eb7defa 833 amqpvalue_destroy(message->application_properties);
AzureIoTClient 28:add19eb7defa 834 }
Azure.IoT Build 0:6ae2f7bca550 835
AzureIoTClient 28:add19eb7defa 836 message->application_properties = new_application_properties;
Azure.IoT Build 0:6ae2f7bca550 837
AzureIoTClient 28:add19eb7defa 838 /* Codes_SRS_MESSAGE_01_065: [ On success it shall return 0. ]*/
AzureIoTClient 28:add19eb7defa 839 result = 0;
AzureIoTClient 28:add19eb7defa 840 }
AzureIoTClient 28:add19eb7defa 841 }
AzureIoTClient 28:add19eb7defa 842 }
AzureIoTClient 28:add19eb7defa 843
AzureIoTClient 28:add19eb7defa 844 return result;
Azure.IoT Build 0:6ae2f7bca550 845 }
Azure.IoT Build 0:6ae2f7bca550 846
Azure.IoT Build 0:6ae2f7bca550 847 int message_get_application_properties(MESSAGE_HANDLE message, AMQP_VALUE* application_properties)
Azure.IoT Build 0:6ae2f7bca550 848 {
AzureIoTClient 28:add19eb7defa 849 int result;
AzureIoTClient 28:add19eb7defa 850
AzureIoTClient 28:add19eb7defa 851 if ((message == NULL) ||
AzureIoTClient 28:add19eb7defa 852 (application_properties == NULL))
AzureIoTClient 28:add19eb7defa 853 {
AzureIoTClient 28:add19eb7defa 854 /* Codes_SRS_MESSAGE_01_072: [ If `message` or `application_properties` is NULL, `message_get_application_properties` shall fail and return a non-zero value. ]*/
AzureIoTClient 28:add19eb7defa 855 LogError("Bad arguments: message = %p, application_properties = %p",
AzureIoTClient 28:add19eb7defa 856 message, application_properties);
AzureIoTClient 28:add19eb7defa 857 result = __FAILURE__;
AzureIoTClient 28:add19eb7defa 858 }
AzureIoTClient 28:add19eb7defa 859 else
AzureIoTClient 28:add19eb7defa 860 {
AzureIoTClient 28:add19eb7defa 861 if (message->application_properties == NULL)
AzureIoTClient 28:add19eb7defa 862 {
AzureIoTClient 28:add19eb7defa 863 /* Codes_SRS_MESSAGE_01_150: [ If no application properties have been set, `message_get_application_properties` shall set `application_properties` to NULL. ]*/
AzureIoTClient 28:add19eb7defa 864 *application_properties = NULL;
Azure.IoT Build 0:6ae2f7bca550 865
AzureIoTClient 28:add19eb7defa 866 /* Codes_SRS_MESSAGE_01_071: [ On success, `message_get_application_properties` shall return 0. ]*/
AzureIoTClient 28:add19eb7defa 867 result = 0;
AzureIoTClient 28:add19eb7defa 868 }
AzureIoTClient 28:add19eb7defa 869 else
AzureIoTClient 28:add19eb7defa 870 {
AzureIoTClient 28:add19eb7defa 871 /* Codes_SRS_MESSAGE_01_070: [ `message_get_application_properties` shall copy the contents of application message properties for the message instance identified by `message` into the argument `application_properties`. ]*/
AzureIoTClient 28:add19eb7defa 872 /* Codes_SRS_MESSAGE_01_073: [ Cloning the application properties shall be done by calling `application_properties_clone`. ]*/
AzureIoTClient 28:add19eb7defa 873 *application_properties = application_properties_clone(message->application_properties);
AzureIoTClient 28:add19eb7defa 874 if (*application_properties == NULL)
AzureIoTClient 28:add19eb7defa 875 {
AzureIoTClient 28:add19eb7defa 876 /* Codes_SRS_MESSAGE_01_074: [ If `application_properties_clone` fails, `message_get_application_properties` shall fail and return a non-zero value. ]*/
AzureIoTClient 28:add19eb7defa 877 LogError("Cannot clone application properties");
AzureIoTClient 28:add19eb7defa 878 result = __FAILURE__;
AzureIoTClient 28:add19eb7defa 879 }
AzureIoTClient 28:add19eb7defa 880 else
AzureIoTClient 28:add19eb7defa 881 {
AzureIoTClient 28:add19eb7defa 882 /* Codes_SRS_MESSAGE_01_071: [ On success, `message_get_application_properties` shall return 0. ]*/
AzureIoTClient 28:add19eb7defa 883 result = 0;
AzureIoTClient 28:add19eb7defa 884 }
AzureIoTClient 28:add19eb7defa 885 }
AzureIoTClient 28:add19eb7defa 886 }
Azure.IoT Build 0:6ae2f7bca550 887
AzureIoTClient 28:add19eb7defa 888 return result;
Azure.IoT Build 0:6ae2f7bca550 889 }
Azure.IoT Build 0:6ae2f7bca550 890
Azure.IoT Build 0:6ae2f7bca550 891 int message_set_footer(MESSAGE_HANDLE message, annotations footer)
Azure.IoT Build 0:6ae2f7bca550 892 {
AzureIoTClient 28:add19eb7defa 893 int result;
Azure.IoT Build 0:6ae2f7bca550 894
AzureIoTClient 28:add19eb7defa 895 if (message == NULL)
AzureIoTClient 28:add19eb7defa 896 {
AzureIoTClient 28:add19eb7defa 897 /* Codes_SRS_MESSAGE_01_077: [ If `message` is NULL, `message_set_footer` shall fail and return a non-zero value. ]*/
AzureIoTClient 28:add19eb7defa 898 LogError("NULL message");
AzureIoTClient 28:add19eb7defa 899 result = __FAILURE__;
AzureIoTClient 28:add19eb7defa 900 }
AzureIoTClient 28:add19eb7defa 901 else
AzureIoTClient 28:add19eb7defa 902 {
AzureIoTClient 28:add19eb7defa 903 if (footer == NULL)
AzureIoTClient 28:add19eb7defa 904 {
AzureIoTClient 28:add19eb7defa 905 /* Codes_SRS_MESSAGE_01_151: [ If `footer` is NULL, the previously stored footer associated with `message` shall be freed. ]*/
AzureIoTClient 28:add19eb7defa 906 if (message->footer != NULL)
AzureIoTClient 28:add19eb7defa 907 {
AzureIoTClient 28:add19eb7defa 908 annotations_destroy(message->footer);
AzureIoTClient 28:add19eb7defa 909 message->footer = NULL;
AzureIoTClient 28:add19eb7defa 910 }
AzureIoTClient 28:add19eb7defa 911
AzureIoTClient 28:add19eb7defa 912 /* Codes_SRS_MESSAGE_01_076: [ On success it shall return 0. ]*/
AzureIoTClient 28:add19eb7defa 913 result = 0;
AzureIoTClient 28:add19eb7defa 914 }
AzureIoTClient 28:add19eb7defa 915 else
AzureIoTClient 28:add19eb7defa 916 {
AzureIoTClient 28:add19eb7defa 917 annotations new_footer;
Azure.IoT Build 0:6ae2f7bca550 918
AzureIoTClient 28:add19eb7defa 919 /* Codes_SRS_MESSAGE_01_075: [ `message_set_footer` shall copy the contents of `footer` as the footer contents for the message instance identified by `message`. ]*/
AzureIoTClient 28:add19eb7defa 920 /* Codes_SRS_MESSAGE_01_078: [ Cloning the footer shall be done by calling `annotations_clone`. ]*/
AzureIoTClient 28:add19eb7defa 921 new_footer = annotations_clone(footer);
AzureIoTClient 28:add19eb7defa 922 if (new_footer == NULL)
AzureIoTClient 28:add19eb7defa 923 {
AzureIoTClient 28:add19eb7defa 924 /* Codes_SRS_MESSAGE_01_079: [ If `annotations_clone` fails, `message_set_footer` shall fail and return a non-zero value. ]*/
AzureIoTClient 28:add19eb7defa 925 LogError("Cannot clone message footer");
AzureIoTClient 28:add19eb7defa 926 result = __FAILURE__;
AzureIoTClient 28:add19eb7defa 927 }
AzureIoTClient 28:add19eb7defa 928 else
AzureIoTClient 28:add19eb7defa 929 {
AzureIoTClient 28:add19eb7defa 930 /* Codes_SRS_MESSAGE_01_080: [ If setting the footer fails, the previous value shall be preserved. ]*/
AzureIoTClient 28:add19eb7defa 931 /* Only do the free of the previous value if we could clone the new one*/
AzureIoTClient 28:add19eb7defa 932 if (message->footer != NULL)
AzureIoTClient 28:add19eb7defa 933 {
AzureIoTClient 28:add19eb7defa 934 annotations_destroy(message->footer);
AzureIoTClient 28:add19eb7defa 935 }
Azure.IoT Build 0:6ae2f7bca550 936
AzureIoTClient 28:add19eb7defa 937 message->footer = new_footer;
Azure.IoT Build 0:6ae2f7bca550 938
AzureIoTClient 28:add19eb7defa 939 /* Codes_SRS_MESSAGE_01_076: [ On success it shall return 0. ]*/
AzureIoTClient 28:add19eb7defa 940 result = 0;
AzureIoTClient 28:add19eb7defa 941 }
AzureIoTClient 28:add19eb7defa 942 }
AzureIoTClient 28:add19eb7defa 943 }
AzureIoTClient 28:add19eb7defa 944
AzureIoTClient 28:add19eb7defa 945 return result;
Azure.IoT Build 0:6ae2f7bca550 946 }
Azure.IoT Build 0:6ae2f7bca550 947
Azure.IoT Build 0:6ae2f7bca550 948 int message_get_footer(MESSAGE_HANDLE message, annotations* footer)
Azure.IoT Build 0:6ae2f7bca550 949 {
AzureIoTClient 28:add19eb7defa 950 int result;
AzureIoTClient 28:add19eb7defa 951
AzureIoTClient 28:add19eb7defa 952 if ((message == NULL) ||
AzureIoTClient 28:add19eb7defa 953 (footer == NULL))
AzureIoTClient 28:add19eb7defa 954 {
AzureIoTClient 28:add19eb7defa 955 /* Codes_SRS_MESSAGE_01_083: [ If `message` or `footer` is NULL, `message_get_footer` shall fail and return a non-zero value. ]*/
AzureIoTClient 28:add19eb7defa 956 LogError("Bad arguments: message = %p, footer = %p",
AzureIoTClient 28:add19eb7defa 957 message, footer);
AzureIoTClient 28:add19eb7defa 958 result = __FAILURE__;
AzureIoTClient 28:add19eb7defa 959 }
AzureIoTClient 28:add19eb7defa 960 else
AzureIoTClient 28:add19eb7defa 961 {
AzureIoTClient 28:add19eb7defa 962 if (message->footer == NULL)
AzureIoTClient 28:add19eb7defa 963 {
AzureIoTClient 28:add19eb7defa 964 /* Codes_SRS_MESSAGE_01_152: [ If no footer has been set, `message_get_footer` shall set `footer` to NULL. ]*/
AzureIoTClient 28:add19eb7defa 965 *footer = NULL;
Azure.IoT Build 0:6ae2f7bca550 966
AzureIoTClient 28:add19eb7defa 967 /* Codes_SRS_MESSAGE_01_082: [ On success, `message_get_footer` shall return 0. ]*/
AzureIoTClient 28:add19eb7defa 968 result = 0;
AzureIoTClient 28:add19eb7defa 969 }
AzureIoTClient 28:add19eb7defa 970 else
AzureIoTClient 28:add19eb7defa 971 {
AzureIoTClient 28:add19eb7defa 972 /* Codes_SRS_MESSAGE_01_081: [ `message_get_footer` shall copy the contents of footer for the message instance identified by `message` into the argument `footer`. ]*/
AzureIoTClient 28:add19eb7defa 973 /* Codes_SRS_MESSAGE_01_084: [ Cloning the footer shall be done by calling `annotations_clone`. ]*/
AzureIoTClient 28:add19eb7defa 974 *footer = annotations_clone(message->footer);
AzureIoTClient 28:add19eb7defa 975 if (*footer == NULL)
AzureIoTClient 28:add19eb7defa 976 {
AzureIoTClient 28:add19eb7defa 977 /* Codes_SRS_MESSAGE_01_085: [ If `annotations_clone` fails, `message_get_footer` shall fail and return a non-zero value. ]*/
AzureIoTClient 28:add19eb7defa 978 LogError("Cannot clone message footer");
AzureIoTClient 28:add19eb7defa 979 result = __FAILURE__;
AzureIoTClient 28:add19eb7defa 980 }
AzureIoTClient 28:add19eb7defa 981 else
AzureIoTClient 28:add19eb7defa 982 {
AzureIoTClient 28:add19eb7defa 983 /* Codes_SRS_MESSAGE_01_082: [ On success, `message_get_footer` shall return 0. ]*/
AzureIoTClient 28:add19eb7defa 984 result = 0;
AzureIoTClient 28:add19eb7defa 985 }
AzureIoTClient 28:add19eb7defa 986 }
AzureIoTClient 28:add19eb7defa 987 }
Azure.IoT Build 0:6ae2f7bca550 988
AzureIoTClient 28:add19eb7defa 989 return result;
Azure.IoT Build 0:6ae2f7bca550 990 }
Azure.IoT Build 0:6ae2f7bca550 991
AzureIoTClient 24:2c59c2d43ebf 992 int message_add_body_amqp_data(MESSAGE_HANDLE message, BINARY_DATA amqp_data)
Azure.IoT Build 0:6ae2f7bca550 993 {
AzureIoTClient 28:add19eb7defa 994 int result;
Azure.IoT Build 0:6ae2f7bca550 995
AzureIoTClient 28:add19eb7defa 996 /* Codes_SRS_MESSAGE_01_088: [ If `message` is NULL, `message_add_body_amqp_data` shall fail and return a non-zero value. ]*/
AzureIoTClient 28:add19eb7defa 997 if ((message == NULL) ||
AzureIoTClient 28:add19eb7defa 998 /* Tests_SRS_MESSAGE_01_089: [ If the `bytes` member of `amqp_data` is NULL and the `size` member is non-zero, `message_add_body_amqp_data` shall fail and return a non-zero value. ]*/
AzureIoTClient 28:add19eb7defa 999 ((amqp_data.bytes == NULL) &&
AzureIoTClient 28:add19eb7defa 1000 (amqp_data.length != 0)))
AzureIoTClient 28:add19eb7defa 1001 {
AzureIoTClient 28:add19eb7defa 1002 LogError("Bad arguments: message = %p, bytes = %p, length = %u",
AzureIoTClient 28:add19eb7defa 1003 message, amqp_data.bytes, (unsigned int)amqp_data.length);
AzureIoTClient 28:add19eb7defa 1004 result = __FAILURE__;
AzureIoTClient 28:add19eb7defa 1005 }
AzureIoTClient 28:add19eb7defa 1006 else
AzureIoTClient 28:add19eb7defa 1007 {
AzureIoTClient 28:add19eb7defa 1008 MESSAGE_BODY_TYPE body_type = internal_get_body_type(message);
AzureIoTClient 28:add19eb7defa 1009 if ((body_type == MESSAGE_BODY_TYPE_SEQUENCE) ||
AzureIoTClient 28:add19eb7defa 1010 (body_type == MESSAGE_BODY_TYPE_VALUE))
AzureIoTClient 28:add19eb7defa 1011 {
AzureIoTClient 28:add19eb7defa 1012 /* Codes_SRS_MESSAGE_01_091: [ If the body was already set to an AMQP value or a list of AMQP sequences, `message_add_body_amqp_data` shall fail and return a non-zero value. ]*/
AzureIoTClient 28:add19eb7defa 1013 LogError("Body type already set");
AzureIoTClient 28:add19eb7defa 1014 result = __FAILURE__;
AzureIoTClient 28:add19eb7defa 1015 }
AzureIoTClient 28:add19eb7defa 1016 else
AzureIoTClient 28:add19eb7defa 1017 {
AzureIoTClient 28:add19eb7defa 1018 /* Codes_SRS_MESSAGE_01_086: [ `message_add_body_amqp_data` shall add the contents of `amqp_data` to the list of AMQP data values for the body of the message identified by `message`. ]*/
AzureIoTClient 28:add19eb7defa 1019 BODY_AMQP_DATA* new_body_amqp_data_items = (BODY_AMQP_DATA*)realloc(message->body_amqp_data_items, sizeof(BODY_AMQP_DATA) * (message->body_amqp_data_count + 1));
AzureIoTClient 28:add19eb7defa 1020 if (new_body_amqp_data_items == NULL)
AzureIoTClient 28:add19eb7defa 1021 {
AzureIoTClient 28:add19eb7defa 1022 /* Codes_SRS_MESSAGE_01_153: [ If allocating memory to store the added AMQP data fails, `message_add_body_amqp_data` shall fail and return a non-zero value. ]*/
AzureIoTClient 28:add19eb7defa 1023 LogError("Cannot allocate memory for body AMQP data items");
AzureIoTClient 28:add19eb7defa 1024 result = __FAILURE__;
AzureIoTClient 28:add19eb7defa 1025 }
AzureIoTClient 28:add19eb7defa 1026 else
AzureIoTClient 28:add19eb7defa 1027 {
AzureIoTClient 28:add19eb7defa 1028 message->body_amqp_data_items = new_body_amqp_data_items;
Azure.IoT Build 0:6ae2f7bca550 1029
AzureIoTClient 28:add19eb7defa 1030 message->body_amqp_data_items[message->body_amqp_data_count].body_data_section_bytes = (unsigned char*)malloc(amqp_data.length);
AzureIoTClient 28:add19eb7defa 1031 if (message->body_amqp_data_items[message->body_amqp_data_count].body_data_section_bytes == NULL)
AzureIoTClient 28:add19eb7defa 1032 {
AzureIoTClient 28:add19eb7defa 1033 /* Codes_SRS_MESSAGE_01_153: [ If allocating memory to store the added AMQP data fails, `message_add_body_amqp_data` shall fail and return a non-zero value. ]*/
AzureIoTClient 28:add19eb7defa 1034 LogError("Cannot allocate memory for body AMQP data to be added");
AzureIoTClient 28:add19eb7defa 1035 result = __FAILURE__;
AzureIoTClient 28:add19eb7defa 1036 }
AzureIoTClient 28:add19eb7defa 1037 else
AzureIoTClient 28:add19eb7defa 1038 {
AzureIoTClient 28:add19eb7defa 1039 message->body_amqp_data_items[message->body_amqp_data_count].body_data_section_length = amqp_data.length;
AzureIoTClient 28:add19eb7defa 1040 (void)memcpy(message->body_amqp_data_items[message->body_amqp_data_count].body_data_section_bytes, amqp_data.bytes, amqp_data.length);
AzureIoTClient 28:add19eb7defa 1041 message->body_amqp_data_count++;
Azure.IoT Build 0:6ae2f7bca550 1042
AzureIoTClient 28:add19eb7defa 1043 /* Codes_SRS_MESSAGE_01_087: [ On success it shall return 0. ]*/
AzureIoTClient 28:add19eb7defa 1044 result = 0;
AzureIoTClient 28:add19eb7defa 1045 }
AzureIoTClient 28:add19eb7defa 1046 }
AzureIoTClient 28:add19eb7defa 1047 }
AzureIoTClient 28:add19eb7defa 1048 }
Azure.IoT Build 0:6ae2f7bca550 1049
AzureIoTClient 28:add19eb7defa 1050 return result;
Azure.IoT Build 0:6ae2f7bca550 1051 }
Azure.IoT Build 0:6ae2f7bca550 1052
AzureIoTClient 28:add19eb7defa 1053 int message_get_body_amqp_data_in_place(MESSAGE_HANDLE message, size_t index, BINARY_DATA* amqp_data)
Azure.IoT Build 0:6ae2f7bca550 1054 {
AzureIoTClient 28:add19eb7defa 1055 int result;
Azure.IoT Build 0:6ae2f7bca550 1056
AzureIoTClient 28:add19eb7defa 1057 if ((message == NULL) ||
AzureIoTClient 28:add19eb7defa 1058 (amqp_data == NULL))
AzureIoTClient 28:add19eb7defa 1059 {
AzureIoTClient 28:add19eb7defa 1060 /* Codes_SRS_MESSAGE_01_094: [ If `message` or `amqp_data` is NULL, `message_get_body_amqp_data_in_place` shall fail and return a non-zero value. ]*/
AzureIoTClient 28:add19eb7defa 1061 LogError("Bad arguments: message = %p, amqp_data = %p",
AzureIoTClient 28:add19eb7defa 1062 message, amqp_data);
AzureIoTClient 28:add19eb7defa 1063 result = __FAILURE__;
AzureIoTClient 28:add19eb7defa 1064 }
AzureIoTClient 28:add19eb7defa 1065 else
AzureIoTClient 28:add19eb7defa 1066 {
AzureIoTClient 28:add19eb7defa 1067 MESSAGE_BODY_TYPE body_type = internal_get_body_type(message);
AzureIoTClient 28:add19eb7defa 1068 if (body_type != MESSAGE_BODY_TYPE_DATA)
AzureIoTClient 28:add19eb7defa 1069 {
AzureIoTClient 28:add19eb7defa 1070 /* Codes_SRS_MESSAGE_01_096: [ If the body for `message` is not of type `MESSAGE_BODY_TYPE_DATA`, `message_get_body_amqp_data_in_place` shall fail and return a non-zero value. ]*/
AzureIoTClient 28:add19eb7defa 1071 LogError("Body type is not AMQP data");
AzureIoTClient 28:add19eb7defa 1072 result = __FAILURE__;
AzureIoTClient 28:add19eb7defa 1073 }
AzureIoTClient 28:add19eb7defa 1074 else if (index >= message->body_amqp_data_count)
AzureIoTClient 28:add19eb7defa 1075 {
AzureIoTClient 28:add19eb7defa 1076 /* Codes_SRS_MESSAGE_01_095: [ If `index` indicates an AMQP data entry that is out of bounds, `message_get_body_amqp_data_in_place` shall fail and return a non-zero value. ]*/
AzureIoTClient 28:add19eb7defa 1077 LogError("Index too high for AMQP data (%u), number of AMQP data entries is %u",
AzureIoTClient 28:add19eb7defa 1078 index, message->body_amqp_data_count);
AzureIoTClient 28:add19eb7defa 1079 result = __FAILURE__;
AzureIoTClient 28:add19eb7defa 1080 }
AzureIoTClient 28:add19eb7defa 1081 else
AzureIoTClient 28:add19eb7defa 1082 {
AzureIoTClient 28:add19eb7defa 1083 /* Codes_SRS_MESSAGE_01_092: [ `message_get_body_amqp_data_in_place` shall place the contents of the `index`th AMQP data for the message instance identified by `message` into the argument `amqp_data`, without copying the binary payload memory. ]*/
AzureIoTClient 28:add19eb7defa 1084 amqp_data->bytes = message->body_amqp_data_items[index].body_data_section_bytes;
AzureIoTClient 28:add19eb7defa 1085 amqp_data->length = message->body_amqp_data_items[index].body_data_section_length;
Azure.IoT Build 0:6ae2f7bca550 1086
AzureIoTClient 28:add19eb7defa 1087 /* Codes_SRS_MESSAGE_01_093: [ On success, `message_get_body_amqp_data_in_place` shall return 0. ]*/
AzureIoTClient 28:add19eb7defa 1088 result = 0;
AzureIoTClient 28:add19eb7defa 1089 }
AzureIoTClient 28:add19eb7defa 1090 }
Azure.IoT Build 0:6ae2f7bca550 1091
AzureIoTClient 28:add19eb7defa 1092 return result;
Azure.IoT Build 0:6ae2f7bca550 1093 }
Azure.IoT Build 0:6ae2f7bca550 1094
Azure.IoT Build 0:6ae2f7bca550 1095 int message_get_body_amqp_data_count(MESSAGE_HANDLE message, size_t* count)
Azure.IoT Build 0:6ae2f7bca550 1096 {
AzureIoTClient 28:add19eb7defa 1097 int result;
AzureIoTClient 28:add19eb7defa 1098
AzureIoTClient 28:add19eb7defa 1099 if ((message == NULL) ||
AzureIoTClient 28:add19eb7defa 1100 (count == NULL))
AzureIoTClient 28:add19eb7defa 1101 {
AzureIoTClient 28:add19eb7defa 1102 /* Codes_SRS_MESSAGE_01_099: [ If `message` or `count` is NULL, `message_get_body_amqp_data_count` shall fail and return a non-zero value. ]*/
AzureIoTClient 28:add19eb7defa 1103 LogError("Bad arguments: message = %p, count = %p",
AzureIoTClient 28:add19eb7defa 1104 message, count);
AzureIoTClient 28:add19eb7defa 1105 result = __FAILURE__;
AzureIoTClient 28:add19eb7defa 1106 }
AzureIoTClient 28:add19eb7defa 1107 else
AzureIoTClient 28:add19eb7defa 1108 {
AzureIoTClient 28:add19eb7defa 1109 MESSAGE_BODY_TYPE body_type = internal_get_body_type(message);
AzureIoTClient 28:add19eb7defa 1110 if (body_type != MESSAGE_BODY_TYPE_DATA)
AzureIoTClient 28:add19eb7defa 1111 {
AzureIoTClient 28:add19eb7defa 1112 /* Codes_SRS_MESSAGE_01_100: [ If the body for `message` is not of type `MESSAGE_BODY_TYPE_DATA`, `message_get_body_amqp_data_count` shall fail and return a non-zero value. ]*/
AzureIoTClient 28:add19eb7defa 1113 LogError("Body type is not AMQP data");
AzureIoTClient 28:add19eb7defa 1114 result = __FAILURE__;
AzureIoTClient 28:add19eb7defa 1115 }
AzureIoTClient 28:add19eb7defa 1116 else
AzureIoTClient 28:add19eb7defa 1117 {
AzureIoTClient 28:add19eb7defa 1118 /* Codes_SRS_MESSAGE_01_097: [ `message_get_body_amqp_data_count` shall fill in `count` the number of AMQP data chunks that are stored by the message identified by `message`. ]*/
AzureIoTClient 28:add19eb7defa 1119 *count = message->body_amqp_data_count;
AzureIoTClient 28:add19eb7defa 1120
AzureIoTClient 28:add19eb7defa 1121 /* Codes_SRS_MESSAGE_01_098: [ On success, `message_get_body_amqp_data_count` shall return 0. ]*/
AzureIoTClient 28:add19eb7defa 1122 result = 0;
AzureIoTClient 28:add19eb7defa 1123 }
AzureIoTClient 28:add19eb7defa 1124 }
AzureIoTClient 28:add19eb7defa 1125
AzureIoTClient 28:add19eb7defa 1126 return result;
AzureIoTClient 28:add19eb7defa 1127 }
AzureIoTClient 28:add19eb7defa 1128
AzureIoTClient 28:add19eb7defa 1129 int message_set_body_amqp_value(MESSAGE_HANDLE message, AMQP_VALUE body_amqp_value)
AzureIoTClient 28:add19eb7defa 1130 {
AzureIoTClient 28:add19eb7defa 1131 int result;
Azure.IoT Build 0:6ae2f7bca550 1132
AzureIoTClient 28:add19eb7defa 1133 if ((message == NULL) ||
AzureIoTClient 28:add19eb7defa 1134 (body_amqp_value == NULL))
AzureIoTClient 28:add19eb7defa 1135 {
AzureIoTClient 28:add19eb7defa 1136 /* Codes_SRS_MESSAGE_01_103: [ If `message` or `body_amqp_value` is NULL, `message_set_body_amqp_value` shall fail and return a non-zero value. ]*/
AzureIoTClient 28:add19eb7defa 1137 LogError("Bad arguments: message = %p, body_amqp_value = %p",
AzureIoTClient 28:add19eb7defa 1138 message, body_amqp_value);
AzureIoTClient 28:add19eb7defa 1139 result = __FAILURE__;
AzureIoTClient 28:add19eb7defa 1140 }
AzureIoTClient 28:add19eb7defa 1141 else
AzureIoTClient 28:add19eb7defa 1142 {
AzureIoTClient 28:add19eb7defa 1143 MESSAGE_BODY_TYPE body_type = internal_get_body_type(message);
AzureIoTClient 28:add19eb7defa 1144 if ((body_type == MESSAGE_BODY_TYPE_DATA) ||
AzureIoTClient 28:add19eb7defa 1145 (body_type == MESSAGE_BODY_TYPE_SEQUENCE))
AzureIoTClient 28:add19eb7defa 1146 {
AzureIoTClient 28:add19eb7defa 1147 /* Codes_SRS_MESSAGE_01_105: [ If the body was already set to an AMQP data list or a list of AMQP sequences, `message_set_body_amqp_value` shall fail and return a non-zero value. ]*/
AzureIoTClient 28:add19eb7defa 1148 LogError("Body is already set to another body type");
AzureIoTClient 28:add19eb7defa 1149 result = __FAILURE__;
AzureIoTClient 28:add19eb7defa 1150 }
AzureIoTClient 28:add19eb7defa 1151 else
AzureIoTClient 28:add19eb7defa 1152 {
AzureIoTClient 28:add19eb7defa 1153 /* Codes_SRS_MESSAGE_01_154: [ Cloning the amqp value shall be done by calling `amqpvalue_clone`. ]*/
AzureIoTClient 28:add19eb7defa 1154 AMQP_VALUE new_amqp_value = amqpvalue_clone(body_amqp_value);
AzureIoTClient 28:add19eb7defa 1155 if (new_amqp_value == NULL)
AzureIoTClient 28:add19eb7defa 1156 {
AzureIoTClient 28:add19eb7defa 1157 LogError("Cannot clone body AMQP value",
AzureIoTClient 28:add19eb7defa 1158 message, body_amqp_value);
AzureIoTClient 28:add19eb7defa 1159 result = __FAILURE__;
AzureIoTClient 28:add19eb7defa 1160 }
AzureIoTClient 28:add19eb7defa 1161 else
AzureIoTClient 28:add19eb7defa 1162 {
AzureIoTClient 28:add19eb7defa 1163 /* Codes_SRS_MESSAGE_01_104: [ If setting the body AMQP value fails, the previous value shall be preserved. ]*/
AzureIoTClient 28:add19eb7defa 1164 /* Only free the previous value when cloning is succesfull */
AzureIoTClient 28:add19eb7defa 1165 if (message->body_amqp_value != NULL)
AzureIoTClient 28:add19eb7defa 1166 {
AzureIoTClient 28:add19eb7defa 1167 amqpvalue_destroy(body_amqp_value);
AzureIoTClient 28:add19eb7defa 1168 }
AzureIoTClient 28:add19eb7defa 1169
AzureIoTClient 28:add19eb7defa 1170 /* Codes_SRS_MESSAGE_01_101: [ `message_set_body_amqp_value` shall set the contents of body as being the AMQP value indicate by `body_amqp_value`. ]*/
AzureIoTClient 28:add19eb7defa 1171 message->body_amqp_value = new_amqp_value;
Azure.IoT Build 0:6ae2f7bca550 1172
AzureIoTClient 28:add19eb7defa 1173 /* Codes_SRS_MESSAGE_01_102: [ On success it shall return 0. ]*/
AzureIoTClient 28:add19eb7defa 1174 result = 0;
AzureIoTClient 28:add19eb7defa 1175 }
AzureIoTClient 28:add19eb7defa 1176 }
AzureIoTClient 28:add19eb7defa 1177 }
AzureIoTClient 28:add19eb7defa 1178
AzureIoTClient 28:add19eb7defa 1179 return result;
AzureIoTClient 28:add19eb7defa 1180 }
AzureIoTClient 28:add19eb7defa 1181
AzureIoTClient 28:add19eb7defa 1182 int message_get_body_amqp_value_in_place(MESSAGE_HANDLE message, AMQP_VALUE* body_amqp_value)
AzureIoTClient 28:add19eb7defa 1183 {
AzureIoTClient 28:add19eb7defa 1184 int result;
AzureIoTClient 28:add19eb7defa 1185
AzureIoTClient 28:add19eb7defa 1186 if ((message == NULL) ||
AzureIoTClient 28:add19eb7defa 1187 (body_amqp_value == NULL))
AzureIoTClient 28:add19eb7defa 1188 {
AzureIoTClient 28:add19eb7defa 1189 /* Codes_SRS_MESSAGE_01_108: [ If `message` or `body_amqp_value` is NULL, `message_get_body_amqp_value_in_place` shall fail and return a non-zero value. ]*/
AzureIoTClient 28:add19eb7defa 1190 LogError("Bad arguments: message = %p, body_amqp_value = %p",
AzureIoTClient 28:add19eb7defa 1191 message, body_amqp_value);
AzureIoTClient 28:add19eb7defa 1192 result = __FAILURE__;
AzureIoTClient 28:add19eb7defa 1193 }
AzureIoTClient 28:add19eb7defa 1194 else
AzureIoTClient 28:add19eb7defa 1195 {
AzureIoTClient 28:add19eb7defa 1196 MESSAGE_BODY_TYPE body_type = internal_get_body_type(message);
AzureIoTClient 28:add19eb7defa 1197 if (body_type != MESSAGE_BODY_TYPE_VALUE)
AzureIoTClient 28:add19eb7defa 1198 {
AzureIoTClient 28:add19eb7defa 1199 /* Codes_SRS_MESSAGE_01_109: [ If the body for `message` is not of type `MESSAGE_BODY_TYPE_VALUE`, `message_get_body_amqp_value_in_place` shall fail and return a non-zero value. ]*/
AzureIoTClient 28:add19eb7defa 1200 LogError("Body is not of type AMQP value");
AzureIoTClient 28:add19eb7defa 1201 result = __FAILURE__;
AzureIoTClient 28:add19eb7defa 1202 }
AzureIoTClient 28:add19eb7defa 1203 else
AzureIoTClient 28:add19eb7defa 1204 {
AzureIoTClient 28:add19eb7defa 1205 /* Codes_SRS_MESSAGE_01_106: [ `message_get_body_amqp_value_in_place` shall get the body AMQP value for the message instance identified by `message` in place (not cloning) into the `body_amqp_value` argument. ]*/
AzureIoTClient 28:add19eb7defa 1206 *body_amqp_value = message->body_amqp_value;
AzureIoTClient 28:add19eb7defa 1207
AzureIoTClient 28:add19eb7defa 1208 /* Codes_SRS_MESSAGE_01_107: [ On success, `message_get_body_amqp_value_in_place` shall return 0. ]*/
AzureIoTClient 28:add19eb7defa 1209 result = 0;
AzureIoTClient 28:add19eb7defa 1210 }
AzureIoTClient 28:add19eb7defa 1211 }
AzureIoTClient 28:add19eb7defa 1212
AzureIoTClient 28:add19eb7defa 1213 return result;
Azure.IoT Build 0:6ae2f7bca550 1214 }
Azure.IoT Build 0:6ae2f7bca550 1215
Azure.IoT Build 0:6ae2f7bca550 1216 int message_add_body_amqp_sequence(MESSAGE_HANDLE message, AMQP_VALUE sequence_list)
Azure.IoT Build 0:6ae2f7bca550 1217 {
AzureIoTClient 28:add19eb7defa 1218 int result;
Azure.IoT Build 0:6ae2f7bca550 1219
AzureIoTClient 28:add19eb7defa 1220 if ((message == NULL) ||
AzureIoTClient 28:add19eb7defa 1221 (sequence_list == NULL))
AzureIoTClient 28:add19eb7defa 1222 {
AzureIoTClient 28:add19eb7defa 1223 /* Codes_SRS_MESSAGE_01_112: [ If `message` or `sequence` is NULL, `message_add_body_amqp_sequence` shall fail and return a non-zero value. ]*/
AzureIoTClient 28:add19eb7defa 1224 LogError("Bad arguments: message = %p, sequence_list = %p",
AzureIoTClient 28:add19eb7defa 1225 message, sequence_list);
AzureIoTClient 28:add19eb7defa 1226 result = __FAILURE__;
AzureIoTClient 28:add19eb7defa 1227 }
AzureIoTClient 28:add19eb7defa 1228 else
AzureIoTClient 28:add19eb7defa 1229 {
AzureIoTClient 28:add19eb7defa 1230 MESSAGE_BODY_TYPE body_type = internal_get_body_type(message);
AzureIoTClient 28:add19eb7defa 1231 if ((body_type == MESSAGE_BODY_TYPE_DATA) ||
AzureIoTClient 28:add19eb7defa 1232 (body_type == MESSAGE_BODY_TYPE_VALUE))
AzureIoTClient 28:add19eb7defa 1233 {
AzureIoTClient 28:add19eb7defa 1234 /* Codes_SRS_MESSAGE_01_115: [ If the body was already set to an AMQP data list or an AMQP value, `message_add_body_amqp_sequence` shall fail and return a non-zero value. ]*/
AzureIoTClient 28:add19eb7defa 1235 LogError("Body is already set to another body type");
AzureIoTClient 28:add19eb7defa 1236 result = __FAILURE__;
AzureIoTClient 28:add19eb7defa 1237 }
AzureIoTClient 28:add19eb7defa 1238 else
AzureIoTClient 28:add19eb7defa 1239 {
AzureIoTClient 28:add19eb7defa 1240 AMQP_VALUE* new_body_amqp_sequence_items = (AMQP_VALUE*)realloc(message->body_amqp_sequence_items, sizeof(AMQP_VALUE) * (message->body_amqp_sequence_count + 1));
AzureIoTClient 28:add19eb7defa 1241 if (new_body_amqp_sequence_items == NULL)
AzureIoTClient 28:add19eb7defa 1242 {
AzureIoTClient 28:add19eb7defa 1243 /* Codes_SRS_MESSAGE_01_158: [ If allocating memory in order to store the sequence fails, `message_add_body_amqp_sequence` shall fail and return a non-zero value. ]*/
AzureIoTClient 28:add19eb7defa 1244 LogError("Cannot allocate enough memory for sequence items");
AzureIoTClient 28:add19eb7defa 1245 result = __FAILURE__;
AzureIoTClient 28:add19eb7defa 1246 }
AzureIoTClient 28:add19eb7defa 1247 else
AzureIoTClient 28:add19eb7defa 1248 {
AzureIoTClient 28:add19eb7defa 1249 message->body_amqp_sequence_items = new_body_amqp_sequence_items;
Azure.IoT Build 0:6ae2f7bca550 1250
AzureIoTClient 28:add19eb7defa 1251 /* Codes_SRS_MESSAGE_01_110: [ `message_add_body_amqp_sequence` shall add the contents of `sequence` to the list of AMQP sequences for the body of the message identified by `message`. ]*/
AzureIoTClient 28:add19eb7defa 1252 /* Codes_SRS_MESSAGE_01_156: [ The AMQP sequence shall be cloned by calling `amqpvalue_clone`. ]*/
AzureIoTClient 28:add19eb7defa 1253 message->body_amqp_sequence_items[message->body_amqp_sequence_count] = amqpvalue_clone(sequence_list);
AzureIoTClient 28:add19eb7defa 1254 if (message->body_amqp_sequence_items[message->body_amqp_sequence_count] == NULL)
AzureIoTClient 28:add19eb7defa 1255 {
AzureIoTClient 28:add19eb7defa 1256 /* Codes_SRS_MESSAGE_01_157: [ If `amqpvalue_clone` fails, `message_add_body_amqp_sequence` shall fail and return a non-zero value. ]*/
AzureIoTClient 28:add19eb7defa 1257 LogError("Cloning sequence failed");
AzureIoTClient 28:add19eb7defa 1258 result = __FAILURE__;
AzureIoTClient 28:add19eb7defa 1259 }
AzureIoTClient 28:add19eb7defa 1260 else
AzureIoTClient 28:add19eb7defa 1261 {
AzureIoTClient 28:add19eb7defa 1262 /* Codes_SRS_MESSAGE_01_114: [ If adding the AMQP sequence fails, the previous value shall be preserved. ]*/
AzureIoTClient 28:add19eb7defa 1263 message->body_amqp_sequence_count++;
Azure.IoT Build 0:6ae2f7bca550 1264
AzureIoTClient 28:add19eb7defa 1265 /* Codes_SRS_MESSAGE_01_111: [ On success it shall return 0. ]*/
AzureIoTClient 28:add19eb7defa 1266 result = 0;
AzureIoTClient 28:add19eb7defa 1267 }
AzureIoTClient 28:add19eb7defa 1268 }
AzureIoTClient 28:add19eb7defa 1269 }
AzureIoTClient 28:add19eb7defa 1270 }
Azure.IoT Build 0:6ae2f7bca550 1271
AzureIoTClient 28:add19eb7defa 1272 return result;
Azure.IoT Build 0:6ae2f7bca550 1273 }
Azure.IoT Build 0:6ae2f7bca550 1274
AzureIoTClient 28:add19eb7defa 1275 int message_get_body_amqp_sequence_in_place(MESSAGE_HANDLE message, size_t index, AMQP_VALUE* sequence)
Azure.IoT Build 0:6ae2f7bca550 1276 {
AzureIoTClient 28:add19eb7defa 1277 int result;
Azure.IoT Build 0:6ae2f7bca550 1278
AzureIoTClient 28:add19eb7defa 1279 if ((message == NULL) ||
AzureIoTClient 28:add19eb7defa 1280 (sequence == NULL))
AzureIoTClient 28:add19eb7defa 1281 {
AzureIoTClient 28:add19eb7defa 1282 /* Codes_SRS_MESSAGE_01_118: [ If `message` or `sequence` is NULL, `message_get_body_amqp_sequence_in_place` shall fail and return a non-zero value. ]*/
AzureIoTClient 28:add19eb7defa 1283 LogError("Bad arguments: message = %p, sequence = %p",
AzureIoTClient 28:add19eb7defa 1284 message, sequence);
AzureIoTClient 28:add19eb7defa 1285 result = __FAILURE__;
AzureIoTClient 28:add19eb7defa 1286 }
AzureIoTClient 28:add19eb7defa 1287 else
AzureIoTClient 28:add19eb7defa 1288 {
AzureIoTClient 28:add19eb7defa 1289 MESSAGE_BODY_TYPE body_type = internal_get_body_type(message);
AzureIoTClient 28:add19eb7defa 1290 if (body_type != MESSAGE_BODY_TYPE_SEQUENCE)
AzureIoTClient 28:add19eb7defa 1291 {
AzureIoTClient 28:add19eb7defa 1292 /* Codes_SRS_MESSAGE_01_120: [ If the body for `message` is not of type `MESSAGE_BODY_TYPE_SEQUENCE`, `message_get_body_amqp_sequence_in_place` shall fail and return a non-zero value. ]*/
AzureIoTClient 28:add19eb7defa 1293 LogError("Body is not of type SEQUENCE");
AzureIoTClient 28:add19eb7defa 1294 result = __FAILURE__;
AzureIoTClient 28:add19eb7defa 1295 }
AzureIoTClient 28:add19eb7defa 1296 else
AzureIoTClient 28:add19eb7defa 1297 {
AzureIoTClient 28:add19eb7defa 1298 if (index >= message->body_amqp_sequence_count)
AzureIoTClient 28:add19eb7defa 1299 {
AzureIoTClient 28:add19eb7defa 1300 /* Codes_SRS_MESSAGE_01_119: [ If `index` indicates an AMQP sequence entry that is out of bounds, `message_get_body_amqp_sequence_in_place` shall fail and return a non-zero value. ]*/
AzureIoTClient 28:add19eb7defa 1301 LogError("Index too high for AMQP sequence (%u), maximum is %u",
AzureIoTClient 28:add19eb7defa 1302 index, message->body_amqp_sequence_count);
AzureIoTClient 28:add19eb7defa 1303 result = __FAILURE__;
AzureIoTClient 28:add19eb7defa 1304 }
AzureIoTClient 28:add19eb7defa 1305 else
AzureIoTClient 28:add19eb7defa 1306 {
AzureIoTClient 28:add19eb7defa 1307 /* Codes_SRS_MESSAGE_01_116: [ `message_get_body_amqp_sequence_in_place` shall return in `sequence` the content of the `index`th AMQP seuquence entry for the message instance identified by `message`. ]*/
AzureIoTClient 28:add19eb7defa 1308 *sequence = message->body_amqp_sequence_items[index];
Azure.IoT Build 0:6ae2f7bca550 1309
AzureIoTClient 28:add19eb7defa 1310 /* Codes_SRS_MESSAGE_01_117: [ On success, `message_get_body_amqp_sequence_in_place` shall return 0. ]*/
AzureIoTClient 28:add19eb7defa 1311 result = 0;
AzureIoTClient 28:add19eb7defa 1312 }
AzureIoTClient 28:add19eb7defa 1313 }
AzureIoTClient 28:add19eb7defa 1314 }
AzureIoTClient 28:add19eb7defa 1315
AzureIoTClient 28:add19eb7defa 1316 return result;
Azure.IoT Build 0:6ae2f7bca550 1317 }
Azure.IoT Build 0:6ae2f7bca550 1318
Azure.IoT Build 0:6ae2f7bca550 1319 int message_get_body_amqp_sequence_count(MESSAGE_HANDLE message, size_t* count)
Azure.IoT Build 0:6ae2f7bca550 1320 {
AzureIoTClient 28:add19eb7defa 1321 int result;
Azure.IoT Build 0:6ae2f7bca550 1322
AzureIoTClient 28:add19eb7defa 1323 if ((message == NULL) ||
AzureIoTClient 28:add19eb7defa 1324 (count == NULL))
AzureIoTClient 28:add19eb7defa 1325 {
AzureIoTClient 28:add19eb7defa 1326 /* Codes_SRS_MESSAGE_01_123: [ If `message` or `count` is NULL, `message_get_body_amqp_sequence_count` shall fail and return a non-zero value. ]*/
AzureIoTClient 28:add19eb7defa 1327 LogError("Bad arguments: message = %p, count = %p",
AzureIoTClient 28:add19eb7defa 1328 message, count);
AzureIoTClient 28:add19eb7defa 1329 result = __FAILURE__;
AzureIoTClient 28:add19eb7defa 1330 }
AzureIoTClient 28:add19eb7defa 1331 else
AzureIoTClient 28:add19eb7defa 1332 {
AzureIoTClient 28:add19eb7defa 1333 MESSAGE_BODY_TYPE body_type = internal_get_body_type(message);
AzureIoTClient 28:add19eb7defa 1334 if (body_type != MESSAGE_BODY_TYPE_SEQUENCE)
AzureIoTClient 28:add19eb7defa 1335 {
AzureIoTClient 28:add19eb7defa 1336 /* Codes_SRS_MESSAGE_01_124: [ If the body for `message` is not of type `MESSAGE_BODY_TYPE_SEQUENCE`, `message_get_body_amqp_sequence_count` shall fail and return a non-zero value. ]*/
AzureIoTClient 28:add19eb7defa 1337 LogError("Body is not of type SEQUENCE");
AzureIoTClient 28:add19eb7defa 1338 result = __FAILURE__;
AzureIoTClient 28:add19eb7defa 1339 }
AzureIoTClient 28:add19eb7defa 1340 else
AzureIoTClient 28:add19eb7defa 1341 {
AzureIoTClient 28:add19eb7defa 1342 /* Codes_SRS_MESSAGE_01_121: [ `message_get_body_amqp_sequence_count` shall fill in `count` the number of AMQP sequences that are stored by the message identified by `message`. ]*/
AzureIoTClient 28:add19eb7defa 1343 *count = message->body_amqp_sequence_count;
Azure.IoT Build 0:6ae2f7bca550 1344
AzureIoTClient 28:add19eb7defa 1345 /* Codes_SRS_MESSAGE_01_122: [ On success, `message_get_body_amqp_sequence_count` shall return 0. ]*/
AzureIoTClient 28:add19eb7defa 1346 result = 0;
AzureIoTClient 28:add19eb7defa 1347 }
AzureIoTClient 28:add19eb7defa 1348 }
Azure.IoT Build 0:6ae2f7bca550 1349
AzureIoTClient 28:add19eb7defa 1350 return result;
Azure.IoT Build 0:6ae2f7bca550 1351 }
Azure.IoT Build 0:6ae2f7bca550 1352
Azure.IoT Build 0:6ae2f7bca550 1353 int message_get_body_type(MESSAGE_HANDLE message, MESSAGE_BODY_TYPE* body_type)
Azure.IoT Build 0:6ae2f7bca550 1354 {
AzureIoTClient 28:add19eb7defa 1355 int result;
Azure.IoT Build 0:6ae2f7bca550 1356
AzureIoTClient 28:add19eb7defa 1357 if ((message == NULL) ||
AzureIoTClient 28:add19eb7defa 1358 (body_type == NULL))
AzureIoTClient 28:add19eb7defa 1359 {
AzureIoTClient 28:add19eb7defa 1360 /* Codes_SRS_MESSAGE_01_127: [ If `message` or `body_type` is NULL, `message_get_body_type` shall fail and return a non-zero value. ]*/
AzureIoTClient 28:add19eb7defa 1361 LogError("Bad arguments: message = %p, body_type = %p",
AzureIoTClient 28:add19eb7defa 1362 message, body_type);
AzureIoTClient 28:add19eb7defa 1363 result = __FAILURE__;
AzureIoTClient 28:add19eb7defa 1364 }
AzureIoTClient 28:add19eb7defa 1365 else
AzureIoTClient 28:add19eb7defa 1366 {
AzureIoTClient 28:add19eb7defa 1367 /* Codes_SRS_MESSAGE_01_125: [ `message_get_body_type` shall fill in `body_type` the AMQP message body type. ]*/
AzureIoTClient 28:add19eb7defa 1368 if (message->body_amqp_value != NULL)
AzureIoTClient 28:add19eb7defa 1369 {
AzureIoTClient 28:add19eb7defa 1370 *body_type = MESSAGE_BODY_TYPE_VALUE;
AzureIoTClient 28:add19eb7defa 1371 }
AzureIoTClient 28:add19eb7defa 1372 else if (message->body_amqp_data_count > 0)
AzureIoTClient 28:add19eb7defa 1373 {
AzureIoTClient 28:add19eb7defa 1374 *body_type = MESSAGE_BODY_TYPE_DATA;
AzureIoTClient 28:add19eb7defa 1375 }
AzureIoTClient 28:add19eb7defa 1376 else if (message->body_amqp_sequence_count > 0)
AzureIoTClient 28:add19eb7defa 1377 {
AzureIoTClient 28:add19eb7defa 1378 *body_type = MESSAGE_BODY_TYPE_SEQUENCE;
AzureIoTClient 28:add19eb7defa 1379 }
AzureIoTClient 28:add19eb7defa 1380 else
AzureIoTClient 28:add19eb7defa 1381 {
AzureIoTClient 28:add19eb7defa 1382 /* Codes_SRS_MESSAGE_01_128: [ If no body has been set on the message, `body_type` shall be `MESSAGE_BODY_TYPE_NONE`. ]*/
AzureIoTClient 28:add19eb7defa 1383 *body_type = MESSAGE_BODY_TYPE_NONE;
AzureIoTClient 28:add19eb7defa 1384 }
Azure.IoT Build 0:6ae2f7bca550 1385
AzureIoTClient 28:add19eb7defa 1386 /* Codes_SRS_MESSAGE_01_126: [ On success, `message_get_body_type` shall return 0. ]*/
AzureIoTClient 28:add19eb7defa 1387 result = 0;
AzureIoTClient 28:add19eb7defa 1388 }
Azure.IoT Build 0:6ae2f7bca550 1389
AzureIoTClient 28:add19eb7defa 1390 return result;
Azure.IoT Build 0:6ae2f7bca550 1391 }
Azure.IoT Build 0:6ae2f7bca550 1392
Azure.IoT Build 0:6ae2f7bca550 1393 int message_set_message_format(MESSAGE_HANDLE message, uint32_t message_format)
Azure.IoT Build 0:6ae2f7bca550 1394 {
Azure.IoT Build 0:6ae2f7bca550 1395 int result;
Azure.IoT Build 0:6ae2f7bca550 1396
Azure.IoT Build 0:6ae2f7bca550 1397 if (message == NULL)
Azure.IoT Build 0:6ae2f7bca550 1398 {
AzureIoTClient 28:add19eb7defa 1399 /* Codes_SRS_MESSAGE_01_131: [ If `message` is NULL, `message_set_message_format` shall fail and return a non-zero value. ]*/
AzureIoTClient 28:add19eb7defa 1400 LogError("NULL message");
AzureIoTClient 28:add19eb7defa 1401 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 1402 }
Azure.IoT Build 0:6ae2f7bca550 1403 else
Azure.IoT Build 0:6ae2f7bca550 1404 {
AzureIoTClient 28:add19eb7defa 1405 /* Codes_SRS_MESSAGE_01_129: [ `message_set_message_format` shall set the message format for the message identified by `message`. ]*/
AzureIoTClient 24:2c59c2d43ebf 1406 message->message_format = message_format;
AzureIoTClient 28:add19eb7defa 1407
AzureIoTClient 28:add19eb7defa 1408 /* Codes_SRS_MESSAGE_01_130: [ On success, `message_set_message_format` shall return 0. ]*/
Azure.IoT Build 0:6ae2f7bca550 1409 result = 0;
Azure.IoT Build 0:6ae2f7bca550 1410 }
Azure.IoT Build 0:6ae2f7bca550 1411
Azure.IoT Build 0:6ae2f7bca550 1412 return result;
Azure.IoT Build 0:6ae2f7bca550 1413 }
Azure.IoT Build 0:6ae2f7bca550 1414
Azure.IoT Build 0:6ae2f7bca550 1415 int message_get_message_format(MESSAGE_HANDLE message, uint32_t *message_format)
Azure.IoT Build 0:6ae2f7bca550 1416 {
Azure.IoT Build 0:6ae2f7bca550 1417 int result;
Azure.IoT Build 0:6ae2f7bca550 1418
Azure.IoT Build 0:6ae2f7bca550 1419 if ((message == NULL) ||
Azure.IoT Build 0:6ae2f7bca550 1420 (message_format == NULL))
Azure.IoT Build 0:6ae2f7bca550 1421 {
AzureIoTClient 28:add19eb7defa 1422 /* Codes_SRS_MESSAGE_01_134: [ If `message` or `message_format` is NULL, `message_get_message_format` shall fail and return a non-zero value. ]*/
AzureIoTClient 28:add19eb7defa 1423 LogError("Bad arguments: message = %p, message_format = %p",
AzureIoTClient 28:add19eb7defa 1424 message, message_format);
AzureIoTClient 28:add19eb7defa 1425 result = __FAILURE__;
Azure.IoT Build 0:6ae2f7bca550 1426 }
Azure.IoT Build 0:6ae2f7bca550 1427 else
Azure.IoT Build 0:6ae2f7bca550 1428 {
AzureIoTClient 28:add19eb7defa 1429 /* Codes_SRS_MESSAGE_01_132: [ `message_get_message_format` shall get the message format for the message identified by `message` and return it in the `message_fomrat` argument. ]*/
AzureIoTClient 24:2c59c2d43ebf 1430 *message_format = message->message_format;
AzureIoTClient 28:add19eb7defa 1431
AzureIoTClient 28:add19eb7defa 1432 /* Codes_SRS_MESSAGE_01_133: [ On success, `message_get_message_format` shall return 0. ]*/
Azure.IoT Build 0:6ae2f7bca550 1433 result = 0;
Azure.IoT Build 0:6ae2f7bca550 1434 }
Azure.IoT Build 0:6ae2f7bca550 1435
Azure.IoT Build 0:6ae2f7bca550 1436 return result;
Azure.IoT Build 0:6ae2f7bca550 1437 }