in src/amqp_management.c [1039:1120]
int amqp_management_close(AMQP_MANAGEMENT_HANDLE amqp_management)
{
int result;
if (amqp_management == NULL)
{
/* Codes_SRS_AMQP_MANAGEMENT_01_047: [ If `amqp_management` is NULL, `amqp_management_close` shall fail and return a non-zero value. ]*/
LogError("NULL amqp_management");
result = MU_FAILURE;
}
else if (amqp_management->amqp_management_state == AMQP_MANAGEMENT_STATE_IDLE)
{
/* 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. ]*/
LogError("AMQP management instance not open");
result = MU_FAILURE;
}
else
{
AMQP_MANAGEMENT_STATE previous_state = amqp_management->amqp_management_state;
amqp_management->amqp_management_state = AMQP_MANAGEMENT_STATE_CLOSING;
if (previous_state == AMQP_MANAGEMENT_STATE_OPENING)
{
/* 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`. ]*/
amqp_management->on_amqp_management_open_complete(amqp_management->on_amqp_management_open_complete_context, AMQP_MANAGEMENT_OPEN_CANCELLED);
}
/* Codes_SRS_AMQP_MANAGEMENT_01_045: [ `amqp_management_close` shall close the AMQP management instance. ]*/
/* Codes_SRS_AMQP_MANAGEMENT_01_050: [ `amqp_management_close` shall close the message sender by calling `messagesender_close`. ]*/
if (messagesender_close(amqp_management->message_sender) != 0)
{
/* Codes_SRS_AMQP_MANAGEMENT_01_052: [ If `messagesender_close` fails, `amqp_management_close` shall fail and return a non-zero value. ]*/
LogError("messagesender_close failed");
result = MU_FAILURE;
}
/* Codes_SRS_AMQP_MANAGEMENT_01_051: [ `amqp_management_close` shall close the message receiver by calling `messagereceiver_close`. ]*/
else if (messagereceiver_close(amqp_management->message_receiver) != 0)
{
/* Codes_SRS_AMQP_MANAGEMENT_01_053: [ If `messagereceiver_close` fails, `amqp_management_close` shall fail and return a non-zero value. ]*/
LogError("messagereceiver_close failed");
result = MU_FAILURE;
}
else
{
LIST_ITEM_HANDLE list_item_handle = singlylinkedlist_get_head_item(amqp_management->pending_operations);
while (list_item_handle != NULL)
{
OPERATION_MESSAGE_INSTANCE* operation_message = (OPERATION_MESSAGE_INSTANCE*)singlylinkedlist_item_get_value(list_item_handle);
if (operation_message == NULL)
{
LogError("Cannot obtain pending operation");
}
else
{
/* Codes_SRS_AMQP_MANAGEMENT_01_054: [ All pending operations shall be indicated complete with the code `AMQP_MANAGEMENT_EXECUTE_OPERATION_INSTANCE_CLOSED`. ]*/
if (operation_message->on_execute_operation_complete != NULL)
{
// Check for NULL in case operation has been cancelled.
operation_message->on_execute_operation_complete(operation_message->callback_context, AMQP_MANAGEMENT_EXECUTE_OPERATION_INSTANCE_CLOSED, 0, NULL, NULL);
}
async_operation_destroy(operation_message->execute_async_operation);
}
if (singlylinkedlist_remove(amqp_management->pending_operations, list_item_handle) != 0)
{
LogError("Cannot remove item");
}
list_item_handle = singlylinkedlist_get_head_item(amqp_management->pending_operations);
}
amqp_management->amqp_management_state = AMQP_MANAGEMENT_STATE_IDLE;
/* Codes_SRS_AMQP_MANAGEMENT_01_046: [ On success it shall return 0. ]*/
result = 0;
}
}
return result;
}