A small memory footprint AMQP implimentation

Dependents:   iothub_client_sample_amqp remote_monitoring simplesample_amqp

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