A small memory footprint AMQP implimentation

Dependents:   iothub_client_sample_amqp remote_monitoring simplesample_amqp

Committer:
AzureIoTClient
Date:
Fri Mar 24 16:35:45 2017 -0700
Revision:
21:f9c433d8e6ca
Parent:
19:000ab4e6a2c1
Child:
22:524bded3f7a8
1.1.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>
Azure.IoT Build 0:6ae2f7bca550 5 #include <stdio.h>
AzureIoTClient 6:641a9672db08 6 #include <stdbool.h>
Azure.IoT Build 0:6ae2f7bca550 7 #include <string.h>
AzureIoTClient 19:000ab4e6a2c1 8 #include "azure_c_shared_utility/optimize_size.h"
AzureIoTClient 21:f9c433d8e6ca 9 #include "azure_c_shared_utility/gballoc.h"
Azure.IoT Build 0:6ae2f7bca550 10 #include "azure_uamqp_c/amqp_management.h"
Azure.IoT Build 0:6ae2f7bca550 11 #include "azure_uamqp_c/link.h"
Azure.IoT Build 0:6ae2f7bca550 12 #include "azure_uamqp_c/message_sender.h"
Azure.IoT Build 0:6ae2f7bca550 13 #include "azure_uamqp_c/message_receiver.h"
Azure.IoT Build 0:6ae2f7bca550 14 #include "azure_uamqp_c/messaging.h"
Azure.IoT Build 0:6ae2f7bca550 15 #include "azure_uamqp_c/amqpvalue_to_string.h"
Azure.IoT Build 0:6ae2f7bca550 16
Azure.IoT Build 0:6ae2f7bca550 17 typedef enum OPERATION_STATE_TAG
Azure.IoT Build 0:6ae2f7bca550 18 {
AzureIoTClient 6:641a9672db08 19 OPERATION_STATE_NOT_SENT,
AzureIoTClient 6:641a9672db08 20 OPERATION_STATE_AWAIT_REPLY
Azure.IoT Build 0:6ae2f7bca550 21 } OPERATION_STATE;
Azure.IoT Build 0:6ae2f7bca550 22
Azure.IoT Build 0:6ae2f7bca550 23 typedef struct OPERATION_MESSAGE_INSTANCE_TAG
Azure.IoT Build 0:6ae2f7bca550 24 {
AzureIoTClient 6:641a9672db08 25 MESSAGE_HANDLE message;
AzureIoTClient 6:641a9672db08 26 OPERATION_STATE operation_state;
AzureIoTClient 6:641a9672db08 27 ON_OPERATION_COMPLETE on_operation_complete;
AzureIoTClient 6:641a9672db08 28 void* callback_context;
AzureIoTClient 6:641a9672db08 29 unsigned long message_id;
Azure.IoT Build 0:6ae2f7bca550 30 } OPERATION_MESSAGE_INSTANCE;
Azure.IoT Build 0:6ae2f7bca550 31
Azure.IoT Build 0:6ae2f7bca550 32 typedef struct AMQP_MANAGEMENT_INSTANCE_TAG
Azure.IoT Build 0:6ae2f7bca550 33 {
AzureIoTClient 6:641a9672db08 34 SESSION_HANDLE session;
AzureIoTClient 6:641a9672db08 35 LINK_HANDLE sender_link;
AzureIoTClient 6:641a9672db08 36 LINK_HANDLE receiver_link;
AzureIoTClient 6:641a9672db08 37 MESSAGE_SENDER_HANDLE message_sender;
AzureIoTClient 6:641a9672db08 38 MESSAGE_RECEIVER_HANDLE message_receiver;
AzureIoTClient 6:641a9672db08 39 OPERATION_MESSAGE_INSTANCE** operation_messages;
AzureIoTClient 6:641a9672db08 40 size_t operation_message_count;
AzureIoTClient 6:641a9672db08 41 unsigned long next_message_id;
AzureIoTClient 6:641a9672db08 42 ON_AMQP_MANAGEMENT_STATE_CHANGED on_amqp_management_state_changed;
AzureIoTClient 6:641a9672db08 43 void* callback_context;
AzureIoTClient 6:641a9672db08 44 AMQP_MANAGEMENT_STATE amqp_management_state;
AzureIoTClient 6:641a9672db08 45 AMQP_MANAGEMENT_STATE previous_amqp_management_state;
AzureIoTClient 6:641a9672db08 46 int sender_connected : 1;
AzureIoTClient 6:641a9672db08 47 int receiver_connected : 1;
Azure.IoT Build 0:6ae2f7bca550 48 } AMQP_MANAGEMENT_INSTANCE;
Azure.IoT Build 0:6ae2f7bca550 49
Azure.IoT Build 0:6ae2f7bca550 50 static void amqpmanagement_set_state(AMQP_MANAGEMENT_INSTANCE* amqp_management_instance, AMQP_MANAGEMENT_STATE amqp_management_state)
Azure.IoT Build 0:6ae2f7bca550 51 {
AzureIoTClient 6:641a9672db08 52 amqp_management_instance->previous_amqp_management_state = amqp_management_instance->amqp_management_state;
AzureIoTClient 6:641a9672db08 53 amqp_management_instance->amqp_management_state = amqp_management_state;
Azure.IoT Build 0:6ae2f7bca550 54
AzureIoTClient 6:641a9672db08 55 if (amqp_management_instance->on_amqp_management_state_changed != NULL)
AzureIoTClient 6:641a9672db08 56 {
AzureIoTClient 6:641a9672db08 57 amqp_management_instance->on_amqp_management_state_changed(amqp_management_instance->callback_context, amqp_management_instance->amqp_management_state, amqp_management_instance->previous_amqp_management_state);
AzureIoTClient 6:641a9672db08 58 }
Azure.IoT Build 0:6ae2f7bca550 59 }
Azure.IoT Build 0:6ae2f7bca550 60
Azure.IoT Build 0:6ae2f7bca550 61 static void remove_operation_message_by_index(AMQP_MANAGEMENT_INSTANCE* amqp_management_instance, size_t index)
Azure.IoT Build 0:6ae2f7bca550 62 {
AzureIoTClient 6:641a9672db08 63 message_destroy(amqp_management_instance->operation_messages[index]->message);
AzureIoTClient 21:f9c433d8e6ca 64 free(amqp_management_instance->operation_messages[index]);
Azure.IoT Build 0:6ae2f7bca550 65
AzureIoTClient 6:641a9672db08 66 if (amqp_management_instance->operation_message_count - index > 1)
AzureIoTClient 6:641a9672db08 67 {
AzureIoTClient 6:641a9672db08 68 memmove(&amqp_management_instance->operation_messages[index], &amqp_management_instance->operation_messages[index + 1], sizeof(OPERATION_MESSAGE_INSTANCE*) * (amqp_management_instance->operation_message_count - index - 1));
AzureIoTClient 6:641a9672db08 69 }
Azure.IoT Build 0:6ae2f7bca550 70
AzureIoTClient 6:641a9672db08 71 if (amqp_management_instance->operation_message_count == 1)
AzureIoTClient 6:641a9672db08 72 {
AzureIoTClient 21:f9c433d8e6ca 73 free(amqp_management_instance->operation_messages);
AzureIoTClient 6:641a9672db08 74 amqp_management_instance->operation_messages = NULL;
AzureIoTClient 6:641a9672db08 75 }
AzureIoTClient 6:641a9672db08 76 else
AzureIoTClient 6:641a9672db08 77 {
AzureIoTClient 21:f9c433d8e6ca 78 OPERATION_MESSAGE_INSTANCE** new_operation_messages = (OPERATION_MESSAGE_INSTANCE**)realloc(amqp_management_instance->operation_messages, sizeof(OPERATION_MESSAGE_INSTANCE*) * (amqp_management_instance->operation_message_count - 1));
AzureIoTClient 6:641a9672db08 79 if (new_operation_messages != NULL)
AzureIoTClient 6:641a9672db08 80 {
AzureIoTClient 6:641a9672db08 81 amqp_management_instance->operation_messages = new_operation_messages;
AzureIoTClient 6:641a9672db08 82 }
AzureIoTClient 6:641a9672db08 83 }
Azure.IoT Build 0:6ae2f7bca550 84
AzureIoTClient 6:641a9672db08 85 amqp_management_instance->operation_message_count--;
Azure.IoT Build 0:6ae2f7bca550 86 }
Azure.IoT Build 0:6ae2f7bca550 87
Azure.IoT Build 0:6ae2f7bca550 88 static AMQP_VALUE on_message_received(const void* context, MESSAGE_HANDLE message)
Azure.IoT Build 0:6ae2f7bca550 89 {
AzureIoTClient 6:641a9672db08 90 AMQP_MANAGEMENT_INSTANCE* amqp_management_instance = (AMQP_MANAGEMENT_INSTANCE*)context;
Azure.IoT Build 0:6ae2f7bca550 91
AzureIoTClient 6:641a9672db08 92 AMQP_VALUE application_properties;
AzureIoTClient 6:641a9672db08 93 if (message_get_application_properties(message, &application_properties) != 0)
AzureIoTClient 6:641a9672db08 94 {
AzureIoTClient 6:641a9672db08 95 /* error */
AzureIoTClient 6:641a9672db08 96 }
AzureIoTClient 6:641a9672db08 97 else
AzureIoTClient 6:641a9672db08 98 {
AzureIoTClient 6:641a9672db08 99 PROPERTIES_HANDLE response_properties;
Azure.IoT Build 0:6ae2f7bca550 100
AzureIoTClient 6:641a9672db08 101 if (message_get_properties(message, &response_properties) != 0)
AzureIoTClient 6:641a9672db08 102 {
AzureIoTClient 6:641a9672db08 103 /* error */
AzureIoTClient 6:641a9672db08 104 }
AzureIoTClient 6:641a9672db08 105 else
AzureIoTClient 6:641a9672db08 106 {
AzureIoTClient 1:eab586236bfe 107 AMQP_VALUE key;
AzureIoTClient 1:eab586236bfe 108 AMQP_VALUE value;
AzureIoTClient 1:eab586236bfe 109 AMQP_VALUE desc_key;
AzureIoTClient 6:641a9672db08 110 AMQP_VALUE desc_value;
AzureIoTClient 6:641a9672db08 111 AMQP_VALUE map;
AzureIoTClient 6:641a9672db08 112 AMQP_VALUE correlation_id_value;
Azure.IoT Build 0:6ae2f7bca550 113
AzureIoTClient 6:641a9672db08 114 if (properties_get_correlation_id(response_properties, &correlation_id_value) != 0)
AzureIoTClient 6:641a9672db08 115 {
AzureIoTClient 6:641a9672db08 116 /* error */
AzureIoTClient 6:641a9672db08 117 }
AzureIoTClient 6:641a9672db08 118 else
AzureIoTClient 6:641a9672db08 119 {
AzureIoTClient 6:641a9672db08 120 map = amqpvalue_get_inplace_described_value(application_properties);
AzureIoTClient 6:641a9672db08 121 if (map == NULL)
AzureIoTClient 6:641a9672db08 122 {
AzureIoTClient 6:641a9672db08 123 /* error */
AzureIoTClient 6:641a9672db08 124 }
AzureIoTClient 6:641a9672db08 125 else
AzureIoTClient 6:641a9672db08 126 {
AzureIoTClient 6:641a9672db08 127 key = amqpvalue_create_string("status-code");
AzureIoTClient 6:641a9672db08 128 if (key == NULL)
AzureIoTClient 6:641a9672db08 129 {
AzureIoTClient 6:641a9672db08 130 /* error */
AzureIoTClient 6:641a9672db08 131 }
AzureIoTClient 6:641a9672db08 132 else
AzureIoTClient 6:641a9672db08 133 {
AzureIoTClient 6:641a9672db08 134 value = amqpvalue_get_map_value(map, key);
AzureIoTClient 6:641a9672db08 135 if (value == NULL)
AzureIoTClient 6:641a9672db08 136 {
AzureIoTClient 6:641a9672db08 137 /* error */
AzureIoTClient 6:641a9672db08 138 }
AzureIoTClient 6:641a9672db08 139 else
AzureIoTClient 6:641a9672db08 140 {
AzureIoTClient 6:641a9672db08 141 int32_t status_code;
AzureIoTClient 6:641a9672db08 142 if (amqpvalue_get_int(value, &status_code) != 0)
AzureIoTClient 6:641a9672db08 143 {
AzureIoTClient 6:641a9672db08 144 /* error */
AzureIoTClient 6:641a9672db08 145 }
AzureIoTClient 1:eab586236bfe 146 else
AzureIoTClient 1:eab586236bfe 147 {
AzureIoTClient 1:eab586236bfe 148 desc_key = amqpvalue_create_string("status-description");
AzureIoTClient 1:eab586236bfe 149 if (desc_key == NULL)
AzureIoTClient 1:eab586236bfe 150 {
AzureIoTClient 1:eab586236bfe 151 /* error */
AzureIoTClient 1:eab586236bfe 152 }
AzureIoTClient 1:eab586236bfe 153 else
AzureIoTClient 1:eab586236bfe 154 {
AzureIoTClient 1:eab586236bfe 155 const char* status_description = NULL;
AzureIoTClient 1:eab586236bfe 156
AzureIoTClient 1:eab586236bfe 157 desc_value = amqpvalue_get_map_value(map, desc_key);
AzureIoTClient 1:eab586236bfe 158 if (desc_value != NULL)
AzureIoTClient 1:eab586236bfe 159 {
AzureIoTClient 1:eab586236bfe 160 amqpvalue_get_string(desc_value, &status_description);
AzureIoTClient 1:eab586236bfe 161 }
AzureIoTClient 1:eab586236bfe 162
AzureIoTClient 1:eab586236bfe 163 size_t i = 0;
AzureIoTClient 1:eab586236bfe 164 while (i < amqp_management_instance->operation_message_count)
AzureIoTClient 1:eab586236bfe 165 {
AzureIoTClient 1:eab586236bfe 166 if (amqp_management_instance->operation_messages[i]->operation_state == OPERATION_STATE_AWAIT_REPLY)
AzureIoTClient 1:eab586236bfe 167 {
AzureIoTClient 1:eab586236bfe 168 AMQP_VALUE expected_message_id = amqpvalue_create_ulong(amqp_management_instance->operation_messages[i]->message_id);
AzureIoTClient 1:eab586236bfe 169 OPERATION_RESULT operation_result;
Azure.IoT Build 0:6ae2f7bca550 170
AzureIoTClient 1:eab586236bfe 171 if (expected_message_id == NULL)
AzureIoTClient 1:eab586236bfe 172 {
AzureIoTClient 1:eab586236bfe 173 break;
AzureIoTClient 1:eab586236bfe 174 }
AzureIoTClient 1:eab586236bfe 175 else
AzureIoTClient 1:eab586236bfe 176 {
AzureIoTClient 1:eab586236bfe 177 if (amqpvalue_are_equal(correlation_id_value, expected_message_id))
AzureIoTClient 1:eab586236bfe 178 {
AzureIoTClient 1:eab586236bfe 179 /* 202 is not mentioned in the draft in any way, this is a workaround for an EH bug for now */
AzureIoTClient 1:eab586236bfe 180 if ((status_code != 200) && (status_code != 202))
AzureIoTClient 1:eab586236bfe 181 {
AzureIoTClient 1:eab586236bfe 182 operation_result = OPERATION_RESULT_OPERATION_FAILED;
AzureIoTClient 1:eab586236bfe 183 }
AzureIoTClient 1:eab586236bfe 184 else
AzureIoTClient 1:eab586236bfe 185 {
AzureIoTClient 1:eab586236bfe 186 operation_result = OPERATION_RESULT_OK;
AzureIoTClient 1:eab586236bfe 187 }
AzureIoTClient 1:eab586236bfe 188
AzureIoTClient 1:eab586236bfe 189 amqp_management_instance->operation_messages[i]->on_operation_complete(amqp_management_instance->operation_messages[i]->callback_context, operation_result, status_code, status_description);
AzureIoTClient 1:eab586236bfe 190
AzureIoTClient 1:eab586236bfe 191 remove_operation_message_by_index(amqp_management_instance, i);
Azure.IoT Build 0:6ae2f7bca550 192
AzureIoTClient 1:eab586236bfe 193 amqpvalue_destroy(expected_message_id);
Azure.IoT Build 0:6ae2f7bca550 194
AzureIoTClient 1:eab586236bfe 195 break;
AzureIoTClient 1:eab586236bfe 196 }
AzureIoTClient 1:eab586236bfe 197 else
AzureIoTClient 1:eab586236bfe 198 {
AzureIoTClient 1:eab586236bfe 199 i++;
AzureIoTClient 1:eab586236bfe 200 }
Azure.IoT Build 0:6ae2f7bca550 201
AzureIoTClient 1:eab586236bfe 202 amqpvalue_destroy(expected_message_id);
AzureIoTClient 1:eab586236bfe 203 }
AzureIoTClient 1:eab586236bfe 204 }
AzureIoTClient 1:eab586236bfe 205 else
AzureIoTClient 1:eab586236bfe 206 {
AzureIoTClient 1:eab586236bfe 207 i++;
AzureIoTClient 1:eab586236bfe 208 }
AzureIoTClient 1:eab586236bfe 209 }
Azure.IoT Build 0:6ae2f7bca550 210
AzureIoTClient 1:eab586236bfe 211 if (desc_value != NULL)
AzureIoTClient 1:eab586236bfe 212 {
AzureIoTClient 1:eab586236bfe 213 amqpvalue_destroy(desc_value);
AzureIoTClient 1:eab586236bfe 214 }
AzureIoTClient 1:eab586236bfe 215 amqpvalue_destroy(desc_key);
AzureIoTClient 6:641a9672db08 216 }
AzureIoTClient 6:641a9672db08 217 }
AzureIoTClient 6:641a9672db08 218 amqpvalue_destroy(value);
AzureIoTClient 6:641a9672db08 219 }
AzureIoTClient 6:641a9672db08 220 amqpvalue_destroy(key);
AzureIoTClient 6:641a9672db08 221 }
AzureIoTClient 6:641a9672db08 222 }
AzureIoTClient 6:641a9672db08 223 }
Azure.IoT Build 0:6ae2f7bca550 224
AzureIoTClient 6:641a9672db08 225 properties_destroy(response_properties);
AzureIoTClient 6:641a9672db08 226 }
Azure.IoT Build 0:6ae2f7bca550 227
AzureIoTClient 6:641a9672db08 228 application_properties_destroy(application_properties);
AzureIoTClient 6:641a9672db08 229 }
Azure.IoT Build 0:6ae2f7bca550 230
AzureIoTClient 6:641a9672db08 231 return messaging_delivery_accepted();
Azure.IoT Build 0:6ae2f7bca550 232 }
Azure.IoT Build 0:6ae2f7bca550 233
Azure.IoT Build 0:6ae2f7bca550 234 static int send_operation_messages(AMQP_MANAGEMENT_INSTANCE* amqp_management_instance)
Azure.IoT Build 0:6ae2f7bca550 235 {
AzureIoTClient 6:641a9672db08 236 int result;
Azure.IoT Build 0:6ae2f7bca550 237
AzureIoTClient 6:641a9672db08 238 if ((amqp_management_instance->sender_connected != 0) &&
AzureIoTClient 6:641a9672db08 239 (amqp_management_instance->receiver_connected != 0))
AzureIoTClient 6:641a9672db08 240 {
AzureIoTClient 6:641a9672db08 241 size_t i;
Azure.IoT Build 0:6ae2f7bca550 242
AzureIoTClient 6:641a9672db08 243 for (i = 0; i < amqp_management_instance->operation_message_count; i++)
AzureIoTClient 6:641a9672db08 244 {
AzureIoTClient 6:641a9672db08 245 if (amqp_management_instance->operation_messages[i]->operation_state == OPERATION_STATE_NOT_SENT)
AzureIoTClient 6:641a9672db08 246 {
AzureIoTClient 6:641a9672db08 247 if (messagesender_send(amqp_management_instance->message_sender, amqp_management_instance->operation_messages[i]->message, NULL, NULL) != 0)
AzureIoTClient 6:641a9672db08 248 {
AzureIoTClient 6:641a9672db08 249 /* error */
AzureIoTClient 6:641a9672db08 250 break;
AzureIoTClient 6:641a9672db08 251 }
Azure.IoT Build 0:6ae2f7bca550 252
AzureIoTClient 6:641a9672db08 253 amqp_management_instance->operation_messages[i]->operation_state = OPERATION_STATE_AWAIT_REPLY;
AzureIoTClient 6:641a9672db08 254 }
AzureIoTClient 6:641a9672db08 255 }
Azure.IoT Build 0:6ae2f7bca550 256
AzureIoTClient 6:641a9672db08 257 if (i < amqp_management_instance->operation_message_count)
AzureIoTClient 6:641a9672db08 258 {
AzureIoTClient 19:000ab4e6a2c1 259 result = __FAILURE__;
AzureIoTClient 6:641a9672db08 260 }
AzureIoTClient 6:641a9672db08 261 else
AzureIoTClient 6:641a9672db08 262 {
AzureIoTClient 6:641a9672db08 263 result = 0;
AzureIoTClient 6:641a9672db08 264 }
AzureIoTClient 6:641a9672db08 265 }
AzureIoTClient 6:641a9672db08 266 else
AzureIoTClient 6:641a9672db08 267 {
AzureIoTClient 6:641a9672db08 268 result = 0;
AzureIoTClient 6:641a9672db08 269 }
Azure.IoT Build 0:6ae2f7bca550 270
AzureIoTClient 6:641a9672db08 271 return result;
Azure.IoT Build 0:6ae2f7bca550 272 }
Azure.IoT Build 0:6ae2f7bca550 273
Azure.IoT Build 0:6ae2f7bca550 274 static void on_message_sender_state_changed(void* context, MESSAGE_SENDER_STATE new_state, MESSAGE_SENDER_STATE previous_state)
Azure.IoT Build 0:6ae2f7bca550 275 {
AzureIoTClient 6:641a9672db08 276 AMQP_MANAGEMENT_INSTANCE* amqp_management_instance = (AMQP_MANAGEMENT_INSTANCE*)context;
AzureIoTClient 6:641a9672db08 277 (void)previous_state;
AzureIoTClient 6:641a9672db08 278 switch (new_state)
AzureIoTClient 6:641a9672db08 279 {
AzureIoTClient 6:641a9672db08 280 default:
AzureIoTClient 6:641a9672db08 281 break;
Azure.IoT Build 0:6ae2f7bca550 282
AzureIoTClient 6:641a9672db08 283 case MESSAGE_SENDER_STATE_OPEN:
AzureIoTClient 6:641a9672db08 284 amqp_management_instance->sender_connected = 1;
AzureIoTClient 6:641a9672db08 285 (void)send_operation_messages(amqp_management_instance);
AzureIoTClient 6:641a9672db08 286 break;
Azure.IoT Build 0:6ae2f7bca550 287
AzureIoTClient 6:641a9672db08 288 case MESSAGE_SENDER_STATE_CLOSING:
AzureIoTClient 6:641a9672db08 289 case MESSAGE_SENDER_STATE_ERROR:
AzureIoTClient 6:641a9672db08 290 amqp_management_instance->sender_connected = 0;
AzureIoTClient 6:641a9672db08 291 amqpmanagement_set_state(amqp_management_instance, AMQP_MANAGEMENT_STATE_ERROR);
AzureIoTClient 6:641a9672db08 292 break;
AzureIoTClient 6:641a9672db08 293 }
Azure.IoT Build 0:6ae2f7bca550 294 }
Azure.IoT Build 0:6ae2f7bca550 295
Azure.IoT Build 0:6ae2f7bca550 296 static void on_message_receiver_state_changed(const void* context, MESSAGE_RECEIVER_STATE new_state, MESSAGE_RECEIVER_STATE previous_state)
Azure.IoT Build 0:6ae2f7bca550 297 {
AzureIoTClient 6:641a9672db08 298 AMQP_MANAGEMENT_INSTANCE* amqp_management_instance = (AMQP_MANAGEMENT_INSTANCE*)context;
AzureIoTClient 6:641a9672db08 299 (void)previous_state;
AzureIoTClient 6:641a9672db08 300 switch (new_state)
AzureIoTClient 6:641a9672db08 301 {
AzureIoTClient 6:641a9672db08 302 default:
AzureIoTClient 6:641a9672db08 303 break;
Azure.IoT Build 0:6ae2f7bca550 304
AzureIoTClient 6:641a9672db08 305 case MESSAGE_RECEIVER_STATE_OPEN:
AzureIoTClient 6:641a9672db08 306 amqp_management_instance->receiver_connected = 1;
AzureIoTClient 6:641a9672db08 307 (void)send_operation_messages(amqp_management_instance);
AzureIoTClient 6:641a9672db08 308 break;
Azure.IoT Build 0:6ae2f7bca550 309
AzureIoTClient 6:641a9672db08 310 case MESSAGE_RECEIVER_STATE_CLOSING:
AzureIoTClient 6:641a9672db08 311 case MESSAGE_RECEIVER_STATE_ERROR:
AzureIoTClient 6:641a9672db08 312 amqp_management_instance->receiver_connected = 0;
AzureIoTClient 6:641a9672db08 313 amqpmanagement_set_state(amqp_management_instance, AMQP_MANAGEMENT_STATE_ERROR);
AzureIoTClient 6:641a9672db08 314 break;
AzureIoTClient 6:641a9672db08 315 }
Azure.IoT Build 0:6ae2f7bca550 316 }
Azure.IoT Build 0:6ae2f7bca550 317
Azure.IoT Build 0:6ae2f7bca550 318 static int set_message_id(MESSAGE_HANDLE message, unsigned long next_message_id)
Azure.IoT Build 0:6ae2f7bca550 319 {
AzureIoTClient 6:641a9672db08 320 int result = 0;
Azure.IoT Build 0:6ae2f7bca550 321
AzureIoTClient 6:641a9672db08 322 PROPERTIES_HANDLE properties;
AzureIoTClient 6:641a9672db08 323 if (message_get_properties(message, &properties) != 0)
AzureIoTClient 6:641a9672db08 324 {
AzureIoTClient 19:000ab4e6a2c1 325 result = __FAILURE__;
AzureIoTClient 6:641a9672db08 326 }
AzureIoTClient 6:641a9672db08 327 else
AzureIoTClient 6:641a9672db08 328 {
AzureIoTClient 21:f9c433d8e6ca 329 if (properties == NULL)
AzureIoTClient 21:f9c433d8e6ca 330 {
AzureIoTClient 21:f9c433d8e6ca 331 properties = properties_create();
AzureIoTClient 21:f9c433d8e6ca 332 }
AzureIoTClient 21:f9c433d8e6ca 333
AzureIoTClient 21:f9c433d8e6ca 334 if (properties == NULL)
AzureIoTClient 6:641a9672db08 335 {
AzureIoTClient 19:000ab4e6a2c1 336 result = __FAILURE__;
AzureIoTClient 6:641a9672db08 337 }
AzureIoTClient 6:641a9672db08 338 else
AzureIoTClient 6:641a9672db08 339 {
AzureIoTClient 21:f9c433d8e6ca 340 AMQP_VALUE message_id = amqpvalue_create_message_id_ulong(next_message_id);
AzureIoTClient 21:f9c433d8e6ca 341 if (message_id == NULL)
AzureIoTClient 21:f9c433d8e6ca 342 {
AzureIoTClient 21:f9c433d8e6ca 343 result = __FAILURE__;
AzureIoTClient 21:f9c433d8e6ca 344 }
AzureIoTClient 21:f9c433d8e6ca 345 else
AzureIoTClient 21:f9c433d8e6ca 346 {
AzureIoTClient 21:f9c433d8e6ca 347 if (properties_set_message_id(properties, message_id) != 0)
AzureIoTClient 21:f9c433d8e6ca 348 {
AzureIoTClient 21:f9c433d8e6ca 349 result = __FAILURE__;
AzureIoTClient 21:f9c433d8e6ca 350 }
AzureIoTClient 21:f9c433d8e6ca 351
AzureIoTClient 21:f9c433d8e6ca 352 amqpvalue_destroy(message_id);
AzureIoTClient 21:f9c433d8e6ca 353 }
AzureIoTClient 21:f9c433d8e6ca 354
AzureIoTClient 21:f9c433d8e6ca 355 if (message_set_properties(message, properties) != 0)
AzureIoTClient 6:641a9672db08 356 {
AzureIoTClient 19:000ab4e6a2c1 357 result = __FAILURE__;
AzureIoTClient 6:641a9672db08 358 }
Azure.IoT Build 0:6ae2f7bca550 359
AzureIoTClient 21:f9c433d8e6ca 360 properties_destroy(properties);
AzureIoTClient 6:641a9672db08 361 }
AzureIoTClient 6:641a9672db08 362 }
Azure.IoT Build 0:6ae2f7bca550 363
AzureIoTClient 6:641a9672db08 364 return result;
Azure.IoT Build 0:6ae2f7bca550 365 }
Azure.IoT Build 0:6ae2f7bca550 366
Azure.IoT Build 0:6ae2f7bca550 367 static int add_string_key_value_pair_to_map(AMQP_VALUE map, const char* key, const char* value)
Azure.IoT Build 0:6ae2f7bca550 368 {
AzureIoTClient 6:641a9672db08 369 int result;
Azure.IoT Build 0:6ae2f7bca550 370
AzureIoTClient 6:641a9672db08 371 AMQP_VALUE key_value = amqpvalue_create_string(key);
AzureIoTClient 6:641a9672db08 372 if (key == NULL)
AzureIoTClient 6:641a9672db08 373 {
AzureIoTClient 19:000ab4e6a2c1 374 result = __FAILURE__;
AzureIoTClient 6:641a9672db08 375 }
AzureIoTClient 6:641a9672db08 376 else
AzureIoTClient 6:641a9672db08 377 {
AzureIoTClient 6:641a9672db08 378 AMQP_VALUE value_value = amqpvalue_create_string(value);
AzureIoTClient 6:641a9672db08 379 if (value_value == NULL)
AzureIoTClient 6:641a9672db08 380 {
AzureIoTClient 19:000ab4e6a2c1 381 result = __FAILURE__;
AzureIoTClient 6:641a9672db08 382 }
AzureIoTClient 6:641a9672db08 383 else
AzureIoTClient 6:641a9672db08 384 {
AzureIoTClient 6:641a9672db08 385 if (amqpvalue_set_map_value(map, key_value, value_value) != 0)
AzureIoTClient 6:641a9672db08 386 {
AzureIoTClient 19:000ab4e6a2c1 387 result = __FAILURE__;
AzureIoTClient 6:641a9672db08 388 }
AzureIoTClient 6:641a9672db08 389 else
AzureIoTClient 6:641a9672db08 390 {
AzureIoTClient 6:641a9672db08 391 result = 0;
AzureIoTClient 6:641a9672db08 392 }
Azure.IoT Build 0:6ae2f7bca550 393
AzureIoTClient 6:641a9672db08 394 amqpvalue_destroy(key_value);
AzureIoTClient 6:641a9672db08 395 }
Azure.IoT Build 0:6ae2f7bca550 396
AzureIoTClient 6:641a9672db08 397 amqpvalue_destroy(value_value);
AzureIoTClient 6:641a9672db08 398 }
Azure.IoT Build 0:6ae2f7bca550 399
AzureIoTClient 6:641a9672db08 400 return result;
Azure.IoT Build 0:6ae2f7bca550 401 }
Azure.IoT Build 0:6ae2f7bca550 402
Azure.IoT Build 0:6ae2f7bca550 403 AMQP_MANAGEMENT_HANDLE amqpmanagement_create(SESSION_HANDLE session, const char* management_node, ON_AMQP_MANAGEMENT_STATE_CHANGED on_amqp_management_state_changed, void* callback_context)
Azure.IoT Build 0:6ae2f7bca550 404 {
AzureIoTClient 6:641a9672db08 405 AMQP_MANAGEMENT_INSTANCE* result;
Azure.IoT Build 0:6ae2f7bca550 406
AzureIoTClient 6:641a9672db08 407 if (session == NULL)
AzureIoTClient 6:641a9672db08 408 {
AzureIoTClient 6:641a9672db08 409 result = NULL;
AzureIoTClient 6:641a9672db08 410 }
AzureIoTClient 6:641a9672db08 411 else
AzureIoTClient 6:641a9672db08 412 {
AzureIoTClient 21:f9c433d8e6ca 413 result = (AMQP_MANAGEMENT_INSTANCE*)malloc(sizeof(AMQP_MANAGEMENT_INSTANCE));
AzureIoTClient 6:641a9672db08 414 if (result != NULL)
AzureIoTClient 6:641a9672db08 415 {
AzureIoTClient 6:641a9672db08 416 result->session = session;
AzureIoTClient 6:641a9672db08 417 result->sender_connected = 0;
AzureIoTClient 6:641a9672db08 418 result->receiver_connected = 0;
AzureIoTClient 6:641a9672db08 419 result->operation_message_count = 0;
AzureIoTClient 6:641a9672db08 420 result->operation_messages = NULL;
AzureIoTClient 6:641a9672db08 421 result->on_amqp_management_state_changed = on_amqp_management_state_changed;
AzureIoTClient 6:641a9672db08 422 result->callback_context = callback_context;
AzureIoTClient 21:f9c433d8e6ca 423 result->amqp_management_state = AMQP_MANAGEMENT_STATE_IDLE;
Azure.IoT Build 0:6ae2f7bca550 424
AzureIoTClient 6:641a9672db08 425 AMQP_VALUE source = messaging_create_source(management_node);
AzureIoTClient 6:641a9672db08 426 if (source == NULL)
AzureIoTClient 6:641a9672db08 427 {
AzureIoTClient 21:f9c433d8e6ca 428 free(result);
AzureIoTClient 6:641a9672db08 429 result = NULL;
AzureIoTClient 6:641a9672db08 430 }
AzureIoTClient 6:641a9672db08 431 else
AzureIoTClient 6:641a9672db08 432 {
AzureIoTClient 6:641a9672db08 433 AMQP_VALUE target = messaging_create_target(management_node);
AzureIoTClient 6:641a9672db08 434 if (target == NULL)
AzureIoTClient 6:641a9672db08 435 {
AzureIoTClient 21:f9c433d8e6ca 436 free(result);
AzureIoTClient 6:641a9672db08 437 result = NULL;
AzureIoTClient 6:641a9672db08 438 }
AzureIoTClient 6:641a9672db08 439 else
AzureIoTClient 6:641a9672db08 440 {
AzureIoTClient 6:641a9672db08 441 static const char* sender_suffix = "-sender";
Azure.IoT Build 0:6ae2f7bca550 442
AzureIoTClient 21:f9c433d8e6ca 443 char* sender_link_name = (char*)malloc(strlen(management_node) + strlen(sender_suffix) + 1);
AzureIoTClient 6:641a9672db08 444 if (sender_link_name == NULL)
AzureIoTClient 6:641a9672db08 445 {
AzureIoTClient 6:641a9672db08 446 result = NULL;
AzureIoTClient 6:641a9672db08 447 }
AzureIoTClient 6:641a9672db08 448 else
AzureIoTClient 6:641a9672db08 449 {
AzureIoTClient 6:641a9672db08 450 static const char* receiver_suffix = "-receiver";
Azure.IoT Build 0:6ae2f7bca550 451
AzureIoTClient 6:641a9672db08 452 (void)strcpy(sender_link_name, management_node);
AzureIoTClient 6:641a9672db08 453 (void)strcat(sender_link_name, sender_suffix);
Azure.IoT Build 0:6ae2f7bca550 454
AzureIoTClient 21:f9c433d8e6ca 455 char* receiver_link_name = (char*)malloc(strlen(management_node) + strlen(receiver_suffix) + 1);
AzureIoTClient 6:641a9672db08 456 if (receiver_link_name == NULL)
AzureIoTClient 6:641a9672db08 457 {
AzureIoTClient 6:641a9672db08 458 result = NULL;
AzureIoTClient 6:641a9672db08 459 }
AzureIoTClient 6:641a9672db08 460 else
AzureIoTClient 6:641a9672db08 461 {
AzureIoTClient 6:641a9672db08 462 (void)strcpy(receiver_link_name, management_node);
AzureIoTClient 6:641a9672db08 463 (void)strcat(receiver_link_name, receiver_suffix);
Azure.IoT Build 0:6ae2f7bca550 464
AzureIoTClient 6:641a9672db08 465 result->sender_link = link_create(session, "cbs-sender", role_sender, source, target);
AzureIoTClient 6:641a9672db08 466 if (result->sender_link == NULL)
AzureIoTClient 6:641a9672db08 467 {
AzureIoTClient 21:f9c433d8e6ca 468 free(result);
AzureIoTClient 6:641a9672db08 469 result = NULL;
AzureIoTClient 6:641a9672db08 470 }
AzureIoTClient 6:641a9672db08 471 else
AzureIoTClient 6:641a9672db08 472 {
AzureIoTClient 6:641a9672db08 473 result->receiver_link = link_create(session, "cbs-receiver", role_receiver, source, target);
AzureIoTClient 6:641a9672db08 474 if (result->receiver_link == NULL)
AzureIoTClient 6:641a9672db08 475 {
AzureIoTClient 6:641a9672db08 476 link_destroy(result->sender_link);
AzureIoTClient 21:f9c433d8e6ca 477 free(result);
AzureIoTClient 6:641a9672db08 478 result = NULL;
AzureIoTClient 6:641a9672db08 479 }
AzureIoTClient 6:641a9672db08 480 else
AzureIoTClient 6:641a9672db08 481 {
AzureIoTClient 6:641a9672db08 482 if ((link_set_max_message_size(result->sender_link, 65535) != 0) ||
AzureIoTClient 6:641a9672db08 483 (link_set_max_message_size(result->receiver_link, 65535) != 0))
AzureIoTClient 6:641a9672db08 484 {
AzureIoTClient 6:641a9672db08 485 link_destroy(result->sender_link);
AzureIoTClient 6:641a9672db08 486 link_destroy(result->receiver_link);
AzureIoTClient 21:f9c433d8e6ca 487 free(result);
AzureIoTClient 6:641a9672db08 488 result = NULL;
AzureIoTClient 6:641a9672db08 489 }
AzureIoTClient 6:641a9672db08 490 else
AzureIoTClient 6:641a9672db08 491 {
AzureIoTClient 6:641a9672db08 492 result->message_sender = messagesender_create(result->sender_link, on_message_sender_state_changed, result);
AzureIoTClient 6:641a9672db08 493 if (result->message_sender == NULL)
AzureIoTClient 6:641a9672db08 494 {
AzureIoTClient 6:641a9672db08 495 link_destroy(result->sender_link);
AzureIoTClient 6:641a9672db08 496 link_destroy(result->receiver_link);
AzureIoTClient 21:f9c433d8e6ca 497 free(result);
AzureIoTClient 6:641a9672db08 498 result = NULL;
AzureIoTClient 6:641a9672db08 499 }
AzureIoTClient 6:641a9672db08 500 else
AzureIoTClient 6:641a9672db08 501 {
AzureIoTClient 6:641a9672db08 502 result->message_receiver = messagereceiver_create(result->receiver_link, on_message_receiver_state_changed, result);
AzureIoTClient 6:641a9672db08 503 if (result->message_receiver == NULL)
AzureIoTClient 6:641a9672db08 504 {
AzureIoTClient 6:641a9672db08 505 messagesender_destroy(result->message_sender);
AzureIoTClient 6:641a9672db08 506 link_destroy(result->sender_link);
AzureIoTClient 6:641a9672db08 507 link_destroy(result->receiver_link);
AzureIoTClient 21:f9c433d8e6ca 508 free(result);
AzureIoTClient 6:641a9672db08 509 result = NULL;
AzureIoTClient 6:641a9672db08 510 }
AzureIoTClient 6:641a9672db08 511 else
AzureIoTClient 6:641a9672db08 512 {
AzureIoTClient 6:641a9672db08 513 result->next_message_id = 0;
AzureIoTClient 6:641a9672db08 514 }
AzureIoTClient 6:641a9672db08 515 }
AzureIoTClient 6:641a9672db08 516 }
AzureIoTClient 6:641a9672db08 517 }
AzureIoTClient 6:641a9672db08 518 }
Azure.IoT Build 0:6ae2f7bca550 519
AzureIoTClient 21:f9c433d8e6ca 520 free(receiver_link_name);
AzureIoTClient 6:641a9672db08 521 }
Azure.IoT Build 0:6ae2f7bca550 522
AzureIoTClient 21:f9c433d8e6ca 523 free(sender_link_name);
AzureIoTClient 6:641a9672db08 524 }
Azure.IoT Build 0:6ae2f7bca550 525
AzureIoTClient 6:641a9672db08 526 amqpvalue_destroy(target);
AzureIoTClient 6:641a9672db08 527 }
Azure.IoT Build 0:6ae2f7bca550 528
AzureIoTClient 6:641a9672db08 529 amqpvalue_destroy(source);
AzureIoTClient 6:641a9672db08 530 }
AzureIoTClient 6:641a9672db08 531 }
AzureIoTClient 6:641a9672db08 532 }
Azure.IoT Build 0:6ae2f7bca550 533
AzureIoTClient 6:641a9672db08 534 return result;
Azure.IoT Build 0:6ae2f7bca550 535 }
Azure.IoT Build 0:6ae2f7bca550 536
Azure.IoT Build 0:6ae2f7bca550 537 void amqpmanagement_destroy(AMQP_MANAGEMENT_HANDLE amqp_management)
Azure.IoT Build 0:6ae2f7bca550 538 {
AzureIoTClient 6:641a9672db08 539 if (amqp_management != NULL)
AzureIoTClient 6:641a9672db08 540 {
AzureIoTClient 6:641a9672db08 541 (void)amqpmanagement_close(amqp_management);
Azure.IoT Build 0:6ae2f7bca550 542
AzureIoTClient 6:641a9672db08 543 if (amqp_management->operation_message_count > 0)
AzureIoTClient 6:641a9672db08 544 {
AzureIoTClient 6:641a9672db08 545 size_t i;
AzureIoTClient 6:641a9672db08 546 for (i = 0; i < amqp_management->operation_message_count; i++)
AzureIoTClient 6:641a9672db08 547 {
AzureIoTClient 6:641a9672db08 548 message_destroy(amqp_management->operation_messages[i]->message);
AzureIoTClient 21:f9c433d8e6ca 549 free(amqp_management->operation_messages[i]);
AzureIoTClient 6:641a9672db08 550 }
Azure.IoT Build 0:6ae2f7bca550 551
AzureIoTClient 21:f9c433d8e6ca 552 free(amqp_management->operation_messages);
AzureIoTClient 6:641a9672db08 553 }
Azure.IoT Build 0:6ae2f7bca550 554
AzureIoTClient 6:641a9672db08 555 link_destroy(amqp_management->sender_link);
AzureIoTClient 6:641a9672db08 556 link_destroy(amqp_management->receiver_link);
AzureIoTClient 6:641a9672db08 557 messagesender_destroy(amqp_management->message_sender);
AzureIoTClient 6:641a9672db08 558 messagereceiver_destroy(amqp_management->message_receiver);
AzureIoTClient 21:f9c433d8e6ca 559 free(amqp_management);
AzureIoTClient 6:641a9672db08 560 }
Azure.IoT Build 0:6ae2f7bca550 561 }
Azure.IoT Build 0:6ae2f7bca550 562
Azure.IoT Build 0:6ae2f7bca550 563 int amqpmanagement_open(AMQP_MANAGEMENT_HANDLE amqp_management)
Azure.IoT Build 0:6ae2f7bca550 564 {
AzureIoTClient 6:641a9672db08 565 int result;
Azure.IoT Build 0:6ae2f7bca550 566
AzureIoTClient 6:641a9672db08 567 if (amqp_management == NULL)
AzureIoTClient 6:641a9672db08 568 {
AzureIoTClient 19:000ab4e6a2c1 569 result = __FAILURE__;
AzureIoTClient 6:641a9672db08 570 }
AzureIoTClient 6:641a9672db08 571 else
AzureIoTClient 6:641a9672db08 572 {
AzureIoTClient 6:641a9672db08 573 if (messagereceiver_open(amqp_management->message_receiver, on_message_received, amqp_management) != 0)
AzureIoTClient 6:641a9672db08 574 {
AzureIoTClient 19:000ab4e6a2c1 575 result = __FAILURE__;
AzureIoTClient 6:641a9672db08 576 }
AzureIoTClient 6:641a9672db08 577 else
AzureIoTClient 6:641a9672db08 578 {
AzureIoTClient 6:641a9672db08 579 if (messagesender_open(amqp_management->message_sender) != 0)
AzureIoTClient 6:641a9672db08 580 {
AzureIoTClient 6:641a9672db08 581 messagereceiver_close(amqp_management->message_receiver);
AzureIoTClient 19:000ab4e6a2c1 582 result = __FAILURE__;
AzureIoTClient 6:641a9672db08 583 }
AzureIoTClient 6:641a9672db08 584 else
AzureIoTClient 6:641a9672db08 585 {
AzureIoTClient 6:641a9672db08 586 result = 0;
AzureIoTClient 6:641a9672db08 587 }
AzureIoTClient 6:641a9672db08 588 }
AzureIoTClient 6:641a9672db08 589 }
Azure.IoT Build 0:6ae2f7bca550 590
AzureIoTClient 6:641a9672db08 591 return result;
Azure.IoT Build 0:6ae2f7bca550 592 }
Azure.IoT Build 0:6ae2f7bca550 593
Azure.IoT Build 0:6ae2f7bca550 594 int amqpmanagement_close(AMQP_MANAGEMENT_HANDLE amqp_management)
Azure.IoT Build 0:6ae2f7bca550 595 {
AzureIoTClient 6:641a9672db08 596 int result;
Azure.IoT Build 0:6ae2f7bca550 597
AzureIoTClient 6:641a9672db08 598 if (amqp_management == NULL)
AzureIoTClient 6:641a9672db08 599 {
AzureIoTClient 19:000ab4e6a2c1 600 result = __FAILURE__;
AzureIoTClient 6:641a9672db08 601 }
AzureIoTClient 6:641a9672db08 602 else
AzureIoTClient 6:641a9672db08 603 {
AzureIoTClient 6:641a9672db08 604 if ((messagesender_close(amqp_management->message_sender) != 0) ||
AzureIoTClient 6:641a9672db08 605 (messagereceiver_close(amqp_management->message_receiver) != 0))
AzureIoTClient 6:641a9672db08 606 {
AzureIoTClient 19:000ab4e6a2c1 607 result = __FAILURE__;
AzureIoTClient 6:641a9672db08 608 }
AzureIoTClient 6:641a9672db08 609 else
AzureIoTClient 6:641a9672db08 610 {
AzureIoTClient 6:641a9672db08 611 result = 0;
AzureIoTClient 6:641a9672db08 612 }
AzureIoTClient 6:641a9672db08 613 }
Azure.IoT Build 0:6ae2f7bca550 614
AzureIoTClient 6:641a9672db08 615 return result;
Azure.IoT Build 0:6ae2f7bca550 616 }
Azure.IoT Build 0:6ae2f7bca550 617
Azure.IoT Build 0:6ae2f7bca550 618 int amqpmanagement_start_operation(AMQP_MANAGEMENT_HANDLE amqp_management, const char* operation, const char* type, const char* locales, MESSAGE_HANDLE message, ON_OPERATION_COMPLETE on_operation_complete, void* context)
Azure.IoT Build 0:6ae2f7bca550 619 {
AzureIoTClient 6:641a9672db08 620 int result;
AzureIoTClient 6:641a9672db08 621
AzureIoTClient 6:641a9672db08 622 if ((amqp_management == NULL) ||
AzureIoTClient 6:641a9672db08 623 (operation == NULL))
AzureIoTClient 6:641a9672db08 624 {
AzureIoTClient 19:000ab4e6a2c1 625 result = __FAILURE__;
AzureIoTClient 6:641a9672db08 626 }
AzureIoTClient 6:641a9672db08 627 else
AzureIoTClient 6:641a9672db08 628 {
AzureIoTClient 6:641a9672db08 629 AMQP_VALUE application_properties;
AzureIoTClient 6:641a9672db08 630 if (message_get_application_properties(message, &application_properties) != 0)
AzureIoTClient 6:641a9672db08 631 {
AzureIoTClient 19:000ab4e6a2c1 632 result = __FAILURE__;
AzureIoTClient 6:641a9672db08 633 }
AzureIoTClient 6:641a9672db08 634 else
AzureIoTClient 6:641a9672db08 635 {
AzureIoTClient 6:641a9672db08 636 if ((add_string_key_value_pair_to_map(application_properties, "operation", operation) != 0) ||
AzureIoTClient 6:641a9672db08 637 (add_string_key_value_pair_to_map(application_properties, "type", type) != 0) ||
AzureIoTClient 6:641a9672db08 638 ((locales != NULL) && (add_string_key_value_pair_to_map(application_properties, "locales", locales) != 0)))
AzureIoTClient 6:641a9672db08 639 {
AzureIoTClient 19:000ab4e6a2c1 640 result = __FAILURE__;
AzureIoTClient 6:641a9672db08 641 }
AzureIoTClient 6:641a9672db08 642 else
AzureIoTClient 6:641a9672db08 643 {
AzureIoTClient 6:641a9672db08 644 if ((message_set_application_properties(message, application_properties) != 0) ||
AzureIoTClient 6:641a9672db08 645 (set_message_id(message, amqp_management->next_message_id) != 0))
AzureIoTClient 6:641a9672db08 646 {
AzureIoTClient 19:000ab4e6a2c1 647 result = __FAILURE__;
AzureIoTClient 6:641a9672db08 648 }
AzureIoTClient 6:641a9672db08 649 else
AzureIoTClient 6:641a9672db08 650 {
AzureIoTClient 21:f9c433d8e6ca 651 OPERATION_MESSAGE_INSTANCE* pending_operation_message = malloc(sizeof(OPERATION_MESSAGE_INSTANCE));
AzureIoTClient 6:641a9672db08 652 if (pending_operation_message == NULL)
AzureIoTClient 6:641a9672db08 653 {
AzureIoTClient 19:000ab4e6a2c1 654 result = __FAILURE__;
AzureIoTClient 6:641a9672db08 655 }
AzureIoTClient 6:641a9672db08 656 else
AzureIoTClient 6:641a9672db08 657 {
AzureIoTClient 6:641a9672db08 658 pending_operation_message->message = message_clone(message);
AzureIoTClient 6:641a9672db08 659 pending_operation_message->callback_context = context;
AzureIoTClient 6:641a9672db08 660 pending_operation_message->on_operation_complete = on_operation_complete;
AzureIoTClient 6:641a9672db08 661 pending_operation_message->operation_state = OPERATION_STATE_NOT_SENT;
AzureIoTClient 6:641a9672db08 662 pending_operation_message->message_id = amqp_management->next_message_id;
Azure.IoT Build 0:6ae2f7bca550 663
AzureIoTClient 6:641a9672db08 664 amqp_management->next_message_id++;
AzureIoTClient 6:641a9672db08 665
AzureIoTClient 21:f9c433d8e6ca 666 OPERATION_MESSAGE_INSTANCE** new_operation_messages = realloc(amqp_management->operation_messages, (amqp_management->operation_message_count + 1) * sizeof(OPERATION_MESSAGE_INSTANCE*));
AzureIoTClient 6:641a9672db08 667 if (new_operation_messages == NULL)
AzureIoTClient 6:641a9672db08 668 {
AzureIoTClient 6:641a9672db08 669 message_destroy(message);
AzureIoTClient 21:f9c433d8e6ca 670 free(pending_operation_message);
AzureIoTClient 19:000ab4e6a2c1 671 result = __FAILURE__;
AzureIoTClient 6:641a9672db08 672 }
AzureIoTClient 6:641a9672db08 673 else
AzureIoTClient 6:641a9672db08 674 {
AzureIoTClient 6:641a9672db08 675 amqp_management->operation_messages = new_operation_messages;
AzureIoTClient 6:641a9672db08 676 amqp_management->operation_messages[amqp_management->operation_message_count] = pending_operation_message;
AzureIoTClient 6:641a9672db08 677 amqp_management->operation_message_count++;
AzureIoTClient 6:641a9672db08 678
AzureIoTClient 6:641a9672db08 679 if (send_operation_messages(amqp_management) != 0)
AzureIoTClient 6:641a9672db08 680 {
AzureIoTClient 6:641a9672db08 681 if (on_operation_complete != NULL)
AzureIoTClient 6:641a9672db08 682 {
AzureIoTClient 21:f9c433d8e6ca 683 on_operation_complete(context, OPERATION_RESULT_ERROR, 0, NULL);
AzureIoTClient 6:641a9672db08 684 }
Azure.IoT Build 0:6ae2f7bca550 685
AzureIoTClient 19:000ab4e6a2c1 686 result = __FAILURE__;
AzureIoTClient 6:641a9672db08 687 }
AzureIoTClient 6:641a9672db08 688 else
AzureIoTClient 6:641a9672db08 689 {
AzureIoTClient 6:641a9672db08 690 result = 0;
AzureIoTClient 6:641a9672db08 691 }
AzureIoTClient 6:641a9672db08 692 }
AzureIoTClient 6:641a9672db08 693 }
AzureIoTClient 6:641a9672db08 694 }
AzureIoTClient 6:641a9672db08 695 }
Azure.IoT Build 0:6ae2f7bca550 696
AzureIoTClient 6:641a9672db08 697 amqpvalue_destroy(application_properties);
AzureIoTClient 6:641a9672db08 698 }
AzureIoTClient 6:641a9672db08 699 }
AzureIoTClient 6:641a9672db08 700 return result;
AzureIoTClient 6:641a9672db08 701 }
Azure.IoT Build 0:6ae2f7bca550 702
AzureIoTClient 6:641a9672db08 703 void amqpmanagement_set_trace(AMQP_MANAGEMENT_HANDLE amqp_management, bool traceOn)
AzureIoTClient 6:641a9672db08 704 {
AzureIoTClient 6:641a9672db08 705 if (amqp_management != NULL)
AzureIoTClient 6:641a9672db08 706 {
AzureIoTClient 6:641a9672db08 707 messagesender_set_trace(amqp_management->message_sender, traceOn);
AzureIoTClient 6:641a9672db08 708 }
Azure.IoT Build 0:6ae2f7bca550 709 }