A small memory footprint AMQP implimentation

Dependents:   iothub_client_sample_amqp remote_monitoring simplesample_amqp

Committer:
AzureIoTClient
Date:
Fri Jun 30 10:41:22 2017 -0700
Revision:
28:add19eb7defa
Parent:
27:d74f1cea23e1
Child:
34:6be9c2058664
1.1.18

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Azure.IoT Build 0:6ae2f7bca550 1 // Copyright (c) Microsoft. All rights reserved.
Azure.IoT Build 0:6ae2f7bca550 2 // Licensed under the MIT license. See LICENSE file in the project root for full license information.
Azure.IoT Build 0:6ae2f7bca550 3
Azure.IoT Build 0:6ae2f7bca550 4 #include <stdlib.h>
AzureIoTClient 20:206846c14c80 5
AzureIoTClient 19:000ab4e6a2c1 6 #include "azure_c_shared_utility/optimize_size.h"
AzureIoTClient 21:f9c433d8e6ca 7 #include "azure_c_shared_utility/gballoc.h"
AzureIoTClient 27:d74f1cea23e1 8 #include "azure_c_shared_utility/xlogging.h"
Azure.IoT Build 0:6ae2f7bca550 9 #include "azure_uamqp_c/message_receiver.h"
Azure.IoT Build 0:6ae2f7bca550 10 #include "azure_uamqp_c/amqpvalue.h"
Azure.IoT Build 0:6ae2f7bca550 11 #include "azure_uamqp_c/amqp_definitions.h"
Azure.IoT Build 0:6ae2f7bca550 12
Azure.IoT Build 0:6ae2f7bca550 13 typedef struct MESSAGE_RECEIVER_INSTANCE_TAG
Azure.IoT Build 0:6ae2f7bca550 14 {
AzureIoTClient 28:add19eb7defa 15 LINK_HANDLE link;
AzureIoTClient 28:add19eb7defa 16 ON_MESSAGE_RECEIVED on_message_received;
AzureIoTClient 28:add19eb7defa 17 ON_MESSAGE_RECEIVER_STATE_CHANGED on_message_receiver_state_changed;
AzureIoTClient 28:add19eb7defa 18 MESSAGE_RECEIVER_STATE message_receiver_state;
AzureIoTClient 28:add19eb7defa 19 const void* on_message_receiver_state_changed_context;
AzureIoTClient 28:add19eb7defa 20 const void* callback_context;
AzureIoTClient 28:add19eb7defa 21 MESSAGE_HANDLE decoded_message;
AzureIoTClient 28:add19eb7defa 22 bool decode_error;
Azure.IoT Build 0:6ae2f7bca550 23 } MESSAGE_RECEIVER_INSTANCE;
Azure.IoT Build 0:6ae2f7bca550 24
Azure.IoT Build 0:6ae2f7bca550 25 static void set_message_receiver_state(MESSAGE_RECEIVER_INSTANCE* message_receiver_instance, MESSAGE_RECEIVER_STATE new_state)
Azure.IoT Build 0:6ae2f7bca550 26 {
AzureIoTClient 28:add19eb7defa 27 MESSAGE_RECEIVER_STATE previous_state = message_receiver_instance->message_receiver_state;
AzureIoTClient 28:add19eb7defa 28 message_receiver_instance->message_receiver_state = new_state;
AzureIoTClient 28:add19eb7defa 29 if (message_receiver_instance->on_message_receiver_state_changed != NULL)
AzureIoTClient 28:add19eb7defa 30 {
AzureIoTClient 28:add19eb7defa 31 message_receiver_instance->on_message_receiver_state_changed(message_receiver_instance->on_message_receiver_state_changed_context, new_state, previous_state);
AzureIoTClient 28:add19eb7defa 32 }
Azure.IoT Build 0:6ae2f7bca550 33 }
Azure.IoT Build 0:6ae2f7bca550 34
Azure.IoT Build 0:6ae2f7bca550 35 static void decode_message_value_callback(void* context, AMQP_VALUE decoded_value)
Azure.IoT Build 0:6ae2f7bca550 36 {
AzureIoTClient 28:add19eb7defa 37 MESSAGE_RECEIVER_INSTANCE* message_receiver_instance = (MESSAGE_RECEIVER_INSTANCE*)context;
AzureIoTClient 28:add19eb7defa 38 MESSAGE_HANDLE decoded_message = message_receiver_instance->decoded_message;
AzureIoTClient 28:add19eb7defa 39 AMQP_VALUE descriptor = amqpvalue_get_inplace_descriptor(decoded_value);
Azure.IoT Build 0:6ae2f7bca550 40
AzureIoTClient 28:add19eb7defa 41 if (is_application_properties_type_by_descriptor(descriptor))
AzureIoTClient 28:add19eb7defa 42 {
AzureIoTClient 28:add19eb7defa 43 if (message_set_application_properties(decoded_message, decoded_value) != 0)
AzureIoTClient 28:add19eb7defa 44 {
AzureIoTClient 28:add19eb7defa 45 message_receiver_instance->decode_error = true;
AzureIoTClient 28:add19eb7defa 46 }
AzureIoTClient 28:add19eb7defa 47 }
AzureIoTClient 28:add19eb7defa 48 else if (is_properties_type_by_descriptor(descriptor))
AzureIoTClient 28:add19eb7defa 49 {
AzureIoTClient 28:add19eb7defa 50 PROPERTIES_HANDLE properties;
AzureIoTClient 28:add19eb7defa 51 if (amqpvalue_get_properties(decoded_value, &properties) != 0)
AzureIoTClient 28:add19eb7defa 52 {
AzureIoTClient 28:add19eb7defa 53 message_receiver_instance->decode_error = true;
AzureIoTClient 28:add19eb7defa 54 }
AzureIoTClient 28:add19eb7defa 55 else
AzureIoTClient 28:add19eb7defa 56 {
AzureIoTClient 28:add19eb7defa 57 if (message_set_properties(decoded_message, properties) != 0)
AzureIoTClient 28:add19eb7defa 58 {
AzureIoTClient 28:add19eb7defa 59 message_receiver_instance->decode_error = true;
AzureIoTClient 28:add19eb7defa 60 }
Azure.IoT Build 0:6ae2f7bca550 61
AzureIoTClient 28:add19eb7defa 62 properties_destroy(properties);
AzureIoTClient 28:add19eb7defa 63 }
AzureIoTClient 28:add19eb7defa 64 }
AzureIoTClient 28:add19eb7defa 65 else if (is_delivery_annotations_type_by_descriptor(descriptor))
AzureIoTClient 28:add19eb7defa 66 {
AzureIoTClient 28:add19eb7defa 67 annotations delivery_annotations = amqpvalue_get_inplace_described_value(decoded_value);
AzureIoTClient 28:add19eb7defa 68 if ((delivery_annotations == NULL) ||
AzureIoTClient 28:add19eb7defa 69 (message_set_delivery_annotations(decoded_message, delivery_annotations) != 0))
AzureIoTClient 28:add19eb7defa 70 {
AzureIoTClient 28:add19eb7defa 71 message_receiver_instance->decode_error = true;
AzureIoTClient 28:add19eb7defa 72 }
AzureIoTClient 28:add19eb7defa 73 }
AzureIoTClient 28:add19eb7defa 74 else if (is_message_annotations_type_by_descriptor(descriptor))
AzureIoTClient 28:add19eb7defa 75 {
AzureIoTClient 28:add19eb7defa 76 annotations message_annotations = amqpvalue_get_inplace_described_value(decoded_value);
AzureIoTClient 28:add19eb7defa 77 if ((message_annotations == NULL) ||
AzureIoTClient 28:add19eb7defa 78 (message_set_message_annotations(decoded_message, message_annotations) != 0))
AzureIoTClient 28:add19eb7defa 79 {
AzureIoTClient 28:add19eb7defa 80 message_receiver_instance->decode_error = true;
AzureIoTClient 28:add19eb7defa 81 }
AzureIoTClient 28:add19eb7defa 82 }
AzureIoTClient 28:add19eb7defa 83 else if (is_header_type_by_descriptor(descriptor))
AzureIoTClient 28:add19eb7defa 84 {
AzureIoTClient 28:add19eb7defa 85 HEADER_HANDLE header;
AzureIoTClient 28:add19eb7defa 86 if (amqpvalue_get_header(decoded_value, &header) != 0)
AzureIoTClient 28:add19eb7defa 87 {
AzureIoTClient 28:add19eb7defa 88 message_receiver_instance->decode_error = true;
AzureIoTClient 28:add19eb7defa 89 }
AzureIoTClient 28:add19eb7defa 90 else
AzureIoTClient 28:add19eb7defa 91 {
AzureIoTClient 28:add19eb7defa 92 if (message_set_header(decoded_message, header) != 0)
AzureIoTClient 28:add19eb7defa 93 {
AzureIoTClient 28:add19eb7defa 94 message_receiver_instance->decode_error = true;
AzureIoTClient 28:add19eb7defa 95 }
Azure.IoT Build 0:6ae2f7bca550 96
AzureIoTClient 28:add19eb7defa 97 header_destroy(header);
AzureIoTClient 28:add19eb7defa 98 }
AzureIoTClient 28:add19eb7defa 99 }
AzureIoTClient 28:add19eb7defa 100 else if (is_footer_type_by_descriptor(descriptor))
AzureIoTClient 28:add19eb7defa 101 {
AzureIoTClient 28:add19eb7defa 102 annotations footer = amqpvalue_get_inplace_described_value(decoded_value);
AzureIoTClient 28:add19eb7defa 103 if ((footer == NULL) ||
AzureIoTClient 28:add19eb7defa 104 (message_set_footer(decoded_message, footer) != 0))
AzureIoTClient 28:add19eb7defa 105 {
AzureIoTClient 28:add19eb7defa 106 message_receiver_instance->decode_error = true;
AzureIoTClient 28:add19eb7defa 107 }
AzureIoTClient 28:add19eb7defa 108 }
AzureIoTClient 28:add19eb7defa 109 else if (is_amqp_value_type_by_descriptor(descriptor))
AzureIoTClient 28:add19eb7defa 110 {
AzureIoTClient 28:add19eb7defa 111 MESSAGE_BODY_TYPE body_type;
AzureIoTClient 28:add19eb7defa 112 message_get_body_type(decoded_message, &body_type);
AzureIoTClient 28:add19eb7defa 113 if (body_type != MESSAGE_BODY_TYPE_NONE)
AzureIoTClient 28:add19eb7defa 114 {
AzureIoTClient 28:add19eb7defa 115 message_receiver_instance->decode_error = true;
AzureIoTClient 28:add19eb7defa 116 }
AzureIoTClient 28:add19eb7defa 117 else
AzureIoTClient 28:add19eb7defa 118 {
AzureIoTClient 28:add19eb7defa 119 AMQP_VALUE body_amqp_value = amqpvalue_get_inplace_described_value(decoded_value);
AzureIoTClient 28:add19eb7defa 120 if ((body_amqp_value == NULL) ||
AzureIoTClient 28:add19eb7defa 121 (message_set_body_amqp_value(decoded_message, body_amqp_value) != 0))
AzureIoTClient 28:add19eb7defa 122 {
AzureIoTClient 28:add19eb7defa 123 message_receiver_instance->decode_error = true;
AzureIoTClient 28:add19eb7defa 124 }
AzureIoTClient 28:add19eb7defa 125 }
AzureIoTClient 28:add19eb7defa 126 }
AzureIoTClient 28:add19eb7defa 127 else if (is_data_type_by_descriptor(descriptor))
AzureIoTClient 28:add19eb7defa 128 {
AzureIoTClient 28:add19eb7defa 129 MESSAGE_BODY_TYPE body_type;
AzureIoTClient 28:add19eb7defa 130 message_get_body_type(decoded_message, &body_type);
AzureIoTClient 28:add19eb7defa 131 if ((body_type != MESSAGE_BODY_TYPE_NONE) &&
AzureIoTClient 28:add19eb7defa 132 (body_type != MESSAGE_BODY_TYPE_DATA))
AzureIoTClient 28:add19eb7defa 133 {
AzureIoTClient 28:add19eb7defa 134 message_receiver_instance->decode_error = true;
AzureIoTClient 28:add19eb7defa 135 }
AzureIoTClient 28:add19eb7defa 136 else
AzureIoTClient 28:add19eb7defa 137 {
AzureIoTClient 28:add19eb7defa 138 AMQP_VALUE body_data_value = amqpvalue_get_inplace_described_value(decoded_value);
AzureIoTClient 28:add19eb7defa 139 data data_value;
Azure.IoT Build 0:6ae2f7bca550 140
AzureIoTClient 28:add19eb7defa 141 if ((body_data_value == NULL) ||
AzureIoTClient 28:add19eb7defa 142 (amqpvalue_get_data(body_data_value, &data_value) != 0))
AzureIoTClient 28:add19eb7defa 143 {
AzureIoTClient 28:add19eb7defa 144 message_receiver_instance->decode_error = true;
AzureIoTClient 28:add19eb7defa 145 }
AzureIoTClient 28:add19eb7defa 146 else
AzureIoTClient 28:add19eb7defa 147 {
AzureIoTClient 6:641a9672db08 148 BINARY_DATA binary_data;
AzureIoTClient 23:1111ee8bcba4 149 binary_data.bytes = (const unsigned char*)data_value.bytes;
AzureIoTClient 6:641a9672db08 150 binary_data.length = data_value.length;
AzureIoTClient 28:add19eb7defa 151 if (message_add_body_amqp_data(decoded_message, binary_data) != 0)
AzureIoTClient 28:add19eb7defa 152 {
AzureIoTClient 28:add19eb7defa 153 message_receiver_instance->decode_error = true;
AzureIoTClient 28:add19eb7defa 154 }
AzureIoTClient 28:add19eb7defa 155 }
AzureIoTClient 28:add19eb7defa 156 }
AzureIoTClient 28:add19eb7defa 157 }
Azure.IoT Build 0:6ae2f7bca550 158 }
Azure.IoT Build 0:6ae2f7bca550 159
Azure.IoT Build 0:6ae2f7bca550 160 static AMQP_VALUE on_transfer_received(void* context, TRANSFER_HANDLE transfer, uint32_t payload_size, const unsigned char* payload_bytes)
Azure.IoT Build 0:6ae2f7bca550 161 {
AzureIoTClient 28:add19eb7defa 162 AMQP_VALUE result = NULL;
Azure.IoT Build 0:6ae2f7bca550 163
AzureIoTClient 28:add19eb7defa 164 MESSAGE_RECEIVER_INSTANCE* message_receiver_instance = (MESSAGE_RECEIVER_INSTANCE*)context;
AzureIoTClient 6:641a9672db08 165 (void)transfer;
AzureIoTClient 28:add19eb7defa 166 if (message_receiver_instance->on_message_received != NULL)
AzureIoTClient 28:add19eb7defa 167 {
AzureIoTClient 28:add19eb7defa 168 MESSAGE_HANDLE message = message_create();
AzureIoTClient 28:add19eb7defa 169 if (message == NULL)
AzureIoTClient 28:add19eb7defa 170 {
AzureIoTClient 28:add19eb7defa 171 set_message_receiver_state(message_receiver_instance, MESSAGE_RECEIVER_STATE_ERROR);
AzureIoTClient 28:add19eb7defa 172 }
AzureIoTClient 28:add19eb7defa 173 else
AzureIoTClient 28:add19eb7defa 174 {
AzureIoTClient 28:add19eb7defa 175 AMQPVALUE_DECODER_HANDLE amqpvalue_decoder = amqpvalue_decoder_create(decode_message_value_callback, message_receiver_instance);
AzureIoTClient 28:add19eb7defa 176 if (amqpvalue_decoder == NULL)
AzureIoTClient 28:add19eb7defa 177 {
AzureIoTClient 28:add19eb7defa 178 set_message_receiver_state(message_receiver_instance, MESSAGE_RECEIVER_STATE_ERROR);
AzureIoTClient 28:add19eb7defa 179 }
AzureIoTClient 28:add19eb7defa 180 else
AzureIoTClient 28:add19eb7defa 181 {
AzureIoTClient 28:add19eb7defa 182 message_receiver_instance->decoded_message = message;
AzureIoTClient 28:add19eb7defa 183 message_receiver_instance->decode_error = false;
AzureIoTClient 28:add19eb7defa 184 if (amqpvalue_decode_bytes(amqpvalue_decoder, payload_bytes, payload_size) != 0)
AzureIoTClient 28:add19eb7defa 185 {
AzureIoTClient 28:add19eb7defa 186 set_message_receiver_state(message_receiver_instance, MESSAGE_RECEIVER_STATE_ERROR);
AzureIoTClient 28:add19eb7defa 187 }
AzureIoTClient 28:add19eb7defa 188 else
AzureIoTClient 28:add19eb7defa 189 {
AzureIoTClient 28:add19eb7defa 190 if (message_receiver_instance->decode_error)
AzureIoTClient 28:add19eb7defa 191 {
AzureIoTClient 28:add19eb7defa 192 set_message_receiver_state(message_receiver_instance, MESSAGE_RECEIVER_STATE_ERROR);
AzureIoTClient 28:add19eb7defa 193 }
AzureIoTClient 28:add19eb7defa 194 else
AzureIoTClient 28:add19eb7defa 195 {
AzureIoTClient 20:206846c14c80 196 result = message_receiver_instance->on_message_received(message_receiver_instance->callback_context, message);
AzureIoTClient 28:add19eb7defa 197 }
AzureIoTClient 28:add19eb7defa 198 }
Azure.IoT Build 0:6ae2f7bca550 199
AzureIoTClient 28:add19eb7defa 200 amqpvalue_decoder_destroy(amqpvalue_decoder);
AzureIoTClient 28:add19eb7defa 201 }
Azure.IoT Build 0:6ae2f7bca550 202
AzureIoTClient 28:add19eb7defa 203 message_destroy(message);
AzureIoTClient 28:add19eb7defa 204 }
AzureIoTClient 28:add19eb7defa 205 }
Azure.IoT Build 0:6ae2f7bca550 206
AzureIoTClient 28:add19eb7defa 207 return result;
Azure.IoT Build 0:6ae2f7bca550 208 }
Azure.IoT Build 0:6ae2f7bca550 209
Azure.IoT Build 0:6ae2f7bca550 210 static void on_link_state_changed(void* context, LINK_STATE new_link_state, LINK_STATE previous_link_state)
Azure.IoT Build 0:6ae2f7bca550 211 {
AzureIoTClient 28:add19eb7defa 212 MESSAGE_RECEIVER_INSTANCE* message_receiver_instance = (MESSAGE_RECEIVER_INSTANCE*)context;
AzureIoTClient 6:641a9672db08 213 (void)previous_link_state;
Azure.IoT Build 0:6ae2f7bca550 214
AzureIoTClient 28:add19eb7defa 215 switch (new_link_state)
AzureIoTClient 28:add19eb7defa 216 {
AzureIoTClient 17:923575db8b2d 217 default:
AzureIoTClient 17:923575db8b2d 218 break;
AzureIoTClient 17:923575db8b2d 219
AzureIoTClient 28:add19eb7defa 220 case LINK_STATE_ATTACHED:
AzureIoTClient 28:add19eb7defa 221 if (message_receiver_instance->message_receiver_state == MESSAGE_RECEIVER_STATE_OPENING)
AzureIoTClient 28:add19eb7defa 222 {
AzureIoTClient 28:add19eb7defa 223 set_message_receiver_state(message_receiver_instance, MESSAGE_RECEIVER_STATE_OPEN);
AzureIoTClient 28:add19eb7defa 224 }
AzureIoTClient 28:add19eb7defa 225 break;
AzureIoTClient 28:add19eb7defa 226 case LINK_STATE_DETACHED:
Azure.IoT Build 0:6ae2f7bca550 227 if ((message_receiver_instance->message_receiver_state == MESSAGE_RECEIVER_STATE_OPEN) ||
Azure.IoT Build 0:6ae2f7bca550 228 (message_receiver_instance->message_receiver_state == MESSAGE_RECEIVER_STATE_CLOSING))
Azure.IoT Build 0:6ae2f7bca550 229 {
Azure.IoT Build 0:6ae2f7bca550 230 /* User initiated transition, we should be good */
Azure.IoT Build 0:6ae2f7bca550 231 set_message_receiver_state(message_receiver_instance, MESSAGE_RECEIVER_STATE_IDLE);
Azure.IoT Build 0:6ae2f7bca550 232 }
Azure.IoT Build 0:6ae2f7bca550 233 else if (message_receiver_instance->message_receiver_state != MESSAGE_RECEIVER_STATE_IDLE)
Azure.IoT Build 0:6ae2f7bca550 234 {
Azure.IoT Build 0:6ae2f7bca550 235 /* Any other transition must be an error */
Azure.IoT Build 0:6ae2f7bca550 236 set_message_receiver_state(message_receiver_instance, MESSAGE_RECEIVER_STATE_ERROR);
Azure.IoT Build 0:6ae2f7bca550 237 }
Azure.IoT Build 0:6ae2f7bca550 238 break;
AzureIoTClient 1:eab586236bfe 239 case LINK_STATE_ERROR:
AzureIoTClient 1:eab586236bfe 240 if (message_receiver_instance->message_receiver_state != MESSAGE_RECEIVER_STATE_ERROR)
AzureIoTClient 1:eab586236bfe 241 {
AzureIoTClient 1:eab586236bfe 242 set_message_receiver_state(message_receiver_instance, MESSAGE_RECEIVER_STATE_ERROR);
AzureIoTClient 1:eab586236bfe 243 }
AzureIoTClient 1:eab586236bfe 244 break;
AzureIoTClient 28:add19eb7defa 245 }
Azure.IoT Build 0:6ae2f7bca550 246 }
Azure.IoT Build 0:6ae2f7bca550 247
Azure.IoT Build 0:6ae2f7bca550 248 MESSAGE_RECEIVER_HANDLE messagereceiver_create(LINK_HANDLE link, ON_MESSAGE_RECEIVER_STATE_CHANGED on_message_receiver_state_changed, void* context)
Azure.IoT Build 0:6ae2f7bca550 249 {
AzureIoTClient 28:add19eb7defa 250 MESSAGE_RECEIVER_INSTANCE* result = (MESSAGE_RECEIVER_INSTANCE*)malloc(sizeof(MESSAGE_RECEIVER_INSTANCE));
AzureIoTClient 28:add19eb7defa 251 if (result != NULL)
AzureIoTClient 28:add19eb7defa 252 {
AzureIoTClient 28:add19eb7defa 253 result->link = link;
AzureIoTClient 28:add19eb7defa 254 result->on_message_receiver_state_changed = on_message_receiver_state_changed;
AzureIoTClient 28:add19eb7defa 255 result->on_message_receiver_state_changed_context = context;
AzureIoTClient 28:add19eb7defa 256 result->message_receiver_state = MESSAGE_RECEIVER_STATE_IDLE;
AzureIoTClient 28:add19eb7defa 257 }
Azure.IoT Build 0:6ae2f7bca550 258
AzureIoTClient 28:add19eb7defa 259 return result;
Azure.IoT Build 0:6ae2f7bca550 260 }
Azure.IoT Build 0:6ae2f7bca550 261
Azure.IoT Build 0:6ae2f7bca550 262 void messagereceiver_destroy(MESSAGE_RECEIVER_HANDLE message_receiver)
Azure.IoT Build 0:6ae2f7bca550 263 {
AzureIoTClient 28:add19eb7defa 264 if (message_receiver != NULL)
AzureIoTClient 28:add19eb7defa 265 {
AzureIoTClient 28:add19eb7defa 266 (void)messagereceiver_close(message_receiver);
AzureIoTClient 28:add19eb7defa 267 free(message_receiver);
AzureIoTClient 28:add19eb7defa 268 }
Azure.IoT Build 0:6ae2f7bca550 269 }
Azure.IoT Build 0:6ae2f7bca550 270
AzureIoTClient 23:1111ee8bcba4 271 int messagereceiver_open(MESSAGE_RECEIVER_HANDLE message_receiver, ON_MESSAGE_RECEIVED on_message_received, void* callback_context)
Azure.IoT Build 0:6ae2f7bca550 272 {
AzureIoTClient 28:add19eb7defa 273 int result;
Azure.IoT Build 0:6ae2f7bca550 274
AzureIoTClient 28:add19eb7defa 275 if (message_receiver == NULL)
AzureIoTClient 28:add19eb7defa 276 {
AzureIoTClient 28:add19eb7defa 277 result = __FAILURE__;
AzureIoTClient 28:add19eb7defa 278 }
AzureIoTClient 28:add19eb7defa 279 else
AzureIoTClient 28:add19eb7defa 280 {
AzureIoTClient 28:add19eb7defa 281 MESSAGE_RECEIVER_INSTANCE* message_receiver_instance = (MESSAGE_RECEIVER_INSTANCE*)message_receiver;
Azure.IoT Build 0:6ae2f7bca550 282
AzureIoTClient 28:add19eb7defa 283 if (message_receiver_instance->message_receiver_state == MESSAGE_RECEIVER_STATE_IDLE)
AzureIoTClient 28:add19eb7defa 284 {
AzureIoTClient 28:add19eb7defa 285 set_message_receiver_state(message_receiver_instance, MESSAGE_RECEIVER_STATE_OPENING);
AzureIoTClient 28:add19eb7defa 286 if (link_attach(message_receiver_instance->link, on_transfer_received, on_link_state_changed, NULL, message_receiver_instance) != 0)
AzureIoTClient 28:add19eb7defa 287 {
AzureIoTClient 28:add19eb7defa 288 result = __FAILURE__;
AzureIoTClient 28:add19eb7defa 289 set_message_receiver_state(message_receiver_instance, MESSAGE_RECEIVER_STATE_ERROR);
AzureIoTClient 28:add19eb7defa 290 }
AzureIoTClient 28:add19eb7defa 291 else
AzureIoTClient 28:add19eb7defa 292 {
AzureIoTClient 28:add19eb7defa 293 message_receiver_instance->on_message_received = on_message_received;
AzureIoTClient 28:add19eb7defa 294 message_receiver_instance->callback_context = callback_context;
Azure.IoT Build 0:6ae2f7bca550 295
AzureIoTClient 28:add19eb7defa 296 result = 0;
AzureIoTClient 28:add19eb7defa 297 }
AzureIoTClient 28:add19eb7defa 298 }
AzureIoTClient 28:add19eb7defa 299 else
AzureIoTClient 28:add19eb7defa 300 {
AzureIoTClient 28:add19eb7defa 301 result = 0;
AzureIoTClient 28:add19eb7defa 302 }
AzureIoTClient 28:add19eb7defa 303 }
Azure.IoT Build 0:6ae2f7bca550 304
AzureIoTClient 28:add19eb7defa 305 return result;
Azure.IoT Build 0:6ae2f7bca550 306 }
Azure.IoT Build 0:6ae2f7bca550 307
Azure.IoT Build 0:6ae2f7bca550 308 int messagereceiver_close(MESSAGE_RECEIVER_HANDLE message_receiver)
Azure.IoT Build 0:6ae2f7bca550 309 {
AzureIoTClient 28:add19eb7defa 310 int result;
Azure.IoT Build 0:6ae2f7bca550 311
AzureIoTClient 28:add19eb7defa 312 if (message_receiver == NULL)
AzureIoTClient 28:add19eb7defa 313 {
AzureIoTClient 28:add19eb7defa 314 result = __FAILURE__;
AzureIoTClient 28:add19eb7defa 315 }
AzureIoTClient 28:add19eb7defa 316 else
AzureIoTClient 28:add19eb7defa 317 {
AzureIoTClient 28:add19eb7defa 318 MESSAGE_RECEIVER_INSTANCE* message_receiver_instance = (MESSAGE_RECEIVER_INSTANCE*)message_receiver;
Azure.IoT Build 0:6ae2f7bca550 319
AzureIoTClient 28:add19eb7defa 320 if ((message_receiver_instance->message_receiver_state == MESSAGE_RECEIVER_STATE_OPENING) ||
AzureIoTClient 28:add19eb7defa 321 (message_receiver_instance->message_receiver_state == MESSAGE_RECEIVER_STATE_OPEN))
AzureIoTClient 28:add19eb7defa 322 {
AzureIoTClient 28:add19eb7defa 323 set_message_receiver_state(message_receiver_instance, MESSAGE_RECEIVER_STATE_CLOSING);
Azure.IoT Build 0:6ae2f7bca550 324
AzureIoTClient 28:add19eb7defa 325 if (link_detach(message_receiver_instance->link, true) != 0)
AzureIoTClient 28:add19eb7defa 326 {
AzureIoTClient 28:add19eb7defa 327 result = __FAILURE__;
AzureIoTClient 28:add19eb7defa 328 set_message_receiver_state(message_receiver_instance, MESSAGE_RECEIVER_STATE_ERROR);
AzureIoTClient 28:add19eb7defa 329 }
AzureIoTClient 28:add19eb7defa 330 else
AzureIoTClient 28:add19eb7defa 331 {
AzureIoTClient 28:add19eb7defa 332 result = 0;
AzureIoTClient 28:add19eb7defa 333 }
AzureIoTClient 28:add19eb7defa 334 }
AzureIoTClient 28:add19eb7defa 335 else
AzureIoTClient 28:add19eb7defa 336 {
AzureIoTClient 28:add19eb7defa 337 result = 0;
AzureIoTClient 28:add19eb7defa 338 }
AzureIoTClient 28:add19eb7defa 339 }
Azure.IoT Build 0:6ae2f7bca550 340
AzureIoTClient 28:add19eb7defa 341 return result;
Azure.IoT Build 0:6ae2f7bca550 342 }
AzureIoTClient 20:206846c14c80 343
AzureIoTClient 20:206846c14c80 344 int messagereceiver_get_link_name(MESSAGE_RECEIVER_HANDLE message_receiver, const char** link_name)
AzureIoTClient 20:206846c14c80 345 {
AzureIoTClient 20:206846c14c80 346 int result;
AzureIoTClient 20:206846c14c80 347
AzureIoTClient 20:206846c14c80 348 if (message_receiver == NULL)
AzureIoTClient 20:206846c14c80 349 {
AzureIoTClient 20:206846c14c80 350 result = __FAILURE__;
AzureIoTClient 20:206846c14c80 351 }
AzureIoTClient 20:206846c14c80 352 else
AzureIoTClient 20:206846c14c80 353 {
AzureIoTClient 20:206846c14c80 354 MESSAGE_RECEIVER_INSTANCE* message_receiver_instance = (MESSAGE_RECEIVER_INSTANCE*)message_receiver;
AzureIoTClient 20:206846c14c80 355 if (link_get_name(message_receiver_instance->link, link_name) != 0)
AzureIoTClient 20:206846c14c80 356 {
AzureIoTClient 20:206846c14c80 357 result = __FAILURE__;
AzureIoTClient 20:206846c14c80 358 }
AzureIoTClient 20:206846c14c80 359 else
AzureIoTClient 20:206846c14c80 360 {
AzureIoTClient 20:206846c14c80 361 result = 0;
AzureIoTClient 20:206846c14c80 362 }
AzureIoTClient 20:206846c14c80 363 }
AzureIoTClient 20:206846c14c80 364
AzureIoTClient 20:206846c14c80 365 return result;
AzureIoTClient 20:206846c14c80 366 }
AzureIoTClient 20:206846c14c80 367
AzureIoTClient 20:206846c14c80 368 int messagereceiver_get_received_message_id(MESSAGE_RECEIVER_HANDLE message_receiver, delivery_number* message_id)
AzureIoTClient 20:206846c14c80 369 {
AzureIoTClient 20:206846c14c80 370 int result;
AzureIoTClient 20:206846c14c80 371
AzureIoTClient 20:206846c14c80 372 if (message_receiver == NULL)
AzureIoTClient 20:206846c14c80 373 {
AzureIoTClient 20:206846c14c80 374 result = __FAILURE__;
AzureIoTClient 20:206846c14c80 375 }
AzureIoTClient 20:206846c14c80 376 else
AzureIoTClient 20:206846c14c80 377 {
AzureIoTClient 20:206846c14c80 378 MESSAGE_RECEIVER_INSTANCE* message_receiver_instance = (MESSAGE_RECEIVER_INSTANCE*)message_receiver;
AzureIoTClient 20:206846c14c80 379 if (link_get_received_message_id(message_receiver_instance->link, message_id) != 0)
AzureIoTClient 20:206846c14c80 380 {
AzureIoTClient 20:206846c14c80 381 result = __FAILURE__;
AzureIoTClient 20:206846c14c80 382 }
AzureIoTClient 20:206846c14c80 383 else
AzureIoTClient 20:206846c14c80 384 {
AzureIoTClient 20:206846c14c80 385 result = 0;
AzureIoTClient 20:206846c14c80 386 }
AzureIoTClient 20:206846c14c80 387 }
AzureIoTClient 20:206846c14c80 388
AzureIoTClient 20:206846c14c80 389 return result;
AzureIoTClient 20:206846c14c80 390 }
AzureIoTClient 20:206846c14c80 391
AzureIoTClient 20:206846c14c80 392 int messagereceiver_send_message_disposition(MESSAGE_RECEIVER_HANDLE message_receiver, const char* link_name, delivery_number message_number, AMQP_VALUE delivery_state)
AzureIoTClient 20:206846c14c80 393 {
AzureIoTClient 20:206846c14c80 394 int result;
AzureIoTClient 20:206846c14c80 395
AzureIoTClient 20:206846c14c80 396 if (message_receiver == NULL)
AzureIoTClient 20:206846c14c80 397 {
AzureIoTClient 20:206846c14c80 398 result = __FAILURE__;
AzureIoTClient 20:206846c14c80 399 }
AzureIoTClient 20:206846c14c80 400 else
AzureIoTClient 20:206846c14c80 401 {
AzureIoTClient 20:206846c14c80 402 MESSAGE_RECEIVER_INSTANCE* message_receiver_instance = (MESSAGE_RECEIVER_INSTANCE*)message_receiver;
AzureIoTClient 20:206846c14c80 403 if (message_receiver_instance->message_receiver_state != MESSAGE_RECEIVER_STATE_OPEN)
AzureIoTClient 20:206846c14c80 404 {
AzureIoTClient 20:206846c14c80 405 result = __FAILURE__;
AzureIoTClient 20:206846c14c80 406 }
AzureIoTClient 20:206846c14c80 407 else
AzureIoTClient 20:206846c14c80 408 {
AzureIoTClient 20:206846c14c80 409 const char* my_name;
AzureIoTClient 20:206846c14c80 410 if (link_get_name(message_receiver_instance->link, &my_name) != 0)
AzureIoTClient 20:206846c14c80 411 {
AzureIoTClient 20:206846c14c80 412 result = __FAILURE__;
AzureIoTClient 20:206846c14c80 413 }
AzureIoTClient 20:206846c14c80 414 else
AzureIoTClient 20:206846c14c80 415 {
AzureIoTClient 20:206846c14c80 416 if (strcmp(link_name, my_name) != 0)
AzureIoTClient 20:206846c14c80 417 {
AzureIoTClient 20:206846c14c80 418 result = __FAILURE__;
AzureIoTClient 20:206846c14c80 419 }
AzureIoTClient 20:206846c14c80 420 else
AzureIoTClient 20:206846c14c80 421 {
AzureIoTClient 20:206846c14c80 422 if (link_send_disposition(message_receiver_instance->link, message_number, delivery_state) != 0)
AzureIoTClient 20:206846c14c80 423 {
AzureIoTClient 20:206846c14c80 424 result = __FAILURE__;
AzureIoTClient 20:206846c14c80 425 }
AzureIoTClient 20:206846c14c80 426 else
AzureIoTClient 20:206846c14c80 427 {
AzureIoTClient 20:206846c14c80 428 result = 0;
AzureIoTClient 20:206846c14c80 429 }
AzureIoTClient 20:206846c14c80 430 }
AzureIoTClient 20:206846c14c80 431 }
AzureIoTClient 20:206846c14c80 432 }
AzureIoTClient 20:206846c14c80 433 }
AzureIoTClient 20:206846c14c80 434
AzureIoTClient 20:206846c14c80 435 return result;
AzureIoTClient 20:206846c14c80 436 }
AzureIoTClient 23:1111ee8bcba4 437
AzureIoTClient 23:1111ee8bcba4 438 void messagereceiver_set_trace(MESSAGE_RECEIVER_HANDLE message_receiver, bool trace_on)
AzureIoTClient 23:1111ee8bcba4 439 {
AzureIoTClient 23:1111ee8bcba4 440 /* No tracing is yet implemented for message receiver */
AzureIoTClient 23:1111ee8bcba4 441 (void)message_receiver;
AzureIoTClient 23:1111ee8bcba4 442 (void)trace_on;
AzureIoTClient 23:1111ee8bcba4 443 }