A small memory footprint AMQP implimentation

Dependents:   iothub_client_sample_amqp remote_monitoring simplesample_amqp

Committer:
AzureIoTClient
Date:
Thu Oct 04 09:16:13 2018 -0700
Revision:
47:365a93fdb5bb
Parent:
46:01f7ca900e07
1.2.10

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Azure.IoT Build 0:6ae2f7bca550 1 // Copyright (c) Microsoft. All rights reserved.
Azure.IoT Build 0:6ae2f7bca550 2 // Licensed under the MIT license. See LICENSE file in the project root for full license information.
Azure.IoT Build 0:6ae2f7bca550 3
Azure.IoT Build 0:6ae2f7bca550 4 #include <stdlib.h>
AzureIoTClient 6:641a9672db08 5 #include <stdbool.h>
Azure.IoT Build 0:6ae2f7bca550 6 #include <string.h>
AzureIoTClient 19:000ab4e6a2c1 7 #include "azure_c_shared_utility/optimize_size.h"
AzureIoTClient 21:f9c433d8e6ca 8 #include "azure_c_shared_utility/gballoc.h"
Azure.IoT Build 5:ae49385aff34 9 #include "azure_c_shared_utility/xlogging.h"
AzureIoTClient 34:6be9c2058664 10 #include "azure_c_shared_utility/tickcounter.h"
AzureIoTClient 40:f0ceafa8d570 11 #include "azure_uamqp_c/link.h"
AzureIoTClient 40:f0ceafa8d570 12 #include "azure_uamqp_c/message.h"
Azure.IoT Build 0:6ae2f7bca550 13 #include "azure_uamqp_c/message_sender.h"
Azure.IoT Build 0:6ae2f7bca550 14 #include "azure_uamqp_c/amqpvalue_to_string.h"
AzureIoTClient 34:6be9c2058664 15 #include "azure_uamqp_c/async_operation.h"
AzureIoTClient 40:f0ceafa8d570 16 #include "azure_uamqp_c/amqp_definitions.h"
Azure.IoT Build 0:6ae2f7bca550 17
Azure.IoT Build 0:6ae2f7bca550 18 typedef enum MESSAGE_SEND_STATE_TAG
Azure.IoT Build 0:6ae2f7bca550 19 {
AzureIoTClient 6:641a9672db08 20 MESSAGE_SEND_STATE_NOT_SENT,
AzureIoTClient 6:641a9672db08 21 MESSAGE_SEND_STATE_PENDING
Azure.IoT Build 0:6ae2f7bca550 22 } MESSAGE_SEND_STATE;
Azure.IoT Build 0:6ae2f7bca550 23
Azure.IoT Build 0:6ae2f7bca550 24 typedef enum SEND_ONE_MESSAGE_RESULT_TAG
Azure.IoT Build 0:6ae2f7bca550 25 {
AzureIoTClient 6:641a9672db08 26 SEND_ONE_MESSAGE_OK,
AzureIoTClient 6:641a9672db08 27 SEND_ONE_MESSAGE_ERROR,
AzureIoTClient 6:641a9672db08 28 SEND_ONE_MESSAGE_BUSY
Azure.IoT Build 0:6ae2f7bca550 29 } SEND_ONE_MESSAGE_RESULT;
Azure.IoT Build 0:6ae2f7bca550 30
Azure.IoT Build 0:6ae2f7bca550 31 typedef struct MESSAGE_WITH_CALLBACK_TAG
Azure.IoT Build 0:6ae2f7bca550 32 {
AzureIoTClient 6:641a9672db08 33 MESSAGE_HANDLE message;
AzureIoTClient 6:641a9672db08 34 ON_MESSAGE_SEND_COMPLETE on_message_send_complete;
AzureIoTClient 6:641a9672db08 35 void* context;
AzureIoTClient 6:641a9672db08 36 MESSAGE_SENDER_HANDLE message_sender;
AzureIoTClient 6:641a9672db08 37 MESSAGE_SEND_STATE message_send_state;
AzureIoTClient 34:6be9c2058664 38 tickcounter_ms_t timeout;
Azure.IoT Build 0:6ae2f7bca550 39 } MESSAGE_WITH_CALLBACK;
Azure.IoT Build 0:6ae2f7bca550 40
AzureIoTClient 34:6be9c2058664 41 DEFINE_ASYNC_OPERATION_CONTEXT(MESSAGE_WITH_CALLBACK);
AzureIoTClient 34:6be9c2058664 42
Azure.IoT Build 0:6ae2f7bca550 43 typedef struct MESSAGE_SENDER_INSTANCE_TAG
Azure.IoT Build 0:6ae2f7bca550 44 {
AzureIoTClient 6:641a9672db08 45 LINK_HANDLE link;
AzureIoTClient 6:641a9672db08 46 size_t message_count;
AzureIoTClient 34:6be9c2058664 47 ASYNC_OPERATION_HANDLE* messages;
AzureIoTClient 6:641a9672db08 48 MESSAGE_SENDER_STATE message_sender_state;
AzureIoTClient 6:641a9672db08 49 ON_MESSAGE_SENDER_STATE_CHANGED on_message_sender_state_changed;
AzureIoTClient 6:641a9672db08 50 void* on_message_sender_state_changed_context;
AzureIoTClient 6:641a9672db08 51 unsigned int is_trace_on : 1;
Azure.IoT Build 0:6ae2f7bca550 52 } MESSAGE_SENDER_INSTANCE;
Azure.IoT Build 0:6ae2f7bca550 53
AzureIoTClient 34:6be9c2058664 54 static void remove_pending_message_by_index(MESSAGE_SENDER_HANDLE message_sender, size_t index)
Azure.IoT Build 0:6ae2f7bca550 55 {
AzureIoTClient 34:6be9c2058664 56 ASYNC_OPERATION_HANDLE* new_messages;
AzureIoTClient 34:6be9c2058664 57 MESSAGE_WITH_CALLBACK* message_with_callback = GET_ASYNC_OPERATION_CONTEXT(MESSAGE_WITH_CALLBACK, message_sender->messages[index]);
Azure.IoT Build 0:6ae2f7bca550 58
AzureIoTClient 34:6be9c2058664 59 if (message_with_callback->message != NULL)
AzureIoTClient 6:641a9672db08 60 {
AzureIoTClient 34:6be9c2058664 61 message_destroy(message_with_callback->message);
AzureIoTClient 34:6be9c2058664 62 message_with_callback->message = NULL;
AzureIoTClient 6:641a9672db08 63 }
Azure.IoT Build 0:6ae2f7bca550 64
AzureIoTClient 34:6be9c2058664 65 async_operation_destroy(message_sender->messages[index]);
Azure.IoT Build 0:6ae2f7bca550 66
AzureIoTClient 34:6be9c2058664 67 if (message_sender->message_count - index > 1)
AzureIoTClient 6:641a9672db08 68 {
AzureIoTClient 34:6be9c2058664 69 (void)memmove(&message_sender->messages[index], &message_sender->messages[index + 1], sizeof(ASYNC_OPERATION_HANDLE) * (message_sender->message_count - index - 1));
AzureIoTClient 6:641a9672db08 70 }
Azure.IoT Build 0:6ae2f7bca550 71
AzureIoTClient 34:6be9c2058664 72 message_sender->message_count--;
Azure.IoT Build 0:6ae2f7bca550 73
AzureIoTClient 34:6be9c2058664 74 if (message_sender->message_count > 0)
AzureIoTClient 6:641a9672db08 75 {
AzureIoTClient 34:6be9c2058664 76 new_messages = (ASYNC_OPERATION_HANDLE*)realloc(message_sender->messages, sizeof(ASYNC_OPERATION_HANDLE) * (message_sender->message_count));
AzureIoTClient 6:641a9672db08 77 if (new_messages != NULL)
AzureIoTClient 6:641a9672db08 78 {
AzureIoTClient 34:6be9c2058664 79 message_sender->messages = new_messages;
AzureIoTClient 6:641a9672db08 80 }
AzureIoTClient 6:641a9672db08 81 }
AzureIoTClient 6:641a9672db08 82 else
AzureIoTClient 6:641a9672db08 83 {
AzureIoTClient 34:6be9c2058664 84 free(message_sender->messages);
AzureIoTClient 34:6be9c2058664 85 message_sender->messages = NULL;
AzureIoTClient 6:641a9672db08 86 }
Azure.IoT Build 0:6ae2f7bca550 87 }
Azure.IoT Build 0:6ae2f7bca550 88
AzureIoTClient 34:6be9c2058664 89 static void remove_pending_message(MESSAGE_SENDER_INSTANCE* message_sender, ASYNC_OPERATION_HANDLE pending_send)
Azure.IoT Build 0:6ae2f7bca550 90 {
AzureIoTClient 6:641a9672db08 91 size_t i;
Azure.IoT Build 0:6ae2f7bca550 92
AzureIoTClient 34:6be9c2058664 93 for (i = 0; i < message_sender->message_count; i++)
AzureIoTClient 6:641a9672db08 94 {
AzureIoTClient 34:6be9c2058664 95 if (message_sender->messages[i] == pending_send)
AzureIoTClient 6:641a9672db08 96 {
AzureIoTClient 34:6be9c2058664 97 remove_pending_message_by_index(message_sender, i);
AzureIoTClient 6:641a9672db08 98 break;
AzureIoTClient 6:641a9672db08 99 }
AzureIoTClient 6:641a9672db08 100 }
Azure.IoT Build 0:6ae2f7bca550 101 }
Azure.IoT Build 0:6ae2f7bca550 102
AzureIoTClient 23:1111ee8bcba4 103 static void on_delivery_settled(void* context, delivery_number delivery_no, LINK_DELIVERY_SETTLE_REASON reason, AMQP_VALUE delivery_state)
Azure.IoT Build 0:6ae2f7bca550 104 {
AzureIoTClient 34:6be9c2058664 105 ASYNC_OPERATION_HANDLE pending_send = (ASYNC_OPERATION_HANDLE)context;
AzureIoTClient 34:6be9c2058664 106 MESSAGE_WITH_CALLBACK* message_with_callback = GET_ASYNC_OPERATION_CONTEXT(MESSAGE_WITH_CALLBACK, pending_send);
AzureIoTClient 34:6be9c2058664 107 MESSAGE_SENDER_INSTANCE* message_sender = (MESSAGE_SENDER_INSTANCE*)message_with_callback->message_sender;
AzureIoTClient 6:641a9672db08 108 (void)delivery_no;
Azure.IoT Build 0:6ae2f7bca550 109
AzureIoTClient 6:641a9672db08 110 if (message_with_callback->on_message_send_complete != NULL)
AzureIoTClient 6:641a9672db08 111 {
AzureIoTClient 23:1111ee8bcba4 112 switch (reason)
AzureIoTClient 7:9e9ab3b0efef 113 {
AzureIoTClient 23:1111ee8bcba4 114 case LINK_DELIVERY_SETTLE_REASON_DISPOSITION_RECEIVED:
AzureIoTClient 23:1111ee8bcba4 115 if (delivery_state == NULL)
AzureIoTClient 7:9e9ab3b0efef 116 {
AzureIoTClient 23:1111ee8bcba4 117 LogError("delivery state not provided");
AzureIoTClient 7:9e9ab3b0efef 118 }
AzureIoTClient 7:9e9ab3b0efef 119 else
AzureIoTClient 7:9e9ab3b0efef 120 {
AzureIoTClient 23:1111ee8bcba4 121 AMQP_VALUE descriptor = amqpvalue_get_inplace_descriptor(delivery_state);
AzureIoTClient 46:01f7ca900e07 122 AMQP_VALUE described = amqpvalue_get_inplace_described_value(delivery_state);
AzureIoTClient 23:1111ee8bcba4 123
AzureIoTClient 23:1111ee8bcba4 124 if (descriptor == NULL)
AzureIoTClient 23:1111ee8bcba4 125 {
AzureIoTClient 23:1111ee8bcba4 126 LogError("Error getting descriptor for delivery state");
AzureIoTClient 23:1111ee8bcba4 127 }
AzureIoTClient 23:1111ee8bcba4 128 else if (is_accepted_type_by_descriptor(descriptor))
AzureIoTClient 23:1111ee8bcba4 129 {
AzureIoTClient 46:01f7ca900e07 130 message_with_callback->on_message_send_complete(message_with_callback->context, MESSAGE_SEND_OK, described);
AzureIoTClient 23:1111ee8bcba4 131 }
AzureIoTClient 23:1111ee8bcba4 132 else
AzureIoTClient 23:1111ee8bcba4 133 {
AzureIoTClient 46:01f7ca900e07 134 message_with_callback->on_message_send_complete(message_with_callback->context, MESSAGE_SEND_ERROR, described);
AzureIoTClient 23:1111ee8bcba4 135 }
AzureIoTClient 7:9e9ab3b0efef 136 }
AzureIoTClient 7:9e9ab3b0efef 137
AzureIoTClient 23:1111ee8bcba4 138 break;
AzureIoTClient 23:1111ee8bcba4 139 case LINK_DELIVERY_SETTLE_REASON_SETTLED:
AzureIoTClient 46:01f7ca900e07 140 message_with_callback->on_message_send_complete(message_with_callback->context, MESSAGE_SEND_OK, NULL);
AzureIoTClient 23:1111ee8bcba4 141 break;
AzureIoTClient 34:6be9c2058664 142 case LINK_DELIVERY_SETTLE_REASON_TIMEOUT:
AzureIoTClient 46:01f7ca900e07 143 message_with_callback->on_message_send_complete(message_with_callback->context, MESSAGE_SEND_TIMEOUT, NULL);
AzureIoTClient 34:6be9c2058664 144 break;
AzureIoTClient 23:1111ee8bcba4 145 case LINK_DELIVERY_SETTLE_REASON_NOT_DELIVERED:
AzureIoTClient 23:1111ee8bcba4 146 default:
AzureIoTClient 46:01f7ca900e07 147 message_with_callback->on_message_send_complete(message_with_callback->context, MESSAGE_SEND_ERROR, NULL);
AzureIoTClient 23:1111ee8bcba4 148 break;
AzureIoTClient 7:9e9ab3b0efef 149 }
AzureIoTClient 6:641a9672db08 150 }
Azure.IoT Build 0:6ae2f7bca550 151
AzureIoTClient 34:6be9c2058664 152 remove_pending_message(message_sender, pending_send);
Azure.IoT Build 0:6ae2f7bca550 153 }
Azure.IoT Build 0:6ae2f7bca550 154
Azure.IoT Build 0:6ae2f7bca550 155 static int encode_bytes(void* context, const unsigned char* bytes, size_t length)
Azure.IoT Build 0:6ae2f7bca550 156 {
AzureIoTClient 6:641a9672db08 157 PAYLOAD* payload = (PAYLOAD*)context;
AzureIoTClient 6:641a9672db08 158 (void)memcpy((unsigned char*)payload->bytes + payload->length, bytes, length);
AzureIoTClient 6:641a9672db08 159 payload->length += length;
AzureIoTClient 6:641a9672db08 160 return 0;
Azure.IoT Build 0:6ae2f7bca550 161 }
Azure.IoT Build 0:6ae2f7bca550 162
AzureIoTClient 34:6be9c2058664 163 static void log_message_chunk(MESSAGE_SENDER_INSTANCE* message_sender, const char* name, AMQP_VALUE value)
Azure.IoT Build 0:6ae2f7bca550 164 {
AzureIoTClient 9:c22db038556c 165 #ifdef NO_LOGGING
AzureIoTClient 45:83b4eda4891c 166 (void)message_sender;
AzureIoTClient 45:83b4eda4891c 167 (void)name;
AzureIoTClient 45:83b4eda4891c 168 (void)value;
AzureIoTClient 9:c22db038556c 169 #else
AzureIoTClient 34:6be9c2058664 170 if (xlogging_get_log_function() != NULL && message_sender->is_trace_on == 1)
AzureIoTClient 6:641a9672db08 171 {
AzureIoTClient 6:641a9672db08 172 char* value_as_string = NULL;
AzureIoTClient 34:6be9c2058664 173 LOG(AZ_LOG_TRACE, 0, "%s", P_OR_NULL(name));
AzureIoTClient 45:83b4eda4891c 174 LOG(AZ_LOG_TRACE, 0, "%s", ((value_as_string = amqpvalue_to_string(value)), P_OR_NULL(value_as_string)));
AzureIoTClient 6:641a9672db08 175 if (value_as_string != NULL)
AzureIoTClient 6:641a9672db08 176 {
AzureIoTClient 21:f9c433d8e6ca 177 free(value_as_string);
AzureIoTClient 6:641a9672db08 178 }
AzureIoTClient 6:641a9672db08 179 }
AzureIoTClient 9:c22db038556c 180 #endif
Azure.IoT Build 0:6ae2f7bca550 181 }
Azure.IoT Build 0:6ae2f7bca550 182
AzureIoTClient 34:6be9c2058664 183 static SEND_ONE_MESSAGE_RESULT send_one_message(MESSAGE_SENDER_INSTANCE* message_sender, ASYNC_OPERATION_HANDLE pending_send, MESSAGE_HANDLE message)
Azure.IoT Build 0:6ae2f7bca550 184 {
AzureIoTClient 6:641a9672db08 185 SEND_ONE_MESSAGE_RESULT result;
Azure.IoT Build 0:6ae2f7bca550 186
AzureIoTClient 6:641a9672db08 187 size_t encoded_size;
AzureIoTClient 6:641a9672db08 188 size_t total_encoded_size = 0;
AzureIoTClient 6:641a9672db08 189 MESSAGE_BODY_TYPE message_body_type;
Azure.IoT Build 0:6ae2f7bca550 190 message_format message_format;
Azure.IoT Build 0:6ae2f7bca550 191
AzureIoTClient 6:641a9672db08 192 if ((message_get_body_type(message, &message_body_type) != 0) ||
Azure.IoT Build 0:6ae2f7bca550 193 (message_get_message_format(message, &message_format) != 0))
AzureIoTClient 6:641a9672db08 194 {
AzureIoTClient 29:4a11413cf217 195 LogError("Failure getting message body type and/or message format");
AzureIoTClient 6:641a9672db08 196 result = SEND_ONE_MESSAGE_ERROR;
AzureIoTClient 6:641a9672db08 197 }
AzureIoTClient 6:641a9672db08 198 else
AzureIoTClient 6:641a9672db08 199 {
AzureIoTClient 6:641a9672db08 200 // header
AzureIoTClient 31:cafc87baef79 201 HEADER_HANDLE header = NULL;
AzureIoTClient 31:cafc87baef79 202 AMQP_VALUE header_amqp_value = NULL;
AzureIoTClient 31:cafc87baef79 203 PROPERTIES_HANDLE properties = NULL;
AzureIoTClient 31:cafc87baef79 204 AMQP_VALUE properties_amqp_value = NULL;
AzureIoTClient 31:cafc87baef79 205 AMQP_VALUE application_properties = NULL;
AzureIoTClient 31:cafc87baef79 206 AMQP_VALUE application_properties_value = NULL;
AzureIoTClient 6:641a9672db08 207 AMQP_VALUE body_amqp_value = NULL;
AzureIoTClient 6:641a9672db08 208 size_t body_data_count = 0;
AzureIoTClient 13:9abd748f4e78 209 AMQP_VALUE msg_annotations = NULL;
AzureIoTClient 34:6be9c2058664 210 bool is_error = false;
Azure.IoT Build 0:6ae2f7bca550 211
AzureIoTClient 34:6be9c2058664 212 // message header
AzureIoTClient 34:6be9c2058664 213 if ((message_get_header(message, &header) == 0) &&
AzureIoTClient 34:6be9c2058664 214 (header != NULL))
AzureIoTClient 6:641a9672db08 215 {
AzureIoTClient 34:6be9c2058664 216 header_amqp_value = amqpvalue_create_header(header);
AzureIoTClient 34:6be9c2058664 217 if (header_amqp_value == NULL)
AzureIoTClient 34:6be9c2058664 218 {
AzureIoTClient 34:6be9c2058664 219 LogError("Cannot create header AMQP value");
AzureIoTClient 34:6be9c2058664 220 is_error = true;
AzureIoTClient 34:6be9c2058664 221 }
AzureIoTClient 34:6be9c2058664 222 else
AzureIoTClient 34:6be9c2058664 223 {
AzureIoTClient 34:6be9c2058664 224 if (amqpvalue_get_encoded_size(header_amqp_value, &encoded_size) != 0)
AzureIoTClient 34:6be9c2058664 225 {
AzureIoTClient 34:6be9c2058664 226 LogError("Cannot obtain header encoded size");
AzureIoTClient 34:6be9c2058664 227 is_error = true;
AzureIoTClient 34:6be9c2058664 228 }
AzureIoTClient 34:6be9c2058664 229 else
AzureIoTClient 34:6be9c2058664 230 {
AzureIoTClient 34:6be9c2058664 231 total_encoded_size += encoded_size;
AzureIoTClient 34:6be9c2058664 232 }
AzureIoTClient 34:6be9c2058664 233 }
AzureIoTClient 34:6be9c2058664 234
AzureIoTClient 6:641a9672db08 235 }
Azure.IoT Build 0:6ae2f7bca550 236
AzureIoTClient 13:9abd748f4e78 237 // message annotations
AzureIoTClient 34:6be9c2058664 238 if ((!is_error) &&
AzureIoTClient 34:6be9c2058664 239 (message_get_message_annotations(message, &msg_annotations) == 0) &&
AzureIoTClient 13:9abd748f4e78 240 (msg_annotations != NULL))
AzureIoTClient 13:9abd748f4e78 241 {
AzureIoTClient 34:6be9c2058664 242 if (amqpvalue_get_encoded_size(msg_annotations, &encoded_size) != 0)
AzureIoTClient 34:6be9c2058664 243 {
AzureIoTClient 34:6be9c2058664 244 LogError("Cannot obtain message annotations encoded size");
AzureIoTClient 34:6be9c2058664 245 is_error = true;
AzureIoTClient 34:6be9c2058664 246 }
AzureIoTClient 34:6be9c2058664 247 else
AzureIoTClient 34:6be9c2058664 248 {
AzureIoTClient 34:6be9c2058664 249 total_encoded_size += encoded_size;
AzureIoTClient 34:6be9c2058664 250 }
AzureIoTClient 13:9abd748f4e78 251 }
AzureIoTClient 13:9abd748f4e78 252
AzureIoTClient 6:641a9672db08 253 // properties
AzureIoTClient 34:6be9c2058664 254 if ((!is_error) &&
AzureIoTClient 34:6be9c2058664 255 (message_get_properties(message, &properties) == 0) &&
AzureIoTClient 34:6be9c2058664 256 (properties != NULL))
AzureIoTClient 6:641a9672db08 257 {
AzureIoTClient 34:6be9c2058664 258 properties_amqp_value = amqpvalue_create_properties(properties);
AzureIoTClient 34:6be9c2058664 259 if (properties_amqp_value == NULL)
AzureIoTClient 34:6be9c2058664 260 {
AzureIoTClient 34:6be9c2058664 261 LogError("Cannot create message properties AMQP value");
AzureIoTClient 34:6be9c2058664 262 is_error = true;
AzureIoTClient 34:6be9c2058664 263 }
AzureIoTClient 34:6be9c2058664 264 else
AzureIoTClient 34:6be9c2058664 265 {
AzureIoTClient 34:6be9c2058664 266 if (amqpvalue_get_encoded_size(properties_amqp_value, &encoded_size) != 0)
AzureIoTClient 34:6be9c2058664 267 {
AzureIoTClient 34:6be9c2058664 268 LogError("Cannot obtain message properties encoded size");
AzureIoTClient 34:6be9c2058664 269 is_error = true;
AzureIoTClient 34:6be9c2058664 270 }
AzureIoTClient 34:6be9c2058664 271 else
AzureIoTClient 34:6be9c2058664 272 {
AzureIoTClient 34:6be9c2058664 273 total_encoded_size += encoded_size;
AzureIoTClient 34:6be9c2058664 274 }
AzureIoTClient 34:6be9c2058664 275 }
AzureIoTClient 6:641a9672db08 276 }
Azure.IoT Build 0:6ae2f7bca550 277
AzureIoTClient 6:641a9672db08 278 // application properties
AzureIoTClient 34:6be9c2058664 279 if ((!is_error) &&
AzureIoTClient 34:6be9c2058664 280 (message_get_application_properties(message, &application_properties) == 0) &&
AzureIoTClient 34:6be9c2058664 281 (application_properties != NULL))
AzureIoTClient 6:641a9672db08 282 {
AzureIoTClient 23:1111ee8bcba4 283 application_properties_value = amqpvalue_create_application_properties(application_properties);
AzureIoTClient 34:6be9c2058664 284 if (application_properties_value == NULL)
AzureIoTClient 34:6be9c2058664 285 {
AzureIoTClient 34:6be9c2058664 286 LogError("Cannot create application properties AMQP value");
AzureIoTClient 34:6be9c2058664 287 is_error = true;
AzureIoTClient 34:6be9c2058664 288 }
AzureIoTClient 34:6be9c2058664 289 else
AzureIoTClient 34:6be9c2058664 290 {
AzureIoTClient 34:6be9c2058664 291 if (amqpvalue_get_encoded_size(application_properties_value, &encoded_size) != 0)
AzureIoTClient 34:6be9c2058664 292 {
AzureIoTClient 34:6be9c2058664 293 LogError("Cannot obtain application properties encoded size");
AzureIoTClient 34:6be9c2058664 294 is_error = true;
AzureIoTClient 34:6be9c2058664 295 }
AzureIoTClient 34:6be9c2058664 296 else
AzureIoTClient 34:6be9c2058664 297 {
AzureIoTClient 34:6be9c2058664 298 total_encoded_size += encoded_size;
AzureIoTClient 34:6be9c2058664 299 }
AzureIoTClient 34:6be9c2058664 300 }
AzureIoTClient 34:6be9c2058664 301 }
AzureIoTClient 34:6be9c2058664 302
AzureIoTClient 34:6be9c2058664 303 if (is_error)
AzureIoTClient 34:6be9c2058664 304 {
AzureIoTClient 34:6be9c2058664 305 result = SEND_ONE_MESSAGE_ERROR;
AzureIoTClient 6:641a9672db08 306 }
AzureIoTClient 23:1111ee8bcba4 307 else
AzureIoTClient 23:1111ee8bcba4 308 {
AzureIoTClient 34:6be9c2058664 309 result = SEND_ONE_MESSAGE_OK;
Azure.IoT Build 0:6ae2f7bca550 310
AzureIoTClient 34:6be9c2058664 311 // body - amqp data
AzureIoTClient 34:6be9c2058664 312 switch (message_body_type)
AzureIoTClient 34:6be9c2058664 313 {
AzureIoTClient 6:641a9672db08 314 default:
AzureIoTClient 34:6be9c2058664 315 LogError("Unknown body type");
AzureIoTClient 6:641a9672db08 316 result = SEND_ONE_MESSAGE_ERROR;
AzureIoTClient 6:641a9672db08 317 break;
Azure.IoT Build 0:6ae2f7bca550 318
AzureIoTClient 6:641a9672db08 319 case MESSAGE_BODY_TYPE_VALUE:
AzureIoTClient 6:641a9672db08 320 {
AzureIoTClient 6:641a9672db08 321 AMQP_VALUE message_body_amqp_value;
AzureIoTClient 24:2c59c2d43ebf 322 if (message_get_body_amqp_value_in_place(message, &message_body_amqp_value) != 0)
AzureIoTClient 6:641a9672db08 323 {
AzureIoTClient 34:6be9c2058664 324 LogError("Cannot obtain AMQP value from body");
AzureIoTClient 6:641a9672db08 325 result = SEND_ONE_MESSAGE_ERROR;
AzureIoTClient 6:641a9672db08 326 }
AzureIoTClient 6:641a9672db08 327 else
AzureIoTClient 6:641a9672db08 328 {
AzureIoTClient 6:641a9672db08 329 body_amqp_value = amqpvalue_create_amqp_value(message_body_amqp_value);
AzureIoTClient 34:6be9c2058664 330 if (body_amqp_value == NULL)
AzureIoTClient 6:641a9672db08 331 {
AzureIoTClient 34:6be9c2058664 332 LogError("Cannot create body AMQP value");
AzureIoTClient 6:641a9672db08 333 result = SEND_ONE_MESSAGE_ERROR;
AzureIoTClient 6:641a9672db08 334 }
AzureIoTClient 6:641a9672db08 335 else
AzureIoTClient 6:641a9672db08 336 {
AzureIoTClient 34:6be9c2058664 337 if (amqpvalue_get_encoded_size(body_amqp_value, &encoded_size) != 0)
AzureIoTClient 34:6be9c2058664 338 {
AzureIoTClient 34:6be9c2058664 339 LogError("Cannot get body AMQP value encoded size");
AzureIoTClient 34:6be9c2058664 340 result = SEND_ONE_MESSAGE_ERROR;
AzureIoTClient 34:6be9c2058664 341 }
AzureIoTClient 34:6be9c2058664 342 else
AzureIoTClient 34:6be9c2058664 343 {
AzureIoTClient 34:6be9c2058664 344 total_encoded_size += encoded_size;
AzureIoTClient 34:6be9c2058664 345 }
AzureIoTClient 6:641a9672db08 346 }
AzureIoTClient 6:641a9672db08 347 }
Azure.IoT Build 0:6ae2f7bca550 348
AzureIoTClient 6:641a9672db08 349 break;
AzureIoTClient 6:641a9672db08 350 }
Azure.IoT Build 0:6ae2f7bca550 351
AzureIoTClient 6:641a9672db08 352 case MESSAGE_BODY_TYPE_DATA:
AzureIoTClient 6:641a9672db08 353 {
AzureIoTClient 6:641a9672db08 354 BINARY_DATA binary_data;
Azure.IoT Build 0:6ae2f7bca550 355 size_t i;
Azure.IoT Build 0:6ae2f7bca550 356
Azure.IoT Build 0:6ae2f7bca550 357 if (message_get_body_amqp_data_count(message, &body_data_count) != 0)
Azure.IoT Build 0:6ae2f7bca550 358 {
AzureIoTClient 34:6be9c2058664 359 LogError("Cannot get body AMQP data count");
Azure.IoT Build 0:6ae2f7bca550 360 result = SEND_ONE_MESSAGE_ERROR;
Azure.IoT Build 0:6ae2f7bca550 361 }
Azure.IoT Build 0:6ae2f7bca550 362 else
Azure.IoT Build 0:6ae2f7bca550 363 {
AzureIoTClient 46:01f7ca900e07 364 if (body_data_count == 0)
Azure.IoT Build 0:6ae2f7bca550 365 {
AzureIoTClient 46:01f7ca900e07 366 LogError("Body data count is zero");
AzureIoTClient 46:01f7ca900e07 367 result = SEND_ONE_MESSAGE_ERROR;
AzureIoTClient 46:01f7ca900e07 368 }
AzureIoTClient 46:01f7ca900e07 369 else
AzureIoTClient 46:01f7ca900e07 370 {
AzureIoTClient 46:01f7ca900e07 371 for (i = 0; i < body_data_count; i++)
Azure.IoT Build 0:6ae2f7bca550 372 {
AzureIoTClient 46:01f7ca900e07 373 if (message_get_body_amqp_data_in_place(message, i, &binary_data) != 0)
Azure.IoT Build 0:6ae2f7bca550 374 {
AzureIoTClient 46:01f7ca900e07 375 LogError("Cannot get body AMQP data %u", (unsigned int)i);
Azure.IoT Build 0:6ae2f7bca550 376 result = SEND_ONE_MESSAGE_ERROR;
Azure.IoT Build 0:6ae2f7bca550 377 }
Azure.IoT Build 0:6ae2f7bca550 378 else
Azure.IoT Build 0:6ae2f7bca550 379 {
AzureIoTClient 46:01f7ca900e07 380 AMQP_VALUE body_amqp_data;
AzureIoTClient 46:01f7ca900e07 381 amqp_binary binary_value;
AzureIoTClient 46:01f7ca900e07 382 binary_value.bytes = binary_data.bytes;
AzureIoTClient 46:01f7ca900e07 383 binary_value.length = (uint32_t)binary_data.length;
AzureIoTClient 46:01f7ca900e07 384 body_amqp_data = amqpvalue_create_data(binary_value);
AzureIoTClient 46:01f7ca900e07 385 if (body_amqp_data == NULL)
Azure.IoT Build 0:6ae2f7bca550 386 {
AzureIoTClient 46:01f7ca900e07 387 LogError("Cannot create body AMQP data");
Azure.IoT Build 0:6ae2f7bca550 388 result = SEND_ONE_MESSAGE_ERROR;
Azure.IoT Build 0:6ae2f7bca550 389 }
Azure.IoT Build 0:6ae2f7bca550 390 else
Azure.IoT Build 0:6ae2f7bca550 391 {
AzureIoTClient 46:01f7ca900e07 392 if (amqpvalue_get_encoded_size(body_amqp_data, &encoded_size) != 0)
AzureIoTClient 46:01f7ca900e07 393 {
AzureIoTClient 46:01f7ca900e07 394 LogError("Cannot get body AMQP data encoded size");
AzureIoTClient 46:01f7ca900e07 395 result = SEND_ONE_MESSAGE_ERROR;
AzureIoTClient 46:01f7ca900e07 396 }
AzureIoTClient 46:01f7ca900e07 397 else
AzureIoTClient 46:01f7ca900e07 398 {
AzureIoTClient 46:01f7ca900e07 399 total_encoded_size += encoded_size;
AzureIoTClient 46:01f7ca900e07 400 }
AzureIoTClient 46:01f7ca900e07 401
AzureIoTClient 46:01f7ca900e07 402 amqpvalue_destroy(body_amqp_data);
Azure.IoT Build 0:6ae2f7bca550 403 }
Azure.IoT Build 0:6ae2f7bca550 404 }
Azure.IoT Build 0:6ae2f7bca550 405 }
Azure.IoT Build 0:6ae2f7bca550 406 }
Azure.IoT Build 0:6ae2f7bca550 407 }
AzureIoTClient 6:641a9672db08 408 break;
AzureIoTClient 6:641a9672db08 409 }
AzureIoTClient 13:9abd748f4e78 410 }
AzureIoTClient 13:9abd748f4e78 411
AzureIoTClient 34:6be9c2058664 412 if (result == 0)
AzureIoTClient 6:641a9672db08 413 {
AzureIoTClient 34:6be9c2058664 414 void* data_bytes = malloc(total_encoded_size);
AzureIoTClient 34:6be9c2058664 415 PAYLOAD payload;
AzureIoTClient 34:6be9c2058664 416 payload.bytes = (const unsigned char*)data_bytes;
AzureIoTClient 34:6be9c2058664 417 payload.length = 0;
AzureIoTClient 34:6be9c2058664 418 result = SEND_ONE_MESSAGE_OK;
AzureIoTClient 34:6be9c2058664 419
AzureIoTClient 34:6be9c2058664 420 if (header != NULL)
AzureIoTClient 6:641a9672db08 421 {
AzureIoTClient 34:6be9c2058664 422 if (amqpvalue_encode(header_amqp_value, encode_bytes, &payload) != 0)
AzureIoTClient 34:6be9c2058664 423 {
AzureIoTClient 34:6be9c2058664 424 LogError("Cannot encode header value");
AzureIoTClient 34:6be9c2058664 425 result = SEND_ONE_MESSAGE_ERROR;
AzureIoTClient 34:6be9c2058664 426 }
AzureIoTClient 34:6be9c2058664 427
AzureIoTClient 34:6be9c2058664 428 log_message_chunk(message_sender, "Header:", header_amqp_value);
AzureIoTClient 6:641a9672db08 429 }
Azure.IoT Build 0:6ae2f7bca550 430
AzureIoTClient 34:6be9c2058664 431 if ((result == SEND_ONE_MESSAGE_OK) && (msg_annotations != NULL))
AzureIoTClient 34:6be9c2058664 432 {
AzureIoTClient 34:6be9c2058664 433 if (amqpvalue_encode(msg_annotations, encode_bytes, &payload) != 0)
AzureIoTClient 34:6be9c2058664 434 {
AzureIoTClient 34:6be9c2058664 435 LogError("Cannot encode message annotations value");
AzureIoTClient 34:6be9c2058664 436 result = SEND_ONE_MESSAGE_ERROR;
AzureIoTClient 34:6be9c2058664 437 }
Azure.IoT Build 0:6ae2f7bca550 438
AzureIoTClient 34:6be9c2058664 439 log_message_chunk(message_sender, "Message Annotations:", msg_annotations);
AzureIoTClient 6:641a9672db08 440 }
Azure.IoT Build 0:6ae2f7bca550 441
AzureIoTClient 34:6be9c2058664 442 if ((result == SEND_ONE_MESSAGE_OK) && (properties != NULL))
AzureIoTClient 6:641a9672db08 443 {
AzureIoTClient 34:6be9c2058664 444 if (amqpvalue_encode(properties_amqp_value, encode_bytes, &payload) != 0)
AzureIoTClient 6:641a9672db08 445 {
AzureIoTClient 34:6be9c2058664 446 LogError("Cannot encode message properties value");
AzureIoTClient 6:641a9672db08 447 result = SEND_ONE_MESSAGE_ERROR;
AzureIoTClient 6:641a9672db08 448 }
Azure.IoT Build 0:6ae2f7bca550 449
AzureIoTClient 34:6be9c2058664 450 log_message_chunk(message_sender, "Properties:", properties_amqp_value);
AzureIoTClient 6:641a9672db08 451 }
AzureIoTClient 34:6be9c2058664 452
AzureIoTClient 34:6be9c2058664 453 if ((result == SEND_ONE_MESSAGE_OK) && (application_properties != NULL))
AzureIoTClient 6:641a9672db08 454 {
AzureIoTClient 34:6be9c2058664 455 if (amqpvalue_encode(application_properties_value, encode_bytes, &payload) != 0)
AzureIoTClient 34:6be9c2058664 456 {
AzureIoTClient 34:6be9c2058664 457 LogError("Cannot encode application properties value");
AzureIoTClient 34:6be9c2058664 458 result = SEND_ONE_MESSAGE_ERROR;
AzureIoTClient 34:6be9c2058664 459 }
AzureIoTClient 34:6be9c2058664 460
AzureIoTClient 34:6be9c2058664 461 log_message_chunk(message_sender, "Application properties:", application_properties_value);
AzureIoTClient 34:6be9c2058664 462 }
Azure.IoT Build 0:6ae2f7bca550 463
AzureIoTClient 34:6be9c2058664 464 if (result == SEND_ONE_MESSAGE_OK)
AzureIoTClient 34:6be9c2058664 465 {
AzureIoTClient 34:6be9c2058664 466 switch (message_body_type)
Azure.IoT Build 0:6ae2f7bca550 467 {
AzureIoTClient 34:6be9c2058664 468 default:
AzureIoTClient 34:6be9c2058664 469 LogError("Unknown message type");
AzureIoTClient 34:6be9c2058664 470 result = SEND_ONE_MESSAGE_ERROR;
AzureIoTClient 34:6be9c2058664 471 break;
AzureIoTClient 34:6be9c2058664 472
AzureIoTClient 34:6be9c2058664 473 case MESSAGE_BODY_TYPE_VALUE:
AzureIoTClient 34:6be9c2058664 474 {
AzureIoTClient 34:6be9c2058664 475 if (amqpvalue_encode(body_amqp_value, encode_bytes, &payload) != 0)
Azure.IoT Build 0:6ae2f7bca550 476 {
AzureIoTClient 34:6be9c2058664 477 LogError("Cannot encode body AMQP value");
Azure.IoT Build 0:6ae2f7bca550 478 result = SEND_ONE_MESSAGE_ERROR;
Azure.IoT Build 0:6ae2f7bca550 479 }
AzureIoTClient 34:6be9c2058664 480
AzureIoTClient 34:6be9c2058664 481 log_message_chunk(message_sender, "Body - amqp value:", body_amqp_value);
AzureIoTClient 34:6be9c2058664 482 break;
AzureIoTClient 34:6be9c2058664 483 }
AzureIoTClient 34:6be9c2058664 484 case MESSAGE_BODY_TYPE_DATA:
AzureIoTClient 34:6be9c2058664 485 {
AzureIoTClient 34:6be9c2058664 486 BINARY_DATA binary_data;
AzureIoTClient 34:6be9c2058664 487 size_t i;
AzureIoTClient 34:6be9c2058664 488
AzureIoTClient 34:6be9c2058664 489 for (i = 0; i < body_data_count; i++)
Azure.IoT Build 0:6ae2f7bca550 490 {
AzureIoTClient 34:6be9c2058664 491 if (message_get_body_amqp_data_in_place(message, i, &binary_data) != 0)
Azure.IoT Build 0:6ae2f7bca550 492 {
AzureIoTClient 34:6be9c2058664 493 LogError("Cannot get AMQP data %u", (unsigned int)i);
Azure.IoT Build 0:6ae2f7bca550 494 result = SEND_ONE_MESSAGE_ERROR;
Azure.IoT Build 0:6ae2f7bca550 495 }
Azure.IoT Build 0:6ae2f7bca550 496 else
Azure.IoT Build 0:6ae2f7bca550 497 {
AzureIoTClient 34:6be9c2058664 498 AMQP_VALUE body_amqp_data;
AzureIoTClient 34:6be9c2058664 499 amqp_binary binary_value;
AzureIoTClient 34:6be9c2058664 500 binary_value.bytes = binary_data.bytes;
AzureIoTClient 34:6be9c2058664 501 binary_value.length = (uint32_t)binary_data.length;
AzureIoTClient 34:6be9c2058664 502 body_amqp_data = amqpvalue_create_data(binary_value);
AzureIoTClient 34:6be9c2058664 503 if (body_amqp_data == NULL)
Azure.IoT Build 0:6ae2f7bca550 504 {
AzureIoTClient 34:6be9c2058664 505 LogError("Cannot create body AMQP data %u", (unsigned int)i);
Azure.IoT Build 0:6ae2f7bca550 506 result = SEND_ONE_MESSAGE_ERROR;
Azure.IoT Build 0:6ae2f7bca550 507 }
AzureIoTClient 34:6be9c2058664 508 else
AzureIoTClient 34:6be9c2058664 509 {
AzureIoTClient 34:6be9c2058664 510 if (amqpvalue_encode(body_amqp_data, encode_bytes, &payload) != 0)
AzureIoTClient 34:6be9c2058664 511 {
AzureIoTClient 34:6be9c2058664 512 LogError("Cannot encode body AMQP data %u", (unsigned int)i);
AzureIoTClient 34:6be9c2058664 513 result = SEND_ONE_MESSAGE_ERROR;
AzureIoTClient 34:6be9c2058664 514 break;
AzureIoTClient 34:6be9c2058664 515 }
Azure.IoT Build 0:6ae2f7bca550 516
AzureIoTClient 34:6be9c2058664 517 amqpvalue_destroy(body_amqp_data);
AzureIoTClient 34:6be9c2058664 518 }
Azure.IoT Build 0:6ae2f7bca550 519 }
Azure.IoT Build 0:6ae2f7bca550 520 }
AzureIoTClient 34:6be9c2058664 521 break;
Azure.IoT Build 0:6ae2f7bca550 522 }
AzureIoTClient 34:6be9c2058664 523 }
AzureIoTClient 6:641a9672db08 524 }
Azure.IoT Build 0:6ae2f7bca550 525
AzureIoTClient 34:6be9c2058664 526 if (result == SEND_ONE_MESSAGE_OK)
AzureIoTClient 6:641a9672db08 527 {
AzureIoTClient 36:8e1d94b0a70c 528 ASYNC_OPERATION_HANDLE transfer_async_operation;
AzureIoTClient 36:8e1d94b0a70c 529 LINK_TRANSFER_RESULT link_transfer_error;
AzureIoTClient 34:6be9c2058664 530 MESSAGE_WITH_CALLBACK* message_with_callback = GET_ASYNC_OPERATION_CONTEXT(MESSAGE_WITH_CALLBACK, pending_send);
AzureIoTClient 34:6be9c2058664 531 message_with_callback->message_send_state = MESSAGE_SEND_STATE_PENDING;
AzureIoTClient 46:01f7ca900e07 532
AzureIoTClient 36:8e1d94b0a70c 533 transfer_async_operation = link_transfer_async(message_sender->link, message_format, &payload, 1, on_delivery_settled, pending_send, &link_transfer_error, message_with_callback->timeout);
AzureIoTClient 36:8e1d94b0a70c 534 if (transfer_async_operation == NULL)
AzureIoTClient 34:6be9c2058664 535 {
AzureIoTClient 36:8e1d94b0a70c 536 if (link_transfer_error == LINK_TRANSFER_BUSY)
AzureIoTClient 36:8e1d94b0a70c 537 {
AzureIoTClient 36:8e1d94b0a70c 538 message_with_callback->message_send_state = MESSAGE_SEND_STATE_NOT_SENT;
AzureIoTClient 36:8e1d94b0a70c 539 result = SEND_ONE_MESSAGE_BUSY;
AzureIoTClient 36:8e1d94b0a70c 540 }
AzureIoTClient 36:8e1d94b0a70c 541 else
AzureIoTClient 36:8e1d94b0a70c 542 {
AzureIoTClient 36:8e1d94b0a70c 543 LogError("Error in link transfer");
AzureIoTClient 36:8e1d94b0a70c 544 result = SEND_ONE_MESSAGE_ERROR;
AzureIoTClient 36:8e1d94b0a70c 545 }
AzureIoTClient 36:8e1d94b0a70c 546 }
AzureIoTClient 36:8e1d94b0a70c 547 else
AzureIoTClient 36:8e1d94b0a70c 548 {
AzureIoTClient 34:6be9c2058664 549 result = SEND_ONE_MESSAGE_OK;
AzureIoTClient 34:6be9c2058664 550 }
AzureIoTClient 6:641a9672db08 551 }
Azure.IoT Build 0:6ae2f7bca550 552
AzureIoTClient 34:6be9c2058664 553 free(data_bytes);
Azure.IoT Build 0:6ae2f7bca550 554
AzureIoTClient 34:6be9c2058664 555 if (body_amqp_value != NULL)
AzureIoTClient 34:6be9c2058664 556 {
AzureIoTClient 34:6be9c2058664 557 amqpvalue_destroy(body_amqp_value);
AzureIoTClient 34:6be9c2058664 558 }
AzureIoTClient 6:641a9672db08 559 }
AzureIoTClient 20:206846c14c80 560 }
Azure.IoT Build 0:6ae2f7bca550 561
AzureIoTClient 31:cafc87baef79 562 if (header != NULL)
AzureIoTClient 31:cafc87baef79 563 {
AzureIoTClient 31:cafc87baef79 564 header_destroy(header);
AzureIoTClient 31:cafc87baef79 565 }
AzureIoTClient 31:cafc87baef79 566
AzureIoTClient 31:cafc87baef79 567 if (header_amqp_value != NULL)
AzureIoTClient 31:cafc87baef79 568 {
AzureIoTClient 31:cafc87baef79 569 amqpvalue_destroy(header_amqp_value);
AzureIoTClient 31:cafc87baef79 570 }
AzureIoTClient 31:cafc87baef79 571
AzureIoTClient 31:cafc87baef79 572 if (msg_annotations != NULL)
AzureIoTClient 31:cafc87baef79 573 {
AzureIoTClient 31:cafc87baef79 574 annotations_destroy(msg_annotations);
AzureIoTClient 31:cafc87baef79 575 }
AzureIoTClient 31:cafc87baef79 576
AzureIoTClient 23:1111ee8bcba4 577 if (application_properties != NULL)
AzureIoTClient 23:1111ee8bcba4 578 {
AzureIoTClient 23:1111ee8bcba4 579 amqpvalue_destroy(application_properties);
AzureIoTClient 23:1111ee8bcba4 580 }
AzureIoTClient 34:6be9c2058664 581
AzureIoTClient 23:1111ee8bcba4 582 if (application_properties_value != NULL)
AzureIoTClient 23:1111ee8bcba4 583 {
AzureIoTClient 23:1111ee8bcba4 584 amqpvalue_destroy(application_properties_value);
AzureIoTClient 23:1111ee8bcba4 585 }
AzureIoTClient 34:6be9c2058664 586
AzureIoTClient 23:1111ee8bcba4 587 if (properties_amqp_value != NULL)
AzureIoTClient 23:1111ee8bcba4 588 {
AzureIoTClient 23:1111ee8bcba4 589 amqpvalue_destroy(properties_amqp_value);
AzureIoTClient 23:1111ee8bcba4 590 }
AzureIoTClient 34:6be9c2058664 591
AzureIoTClient 23:1111ee8bcba4 592 if (properties != NULL)
AzureIoTClient 23:1111ee8bcba4 593 {
AzureIoTClient 23:1111ee8bcba4 594 properties_destroy(properties);
AzureIoTClient 23:1111ee8bcba4 595 }
AzureIoTClient 6:641a9672db08 596 }
Azure.IoT Build 0:6ae2f7bca550 597
AzureIoTClient 6:641a9672db08 598 return result;
Azure.IoT Build 0:6ae2f7bca550 599 }
Azure.IoT Build 0:6ae2f7bca550 600
AzureIoTClient 34:6be9c2058664 601 static void send_all_pending_messages(MESSAGE_SENDER_HANDLE message_sender)
Azure.IoT Build 0:6ae2f7bca550 602 {
AzureIoTClient 6:641a9672db08 603 size_t i;
Azure.IoT Build 0:6ae2f7bca550 604
AzureIoTClient 34:6be9c2058664 605 for (i = 0; i < message_sender->message_count; i++)
AzureIoTClient 6:641a9672db08 606 {
AzureIoTClient 34:6be9c2058664 607 MESSAGE_WITH_CALLBACK* message_with_callback = GET_ASYNC_OPERATION_CONTEXT(MESSAGE_WITH_CALLBACK, message_sender->messages[i]);
AzureIoTClient 34:6be9c2058664 608 if (message_with_callback->message_send_state == MESSAGE_SEND_STATE_NOT_SENT)
AzureIoTClient 6:641a9672db08 609 {
AzureIoTClient 34:6be9c2058664 610 switch (send_one_message(message_sender, message_sender->messages[i], message_with_callback->message))
AzureIoTClient 6:641a9672db08 611 {
AzureIoTClient 6:641a9672db08 612 default:
AzureIoTClient 34:6be9c2058664 613 LogError("Invalid send one message result");
AzureIoTClient 34:6be9c2058664 614 break;
AzureIoTClient 34:6be9c2058664 615
AzureIoTClient 6:641a9672db08 616 case SEND_ONE_MESSAGE_ERROR:
AzureIoTClient 6:641a9672db08 617 {
AzureIoTClient 34:6be9c2058664 618 ON_MESSAGE_SEND_COMPLETE on_message_send_complete = message_with_callback->on_message_send_complete;
AzureIoTClient 34:6be9c2058664 619 void* context = message_with_callback->context;
AzureIoTClient 34:6be9c2058664 620 remove_pending_message_by_index(message_sender, i);
Azure.IoT Build 0:6ae2f7bca550 621
AzureIoTClient 23:1111ee8bcba4 622 if (on_message_send_complete != NULL)
AzureIoTClient 23:1111ee8bcba4 623 {
AzureIoTClient 46:01f7ca900e07 624 on_message_send_complete(context, MESSAGE_SEND_ERROR, NULL);
AzureIoTClient 23:1111ee8bcba4 625 }
AzureIoTClient 18:a922a4a30a82 626
AzureIoTClient 34:6be9c2058664 627 i = message_sender->message_count;
AzureIoTClient 6:641a9672db08 628 break;
AzureIoTClient 6:641a9672db08 629 }
AzureIoTClient 6:641a9672db08 630 case SEND_ONE_MESSAGE_BUSY:
AzureIoTClient 34:6be9c2058664 631 i = message_sender->message_count + 1;
AzureIoTClient 6:641a9672db08 632 break;
Azure.IoT Build 0:6ae2f7bca550 633
AzureIoTClient 6:641a9672db08 634 case SEND_ONE_MESSAGE_OK:
AzureIoTClient 6:641a9672db08 635 break;
AzureIoTClient 6:641a9672db08 636 }
Azure.IoT Build 0:6ae2f7bca550 637
AzureIoTClient 6:641a9672db08 638 i--;
AzureIoTClient 6:641a9672db08 639 }
AzureIoTClient 6:641a9672db08 640 }
Azure.IoT Build 0:6ae2f7bca550 641 }
Azure.IoT Build 0:6ae2f7bca550 642
AzureIoTClient 34:6be9c2058664 643 static void set_message_sender_state(MESSAGE_SENDER_INSTANCE* message_sender, MESSAGE_SENDER_STATE new_state)
Azure.IoT Build 0:6ae2f7bca550 644 {
AzureIoTClient 34:6be9c2058664 645 MESSAGE_SENDER_STATE previous_state = message_sender->message_sender_state;
AzureIoTClient 34:6be9c2058664 646 message_sender->message_sender_state = new_state;
AzureIoTClient 34:6be9c2058664 647 if (message_sender->on_message_sender_state_changed != NULL)
AzureIoTClient 6:641a9672db08 648 {
AzureIoTClient 34:6be9c2058664 649 message_sender->on_message_sender_state_changed(message_sender->on_message_sender_state_changed_context, new_state, previous_state);
AzureIoTClient 6:641a9672db08 650 }
Azure.IoT Build 0:6ae2f7bca550 651 }
Azure.IoT Build 0:6ae2f7bca550 652
AzureIoTClient 34:6be9c2058664 653 static void indicate_all_messages_as_error(MESSAGE_SENDER_INSTANCE* message_sender)
AzureIoTClient 2:64b4feb67cd3 654 {
AzureIoTClient 2:64b4feb67cd3 655 size_t i;
AzureIoTClient 2:64b4feb67cd3 656
AzureIoTClient 34:6be9c2058664 657 for (i = 0; i < message_sender->message_count; i++)
AzureIoTClient 2:64b4feb67cd3 658 {
AzureIoTClient 34:6be9c2058664 659 MESSAGE_WITH_CALLBACK* message_with_callback = GET_ASYNC_OPERATION_CONTEXT(MESSAGE_WITH_CALLBACK, message_sender->messages[i]);
AzureIoTClient 34:6be9c2058664 660 if (message_with_callback->on_message_send_complete != NULL)
AzureIoTClient 2:64b4feb67cd3 661 {
AzureIoTClient 46:01f7ca900e07 662 message_with_callback->on_message_send_complete(message_with_callback->context, MESSAGE_SEND_ERROR, NULL);
AzureIoTClient 2:64b4feb67cd3 663 }
AzureIoTClient 2:64b4feb67cd3 664
AzureIoTClient 34:6be9c2058664 665 if (message_with_callback->message != NULL)
AzureIoTClient 33:08b53020ff0d 666 {
AzureIoTClient 34:6be9c2058664 667 message_destroy(message_with_callback->message);
AzureIoTClient 33:08b53020ff0d 668 }
AzureIoTClient 34:6be9c2058664 669 async_operation_destroy(message_sender->messages[i]);
AzureIoTClient 2:64b4feb67cd3 670 }
AzureIoTClient 2:64b4feb67cd3 671
AzureIoTClient 34:6be9c2058664 672 if (message_sender->messages != NULL)
AzureIoTClient 2:64b4feb67cd3 673 {
AzureIoTClient 34:6be9c2058664 674 message_sender->message_count = 0;
AzureIoTClient 2:64b4feb67cd3 675
AzureIoTClient 34:6be9c2058664 676 free(message_sender->messages);
AzureIoTClient 34:6be9c2058664 677 message_sender->messages = NULL;
AzureIoTClient 2:64b4feb67cd3 678 }
AzureIoTClient 2:64b4feb67cd3 679 }
AzureIoTClient 2:64b4feb67cd3 680
Azure.IoT Build 0:6ae2f7bca550 681 static void on_link_state_changed(void* context, LINK_STATE new_link_state, LINK_STATE previous_link_state)
Azure.IoT Build 0:6ae2f7bca550 682 {
AzureIoTClient 34:6be9c2058664 683 MESSAGE_SENDER_INSTANCE* message_sender = (MESSAGE_SENDER_INSTANCE*)context;
AzureIoTClient 6:641a9672db08 684 (void)previous_link_state;
Azure.IoT Build 0:6ae2f7bca550 685
AzureIoTClient 6:641a9672db08 686 switch (new_link_state)
AzureIoTClient 6:641a9672db08 687 {
AzureIoTClient 17:923575db8b2d 688 default:
AzureIoTClient 17:923575db8b2d 689 break;
AzureIoTClient 17:923575db8b2d 690
AzureIoTClient 6:641a9672db08 691 case LINK_STATE_ATTACHED:
AzureIoTClient 34:6be9c2058664 692 if (message_sender->message_sender_state == MESSAGE_SENDER_STATE_OPENING)
AzureIoTClient 6:641a9672db08 693 {
AzureIoTClient 34:6be9c2058664 694 set_message_sender_state(message_sender, MESSAGE_SENDER_STATE_OPEN);
AzureIoTClient 6:641a9672db08 695 }
AzureIoTClient 6:641a9672db08 696 break;
AzureIoTClient 6:641a9672db08 697 case LINK_STATE_DETACHED:
AzureIoTClient 34:6be9c2058664 698 if ((message_sender->message_sender_state == MESSAGE_SENDER_STATE_OPEN) ||
AzureIoTClient 34:6be9c2058664 699 (message_sender->message_sender_state == MESSAGE_SENDER_STATE_CLOSING))
Azure.IoT Build 0:6ae2f7bca550 700 {
AzureIoTClient 46:01f7ca900e07 701 /* switch to closing so that no more requests should be accepted */
AzureIoTClient 46:01f7ca900e07 702 indicate_all_messages_as_error(message_sender);
AzureIoTClient 34:6be9c2058664 703 set_message_sender_state(message_sender, MESSAGE_SENDER_STATE_IDLE);
Azure.IoT Build 0:6ae2f7bca550 704 }
AzureIoTClient 34:6be9c2058664 705 else if (message_sender->message_sender_state != MESSAGE_SENDER_STATE_IDLE)
Azure.IoT Build 0:6ae2f7bca550 706 {
Azure.IoT Build 0:6ae2f7bca550 707 /* Any other transition must be an error */
AzureIoTClient 34:6be9c2058664 708 set_message_sender_state(message_sender, MESSAGE_SENDER_STATE_ERROR);
Azure.IoT Build 0:6ae2f7bca550 709 }
Azure.IoT Build 0:6ae2f7bca550 710 break;
AzureIoTClient 6:641a9672db08 711 case LINK_STATE_ERROR:
AzureIoTClient 34:6be9c2058664 712 if (message_sender->message_sender_state != MESSAGE_SENDER_STATE_ERROR)
AzureIoTClient 6:641a9672db08 713 {
AzureIoTClient 46:01f7ca900e07 714 indicate_all_messages_as_error(message_sender);
AzureIoTClient 34:6be9c2058664 715 set_message_sender_state(message_sender, MESSAGE_SENDER_STATE_ERROR);
AzureIoTClient 6:641a9672db08 716 }
AzureIoTClient 6:641a9672db08 717 break;
AzureIoTClient 6:641a9672db08 718 }
Azure.IoT Build 0:6ae2f7bca550 719 }
Azure.IoT Build 0:6ae2f7bca550 720
Azure.IoT Build 0:6ae2f7bca550 721 static void on_link_flow_on(void* context)
Azure.IoT Build 0:6ae2f7bca550 722 {
AzureIoTClient 34:6be9c2058664 723 MESSAGE_SENDER_HANDLE message_sender = (MESSAGE_SENDER_INSTANCE*)context;
AzureIoTClient 34:6be9c2058664 724 send_all_pending_messages(message_sender);
Azure.IoT Build 0:6ae2f7bca550 725 }
Azure.IoT Build 0:6ae2f7bca550 726
Azure.IoT Build 5:ae49385aff34 727 MESSAGE_SENDER_HANDLE messagesender_create(LINK_HANDLE link, ON_MESSAGE_SENDER_STATE_CHANGED on_message_sender_state_changed, void* context)
Azure.IoT Build 0:6ae2f7bca550 728 {
AzureIoTClient 34:6be9c2058664 729 MESSAGE_SENDER_INSTANCE* message_sender = (MESSAGE_SENDER_INSTANCE*)malloc(sizeof(MESSAGE_SENDER_INSTANCE));
AzureIoTClient 34:6be9c2058664 730 if (message_sender == NULL)
AzureIoTClient 34:6be9c2058664 731 {
AzureIoTClient 34:6be9c2058664 732 LogError("Failed allocating message sender");
AzureIoTClient 34:6be9c2058664 733 }
AzureIoTClient 34:6be9c2058664 734 else
AzureIoTClient 6:641a9672db08 735 {
AzureIoTClient 34:6be9c2058664 736 message_sender->messages = NULL;
AzureIoTClient 34:6be9c2058664 737 message_sender->message_count = 0;
AzureIoTClient 34:6be9c2058664 738 message_sender->link = link;
AzureIoTClient 34:6be9c2058664 739 message_sender->on_message_sender_state_changed = on_message_sender_state_changed;
AzureIoTClient 34:6be9c2058664 740 message_sender->on_message_sender_state_changed_context = context;
AzureIoTClient 34:6be9c2058664 741 message_sender->message_sender_state = MESSAGE_SENDER_STATE_IDLE;
AzureIoTClient 34:6be9c2058664 742 message_sender->is_trace_on = 0;
AzureIoTClient 6:641a9672db08 743 }
Azure.IoT Build 0:6ae2f7bca550 744
AzureIoTClient 34:6be9c2058664 745 return message_sender;
Azure.IoT Build 0:6ae2f7bca550 746 }
Azure.IoT Build 0:6ae2f7bca550 747
Azure.IoT Build 0:6ae2f7bca550 748 void messagesender_destroy(MESSAGE_SENDER_HANDLE message_sender)
Azure.IoT Build 0:6ae2f7bca550 749 {
AzureIoTClient 34:6be9c2058664 750 if (message_sender == NULL)
AzureIoTClient 6:641a9672db08 751 {
AzureIoTClient 34:6be9c2058664 752 LogError("NULL message_sender");
AzureIoTClient 34:6be9c2058664 753 }
AzureIoTClient 34:6be9c2058664 754 else
AzureIoTClient 34:6be9c2058664 755 {
AzureIoTClient 34:6be9c2058664 756 (void)messagesender_close(message_sender);
Azure.IoT Build 0:6ae2f7bca550 757
AzureIoTClient 21:f9c433d8e6ca 758 free(message_sender);
AzureIoTClient 6:641a9672db08 759 }
Azure.IoT Build 0:6ae2f7bca550 760 }
Azure.IoT Build 0:6ae2f7bca550 761
Azure.IoT Build 0:6ae2f7bca550 762 int messagesender_open(MESSAGE_SENDER_HANDLE message_sender)
Azure.IoT Build 0:6ae2f7bca550 763 {
AzureIoTClient 6:641a9672db08 764 int result;
Azure.IoT Build 0:6ae2f7bca550 765
AzureIoTClient 6:641a9672db08 766 if (message_sender == NULL)
AzureIoTClient 6:641a9672db08 767 {
AzureIoTClient 34:6be9c2058664 768 LogError("NULL message_sender");
AzureIoTClient 19:000ab4e6a2c1 769 result = __FAILURE__;
AzureIoTClient 6:641a9672db08 770 }
AzureIoTClient 6:641a9672db08 771 else
AzureIoTClient 6:641a9672db08 772 {
AzureIoTClient 34:6be9c2058664 773 if (message_sender->message_sender_state == MESSAGE_SENDER_STATE_IDLE)
AzureIoTClient 6:641a9672db08 774 {
AzureIoTClient 34:6be9c2058664 775 set_message_sender_state(message_sender, MESSAGE_SENDER_STATE_OPENING);
AzureIoTClient 34:6be9c2058664 776 if (link_attach(message_sender->link, NULL, on_link_state_changed, on_link_flow_on, message_sender) != 0)
AzureIoTClient 6:641a9672db08 777 {
AzureIoTClient 34:6be9c2058664 778 LogError("attach link failed");
AzureIoTClient 19:000ab4e6a2c1 779 result = __FAILURE__;
AzureIoTClient 34:6be9c2058664 780 set_message_sender_state(message_sender, MESSAGE_SENDER_STATE_ERROR);
AzureIoTClient 6:641a9672db08 781 }
AzureIoTClient 6:641a9672db08 782 else
AzureIoTClient 6:641a9672db08 783 {
AzureIoTClient 6:641a9672db08 784 result = 0;
AzureIoTClient 6:641a9672db08 785 }
AzureIoTClient 6:641a9672db08 786 }
AzureIoTClient 6:641a9672db08 787 else
AzureIoTClient 6:641a9672db08 788 {
AzureIoTClient 6:641a9672db08 789 result = 0;
AzureIoTClient 6:641a9672db08 790 }
AzureIoTClient 6:641a9672db08 791 }
Azure.IoT Build 0:6ae2f7bca550 792
AzureIoTClient 6:641a9672db08 793 return result;
Azure.IoT Build 0:6ae2f7bca550 794 }
Azure.IoT Build 0:6ae2f7bca550 795
Azure.IoT Build 0:6ae2f7bca550 796 int messagesender_close(MESSAGE_SENDER_HANDLE message_sender)
Azure.IoT Build 0:6ae2f7bca550 797 {
AzureIoTClient 6:641a9672db08 798 int result;
Azure.IoT Build 0:6ae2f7bca550 799
AzureIoTClient 6:641a9672db08 800 if (message_sender == NULL)
AzureIoTClient 6:641a9672db08 801 {
AzureIoTClient 34:6be9c2058664 802 LogError("NULL message_sender");
AzureIoTClient 19:000ab4e6a2c1 803 result = __FAILURE__;
AzureIoTClient 6:641a9672db08 804 }
AzureIoTClient 6:641a9672db08 805 else
AzureIoTClient 6:641a9672db08 806 {
AzureIoTClient 47:365a93fdb5bb 807 indicate_all_messages_as_error(message_sender);
AzureIoTClient 47:365a93fdb5bb 808
AzureIoTClient 34:6be9c2058664 809 if ((message_sender->message_sender_state == MESSAGE_SENDER_STATE_OPENING) ||
AzureIoTClient 34:6be9c2058664 810 (message_sender->message_sender_state == MESSAGE_SENDER_STATE_OPEN))
AzureIoTClient 6:641a9672db08 811 {
AzureIoTClient 34:6be9c2058664 812 set_message_sender_state(message_sender, MESSAGE_SENDER_STATE_CLOSING);
AzureIoTClient 43:4c1e4e94cdd3 813 if (link_detach(message_sender->link, true, NULL, NULL, NULL) != 0)
AzureIoTClient 6:641a9672db08 814 {
AzureIoTClient 34:6be9c2058664 815 LogError("Detaching link failed");
AzureIoTClient 19:000ab4e6a2c1 816 result = __FAILURE__;
AzureIoTClient 34:6be9c2058664 817 set_message_sender_state(message_sender, MESSAGE_SENDER_STATE_ERROR);
AzureIoTClient 6:641a9672db08 818 }
AzureIoTClient 6:641a9672db08 819 else
AzureIoTClient 6:641a9672db08 820 {
AzureIoTClient 6:641a9672db08 821 result = 0;
AzureIoTClient 6:641a9672db08 822 }
AzureIoTClient 6:641a9672db08 823 }
AzureIoTClient 6:641a9672db08 824 else
AzureIoTClient 6:641a9672db08 825 {
AzureIoTClient 6:641a9672db08 826 result = 0;
AzureIoTClient 6:641a9672db08 827 }
AzureIoTClient 6:641a9672db08 828 }
Azure.IoT Build 0:6ae2f7bca550 829
AzureIoTClient 6:641a9672db08 830 return result;
Azure.IoT Build 0:6ae2f7bca550 831 }
Azure.IoT Build 0:6ae2f7bca550 832
AzureIoTClient 34:6be9c2058664 833 static void messagesender_send_cancel_handler(ASYNC_OPERATION_HANDLE send_operation)
Azure.IoT Build 0:6ae2f7bca550 834 {
AzureIoTClient 34:6be9c2058664 835 MESSAGE_WITH_CALLBACK* message_with_callback = GET_ASYNC_OPERATION_CONTEXT(MESSAGE_WITH_CALLBACK, send_operation);
AzureIoTClient 34:6be9c2058664 836 if (message_with_callback->on_message_send_complete != NULL)
AzureIoTClient 34:6be9c2058664 837 {
AzureIoTClient 46:01f7ca900e07 838 message_with_callback->on_message_send_complete(message_with_callback->context, MESSAGE_SEND_CANCELLED, NULL);
AzureIoTClient 34:6be9c2058664 839 }
AzureIoTClient 34:6be9c2058664 840
AzureIoTClient 34:6be9c2058664 841 remove_pending_message(message_with_callback->message_sender, send_operation);
AzureIoTClient 34:6be9c2058664 842 }
AzureIoTClient 34:6be9c2058664 843
AzureIoTClient 34:6be9c2058664 844 ASYNC_OPERATION_HANDLE messagesender_send_async(MESSAGE_SENDER_HANDLE message_sender, MESSAGE_HANDLE message, ON_MESSAGE_SEND_COMPLETE on_message_send_complete, void* callback_context, tickcounter_ms_t timeout)
AzureIoTClient 34:6be9c2058664 845 {
AzureIoTClient 34:6be9c2058664 846 ASYNC_OPERATION_HANDLE result;
Azure.IoT Build 0:6ae2f7bca550 847
AzureIoTClient 6:641a9672db08 848 if ((message_sender == NULL) ||
AzureIoTClient 6:641a9672db08 849 (message == NULL))
AzureIoTClient 6:641a9672db08 850 {
AzureIoTClient 34:6be9c2058664 851 LogError("Bad parameters: message_sender = %p, message = %p");
AzureIoTClient 34:6be9c2058664 852 result = NULL;
AzureIoTClient 6:641a9672db08 853 }
AzureIoTClient 6:641a9672db08 854 else
AzureIoTClient 6:641a9672db08 855 {
AzureIoTClient 34:6be9c2058664 856 if (message_sender->message_sender_state == MESSAGE_SENDER_STATE_ERROR)
AzureIoTClient 6:641a9672db08 857 {
AzureIoTClient 34:6be9c2058664 858 LogError("Message sender in ERROR state");
AzureIoTClient 34:6be9c2058664 859 result = NULL;
AzureIoTClient 6:641a9672db08 860 }
AzureIoTClient 6:641a9672db08 861 else
AzureIoTClient 6:641a9672db08 862 {
AzureIoTClient 34:6be9c2058664 863 result = CREATE_ASYNC_OPERATION(MESSAGE_WITH_CALLBACK, messagesender_send_cancel_handler);
AzureIoTClient 34:6be9c2058664 864 if (result == NULL)
AzureIoTClient 6:641a9672db08 865 {
AzureIoTClient 34:6be9c2058664 866 LogError("Failed allocating context for send");
AzureIoTClient 6:641a9672db08 867 }
AzureIoTClient 6:641a9672db08 868 else
AzureIoTClient 6:641a9672db08 869 {
AzureIoTClient 34:6be9c2058664 870 MESSAGE_WITH_CALLBACK* message_with_callback = GET_ASYNC_OPERATION_CONTEXT(MESSAGE_WITH_CALLBACK, result);
AzureIoTClient 34:6be9c2058664 871 ASYNC_OPERATION_HANDLE* new_messages = (ASYNC_OPERATION_HANDLE*)realloc(message_sender->messages, sizeof(ASYNC_OPERATION_HANDLE) * (message_sender->message_count + 1));
AzureIoTClient 6:641a9672db08 872 if (new_messages == NULL)
AzureIoTClient 6:641a9672db08 873 {
AzureIoTClient 34:6be9c2058664 874 LogError("Failed allocating memory for pending sends");
AzureIoTClient 34:6be9c2058664 875 async_operation_destroy(result);
AzureIoTClient 34:6be9c2058664 876 result = NULL;
AzureIoTClient 6:641a9672db08 877 }
AzureIoTClient 6:641a9672db08 878 else
AzureIoTClient 6:641a9672db08 879 {
AzureIoTClient 34:6be9c2058664 880 message_with_callback->timeout = timeout;
AzureIoTClient 34:6be9c2058664 881 message_sender->messages = new_messages;
AzureIoTClient 34:6be9c2058664 882 if (message_sender->message_sender_state != MESSAGE_SENDER_STATE_OPEN)
AzureIoTClient 6:641a9672db08 883 {
AzureIoTClient 6:641a9672db08 884 message_with_callback->message = message_clone(message);
AzureIoTClient 6:641a9672db08 885 if (message_with_callback->message == NULL)
AzureIoTClient 6:641a9672db08 886 {
AzureIoTClient 34:6be9c2058664 887 LogError("Cannot clone message for placing it in the pending sends list");
AzureIoTClient 34:6be9c2058664 888 async_operation_destroy(result);
AzureIoTClient 34:6be9c2058664 889 result = NULL;
AzureIoTClient 6:641a9672db08 890 }
AzureIoTClient 6:641a9672db08 891
AzureIoTClient 6:641a9672db08 892 message_with_callback->message_send_state = MESSAGE_SEND_STATE_NOT_SENT;
AzureIoTClient 6:641a9672db08 893 }
AzureIoTClient 6:641a9672db08 894 else
AzureIoTClient 6:641a9672db08 895 {
AzureIoTClient 6:641a9672db08 896 message_with_callback->message = NULL;
AzureIoTClient 6:641a9672db08 897 message_with_callback->message_send_state = MESSAGE_SEND_STATE_PENDING;
AzureIoTClient 6:641a9672db08 898 }
Azure.IoT Build 0:6ae2f7bca550 899
AzureIoTClient 34:6be9c2058664 900 if (result != NULL)
AzureIoTClient 6:641a9672db08 901 {
AzureIoTClient 6:641a9672db08 902 message_with_callback->on_message_send_complete = on_message_send_complete;
AzureIoTClient 6:641a9672db08 903 message_with_callback->context = callback_context;
AzureIoTClient 34:6be9c2058664 904 message_with_callback->message_sender = message_sender;
AzureIoTClient 6:641a9672db08 905
AzureIoTClient 34:6be9c2058664 906 message_sender->messages[message_sender->message_count] = result;
AzureIoTClient 34:6be9c2058664 907 message_sender->message_count++;
Azure.IoT Build 0:6ae2f7bca550 908
AzureIoTClient 34:6be9c2058664 909 if (message_sender->message_sender_state == MESSAGE_SENDER_STATE_OPEN)
AzureIoTClient 6:641a9672db08 910 {
AzureIoTClient 34:6be9c2058664 911 switch (send_one_message(message_sender, result, message))
AzureIoTClient 6:641a9672db08 912 {
AzureIoTClient 6:641a9672db08 913 default:
AzureIoTClient 6:641a9672db08 914 case SEND_ONE_MESSAGE_ERROR:
AzureIoTClient 34:6be9c2058664 915 LogError("Error sending message");
AzureIoTClient 34:6be9c2058664 916 remove_pending_message_by_index(message_sender, message_sender->message_count - 1);
AzureIoTClient 34:6be9c2058664 917 result = NULL;
AzureIoTClient 6:641a9672db08 918 break;
Azure.IoT Build 0:6ae2f7bca550 919
AzureIoTClient 6:641a9672db08 920 case SEND_ONE_MESSAGE_BUSY:
AzureIoTClient 6:641a9672db08 921 message_with_callback->message = message_clone(message);
AzureIoTClient 6:641a9672db08 922 if (message_with_callback->message == NULL)
AzureIoTClient 6:641a9672db08 923 {
AzureIoTClient 34:6be9c2058664 924 LogError("Error cloning message for placing it in the pending sends list");
AzureIoTClient 34:6be9c2058664 925 async_operation_destroy(result);
AzureIoTClient 34:6be9c2058664 926 result = NULL;
AzureIoTClient 6:641a9672db08 927 }
AzureIoTClient 6:641a9672db08 928 else
AzureIoTClient 6:641a9672db08 929 {
AzureIoTClient 6:641a9672db08 930 message_with_callback->message_send_state = MESSAGE_SEND_STATE_NOT_SENT;
AzureIoTClient 6:641a9672db08 931 }
AzureIoTClient 6:641a9672db08 932 break;
Azure.IoT Build 0:6ae2f7bca550 933
AzureIoTClient 6:641a9672db08 934 case SEND_ONE_MESSAGE_OK:
AzureIoTClient 6:641a9672db08 935 break;
AzureIoTClient 6:641a9672db08 936 }
AzureIoTClient 6:641a9672db08 937 }
AzureIoTClient 6:641a9672db08 938 }
AzureIoTClient 6:641a9672db08 939 }
AzureIoTClient 6:641a9672db08 940 }
AzureIoTClient 6:641a9672db08 941 }
AzureIoTClient 6:641a9672db08 942 }
AzureIoTClient 34:6be9c2058664 943
AzureIoTClient 6:641a9672db08 944 return result;
AzureIoTClient 6:641a9672db08 945 }
Azure.IoT Build 0:6ae2f7bca550 946
AzureIoTClient 6:641a9672db08 947 void messagesender_set_trace(MESSAGE_SENDER_HANDLE message_sender, bool traceOn)
AzureIoTClient 6:641a9672db08 948 {
AzureIoTClient 34:6be9c2058664 949 if (message_sender == NULL)
AzureIoTClient 6:641a9672db08 950 {
AzureIoTClient 34:6be9c2058664 951 LogError("NULL message_sender");
AzureIoTClient 34:6be9c2058664 952 }
AzureIoTClient 34:6be9c2058664 953 else
AzureIoTClient 34:6be9c2058664 954 {
AzureIoTClient 34:6be9c2058664 955 message_sender->is_trace_on = traceOn ? 1 : 0;
AzureIoTClient 6:641a9672db08 956 }
Azure.IoT Build 0:6ae2f7bca550 957 }