Xin Zhang / azure-iot-c-sdk-f767zi

Dependents:   samplemqtt

Committer:
XinZhangMS
Date:
Thu Aug 23 06:52:14 2018 +0000
Revision:
0:f7f1f0d76dd6
azure-c-sdk for mbed os supporting NUCLEO_F767ZI

Who changed what in which revision?

UserRevisionLine numberNew contents of line
XinZhangMS 0:f7f1f0d76dd6 1 // Copyright (c) Microsoft. All rights reserved.
XinZhangMS 0:f7f1f0d76dd6 2 // Licensed under the MIT license. See LICENSE file in the project root for full license information.
XinZhangMS 0:f7f1f0d76dd6 3
XinZhangMS 0:f7f1f0d76dd6 4 #include <stdlib.h>
XinZhangMS 0:f7f1f0d76dd6 5 #include <stdio.h>
XinZhangMS 0:f7f1f0d76dd6 6 #include <stdbool.h>
XinZhangMS 0:f7f1f0d76dd6 7 #include <string.h>
XinZhangMS 0:f7f1f0d76dd6 8 #include "azure_c_shared_utility/optimize_size.h"
XinZhangMS 0:f7f1f0d76dd6 9 #include "azure_c_shared_utility/gballoc.h"
XinZhangMS 0:f7f1f0d76dd6 10 #include "azure_c_shared_utility/singlylinkedlist.h"
XinZhangMS 0:f7f1f0d76dd6 11 #include "azure_c_shared_utility/xlogging.h"
XinZhangMS 0:f7f1f0d76dd6 12 #include "azure_c_shared_utility/crt_abstractions.h"
XinZhangMS 0:f7f1f0d76dd6 13 #include "azure_uamqp_c/amqp_management.h"
XinZhangMS 0:f7f1f0d76dd6 14 #include "azure_uamqp_c/link.h"
XinZhangMS 0:f7f1f0d76dd6 15 #include "azure_uamqp_c/message_sender.h"
XinZhangMS 0:f7f1f0d76dd6 16 #include "azure_uamqp_c/message_receiver.h"
XinZhangMS 0:f7f1f0d76dd6 17 #include "azure_uamqp_c/messaging.h"
XinZhangMS 0:f7f1f0d76dd6 18 #include "azure_uamqp_c/amqp_definitions.h"
XinZhangMS 0:f7f1f0d76dd6 19
XinZhangMS 0:f7f1f0d76dd6 20 static const char sender_suffix[] = "-sender";
XinZhangMS 0:f7f1f0d76dd6 21 static const char receiver_suffix[] = "-receiver";
XinZhangMS 0:f7f1f0d76dd6 22
XinZhangMS 0:f7f1f0d76dd6 23 #define COUNT_CHARS(str) (sizeof(str) / sizeof((str)[0]) - 1)
XinZhangMS 0:f7f1f0d76dd6 24
XinZhangMS 0:f7f1f0d76dd6 25 typedef struct OPERATION_MESSAGE_INSTANCE_TAG
XinZhangMS 0:f7f1f0d76dd6 26 {
XinZhangMS 0:f7f1f0d76dd6 27 ON_AMQP_MANAGEMENT_EXECUTE_OPERATION_COMPLETE on_execute_operation_complete;
XinZhangMS 0:f7f1f0d76dd6 28 void* callback_context;
XinZhangMS 0:f7f1f0d76dd6 29 uint64_t message_id;
XinZhangMS 0:f7f1f0d76dd6 30 AMQP_MANAGEMENT_HANDLE amqp_management;
XinZhangMS 0:f7f1f0d76dd6 31 } OPERATION_MESSAGE_INSTANCE;
XinZhangMS 0:f7f1f0d76dd6 32
XinZhangMS 0:f7f1f0d76dd6 33 typedef enum AMQP_MANAGEMENT_STATE_TAG
XinZhangMS 0:f7f1f0d76dd6 34 {
XinZhangMS 0:f7f1f0d76dd6 35 AMQP_MANAGEMENT_STATE_IDLE,
XinZhangMS 0:f7f1f0d76dd6 36 AMQP_MANAGEMENT_STATE_OPENING,
XinZhangMS 0:f7f1f0d76dd6 37 AMQP_MANAGEMENT_STATE_CLOSING,
XinZhangMS 0:f7f1f0d76dd6 38 AMQP_MANAGEMENT_STATE_OPEN,
XinZhangMS 0:f7f1f0d76dd6 39 AMQP_MANAGEMENT_STATE_ERROR
XinZhangMS 0:f7f1f0d76dd6 40 } AMQP_MANAGEMENT_STATE;
XinZhangMS 0:f7f1f0d76dd6 41
XinZhangMS 0:f7f1f0d76dd6 42 typedef struct AMQP_MANAGEMENT_INSTANCE_TAG
XinZhangMS 0:f7f1f0d76dd6 43 {
XinZhangMS 0:f7f1f0d76dd6 44 LINK_HANDLE sender_link;
XinZhangMS 0:f7f1f0d76dd6 45 LINK_HANDLE receiver_link;
XinZhangMS 0:f7f1f0d76dd6 46 MESSAGE_SENDER_HANDLE message_sender;
XinZhangMS 0:f7f1f0d76dd6 47 MESSAGE_RECEIVER_HANDLE message_receiver;
XinZhangMS 0:f7f1f0d76dd6 48 SINGLYLINKEDLIST_HANDLE pending_operations;
XinZhangMS 0:f7f1f0d76dd6 49 uint64_t next_message_id;
XinZhangMS 0:f7f1f0d76dd6 50 ON_AMQP_MANAGEMENT_OPEN_COMPLETE on_amqp_management_open_complete;
XinZhangMS 0:f7f1f0d76dd6 51 void* on_amqp_management_open_complete_context;
XinZhangMS 0:f7f1f0d76dd6 52 ON_AMQP_MANAGEMENT_ERROR on_amqp_management_error;
XinZhangMS 0:f7f1f0d76dd6 53 void* on_amqp_management_error_context;
XinZhangMS 0:f7f1f0d76dd6 54 AMQP_MANAGEMENT_STATE amqp_management_state;
XinZhangMS 0:f7f1f0d76dd6 55 char* status_code_key_name;
XinZhangMS 0:f7f1f0d76dd6 56 char* status_description_key_name;
XinZhangMS 0:f7f1f0d76dd6 57 unsigned int sender_connected : 1;
XinZhangMS 0:f7f1f0d76dd6 58 unsigned int receiver_connected : 1;
XinZhangMS 0:f7f1f0d76dd6 59 } AMQP_MANAGEMENT_INSTANCE;
XinZhangMS 0:f7f1f0d76dd6 60
XinZhangMS 0:f7f1f0d76dd6 61 static AMQP_VALUE on_message_received(const void* context, MESSAGE_HANDLE message)
XinZhangMS 0:f7f1f0d76dd6 62 {
XinZhangMS 0:f7f1f0d76dd6 63 AMQP_VALUE result;
XinZhangMS 0:f7f1f0d76dd6 64
XinZhangMS 0:f7f1f0d76dd6 65 if (context == NULL)
XinZhangMS 0:f7f1f0d76dd6 66 {
XinZhangMS 0:f7f1f0d76dd6 67 /* Codes_SRS_AMQP_MANAGEMENT_01_108: [ When `on_message_received` is called with a NULL context, it shall do nothing. ]*/
XinZhangMS 0:f7f1f0d76dd6 68 LogError("NULL context in on_message_received");
XinZhangMS 0:f7f1f0d76dd6 69 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 70 }
XinZhangMS 0:f7f1f0d76dd6 71 else
XinZhangMS 0:f7f1f0d76dd6 72 {
XinZhangMS 0:f7f1f0d76dd6 73 AMQP_MANAGEMENT_HANDLE amqp_management = (AMQP_MANAGEMENT_HANDLE)context;
XinZhangMS 0:f7f1f0d76dd6 74 AMQP_VALUE application_properties;
XinZhangMS 0:f7f1f0d76dd6 75
XinZhangMS 0:f7f1f0d76dd6 76 /* Codes_SRS_AMQP_MANAGEMENT_01_109: [ `on_message_received` shall obtain the application properties from the message by calling `message_get_application_properties`. ]*/
XinZhangMS 0:f7f1f0d76dd6 77 if (message_get_application_properties(message, &application_properties) != 0)
XinZhangMS 0:f7f1f0d76dd6 78 {
XinZhangMS 0:f7f1f0d76dd6 79 /* Codes_SRS_AMQP_MANAGEMENT_01_113: [ If obtaining the application properties or message properties fails, an error shall be indicated by calling `on_amqp_management_error` and passing the `on_amqp_management_error_context` to it. ]*/
XinZhangMS 0:f7f1f0d76dd6 80 LogError("Could not retrieve application properties");
XinZhangMS 0:f7f1f0d76dd6 81 amqp_management->on_amqp_management_error(amqp_management->on_amqp_management_error_context);
XinZhangMS 0:f7f1f0d76dd6 82 /* Codes_SRS_AMQP_MANAGEMENT_01_136: [ When `on_message_received` fails due to errors in parsing the response message `on_message_received` shall call `messaging_delivery_rejected` and return the created delivery AMQP value. ]*/
XinZhangMS 0:f7f1f0d76dd6 83 result = messaging_delivery_rejected("amqp:internal-error", "Could not get application properties on AMQP management response.");
XinZhangMS 0:f7f1f0d76dd6 84 }
XinZhangMS 0:f7f1f0d76dd6 85 else
XinZhangMS 0:f7f1f0d76dd6 86 {
XinZhangMS 0:f7f1f0d76dd6 87 PROPERTIES_HANDLE response_properties;
XinZhangMS 0:f7f1f0d76dd6 88
XinZhangMS 0:f7f1f0d76dd6 89 /* Codes_SRS_AMQP_MANAGEMENT_01_110: [ `on_message_received` shall obtain the message properties from the message by calling `message_get_properties`. ]*/
XinZhangMS 0:f7f1f0d76dd6 90 if (message_get_properties(message, &response_properties) != 0)
XinZhangMS 0:f7f1f0d76dd6 91 {
XinZhangMS 0:f7f1f0d76dd6 92 /* Codes_SRS_AMQP_MANAGEMENT_01_113: [ If obtaining the application properties or message properties fails, an error shall be indicated by calling `on_amqp_management_error` and passing the `on_amqp_management_error_context` to it. ]*/
XinZhangMS 0:f7f1f0d76dd6 93 LogError("Could not retrieve message properties");
XinZhangMS 0:f7f1f0d76dd6 94 amqp_management->on_amqp_management_error(amqp_management->on_amqp_management_error_context);
XinZhangMS 0:f7f1f0d76dd6 95 /* Codes_SRS_AMQP_MANAGEMENT_01_136: [ When `on_message_received` fails due to errors in parsing the response message `on_message_received` shall call `messaging_delivery_rejected` and return the created delivery AMQP value. ]*/
XinZhangMS 0:f7f1f0d76dd6 96 result = messaging_delivery_rejected("amqp:internal-error", "Could not get message properties on AMQP management response.");
XinZhangMS 0:f7f1f0d76dd6 97 }
XinZhangMS 0:f7f1f0d76dd6 98 else
XinZhangMS 0:f7f1f0d76dd6 99 {
XinZhangMS 0:f7f1f0d76dd6 100 AMQP_VALUE key;
XinZhangMS 0:f7f1f0d76dd6 101 AMQP_VALUE value;
XinZhangMS 0:f7f1f0d76dd6 102 AMQP_VALUE desc_key;
XinZhangMS 0:f7f1f0d76dd6 103 AMQP_VALUE desc_value;
XinZhangMS 0:f7f1f0d76dd6 104 AMQP_VALUE map;
XinZhangMS 0:f7f1f0d76dd6 105 AMQP_VALUE correlation_id_value;
XinZhangMS 0:f7f1f0d76dd6 106 uint64_t correlation_id;
XinZhangMS 0:f7f1f0d76dd6 107
XinZhangMS 0:f7f1f0d76dd6 108 /* Codes_SRS_AMQP_MANAGEMENT_01_111: [ `on_message_received` shall obtain the correlation Id from the message properties by using `properties_get_correlation_id`. ]*/
XinZhangMS 0:f7f1f0d76dd6 109 if (properties_get_correlation_id(response_properties, &correlation_id_value) != 0)
XinZhangMS 0:f7f1f0d76dd6 110 {
XinZhangMS 0:f7f1f0d76dd6 111 /* Codes_SRS_AMQP_MANAGEMENT_01_114: [ If obtaining the correlation Id fails, an error shall be indicated by calling `on_amqp_management_error` and passing the `on_amqp_management_error_context` to it. ] */
XinZhangMS 0:f7f1f0d76dd6 112 LogError("Could not retrieve correlation Id");
XinZhangMS 0:f7f1f0d76dd6 113 amqp_management->on_amqp_management_error(amqp_management->on_amqp_management_error_context);
XinZhangMS 0:f7f1f0d76dd6 114 /* Codes_SRS_AMQP_MANAGEMENT_01_136: [ When `on_message_received` fails due to errors in parsing the response message `on_message_received` shall call `messaging_delivery_rejected` and return the created delivery AMQP value. ]*/
XinZhangMS 0:f7f1f0d76dd6 115 result = messaging_delivery_rejected("amqp:internal-error", "Could not get correlation Id from AMQP management response.");
XinZhangMS 0:f7f1f0d76dd6 116 }
XinZhangMS 0:f7f1f0d76dd6 117 else
XinZhangMS 0:f7f1f0d76dd6 118 {
XinZhangMS 0:f7f1f0d76dd6 119 if (amqpvalue_get_ulong(correlation_id_value, &correlation_id) != 0)
XinZhangMS 0:f7f1f0d76dd6 120 {
XinZhangMS 0:f7f1f0d76dd6 121 /* Codes_SRS_AMQP_MANAGEMENT_01_132: [ If any functions manipulating AMQP values, application properties, etc., fail, an error shall be indicated to the consumer by calling the `on_amqp_management_error` and passing the `on_amqp_management_error_context` to it. ]*/
XinZhangMS 0:f7f1f0d76dd6 122 LogError("Could not retrieve correlation Id ulong value");
XinZhangMS 0:f7f1f0d76dd6 123 amqp_management->on_amqp_management_error(amqp_management->on_amqp_management_error_context);
XinZhangMS 0:f7f1f0d76dd6 124 /* Codes_SRS_AMQP_MANAGEMENT_01_136: [ When `on_message_received` fails due to errors in parsing the response message `on_message_received` shall call `messaging_delivery_rejected` and return the created delivery AMQP value. ]*/
XinZhangMS 0:f7f1f0d76dd6 125 result = messaging_delivery_rejected("amqp:internal-error", "Could not get correlation Id from AMQP management response.");
XinZhangMS 0:f7f1f0d76dd6 126 }
XinZhangMS 0:f7f1f0d76dd6 127 else
XinZhangMS 0:f7f1f0d76dd6 128 {
XinZhangMS 0:f7f1f0d76dd6 129 /* Codes_SRS_AMQP_MANAGEMENT_01_119: [ `on_message_received` shall obtain the application properties map by calling `amqpvalue_get_inplace_described_value`. ]*/
XinZhangMS 0:f7f1f0d76dd6 130 /* Codes_SRS_AMQP_MANAGEMENT_01_070: [ Response messages have the following application-properties: ]*/
XinZhangMS 0:f7f1f0d76dd6 131 map = amqpvalue_get_inplace_described_value(application_properties);
XinZhangMS 0:f7f1f0d76dd6 132 if (map == NULL)
XinZhangMS 0:f7f1f0d76dd6 133 {
XinZhangMS 0:f7f1f0d76dd6 134 /* Codes_SRS_AMQP_MANAGEMENT_01_132: [ If any functions manipulating AMQP values, application properties, etc., fail, an error shall be indicated to the consumer by calling the `on_amqp_management_error` and passing the `on_amqp_management_error_context` to it. ]*/
XinZhangMS 0:f7f1f0d76dd6 135 LogError("Could not retrieve application property map");
XinZhangMS 0:f7f1f0d76dd6 136 amqp_management->on_amqp_management_error(amqp_management->on_amqp_management_error_context);
XinZhangMS 0:f7f1f0d76dd6 137 /* Codes_SRS_AMQP_MANAGEMENT_01_136: [ When `on_message_received` fails due to errors in parsing the response message `on_message_received` shall call `messaging_delivery_rejected` and return the created delivery AMQP value. ]*/
XinZhangMS 0:f7f1f0d76dd6 138 result = messaging_delivery_rejected("amqp:internal-error", "Could not get application property map from the application properties in the AMQP management response.");
XinZhangMS 0:f7f1f0d76dd6 139 }
XinZhangMS 0:f7f1f0d76dd6 140 else
XinZhangMS 0:f7f1f0d76dd6 141 {
XinZhangMS 0:f7f1f0d76dd6 142 /* Codes_SRS_AMQP_MANAGEMENT_01_120: [ An AMQP value used to lookup the status code shall be created by calling `amqpvalue_create_string` with the status code key name (`statusCode`) as argument. ]*/
XinZhangMS 0:f7f1f0d76dd6 143 /* Codes_SRS_AMQP_MANAGEMENT_01_071: [ statusCode integer Yes HTTP response code [RFC2616] ]*/
XinZhangMS 0:f7f1f0d76dd6 144 key = amqpvalue_create_string(amqp_management->status_code_key_name);
XinZhangMS 0:f7f1f0d76dd6 145 if (key == NULL)
XinZhangMS 0:f7f1f0d76dd6 146 {
XinZhangMS 0:f7f1f0d76dd6 147 /* Codes_SRS_AMQP_MANAGEMENT_01_132: [ If any functions manipulating AMQP values, application properties, etc., fail, an error shall be indicated to the consumer by calling the `on_amqp_management_error` and passing the `on_amqp_management_error_context` to it. ]*/
XinZhangMS 0:f7f1f0d76dd6 148 LogError("Could not create status-code amqp value");
XinZhangMS 0:f7f1f0d76dd6 149 amqp_management->on_amqp_management_error(amqp_management->on_amqp_management_error_context);
XinZhangMS 0:f7f1f0d76dd6 150 /* Codes_SRS_AMQP_MANAGEMENT_01_135: [ When an error occurs in creating AMQP values (for status code, etc.) `on_message_received` shall call `messaging_delivery_released` and return the created delivery AMQP value. ]*/
XinZhangMS 0:f7f1f0d76dd6 151 result = messaging_delivery_released();
XinZhangMS 0:f7f1f0d76dd6 152 }
XinZhangMS 0:f7f1f0d76dd6 153 else
XinZhangMS 0:f7f1f0d76dd6 154 {
XinZhangMS 0:f7f1f0d76dd6 155 /* Codes_SRS_AMQP_MANAGEMENT_01_121: [ The status code shall be looked up in the application properties by using `amqpvalue_get_map_value`. ]*/
XinZhangMS 0:f7f1f0d76dd6 156 value = amqpvalue_get_map_value(map, key);
XinZhangMS 0:f7f1f0d76dd6 157 if (value == NULL)
XinZhangMS 0:f7f1f0d76dd6 158 {
XinZhangMS 0:f7f1f0d76dd6 159 /* Codes_SRS_AMQP_MANAGEMENT_01_122: [ If status code is not found an error shall be indicated to the consumer by calling the `on_amqp_management_error` and passing the `on_amqp_management_error_context` to it. ]*/
XinZhangMS 0:f7f1f0d76dd6 160 LogError("Could not retrieve status code from application properties");
XinZhangMS 0:f7f1f0d76dd6 161 amqp_management->on_amqp_management_error(amqp_management->on_amqp_management_error_context);
XinZhangMS 0:f7f1f0d76dd6 162 /* Codes_SRS_AMQP_MANAGEMENT_01_136: [ When `on_message_received` fails due to errors in parsing the response message `on_message_received` shall call `messaging_delivery_rejected` and return the created delivery AMQP value. ]*/
XinZhangMS 0:f7f1f0d76dd6 163 result = messaging_delivery_rejected("amqp:internal-error", "Could not retrieve status code from the application properties in the AMQP management response.");
XinZhangMS 0:f7f1f0d76dd6 164 }
XinZhangMS 0:f7f1f0d76dd6 165 else
XinZhangMS 0:f7f1f0d76dd6 166 {
XinZhangMS 0:f7f1f0d76dd6 167 int32_t status_code;
XinZhangMS 0:f7f1f0d76dd6 168 /* Codes_SRS_AMQP_MANAGEMENT_01_133: [ The status code value shall be extracted from the value found in the map by using `amqpvalue_get_int`. ]*/
XinZhangMS 0:f7f1f0d76dd6 169 if (amqpvalue_get_int(value, &status_code) != 0)
XinZhangMS 0:f7f1f0d76dd6 170 {
XinZhangMS 0:f7f1f0d76dd6 171 /* Codes_SRS_AMQP_MANAGEMENT_01_132: [ If any functions manipulating AMQP values, application properties, etc., fail, an error shall be indicated to the consumer by calling the `on_amqp_management_error` and passing the `on_amqp_management_error_context` to it. ]*/
XinZhangMS 0:f7f1f0d76dd6 172 LogError("Could not retrieve status code int value");
XinZhangMS 0:f7f1f0d76dd6 173 amqp_management->on_amqp_management_error(amqp_management->on_amqp_management_error_context);
XinZhangMS 0:f7f1f0d76dd6 174 /* Codes_SRS_AMQP_MANAGEMENT_01_136: [ When `on_message_received` fails due to errors in parsing the response message `on_message_received` shall call `messaging_delivery_rejected` and return the created delivery AMQP value. ]*/
XinZhangMS 0:f7f1f0d76dd6 175 result = messaging_delivery_rejected("amqp:internal-error", "Could not retrieve status code value from the application properties in the AMQP management response.");
XinZhangMS 0:f7f1f0d76dd6 176 }
XinZhangMS 0:f7f1f0d76dd6 177 else
XinZhangMS 0:f7f1f0d76dd6 178 {
XinZhangMS 0:f7f1f0d76dd6 179 /* Codes_SRS_AMQP_MANAGEMENT_01_123: [ An AMQP value used to lookup the status description shall be created by calling `amqpvalue_create_string` with the status description key name (`statusDescription`) as argument. ]*/
XinZhangMS 0:f7f1f0d76dd6 180 /* Codes_SRS_AMQP_MANAGEMENT_01_072: [ statusDescription string No Description of the status. ]*/
XinZhangMS 0:f7f1f0d76dd6 181 desc_key = amqpvalue_create_string(amqp_management->status_description_key_name);
XinZhangMS 0:f7f1f0d76dd6 182 if (desc_key == NULL)
XinZhangMS 0:f7f1f0d76dd6 183 {
XinZhangMS 0:f7f1f0d76dd6 184 /* Codes_SRS_AMQP_MANAGEMENT_01_132: [ If any functions manipulating AMQP values, application properties, etc., fail, an error shall be indicated to the consumer by calling the `on_amqp_management_error` and passing the `on_amqp_management_error_context` to it. ]*/
XinZhangMS 0:f7f1f0d76dd6 185 LogError("Could not create status-description amqp value");
XinZhangMS 0:f7f1f0d76dd6 186 amqp_management->on_amqp_management_error(amqp_management->on_amqp_management_error_context);
XinZhangMS 0:f7f1f0d76dd6 187 /* Codes_SRS_AMQP_MANAGEMENT_01_135: [ When an error occurs in creating AMQP values (for status code, etc.) `on_message_received` shall call `messaging_delivery_released` and return the created delivery AMQP value. ]*/
XinZhangMS 0:f7f1f0d76dd6 188 result = messaging_delivery_released();
XinZhangMS 0:f7f1f0d76dd6 189 }
XinZhangMS 0:f7f1f0d76dd6 190 else
XinZhangMS 0:f7f1f0d76dd6 191 {
XinZhangMS 0:f7f1f0d76dd6 192 const char* status_description = NULL;
XinZhangMS 0:f7f1f0d76dd6 193 LIST_ITEM_HANDLE list_item_handle;
XinZhangMS 0:f7f1f0d76dd6 194 bool found = false;
XinZhangMS 0:f7f1f0d76dd6 195 bool is_error = false;
XinZhangMS 0:f7f1f0d76dd6 196
XinZhangMS 0:f7f1f0d76dd6 197 /* Codes_SRS_AMQP_MANAGEMENT_01_124: [ The status description shall be looked up in the application properties by using `amqpvalue_get_map_value`. ]*/
XinZhangMS 0:f7f1f0d76dd6 198 desc_value = amqpvalue_get_map_value(map, desc_key);
XinZhangMS 0:f7f1f0d76dd6 199 if (desc_value != NULL)
XinZhangMS 0:f7f1f0d76dd6 200 {
XinZhangMS 0:f7f1f0d76dd6 201 /* Codes_SRS_AMQP_MANAGEMENT_01_134: [ The status description value shall be extracted from the value found in the map by using `amqpvalue_get_string`. ]*/
XinZhangMS 0:f7f1f0d76dd6 202 if (amqpvalue_get_string(desc_value, &status_description) != 0)
XinZhangMS 0:f7f1f0d76dd6 203 {
XinZhangMS 0:f7f1f0d76dd6 204 /* Codes_SRS_AMQP_MANAGEMENT_01_125: [ If status description is not found, NULL shall be passed to the user callback as `status_description` argument. ]*/
XinZhangMS 0:f7f1f0d76dd6 205 status_description = NULL;
XinZhangMS 0:f7f1f0d76dd6 206 }
XinZhangMS 0:f7f1f0d76dd6 207 }
XinZhangMS 0:f7f1f0d76dd6 208 else
XinZhangMS 0:f7f1f0d76dd6 209 {
XinZhangMS 0:f7f1f0d76dd6 210 /* Codes_SRS_AMQP_MANAGEMENT_01_125: [ If status description is not found, NULL shall be passed to the user callback as `status_description` argument. ]*/
XinZhangMS 0:f7f1f0d76dd6 211 status_description = NULL;
XinZhangMS 0:f7f1f0d76dd6 212 }
XinZhangMS 0:f7f1f0d76dd6 213
XinZhangMS 0:f7f1f0d76dd6 214 list_item_handle = singlylinkedlist_get_head_item(amqp_management->pending_operations);
XinZhangMS 0:f7f1f0d76dd6 215 while (list_item_handle != NULL)
XinZhangMS 0:f7f1f0d76dd6 216 {
XinZhangMS 0:f7f1f0d76dd6 217 /* Codes_SRS_AMQP_MANAGEMENT_01_116: [ Each pending operation item value shall be obtained by calling `singlylinkedlist_item_get_value`. ]*/
XinZhangMS 0:f7f1f0d76dd6 218 OPERATION_MESSAGE_INSTANCE* operation_message = (OPERATION_MESSAGE_INSTANCE*)singlylinkedlist_item_get_value(list_item_handle);
XinZhangMS 0:f7f1f0d76dd6 219 if (operation_message == NULL)
XinZhangMS 0:f7f1f0d76dd6 220 {
XinZhangMS 0:f7f1f0d76dd6 221 /* Codes_SRS_AMQP_MANAGEMENT_01_117: [ If iterating through the pending operations list fails, an error shall be indicated by calling `on_amqp_management_error` and passing the `on_amqp_management_error_context` to it. ]*/
XinZhangMS 0:f7f1f0d76dd6 222 LogError("Could not create status-description amqp value");
XinZhangMS 0:f7f1f0d76dd6 223 amqp_management->on_amqp_management_error(amqp_management->on_amqp_management_error_context);
XinZhangMS 0:f7f1f0d76dd6 224 /* Codes_SRS_AMQP_MANAGEMENT_01_135: [ When an error occurs in creating AMQP values (for status code, etc.) `on_message_received` shall call `messaging_delivery_released` and return the created delivery AMQP value. ]*/
XinZhangMS 0:f7f1f0d76dd6 225 result = messaging_delivery_released();
XinZhangMS 0:f7f1f0d76dd6 226 break;
XinZhangMS 0:f7f1f0d76dd6 227 }
XinZhangMS 0:f7f1f0d76dd6 228 else
XinZhangMS 0:f7f1f0d76dd6 229 {
XinZhangMS 0:f7f1f0d76dd6 230 AMQP_MANAGEMENT_EXECUTE_OPERATION_RESULT execute_operation_result;
XinZhangMS 0:f7f1f0d76dd6 231
XinZhangMS 0:f7f1f0d76dd6 232 /* Codes_SRS_AMQP_MANAGEMENT_01_112: [ `on_message_received` shall check if the correlation Id matches the stored message Id of any pending operation. ]*/
XinZhangMS 0:f7f1f0d76dd6 233 /* Codes_SRS_AMQP_MANAGEMENT_01_068: [ The correlation-id of the response message MUST be the correlation-id from the request message (if present) ]*/
XinZhangMS 0:f7f1f0d76dd6 234 /* Codes_SRS_AMQP_MANAGEMENT_01_069: [ else the message-id from the request message. ]*/
XinZhangMS 0:f7f1f0d76dd6 235 if (correlation_id == operation_message->message_id)
XinZhangMS 0:f7f1f0d76dd6 236 {
XinZhangMS 0:f7f1f0d76dd6 237 /* Codes_SRS_AMQP_MANAGEMENT_01_074: [ Successful operations MUST result in a statusCode in the 2xx range as defined in Section 10.2 of [RFC2616]. ]*/
XinZhangMS 0:f7f1f0d76dd6 238 if ((status_code < 200) || (status_code > 299))
XinZhangMS 0:f7f1f0d76dd6 239 {
XinZhangMS 0:f7f1f0d76dd6 240 /* Codes_SRS_AMQP_MANAGEMENT_01_128: [ If the status indicates that the operation failed, the result callback argument shall be `AMQP_MANAGEMENT_EXECUTE_OPERATION_FAILED_BAD_STATUS`. ]*/
XinZhangMS 0:f7f1f0d76dd6 241 /* Codes_SRS_AMQP_MANAGEMENT_01_075: [ Unsuccessful operations MUST NOT result in a statusCode in the 2xx range as defined in Section 10.2 of [RFC2616]. ]*/
XinZhangMS 0:f7f1f0d76dd6 242 execute_operation_result = AMQP_MANAGEMENT_EXECUTE_OPERATION_FAILED_BAD_STATUS;
XinZhangMS 0:f7f1f0d76dd6 243 }
XinZhangMS 0:f7f1f0d76dd6 244 else
XinZhangMS 0:f7f1f0d76dd6 245 {
XinZhangMS 0:f7f1f0d76dd6 246 /* Codes_SRS_AMQP_MANAGEMENT_01_127: [ If the operation succeeded the result callback argument shall be `AMQP_MANAGEMENT_EXECUTE_OPERATION_OK`. ]*/
XinZhangMS 0:f7f1f0d76dd6 247 execute_operation_result = AMQP_MANAGEMENT_EXECUTE_OPERATION_OK;
XinZhangMS 0:f7f1f0d76dd6 248 }
XinZhangMS 0:f7f1f0d76dd6 249
XinZhangMS 0:f7f1f0d76dd6 250 /* Codes_SRS_AMQP_MANAGEMENT_01_126: [ If a corresponding correlation Id is found in the pending operations list, the callback associated with the pending operation shall be called. ]*/
XinZhangMS 0:f7f1f0d76dd6 251 /* Codes_SRS_AMQP_MANAGEMENT_01_166: [ The `message` shall be passed as argument to the callback. ]*/
XinZhangMS 0:f7f1f0d76dd6 252 operation_message->on_execute_operation_complete(operation_message->callback_context, execute_operation_result, status_code, status_description, message);
XinZhangMS 0:f7f1f0d76dd6 253
XinZhangMS 0:f7f1f0d76dd6 254 free(operation_message);
XinZhangMS 0:f7f1f0d76dd6 255
XinZhangMS 0:f7f1f0d76dd6 256 /* Codes_SRS_AMQP_MANAGEMENT_01_129: [ After calling the callback, the pending operation shall be removed from the pending operations list by calling `singlylinkedlist_remove`. ]*/
XinZhangMS 0:f7f1f0d76dd6 257 if (singlylinkedlist_remove(amqp_management->pending_operations, list_item_handle) != 0)
XinZhangMS 0:f7f1f0d76dd6 258 {
XinZhangMS 0:f7f1f0d76dd6 259 LogError("Cannot remove pending operation");
XinZhangMS 0:f7f1f0d76dd6 260 is_error = true;
XinZhangMS 0:f7f1f0d76dd6 261 break;
XinZhangMS 0:f7f1f0d76dd6 262 }
XinZhangMS 0:f7f1f0d76dd6 263 else
XinZhangMS 0:f7f1f0d76dd6 264 {
XinZhangMS 0:f7f1f0d76dd6 265 found = true;
XinZhangMS 0:f7f1f0d76dd6 266 }
XinZhangMS 0:f7f1f0d76dd6 267
XinZhangMS 0:f7f1f0d76dd6 268 break;
XinZhangMS 0:f7f1f0d76dd6 269 }
XinZhangMS 0:f7f1f0d76dd6 270 }
XinZhangMS 0:f7f1f0d76dd6 271
XinZhangMS 0:f7f1f0d76dd6 272 /* Codes_SRS_AMQP_MANAGEMENT_01_115: [ Iterating through the pending operations shall be done by using `singlylinkedlist_get_head_item` and `singlylinkedlist_get_next_item` until the enm of the pending operations singly linked list is reached. ]*/
XinZhangMS 0:f7f1f0d76dd6 273 /* Codes_SRS_AMQP_MANAGEMENT_01_117: [ If iterating through the pending operations list fails, an error shall be indicated by calling `on_amqp_management_error` and passing the `on_amqp_management_error_context` to it. ]*/
XinZhangMS 0:f7f1f0d76dd6 274 list_item_handle = singlylinkedlist_get_next_item(list_item_handle);
XinZhangMS 0:f7f1f0d76dd6 275 }
XinZhangMS 0:f7f1f0d76dd6 276
XinZhangMS 0:f7f1f0d76dd6 277 if (is_error)
XinZhangMS 0:f7f1f0d76dd6 278 {
XinZhangMS 0:f7f1f0d76dd6 279 /* Codes_SRS_AMQP_MANAGEMENT_01_117: [ If iterating through the pending operations list fails, an error shall be indicated by calling `on_amqp_management_error` and passing the `on_amqp_management_error_context` to it. ]*/
XinZhangMS 0:f7f1f0d76dd6 280 amqp_management->on_amqp_management_error(amqp_management->on_amqp_management_error_context);
XinZhangMS 0:f7f1f0d76dd6 281 /* Codes_SRS_AMQP_MANAGEMENT_01_135: [ When an error occurs in creating AMQP values (for status code, etc.) `on_message_received` shall call `messaging_delivery_released` and return the created delivery AMQP value. ]*/
XinZhangMS 0:f7f1f0d76dd6 282 result = messaging_delivery_released();
XinZhangMS 0:f7f1f0d76dd6 283 }
XinZhangMS 0:f7f1f0d76dd6 284 else
XinZhangMS 0:f7f1f0d76dd6 285 {
XinZhangMS 0:f7f1f0d76dd6 286 if (!found)
XinZhangMS 0:f7f1f0d76dd6 287 {
XinZhangMS 0:f7f1f0d76dd6 288 /* Codes_SRS_AMQP_MANAGEMENT_01_118: [ If no pending operation is found matching the correlation Id, an error shall be indicated by calling `on_amqp_management_error` and passing the `on_amqp_management_error_context` to it. ]*/
XinZhangMS 0:f7f1f0d76dd6 289 LogError("Could not match AMQP management response to request");
XinZhangMS 0:f7f1f0d76dd6 290 amqp_management->on_amqp_management_error(amqp_management->on_amqp_management_error_context);
XinZhangMS 0:f7f1f0d76dd6 291 /* Codes_SRS_AMQP_MANAGEMENT_01_135: [ When an error occurs in creating AMQP values (for status code, etc.) `on_message_received` shall call `messaging_delivery_released` and return the created delivery AMQP value. ]*/
XinZhangMS 0:f7f1f0d76dd6 292 result = messaging_delivery_rejected("amqp:internal-error", "Could not match AMQP management response to request");
XinZhangMS 0:f7f1f0d76dd6 293 }
XinZhangMS 0:f7f1f0d76dd6 294 else
XinZhangMS 0:f7f1f0d76dd6 295 {
XinZhangMS 0:f7f1f0d76dd6 296 /* Codes_SRS_AMQP_MANAGEMENT_01_130: [ The `on_message_received` shall call `messaging_delivery_accepted` and return the created delivery AMQP value. ]*/
XinZhangMS 0:f7f1f0d76dd6 297 result = messaging_delivery_accepted();
XinZhangMS 0:f7f1f0d76dd6 298 }
XinZhangMS 0:f7f1f0d76dd6 299 }
XinZhangMS 0:f7f1f0d76dd6 300
XinZhangMS 0:f7f1f0d76dd6 301 if (desc_value != NULL)
XinZhangMS 0:f7f1f0d76dd6 302 {
XinZhangMS 0:f7f1f0d76dd6 303 /* Codes_SRS_AMQP_MANAGEMENT_01_131: [ All temporary values like AMQP values used as keys shall be freed before exiting the callback. ]*/
XinZhangMS 0:f7f1f0d76dd6 304 amqpvalue_destroy(desc_value);
XinZhangMS 0:f7f1f0d76dd6 305 }
XinZhangMS 0:f7f1f0d76dd6 306
XinZhangMS 0:f7f1f0d76dd6 307 /* Codes_SRS_AMQP_MANAGEMENT_01_131: [ All temporary values like AMQP values used as keys shall be freed before exiting the callback. ]*/
XinZhangMS 0:f7f1f0d76dd6 308 amqpvalue_destroy(desc_key);
XinZhangMS 0:f7f1f0d76dd6 309 }
XinZhangMS 0:f7f1f0d76dd6 310 }
XinZhangMS 0:f7f1f0d76dd6 311
XinZhangMS 0:f7f1f0d76dd6 312 /* Codes_SRS_AMQP_MANAGEMENT_01_131: [ All temporary values like AMQP values used as keys shall be freed before exiting the callback. ]*/
XinZhangMS 0:f7f1f0d76dd6 313 amqpvalue_destroy(value);
XinZhangMS 0:f7f1f0d76dd6 314 }
XinZhangMS 0:f7f1f0d76dd6 315
XinZhangMS 0:f7f1f0d76dd6 316 /* Codes_SRS_AMQP_MANAGEMENT_01_131: [ All temporary values like AMQP values used as keys shall be freed before exiting the callback. ]*/
XinZhangMS 0:f7f1f0d76dd6 317 amqpvalue_destroy(key);
XinZhangMS 0:f7f1f0d76dd6 318 }
XinZhangMS 0:f7f1f0d76dd6 319 }
XinZhangMS 0:f7f1f0d76dd6 320 }
XinZhangMS 0:f7f1f0d76dd6 321 }
XinZhangMS 0:f7f1f0d76dd6 322
XinZhangMS 0:f7f1f0d76dd6 323 /* Codes_SRS_AMQP_MANAGEMENT_01_131: [ All temporary values like AMQP values used as keys shall be freed before exiting the callback. ]*/
XinZhangMS 0:f7f1f0d76dd6 324 properties_destroy(response_properties);
XinZhangMS 0:f7f1f0d76dd6 325 }
XinZhangMS 0:f7f1f0d76dd6 326
XinZhangMS 0:f7f1f0d76dd6 327 /* Codes_SRS_AMQP_MANAGEMENT_01_131: [ All temporary values like AMQP values used as keys shall be freed before exiting the callback. ]*/
XinZhangMS 0:f7f1f0d76dd6 328 application_properties_destroy(application_properties);
XinZhangMS 0:f7f1f0d76dd6 329 }
XinZhangMS 0:f7f1f0d76dd6 330 }
XinZhangMS 0:f7f1f0d76dd6 331
XinZhangMS 0:f7f1f0d76dd6 332 return result;
XinZhangMS 0:f7f1f0d76dd6 333 }
XinZhangMS 0:f7f1f0d76dd6 334
XinZhangMS 0:f7f1f0d76dd6 335 static void on_message_send_complete(void* context, MESSAGE_SEND_RESULT send_result, AMQP_VALUE delivery_state)
XinZhangMS 0:f7f1f0d76dd6 336 {
XinZhangMS 0:f7f1f0d76dd6 337 (void)delivery_state;
XinZhangMS 0:f7f1f0d76dd6 338
XinZhangMS 0:f7f1f0d76dd6 339 if (context == NULL)
XinZhangMS 0:f7f1f0d76dd6 340 {
XinZhangMS 0:f7f1f0d76dd6 341 /* Codes_SRS_AMQP_MANAGEMENT_01_167: [ When `on_message_send_complete` is called with a NULL context it shall return. ]*/
XinZhangMS 0:f7f1f0d76dd6 342 LogError("NULL context");
XinZhangMS 0:f7f1f0d76dd6 343 }
XinZhangMS 0:f7f1f0d76dd6 344 else
XinZhangMS 0:f7f1f0d76dd6 345 {
XinZhangMS 0:f7f1f0d76dd6 346 if (send_result == MESSAGE_SEND_OK)
XinZhangMS 0:f7f1f0d76dd6 347 {
XinZhangMS 0:f7f1f0d76dd6 348 /* Codes_SRS_AMQP_MANAGEMENT_01_170: [ If `send_result` is `MESSAGE_SEND_OK`, `on_message_send_complete` shall return. ]*/
XinZhangMS 0:f7f1f0d76dd6 349 }
XinZhangMS 0:f7f1f0d76dd6 350 else
XinZhangMS 0:f7f1f0d76dd6 351 {
XinZhangMS 0:f7f1f0d76dd6 352 /* Codes_SRS_AMQP_MANAGEMENT_01_172: [ If `send_result` is different then `MESSAGE_SEND_OK`: ]*/
XinZhangMS 0:f7f1f0d76dd6 353 /* Codes_SRS_AMQP_MANAGEMENT_01_168: [ - `context` shall be used as a LIST_ITEM_HANDLE containing the pending operation. ]*/
XinZhangMS 0:f7f1f0d76dd6 354 LIST_ITEM_HANDLE pending_operation_list_item_handle = (LIST_ITEM_HANDLE)context;
XinZhangMS 0:f7f1f0d76dd6 355
XinZhangMS 0:f7f1f0d76dd6 356 /* Codes_SRS_AMQP_MANAGEMENT_01_169: [ - `on_message_send_complete` shall obtain the pending operation by calling `singlylinkedlist_item_get_value`. ]*/
XinZhangMS 0:f7f1f0d76dd6 357 OPERATION_MESSAGE_INSTANCE* pending_operation_message = (OPERATION_MESSAGE_INSTANCE*)singlylinkedlist_item_get_value(pending_operation_list_item_handle);
XinZhangMS 0:f7f1f0d76dd6 358 AMQP_MANAGEMENT_HANDLE amqp_management = pending_operation_message->amqp_management;
XinZhangMS 0:f7f1f0d76dd6 359
XinZhangMS 0:f7f1f0d76dd6 360 /* Codes_SRS_AMQP_MANAGEMENT_01_171: [ - `on_message_send_complete` shall removed the pending operation from the pending operations list. ]*/
XinZhangMS 0:f7f1f0d76dd6 361 if (singlylinkedlist_remove(amqp_management->pending_operations, pending_operation_list_item_handle) != 0)
XinZhangMS 0:f7f1f0d76dd6 362 {
XinZhangMS 0:f7f1f0d76dd6 363 /* Tests_SRS_AMQP_MANAGEMENT_01_174: [ If any error occurs in removing the pending operation from the list `on_amqp_management_error` callback shall be invoked while passing the `on_amqp_management_error_context` as argument. ]*/
XinZhangMS 0:f7f1f0d76dd6 364 amqp_management->on_amqp_management_error(amqp_management->on_amqp_management_error_context);
XinZhangMS 0:f7f1f0d76dd6 365 LogError("Cannot remove pending operation");
XinZhangMS 0:f7f1f0d76dd6 366 }
XinZhangMS 0:f7f1f0d76dd6 367 else
XinZhangMS 0:f7f1f0d76dd6 368 {
XinZhangMS 0:f7f1f0d76dd6 369 /* Codes_SRS_AMQP_MANAGEMENT_01_173: [ - The callback associated with the pending operation shall be called with `AMQP_MANAGEMENT_EXECUTE_OPERATION_ERROR`. ]*/
XinZhangMS 0:f7f1f0d76dd6 370 pending_operation_message->on_execute_operation_complete(pending_operation_message->callback_context, AMQP_MANAGEMENT_EXECUTE_OPERATION_ERROR, 0, NULL, NULL);
XinZhangMS 0:f7f1f0d76dd6 371 free(pending_operation_message);
XinZhangMS 0:f7f1f0d76dd6 372 }
XinZhangMS 0:f7f1f0d76dd6 373 }
XinZhangMS 0:f7f1f0d76dd6 374 }
XinZhangMS 0:f7f1f0d76dd6 375 }
XinZhangMS 0:f7f1f0d76dd6 376
XinZhangMS 0:f7f1f0d76dd6 377 static void on_message_sender_state_changed(void* context, MESSAGE_SENDER_STATE new_state, MESSAGE_SENDER_STATE previous_state)
XinZhangMS 0:f7f1f0d76dd6 378 {
XinZhangMS 0:f7f1f0d76dd6 379 if (context == NULL)
XinZhangMS 0:f7f1f0d76dd6 380 {
XinZhangMS 0:f7f1f0d76dd6 381 /* Codes_SRS_AMQP_MANAGEMENT_01_137: [ When `on_message_sender_state_changed` is called with NULL `context`, it shall do nothing. ]*/
XinZhangMS 0:f7f1f0d76dd6 382 LogError("on_message_sender_state_changed called with NULL context");
XinZhangMS 0:f7f1f0d76dd6 383 }
XinZhangMS 0:f7f1f0d76dd6 384 else
XinZhangMS 0:f7f1f0d76dd6 385 {
XinZhangMS 0:f7f1f0d76dd6 386 /* Codes_SRS_AMQP_MANAGEMENT_01_138: [ When `on_message_sender_state_changed` is called and the `new_state` is different than `previous_state`, the following actions shall be taken: ]*/
XinZhangMS 0:f7f1f0d76dd6 387 /* Codes_SRS_AMQP_MANAGEMENT_01_148: [ When no state change is detected, `on_message_sender_state_changed` shall do nothing. ]*/
XinZhangMS 0:f7f1f0d76dd6 388 if (new_state != previous_state)
XinZhangMS 0:f7f1f0d76dd6 389 {
XinZhangMS 0:f7f1f0d76dd6 390 AMQP_MANAGEMENT_INSTANCE* amqp_management_instance = (AMQP_MANAGEMENT_INSTANCE*)context;
XinZhangMS 0:f7f1f0d76dd6 391 switch (amqp_management_instance->amqp_management_state)
XinZhangMS 0:f7f1f0d76dd6 392 {
XinZhangMS 0:f7f1f0d76dd6 393 default:
XinZhangMS 0:f7f1f0d76dd6 394 break;
XinZhangMS 0:f7f1f0d76dd6 395
XinZhangMS 0:f7f1f0d76dd6 396 /* Codes_SRS_AMQP_MANAGEMENT_01_139: [ For the current state of AMQP management being `OPENING`: ]*/
XinZhangMS 0:f7f1f0d76dd6 397 case AMQP_MANAGEMENT_STATE_OPENING:
XinZhangMS 0:f7f1f0d76dd6 398 {
XinZhangMS 0:f7f1f0d76dd6 399 switch (new_state)
XinZhangMS 0:f7f1f0d76dd6 400 {
XinZhangMS 0:f7f1f0d76dd6 401 case MESSAGE_SENDER_STATE_OPENING:
XinZhangMS 0:f7f1f0d76dd6 402 /* Codes_SRS_AMQP_MANAGEMENT_01_165: [ - If `new_state` is `MESSAGE_SENDER_STATE_OPEING` the transition shall be ignored. ]*/
XinZhangMS 0:f7f1f0d76dd6 403 break;
XinZhangMS 0:f7f1f0d76dd6 404
XinZhangMS 0:f7f1f0d76dd6 405 default:
XinZhangMS 0:f7f1f0d76dd6 406 /* Codes_SRS_AMQP_MANAGEMENT_01_140: [ - If `new_state` is `MESSAGE_SENDER_STATE_IDLE`, `MESSAGE_SENDER_STATE_CLOSING` or `MESSAGE_SENDER_STATE_ERROR`, the `on_amqp_management_open_complete` callback shall be called with `AMQP_MANAGEMENT_OPEN_ERROR`, while also passing the context passed in `amqp_management_open_async`. ]*/
XinZhangMS 0:f7f1f0d76dd6 407 case MESSAGE_SENDER_STATE_IDLE:
XinZhangMS 0:f7f1f0d76dd6 408 case MESSAGE_SENDER_STATE_CLOSING:
XinZhangMS 0:f7f1f0d76dd6 409 case MESSAGE_SENDER_STATE_ERROR:
XinZhangMS 0:f7f1f0d76dd6 410 amqp_management_instance->amqp_management_state = AMQP_MANAGEMENT_STATE_IDLE;
XinZhangMS 0:f7f1f0d76dd6 411 amqp_management_instance->on_amqp_management_open_complete(amqp_management_instance->on_amqp_management_open_complete_context, AMQP_MANAGEMENT_OPEN_ERROR);
XinZhangMS 0:f7f1f0d76dd6 412 break;
XinZhangMS 0:f7f1f0d76dd6 413
XinZhangMS 0:f7f1f0d76dd6 414 case MESSAGE_SENDER_STATE_OPEN:
XinZhangMS 0:f7f1f0d76dd6 415 amqp_management_instance->sender_connected = 1;
XinZhangMS 0:f7f1f0d76dd6 416 /* Codes_SRS_AMQP_MANAGEMENT_01_142: [ - If `new_state` is `MESSAGE_SENDER_STATE_OPEN` and the message receiver did not yet indicate its state as `MESSAGE_RECEIVER_STATE_OPEN`, the `on_amqp_management_open_complete` callback shall not be called.]*/
XinZhangMS 0:f7f1f0d76dd6 417 if (amqp_management_instance->receiver_connected != 0)
XinZhangMS 0:f7f1f0d76dd6 418 {
XinZhangMS 0:f7f1f0d76dd6 419 /* Codes_SRS_AMQP_MANAGEMENT_01_141: [ - If `new_state` is `MESSAGE_SENDER_STATE_OPEN` and the message receiver already indicated its state as `MESSAGE_RECEIVER_STATE_OPEN`, the `on_amqp_management_open_complete` callback shall be called with `AMQP_MANAGEMENT_OPEN_OK`, while also passing the context passed in `amqp_management_open_async`. ]*/
XinZhangMS 0:f7f1f0d76dd6 420 amqp_management_instance->amqp_management_state = AMQP_MANAGEMENT_STATE_OPEN;
XinZhangMS 0:f7f1f0d76dd6 421 amqp_management_instance->on_amqp_management_open_complete(amqp_management_instance->on_amqp_management_open_complete_context, AMQP_MANAGEMENT_OPEN_OK);
XinZhangMS 0:f7f1f0d76dd6 422 }
XinZhangMS 0:f7f1f0d76dd6 423 break;
XinZhangMS 0:f7f1f0d76dd6 424 }
XinZhangMS 0:f7f1f0d76dd6 425 break;
XinZhangMS 0:f7f1f0d76dd6 426 }
XinZhangMS 0:f7f1f0d76dd6 427 /* Codes_SRS_AMQP_MANAGEMENT_01_144: [ For the current state of AMQP management being `OPEN`: ]*/
XinZhangMS 0:f7f1f0d76dd6 428 case AMQP_MANAGEMENT_STATE_OPEN:
XinZhangMS 0:f7f1f0d76dd6 429 {
XinZhangMS 0:f7f1f0d76dd6 430 switch (new_state)
XinZhangMS 0:f7f1f0d76dd6 431 {
XinZhangMS 0:f7f1f0d76dd6 432 default:
XinZhangMS 0:f7f1f0d76dd6 433 /* Codes_SRS_AMQP_MANAGEMENT_01_143: [ - If `new_state` is `MESSAGE_SENDER_STATE_IDLE`, `MESSAGE_SENDER_STATE_OPENING`, `MESSAGE_SENDER_STATE_CLOSING` or `MESSAGE_SENDER_STATE_ERROR` the `on_amqp_management_error` callback shall be invoked while passing the `on_amqp_management_error_context` as argument. ]*/
XinZhangMS 0:f7f1f0d76dd6 434 case MESSAGE_SENDER_STATE_IDLE:
XinZhangMS 0:f7f1f0d76dd6 435 case MESSAGE_SENDER_STATE_CLOSING:
XinZhangMS 0:f7f1f0d76dd6 436 case MESSAGE_SENDER_STATE_ERROR:
XinZhangMS 0:f7f1f0d76dd6 437 amqp_management_instance->amqp_management_state = AMQP_MANAGEMENT_STATE_ERROR;
XinZhangMS 0:f7f1f0d76dd6 438 amqp_management_instance->on_amqp_management_error(amqp_management_instance->on_amqp_management_error_context);
XinZhangMS 0:f7f1f0d76dd6 439 break;
XinZhangMS 0:f7f1f0d76dd6 440
XinZhangMS 0:f7f1f0d76dd6 441 case MESSAGE_SENDER_STATE_OPEN:
XinZhangMS 0:f7f1f0d76dd6 442 /* Codes_SRS_AMQP_MANAGEMENT_01_145: [ - If `new_state` is `MESSAGE_SENDER_STATE_OPEN`, `on_message_sender_state_changed` shall do nothing. ]*/
XinZhangMS 0:f7f1f0d76dd6 443 break;
XinZhangMS 0:f7f1f0d76dd6 444 }
XinZhangMS 0:f7f1f0d76dd6 445 break;
XinZhangMS 0:f7f1f0d76dd6 446 }
XinZhangMS 0:f7f1f0d76dd6 447 /* Codes_SRS_AMQP_MANAGEMENT_09_001: [ For the current state of AMQP management being `CLOSING`: ]*/
XinZhangMS 0:f7f1f0d76dd6 448 case AMQP_MANAGEMENT_STATE_CLOSING:
XinZhangMS 0:f7f1f0d76dd6 449 {
XinZhangMS 0:f7f1f0d76dd6 450 switch (new_state)
XinZhangMS 0:f7f1f0d76dd6 451 {
XinZhangMS 0:f7f1f0d76dd6 452 default:
XinZhangMS 0:f7f1f0d76dd6 453 /* Codes_SRS_AMQP_MANAGEMENT_09_002: [ - If `new_state` is `MESSAGE_SENDER_STATE_OPEN`, `MESSAGE_SENDER_STATE_OPENING`, `MESSAGE_SENDER_STATE_ERROR` the `on_amqp_management_error` callback shall be invoked while passing the `on_amqp_management_error_context` as argument. ]*/
XinZhangMS 0:f7f1f0d76dd6 454 case MESSAGE_SENDER_STATE_OPEN:
XinZhangMS 0:f7f1f0d76dd6 455 case MESSAGE_SENDER_STATE_OPENING:
XinZhangMS 0:f7f1f0d76dd6 456 case MESSAGE_SENDER_STATE_ERROR:
XinZhangMS 0:f7f1f0d76dd6 457 amqp_management_instance->amqp_management_state = AMQP_MANAGEMENT_STATE_ERROR;
XinZhangMS 0:f7f1f0d76dd6 458 amqp_management_instance->on_amqp_management_error(amqp_management_instance->on_amqp_management_error_context);
XinZhangMS 0:f7f1f0d76dd6 459 break;
XinZhangMS 0:f7f1f0d76dd6 460 case MESSAGE_SENDER_STATE_IDLE:
XinZhangMS 0:f7f1f0d76dd6 461 case MESSAGE_SENDER_STATE_CLOSING:
XinZhangMS 0:f7f1f0d76dd6 462 /* Codes_SRS_AMQP_MANAGEMENT_09_003: [ - If `new_state` is `MESSAGE_SENDER_STATE_CLOSING` or `MESSAGE_SENDER_STATE_IDLE`, `on_message_sender_state_changed` shall do nothing. ]*/
XinZhangMS 0:f7f1f0d76dd6 463 break;
XinZhangMS 0:f7f1f0d76dd6 464 }
XinZhangMS 0:f7f1f0d76dd6 465 break;
XinZhangMS 0:f7f1f0d76dd6 466 }
XinZhangMS 0:f7f1f0d76dd6 467 /* Codes_SRS_AMQP_MANAGEMENT_01_146: [ For the current state of AMQP management being `ERROR`: ]*/
XinZhangMS 0:f7f1f0d76dd6 468 case AMQP_MANAGEMENT_STATE_ERROR:
XinZhangMS 0:f7f1f0d76dd6 469 /* Codes_SRS_AMQP_MANAGEMENT_01_147: [ - All state transitions shall be ignored. ]*/
XinZhangMS 0:f7f1f0d76dd6 470 break;
XinZhangMS 0:f7f1f0d76dd6 471 }
XinZhangMS 0:f7f1f0d76dd6 472 }
XinZhangMS 0:f7f1f0d76dd6 473 }
XinZhangMS 0:f7f1f0d76dd6 474 }
XinZhangMS 0:f7f1f0d76dd6 475
XinZhangMS 0:f7f1f0d76dd6 476 static void on_message_receiver_state_changed(const void* context, MESSAGE_RECEIVER_STATE new_state, MESSAGE_RECEIVER_STATE previous_state)
XinZhangMS 0:f7f1f0d76dd6 477 {
XinZhangMS 0:f7f1f0d76dd6 478 if (context == NULL)
XinZhangMS 0:f7f1f0d76dd6 479 {
XinZhangMS 0:f7f1f0d76dd6 480 /* Codes_SRS_AMQP_MANAGEMENT_01_149: [ When `on_message_receiver_state_changed` is called with NULL `context`, it shall do nothing. ]*/
XinZhangMS 0:f7f1f0d76dd6 481 LogError("on_message_receiver_state_changed called with NULL context");
XinZhangMS 0:f7f1f0d76dd6 482 }
XinZhangMS 0:f7f1f0d76dd6 483 else
XinZhangMS 0:f7f1f0d76dd6 484 {
XinZhangMS 0:f7f1f0d76dd6 485 /* Codes_SRS_AMQP_MANAGEMENT_01_150: [ When `on_message_receiver_state_changed` is called and the `new_state` is different than `previous_state`, the following actions shall be taken: ]*/
XinZhangMS 0:f7f1f0d76dd6 486 /* Codes_SRS_AMQP_MANAGEMENT_01_160: [ When no state change is detected, `on_message_receiver_state_changed` shall do nothing. ]*/
XinZhangMS 0:f7f1f0d76dd6 487 if (new_state != previous_state)
XinZhangMS 0:f7f1f0d76dd6 488 {
XinZhangMS 0:f7f1f0d76dd6 489 AMQP_MANAGEMENT_INSTANCE* amqp_management_instance = (AMQP_MANAGEMENT_INSTANCE*)context;
XinZhangMS 0:f7f1f0d76dd6 490 switch (amqp_management_instance->amqp_management_state)
XinZhangMS 0:f7f1f0d76dd6 491 {
XinZhangMS 0:f7f1f0d76dd6 492 default:
XinZhangMS 0:f7f1f0d76dd6 493 break;
XinZhangMS 0:f7f1f0d76dd6 494
XinZhangMS 0:f7f1f0d76dd6 495 /* Codes_SRS_AMQP_MANAGEMENT_01_151: [ For the current state of AMQP management being `OPENING`: ]*/
XinZhangMS 0:f7f1f0d76dd6 496 case AMQP_MANAGEMENT_STATE_OPENING:
XinZhangMS 0:f7f1f0d76dd6 497 {
XinZhangMS 0:f7f1f0d76dd6 498 switch (new_state)
XinZhangMS 0:f7f1f0d76dd6 499 {
XinZhangMS 0:f7f1f0d76dd6 500 case MESSAGE_RECEIVER_STATE_OPENING:
XinZhangMS 0:f7f1f0d76dd6 501 /* Codes_SRS_AMQP_MANAGEMENT_01_164: [ - If `new_state` is `MESSAGE_RECEIVER_STATE_OPEING` the transition shall be ignored. ]*/
XinZhangMS 0:f7f1f0d76dd6 502 break;
XinZhangMS 0:f7f1f0d76dd6 503
XinZhangMS 0:f7f1f0d76dd6 504 default:
XinZhangMS 0:f7f1f0d76dd6 505 /* Codes_SRS_AMQP_MANAGEMENT_01_152: [ - If `new_state` is `MESSAGE_RECEIVER_STATE_IDLE`, `MESSAGE_RECEIVER_STATE_CLOSING` or `MESSAGE_RECEIVER_STATE_ERROR`, the `on_amqp_management_open_complete` callback shall be called with `AMQP_MANAGEMENT_OPEN_ERROR`, while also passing the context passed in `amqp_management_open_async`. ]*/
XinZhangMS 0:f7f1f0d76dd6 506 case MESSAGE_RECEIVER_STATE_IDLE:
XinZhangMS 0:f7f1f0d76dd6 507 case MESSAGE_RECEIVER_STATE_CLOSING:
XinZhangMS 0:f7f1f0d76dd6 508 case MESSAGE_RECEIVER_STATE_ERROR:
XinZhangMS 0:f7f1f0d76dd6 509 amqp_management_instance->amqp_management_state = AMQP_MANAGEMENT_STATE_IDLE;
XinZhangMS 0:f7f1f0d76dd6 510 amqp_management_instance->on_amqp_management_open_complete(amqp_management_instance->on_amqp_management_open_complete_context, AMQP_MANAGEMENT_OPEN_ERROR);
XinZhangMS 0:f7f1f0d76dd6 511 break;
XinZhangMS 0:f7f1f0d76dd6 512
XinZhangMS 0:f7f1f0d76dd6 513 case MESSAGE_RECEIVER_STATE_OPEN:
XinZhangMS 0:f7f1f0d76dd6 514 amqp_management_instance->receiver_connected = 1;
XinZhangMS 0:f7f1f0d76dd6 515 /* Codes_SRS_AMQP_MANAGEMENT_01_154: [ - If `new_state` is `MESSAGE_RECEIVER_STATE_OPEN` and the message sender did not yet indicate its state as `MESSAGE_RECEIVER_STATE_OPEN`, the `on_amqp_management_open_complete` callback shall not be called. ]*/
XinZhangMS 0:f7f1f0d76dd6 516 if (amqp_management_instance->sender_connected != 0)
XinZhangMS 0:f7f1f0d76dd6 517 {
XinZhangMS 0:f7f1f0d76dd6 518 /* Codes_SRS_AMQP_MANAGEMENT_01_153: [ - If `new_state` is `MESSAGE_RECEIVER_STATE_OPEN` and the message sender already indicated its state as `MESSAGE_RECEIVER_STATE_OPEN`, the `on_amqp_management_open_complete` callback shall be called with `AMQP_MANAGEMENT_OPEN_OK`, while also passing the context passed in `amqp_management_open_async`. ]*/
XinZhangMS 0:f7f1f0d76dd6 519 amqp_management_instance->amqp_management_state = AMQP_MANAGEMENT_STATE_OPEN;
XinZhangMS 0:f7f1f0d76dd6 520 amqp_management_instance->on_amqp_management_open_complete(amqp_management_instance->on_amqp_management_open_complete_context, AMQP_MANAGEMENT_OPEN_OK);
XinZhangMS 0:f7f1f0d76dd6 521 }
XinZhangMS 0:f7f1f0d76dd6 522 break;
XinZhangMS 0:f7f1f0d76dd6 523 }
XinZhangMS 0:f7f1f0d76dd6 524 break;
XinZhangMS 0:f7f1f0d76dd6 525 }
XinZhangMS 0:f7f1f0d76dd6 526 /* Codes_SRS_AMQP_MANAGEMENT_01_155: [ For the current state of AMQP management being `OPEN`: ]*/
XinZhangMS 0:f7f1f0d76dd6 527 case AMQP_MANAGEMENT_STATE_OPEN:
XinZhangMS 0:f7f1f0d76dd6 528 {
XinZhangMS 0:f7f1f0d76dd6 529 switch (new_state)
XinZhangMS 0:f7f1f0d76dd6 530 {
XinZhangMS 0:f7f1f0d76dd6 531 default:
XinZhangMS 0:f7f1f0d76dd6 532 /* Codes_SRS_AMQP_MANAGEMENT_01_156: [ - If `new_state` is `MESSAGE_RECEIVER_STATE_IDLE`, `MESSAGE_RECEIVER_STATE_OPENING`, `MESSAGE_RECEIVER_STATE_CLOSING` or `MESSAGE_RECEIVER_STATE_ERROR` the `on_amqp_management_error` callback shall be invoked while passing the `on_amqp_management_error_context` as argument. ]*/
XinZhangMS 0:f7f1f0d76dd6 533 case MESSAGE_RECEIVER_STATE_IDLE:
XinZhangMS 0:f7f1f0d76dd6 534 case MESSAGE_RECEIVER_STATE_CLOSING:
XinZhangMS 0:f7f1f0d76dd6 535 case MESSAGE_RECEIVER_STATE_ERROR:
XinZhangMS 0:f7f1f0d76dd6 536 amqp_management_instance->amqp_management_state = AMQP_MANAGEMENT_STATE_ERROR;
XinZhangMS 0:f7f1f0d76dd6 537 amqp_management_instance->on_amqp_management_error(amqp_management_instance->on_amqp_management_error_context);
XinZhangMS 0:f7f1f0d76dd6 538 break;
XinZhangMS 0:f7f1f0d76dd6 539
XinZhangMS 0:f7f1f0d76dd6 540 case MESSAGE_RECEIVER_STATE_OPEN:
XinZhangMS 0:f7f1f0d76dd6 541 /* Codes_SRS_AMQP_MANAGEMENT_01_157: [ - If `new_state` is `MESSAGE_RECEIVER_STATE_OPEN`, `on_message_receiver_state_changed` shall do nothing. ]*/
XinZhangMS 0:f7f1f0d76dd6 542 break;
XinZhangMS 0:f7f1f0d76dd6 543 }
XinZhangMS 0:f7f1f0d76dd6 544 break;
XinZhangMS 0:f7f1f0d76dd6 545 }
XinZhangMS 0:f7f1f0d76dd6 546 /* Codes_SRS_AMQP_MANAGEMENT_01_158: [ For the current state of AMQP management being `ERROR`: ]*/
XinZhangMS 0:f7f1f0d76dd6 547 case AMQP_MANAGEMENT_STATE_ERROR:
XinZhangMS 0:f7f1f0d76dd6 548 /* Codes_SRS_AMQP_MANAGEMENT_01_159: [ - All state transitions shall be ignored. ]*/
XinZhangMS 0:f7f1f0d76dd6 549 break;
XinZhangMS 0:f7f1f0d76dd6 550 }
XinZhangMS 0:f7f1f0d76dd6 551 }
XinZhangMS 0:f7f1f0d76dd6 552 }
XinZhangMS 0:f7f1f0d76dd6 553 }
XinZhangMS 0:f7f1f0d76dd6 554
XinZhangMS 0:f7f1f0d76dd6 555 static int set_message_id(MESSAGE_HANDLE message, uint64_t next_message_id)
XinZhangMS 0:f7f1f0d76dd6 556 {
XinZhangMS 0:f7f1f0d76dd6 557 int result;
XinZhangMS 0:f7f1f0d76dd6 558 PROPERTIES_HANDLE properties;
XinZhangMS 0:f7f1f0d76dd6 559
XinZhangMS 0:f7f1f0d76dd6 560 /* Codes_SRS_AMQP_MANAGEMENT_01_094: [ In order to set the message Id on the message, the properties shall be obtained by calling `message_get_properties`. ]*/
XinZhangMS 0:f7f1f0d76dd6 561 if (message_get_properties(message, &properties) != 0)
XinZhangMS 0:f7f1f0d76dd6 562 {
XinZhangMS 0:f7f1f0d76dd6 563 /* Codes_SRS_AMQP_MANAGEMENT_01_098: [ If any API fails while setting the message Id, `amqp_management_execute_operation_async` shall fail and return a non-zero value. ]*/
XinZhangMS 0:f7f1f0d76dd6 564 LogError("Could not retrieve message properties");
XinZhangMS 0:f7f1f0d76dd6 565 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 566 }
XinZhangMS 0:f7f1f0d76dd6 567 else
XinZhangMS 0:f7f1f0d76dd6 568 {
XinZhangMS 0:f7f1f0d76dd6 569 /* Codes_SRS_AMQP_MANAGEMENT_01_099: [ If the properties were not set on the message, a new properties instance shall be created by calling `properties_create`. ]*/
XinZhangMS 0:f7f1f0d76dd6 570 if (properties == NULL)
XinZhangMS 0:f7f1f0d76dd6 571 {
XinZhangMS 0:f7f1f0d76dd6 572 properties = properties_create();
XinZhangMS 0:f7f1f0d76dd6 573 }
XinZhangMS 0:f7f1f0d76dd6 574
XinZhangMS 0:f7f1f0d76dd6 575 if (properties == NULL)
XinZhangMS 0:f7f1f0d76dd6 576 {
XinZhangMS 0:f7f1f0d76dd6 577 /* Codes_SRS_AMQP_MANAGEMENT_01_098: [ If any API fails while setting the message Id, `amqp_management_execute_operation_async` shall fail and return a non-zero value. ]*/
XinZhangMS 0:f7f1f0d76dd6 578 LogError("Could not create message properties");
XinZhangMS 0:f7f1f0d76dd6 579 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 580 }
XinZhangMS 0:f7f1f0d76dd6 581 else
XinZhangMS 0:f7f1f0d76dd6 582 {
XinZhangMS 0:f7f1f0d76dd6 583 /* Codes_SRS_AMQP_MANAGEMENT_01_095: [ A message Id with the next ulong value to be used shall be created by calling `amqpvalue_create_message_id_ulong`. ]*/
XinZhangMS 0:f7f1f0d76dd6 584 AMQP_VALUE message_id = amqpvalue_create_message_id_ulong(next_message_id);
XinZhangMS 0:f7f1f0d76dd6 585 if (message_id == NULL)
XinZhangMS 0:f7f1f0d76dd6 586 {
XinZhangMS 0:f7f1f0d76dd6 587 /* Codes_SRS_AMQP_MANAGEMENT_01_098: [ If any API fails while setting the message Id, `amqp_management_execute_operation_async` shall fail and return a non-zero value. ]*/
XinZhangMS 0:f7f1f0d76dd6 588 LogError("Could not create message id value");
XinZhangMS 0:f7f1f0d76dd6 589 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 590 }
XinZhangMS 0:f7f1f0d76dd6 591 else
XinZhangMS 0:f7f1f0d76dd6 592 {
XinZhangMS 0:f7f1f0d76dd6 593 /* Codes_SRS_AMQP_MANAGEMENT_01_096: [ The message Id value shall be set on the properties by calling `properties_set_message_id`. ]*/
XinZhangMS 0:f7f1f0d76dd6 594 if (properties_set_message_id(properties, message_id) != 0)
XinZhangMS 0:f7f1f0d76dd6 595 {
XinZhangMS 0:f7f1f0d76dd6 596 /* Codes_SRS_AMQP_MANAGEMENT_01_098: [ If any API fails while setting the message Id, `amqp_management_execute_operation_async` shall fail and return a non-zero value. ]*/
XinZhangMS 0:f7f1f0d76dd6 597 LogError("Could not set message Id on the properties");
XinZhangMS 0:f7f1f0d76dd6 598 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 599 }
XinZhangMS 0:f7f1f0d76dd6 600 /* Codes_SRS_AMQP_MANAGEMENT_01_097: [ The properties thus modified to contain the message Id shall be set on the message by calling `message_set_properties`. ]*/
XinZhangMS 0:f7f1f0d76dd6 601 else if (message_set_properties(message, properties) != 0)
XinZhangMS 0:f7f1f0d76dd6 602 {
XinZhangMS 0:f7f1f0d76dd6 603 /* Codes_SRS_AMQP_MANAGEMENT_01_098: [ If any API fails while setting the message Id, `amqp_management_execute_operation_async` shall fail and return a non-zero value. ]*/
XinZhangMS 0:f7f1f0d76dd6 604 LogError("Could not set message properties");
XinZhangMS 0:f7f1f0d76dd6 605 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 606 }
XinZhangMS 0:f7f1f0d76dd6 607 else
XinZhangMS 0:f7f1f0d76dd6 608 {
XinZhangMS 0:f7f1f0d76dd6 609 result = 0;
XinZhangMS 0:f7f1f0d76dd6 610 }
XinZhangMS 0:f7f1f0d76dd6 611
XinZhangMS 0:f7f1f0d76dd6 612 amqpvalue_destroy(message_id);
XinZhangMS 0:f7f1f0d76dd6 613 }
XinZhangMS 0:f7f1f0d76dd6 614
XinZhangMS 0:f7f1f0d76dd6 615 /* Codes_SRS_AMQP_MANAGEMENT_01_100: [ After setting the properties, the properties instance shall be freed by `properties_destroy`. ]*/
XinZhangMS 0:f7f1f0d76dd6 616 properties_destroy(properties);
XinZhangMS 0:f7f1f0d76dd6 617 }
XinZhangMS 0:f7f1f0d76dd6 618 }
XinZhangMS 0:f7f1f0d76dd6 619
XinZhangMS 0:f7f1f0d76dd6 620 return result;
XinZhangMS 0:f7f1f0d76dd6 621 }
XinZhangMS 0:f7f1f0d76dd6 622
XinZhangMS 0:f7f1f0d76dd6 623 static int add_string_key_value_pair_to_map(AMQP_VALUE map, const char* key, const char* value)
XinZhangMS 0:f7f1f0d76dd6 624 {
XinZhangMS 0:f7f1f0d76dd6 625 int result;
XinZhangMS 0:f7f1f0d76dd6 626
XinZhangMS 0:f7f1f0d76dd6 627 /* Codes_SRS_AMQP_MANAGEMENT_01_084: [ For each of the arguments `operation`, `type` and `locales` an AMQP value of type string shall be created by calling `amqpvalue_create_string` in order to be used as key in the application properties map. ]*/
XinZhangMS 0:f7f1f0d76dd6 628 AMQP_VALUE key_value = amqpvalue_create_string(key);
XinZhangMS 0:f7f1f0d76dd6 629 if (key_value == NULL)
XinZhangMS 0:f7f1f0d76dd6 630 {
XinZhangMS 0:f7f1f0d76dd6 631 /* Codes_SRS_AMQP_MANAGEMENT_01_090: [ If any APIs used to create and set the application properties on the message fails, `amqp_management_execute_operation_async` shall fail and return a non-zero value. ]*/
XinZhangMS 0:f7f1f0d76dd6 632 LogError("Could not create key value for %s", key);
XinZhangMS 0:f7f1f0d76dd6 633 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 634 }
XinZhangMS 0:f7f1f0d76dd6 635 else
XinZhangMS 0:f7f1f0d76dd6 636 {
XinZhangMS 0:f7f1f0d76dd6 637 /* Codes_SRS_AMQP_MANAGEMENT_01_085: [ For each of the arguments `operation`, `type` and `locales` an AMQP value of type string containing the argument value shall be created by calling `amqpvalue_create_string` in order to be used as value in the application properties map. ]*/
XinZhangMS 0:f7f1f0d76dd6 638 AMQP_VALUE value_value = amqpvalue_create_string(value);
XinZhangMS 0:f7f1f0d76dd6 639 if (value_value == NULL)
XinZhangMS 0:f7f1f0d76dd6 640 {
XinZhangMS 0:f7f1f0d76dd6 641 /* Codes_SRS_AMQP_MANAGEMENT_01_090: [ If any APIs used to create and set the application properties on the message fails, `amqp_management_execute_operation_async` shall fail and return a non-zero value. ]*/
XinZhangMS 0:f7f1f0d76dd6 642 LogError("Could not create value for key %s", key);
XinZhangMS 0:f7f1f0d76dd6 643 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 644 }
XinZhangMS 0:f7f1f0d76dd6 645 else
XinZhangMS 0:f7f1f0d76dd6 646 {
XinZhangMS 0:f7f1f0d76dd6 647 /* Codes_SRS_AMQP_MANAGEMENT_01_086: [ The key/value pairs for `operation`, `type` and `locales` shall be added to the application properties map by calling `amqpvalue_set_map_value`. ]*/
XinZhangMS 0:f7f1f0d76dd6 648 if (amqpvalue_set_map_value(map, key_value, value_value) != 0)
XinZhangMS 0:f7f1f0d76dd6 649 {
XinZhangMS 0:f7f1f0d76dd6 650 /* Codes_SRS_AMQP_MANAGEMENT_01_090: [ If any APIs used to create and set the application properties on the message fails, `amqp_management_execute_operation_async` shall fail and return a non-zero value. ]*/
XinZhangMS 0:f7f1f0d76dd6 651 LogError("Could not set the value in the map for key %s", key);
XinZhangMS 0:f7f1f0d76dd6 652 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 653 }
XinZhangMS 0:f7f1f0d76dd6 654 else
XinZhangMS 0:f7f1f0d76dd6 655 {
XinZhangMS 0:f7f1f0d76dd6 656 result = 0;
XinZhangMS 0:f7f1f0d76dd6 657 }
XinZhangMS 0:f7f1f0d76dd6 658
XinZhangMS 0:f7f1f0d76dd6 659 amqpvalue_destroy(value_value);
XinZhangMS 0:f7f1f0d76dd6 660 }
XinZhangMS 0:f7f1f0d76dd6 661
XinZhangMS 0:f7f1f0d76dd6 662 amqpvalue_destroy(key_value);
XinZhangMS 0:f7f1f0d76dd6 663 }
XinZhangMS 0:f7f1f0d76dd6 664
XinZhangMS 0:f7f1f0d76dd6 665 return result;
XinZhangMS 0:f7f1f0d76dd6 666 }
XinZhangMS 0:f7f1f0d76dd6 667
XinZhangMS 0:f7f1f0d76dd6 668 static int internal_set_status_code_key_name(AMQP_MANAGEMENT_HANDLE amqp_management, const char* status_code_key_name)
XinZhangMS 0:f7f1f0d76dd6 669 {
XinZhangMS 0:f7f1f0d76dd6 670 int result;
XinZhangMS 0:f7f1f0d76dd6 671 char* copied_status_code_key_name;
XinZhangMS 0:f7f1f0d76dd6 672 if (mallocAndStrcpy_s(&copied_status_code_key_name, status_code_key_name) != 0)
XinZhangMS 0:f7f1f0d76dd6 673 {
XinZhangMS 0:f7f1f0d76dd6 674 LogError("Cannot copy status code key name");
XinZhangMS 0:f7f1f0d76dd6 675 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 676 }
XinZhangMS 0:f7f1f0d76dd6 677 else
XinZhangMS 0:f7f1f0d76dd6 678 {
XinZhangMS 0:f7f1f0d76dd6 679 if (amqp_management->status_code_key_name != NULL)
XinZhangMS 0:f7f1f0d76dd6 680 {
XinZhangMS 0:f7f1f0d76dd6 681 free(amqp_management->status_code_key_name);
XinZhangMS 0:f7f1f0d76dd6 682 }
XinZhangMS 0:f7f1f0d76dd6 683
XinZhangMS 0:f7f1f0d76dd6 684 amqp_management->status_code_key_name = copied_status_code_key_name;
XinZhangMS 0:f7f1f0d76dd6 685 result = 0;
XinZhangMS 0:f7f1f0d76dd6 686 }
XinZhangMS 0:f7f1f0d76dd6 687
XinZhangMS 0:f7f1f0d76dd6 688 return result;
XinZhangMS 0:f7f1f0d76dd6 689 }
XinZhangMS 0:f7f1f0d76dd6 690
XinZhangMS 0:f7f1f0d76dd6 691 static int internal_set_status_description_key_name(AMQP_MANAGEMENT_HANDLE amqp_management, const char* status_description_key_name)
XinZhangMS 0:f7f1f0d76dd6 692 {
XinZhangMS 0:f7f1f0d76dd6 693 int result;
XinZhangMS 0:f7f1f0d76dd6 694 char* copied_status_description_key_name;
XinZhangMS 0:f7f1f0d76dd6 695 if (mallocAndStrcpy_s(&copied_status_description_key_name, status_description_key_name) != 0)
XinZhangMS 0:f7f1f0d76dd6 696 {
XinZhangMS 0:f7f1f0d76dd6 697 LogError("Cannot copy status description key name");
XinZhangMS 0:f7f1f0d76dd6 698 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 699 }
XinZhangMS 0:f7f1f0d76dd6 700 else
XinZhangMS 0:f7f1f0d76dd6 701 {
XinZhangMS 0:f7f1f0d76dd6 702 if (amqp_management->status_description_key_name != NULL)
XinZhangMS 0:f7f1f0d76dd6 703 {
XinZhangMS 0:f7f1f0d76dd6 704 free(amqp_management->status_description_key_name);
XinZhangMS 0:f7f1f0d76dd6 705 }
XinZhangMS 0:f7f1f0d76dd6 706
XinZhangMS 0:f7f1f0d76dd6 707 amqp_management->status_description_key_name = copied_status_description_key_name;
XinZhangMS 0:f7f1f0d76dd6 708 result = 0;
XinZhangMS 0:f7f1f0d76dd6 709 }
XinZhangMS 0:f7f1f0d76dd6 710
XinZhangMS 0:f7f1f0d76dd6 711 return result;
XinZhangMS 0:f7f1f0d76dd6 712 }
XinZhangMS 0:f7f1f0d76dd6 713
XinZhangMS 0:f7f1f0d76dd6 714 AMQP_MANAGEMENT_HANDLE amqp_management_create(SESSION_HANDLE session, const char* management_node)
XinZhangMS 0:f7f1f0d76dd6 715 {
XinZhangMS 0:f7f1f0d76dd6 716 AMQP_MANAGEMENT_INSTANCE* amqp_management;
XinZhangMS 0:f7f1f0d76dd6 717
XinZhangMS 0:f7f1f0d76dd6 718 if ((session == NULL) ||
XinZhangMS 0:f7f1f0d76dd6 719 (management_node == NULL))
XinZhangMS 0:f7f1f0d76dd6 720 {
XinZhangMS 0:f7f1f0d76dd6 721 /* Codes_SRS_AMQP_MANAGEMENT_01_002: [ If `session` or `management_node` is NULL then `amqp_management_create` shall fail and return NULL. ]*/
XinZhangMS 0:f7f1f0d76dd6 722 LogError("Bad arguments: session = %p, management_node = %p", session, management_node);
XinZhangMS 0:f7f1f0d76dd6 723 amqp_management = NULL;
XinZhangMS 0:f7f1f0d76dd6 724 }
XinZhangMS 0:f7f1f0d76dd6 725 else if (strlen(management_node) == 0)
XinZhangMS 0:f7f1f0d76dd6 726 {
XinZhangMS 0:f7f1f0d76dd6 727 /* Codes_SRS_AMQP_MANAGEMENT_01_030: [ If `management_node` is an empty string, then `amqp_management_create` shall fail and return NULL. ]*/
XinZhangMS 0:f7f1f0d76dd6 728 LogError("Empty string management node");
XinZhangMS 0:f7f1f0d76dd6 729 amqp_management = NULL;
XinZhangMS 0:f7f1f0d76dd6 730 }
XinZhangMS 0:f7f1f0d76dd6 731 else
XinZhangMS 0:f7f1f0d76dd6 732 {
XinZhangMS 0:f7f1f0d76dd6 733 /* Codes_SRS_AMQP_MANAGEMENT_01_001: [ `amqp_management_create` shall create a new CBS instance and on success return a non-NULL handle to it. ]*/
XinZhangMS 0:f7f1f0d76dd6 734 amqp_management = (AMQP_MANAGEMENT_INSTANCE*)malloc(sizeof(AMQP_MANAGEMENT_INSTANCE));
XinZhangMS 0:f7f1f0d76dd6 735 if (amqp_management == NULL)
XinZhangMS 0:f7f1f0d76dd6 736 {
XinZhangMS 0:f7f1f0d76dd6 737 /* Codes_SRS_AMQP_MANAGEMENT_01_005: [ If allocating memory for the new handle fails, `amqp_management_create` shall fail and return NULL. ]*/
XinZhangMS 0:f7f1f0d76dd6 738 LogError("Cannot allocate memory for AMQP management handle");
XinZhangMS 0:f7f1f0d76dd6 739 }
XinZhangMS 0:f7f1f0d76dd6 740 else
XinZhangMS 0:f7f1f0d76dd6 741 {
XinZhangMS 0:f7f1f0d76dd6 742 amqp_management->sender_connected = 0;
XinZhangMS 0:f7f1f0d76dd6 743 amqp_management->receiver_connected = 0;
XinZhangMS 0:f7f1f0d76dd6 744 amqp_management->on_amqp_management_open_complete = NULL;
XinZhangMS 0:f7f1f0d76dd6 745 amqp_management->on_amqp_management_open_complete_context = NULL;
XinZhangMS 0:f7f1f0d76dd6 746 amqp_management->on_amqp_management_error = NULL;
XinZhangMS 0:f7f1f0d76dd6 747 amqp_management->on_amqp_management_error_context = NULL;
XinZhangMS 0:f7f1f0d76dd6 748 amqp_management->amqp_management_state = AMQP_MANAGEMENT_STATE_IDLE;
XinZhangMS 0:f7f1f0d76dd6 749 amqp_management->status_code_key_name = NULL;
XinZhangMS 0:f7f1f0d76dd6 750 amqp_management->status_description_key_name = NULL;
XinZhangMS 0:f7f1f0d76dd6 751
XinZhangMS 0:f7f1f0d76dd6 752 /* Codes_SRS_AMQP_MANAGEMENT_01_003: [ `amqp_management_create` shall create a singly linked list for pending operations by calling `singlylinkedlist_create`. ]*/
XinZhangMS 0:f7f1f0d76dd6 753 amqp_management->pending_operations = singlylinkedlist_create();
XinZhangMS 0:f7f1f0d76dd6 754 if (amqp_management->pending_operations == NULL)
XinZhangMS 0:f7f1f0d76dd6 755 {
XinZhangMS 0:f7f1f0d76dd6 756 /* Codes_SRS_AMQP_MANAGEMENT_01_004: [ If `singlylinkedlist_create` fails, `amqp_management_create` shall fail and return NULL. ]*/
XinZhangMS 0:f7f1f0d76dd6 757 LogError("Cannot create pending operations list");
XinZhangMS 0:f7f1f0d76dd6 758 }
XinZhangMS 0:f7f1f0d76dd6 759 else
XinZhangMS 0:f7f1f0d76dd6 760 {
XinZhangMS 0:f7f1f0d76dd6 761 /* Codes_SRS_AMQP_MANAGEMENT_01_181: [ `amqp_management_create` shall set the status code key name to be used for parsing the status code to `statusCode`. ]*/
XinZhangMS 0:f7f1f0d76dd6 762 if (internal_set_status_code_key_name(amqp_management, "statusCode") != 0)
XinZhangMS 0:f7f1f0d76dd6 763 {
XinZhangMS 0:f7f1f0d76dd6 764 LogError("Cannot set status code key name");
XinZhangMS 0:f7f1f0d76dd6 765 }
XinZhangMS 0:f7f1f0d76dd6 766 else
XinZhangMS 0:f7f1f0d76dd6 767 {
XinZhangMS 0:f7f1f0d76dd6 768 /* Codes_SRS_AMQP_MANAGEMENT_01_182: [ `amqp_management_create` shall set the status description key name to be used for parsing the status description to `statusDescription`. ]*/
XinZhangMS 0:f7f1f0d76dd6 769 if (internal_set_status_description_key_name(amqp_management, "statusDescription") != 0)
XinZhangMS 0:f7f1f0d76dd6 770 {
XinZhangMS 0:f7f1f0d76dd6 771 LogError("Cannot set status description key name");
XinZhangMS 0:f7f1f0d76dd6 772 }
XinZhangMS 0:f7f1f0d76dd6 773 else
XinZhangMS 0:f7f1f0d76dd6 774 {
XinZhangMS 0:f7f1f0d76dd6 775 /* Codes_SRS_AMQP_MANAGEMENT_01_010: [ The `source` argument shall be a value created by calling `messaging_create_source` with `management_node` as argument. ]*/
XinZhangMS 0:f7f1f0d76dd6 776 AMQP_VALUE source = messaging_create_source(management_node);
XinZhangMS 0:f7f1f0d76dd6 777 if (source == NULL)
XinZhangMS 0:f7f1f0d76dd6 778 {
XinZhangMS 0:f7f1f0d76dd6 779 /* Codes_SRS_AMQP_MANAGEMENT_01_012: [ If `messaging_create_source` fails then `amqp_management_create` shall fail and return NULL. ]*/
XinZhangMS 0:f7f1f0d76dd6 780 LogError("Failed creating source AMQP value");
XinZhangMS 0:f7f1f0d76dd6 781 }
XinZhangMS 0:f7f1f0d76dd6 782 else
XinZhangMS 0:f7f1f0d76dd6 783 {
XinZhangMS 0:f7f1f0d76dd6 784 /* Codes_SRS_AMQP_MANAGEMENT_01_011: [ The `target` argument shall be a value created by calling `messaging_create_target` with `management_node` as argument. ]*/
XinZhangMS 0:f7f1f0d76dd6 785 AMQP_VALUE target = messaging_create_target(management_node);
XinZhangMS 0:f7f1f0d76dd6 786 if (target == NULL)
XinZhangMS 0:f7f1f0d76dd6 787 {
XinZhangMS 0:f7f1f0d76dd6 788 /* Codes_SRS_AMQP_MANAGEMENT_01_013: [ If `messaging_create_target` fails then `amqp_management_create` shall fail and return NULL. ]*/
XinZhangMS 0:f7f1f0d76dd6 789 LogError("Failed creating target AMQP value");
XinZhangMS 0:f7f1f0d76dd6 790 }
XinZhangMS 0:f7f1f0d76dd6 791 else
XinZhangMS 0:f7f1f0d76dd6 792 {
XinZhangMS 0:f7f1f0d76dd6 793 size_t management_node_length = strlen(management_node);
XinZhangMS 0:f7f1f0d76dd6 794
XinZhangMS 0:f7f1f0d76dd6 795 char* sender_link_name = (char*)malloc(management_node_length + COUNT_CHARS(sender_suffix) + 1);
XinZhangMS 0:f7f1f0d76dd6 796 if (sender_link_name == NULL)
XinZhangMS 0:f7f1f0d76dd6 797 {
XinZhangMS 0:f7f1f0d76dd6 798 /* Codes_SRS_AMQP_MANAGEMENT_01_033: [ If any other error occurs `amqp_management_create` shall fail and return NULL. ]*/
XinZhangMS 0:f7f1f0d76dd6 799 LogError("Failed allocating memory for sender link name");
XinZhangMS 0:f7f1f0d76dd6 800 }
XinZhangMS 0:f7f1f0d76dd6 801 else
XinZhangMS 0:f7f1f0d76dd6 802 {
XinZhangMS 0:f7f1f0d76dd6 803 char* receiver_link_name;
XinZhangMS 0:f7f1f0d76dd6 804
XinZhangMS 0:f7f1f0d76dd6 805 (void)memcpy(sender_link_name, management_node, management_node_length);
XinZhangMS 0:f7f1f0d76dd6 806 (void)memcpy(sender_link_name + management_node_length, sender_suffix, COUNT_CHARS(sender_suffix) + 1);
XinZhangMS 0:f7f1f0d76dd6 807
XinZhangMS 0:f7f1f0d76dd6 808 receiver_link_name = (char*)malloc(management_node_length + COUNT_CHARS(receiver_suffix) + 1);
XinZhangMS 0:f7f1f0d76dd6 809 if (receiver_link_name == NULL)
XinZhangMS 0:f7f1f0d76dd6 810 {
XinZhangMS 0:f7f1f0d76dd6 811 /* Codes_SRS_AMQP_MANAGEMENT_01_033: [ If any other error occurs `amqp_management_create` shall fail and return NULL. ]*/
XinZhangMS 0:f7f1f0d76dd6 812 LogError("Failed allocating memory for receiver link name");
XinZhangMS 0:f7f1f0d76dd6 813 }
XinZhangMS 0:f7f1f0d76dd6 814 else
XinZhangMS 0:f7f1f0d76dd6 815 {
XinZhangMS 0:f7f1f0d76dd6 816 (void)memcpy(receiver_link_name, management_node, management_node_length);
XinZhangMS 0:f7f1f0d76dd6 817 (void)memcpy(receiver_link_name + management_node_length, receiver_suffix, COUNT_CHARS(receiver_suffix) + 1);
XinZhangMS 0:f7f1f0d76dd6 818
XinZhangMS 0:f7f1f0d76dd6 819 /* Codes_SRS_AMQP_MANAGEMENT_01_006: [ `amqp_management_create` shall create a sender link by calling `link_create`. ]*/
XinZhangMS 0:f7f1f0d76dd6 820 /* Codes_SRS_AMQP_MANAGEMENT_01_007: [ The `session` argument shall be set to `session`. ]*/
XinZhangMS 0:f7f1f0d76dd6 821 /* Codes_SRS_AMQP_MANAGEMENT_01_008: [ The `name` argument shall be constructed by concatenating the `management_node` value with `-sender`. ]*/
XinZhangMS 0:f7f1f0d76dd6 822 /* Codes_SRS_AMQP_MANAGEMENT_01_009: [ The `role` argument shall be `role_sender`. ]*/
XinZhangMS 0:f7f1f0d76dd6 823 /* Codes_SRS_AMQP_MANAGEMENT_01_019: [ The `source` argument shall be the value created by calling `messaging_create_source`. ]*/
XinZhangMS 0:f7f1f0d76dd6 824 /* Codes_SRS_AMQP_MANAGEMENT_01_020: [ The `target` argument shall be the value created by calling `messaging_create_target`. ]*/
XinZhangMS 0:f7f1f0d76dd6 825 amqp_management->sender_link = link_create(session, sender_link_name, role_sender, source, target);
XinZhangMS 0:f7f1f0d76dd6 826 if (amqp_management->sender_link == NULL)
XinZhangMS 0:f7f1f0d76dd6 827 {
XinZhangMS 0:f7f1f0d76dd6 828 /* Codes_SRS_AMQP_MANAGEMENT_01_014: [ If `link_create` fails when creating the sender link then `amqp_management_create` shall fail and return NULL. ]*/
XinZhangMS 0:f7f1f0d76dd6 829 LogError("Failed creating sender link");
XinZhangMS 0:f7f1f0d76dd6 830 }
XinZhangMS 0:f7f1f0d76dd6 831 else
XinZhangMS 0:f7f1f0d76dd6 832 {
XinZhangMS 0:f7f1f0d76dd6 833 /* Codes_SRS_AMQP_MANAGEMENT_01_015: [ `amqp_management_create` shall create a receiver link by calling `link_create`. ]*/
XinZhangMS 0:f7f1f0d76dd6 834 /* Codes_SRS_AMQP_MANAGEMENT_01_016: [ The `session` argument shall be set to `session`. ]*/
XinZhangMS 0:f7f1f0d76dd6 835 /* Codes_SRS_AMQP_MANAGEMENT_01_017: [ The `name` argument shall be constructed by concatenating the `management_node` value with `-receiver`. ]*/
XinZhangMS 0:f7f1f0d76dd6 836 /* Codes_SRS_AMQP_MANAGEMENT_01_018: [ The `role` argument shall be `role_receiver`. ]*/
XinZhangMS 0:f7f1f0d76dd6 837 /* Codes_SRS_AMQP_MANAGEMENT_01_019: [ The `source` argument shall be the value created by calling `messaging_create_source`. ]*/
XinZhangMS 0:f7f1f0d76dd6 838 /* Codes_SRS_AMQP_MANAGEMENT_01_020: [ The `target` argument shall be the value created by calling `messaging_create_target`. ]*/
XinZhangMS 0:f7f1f0d76dd6 839 amqp_management->receiver_link = link_create(session, receiver_link_name, role_receiver, source, target);
XinZhangMS 0:f7f1f0d76dd6 840 if (amqp_management->receiver_link == NULL)
XinZhangMS 0:f7f1f0d76dd6 841 {
XinZhangMS 0:f7f1f0d76dd6 842 /* Codes_SRS_AMQP_MANAGEMENT_01_021: [ If `link_create` fails when creating the receiver link then `amqp_management_create` shall fail and return NULL. ]*/
XinZhangMS 0:f7f1f0d76dd6 843 LogError("Failed creating receiver link");
XinZhangMS 0:f7f1f0d76dd6 844 }
XinZhangMS 0:f7f1f0d76dd6 845 else
XinZhangMS 0:f7f1f0d76dd6 846 {
XinZhangMS 0:f7f1f0d76dd6 847 /* Codes_SRS_AMQP_MANAGEMENT_01_022: [ `amqp_management_create` shall create a message sender by calling `messagesender_create` and passing to it the sender link handle. ]*/
XinZhangMS 0:f7f1f0d76dd6 848 amqp_management->message_sender = messagesender_create(amqp_management->sender_link, on_message_sender_state_changed, amqp_management);
XinZhangMS 0:f7f1f0d76dd6 849 if (amqp_management->message_sender == NULL)
XinZhangMS 0:f7f1f0d76dd6 850 {
XinZhangMS 0:f7f1f0d76dd6 851 /* Codes_SRS_AMQP_MANAGEMENT_01_031: [ If `messagesender_create` fails then `amqp_management_create` shall fail and return NULL. ]*/
XinZhangMS 0:f7f1f0d76dd6 852 LogError("Failed creating message sender");
XinZhangMS 0:f7f1f0d76dd6 853 }
XinZhangMS 0:f7f1f0d76dd6 854 else
XinZhangMS 0:f7f1f0d76dd6 855 {
XinZhangMS 0:f7f1f0d76dd6 856 /* Codes_SRS_AMQP_MANAGEMENT_01_023: [ `amqp_management_create` shall create a message receiver by calling `messagereceiver_create` and passing to it the receiver link handle. ]*/
XinZhangMS 0:f7f1f0d76dd6 857 amqp_management->message_receiver = messagereceiver_create(amqp_management->receiver_link, on_message_receiver_state_changed, amqp_management);
XinZhangMS 0:f7f1f0d76dd6 858 if (amqp_management->message_receiver == NULL)
XinZhangMS 0:f7f1f0d76dd6 859 {
XinZhangMS 0:f7f1f0d76dd6 860 /* Codes_SRS_AMQP_MANAGEMENT_01_032: [ If `messagereceiver_create` fails then `amqp_management_create` shall fail and return NULL. ]*/
XinZhangMS 0:f7f1f0d76dd6 861 LogError("Failed creating message receiver");
XinZhangMS 0:f7f1f0d76dd6 862 link_destroy(amqp_management->receiver_link);
XinZhangMS 0:f7f1f0d76dd6 863 }
XinZhangMS 0:f7f1f0d76dd6 864 else
XinZhangMS 0:f7f1f0d76dd6 865 {
XinZhangMS 0:f7f1f0d76dd6 866 free(receiver_link_name);
XinZhangMS 0:f7f1f0d76dd6 867 free(sender_link_name);
XinZhangMS 0:f7f1f0d76dd6 868 amqpvalue_destroy(target);
XinZhangMS 0:f7f1f0d76dd6 869 amqpvalue_destroy(source);
XinZhangMS 0:f7f1f0d76dd6 870
XinZhangMS 0:f7f1f0d76dd6 871 /* Codes_SRS_AMQP_MANAGEMENT_01_106: [ The message Id set on the message properties shall start at 0. ]*/
XinZhangMS 0:f7f1f0d76dd6 872 amqp_management->next_message_id = 0;
XinZhangMS 0:f7f1f0d76dd6 873
XinZhangMS 0:f7f1f0d76dd6 874 goto all_ok;
XinZhangMS 0:f7f1f0d76dd6 875 }
XinZhangMS 0:f7f1f0d76dd6 876
XinZhangMS 0:f7f1f0d76dd6 877 messagesender_destroy(amqp_management->message_sender);
XinZhangMS 0:f7f1f0d76dd6 878 }
XinZhangMS 0:f7f1f0d76dd6 879
XinZhangMS 0:f7f1f0d76dd6 880 link_destroy(amqp_management->receiver_link);
XinZhangMS 0:f7f1f0d76dd6 881 }
XinZhangMS 0:f7f1f0d76dd6 882
XinZhangMS 0:f7f1f0d76dd6 883 link_destroy(amqp_management->sender_link);
XinZhangMS 0:f7f1f0d76dd6 884 }
XinZhangMS 0:f7f1f0d76dd6 885
XinZhangMS 0:f7f1f0d76dd6 886 free(receiver_link_name);
XinZhangMS 0:f7f1f0d76dd6 887 }
XinZhangMS 0:f7f1f0d76dd6 888
XinZhangMS 0:f7f1f0d76dd6 889 free(sender_link_name);
XinZhangMS 0:f7f1f0d76dd6 890 }
XinZhangMS 0:f7f1f0d76dd6 891
XinZhangMS 0:f7f1f0d76dd6 892 amqpvalue_destroy(target);
XinZhangMS 0:f7f1f0d76dd6 893 }
XinZhangMS 0:f7f1f0d76dd6 894
XinZhangMS 0:f7f1f0d76dd6 895 amqpvalue_destroy(source);
XinZhangMS 0:f7f1f0d76dd6 896 }
XinZhangMS 0:f7f1f0d76dd6 897
XinZhangMS 0:f7f1f0d76dd6 898 free(amqp_management->status_description_key_name);
XinZhangMS 0:f7f1f0d76dd6 899 }
XinZhangMS 0:f7f1f0d76dd6 900
XinZhangMS 0:f7f1f0d76dd6 901 free(amqp_management->status_code_key_name);
XinZhangMS 0:f7f1f0d76dd6 902 }
XinZhangMS 0:f7f1f0d76dd6 903
XinZhangMS 0:f7f1f0d76dd6 904 singlylinkedlist_destroy(amqp_management->pending_operations);
XinZhangMS 0:f7f1f0d76dd6 905 }
XinZhangMS 0:f7f1f0d76dd6 906
XinZhangMS 0:f7f1f0d76dd6 907 free(amqp_management);
XinZhangMS 0:f7f1f0d76dd6 908 amqp_management = NULL;
XinZhangMS 0:f7f1f0d76dd6 909 }
XinZhangMS 0:f7f1f0d76dd6 910 }
XinZhangMS 0:f7f1f0d76dd6 911
XinZhangMS 0:f7f1f0d76dd6 912 all_ok:
XinZhangMS 0:f7f1f0d76dd6 913 return amqp_management;
XinZhangMS 0:f7f1f0d76dd6 914 }
XinZhangMS 0:f7f1f0d76dd6 915
XinZhangMS 0:f7f1f0d76dd6 916 void amqp_management_destroy(AMQP_MANAGEMENT_HANDLE amqp_management)
XinZhangMS 0:f7f1f0d76dd6 917 {
XinZhangMS 0:f7f1f0d76dd6 918 if (amqp_management == NULL)
XinZhangMS 0:f7f1f0d76dd6 919 {
XinZhangMS 0:f7f1f0d76dd6 920 /* Codes_SRS_AMQP_MANAGEMENT_01_025: [ If `amqp_management` is NULL, `amqp_management_destroy` shall do nothing. ]*/
XinZhangMS 0:f7f1f0d76dd6 921 LogError("NULL amqp_management");
XinZhangMS 0:f7f1f0d76dd6 922 }
XinZhangMS 0:f7f1f0d76dd6 923 else
XinZhangMS 0:f7f1f0d76dd6 924 {
XinZhangMS 0:f7f1f0d76dd6 925 /* Codes_SRS_AMQP_MANAGEMENT_01_024: [ `amqp_management_destroy` shall free all the resources allocated by `amqp_management_create`. ]*/
XinZhangMS 0:f7f1f0d76dd6 926 if (amqp_management->amqp_management_state != AMQP_MANAGEMENT_STATE_IDLE)
XinZhangMS 0:f7f1f0d76dd6 927 {
XinZhangMS 0:f7f1f0d76dd6 928 (void)amqp_management_close(amqp_management);
XinZhangMS 0:f7f1f0d76dd6 929 }
XinZhangMS 0:f7f1f0d76dd6 930
XinZhangMS 0:f7f1f0d76dd6 931 /* Codes_SRS_AMQP_MANAGEMENT_01_028: [ `amqp_management_destroy` shall free the message sender by calling `messagesender_destroy`. ]*/
XinZhangMS 0:f7f1f0d76dd6 932 messagesender_destroy(amqp_management->message_sender);
XinZhangMS 0:f7f1f0d76dd6 933 /* Codes_SRS_AMQP_MANAGEMENT_01_029: [ `amqp_management_destroy` shall free the message receiver by calling `messagereceiver_destroy`. ]*/
XinZhangMS 0:f7f1f0d76dd6 934 messagereceiver_destroy(amqp_management->message_receiver);
XinZhangMS 0:f7f1f0d76dd6 935 /* Codes_SRS_AMQP_MANAGEMENT_01_027: [ `amqp_management_destroy` shall free the sender and receiver links by calling `link_destroy`. ]*/
XinZhangMS 0:f7f1f0d76dd6 936 link_destroy(amqp_management->sender_link);
XinZhangMS 0:f7f1f0d76dd6 937 link_destroy(amqp_management->receiver_link);
XinZhangMS 0:f7f1f0d76dd6 938 free(amqp_management->status_code_key_name);
XinZhangMS 0:f7f1f0d76dd6 939 free(amqp_management->status_description_key_name);
XinZhangMS 0:f7f1f0d76dd6 940 /* Codes_SRS_AMQP_MANAGEMENT_01_026: [ `amqp_management_destroy` shall free the singly linked list by calling `singlylinkedlist_destroy`. ]*/
XinZhangMS 0:f7f1f0d76dd6 941 singlylinkedlist_destroy(amqp_management->pending_operations);
XinZhangMS 0:f7f1f0d76dd6 942 free(amqp_management);
XinZhangMS 0:f7f1f0d76dd6 943 }
XinZhangMS 0:f7f1f0d76dd6 944 }
XinZhangMS 0:f7f1f0d76dd6 945
XinZhangMS 0:f7f1f0d76dd6 946 int amqp_management_open_async(AMQP_MANAGEMENT_HANDLE amqp_management, ON_AMQP_MANAGEMENT_OPEN_COMPLETE on_amqp_management_open_complete, void* on_amqp_management_open_complete_context, ON_AMQP_MANAGEMENT_ERROR on_amqp_management_error, void* on_amqp_management_error_context)
XinZhangMS 0:f7f1f0d76dd6 947 {
XinZhangMS 0:f7f1f0d76dd6 948 int result;
XinZhangMS 0:f7f1f0d76dd6 949
XinZhangMS 0:f7f1f0d76dd6 950 /* Codes_SRS_AMQP_MANAGEMENT_01_044: [ `on_amqp_management_open_complete_context` and `on_amqp_management_error_context` shall be allowed to be NULL. ]*/
XinZhangMS 0:f7f1f0d76dd6 951 if ((amqp_management == NULL) ||
XinZhangMS 0:f7f1f0d76dd6 952 (on_amqp_management_open_complete == NULL) ||
XinZhangMS 0:f7f1f0d76dd6 953 (on_amqp_management_error == NULL))
XinZhangMS 0:f7f1f0d76dd6 954 {
XinZhangMS 0:f7f1f0d76dd6 955 /* Codes_SRS_AMQP_MANAGEMENT_01_038: [ If `amqp_management`, `on_amqp_management_open_complete` or `on_amqp_management_error` is NULL, `amqp_management_open_async` shall fail and return a non-zero value. ]*/
XinZhangMS 0:f7f1f0d76dd6 956 LogError("Bad arguments: amqp_management = %p, on_amqp_management_open_complete = %p, on_amqp_management_error = %p",
XinZhangMS 0:f7f1f0d76dd6 957 amqp_management,
XinZhangMS 0:f7f1f0d76dd6 958 on_amqp_management_open_complete,
XinZhangMS 0:f7f1f0d76dd6 959 on_amqp_management_error);
XinZhangMS 0:f7f1f0d76dd6 960 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 961 }
XinZhangMS 0:f7f1f0d76dd6 962 else if (amqp_management->amqp_management_state != AMQP_MANAGEMENT_STATE_IDLE)
XinZhangMS 0:f7f1f0d76dd6 963 {
XinZhangMS 0:f7f1f0d76dd6 964 /* Codes_SRS_AMQP_MANAGEMENT_01_043: [ If the AMQP management instance is already OPEN or OPENING, `amqp_management_open_async` shall fail and return a non-zero value. ]*/
XinZhangMS 0:f7f1f0d76dd6 965 LogError("AMQP management instance already OPEN");
XinZhangMS 0:f7f1f0d76dd6 966 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 967 }
XinZhangMS 0:f7f1f0d76dd6 968 else
XinZhangMS 0:f7f1f0d76dd6 969 {
XinZhangMS 0:f7f1f0d76dd6 970 /* Codes_SRS_AMQP_MANAGEMENT_01_036: [ `amqp_management_open_async` shall start opening the AMQP management instance and save the callbacks so that they can be called when opening is complete. ]*/
XinZhangMS 0:f7f1f0d76dd6 971 amqp_management->on_amqp_management_open_complete = on_amqp_management_open_complete;
XinZhangMS 0:f7f1f0d76dd6 972 amqp_management->on_amqp_management_open_complete_context = on_amqp_management_open_complete_context;
XinZhangMS 0:f7f1f0d76dd6 973 amqp_management->on_amqp_management_error = on_amqp_management_error;
XinZhangMS 0:f7f1f0d76dd6 974 amqp_management->on_amqp_management_error_context = on_amqp_management_error_context;
XinZhangMS 0:f7f1f0d76dd6 975 amqp_management->amqp_management_state = AMQP_MANAGEMENT_STATE_OPENING;
XinZhangMS 0:f7f1f0d76dd6 976
XinZhangMS 0:f7f1f0d76dd6 977 /* Codes_SRS_AMQP_MANAGEMENT_01_040: [ `amqp_management_open_async` shall open the message receiver by calling `messagereceiver_open`. ]*/
XinZhangMS 0:f7f1f0d76dd6 978 if (messagereceiver_open(amqp_management->message_receiver, on_message_received, amqp_management) != 0)
XinZhangMS 0:f7f1f0d76dd6 979 {
XinZhangMS 0:f7f1f0d76dd6 980 /* Codes_SRS_AMQP_MANAGEMENT_01_042: [ If `messagereceiver_open` fails, `amqp_management_open_async` shall fail and return a non-zero value. ]*/
XinZhangMS 0:f7f1f0d76dd6 981 LogError("Failed opening message receiver");
XinZhangMS 0:f7f1f0d76dd6 982 amqp_management->amqp_management_state = AMQP_MANAGEMENT_STATE_IDLE;
XinZhangMS 0:f7f1f0d76dd6 983 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 984 }
XinZhangMS 0:f7f1f0d76dd6 985 else
XinZhangMS 0:f7f1f0d76dd6 986 {
XinZhangMS 0:f7f1f0d76dd6 987 /* Codes_SRS_AMQP_MANAGEMENT_01_039: [ `amqp_management_open_async` shall open the message sender by calling `messagesender_open`. ]*/
XinZhangMS 0:f7f1f0d76dd6 988 if (messagesender_open(amqp_management->message_sender) != 0)
XinZhangMS 0:f7f1f0d76dd6 989 {
XinZhangMS 0:f7f1f0d76dd6 990 /* Codes_SRS_AMQP_MANAGEMENT_01_041: [ If `messagesender_open` fails, `amqp_management_open_async` shall fail and return a non-zero value. ]*/
XinZhangMS 0:f7f1f0d76dd6 991 LogError("Failed opening message sender");
XinZhangMS 0:f7f1f0d76dd6 992 amqp_management->amqp_management_state = AMQP_MANAGEMENT_STATE_IDLE;
XinZhangMS 0:f7f1f0d76dd6 993 (void)messagereceiver_close(amqp_management->message_receiver);
XinZhangMS 0:f7f1f0d76dd6 994 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 995 }
XinZhangMS 0:f7f1f0d76dd6 996 else
XinZhangMS 0:f7f1f0d76dd6 997 {
XinZhangMS 0:f7f1f0d76dd6 998 /* Codes_SRS_AMQP_MANAGEMENT_01_037: [ On success it shall return 0. ]*/
XinZhangMS 0:f7f1f0d76dd6 999 result = 0;
XinZhangMS 0:f7f1f0d76dd6 1000 }
XinZhangMS 0:f7f1f0d76dd6 1001 }
XinZhangMS 0:f7f1f0d76dd6 1002 }
XinZhangMS 0:f7f1f0d76dd6 1003
XinZhangMS 0:f7f1f0d76dd6 1004 return result;
XinZhangMS 0:f7f1f0d76dd6 1005 }
XinZhangMS 0:f7f1f0d76dd6 1006
XinZhangMS 0:f7f1f0d76dd6 1007 int amqp_management_close(AMQP_MANAGEMENT_HANDLE amqp_management)
XinZhangMS 0:f7f1f0d76dd6 1008 {
XinZhangMS 0:f7f1f0d76dd6 1009 int result;
XinZhangMS 0:f7f1f0d76dd6 1010
XinZhangMS 0:f7f1f0d76dd6 1011 if (amqp_management == NULL)
XinZhangMS 0:f7f1f0d76dd6 1012 {
XinZhangMS 0:f7f1f0d76dd6 1013 /* Codes_SRS_AMQP_MANAGEMENT_01_047: [ If `amqp_management` is NULL, `amqp_management_close` shall fail and return a non-zero value. ]*/
XinZhangMS 0:f7f1f0d76dd6 1014 LogError("NULL amqp_management");
XinZhangMS 0:f7f1f0d76dd6 1015 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 1016 }
XinZhangMS 0:f7f1f0d76dd6 1017 else if (amqp_management->amqp_management_state == AMQP_MANAGEMENT_STATE_IDLE)
XinZhangMS 0:f7f1f0d76dd6 1018 {
XinZhangMS 0:f7f1f0d76dd6 1019 /* Codes_SRS_AMQP_MANAGEMENT_01_049: [ `amqp_management_close` on an AMQP management instance that is not OPEN, shall fail and return a non-zero value. ]*/
XinZhangMS 0:f7f1f0d76dd6 1020 LogError("AMQP management instance not open");
XinZhangMS 0:f7f1f0d76dd6 1021 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 1022 }
XinZhangMS 0:f7f1f0d76dd6 1023 else
XinZhangMS 0:f7f1f0d76dd6 1024 {
XinZhangMS 0:f7f1f0d76dd6 1025 AMQP_MANAGEMENT_STATE previous_state = amqp_management->amqp_management_state;
XinZhangMS 0:f7f1f0d76dd6 1026
XinZhangMS 0:f7f1f0d76dd6 1027 amqp_management->amqp_management_state = AMQP_MANAGEMENT_STATE_CLOSING;
XinZhangMS 0:f7f1f0d76dd6 1028
XinZhangMS 0:f7f1f0d76dd6 1029 if (previous_state == AMQP_MANAGEMENT_STATE_OPENING)
XinZhangMS 0:f7f1f0d76dd6 1030 {
XinZhangMS 0:f7f1f0d76dd6 1031 /* Codes_SRS_AMQP_MANAGEMENT_01_048: [ `amqp_management_close` on an AMQP management instance that is OPENING shall trigger the `on_amqp_management_open_complete` callback with `AMQP_MANAGEMENT_OPEN_CANCELLED`, while also passing the context passed in `amqp_management_open_async`. ]*/
XinZhangMS 0:f7f1f0d76dd6 1032 amqp_management->on_amqp_management_open_complete(amqp_management->on_amqp_management_open_complete_context, AMQP_MANAGEMENT_OPEN_CANCELLED);
XinZhangMS 0:f7f1f0d76dd6 1033 }
XinZhangMS 0:f7f1f0d76dd6 1034
XinZhangMS 0:f7f1f0d76dd6 1035
XinZhangMS 0:f7f1f0d76dd6 1036 /* Codes_SRS_AMQP_MANAGEMENT_01_045: [ `amqp_management_close` shall close the AMQP management instance. ]*/
XinZhangMS 0:f7f1f0d76dd6 1037 /* Codes_SRS_AMQP_MANAGEMENT_01_050: [ `amqp_management_close` shall close the message sender by calling `messagesender_close`. ]*/
XinZhangMS 0:f7f1f0d76dd6 1038 if (messagesender_close(amqp_management->message_sender) != 0)
XinZhangMS 0:f7f1f0d76dd6 1039 {
XinZhangMS 0:f7f1f0d76dd6 1040 /* Codes_SRS_AMQP_MANAGEMENT_01_052: [ If `messagesender_close` fails, `amqp_management_close` shall fail and return a non-zero value. ]*/
XinZhangMS 0:f7f1f0d76dd6 1041 LogError("messagesender_close failed");
XinZhangMS 0:f7f1f0d76dd6 1042 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 1043 }
XinZhangMS 0:f7f1f0d76dd6 1044 /* Codes_SRS_AMQP_MANAGEMENT_01_051: [ `amqp_management_close` shall close the message receiver by calling `messagereceiver_close`. ]*/
XinZhangMS 0:f7f1f0d76dd6 1045 else if (messagereceiver_close(amqp_management->message_receiver) != 0)
XinZhangMS 0:f7f1f0d76dd6 1046 {
XinZhangMS 0:f7f1f0d76dd6 1047 /* Codes_SRS_AMQP_MANAGEMENT_01_053: [ If `messagereceiver_close` fails, `amqp_management_close` shall fail and return a non-zero value. ]*/
XinZhangMS 0:f7f1f0d76dd6 1048 LogError("messagereceiver_close failed");
XinZhangMS 0:f7f1f0d76dd6 1049 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 1050 }
XinZhangMS 0:f7f1f0d76dd6 1051 else
XinZhangMS 0:f7f1f0d76dd6 1052 {
XinZhangMS 0:f7f1f0d76dd6 1053 LIST_ITEM_HANDLE list_item_handle = singlylinkedlist_get_head_item(amqp_management->pending_operations);
XinZhangMS 0:f7f1f0d76dd6 1054 while (list_item_handle != NULL)
XinZhangMS 0:f7f1f0d76dd6 1055 {
XinZhangMS 0:f7f1f0d76dd6 1056 OPERATION_MESSAGE_INSTANCE* operation_message = (OPERATION_MESSAGE_INSTANCE*)singlylinkedlist_item_get_value(list_item_handle);
XinZhangMS 0:f7f1f0d76dd6 1057 if (operation_message == NULL)
XinZhangMS 0:f7f1f0d76dd6 1058 {
XinZhangMS 0:f7f1f0d76dd6 1059 LogError("Cannot obtain pending operation");
XinZhangMS 0:f7f1f0d76dd6 1060 }
XinZhangMS 0:f7f1f0d76dd6 1061 else
XinZhangMS 0:f7f1f0d76dd6 1062 {
XinZhangMS 0:f7f1f0d76dd6 1063 /* Codes_SRS_AMQP_MANAGEMENT_01_054: [ All pending operations shall be indicated complete with the code `AMQP_MANAGEMENT_EXECUTE_OPERATION_INSTANCE_CLOSED`. ]*/
XinZhangMS 0:f7f1f0d76dd6 1064 operation_message->on_execute_operation_complete(operation_message->callback_context, AMQP_MANAGEMENT_EXECUTE_OPERATION_INSTANCE_CLOSED, 0, NULL, NULL);
XinZhangMS 0:f7f1f0d76dd6 1065 free(operation_message);
XinZhangMS 0:f7f1f0d76dd6 1066 }
XinZhangMS 0:f7f1f0d76dd6 1067
XinZhangMS 0:f7f1f0d76dd6 1068 if (singlylinkedlist_remove(amqp_management->pending_operations, list_item_handle) != 0)
XinZhangMS 0:f7f1f0d76dd6 1069 {
XinZhangMS 0:f7f1f0d76dd6 1070 LogError("Cannot remove item");
XinZhangMS 0:f7f1f0d76dd6 1071 }
XinZhangMS 0:f7f1f0d76dd6 1072
XinZhangMS 0:f7f1f0d76dd6 1073 list_item_handle = singlylinkedlist_get_head_item(amqp_management->pending_operations);
XinZhangMS 0:f7f1f0d76dd6 1074 }
XinZhangMS 0:f7f1f0d76dd6 1075
XinZhangMS 0:f7f1f0d76dd6 1076 amqp_management->amqp_management_state = AMQP_MANAGEMENT_STATE_IDLE;
XinZhangMS 0:f7f1f0d76dd6 1077
XinZhangMS 0:f7f1f0d76dd6 1078 /* Codes_SRS_AMQP_MANAGEMENT_01_046: [ On success it shall return 0. ]*/
XinZhangMS 0:f7f1f0d76dd6 1079 result = 0;
XinZhangMS 0:f7f1f0d76dd6 1080 }
XinZhangMS 0:f7f1f0d76dd6 1081 }
XinZhangMS 0:f7f1f0d76dd6 1082
XinZhangMS 0:f7f1f0d76dd6 1083 return result;
XinZhangMS 0:f7f1f0d76dd6 1084 }
XinZhangMS 0:f7f1f0d76dd6 1085
XinZhangMS 0:f7f1f0d76dd6 1086 int amqp_management_execute_operation_async(AMQP_MANAGEMENT_HANDLE amqp_management, const char* operation, const char* type, const char* locales, MESSAGE_HANDLE message, ON_AMQP_MANAGEMENT_EXECUTE_OPERATION_COMPLETE on_execute_operation_complete, void* on_execute_operation_complete_context)
XinZhangMS 0:f7f1f0d76dd6 1087 {
XinZhangMS 0:f7f1f0d76dd6 1088 int result;
XinZhangMS 0:f7f1f0d76dd6 1089
XinZhangMS 0:f7f1f0d76dd6 1090 if ((amqp_management == NULL) ||
XinZhangMS 0:f7f1f0d76dd6 1091 (operation == NULL) ||
XinZhangMS 0:f7f1f0d76dd6 1092 (type == NULL) ||
XinZhangMS 0:f7f1f0d76dd6 1093 (on_execute_operation_complete == NULL))
XinZhangMS 0:f7f1f0d76dd6 1094 {
XinZhangMS 0:f7f1f0d76dd6 1095 /* Codes_SRS_AMQP_MANAGEMENT_01_057: [ If `amqp_management`, `operation`, `type` or `on_execute_operation_complete` is NULL, `amqp_management_execute_operation_async` shall fail and return a non-zero value. ]*/
XinZhangMS 0:f7f1f0d76dd6 1096 LogError("Bad arguments: amqp_management = %p, operation = %p, type = %p",
XinZhangMS 0:f7f1f0d76dd6 1097 amqp_management, operation, type);
XinZhangMS 0:f7f1f0d76dd6 1098 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 1099 }
XinZhangMS 0:f7f1f0d76dd6 1100 /* Codes_SRS_AMQP_MANAGEMENT_01_081: [ If `amqp_management_execute_operation_async` is called when not OPEN, it shall fail and return a non-zero value. ]*/
XinZhangMS 0:f7f1f0d76dd6 1101 else if ((amqp_management->amqp_management_state == AMQP_MANAGEMENT_STATE_IDLE) ||
XinZhangMS 0:f7f1f0d76dd6 1102 /* Codes_SRS_AMQP_MANAGEMENT_01_104: [ If `amqp_management_execute_operation_async` is called when the AMQP management is in error, it shall fail and return a non-zero value. ]*/
XinZhangMS 0:f7f1f0d76dd6 1103 (amqp_management->amqp_management_state == AMQP_MANAGEMENT_STATE_ERROR))
XinZhangMS 0:f7f1f0d76dd6 1104 {
XinZhangMS 0:f7f1f0d76dd6 1105 LogError("amqp_management_execute_operation_async called while not open or in error");
XinZhangMS 0:f7f1f0d76dd6 1106 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 1107 }
XinZhangMS 0:f7f1f0d76dd6 1108 else
XinZhangMS 0:f7f1f0d76dd6 1109 {
XinZhangMS 0:f7f1f0d76dd6 1110 AMQP_VALUE application_properties;
XinZhangMS 0:f7f1f0d76dd6 1111 MESSAGE_HANDLE cloned_message;
XinZhangMS 0:f7f1f0d76dd6 1112
XinZhangMS 0:f7f1f0d76dd6 1113 if (message == NULL)
XinZhangMS 0:f7f1f0d76dd6 1114 {
XinZhangMS 0:f7f1f0d76dd6 1115 /* Codes_SRS_AMQP_MANAGEMENT_01_102: [ If `message` is NULL, a new message shall be created by calling `message_create`. ]*/
XinZhangMS 0:f7f1f0d76dd6 1116 cloned_message = message_create();
XinZhangMS 0:f7f1f0d76dd6 1117 }
XinZhangMS 0:f7f1f0d76dd6 1118 else
XinZhangMS 0:f7f1f0d76dd6 1119 {
XinZhangMS 0:f7f1f0d76dd6 1120 /* Codes_SRS_AMQP_MANAGEMENT_01_103: [ Otherwise the existing message shall be cloned by using `message_clone` before being modified accordingly and used for the pending operation. ]*/
XinZhangMS 0:f7f1f0d76dd6 1121 cloned_message = message_clone(message);
XinZhangMS 0:f7f1f0d76dd6 1122 if (cloned_message == NULL)
XinZhangMS 0:f7f1f0d76dd6 1123 {
XinZhangMS 0:f7f1f0d76dd6 1124 LogError("Could not clone message");
XinZhangMS 0:f7f1f0d76dd6 1125 }
XinZhangMS 0:f7f1f0d76dd6 1126 }
XinZhangMS 0:f7f1f0d76dd6 1127
XinZhangMS 0:f7f1f0d76dd6 1128 if (cloned_message == NULL)
XinZhangMS 0:f7f1f0d76dd6 1129 {
XinZhangMS 0:f7f1f0d76dd6 1130 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 1131 }
XinZhangMS 0:f7f1f0d76dd6 1132 else
XinZhangMS 0:f7f1f0d76dd6 1133 {
XinZhangMS 0:f7f1f0d76dd6 1134 /* Codes_SRS_AMQP_MANAGEMENT_01_055: [ `amqp_management_execute_operation_async` shall start an AMQP management operation. ]*/
XinZhangMS 0:f7f1f0d76dd6 1135 /* Codes_SRS_AMQP_MANAGEMENT_01_082: [ `amqp_management_execute_operation_async` shall obtain the application properties from the message by calling `message_get_application_properties`. ]*/
XinZhangMS 0:f7f1f0d76dd6 1136 if (message_get_application_properties(cloned_message, &application_properties) != 0)
XinZhangMS 0:f7f1f0d76dd6 1137 {
XinZhangMS 0:f7f1f0d76dd6 1138 LogError("Could not get application properties");
XinZhangMS 0:f7f1f0d76dd6 1139 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 1140 }
XinZhangMS 0:f7f1f0d76dd6 1141 else
XinZhangMS 0:f7f1f0d76dd6 1142 {
XinZhangMS 0:f7f1f0d76dd6 1143 if (application_properties == NULL)
XinZhangMS 0:f7f1f0d76dd6 1144 {
XinZhangMS 0:f7f1f0d76dd6 1145 /* Codes_SRS_AMQP_MANAGEMENT_01_083: [ If no application properties were set on the message, a new application properties instance shall be created by calling `amqpvalue_create_map`; ]*/
XinZhangMS 0:f7f1f0d76dd6 1146 application_properties = amqpvalue_create_map();
XinZhangMS 0:f7f1f0d76dd6 1147 if (application_properties == NULL)
XinZhangMS 0:f7f1f0d76dd6 1148 {
XinZhangMS 0:f7f1f0d76dd6 1149 LogError("Could not create application properties");
XinZhangMS 0:f7f1f0d76dd6 1150 }
XinZhangMS 0:f7f1f0d76dd6 1151 }
XinZhangMS 0:f7f1f0d76dd6 1152
XinZhangMS 0:f7f1f0d76dd6 1153 if (application_properties == NULL)
XinZhangMS 0:f7f1f0d76dd6 1154 {
XinZhangMS 0:f7f1f0d76dd6 1155 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 1156 }
XinZhangMS 0:f7f1f0d76dd6 1157 else
XinZhangMS 0:f7f1f0d76dd6 1158 {
XinZhangMS 0:f7f1f0d76dd6 1159 /* Codes_SRS_AMQP_MANAGEMENT_01_084: [ For each of the arguments `operation`, `type` and `locales` an AMQP value of type string shall be created by calling `amqpvalue_create_string` in order to be used as key in the application properties map. ]*/
XinZhangMS 0:f7f1f0d76dd6 1160 /* Codes_SRS_AMQP_MANAGEMENT_01_085: [ For each of the arguments `operation`, `type` and `locales` an AMQP value of type string containing the argument value shall be created by calling `amqpvalue_create_string` in order to be used as value in the application properties map. ]*/
XinZhangMS 0:f7f1f0d76dd6 1161 /* Codes_SRS_AMQP_MANAGEMENT_01_058: [ Request messages have the following application-properties: ]*/
XinZhangMS 0:f7f1f0d76dd6 1162 /* Codes_SRS_AMQP_MANAGEMENT_01_059: [ operation string Yes The management operation to be performed. ] */
XinZhangMS 0:f7f1f0d76dd6 1163 if ((add_string_key_value_pair_to_map(application_properties, "operation", operation) != 0) ||
XinZhangMS 0:f7f1f0d76dd6 1164 /* Codes_SRS_AMQP_MANAGEMENT_01_061: [ type string Yes The Manageable Entity Type of the Manageable Entity to be managed. ]*/
XinZhangMS 0:f7f1f0d76dd6 1165 (add_string_key_value_pair_to_map(application_properties, "type", type) != 0) ||
XinZhangMS 0:f7f1f0d76dd6 1166 /* Codes_SRS_AMQP_MANAGEMENT_01_093: [ If `locales` is NULL, no key/value pair shall be added for it in the application properties map. ]*/
XinZhangMS 0:f7f1f0d76dd6 1167 /* Codes_SRS_AMQP_MANAGEMENT_01_063: [ locales string No A list of locales that the sending peer permits for incoming informational text in response messages. ]*/
XinZhangMS 0:f7f1f0d76dd6 1168 ((locales != NULL) && (add_string_key_value_pair_to_map(application_properties, "locales", locales) != 0)))
XinZhangMS 0:f7f1f0d76dd6 1169 {
XinZhangMS 0:f7f1f0d76dd6 1170 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 1171 }
XinZhangMS 0:f7f1f0d76dd6 1172 else
XinZhangMS 0:f7f1f0d76dd6 1173 {
XinZhangMS 0:f7f1f0d76dd6 1174 /* Codes_SRS_AMQP_MANAGEMENT_01_087: [ The application properties obtained after adding the key/value pairs shall be set on the message by calling `message_set_application_properties`. ]*/
XinZhangMS 0:f7f1f0d76dd6 1175 if (message_set_application_properties(cloned_message, application_properties) != 0)
XinZhangMS 0:f7f1f0d76dd6 1176 {
XinZhangMS 0:f7f1f0d76dd6 1177 /* Codes_SRS_AMQP_MANAGEMENT_01_090: [ If any APIs used to create and set the application properties on the message fails, `amqp_management_execute_operation_async` shall fail and return a non-zero value. ]*/
XinZhangMS 0:f7f1f0d76dd6 1178 LogError("Could not set application properties");
XinZhangMS 0:f7f1f0d76dd6 1179 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 1180 }
XinZhangMS 0:f7f1f0d76dd6 1181 else if (set_message_id(cloned_message, amqp_management->next_message_id) != 0)
XinZhangMS 0:f7f1f0d76dd6 1182 {
XinZhangMS 0:f7f1f0d76dd6 1183 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 1184 }
XinZhangMS 0:f7f1f0d76dd6 1185 else
XinZhangMS 0:f7f1f0d76dd6 1186 {
XinZhangMS 0:f7f1f0d76dd6 1187 OPERATION_MESSAGE_INSTANCE* pending_operation_message = (OPERATION_MESSAGE_INSTANCE*)malloc(sizeof(OPERATION_MESSAGE_INSTANCE));
XinZhangMS 0:f7f1f0d76dd6 1188 if (pending_operation_message == NULL)
XinZhangMS 0:f7f1f0d76dd6 1189 {
XinZhangMS 0:f7f1f0d76dd6 1190 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 1191 }
XinZhangMS 0:f7f1f0d76dd6 1192 else
XinZhangMS 0:f7f1f0d76dd6 1193 {
XinZhangMS 0:f7f1f0d76dd6 1194 LIST_ITEM_HANDLE added_item;
XinZhangMS 0:f7f1f0d76dd6 1195 pending_operation_message->callback_context = on_execute_operation_complete_context;
XinZhangMS 0:f7f1f0d76dd6 1196 pending_operation_message->on_execute_operation_complete = on_execute_operation_complete;
XinZhangMS 0:f7f1f0d76dd6 1197 pending_operation_message->message_id = amqp_management->next_message_id;
XinZhangMS 0:f7f1f0d76dd6 1198 pending_operation_message->amqp_management = amqp_management;
XinZhangMS 0:f7f1f0d76dd6 1199
XinZhangMS 0:f7f1f0d76dd6 1200 /* Codes_SRS_AMQP_MANAGEMENT_01_091: [ Once the request message has been sent, an entry shall be stored in the pending operations list by calling `singlylinkedlist_add`. ]*/
XinZhangMS 0:f7f1f0d76dd6 1201 added_item = singlylinkedlist_add(amqp_management->pending_operations, pending_operation_message);
XinZhangMS 0:f7f1f0d76dd6 1202 if (added_item == NULL)
XinZhangMS 0:f7f1f0d76dd6 1203 {
XinZhangMS 0:f7f1f0d76dd6 1204 /* Codes_SRS_AMQP_MANAGEMENT_01_092: [ If `singlylinkedlist_add` fails then `amqp_management_execute_operation_async` shall fail and return a non-zero value. ]*/
XinZhangMS 0:f7f1f0d76dd6 1205 LogError("Could not add the operation to the pending operations list.");
XinZhangMS 0:f7f1f0d76dd6 1206 free(pending_operation_message);
XinZhangMS 0:f7f1f0d76dd6 1207 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 1208 }
XinZhangMS 0:f7f1f0d76dd6 1209 else
XinZhangMS 0:f7f1f0d76dd6 1210 {
XinZhangMS 0:f7f1f0d76dd6 1211 /* Codes_SRS_AMQP_MANAGEMENT_01_088: [ `amqp_management_execute_operation_async` shall send the message by calling `messagesender_send_async`. ]*/
XinZhangMS 0:f7f1f0d76dd6 1212 /* Codes_SRS_AMQP_MANAGEMENT_01_166: [ The `on_message_send_complete` callback shall be passed to the `messagesender_send_async` call. ]*/
XinZhangMS 0:f7f1f0d76dd6 1213 if (messagesender_send_async(amqp_management->message_sender, cloned_message, on_message_send_complete, added_item, 0) == NULL)
XinZhangMS 0:f7f1f0d76dd6 1214 {
XinZhangMS 0:f7f1f0d76dd6 1215 /* Codes_SRS_AMQP_MANAGEMENT_01_089: [ If `messagesender_send_async` fails, `amqp_management_execute_operation_async` shall fail and return a non-zero value. ]*/
XinZhangMS 0:f7f1f0d76dd6 1216 LogError("Could not send request message");
XinZhangMS 0:f7f1f0d76dd6 1217 (void)singlylinkedlist_remove(amqp_management->pending_operations, added_item);
XinZhangMS 0:f7f1f0d76dd6 1218 free(pending_operation_message);
XinZhangMS 0:f7f1f0d76dd6 1219 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 1220 }
XinZhangMS 0:f7f1f0d76dd6 1221 else
XinZhangMS 0:f7f1f0d76dd6 1222 {
XinZhangMS 0:f7f1f0d76dd6 1223 /* Codes_SRS_AMQP_MANAGEMENT_01_107: [ The message Id set on the message properties shall be incremented with each operation. ]*/
XinZhangMS 0:f7f1f0d76dd6 1224 amqp_management->next_message_id++;
XinZhangMS 0:f7f1f0d76dd6 1225
XinZhangMS 0:f7f1f0d76dd6 1226 /* Codes_SRS_AMQP_MANAGEMENT_01_056: [ On success it shall return 0. ]*/
XinZhangMS 0:f7f1f0d76dd6 1227 result = 0;
XinZhangMS 0:f7f1f0d76dd6 1228 }
XinZhangMS 0:f7f1f0d76dd6 1229 }
XinZhangMS 0:f7f1f0d76dd6 1230 }
XinZhangMS 0:f7f1f0d76dd6 1231 }
XinZhangMS 0:f7f1f0d76dd6 1232 }
XinZhangMS 0:f7f1f0d76dd6 1233
XinZhangMS 0:f7f1f0d76dd6 1234 /* Codes_SRS_AMQP_MANAGEMENT_01_101: [ After setting the application properties, the application properties instance shall be freed by `amqpvalue_destroy`. ]*/
XinZhangMS 0:f7f1f0d76dd6 1235 amqpvalue_destroy(application_properties);
XinZhangMS 0:f7f1f0d76dd6 1236 }
XinZhangMS 0:f7f1f0d76dd6 1237 }
XinZhangMS 0:f7f1f0d76dd6 1238
XinZhangMS 0:f7f1f0d76dd6 1239 message_destroy(cloned_message);
XinZhangMS 0:f7f1f0d76dd6 1240 }
XinZhangMS 0:f7f1f0d76dd6 1241 }
XinZhangMS 0:f7f1f0d76dd6 1242 return result;
XinZhangMS 0:f7f1f0d76dd6 1243 }
XinZhangMS 0:f7f1f0d76dd6 1244
XinZhangMS 0:f7f1f0d76dd6 1245 void amqp_management_set_trace(AMQP_MANAGEMENT_HANDLE amqp_management, bool trace_on)
XinZhangMS 0:f7f1f0d76dd6 1246 {
XinZhangMS 0:f7f1f0d76dd6 1247 if (amqp_management == NULL)
XinZhangMS 0:f7f1f0d76dd6 1248 {
XinZhangMS 0:f7f1f0d76dd6 1249 /* Codes_SRS_AMQP_MANAGEMENT_01_163: [ If `amqp_management` is NULL, `amqp_management_set_trace` shal do nothing. ]*/
XinZhangMS 0:f7f1f0d76dd6 1250 LogError("NULL amqp_management");
XinZhangMS 0:f7f1f0d76dd6 1251 }
XinZhangMS 0:f7f1f0d76dd6 1252 else
XinZhangMS 0:f7f1f0d76dd6 1253 {
XinZhangMS 0:f7f1f0d76dd6 1254 /* Codes_SRS_AMQP_MANAGEMENT_01_161: [ `amqp_management_set_trace` shall call `messagesender_set_trace` to enable/disable tracing on the message sender. ]*/
XinZhangMS 0:f7f1f0d76dd6 1255 messagesender_set_trace(amqp_management->message_sender, trace_on);
XinZhangMS 0:f7f1f0d76dd6 1256 /* Codes_SRS_AMQP_MANAGEMENT_01_162: [ `amqp_management_set_trace` shall call `messagereceiver_set_trace` to enable/disable tracing on the message receiver. ]*/
XinZhangMS 0:f7f1f0d76dd6 1257 messagereceiver_set_trace(amqp_management->message_receiver, trace_on);
XinZhangMS 0:f7f1f0d76dd6 1258 }
XinZhangMS 0:f7f1f0d76dd6 1259 }
XinZhangMS 0:f7f1f0d76dd6 1260
XinZhangMS 0:f7f1f0d76dd6 1261 int amqp_management_set_override_status_code_key_name(AMQP_MANAGEMENT_HANDLE amqp_management, const char* override_status_code_key_name)
XinZhangMS 0:f7f1f0d76dd6 1262 {
XinZhangMS 0:f7f1f0d76dd6 1263 int result;
XinZhangMS 0:f7f1f0d76dd6 1264
XinZhangMS 0:f7f1f0d76dd6 1265 /* Codes_SRS_AMQP_MANAGEMENT_01_171: [ If `amqp_management` is NULL, `amqp_management_set_override_status_code_key_name` shall fail and return a non-zero value. ]*/
XinZhangMS 0:f7f1f0d76dd6 1266 if ((amqp_management == NULL) ||
XinZhangMS 0:f7f1f0d76dd6 1267 /* Codes_SRS_AMQP_MANAGEMENT_01_172: [ If `override_status_code_key_name` is NULL, `amqp_management_set_override_status_code_key_name` shall fail and return a non-zero value. ]*/
XinZhangMS 0:f7f1f0d76dd6 1268 (override_status_code_key_name == NULL))
XinZhangMS 0:f7f1f0d76dd6 1269 {
XinZhangMS 0:f7f1f0d76dd6 1270 LogError("Bad arguments: amqp_management = %p, override_status_code_key_name = %s",
XinZhangMS 0:f7f1f0d76dd6 1271 amqp_management, P_OR_NULL(override_status_code_key_name));
XinZhangMS 0:f7f1f0d76dd6 1272 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 1273 }
XinZhangMS 0:f7f1f0d76dd6 1274 else
XinZhangMS 0:f7f1f0d76dd6 1275 {
XinZhangMS 0:f7f1f0d76dd6 1276 /* Codes_SRS_AMQP_MANAGEMENT_01_167: [ `amqp_management_set_override_status_code_key_name` shall set the status code key name used to parse the status code from the reply messages to `override_status_code_key_name`. ]*/
XinZhangMS 0:f7f1f0d76dd6 1277 /* Codes_SRS_AMQP_MANAGEMENT_01_168: [ `amqp_management_set_override_status_code_key_name` shall copy the `override_status_code_key_name` string. ]*/
XinZhangMS 0:f7f1f0d76dd6 1278 /* Codes_SRS_AMQP_MANAGEMENT_01_169: [ `amqp_management_set_override_status_code_key_name` shall free any string previously used for the status code key name. ]*/
XinZhangMS 0:f7f1f0d76dd6 1279 if (internal_set_status_code_key_name(amqp_management, override_status_code_key_name) != 0)
XinZhangMS 0:f7f1f0d76dd6 1280 {
XinZhangMS 0:f7f1f0d76dd6 1281 /* Codes_SRS_AMQP_MANAGEMENT_01_173: [ If any error occurs in copying the `override_status_code_key_name` string, `amqp_management_set_override_status_code_key_name` shall fail and return a non-zero value. ]*/
XinZhangMS 0:f7f1f0d76dd6 1282 LogError("Cannot set status code key name");
XinZhangMS 0:f7f1f0d76dd6 1283 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 1284 }
XinZhangMS 0:f7f1f0d76dd6 1285 else
XinZhangMS 0:f7f1f0d76dd6 1286 {
XinZhangMS 0:f7f1f0d76dd6 1287 /* Codes_SRS_AMQP_MANAGEMENT_01_170: [ On success, `amqp_management_set_override_status_code_key_name` shall return 0. ]*/
XinZhangMS 0:f7f1f0d76dd6 1288 result = 0;
XinZhangMS 0:f7f1f0d76dd6 1289 }
XinZhangMS 0:f7f1f0d76dd6 1290 }
XinZhangMS 0:f7f1f0d76dd6 1291
XinZhangMS 0:f7f1f0d76dd6 1292 return result;
XinZhangMS 0:f7f1f0d76dd6 1293 }
XinZhangMS 0:f7f1f0d76dd6 1294
XinZhangMS 0:f7f1f0d76dd6 1295 int amqp_management_set_override_status_description_key_name(AMQP_MANAGEMENT_HANDLE amqp_management, const char* override_status_description_key_name)
XinZhangMS 0:f7f1f0d76dd6 1296 {
XinZhangMS 0:f7f1f0d76dd6 1297 int result;
XinZhangMS 0:f7f1f0d76dd6 1298
XinZhangMS 0:f7f1f0d76dd6 1299 /* Codes_SRS_AMQP_MANAGEMENT_01_178: [ If `amqp_management` is NULL, `amqp_management_set_override_status_description_key_name` shall fail and return a non-zero value. ]*/
XinZhangMS 0:f7f1f0d76dd6 1300 if ((amqp_management == NULL) ||
XinZhangMS 0:f7f1f0d76dd6 1301 /* Tests_SRS_AMQP_MANAGEMENT_01_179: [ If `override_status_description_key_name` is NULL, `amqp_management_set_override_status_description_key_name` shall fail and return a non-zero value. ]*/
XinZhangMS 0:f7f1f0d76dd6 1302 (override_status_description_key_name == NULL))
XinZhangMS 0:f7f1f0d76dd6 1303 {
XinZhangMS 0:f7f1f0d76dd6 1304 LogError("Bad arguments: amqp_management = %p, override_status_description_key_name = %s",
XinZhangMS 0:f7f1f0d76dd6 1305 amqp_management, P_OR_NULL(override_status_description_key_name));
XinZhangMS 0:f7f1f0d76dd6 1306 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 1307 }
XinZhangMS 0:f7f1f0d76dd6 1308 else
XinZhangMS 0:f7f1f0d76dd6 1309 {
XinZhangMS 0:f7f1f0d76dd6 1310 /* Codes_SRS_AMQP_MANAGEMENT_01_174: [ `amqp_management_set_override_status_description_key_name` shall set the status description key name used to parse the status description from the reply messages to `over ride_status_description_key_name`.]*/
XinZhangMS 0:f7f1f0d76dd6 1311 /* Codes_SRS_AMQP_MANAGEMENT_01_175: [ `amqp_management_set_override_status_description_key_name` shall copy the `override_status_description_key_name` string. ]*/
XinZhangMS 0:f7f1f0d76dd6 1312 /* Codes_SRS_AMQP_MANAGEMENT_01_176: [ `amqp_management_set_override_status_description_key_name` shall free any string previously used for the status description key name. ]*/
XinZhangMS 0:f7f1f0d76dd6 1313 /* Codes_SRS_AMQP_MANAGEMENT_01_177: [ On success, `amqp_management_set_override_status_description_key_name` shall return 0. ]*/
XinZhangMS 0:f7f1f0d76dd6 1314 if (internal_set_status_description_key_name(amqp_management, override_status_description_key_name) != 0)
XinZhangMS 0:f7f1f0d76dd6 1315 {
XinZhangMS 0:f7f1f0d76dd6 1316 /* Codes_SRS_AMQP_MANAGEMENT_01_180: [ If any error occurs in copying the `override_status_description_key_name` string, `amqp_management_set_override_status_description_key_name` shall fail and return a non-zero value. ]*/
XinZhangMS 0:f7f1f0d76dd6 1317 LogError("Cannot set status description key name");
XinZhangMS 0:f7f1f0d76dd6 1318 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 1319 }
XinZhangMS 0:f7f1f0d76dd6 1320 else
XinZhangMS 0:f7f1f0d76dd6 1321 {
XinZhangMS 0:f7f1f0d76dd6 1322 result = 0;
XinZhangMS 0:f7f1f0d76dd6 1323 }
XinZhangMS 0:f7f1f0d76dd6 1324 }
XinZhangMS 0:f7f1f0d76dd6 1325
XinZhangMS 0:f7f1f0d76dd6 1326 return result;
XinZhangMS 0:f7f1f0d76dd6 1327 }