A small memory footprint AMQP implimentation

Dependents:   iothub_client_sample_amqp remote_monitoring simplesample_amqp

Committer:
AzureIoTClient
Date:
Thu Apr 06 14:11:27 2017 -0700
Revision:
22:524bded3f7a8
Parent:
21:f9c433d8e6ca
Child:
23:1111ee8bcba4
1.1.11

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