A small memory footprint AMQP implimentation

Dependents:   iothub_client_sample_amqp remote_monitoring simplesample_amqp

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