Xin Zhang / azure-iot-c-sdk-f767zi

Dependents:   samplemqtt

Committer:
XinZhangMS
Date:
Thu Aug 23 06:52:14 2018 +0000
Revision:
0:f7f1f0d76dd6
azure-c-sdk for mbed os supporting NUCLEO_F767ZI

Who changed what in which revision?

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