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 #ifdef __cplusplus
XinZhangMS 0:f7f1f0d76dd6 4 #include <cstdlib>
XinZhangMS 0:f7f1f0d76dd6 5 #include <cstdint>
XinZhangMS 0:f7f1f0d76dd6 6 #include <cinttypes>
XinZhangMS 0:f7f1f0d76dd6 7 #else
XinZhangMS 0:f7f1f0d76dd6 8 #include <stdlib.h>
XinZhangMS 0:f7f1f0d76dd6 9 #include <stdint.h>
XinZhangMS 0:f7f1f0d76dd6 10 #include <inttypes.h>
XinZhangMS 0:f7f1f0d76dd6 11 #endif
XinZhangMS 0:f7f1f0d76dd6 12
XinZhangMS 0:f7f1f0d76dd6 13 #include "internal/uamqp_messaging.h"
XinZhangMS 0:f7f1f0d76dd6 14 #include "azure_c_shared_utility/gballoc.h"
XinZhangMS 0:f7f1f0d76dd6 15 #include "azure_c_shared_utility/optimize_size.h"
XinZhangMS 0:f7f1f0d76dd6 16 #include "azure_c_shared_utility/xlogging.h"
XinZhangMS 0:f7f1f0d76dd6 17 #include "azure_c_shared_utility/uuid.h"
XinZhangMS 0:f7f1f0d76dd6 18 #include "azure_uamqp_c/amqp_definitions.h"
XinZhangMS 0:f7f1f0d76dd6 19 #include "azure_uamqp_c/message.h"
XinZhangMS 0:f7f1f0d76dd6 20 #include "azure_uamqp_c/amqpvalue.h"
XinZhangMS 0:f7f1f0d76dd6 21 #include "iothub_message.h"
XinZhangMS 0:f7f1f0d76dd6 22 #ifndef RESULT_OK
XinZhangMS 0:f7f1f0d76dd6 23 #define RESULT_OK 0
XinZhangMS 0:f7f1f0d76dd6 24 #endif
XinZhangMS 0:f7f1f0d76dd6 25
XinZhangMS 0:f7f1f0d76dd6 26 #define MESSAGE_ID_MAX_SIZE 128
XinZhangMS 0:f7f1f0d76dd6 27
XinZhangMS 0:f7f1f0d76dd6 28 #define AMQP_DIAGNOSTIC_ID_KEY "Diagnostic-Id"
XinZhangMS 0:f7f1f0d76dd6 29 #define AMQP_DIAGNOSTIC_CONTEXT_KEY "Correlation-Context"
XinZhangMS 0:f7f1f0d76dd6 30 #define AMQP_DIAGNOSTIC_CREATION_TIME_UTC_KEY "creationtimeutc"
XinZhangMS 0:f7f1f0d76dd6 31
XinZhangMS 0:f7f1f0d76dd6 32 static int encode_callback(void* context, const unsigned char* bytes, size_t length)
XinZhangMS 0:f7f1f0d76dd6 33 {
XinZhangMS 0:f7f1f0d76dd6 34 BINARY_DATA* message_body_binary = (BINARY_DATA*)context;
XinZhangMS 0:f7f1f0d76dd6 35 (void)memcpy((unsigned char*)message_body_binary->bytes + message_body_binary->length, bytes, length);
XinZhangMS 0:f7f1f0d76dd6 36 message_body_binary->length += length;
XinZhangMS 0:f7f1f0d76dd6 37 return 0;
XinZhangMS 0:f7f1f0d76dd6 38 }
XinZhangMS 0:f7f1f0d76dd6 39
XinZhangMS 0:f7f1f0d76dd6 40 // Codes_SRS_UAMQP_MESSAGING_31_112: [If optional message-id is present in the message, encode it into the AMQP message.]
XinZhangMS 0:f7f1f0d76dd6 41 static int set_message_id_if_needed(IOTHUB_MESSAGE_HANDLE messageHandle, PROPERTIES_HANDLE uamqp_message_properties)
XinZhangMS 0:f7f1f0d76dd6 42 {
XinZhangMS 0:f7f1f0d76dd6 43 int result;
XinZhangMS 0:f7f1f0d76dd6 44 const char* messageId;
XinZhangMS 0:f7f1f0d76dd6 45
XinZhangMS 0:f7f1f0d76dd6 46 if (NULL != (messageId = IoTHubMessage_GetMessageId(messageHandle)))
XinZhangMS 0:f7f1f0d76dd6 47 {
XinZhangMS 0:f7f1f0d76dd6 48 AMQP_VALUE uamqp_message_id;
XinZhangMS 0:f7f1f0d76dd6 49
XinZhangMS 0:f7f1f0d76dd6 50 if ((uamqp_message_id = amqpvalue_create_string(messageId)) == NULL)
XinZhangMS 0:f7f1f0d76dd6 51 {
XinZhangMS 0:f7f1f0d76dd6 52 LogError("Failed amqpvalue_create_string for message_id");
XinZhangMS 0:f7f1f0d76dd6 53 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 54 }
XinZhangMS 0:f7f1f0d76dd6 55 else if (properties_set_message_id(uamqp_message_properties, uamqp_message_id) != 0)
XinZhangMS 0:f7f1f0d76dd6 56 {
XinZhangMS 0:f7f1f0d76dd6 57 LogError("Failed properties_set_message_id");
XinZhangMS 0:f7f1f0d76dd6 58 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 59 }
XinZhangMS 0:f7f1f0d76dd6 60 else
XinZhangMS 0:f7f1f0d76dd6 61 {
XinZhangMS 0:f7f1f0d76dd6 62 result = RESULT_OK;
XinZhangMS 0:f7f1f0d76dd6 63 }
XinZhangMS 0:f7f1f0d76dd6 64
XinZhangMS 0:f7f1f0d76dd6 65 if (NULL != uamqp_message_id)
XinZhangMS 0:f7f1f0d76dd6 66 {
XinZhangMS 0:f7f1f0d76dd6 67 amqpvalue_destroy(uamqp_message_id);
XinZhangMS 0:f7f1f0d76dd6 68 }
XinZhangMS 0:f7f1f0d76dd6 69 }
XinZhangMS 0:f7f1f0d76dd6 70 else
XinZhangMS 0:f7f1f0d76dd6 71 {
XinZhangMS 0:f7f1f0d76dd6 72 result = RESULT_OK;
XinZhangMS 0:f7f1f0d76dd6 73 }
XinZhangMS 0:f7f1f0d76dd6 74
XinZhangMS 0:f7f1f0d76dd6 75 return result;
XinZhangMS 0:f7f1f0d76dd6 76 }
XinZhangMS 0:f7f1f0d76dd6 77
XinZhangMS 0:f7f1f0d76dd6 78 // Codes_SRS_UAMQP_MESSAGING_31_113: [If optional correlation-id is present in the message, encode it into the AMQP message.]
XinZhangMS 0:f7f1f0d76dd6 79 static int set_message_correlation_id_if_needed(IOTHUB_MESSAGE_HANDLE messageHandle, PROPERTIES_HANDLE uamqp_message_properties)
XinZhangMS 0:f7f1f0d76dd6 80 {
XinZhangMS 0:f7f1f0d76dd6 81 int result;
XinZhangMS 0:f7f1f0d76dd6 82 const char* correlationId;
XinZhangMS 0:f7f1f0d76dd6 83
XinZhangMS 0:f7f1f0d76dd6 84 if (NULL != (correlationId = IoTHubMessage_GetCorrelationId(messageHandle)))
XinZhangMS 0:f7f1f0d76dd6 85 {
XinZhangMS 0:f7f1f0d76dd6 86 AMQP_VALUE uamqp_correlation_id;
XinZhangMS 0:f7f1f0d76dd6 87
XinZhangMS 0:f7f1f0d76dd6 88 if ((uamqp_correlation_id = amqpvalue_create_string(correlationId)) == NULL)
XinZhangMS 0:f7f1f0d76dd6 89 {
XinZhangMS 0:f7f1f0d76dd6 90 LogError("Failed amqpvalue_create_string for message_id");
XinZhangMS 0:f7f1f0d76dd6 91 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 92 }
XinZhangMS 0:f7f1f0d76dd6 93 else if (properties_set_correlation_id(uamqp_message_properties, uamqp_correlation_id) != 0)
XinZhangMS 0:f7f1f0d76dd6 94 {
XinZhangMS 0:f7f1f0d76dd6 95 LogError("Failed properties_set_correlation_id");
XinZhangMS 0:f7f1f0d76dd6 96 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 97 }
XinZhangMS 0:f7f1f0d76dd6 98 else
XinZhangMS 0:f7f1f0d76dd6 99 {
XinZhangMS 0:f7f1f0d76dd6 100 result = RESULT_OK;
XinZhangMS 0:f7f1f0d76dd6 101 }
XinZhangMS 0:f7f1f0d76dd6 102
XinZhangMS 0:f7f1f0d76dd6 103 if (uamqp_correlation_id != NULL)
XinZhangMS 0:f7f1f0d76dd6 104 {
XinZhangMS 0:f7f1f0d76dd6 105 amqpvalue_destroy(uamqp_correlation_id);
XinZhangMS 0:f7f1f0d76dd6 106 }
XinZhangMS 0:f7f1f0d76dd6 107 }
XinZhangMS 0:f7f1f0d76dd6 108 else
XinZhangMS 0:f7f1f0d76dd6 109 {
XinZhangMS 0:f7f1f0d76dd6 110 result = RESULT_OK;
XinZhangMS 0:f7f1f0d76dd6 111 }
XinZhangMS 0:f7f1f0d76dd6 112
XinZhangMS 0:f7f1f0d76dd6 113 return result;
XinZhangMS 0:f7f1f0d76dd6 114 }
XinZhangMS 0:f7f1f0d76dd6 115
XinZhangMS 0:f7f1f0d76dd6 116 // Codes_SRS_UAMQP_MESSAGING_31_114: [If optional content-type is present in the message, encode it into the AMQP message.]
XinZhangMS 0:f7f1f0d76dd6 117 static int set_message_content_type_if_needed(IOTHUB_MESSAGE_HANDLE messageHandle, PROPERTIES_HANDLE uamqp_message_properties)
XinZhangMS 0:f7f1f0d76dd6 118 {
XinZhangMS 0:f7f1f0d76dd6 119 int result;
XinZhangMS 0:f7f1f0d76dd6 120 const char* content_type;
XinZhangMS 0:f7f1f0d76dd6 121
XinZhangMS 0:f7f1f0d76dd6 122 if ((content_type = IoTHubMessage_GetContentTypeSystemProperty(messageHandle)) != NULL)
XinZhangMS 0:f7f1f0d76dd6 123 {
XinZhangMS 0:f7f1f0d76dd6 124 if (properties_set_content_type(uamqp_message_properties, content_type) != 0)
XinZhangMS 0:f7f1f0d76dd6 125 {
XinZhangMS 0:f7f1f0d76dd6 126 LogError("Failed properties_set_content_type");
XinZhangMS 0:f7f1f0d76dd6 127 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 128 }
XinZhangMS 0:f7f1f0d76dd6 129 else
XinZhangMS 0:f7f1f0d76dd6 130 {
XinZhangMS 0:f7f1f0d76dd6 131 result = RESULT_OK;
XinZhangMS 0:f7f1f0d76dd6 132 }
XinZhangMS 0:f7f1f0d76dd6 133 }
XinZhangMS 0:f7f1f0d76dd6 134 else
XinZhangMS 0:f7f1f0d76dd6 135 {
XinZhangMS 0:f7f1f0d76dd6 136 result = RESULT_OK;
XinZhangMS 0:f7f1f0d76dd6 137 }
XinZhangMS 0:f7f1f0d76dd6 138
XinZhangMS 0:f7f1f0d76dd6 139 return result;
XinZhangMS 0:f7f1f0d76dd6 140 }
XinZhangMS 0:f7f1f0d76dd6 141
XinZhangMS 0:f7f1f0d76dd6 142 // Codes_SRS_UAMQP_MESSAGING_31_115: [If optional content-encoding is present in the message, encode it into the AMQP message.]
XinZhangMS 0:f7f1f0d76dd6 143 static int set_message_content_encoding_if_needed(IOTHUB_MESSAGE_HANDLE messageHandle, PROPERTIES_HANDLE uamqp_message_properties)
XinZhangMS 0:f7f1f0d76dd6 144 {
XinZhangMS 0:f7f1f0d76dd6 145 int result;
XinZhangMS 0:f7f1f0d76dd6 146 const char* content_encoding;
XinZhangMS 0:f7f1f0d76dd6 147
XinZhangMS 0:f7f1f0d76dd6 148 if ((content_encoding = IoTHubMessage_GetContentEncodingSystemProperty(messageHandle)) != NULL)
XinZhangMS 0:f7f1f0d76dd6 149 {
XinZhangMS 0:f7f1f0d76dd6 150 if (properties_set_content_encoding(uamqp_message_properties, content_encoding) != 0)
XinZhangMS 0:f7f1f0d76dd6 151 {
XinZhangMS 0:f7f1f0d76dd6 152 LogError("Failed properties_set_content_encoding");
XinZhangMS 0:f7f1f0d76dd6 153 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 154 }
XinZhangMS 0:f7f1f0d76dd6 155 else
XinZhangMS 0:f7f1f0d76dd6 156 {
XinZhangMS 0:f7f1f0d76dd6 157 result = RESULT_OK;
XinZhangMS 0:f7f1f0d76dd6 158 }
XinZhangMS 0:f7f1f0d76dd6 159 }
XinZhangMS 0:f7f1f0d76dd6 160 else
XinZhangMS 0:f7f1f0d76dd6 161 {
XinZhangMS 0:f7f1f0d76dd6 162 result = RESULT_OK;
XinZhangMS 0:f7f1f0d76dd6 163 }
XinZhangMS 0:f7f1f0d76dd6 164
XinZhangMS 0:f7f1f0d76dd6 165 return result;
XinZhangMS 0:f7f1f0d76dd6 166 }
XinZhangMS 0:f7f1f0d76dd6 167
XinZhangMS 0:f7f1f0d76dd6 168
XinZhangMS 0:f7f1f0d76dd6 169 // Codes_SRS_UAMQP_MESSAGING_31_116: [Gets message properties associated with the IOTHUB_MESSAGE_HANDLE to encode, returning the properties and their encoded length.]
XinZhangMS 0:f7f1f0d76dd6 170 static int create_message_properties_to_encode(IOTHUB_MESSAGE_HANDLE messageHandle, AMQP_VALUE *message_properties, size_t *message_properties_length)
XinZhangMS 0:f7f1f0d76dd6 171 {
XinZhangMS 0:f7f1f0d76dd6 172 PROPERTIES_HANDLE uamqp_message_properties = NULL;
XinZhangMS 0:f7f1f0d76dd6 173 int result;
XinZhangMS 0:f7f1f0d76dd6 174
XinZhangMS 0:f7f1f0d76dd6 175 if ((uamqp_message_properties = properties_create()) == NULL)
XinZhangMS 0:f7f1f0d76dd6 176 {
XinZhangMS 0:f7f1f0d76dd6 177 LogError("Failed on properties_create()");
XinZhangMS 0:f7f1f0d76dd6 178 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 179 }
XinZhangMS 0:f7f1f0d76dd6 180 else if (set_message_id_if_needed(messageHandle, uamqp_message_properties) != RESULT_OK)
XinZhangMS 0:f7f1f0d76dd6 181 {
XinZhangMS 0:f7f1f0d76dd6 182 LogError("Failed on set_message_id_if_needed()");
XinZhangMS 0:f7f1f0d76dd6 183 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 184 }
XinZhangMS 0:f7f1f0d76dd6 185 else if (set_message_correlation_id_if_needed(messageHandle, uamqp_message_properties) != RESULT_OK)
XinZhangMS 0:f7f1f0d76dd6 186 {
XinZhangMS 0:f7f1f0d76dd6 187 LogError("Failed on set_message_correlation_id_if_needed()");
XinZhangMS 0:f7f1f0d76dd6 188 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 189 }
XinZhangMS 0:f7f1f0d76dd6 190 else if (set_message_content_type_if_needed(messageHandle, uamqp_message_properties) != RESULT_OK)
XinZhangMS 0:f7f1f0d76dd6 191 {
XinZhangMS 0:f7f1f0d76dd6 192 LogError("Failed on set_message_content_type_if_needed()");
XinZhangMS 0:f7f1f0d76dd6 193 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 194 }
XinZhangMS 0:f7f1f0d76dd6 195 else if (set_message_content_encoding_if_needed(messageHandle, uamqp_message_properties) != RESULT_OK)
XinZhangMS 0:f7f1f0d76dd6 196 {
XinZhangMS 0:f7f1f0d76dd6 197 LogError("Failed on set_message_content_encoding_if_needed()");
XinZhangMS 0:f7f1f0d76dd6 198 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 199 }
XinZhangMS 0:f7f1f0d76dd6 200 else if ((*message_properties = amqpvalue_create_properties(uamqp_message_properties)) == NULL)
XinZhangMS 0:f7f1f0d76dd6 201 {
XinZhangMS 0:f7f1f0d76dd6 202 LogError("Failed on amqpvalue_create_properties()");
XinZhangMS 0:f7f1f0d76dd6 203 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 204 }
XinZhangMS 0:f7f1f0d76dd6 205 else if ((amqpvalue_get_encoded_size(*message_properties, message_properties_length)) != 0)
XinZhangMS 0:f7f1f0d76dd6 206 {
XinZhangMS 0:f7f1f0d76dd6 207 LogError("Failed on amqpvalue_get_encoded_size()");
XinZhangMS 0:f7f1f0d76dd6 208 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 209 }
XinZhangMS 0:f7f1f0d76dd6 210 else
XinZhangMS 0:f7f1f0d76dd6 211 {
XinZhangMS 0:f7f1f0d76dd6 212 result = RESULT_OK;
XinZhangMS 0:f7f1f0d76dd6 213 }
XinZhangMS 0:f7f1f0d76dd6 214
XinZhangMS 0:f7f1f0d76dd6 215 if (NULL != uamqp_message_properties)
XinZhangMS 0:f7f1f0d76dd6 216 {
XinZhangMS 0:f7f1f0d76dd6 217 properties_destroy(uamqp_message_properties);
XinZhangMS 0:f7f1f0d76dd6 218 }
XinZhangMS 0:f7f1f0d76dd6 219
XinZhangMS 0:f7f1f0d76dd6 220 return result;
XinZhangMS 0:f7f1f0d76dd6 221 }
XinZhangMS 0:f7f1f0d76dd6 222
XinZhangMS 0:f7f1f0d76dd6 223 // Adds fault injection properties to an AMQP message.
XinZhangMS 0:f7f1f0d76dd6 224 static int add_fault_injection_properties(MESSAGE_HANDLE message_batch_container, const char* const* property_keys, const char* const* property_values, size_t property_count)
XinZhangMS 0:f7f1f0d76dd6 225 {
XinZhangMS 0:f7f1f0d76dd6 226 int result;
XinZhangMS 0:f7f1f0d76dd6 227 AMQP_VALUE uamqp_map;
XinZhangMS 0:f7f1f0d76dd6 228
XinZhangMS 0:f7f1f0d76dd6 229 if ((uamqp_map = amqpvalue_create_map()) == NULL)
XinZhangMS 0:f7f1f0d76dd6 230 {
XinZhangMS 0:f7f1f0d76dd6 231 LogError("Failed to create uAMQP map for the properties.");
XinZhangMS 0:f7f1f0d76dd6 232 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 233 }
XinZhangMS 0:f7f1f0d76dd6 234 else
XinZhangMS 0:f7f1f0d76dd6 235 {
XinZhangMS 0:f7f1f0d76dd6 236 result = RESULT_OK;
XinZhangMS 0:f7f1f0d76dd6 237
XinZhangMS 0:f7f1f0d76dd6 238 for (size_t i = 0; result == RESULT_OK && i < property_count; i++)
XinZhangMS 0:f7f1f0d76dd6 239 {
XinZhangMS 0:f7f1f0d76dd6 240 AMQP_VALUE map_key_value = NULL;
XinZhangMS 0:f7f1f0d76dd6 241 AMQP_VALUE map_value_value = NULL;
XinZhangMS 0:f7f1f0d76dd6 242
XinZhangMS 0:f7f1f0d76dd6 243 if ((map_key_value = amqpvalue_create_string(property_keys[i])) == NULL)
XinZhangMS 0:f7f1f0d76dd6 244 {
XinZhangMS 0:f7f1f0d76dd6 245 LogError("Failed to create uAMQP property key name.");
XinZhangMS 0:f7f1f0d76dd6 246 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 247 }
XinZhangMS 0:f7f1f0d76dd6 248 else if ((map_value_value = amqpvalue_create_string(property_values[i])) == NULL)
XinZhangMS 0:f7f1f0d76dd6 249 {
XinZhangMS 0:f7f1f0d76dd6 250 LogError("Failed to create uAMQP property key value.");
XinZhangMS 0:f7f1f0d76dd6 251 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 252 }
XinZhangMS 0:f7f1f0d76dd6 253 else if (amqpvalue_set_map_value(uamqp_map, map_key_value, map_value_value) != 0)
XinZhangMS 0:f7f1f0d76dd6 254 {
XinZhangMS 0:f7f1f0d76dd6 255 LogError("Failed to set key/value into the the uAMQP property map.");
XinZhangMS 0:f7f1f0d76dd6 256 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 257 }
XinZhangMS 0:f7f1f0d76dd6 258
XinZhangMS 0:f7f1f0d76dd6 259 if (map_key_value != NULL)
XinZhangMS 0:f7f1f0d76dd6 260 amqpvalue_destroy(map_key_value);
XinZhangMS 0:f7f1f0d76dd6 261
XinZhangMS 0:f7f1f0d76dd6 262 if (map_value_value != NULL)
XinZhangMS 0:f7f1f0d76dd6 263 amqpvalue_destroy(map_value_value);
XinZhangMS 0:f7f1f0d76dd6 264 }
XinZhangMS 0:f7f1f0d76dd6 265
XinZhangMS 0:f7f1f0d76dd6 266 if (result == RESULT_OK)
XinZhangMS 0:f7f1f0d76dd6 267 {
XinZhangMS 0:f7f1f0d76dd6 268 if (message_set_application_properties(message_batch_container, uamqp_map) != 0)
XinZhangMS 0:f7f1f0d76dd6 269 {
XinZhangMS 0:f7f1f0d76dd6 270 LogError("Failed to transfer the message properties to the uAMQP message.");
XinZhangMS 0:f7f1f0d76dd6 271 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 272 }
XinZhangMS 0:f7f1f0d76dd6 273 else
XinZhangMS 0:f7f1f0d76dd6 274 {
XinZhangMS 0:f7f1f0d76dd6 275 result = RESULT_OK;
XinZhangMS 0:f7f1f0d76dd6 276 }
XinZhangMS 0:f7f1f0d76dd6 277 }
XinZhangMS 0:f7f1f0d76dd6 278 amqpvalue_destroy(uamqp_map);
XinZhangMS 0:f7f1f0d76dd6 279 }
XinZhangMS 0:f7f1f0d76dd6 280
XinZhangMS 0:f7f1f0d76dd6 281 return result;
XinZhangMS 0:f7f1f0d76dd6 282 }
XinZhangMS 0:f7f1f0d76dd6 283
XinZhangMS 0:f7f1f0d76dd6 284 // To test AMQP fault injection, we currently must have the error properties be specified on the batch_container
XinZhangMS 0:f7f1f0d76dd6 285 // (not one of the messages sent in this container). As the SDK layer does not support options for configuring
XinZhangMS 0:f7f1f0d76dd6 286 // this envelope (this is AMQP/batching specific), we will instead intercept fault messages and apply to the container.
XinZhangMS 0:f7f1f0d76dd6 287 static int override_fault_injection_properties_if_needed(MESSAGE_HANDLE message_batch_container, const char* const* property_keys, const char* const* property_values, size_t property_count, bool *override_for_fault_injection)
XinZhangMS 0:f7f1f0d76dd6 288 {
XinZhangMS 0:f7f1f0d76dd6 289 int result;
XinZhangMS 0:f7f1f0d76dd6 290
XinZhangMS 0:f7f1f0d76dd6 291 if ((property_count == 0) || (strcmp(property_keys[0], "AzIoTHub_FaultOperationType") != 0))
XinZhangMS 0:f7f1f0d76dd6 292 {
XinZhangMS 0:f7f1f0d76dd6 293 *override_for_fault_injection = false;
XinZhangMS 0:f7f1f0d76dd6 294 result = RESULT_OK;
XinZhangMS 0:f7f1f0d76dd6 295 }
XinZhangMS 0:f7f1f0d76dd6 296 else
XinZhangMS 0:f7f1f0d76dd6 297 {
XinZhangMS 0:f7f1f0d76dd6 298 *override_for_fault_injection = true;
XinZhangMS 0:f7f1f0d76dd6 299 result = add_fault_injection_properties(message_batch_container, property_keys, property_values, property_count);
XinZhangMS 0:f7f1f0d76dd6 300 }
XinZhangMS 0:f7f1f0d76dd6 301
XinZhangMS 0:f7f1f0d76dd6 302 return result;
XinZhangMS 0:f7f1f0d76dd6 303 }
XinZhangMS 0:f7f1f0d76dd6 304
XinZhangMS 0:f7f1f0d76dd6 305 // Codes_SRS_UAMQP_MESSAGING_31_117: [Get application message properties associated with the IOTHUB_MESSAGE_HANDLE to encode, returning the properties and their encoded length.]
XinZhangMS 0:f7f1f0d76dd6 306 static int create_application_properties_to_encode(MESSAGE_HANDLE message_batch_container, IOTHUB_MESSAGE_HANDLE messageHandle, AMQP_VALUE *application_properties, size_t *application_properties_length)
XinZhangMS 0:f7f1f0d76dd6 307 {
XinZhangMS 0:f7f1f0d76dd6 308 MAP_HANDLE properties_map;
XinZhangMS 0:f7f1f0d76dd6 309 const char* const* property_keys;
XinZhangMS 0:f7f1f0d76dd6 310 const char* const* property_values;
XinZhangMS 0:f7f1f0d76dd6 311 size_t property_count = 0;
XinZhangMS 0:f7f1f0d76dd6 312 AMQP_VALUE uamqp_properties_map = NULL;
XinZhangMS 0:f7f1f0d76dd6 313 int result;
XinZhangMS 0:f7f1f0d76dd6 314
XinZhangMS 0:f7f1f0d76dd6 315 if ((properties_map = IoTHubMessage_Properties(messageHandle)) == NULL)
XinZhangMS 0:f7f1f0d76dd6 316 {
XinZhangMS 0:f7f1f0d76dd6 317 LogError("Failed to get property map from IoTHub message.");
XinZhangMS 0:f7f1f0d76dd6 318 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 319 }
XinZhangMS 0:f7f1f0d76dd6 320 else if (Map_GetInternals(properties_map, &property_keys, &property_values, &property_count) != 0)
XinZhangMS 0:f7f1f0d76dd6 321 {
XinZhangMS 0:f7f1f0d76dd6 322 LogError("Failed reading the incoming uAMQP message properties");
XinZhangMS 0:f7f1f0d76dd6 323 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 324 }
XinZhangMS 0:f7f1f0d76dd6 325 else if (property_count > 0)
XinZhangMS 0:f7f1f0d76dd6 326 {
XinZhangMS 0:f7f1f0d76dd6 327 size_t i;
XinZhangMS 0:f7f1f0d76dd6 328 if ((uamqp_properties_map = amqpvalue_create_map()) == NULL)
XinZhangMS 0:f7f1f0d76dd6 329 {
XinZhangMS 0:f7f1f0d76dd6 330 LogError("amqpvalue_create_map failed");
XinZhangMS 0:f7f1f0d76dd6 331 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 332 }
XinZhangMS 0:f7f1f0d76dd6 333 else
XinZhangMS 0:f7f1f0d76dd6 334 {
XinZhangMS 0:f7f1f0d76dd6 335 bool override_for_fault_injection = false;
XinZhangMS 0:f7f1f0d76dd6 336 result = override_fault_injection_properties_if_needed(message_batch_container, property_keys, property_values, property_count, &override_for_fault_injection);
XinZhangMS 0:f7f1f0d76dd6 337
XinZhangMS 0:f7f1f0d76dd6 338 if (override_for_fault_injection == false)
XinZhangMS 0:f7f1f0d76dd6 339 {
XinZhangMS 0:f7f1f0d76dd6 340 for (i = 0; i < property_count; i++)
XinZhangMS 0:f7f1f0d76dd6 341 {
XinZhangMS 0:f7f1f0d76dd6 342 AMQP_VALUE map_property_key;
XinZhangMS 0:f7f1f0d76dd6 343 AMQP_VALUE map_property_value;
XinZhangMS 0:f7f1f0d76dd6 344
XinZhangMS 0:f7f1f0d76dd6 345 if ((map_property_key = amqpvalue_create_string(property_keys[i])) == NULL)
XinZhangMS 0:f7f1f0d76dd6 346 {
XinZhangMS 0:f7f1f0d76dd6 347 LogError("Failed amqpvalue_create_string for key");
XinZhangMS 0:f7f1f0d76dd6 348 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 349 break;
XinZhangMS 0:f7f1f0d76dd6 350 }
XinZhangMS 0:f7f1f0d76dd6 351
XinZhangMS 0:f7f1f0d76dd6 352 if ((map_property_value = amqpvalue_create_string(property_values[i])) == NULL)
XinZhangMS 0:f7f1f0d76dd6 353 {
XinZhangMS 0:f7f1f0d76dd6 354 LogError("Failed amqpvalue_create_string for value");
XinZhangMS 0:f7f1f0d76dd6 355 amqpvalue_destroy(map_property_key);
XinZhangMS 0:f7f1f0d76dd6 356 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 357 break;
XinZhangMS 0:f7f1f0d76dd6 358 }
XinZhangMS 0:f7f1f0d76dd6 359
XinZhangMS 0:f7f1f0d76dd6 360 if (amqpvalue_set_map_value(uamqp_properties_map, map_property_key, map_property_value) != 0)
XinZhangMS 0:f7f1f0d76dd6 361 {
XinZhangMS 0:f7f1f0d76dd6 362 LogError("Failed amqpvalue_set_map_value");
XinZhangMS 0:f7f1f0d76dd6 363 amqpvalue_destroy(map_property_key);
XinZhangMS 0:f7f1f0d76dd6 364 amqpvalue_destroy(map_property_value);
XinZhangMS 0:f7f1f0d76dd6 365 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 366 break;
XinZhangMS 0:f7f1f0d76dd6 367 }
XinZhangMS 0:f7f1f0d76dd6 368
XinZhangMS 0:f7f1f0d76dd6 369 amqpvalue_destroy(map_property_key);
XinZhangMS 0:f7f1f0d76dd6 370 amqpvalue_destroy(map_property_value);
XinZhangMS 0:f7f1f0d76dd6 371 }
XinZhangMS 0:f7f1f0d76dd6 372
XinZhangMS 0:f7f1f0d76dd6 373 if (RESULT_OK == result)
XinZhangMS 0:f7f1f0d76dd6 374 {
XinZhangMS 0:f7f1f0d76dd6 375 if ((*application_properties = amqpvalue_create_application_properties(uamqp_properties_map)) == NULL)
XinZhangMS 0:f7f1f0d76dd6 376 {
XinZhangMS 0:f7f1f0d76dd6 377 LogError("Failed amqpvalue_create_application_properties");
XinZhangMS 0:f7f1f0d76dd6 378 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 379 }
XinZhangMS 0:f7f1f0d76dd6 380 else if (amqpvalue_get_encoded_size(*application_properties, application_properties_length) != 0)
XinZhangMS 0:f7f1f0d76dd6 381 {
XinZhangMS 0:f7f1f0d76dd6 382 LogError("Failed amqpvalue_get_encoded_size");
XinZhangMS 0:f7f1f0d76dd6 383 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 384 }
XinZhangMS 0:f7f1f0d76dd6 385 }
XinZhangMS 0:f7f1f0d76dd6 386 }
XinZhangMS 0:f7f1f0d76dd6 387 }
XinZhangMS 0:f7f1f0d76dd6 388 }
XinZhangMS 0:f7f1f0d76dd6 389 else
XinZhangMS 0:f7f1f0d76dd6 390 {
XinZhangMS 0:f7f1f0d76dd6 391 result = RESULT_OK;
XinZhangMS 0:f7f1f0d76dd6 392 }
XinZhangMS 0:f7f1f0d76dd6 393
XinZhangMS 0:f7f1f0d76dd6 394 if (NULL != uamqp_properties_map)
XinZhangMS 0:f7f1f0d76dd6 395 {
XinZhangMS 0:f7f1f0d76dd6 396 amqpvalue_destroy(uamqp_properties_map);
XinZhangMS 0:f7f1f0d76dd6 397 }
XinZhangMS 0:f7f1f0d76dd6 398
XinZhangMS 0:f7f1f0d76dd6 399 return result;
XinZhangMS 0:f7f1f0d76dd6 400 }
XinZhangMS 0:f7f1f0d76dd6 401
XinZhangMS 0:f7f1f0d76dd6 402 static int add_map_item(AMQP_VALUE map, const char* name, const char* value)
XinZhangMS 0:f7f1f0d76dd6 403 {
XinZhangMS 0:f7f1f0d76dd6 404 int result;
XinZhangMS 0:f7f1f0d76dd6 405 AMQP_VALUE amqp_value_name;
XinZhangMS 0:f7f1f0d76dd6 406
XinZhangMS 0:f7f1f0d76dd6 407 if ((amqp_value_name = amqpvalue_create_symbol(name)) == NULL)
XinZhangMS 0:f7f1f0d76dd6 408 {
XinZhangMS 0:f7f1f0d76dd6 409 LogError("Failed creating AMQP_VALUE for name");
XinZhangMS 0:f7f1f0d76dd6 410 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 411 }
XinZhangMS 0:f7f1f0d76dd6 412 else
XinZhangMS 0:f7f1f0d76dd6 413 {
XinZhangMS 0:f7f1f0d76dd6 414 AMQP_VALUE amqp_value_value = NULL;
XinZhangMS 0:f7f1f0d76dd6 415
XinZhangMS 0:f7f1f0d76dd6 416 if (value == NULL && (amqp_value_value = amqpvalue_create_null()) == NULL)
XinZhangMS 0:f7f1f0d76dd6 417 {
XinZhangMS 0:f7f1f0d76dd6 418 LogError("Failed creating AMQP_VALUE for NULL value");
XinZhangMS 0:f7f1f0d76dd6 419 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 420 }
XinZhangMS 0:f7f1f0d76dd6 421 else if (value != NULL && (amqp_value_value = amqpvalue_create_string(value)) == NULL)
XinZhangMS 0:f7f1f0d76dd6 422 {
XinZhangMS 0:f7f1f0d76dd6 423 LogError("Failed creating AMQP_VALUE for value");
XinZhangMS 0:f7f1f0d76dd6 424 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 425 }
XinZhangMS 0:f7f1f0d76dd6 426 else
XinZhangMS 0:f7f1f0d76dd6 427 {
XinZhangMS 0:f7f1f0d76dd6 428 if (amqpvalue_set_map_value(map, amqp_value_name, amqp_value_value) != 0)
XinZhangMS 0:f7f1f0d76dd6 429 {
XinZhangMS 0:f7f1f0d76dd6 430 LogError("Failed adding key/value pair to map");
XinZhangMS 0:f7f1f0d76dd6 431 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 432 }
XinZhangMS 0:f7f1f0d76dd6 433 else
XinZhangMS 0:f7f1f0d76dd6 434 {
XinZhangMS 0:f7f1f0d76dd6 435 result = RESULT_OK;
XinZhangMS 0:f7f1f0d76dd6 436 }
XinZhangMS 0:f7f1f0d76dd6 437
XinZhangMS 0:f7f1f0d76dd6 438 amqpvalue_destroy(amqp_value_value);
XinZhangMS 0:f7f1f0d76dd6 439 }
XinZhangMS 0:f7f1f0d76dd6 440
XinZhangMS 0:f7f1f0d76dd6 441 amqpvalue_destroy(amqp_value_name);
XinZhangMS 0:f7f1f0d76dd6 442 }
XinZhangMS 0:f7f1f0d76dd6 443
XinZhangMS 0:f7f1f0d76dd6 444 return result;
XinZhangMS 0:f7f1f0d76dd6 445 }
XinZhangMS 0:f7f1f0d76dd6 446
XinZhangMS 0:f7f1f0d76dd6 447 static int create_message_annotations_to_encode(IOTHUB_MESSAGE_HANDLE messageHandle, AMQP_VALUE *message_annotations, size_t *message_annotations_length)
XinZhangMS 0:f7f1f0d76dd6 448 {
XinZhangMS 0:f7f1f0d76dd6 449 AMQP_VALUE message_annotations_map = NULL;
XinZhangMS 0:f7f1f0d76dd6 450 int result;
XinZhangMS 0:f7f1f0d76dd6 451 const IOTHUB_MESSAGE_DIAGNOSTIC_PROPERTY_DATA* diagnosticData;
XinZhangMS 0:f7f1f0d76dd6 452
XinZhangMS 0:f7f1f0d76dd6 453 if ((diagnosticData = IoTHubMessage_GetDiagnosticPropertyData(messageHandle)) != NULL &&
XinZhangMS 0:f7f1f0d76dd6 454 diagnosticData->diagnosticId != NULL && diagnosticData->diagnosticCreationTimeUtc != NULL)
XinZhangMS 0:f7f1f0d76dd6 455 {
XinZhangMS 0:f7f1f0d76dd6 456 // Codes_SRS_UAMQP_MESSAGING_32_001: [If optional diagnostic properties are present in the iot hub message, encode them into the AMQP message as annotation properties. Errors stop processing on this message.]
XinZhangMS 0:f7f1f0d76dd6 457 if ((message_annotations_map = amqpvalue_create_map()) == NULL)
XinZhangMS 0:f7f1f0d76dd6 458 {
XinZhangMS 0:f7f1f0d76dd6 459 LogError("Failed amqpvalue_create_map for annotations");
XinZhangMS 0:f7f1f0d76dd6 460 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 461 }
XinZhangMS 0:f7f1f0d76dd6 462 else
XinZhangMS 0:f7f1f0d76dd6 463 {
XinZhangMS 0:f7f1f0d76dd6 464 char* diagContextBuffer = NULL;
XinZhangMS 0:f7f1f0d76dd6 465
XinZhangMS 0:f7f1f0d76dd6 466 if (add_map_item(message_annotations_map, AMQP_DIAGNOSTIC_ID_KEY, diagnosticData->diagnosticId) != RESULT_OK)
XinZhangMS 0:f7f1f0d76dd6 467 {
XinZhangMS 0:f7f1f0d76dd6 468 LogError("Failed adding diagnostic id");
XinZhangMS 0:f7f1f0d76dd6 469 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 470 }
XinZhangMS 0:f7f1f0d76dd6 471 else if ((diagContextBuffer = (char*)malloc(strlen(AMQP_DIAGNOSTIC_CREATION_TIME_UTC_KEY) + 1
XinZhangMS 0:f7f1f0d76dd6 472 + strlen(diagnosticData->diagnosticCreationTimeUtc) + 1)) == NULL)
XinZhangMS 0:f7f1f0d76dd6 473 {
XinZhangMS 0:f7f1f0d76dd6 474 LogError("Failed malloc for diagnostic context");
XinZhangMS 0:f7f1f0d76dd6 475 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 476 }
XinZhangMS 0:f7f1f0d76dd6 477 else if (sprintf(diagContextBuffer, "%s=%s", AMQP_DIAGNOSTIC_CREATION_TIME_UTC_KEY, diagnosticData->diagnosticCreationTimeUtc) < 0)
XinZhangMS 0:f7f1f0d76dd6 478 {
XinZhangMS 0:f7f1f0d76dd6 479 LogError("Failed sprintf diagnostic context");
XinZhangMS 0:f7f1f0d76dd6 480 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 481 }
XinZhangMS 0:f7f1f0d76dd6 482 else if (add_map_item(message_annotations_map, AMQP_DIAGNOSTIC_CONTEXT_KEY, diagContextBuffer) != RESULT_OK)
XinZhangMS 0:f7f1f0d76dd6 483 {
XinZhangMS 0:f7f1f0d76dd6 484 LogError("Failed adding diagnostic context");
XinZhangMS 0:f7f1f0d76dd6 485 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 486 }
XinZhangMS 0:f7f1f0d76dd6 487 else if((*message_annotations = amqpvalue_create_message_annotations(message_annotations_map)) == NULL)
XinZhangMS 0:f7f1f0d76dd6 488 {
XinZhangMS 0:f7f1f0d76dd6 489 LogError("Failed creating message annotations");
XinZhangMS 0:f7f1f0d76dd6 490 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 491 }
XinZhangMS 0:f7f1f0d76dd6 492 else if (amqpvalue_get_encoded_size(*message_annotations, message_annotations_length) != 0)
XinZhangMS 0:f7f1f0d76dd6 493 {
XinZhangMS 0:f7f1f0d76dd6 494 LogError("Failed getting size of annotations");
XinZhangMS 0:f7f1f0d76dd6 495 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 496 }
XinZhangMS 0:f7f1f0d76dd6 497 else
XinZhangMS 0:f7f1f0d76dd6 498 {
XinZhangMS 0:f7f1f0d76dd6 499 result = RESULT_OK;
XinZhangMS 0:f7f1f0d76dd6 500 }
XinZhangMS 0:f7f1f0d76dd6 501
XinZhangMS 0:f7f1f0d76dd6 502 free(diagContextBuffer);
XinZhangMS 0:f7f1f0d76dd6 503 amqpvalue_destroy(message_annotations_map);
XinZhangMS 0:f7f1f0d76dd6 504 }
XinZhangMS 0:f7f1f0d76dd6 505 }
XinZhangMS 0:f7f1f0d76dd6 506 else
XinZhangMS 0:f7f1f0d76dd6 507 {
XinZhangMS 0:f7f1f0d76dd6 508 // Codes_SRS_UAMQP_MESSAGING_32_002: [If optional diagnostic properties are not present in the iot hub message, no error should happen.]
XinZhangMS 0:f7f1f0d76dd6 509 result = RESULT_OK;
XinZhangMS 0:f7f1f0d76dd6 510 }
XinZhangMS 0:f7f1f0d76dd6 511
XinZhangMS 0:f7f1f0d76dd6 512 return result;
XinZhangMS 0:f7f1f0d76dd6 513 }
XinZhangMS 0:f7f1f0d76dd6 514
XinZhangMS 0:f7f1f0d76dd6 515 // Codes_SRS_UAMQP_MESSAGING_31_118: [Gets data associated with IOTHUB_MESSAGE_HANDLE to encode, either from underlying byte array or string format.]
XinZhangMS 0:f7f1f0d76dd6 516 static int create_data_to_encode(IOTHUB_MESSAGE_HANDLE messageHandle, AMQP_VALUE *data_value, size_t *data_length)
XinZhangMS 0:f7f1f0d76dd6 517 {
XinZhangMS 0:f7f1f0d76dd6 518 int result;
XinZhangMS 0:f7f1f0d76dd6 519
XinZhangMS 0:f7f1f0d76dd6 520 IOTHUBMESSAGE_CONTENT_TYPE contentType = IoTHubMessage_GetContentType(messageHandle);
XinZhangMS 0:f7f1f0d76dd6 521 const char* messageContent = NULL;
XinZhangMS 0:f7f1f0d76dd6 522 size_t messageContentSize = 0;
XinZhangMS 0:f7f1f0d76dd6 523
XinZhangMS 0:f7f1f0d76dd6 524 if ((contentType == IOTHUBMESSAGE_BYTEARRAY) &&
XinZhangMS 0:f7f1f0d76dd6 525 IoTHubMessage_GetByteArray(messageHandle, (const unsigned char **)&messageContent, &messageContentSize) != IOTHUB_MESSAGE_OK)
XinZhangMS 0:f7f1f0d76dd6 526 {
XinZhangMS 0:f7f1f0d76dd6 527 LogError("Failed getting the BYTE array representation of the IOTHUB_MESSAGE_HANDLE instance.");
XinZhangMS 0:f7f1f0d76dd6 528 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 529 }
XinZhangMS 0:f7f1f0d76dd6 530 else if ((contentType == IOTHUBMESSAGE_STRING) &&
XinZhangMS 0:f7f1f0d76dd6 531 ((messageContent = IoTHubMessage_GetString(messageHandle)) == NULL))
XinZhangMS 0:f7f1f0d76dd6 532 {
XinZhangMS 0:f7f1f0d76dd6 533 LogError("Failed getting the STRING representation of the IOTHUB_MESSAGE_HANDLE instance.");
XinZhangMS 0:f7f1f0d76dd6 534 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 535 }
XinZhangMS 0:f7f1f0d76dd6 536 else if (contentType == IOTHUBMESSAGE_UNKNOWN)
XinZhangMS 0:f7f1f0d76dd6 537 {
XinZhangMS 0:f7f1f0d76dd6 538 LogError("Cannot parse IOTHUB_MESSAGE_HANDLE with content type IOTHUBMESSAGE_UNKNOWN.");
XinZhangMS 0:f7f1f0d76dd6 539 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 540 }
XinZhangMS 0:f7f1f0d76dd6 541 else
XinZhangMS 0:f7f1f0d76dd6 542 {
XinZhangMS 0:f7f1f0d76dd6 543 if (contentType == IOTHUBMESSAGE_STRING)
XinZhangMS 0:f7f1f0d76dd6 544 {
XinZhangMS 0:f7f1f0d76dd6 545 messageContentSize = strlen(messageContent);
XinZhangMS 0:f7f1f0d76dd6 546 }
XinZhangMS 0:f7f1f0d76dd6 547
XinZhangMS 0:f7f1f0d76dd6 548 data bin_data;
XinZhangMS 0:f7f1f0d76dd6 549 bin_data.bytes = (const unsigned char *)messageContent;
XinZhangMS 0:f7f1f0d76dd6 550 bin_data.length = (uint32_t)messageContentSize;
XinZhangMS 0:f7f1f0d76dd6 551
XinZhangMS 0:f7f1f0d76dd6 552 if ((*data_value = amqpvalue_create_data(bin_data)) == NULL)
XinZhangMS 0:f7f1f0d76dd6 553 {
XinZhangMS 0:f7f1f0d76dd6 554 LogError("amqpvalue_create_data failed");
XinZhangMS 0:f7f1f0d76dd6 555 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 556 }
XinZhangMS 0:f7f1f0d76dd6 557 else if (amqpvalue_get_encoded_size(*data_value, data_length) != 0)
XinZhangMS 0:f7f1f0d76dd6 558 {
XinZhangMS 0:f7f1f0d76dd6 559 LogError("amqpvalue_get_encoded_size failed");
XinZhangMS 0:f7f1f0d76dd6 560 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 561 }
XinZhangMS 0:f7f1f0d76dd6 562 else
XinZhangMS 0:f7f1f0d76dd6 563 {
XinZhangMS 0:f7f1f0d76dd6 564 result = RESULT_OK;
XinZhangMS 0:f7f1f0d76dd6 565 }
XinZhangMS 0:f7f1f0d76dd6 566 }
XinZhangMS 0:f7f1f0d76dd6 567
XinZhangMS 0:f7f1f0d76dd6 568 return result;
XinZhangMS 0:f7f1f0d76dd6 569 }
XinZhangMS 0:f7f1f0d76dd6 570
XinZhangMS 0:f7f1f0d76dd6 571 // Codes_SRS_UAMQP_MESSAGING_31_120: [Create a blob that contains AMQP encoding of IOTHUB_MESSAGE_HANDLE.]
XinZhangMS 0:f7f1f0d76dd6 572 // Codes_SRS_UAMQP_MESSAGING_31_121: [Any errors during `message_create_uamqp_encoding_from_iothub_message` stop processing on this message.]
XinZhangMS 0:f7f1f0d76dd6 573 int message_create_uamqp_encoding_from_iothub_message(MESSAGE_HANDLE message_batch_container, IOTHUB_MESSAGE_HANDLE message_handle, BINARY_DATA* body_binary_data)
XinZhangMS 0:f7f1f0d76dd6 574 {
XinZhangMS 0:f7f1f0d76dd6 575 int result;
XinZhangMS 0:f7f1f0d76dd6 576
XinZhangMS 0:f7f1f0d76dd6 577 AMQP_VALUE message_properties = NULL;
XinZhangMS 0:f7f1f0d76dd6 578 AMQP_VALUE application_properties = NULL;
XinZhangMS 0:f7f1f0d76dd6 579 AMQP_VALUE message_annotations = NULL;
XinZhangMS 0:f7f1f0d76dd6 580 AMQP_VALUE data_value = NULL;
XinZhangMS 0:f7f1f0d76dd6 581 size_t message_properties_length = 0;
XinZhangMS 0:f7f1f0d76dd6 582 size_t application_properties_length = 0;
XinZhangMS 0:f7f1f0d76dd6 583 size_t message_annotations_length = 0;
XinZhangMS 0:f7f1f0d76dd6 584 size_t data_length = 0;
XinZhangMS 0:f7f1f0d76dd6 585
XinZhangMS 0:f7f1f0d76dd6 586 body_binary_data->bytes = NULL;
XinZhangMS 0:f7f1f0d76dd6 587 body_binary_data->length = 0;
XinZhangMS 0:f7f1f0d76dd6 588
XinZhangMS 0:f7f1f0d76dd6 589 if (create_message_properties_to_encode(message_handle, &message_properties, &message_properties_length) != RESULT_OK)
XinZhangMS 0:f7f1f0d76dd6 590 {
XinZhangMS 0:f7f1f0d76dd6 591 LogError("create_message_properties_to_encode() failed");
XinZhangMS 0:f7f1f0d76dd6 592 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 593 }
XinZhangMS 0:f7f1f0d76dd6 594 else if (create_application_properties_to_encode(message_batch_container, message_handle, &application_properties, &application_properties_length) != RESULT_OK)
XinZhangMS 0:f7f1f0d76dd6 595 {
XinZhangMS 0:f7f1f0d76dd6 596 LogError("create_application_properties_to_encode() failed");
XinZhangMS 0:f7f1f0d76dd6 597 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 598 }
XinZhangMS 0:f7f1f0d76dd6 599 else if (create_message_annotations_to_encode(message_handle, &message_annotations, &message_annotations_length) != RESULT_OK)
XinZhangMS 0:f7f1f0d76dd6 600 {
XinZhangMS 0:f7f1f0d76dd6 601 LogError("create_message_annotations_to_encode() failed");
XinZhangMS 0:f7f1f0d76dd6 602 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 603 }
XinZhangMS 0:f7f1f0d76dd6 604 else if (create_data_to_encode(message_handle, &data_value, &data_length) != RESULT_OK)
XinZhangMS 0:f7f1f0d76dd6 605 {
XinZhangMS 0:f7f1f0d76dd6 606 LogError("create_data_to_encode() failed");
XinZhangMS 0:f7f1f0d76dd6 607 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 608 }
XinZhangMS 0:f7f1f0d76dd6 609 else if ((body_binary_data->bytes = malloc(message_properties_length + application_properties_length + data_length + message_annotations_length)) == NULL)
XinZhangMS 0:f7f1f0d76dd6 610 {
XinZhangMS 0:f7f1f0d76dd6 611 LogError("malloc of %d bytes failed", message_properties_length + application_properties_length + data_length + message_annotations_length);
XinZhangMS 0:f7f1f0d76dd6 612 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 613 }
XinZhangMS 0:f7f1f0d76dd6 614 // Codes_SRS_UAMQP_MESSAGING_31_119: [Invoke underlying AMQP encode routines on data waiting to be encoded.]
XinZhangMS 0:f7f1f0d76dd6 615 else if (amqpvalue_encode(message_properties, &encode_callback, body_binary_data) != RESULT_OK)
XinZhangMS 0:f7f1f0d76dd6 616 {
XinZhangMS 0:f7f1f0d76dd6 617 LogError("amqpvalue_encode() for message properties failed");
XinZhangMS 0:f7f1f0d76dd6 618 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 619 }
XinZhangMS 0:f7f1f0d76dd6 620 else if ((application_properties_length > 0) && (amqpvalue_encode(application_properties, &encode_callback, body_binary_data) != RESULT_OK))
XinZhangMS 0:f7f1f0d76dd6 621 {
XinZhangMS 0:f7f1f0d76dd6 622 LogError("amqpvalue_encode() for application properties failed");
XinZhangMS 0:f7f1f0d76dd6 623 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 624 }
XinZhangMS 0:f7f1f0d76dd6 625 else if (message_annotations_length > 0 && amqpvalue_encode(message_annotations, &encode_callback, body_binary_data) != RESULT_OK)
XinZhangMS 0:f7f1f0d76dd6 626 {
XinZhangMS 0:f7f1f0d76dd6 627 LogError("amqpvalue_encode() for message annotations failed");
XinZhangMS 0:f7f1f0d76dd6 628 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 629 }
XinZhangMS 0:f7f1f0d76dd6 630 else if (RESULT_OK != amqpvalue_encode(data_value, &encode_callback, body_binary_data))
XinZhangMS 0:f7f1f0d76dd6 631 {
XinZhangMS 0:f7f1f0d76dd6 632 LogError("amqpvalue_encode() for data value failed");
XinZhangMS 0:f7f1f0d76dd6 633 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 634 }
XinZhangMS 0:f7f1f0d76dd6 635 else
XinZhangMS 0:f7f1f0d76dd6 636 {
XinZhangMS 0:f7f1f0d76dd6 637 body_binary_data->length = message_properties_length + application_properties_length + data_length + message_annotations_length;
XinZhangMS 0:f7f1f0d76dd6 638 result = RESULT_OK;
XinZhangMS 0:f7f1f0d76dd6 639 }
XinZhangMS 0:f7f1f0d76dd6 640
XinZhangMS 0:f7f1f0d76dd6 641 if (NULL != data_value)
XinZhangMS 0:f7f1f0d76dd6 642 {
XinZhangMS 0:f7f1f0d76dd6 643 amqpvalue_destroy(data_value);
XinZhangMS 0:f7f1f0d76dd6 644 }
XinZhangMS 0:f7f1f0d76dd6 645
XinZhangMS 0:f7f1f0d76dd6 646 if (NULL != application_properties)
XinZhangMS 0:f7f1f0d76dd6 647 {
XinZhangMS 0:f7f1f0d76dd6 648 amqpvalue_destroy(application_properties);
XinZhangMS 0:f7f1f0d76dd6 649 }
XinZhangMS 0:f7f1f0d76dd6 650
XinZhangMS 0:f7f1f0d76dd6 651 if (NULL != message_annotations)
XinZhangMS 0:f7f1f0d76dd6 652 {
XinZhangMS 0:f7f1f0d76dd6 653 amqpvalue_destroy(message_annotations);
XinZhangMS 0:f7f1f0d76dd6 654 }
XinZhangMS 0:f7f1f0d76dd6 655
XinZhangMS 0:f7f1f0d76dd6 656 if (NULL != message_properties)
XinZhangMS 0:f7f1f0d76dd6 657 {
XinZhangMS 0:f7f1f0d76dd6 658 amqpvalue_destroy(message_properties);
XinZhangMS 0:f7f1f0d76dd6 659 }
XinZhangMS 0:f7f1f0d76dd6 660
XinZhangMS 0:f7f1f0d76dd6 661 return result;
XinZhangMS 0:f7f1f0d76dd6 662 }
XinZhangMS 0:f7f1f0d76dd6 663
XinZhangMS 0:f7f1f0d76dd6 664 static int readMessageIdFromuAQMPMessage(IOTHUB_MESSAGE_HANDLE iothub_message_handle, PROPERTIES_HANDLE uamqp_message_properties)
XinZhangMS 0:f7f1f0d76dd6 665 {
XinZhangMS 0:f7f1f0d76dd6 666 int result;
XinZhangMS 0:f7f1f0d76dd6 667 AMQP_VALUE uamqp_message_property;
XinZhangMS 0:f7f1f0d76dd6 668
XinZhangMS 0:f7f1f0d76dd6 669 // Codes_SRS_UAMQP_MESSAGING_09_010: [The message-id property shall be read from the uAMQP message by calling properties_get_message_id.]
XinZhangMS 0:f7f1f0d76dd6 670 if (properties_get_message_id(uamqp_message_properties, &uamqp_message_property) != 0 || uamqp_message_property == NULL)
XinZhangMS 0:f7f1f0d76dd6 671 {
XinZhangMS 0:f7f1f0d76dd6 672 // Codes_SRS_UAMQP_MESSAGING_09_011: [If the uAMQP message does not contain property `message ID`, it shall be skipped as it is optional.]
XinZhangMS 0:f7f1f0d76dd6 673 result = RESULT_OK;
XinZhangMS 0:f7f1f0d76dd6 674 }
XinZhangMS 0:f7f1f0d76dd6 675 else
XinZhangMS 0:f7f1f0d76dd6 676 {
XinZhangMS 0:f7f1f0d76dd6 677 // Codes_SRS_UAMQP_MESSAGING_09_012: [The type of the message-id property value shall be obtained using amqpvalue_get_type().]
XinZhangMS 0:f7f1f0d76dd6 678 AMQP_TYPE value_type = amqpvalue_get_type(uamqp_message_property);
XinZhangMS 0:f7f1f0d76dd6 679
XinZhangMS 0:f7f1f0d76dd6 680 // Codes_SRS_UAMQP_MESSAGING_09_013: [If the type of the message-id property value is AMQP_TYPE_NULL, message_create_IoTHubMessage_from_uamqp_message() shall skip processing the message-id (as it is optional) and continue normally.]
XinZhangMS 0:f7f1f0d76dd6 681 if (value_type != AMQP_TYPE_NULL)
XinZhangMS 0:f7f1f0d76dd6 682 {
XinZhangMS 0:f7f1f0d76dd6 683
XinZhangMS 0:f7f1f0d76dd6 684 char* string_value;
XinZhangMS 0:f7f1f0d76dd6 685 char string_buffer[MESSAGE_ID_MAX_SIZE];
XinZhangMS 0:f7f1f0d76dd6 686 bool free_string_value = false;
XinZhangMS 0:f7f1f0d76dd6 687
XinZhangMS 0:f7f1f0d76dd6 688 memset(string_buffer, 0, MESSAGE_ID_MAX_SIZE);
XinZhangMS 0:f7f1f0d76dd6 689
XinZhangMS 0:f7f1f0d76dd6 690 if (value_type == AMQP_TYPE_STRING)
XinZhangMS 0:f7f1f0d76dd6 691 {
XinZhangMS 0:f7f1f0d76dd6 692 // Codes_SRS_UAMQP_MESSAGING_09_014: [The message-id value shall be retrieved from the AMQP_VALUE as char sequence]
XinZhangMS 0:f7f1f0d76dd6 693 if (amqpvalue_get_string(uamqp_message_property, (const char**)(&string_value)) != 0)
XinZhangMS 0:f7f1f0d76dd6 694 {
XinZhangMS 0:f7f1f0d76dd6 695 // Codes_SRS_UAMQP_MESSAGING_09_015: [If message-id fails to be obtained, message_create_IoTHubMessage_from_uamqp_message() shall fail and return immediately.]
XinZhangMS 0:f7f1f0d76dd6 696 LogError("Failed to get value of uAMQP message 'message-id' property (string)");
XinZhangMS 0:f7f1f0d76dd6 697 string_value = NULL;
XinZhangMS 0:f7f1f0d76dd6 698 }
XinZhangMS 0:f7f1f0d76dd6 699 }
XinZhangMS 0:f7f1f0d76dd6 700 else if (value_type == AMQP_TYPE_ULONG)
XinZhangMS 0:f7f1f0d76dd6 701 {
XinZhangMS 0:f7f1f0d76dd6 702 uint64_t ulong_value;
XinZhangMS 0:f7f1f0d76dd6 703
XinZhangMS 0:f7f1f0d76dd6 704 // Codes_SRS_UAMQP_MESSAGING_09_014: [The message-id value shall be retrieved from the AMQP_VALUE as char sequence]
XinZhangMS 0:f7f1f0d76dd6 705 if (amqpvalue_get_ulong(uamqp_message_property, &ulong_value) != 0)
XinZhangMS 0:f7f1f0d76dd6 706 {
XinZhangMS 0:f7f1f0d76dd6 707 // Codes_SRS_UAMQP_MESSAGING_09_015: [If message-id fails to be obtained, message_create_IoTHubMessage_from_uamqp_message() shall fail and return immediately.]
XinZhangMS 0:f7f1f0d76dd6 708 LogError("Failed to get value of uAMQP message 'message-id' property (ulong)");
XinZhangMS 0:f7f1f0d76dd6 709 string_value = NULL;
XinZhangMS 0:f7f1f0d76dd6 710 }
XinZhangMS 0:f7f1f0d76dd6 711 else if (sprintf(string_buffer, "%" PRIu64, ulong_value) < 0)
XinZhangMS 0:f7f1f0d76dd6 712 {
XinZhangMS 0:f7f1f0d76dd6 713 LogError("Failed converting 'message-id' (ulong) to string");
XinZhangMS 0:f7f1f0d76dd6 714 string_value = NULL;
XinZhangMS 0:f7f1f0d76dd6 715 }
XinZhangMS 0:f7f1f0d76dd6 716 else
XinZhangMS 0:f7f1f0d76dd6 717 {
XinZhangMS 0:f7f1f0d76dd6 718 string_value = string_buffer;
XinZhangMS 0:f7f1f0d76dd6 719 }
XinZhangMS 0:f7f1f0d76dd6 720 }
XinZhangMS 0:f7f1f0d76dd6 721 else if (value_type == AMQP_TYPE_UUID)
XinZhangMS 0:f7f1f0d76dd6 722 {
XinZhangMS 0:f7f1f0d76dd6 723 uuid uuid_value;
XinZhangMS 0:f7f1f0d76dd6 724
XinZhangMS 0:f7f1f0d76dd6 725 // Codes_SRS_UAMQP_MESSAGING_09_014: [The message-id value shall be retrieved from the AMQP_VALUE as char sequence]
XinZhangMS 0:f7f1f0d76dd6 726 if (amqpvalue_get_uuid(uamqp_message_property, &uuid_value) != 0)
XinZhangMS 0:f7f1f0d76dd6 727 {
XinZhangMS 0:f7f1f0d76dd6 728 // Codes_SRS_UAMQP_MESSAGING_09_015: [If message-id fails to be obtained, message_create_IoTHubMessage_from_uamqp_message() shall fail and return immediately.]
XinZhangMS 0:f7f1f0d76dd6 729 LogError("Failed to get value of uAMQP message 'message-id' property (UUID)");
XinZhangMS 0:f7f1f0d76dd6 730 string_value = NULL;
XinZhangMS 0:f7f1f0d76dd6 731 }
XinZhangMS 0:f7f1f0d76dd6 732 else if ((string_value = UUID_to_string((UUID*)uuid_value)) == NULL)
XinZhangMS 0:f7f1f0d76dd6 733 {
XinZhangMS 0:f7f1f0d76dd6 734 // Codes_SRS_UAMQP_MESSAGING_09_015: [If message-id fails to be obtained, message_create_IoTHubMessage_from_uamqp_message() shall fail and return immediately.]
XinZhangMS 0:f7f1f0d76dd6 735 LogError("Failed to get the string representation of 'message-id' UUID");
XinZhangMS 0:f7f1f0d76dd6 736 string_value = NULL;
XinZhangMS 0:f7f1f0d76dd6 737 }
XinZhangMS 0:f7f1f0d76dd6 738 else
XinZhangMS 0:f7f1f0d76dd6 739 {
XinZhangMS 0:f7f1f0d76dd6 740 free_string_value = true;
XinZhangMS 0:f7f1f0d76dd6 741 }
XinZhangMS 0:f7f1f0d76dd6 742 }
XinZhangMS 0:f7f1f0d76dd6 743 else
XinZhangMS 0:f7f1f0d76dd6 744 {
XinZhangMS 0:f7f1f0d76dd6 745 LogError("Unrecognized type for message-id (%d)", value_type);
XinZhangMS 0:f7f1f0d76dd6 746 string_value = NULL;
XinZhangMS 0:f7f1f0d76dd6 747 }
XinZhangMS 0:f7f1f0d76dd6 748
XinZhangMS 0:f7f1f0d76dd6 749 if (string_value != NULL)
XinZhangMS 0:f7f1f0d76dd6 750 {
XinZhangMS 0:f7f1f0d76dd6 751 // Codes_SRS_UAMQP_MESSAGING_09_016: [The message-id property shall be set on the IOTHUB_MESSAGE_HANDLE instance by calling IoTHubMessage_SetMessageId(), passing the value read from the uAMQP message.]
XinZhangMS 0:f7f1f0d76dd6 752 if (IoTHubMessage_SetMessageId(iothub_message_handle, string_value) != IOTHUB_MESSAGE_OK)
XinZhangMS 0:f7f1f0d76dd6 753 {
XinZhangMS 0:f7f1f0d76dd6 754 // Codes_SRS_UAMQP_MESSAGING_09_017: [If IoTHubMessage_SetMessageId fails, IoTHubMessage_CreateFromuAMQPMessage() shall fail and return immediately.]
XinZhangMS 0:f7f1f0d76dd6 755 LogError("Failed to set IOTHUB_MESSAGE_HANDLE 'message-id' property.");
XinZhangMS 0:f7f1f0d76dd6 756 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 757 }
XinZhangMS 0:f7f1f0d76dd6 758 else
XinZhangMS 0:f7f1f0d76dd6 759 {
XinZhangMS 0:f7f1f0d76dd6 760 result = RESULT_OK;
XinZhangMS 0:f7f1f0d76dd6 761 }
XinZhangMS 0:f7f1f0d76dd6 762
XinZhangMS 0:f7f1f0d76dd6 763 if (free_string_value)
XinZhangMS 0:f7f1f0d76dd6 764 {
XinZhangMS 0:f7f1f0d76dd6 765 // Only certain code paths allocate this.
XinZhangMS 0:f7f1f0d76dd6 766 free(string_value);
XinZhangMS 0:f7f1f0d76dd6 767 }
XinZhangMS 0:f7f1f0d76dd6 768 }
XinZhangMS 0:f7f1f0d76dd6 769 else
XinZhangMS 0:f7f1f0d76dd6 770 {
XinZhangMS 0:f7f1f0d76dd6 771 LogError("Unexpected null string for message-id");
XinZhangMS 0:f7f1f0d76dd6 772 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 773 }
XinZhangMS 0:f7f1f0d76dd6 774 }
XinZhangMS 0:f7f1f0d76dd6 775 else
XinZhangMS 0:f7f1f0d76dd6 776 {
XinZhangMS 0:f7f1f0d76dd6 777 result = RESULT_OK;
XinZhangMS 0:f7f1f0d76dd6 778 }
XinZhangMS 0:f7f1f0d76dd6 779 }
XinZhangMS 0:f7f1f0d76dd6 780
XinZhangMS 0:f7f1f0d76dd6 781 return result;
XinZhangMS 0:f7f1f0d76dd6 782 }
XinZhangMS 0:f7f1f0d76dd6 783
XinZhangMS 0:f7f1f0d76dd6 784 static int readCorrelationIdFromuAQMPMessage(IOTHUB_MESSAGE_HANDLE iothub_message_handle, PROPERTIES_HANDLE uamqp_message_properties)
XinZhangMS 0:f7f1f0d76dd6 785 {
XinZhangMS 0:f7f1f0d76dd6 786 int result;
XinZhangMS 0:f7f1f0d76dd6 787 AMQP_VALUE uamqp_message_property;
XinZhangMS 0:f7f1f0d76dd6 788
XinZhangMS 0:f7f1f0d76dd6 789 // Codes_SRS_UAMQP_MESSAGING_09_018: [The correlation-id property shall be read from the uAMQP message by calling properties_get_correlation_id.]
XinZhangMS 0:f7f1f0d76dd6 790 if (properties_get_correlation_id(uamqp_message_properties, &uamqp_message_property) != 0 || uamqp_message_property == NULL)
XinZhangMS 0:f7f1f0d76dd6 791 {
XinZhangMS 0:f7f1f0d76dd6 792 // Codes_SRS_UAMQP_MESSAGING_09_019: [If the uAMQP message does not contain property `correlation ID`, it shall be skipped as it is optional.]
XinZhangMS 0:f7f1f0d76dd6 793 result = RESULT_OK;
XinZhangMS 0:f7f1f0d76dd6 794 }
XinZhangMS 0:f7f1f0d76dd6 795 else
XinZhangMS 0:f7f1f0d76dd6 796 {
XinZhangMS 0:f7f1f0d76dd6 797 // Codes_SRS_UAMQP_MESSAGING_09_020: [The type of the correlation-id property value shall be obtained using amqpvalue_get_type().]
XinZhangMS 0:f7f1f0d76dd6 798 AMQP_TYPE value_type = amqpvalue_get_type(uamqp_message_property);
XinZhangMS 0:f7f1f0d76dd6 799
XinZhangMS 0:f7f1f0d76dd6 800 // Codes_SRS_UAMQP_MESSAGING_09_021: [If the type of the correlation-id property value is AMQP_TYPE_NULL, IoTHubMessage_CreateFromuAMQPMessage() shall skip processing the correlation-id (as it is optional) and continue normally.]
XinZhangMS 0:f7f1f0d76dd6 801 if (value_type != AMQP_TYPE_NULL)
XinZhangMS 0:f7f1f0d76dd6 802 {
XinZhangMS 0:f7f1f0d76dd6 803 char* string_value;
XinZhangMS 0:f7f1f0d76dd6 804 char string_buffer[MESSAGE_ID_MAX_SIZE];
XinZhangMS 0:f7f1f0d76dd6 805 bool free_string_value = false;
XinZhangMS 0:f7f1f0d76dd6 806
XinZhangMS 0:f7f1f0d76dd6 807 memset(string_buffer, 0, MESSAGE_ID_MAX_SIZE);
XinZhangMS 0:f7f1f0d76dd6 808
XinZhangMS 0:f7f1f0d76dd6 809 if (value_type == AMQP_TYPE_STRING)
XinZhangMS 0:f7f1f0d76dd6 810 {
XinZhangMS 0:f7f1f0d76dd6 811 // Codes_SRS_UAMQP_MESSAGING_09_022: [The correlation-id value shall be retrieved from the AMQP_VALUE as char sequence]
XinZhangMS 0:f7f1f0d76dd6 812 if (amqpvalue_get_string(uamqp_message_property, (const char**)(&string_value)) != 0)
XinZhangMS 0:f7f1f0d76dd6 813 {
XinZhangMS 0:f7f1f0d76dd6 814 // Codes_SRS_UAMQP_MESSAGING_09_023: [If correlation-id fails to be obtained, message_create_IoTHubMessage_from_uamqp_message() shall fail and return immediately.]
XinZhangMS 0:f7f1f0d76dd6 815 LogError("Failed to get value of uAMQP message 'correlation-id' property (string)");
XinZhangMS 0:f7f1f0d76dd6 816 string_value = NULL;
XinZhangMS 0:f7f1f0d76dd6 817 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 818 }
XinZhangMS 0:f7f1f0d76dd6 819 }
XinZhangMS 0:f7f1f0d76dd6 820 else if (value_type == AMQP_TYPE_ULONG)
XinZhangMS 0:f7f1f0d76dd6 821 {
XinZhangMS 0:f7f1f0d76dd6 822 uint64_t ulong_value;
XinZhangMS 0:f7f1f0d76dd6 823
XinZhangMS 0:f7f1f0d76dd6 824 // Codes_SRS_UAMQP_MESSAGING_09_022: [The correlation-id value shall be retrieved from the AMQP_VALUE as char sequence]
XinZhangMS 0:f7f1f0d76dd6 825 if (amqpvalue_get_ulong(uamqp_message_property, &ulong_value) != 0)
XinZhangMS 0:f7f1f0d76dd6 826 {
XinZhangMS 0:f7f1f0d76dd6 827 // Codes_SRS_UAMQP_MESSAGING_09_023: [If correlation-id fails to be obtained, message_create_IoTHubMessage_from_uamqp_message() shall fail and return immediately.]
XinZhangMS 0:f7f1f0d76dd6 828 LogError("Failed to get value of uAMQP message 'correlation-id' property (ulong)");
XinZhangMS 0:f7f1f0d76dd6 829 string_value = NULL;
XinZhangMS 0:f7f1f0d76dd6 830 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 831 }
XinZhangMS 0:f7f1f0d76dd6 832 else if (sprintf(string_buffer, "%" PRIu64, ulong_value) < 0)
XinZhangMS 0:f7f1f0d76dd6 833 {
XinZhangMS 0:f7f1f0d76dd6 834 LogError("Failed converting 'correlation-id' (ulong) to string");
XinZhangMS 0:f7f1f0d76dd6 835 string_value = NULL;
XinZhangMS 0:f7f1f0d76dd6 836 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 837 }
XinZhangMS 0:f7f1f0d76dd6 838 else
XinZhangMS 0:f7f1f0d76dd6 839 {
XinZhangMS 0:f7f1f0d76dd6 840 string_value = string_buffer;
XinZhangMS 0:f7f1f0d76dd6 841 }
XinZhangMS 0:f7f1f0d76dd6 842 }
XinZhangMS 0:f7f1f0d76dd6 843 else if (value_type == AMQP_TYPE_UUID)
XinZhangMS 0:f7f1f0d76dd6 844 {
XinZhangMS 0:f7f1f0d76dd6 845 uuid uuid_value;
XinZhangMS 0:f7f1f0d76dd6 846
XinZhangMS 0:f7f1f0d76dd6 847 // Codes_SRS_UAMQP_MESSAGING_09_022: [The correlation-id value shall be retrieved from the AMQP_VALUE as char sequence]
XinZhangMS 0:f7f1f0d76dd6 848 if (amqpvalue_get_uuid(uamqp_message_property, &uuid_value) != 0)
XinZhangMS 0:f7f1f0d76dd6 849 {
XinZhangMS 0:f7f1f0d76dd6 850 // Codes_SRS_UAMQP_MESSAGING_09_023: [If correlation-id fails to be obtained, message_create_IoTHubMessage_from_uamqp_message() shall fail and return immediately.]
XinZhangMS 0:f7f1f0d76dd6 851 LogError("Failed to get value of uAMQP message 'correlation-id' property (UUID)");
XinZhangMS 0:f7f1f0d76dd6 852 string_value = NULL;
XinZhangMS 0:f7f1f0d76dd6 853 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 854 }
XinZhangMS 0:f7f1f0d76dd6 855 else if ((string_value = UUID_to_string((UUID*)uuid_value)) == NULL)
XinZhangMS 0:f7f1f0d76dd6 856 {
XinZhangMS 0:f7f1f0d76dd6 857 // Codes_SRS_UAMQP_MESSAGING_09_023: [If correlation-id fails to be obtained, message_create_IoTHubMessage_from_uamqp_message() shall fail and return immediately.]
XinZhangMS 0:f7f1f0d76dd6 858 LogError("Failed to get the string representation of 'correlation-id' UUID");
XinZhangMS 0:f7f1f0d76dd6 859 string_value = NULL;
XinZhangMS 0:f7f1f0d76dd6 860 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 861 }
XinZhangMS 0:f7f1f0d76dd6 862 else
XinZhangMS 0:f7f1f0d76dd6 863 {
XinZhangMS 0:f7f1f0d76dd6 864 free_string_value = true;
XinZhangMS 0:f7f1f0d76dd6 865 }
XinZhangMS 0:f7f1f0d76dd6 866 }
XinZhangMS 0:f7f1f0d76dd6 867 else
XinZhangMS 0:f7f1f0d76dd6 868 {
XinZhangMS 0:f7f1f0d76dd6 869 LogError("Unrecognized type for correlation-id (%d)", value_type);
XinZhangMS 0:f7f1f0d76dd6 870 string_value = NULL;
XinZhangMS 0:f7f1f0d76dd6 871 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 872 }
XinZhangMS 0:f7f1f0d76dd6 873
XinZhangMS 0:f7f1f0d76dd6 874 if (string_value != NULL)
XinZhangMS 0:f7f1f0d76dd6 875 {
XinZhangMS 0:f7f1f0d76dd6 876 // Codes_SRS_UAMQP_MESSAGING_09_024: [The correlation-id property shall be set on the IOTHUB_MESSAGE_HANDLE by calling IoTHubMessage_SetCorrelationId, passing the value read from the uAMQP message.]
XinZhangMS 0:f7f1f0d76dd6 877 if (IoTHubMessage_SetCorrelationId(iothub_message_handle, string_value) != IOTHUB_MESSAGE_OK)
XinZhangMS 0:f7f1f0d76dd6 878 {
XinZhangMS 0:f7f1f0d76dd6 879 // Codes_SRS_UAMQP_MESSAGING_09_025: [If IoTHubMessage_SetCorrelationId fails, IoTHubMessage_CreateFromuAMQPMessage() shall fail and return immediately.]
XinZhangMS 0:f7f1f0d76dd6 880 LogError("Failed to set IOTHUB_MESSAGE_HANDLE 'correlation-id' property.");
XinZhangMS 0:f7f1f0d76dd6 881 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 882 }
XinZhangMS 0:f7f1f0d76dd6 883 else
XinZhangMS 0:f7f1f0d76dd6 884 {
XinZhangMS 0:f7f1f0d76dd6 885 result = RESULT_OK;
XinZhangMS 0:f7f1f0d76dd6 886 }
XinZhangMS 0:f7f1f0d76dd6 887
XinZhangMS 0:f7f1f0d76dd6 888 if (free_string_value)
XinZhangMS 0:f7f1f0d76dd6 889 {
XinZhangMS 0:f7f1f0d76dd6 890 // Only certain code paths allocate this.
XinZhangMS 0:f7f1f0d76dd6 891 free(string_value);
XinZhangMS 0:f7f1f0d76dd6 892 }
XinZhangMS 0:f7f1f0d76dd6 893 }
XinZhangMS 0:f7f1f0d76dd6 894 else
XinZhangMS 0:f7f1f0d76dd6 895 {
XinZhangMS 0:f7f1f0d76dd6 896 LogError("Unexpected null string for correlation-id");
XinZhangMS 0:f7f1f0d76dd6 897 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 898 }
XinZhangMS 0:f7f1f0d76dd6 899 }
XinZhangMS 0:f7f1f0d76dd6 900 else
XinZhangMS 0:f7f1f0d76dd6 901 {
XinZhangMS 0:f7f1f0d76dd6 902 result = RESULT_OK;
XinZhangMS 0:f7f1f0d76dd6 903 }
XinZhangMS 0:f7f1f0d76dd6 904 }
XinZhangMS 0:f7f1f0d76dd6 905
XinZhangMS 0:f7f1f0d76dd6 906 return result;
XinZhangMS 0:f7f1f0d76dd6 907 }
XinZhangMS 0:f7f1f0d76dd6 908
XinZhangMS 0:f7f1f0d76dd6 909 static int readPropertiesFromuAMQPMessage(IOTHUB_MESSAGE_HANDLE iothub_message_handle, MESSAGE_HANDLE uamqp_message)
XinZhangMS 0:f7f1f0d76dd6 910 {
XinZhangMS 0:f7f1f0d76dd6 911 int result;
XinZhangMS 0:f7f1f0d76dd6 912 PROPERTIES_HANDLE uamqp_message_properties;
XinZhangMS 0:f7f1f0d76dd6 913
XinZhangMS 0:f7f1f0d76dd6 914 // Codes_SRS_UAMQP_MESSAGING_09_008: [The uAMQP message properties shall be retrieved using message_get_properties().]
XinZhangMS 0:f7f1f0d76dd6 915 if (message_get_properties(uamqp_message, &uamqp_message_properties) != 0)
XinZhangMS 0:f7f1f0d76dd6 916 {
XinZhangMS 0:f7f1f0d76dd6 917 // Codes_SRS_UAMQP_MESSAGING_09_009: [If message_get_properties() fails, message_create_IoTHubMessage_from_uamqp_message shall fail and return immediately.]
XinZhangMS 0:f7f1f0d76dd6 918 LogError("Failed to get property properties map from uAMQP message.");
XinZhangMS 0:f7f1f0d76dd6 919 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 920 }
XinZhangMS 0:f7f1f0d76dd6 921 else
XinZhangMS 0:f7f1f0d76dd6 922 {
XinZhangMS 0:f7f1f0d76dd6 923 result = RESULT_OK; // Properties 'message-id' and 'correlation-id' are optional according to the AMQP 1.0 spec.
XinZhangMS 0:f7f1f0d76dd6 924
XinZhangMS 0:f7f1f0d76dd6 925 if (readMessageIdFromuAQMPMessage(iothub_message_handle, uamqp_message_properties) != RESULT_OK)
XinZhangMS 0:f7f1f0d76dd6 926 {
XinZhangMS 0:f7f1f0d76dd6 927 LogError("Failed readMessageIdFromuAQMPMessage.");
XinZhangMS 0:f7f1f0d76dd6 928 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 929 }
XinZhangMS 0:f7f1f0d76dd6 930 else if (readCorrelationIdFromuAQMPMessage(iothub_message_handle, uamqp_message_properties) != RESULT_OK)
XinZhangMS 0:f7f1f0d76dd6 931 {
XinZhangMS 0:f7f1f0d76dd6 932 LogError("Failed readPropertiesFromuAMQPMessage.");
XinZhangMS 0:f7f1f0d76dd6 933 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 934 }
XinZhangMS 0:f7f1f0d76dd6 935 else
XinZhangMS 0:f7f1f0d76dd6 936 {
XinZhangMS 0:f7f1f0d76dd6 937 const char* uamqp_message_property_value = NULL;
XinZhangMS 0:f7f1f0d76dd6 938
XinZhangMS 0:f7f1f0d76dd6 939 // Codes_SRS_UAMQP_MESSAGING_09_100: [If the uAMQP message contains property `content-type`, it shall be set on IOTHUB_MESSAGE_HANDLE]
XinZhangMS 0:f7f1f0d76dd6 940 // Codes_SRS_UAMQP_MESSAGING_31_122: [If the uAMQP message does not contain property `content-type`, it shall be skipped as it is optional]
XinZhangMS 0:f7f1f0d76dd6 941 if (properties_get_content_type(uamqp_message_properties, &uamqp_message_property_value) == 0 && uamqp_message_property_value != NULL)
XinZhangMS 0:f7f1f0d76dd6 942 {
XinZhangMS 0:f7f1f0d76dd6 943 if (IoTHubMessage_SetContentTypeSystemProperty(iothub_message_handle, uamqp_message_property_value) != IOTHUB_MESSAGE_OK)
XinZhangMS 0:f7f1f0d76dd6 944 {
XinZhangMS 0:f7f1f0d76dd6 945 // Codes_SRS_UAMQP_MESSAGING_09_102: [If setting the `content-type` property on IOTHUB_MESSAGE_HANDLE fails, readPropertiesFromuAMQPMessage() shall fail and return immediately.]
XinZhangMS 0:f7f1f0d76dd6 946 LogError("Failed to set IOTHUB_MESSAGE_HANDLE 'content-type' property.");
XinZhangMS 0:f7f1f0d76dd6 947 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 948 }
XinZhangMS 0:f7f1f0d76dd6 949 }
XinZhangMS 0:f7f1f0d76dd6 950
XinZhangMS 0:f7f1f0d76dd6 951 uamqp_message_property_value = NULL;
XinZhangMS 0:f7f1f0d76dd6 952
XinZhangMS 0:f7f1f0d76dd6 953 // Codes_SRS_UAMQP_MESSAGING_09_103: [If the uAMQP message contains property `content-encoding`, it shall be set on IOTHUB_MESSAGE_HANDLE]
XinZhangMS 0:f7f1f0d76dd6 954 // Codes_SRS_UAMQP_MESSAGING_31_123: [If the uAMQP message does not contain property `content-encoding`, it shall be skipped as it is optional]
XinZhangMS 0:f7f1f0d76dd6 955 if (properties_get_content_encoding(uamqp_message_properties, &uamqp_message_property_value) == 0 && uamqp_message_property_value != NULL)
XinZhangMS 0:f7f1f0d76dd6 956 {
XinZhangMS 0:f7f1f0d76dd6 957 if (IoTHubMessage_SetContentEncodingSystemProperty(iothub_message_handle, uamqp_message_property_value) != IOTHUB_MESSAGE_OK)
XinZhangMS 0:f7f1f0d76dd6 958 {
XinZhangMS 0:f7f1f0d76dd6 959 // Codes_SRS_UAMQP_MESSAGING_09_105: [If setting the `content-encoding` property on IOTHUB_MESSAGE_HANDLE fails, readPropertiesFromuAMQPMessage() shall fail and return immediately.]
XinZhangMS 0:f7f1f0d76dd6 960 LogError("Failed to set IOTHUB_MESSAGE_HANDLE 'content-encoding' property.");
XinZhangMS 0:f7f1f0d76dd6 961 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 962 }
XinZhangMS 0:f7f1f0d76dd6 963 }
XinZhangMS 0:f7f1f0d76dd6 964 }
XinZhangMS 0:f7f1f0d76dd6 965
XinZhangMS 0:f7f1f0d76dd6 966 // Codes_SRS_UAMQP_MESSAGING_09_026: [message_create_IoTHubMessage_from_uamqp_message() shall destroy the uAMQP message properties (obtained with message_get_properties()) by calling properties_destroy().]
XinZhangMS 0:f7f1f0d76dd6 967 properties_destroy(uamqp_message_properties);
XinZhangMS 0:f7f1f0d76dd6 968 }
XinZhangMS 0:f7f1f0d76dd6 969
XinZhangMS 0:f7f1f0d76dd6 970 return result;
XinZhangMS 0:f7f1f0d76dd6 971 }
XinZhangMS 0:f7f1f0d76dd6 972
XinZhangMS 0:f7f1f0d76dd6 973 static int readApplicationPropertiesFromuAMQPMessage(IOTHUB_MESSAGE_HANDLE iothub_message_handle, MESSAGE_HANDLE uamqp_message)
XinZhangMS 0:f7f1f0d76dd6 974 {
XinZhangMS 0:f7f1f0d76dd6 975 int result;
XinZhangMS 0:f7f1f0d76dd6 976 AMQP_VALUE uamqp_app_properties = NULL;
XinZhangMS 0:f7f1f0d76dd6 977 AMQP_VALUE uamqp_app_properties_ipdv = NULL;
XinZhangMS 0:f7f1f0d76dd6 978 uint32_t property_count = 0;
XinZhangMS 0:f7f1f0d76dd6 979 MAP_HANDLE iothub_message_properties_map;
XinZhangMS 0:f7f1f0d76dd6 980
XinZhangMS 0:f7f1f0d76dd6 981 // Codes_SRS_UAMQP_MESSAGING_09_027: [The IOTHUB_MESSAGE_HANDLE properties shall be retrieved using IoTHubMessage_Properties.]
XinZhangMS 0:f7f1f0d76dd6 982 if ((iothub_message_properties_map = IoTHubMessage_Properties(iothub_message_handle)) == NULL)
XinZhangMS 0:f7f1f0d76dd6 983 {
XinZhangMS 0:f7f1f0d76dd6 984 // Codes_SRS_UAMQP_MESSAGING_09_028: [If IoTHubMessage_Properties fails, message_create_IoTHubMessage_from_uamqp_message() shall fail and return immediately.]
XinZhangMS 0:f7f1f0d76dd6 985 LogError("Failed to get property map from IoTHub message.");
XinZhangMS 0:f7f1f0d76dd6 986 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 987 }
XinZhangMS 0:f7f1f0d76dd6 988 // Codes_SRS_UAMQP_MESSAGING_09_029: [The uAMQP message application properties shall be retrieved using message_get_application_properties.]
XinZhangMS 0:f7f1f0d76dd6 989 else if ((result = message_get_application_properties(uamqp_message, &uamqp_app_properties)) != 0)
XinZhangMS 0:f7f1f0d76dd6 990 {
XinZhangMS 0:f7f1f0d76dd6 991 // Codes_SRS_UAMQP_MESSAGING_09_030: [If message_get_application_properties fails, message_create_IoTHubMessage_from_uamqp_message() shall fail and return immediately.]
XinZhangMS 0:f7f1f0d76dd6 992 LogError("Failed reading the incoming uAMQP message properties (return code %d).", result);
XinZhangMS 0:f7f1f0d76dd6 993 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 994 }
XinZhangMS 0:f7f1f0d76dd6 995 else
XinZhangMS 0:f7f1f0d76dd6 996 {
XinZhangMS 0:f7f1f0d76dd6 997 // Codes_SRS_UAMQP_MESSAGING_09_031: [If message_get_application_properties succeeds but returns a NULL application properties map (there are no properties), message_create_IoTHubMessage_from_uamqp_message() shall skip processing the properties and continue normally.]
XinZhangMS 0:f7f1f0d76dd6 998 if (uamqp_app_properties == NULL)
XinZhangMS 0:f7f1f0d76dd6 999 {
XinZhangMS 0:f7f1f0d76dd6 1000 result = 0;
XinZhangMS 0:f7f1f0d76dd6 1001 }
XinZhangMS 0:f7f1f0d76dd6 1002 else
XinZhangMS 0:f7f1f0d76dd6 1003 {
XinZhangMS 0:f7f1f0d76dd6 1004 // Codes_SRS_UAMQP_MESSAGING_09_032: [The actual uAMQP message application properties should be extracted from the result of message_get_application_properties using amqpvalue_get_inplace_described_value.]
XinZhangMS 0:f7f1f0d76dd6 1005 if ((uamqp_app_properties_ipdv = amqpvalue_get_inplace_described_value(uamqp_app_properties)) == NULL)
XinZhangMS 0:f7f1f0d76dd6 1006 {
XinZhangMS 0:f7f1f0d76dd6 1007 // Codes_SRS_UAMQP_MESSAGING_09_033: [If amqpvalue_get_inplace_described_value fails, message_create_IoTHubMessage_from_uamqp_message() shall fail and return immediately.]
XinZhangMS 0:f7f1f0d76dd6 1008 LogError("Failed getting the map of uAMQP message application properties (return code %d).", result);
XinZhangMS 0:f7f1f0d76dd6 1009 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 1010 }
XinZhangMS 0:f7f1f0d76dd6 1011 // Codes_SRS_UAMQP_MESSAGING_09_034: [The number of items in the uAMQP message application properties shall be obtained using amqpvalue_get_map_pair_count.]
XinZhangMS 0:f7f1f0d76dd6 1012 else if ((result = amqpvalue_get_map_pair_count(uamqp_app_properties_ipdv, &property_count)) != 0)
XinZhangMS 0:f7f1f0d76dd6 1013 {
XinZhangMS 0:f7f1f0d76dd6 1014 // Codes_SRS_UAMQP_MESSAGING_09_035: [If amqpvalue_get_map_pair_count fails, message_create_IoTHubMessage_from_uamqp_message() shall fail and return immediately.]
XinZhangMS 0:f7f1f0d76dd6 1015 LogError("Failed reading the number of values in the uAMQP property map (return code %d).", result);
XinZhangMS 0:f7f1f0d76dd6 1016 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 1017 }
XinZhangMS 0:f7f1f0d76dd6 1018 else
XinZhangMS 0:f7f1f0d76dd6 1019 {
XinZhangMS 0:f7f1f0d76dd6 1020 // Codes_SRS_UAMQP_MESSAGING_09_036: [message_create_IoTHubMessage_from_uamqp_message() shall iterate through each uAMQP application property and add it to IOTHUB_MESSAGE_HANDLE properties.]
XinZhangMS 0:f7f1f0d76dd6 1021 uint32_t i;
XinZhangMS 0:f7f1f0d76dd6 1022 for (i = 0; result == RESULT_OK && i < property_count; i++)
XinZhangMS 0:f7f1f0d76dd6 1023 {
XinZhangMS 0:f7f1f0d76dd6 1024 AMQP_VALUE map_key_name = NULL;
XinZhangMS 0:f7f1f0d76dd6 1025 AMQP_VALUE map_key_value = NULL;
XinZhangMS 0:f7f1f0d76dd6 1026 const char *key_name;
XinZhangMS 0:f7f1f0d76dd6 1027 const char* key_value;
XinZhangMS 0:f7f1f0d76dd6 1028
XinZhangMS 0:f7f1f0d76dd6 1029 // Codes_SRS_UAMQP_MESSAGING_09_037: [The uAMQP application property name and value shall be obtained using amqpvalue_get_map_key_value_pair.]
XinZhangMS 0:f7f1f0d76dd6 1030 if ((result = amqpvalue_get_map_key_value_pair(uamqp_app_properties_ipdv, i, &map_key_name, &map_key_value)) != 0)
XinZhangMS 0:f7f1f0d76dd6 1031 {
XinZhangMS 0:f7f1f0d76dd6 1032 // Codes_SRS_UAMQP_MESSAGING_09_038: [If amqpvalue_get_map_key_value_pair fails, message_create_IoTHubMessage_from_uamqp_message() shall fail and return immediately.]
XinZhangMS 0:f7f1f0d76dd6 1033 LogError("Failed reading the key/value pair from the uAMQP property map (return code %d).", result);
XinZhangMS 0:f7f1f0d76dd6 1034 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 1035 }
XinZhangMS 0:f7f1f0d76dd6 1036
XinZhangMS 0:f7f1f0d76dd6 1037 // Codes_SRS_UAMQP_MESSAGING_09_039: [The uAMQP application property name shall be extracted as string using amqpvalue_get_string.]
XinZhangMS 0:f7f1f0d76dd6 1038 else if ((result = amqpvalue_get_string(map_key_name, &key_name)) != 0)
XinZhangMS 0:f7f1f0d76dd6 1039 {
XinZhangMS 0:f7f1f0d76dd6 1040 // Codes_SRS_UAMQP_MESSAGING_09_040: [If amqpvalue_get_string fails, message_create_IoTHubMessage_from_uamqp_message() shall fail and return immediately.]
XinZhangMS 0:f7f1f0d76dd6 1041 LogError("Failed parsing the uAMQP property name (return code %d).", result);
XinZhangMS 0:f7f1f0d76dd6 1042 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 1043 }
XinZhangMS 0:f7f1f0d76dd6 1044 // Codes_SRS_UAMQP_MESSAGING_09_041: [The uAMQP application property value shall be extracted as string using amqpvalue_get_string.]
XinZhangMS 0:f7f1f0d76dd6 1045 else if ((result = amqpvalue_get_string(map_key_value, &key_value)) != 0)
XinZhangMS 0:f7f1f0d76dd6 1046 {
XinZhangMS 0:f7f1f0d76dd6 1047 // Codes_SRS_UAMQP_MESSAGING_09_042: [If amqpvalue_get_string fails, message_create_IoTHubMessage_from_uamqp_message() shall fail and return immediately.]
XinZhangMS 0:f7f1f0d76dd6 1048 LogError("Failed parsing the uAMQP property value (return code %d).", result);
XinZhangMS 0:f7f1f0d76dd6 1049 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 1050 }
XinZhangMS 0:f7f1f0d76dd6 1051 // Codes_SRS_UAMQP_MESSAGING_09_043: [The application property name and value shall be added to IOTHUB_MESSAGE_HANDLE properties using Map_AddOrUpdate.]
XinZhangMS 0:f7f1f0d76dd6 1052 else if (Map_AddOrUpdate(iothub_message_properties_map, key_name, key_value) != MAP_OK)
XinZhangMS 0:f7f1f0d76dd6 1053 {
XinZhangMS 0:f7f1f0d76dd6 1054 // Codes_SRS_UAMQP_MESSAGING_09_044: [If Map_AddOrUpdate fails, message_create_IoTHubMessage_from_uamqp_message() shall fail and return immediately.]
XinZhangMS 0:f7f1f0d76dd6 1055 LogError("Failed to add/update IoTHub message property map.");
XinZhangMS 0:f7f1f0d76dd6 1056 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 1057 }
XinZhangMS 0:f7f1f0d76dd6 1058
XinZhangMS 0:f7f1f0d76dd6 1059 // Codes_SRS_UAMQP_MESSAGING_09_045: [message_create_IoTHubMessage_from_uamqp_message() shall destroy the uAMQP message property name and value (obtained with amqpvalue_get_string) by calling amqpvalue_destroy().]
XinZhangMS 0:f7f1f0d76dd6 1060 if (map_key_name != NULL)
XinZhangMS 0:f7f1f0d76dd6 1061 {
XinZhangMS 0:f7f1f0d76dd6 1062 amqpvalue_destroy(map_key_name);
XinZhangMS 0:f7f1f0d76dd6 1063 }
XinZhangMS 0:f7f1f0d76dd6 1064
XinZhangMS 0:f7f1f0d76dd6 1065 if (map_key_value != NULL)
XinZhangMS 0:f7f1f0d76dd6 1066 {
XinZhangMS 0:f7f1f0d76dd6 1067 amqpvalue_destroy(map_key_value);
XinZhangMS 0:f7f1f0d76dd6 1068 }
XinZhangMS 0:f7f1f0d76dd6 1069 }
XinZhangMS 0:f7f1f0d76dd6 1070 }
XinZhangMS 0:f7f1f0d76dd6 1071
XinZhangMS 0:f7f1f0d76dd6 1072 // Codes_SRS_UAMQP_MESSAGING_09_046: [message_create_IoTHubMessage_from_uamqp_message() shall destroy the uAMQP message property (obtained with message_get_application_properties) by calling amqpvalue_destroy().]
XinZhangMS 0:f7f1f0d76dd6 1073 amqpvalue_destroy(uamqp_app_properties);
XinZhangMS 0:f7f1f0d76dd6 1074 }
XinZhangMS 0:f7f1f0d76dd6 1075 }
XinZhangMS 0:f7f1f0d76dd6 1076
XinZhangMS 0:f7f1f0d76dd6 1077 return result;
XinZhangMS 0:f7f1f0d76dd6 1078 }
XinZhangMS 0:f7f1f0d76dd6 1079
XinZhangMS 0:f7f1f0d76dd6 1080 int message_create_IoTHubMessage_from_uamqp_message(MESSAGE_HANDLE uamqp_message, IOTHUB_MESSAGE_HANDLE* iothubclient_message)
XinZhangMS 0:f7f1f0d76dd6 1081 {
XinZhangMS 0:f7f1f0d76dd6 1082 int result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 1083
XinZhangMS 0:f7f1f0d76dd6 1084 IOTHUB_MESSAGE_HANDLE iothub_message = NULL;
XinZhangMS 0:f7f1f0d76dd6 1085 MESSAGE_BODY_TYPE body_type;
XinZhangMS 0:f7f1f0d76dd6 1086
XinZhangMS 0:f7f1f0d76dd6 1087 // Codes_SRS_UAMQP_MESSAGING_09_001: [The body type of the uAMQP message shall be retrieved using message_get_body_type().]
XinZhangMS 0:f7f1f0d76dd6 1088 if (message_get_body_type(uamqp_message, &body_type) != 0)
XinZhangMS 0:f7f1f0d76dd6 1089 {
XinZhangMS 0:f7f1f0d76dd6 1090 // Codes_SRS_UAMQP_MESSAGING_09_002: [If message_get_body_type() fails, message_create_IoTHubMessage_from_uamqp_message shall fail and return immediately.]
XinZhangMS 0:f7f1f0d76dd6 1091 LogError("Failed to get the type of the uamqp message.");
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_UAMQP_MESSAGING_09_003: [If the uAMQP message body type is MESSAGE_BODY_TYPE_DATA, the body data shall be treated as binary data.]
XinZhangMS 0:f7f1f0d76dd6 1097 if (body_type == MESSAGE_BODY_TYPE_DATA)
XinZhangMS 0:f7f1f0d76dd6 1098 {
XinZhangMS 0:f7f1f0d76dd6 1099 // Codes_SRS_UAMQP_MESSAGING_09_004: [The uAMQP message body data shall be retrieved using message_get_body_amqp_data().]
XinZhangMS 0:f7f1f0d76dd6 1100 BINARY_DATA binary_data;
XinZhangMS 0:f7f1f0d76dd6 1101 if (message_get_body_amqp_data_in_place(uamqp_message, 0, &binary_data) != 0)
XinZhangMS 0:f7f1f0d76dd6 1102 {
XinZhangMS 0:f7f1f0d76dd6 1103 // Codes_SRS_UAMQP_MESSAGING_09_005: [If message_get_body_amqp_data() fails, message_create_IoTHubMessage_from_uamqp_message shall fail and return immediately.]
XinZhangMS 0:f7f1f0d76dd6 1104 LogError("Failed to get the body of the uamqp message.");
XinZhangMS 0:f7f1f0d76dd6 1105 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 1106 }
XinZhangMS 0:f7f1f0d76dd6 1107 // Codes_SRS_UAMQP_MESSAGING_09_006: [The IOTHUB_MESSAGE instance shall be created using IoTHubMessage_CreateFromByteArray(), passing the uAMQP body bytes as parameter.]
XinZhangMS 0:f7f1f0d76dd6 1108 else if ((iothub_message = IoTHubMessage_CreateFromByteArray(binary_data.bytes, binary_data.length)) == NULL)
XinZhangMS 0:f7f1f0d76dd6 1109 {
XinZhangMS 0:f7f1f0d76dd6 1110 // Codes_SRS_UAMQP_MESSAGING_09_007: [If IoTHubMessage_CreateFromByteArray() fails, message_create_IoTHubMessage_from_uamqp_message shall fail and return immediately.]
XinZhangMS 0:f7f1f0d76dd6 1111 LogError("Failed creating the IOTHUB_MESSAGE_HANDLE instance (IoTHubMessage_CreateFromByteArray failed).");
XinZhangMS 0:f7f1f0d76dd6 1112 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 1113 }
XinZhangMS 0:f7f1f0d76dd6 1114 }
XinZhangMS 0:f7f1f0d76dd6 1115 }
XinZhangMS 0:f7f1f0d76dd6 1116
XinZhangMS 0:f7f1f0d76dd6 1117 if (iothub_message != NULL)
XinZhangMS 0:f7f1f0d76dd6 1118 {
XinZhangMS 0:f7f1f0d76dd6 1119 if (readPropertiesFromuAMQPMessage(iothub_message, uamqp_message) != RESULT_OK)
XinZhangMS 0:f7f1f0d76dd6 1120 {
XinZhangMS 0:f7f1f0d76dd6 1121 LogError("Failed reading properties of the uamqp message.");
XinZhangMS 0:f7f1f0d76dd6 1122 IoTHubMessage_Destroy(iothub_message);
XinZhangMS 0:f7f1f0d76dd6 1123 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 1124 }
XinZhangMS 0:f7f1f0d76dd6 1125 else if (readApplicationPropertiesFromuAMQPMessage(iothub_message, uamqp_message) != RESULT_OK)
XinZhangMS 0:f7f1f0d76dd6 1126 {
XinZhangMS 0:f7f1f0d76dd6 1127 LogError("Failed reading application properties of the uamqp message.");
XinZhangMS 0:f7f1f0d76dd6 1128 IoTHubMessage_Destroy(iothub_message);
XinZhangMS 0:f7f1f0d76dd6 1129 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 1130 }
XinZhangMS 0:f7f1f0d76dd6 1131 else
XinZhangMS 0:f7f1f0d76dd6 1132 {
XinZhangMS 0:f7f1f0d76dd6 1133 *iothubclient_message = iothub_message;
XinZhangMS 0:f7f1f0d76dd6 1134 result = RESULT_OK;
XinZhangMS 0:f7f1f0d76dd6 1135 }
XinZhangMS 0:f7f1f0d76dd6 1136 }
XinZhangMS 0:f7f1f0d76dd6 1137
XinZhangMS 0:f7f1f0d76dd6 1138 return result;
XinZhangMS 0:f7f1f0d76dd6 1139 }
XinZhangMS 0:f7f1f0d76dd6 1140