in src/amqp_management.c [408:505]
static void on_message_sender_state_changed(void* context, MESSAGE_SENDER_STATE new_state, MESSAGE_SENDER_STATE previous_state)
{
if (context == NULL)
{
/* Codes_SRS_AMQP_MANAGEMENT_01_137: [ When `on_message_sender_state_changed` is called with NULL `context`, it shall do nothing. ]*/
LogError("on_message_sender_state_changed called with NULL context");
}
else
{
/* 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: ]*/
/* Codes_SRS_AMQP_MANAGEMENT_01_148: [ When no state change is detected, `on_message_sender_state_changed` shall do nothing. ]*/
if (new_state != previous_state)
{
AMQP_MANAGEMENT_INSTANCE* amqp_management_instance = (AMQP_MANAGEMENT_INSTANCE*)context;
switch (amqp_management_instance->amqp_management_state)
{
default:
break;
/* Codes_SRS_AMQP_MANAGEMENT_01_139: [ For the current state of AMQP management being `OPENING`: ]*/
case AMQP_MANAGEMENT_STATE_OPENING:
{
switch (new_state)
{
case MESSAGE_SENDER_STATE_OPENING:
/* Codes_SRS_AMQP_MANAGEMENT_01_165: [ - If `new_state` is `MESSAGE_SENDER_STATE_OPEING` the transition shall be ignored. ]*/
break;
default:
/* 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`. ]*/
case MESSAGE_SENDER_STATE_IDLE:
case MESSAGE_SENDER_STATE_CLOSING:
case MESSAGE_SENDER_STATE_ERROR:
amqp_management_instance->amqp_management_state = AMQP_MANAGEMENT_STATE_IDLE;
amqp_management_instance->on_amqp_management_open_complete(amqp_management_instance->on_amqp_management_open_complete_context, AMQP_MANAGEMENT_OPEN_ERROR);
break;
case MESSAGE_SENDER_STATE_OPEN:
amqp_management_instance->sender_connected = 1;
/* 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.]*/
if (amqp_management_instance->receiver_connected != 0)
{
/* 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`. ]*/
amqp_management_instance->amqp_management_state = AMQP_MANAGEMENT_STATE_OPEN;
amqp_management_instance->on_amqp_management_open_complete(amqp_management_instance->on_amqp_management_open_complete_context, AMQP_MANAGEMENT_OPEN_OK);
}
break;
}
break;
}
/* Codes_SRS_AMQP_MANAGEMENT_01_144: [ For the current state of AMQP management being `OPEN`: ]*/
case AMQP_MANAGEMENT_STATE_OPEN:
{
switch (new_state)
{
default:
/* 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. ]*/
case MESSAGE_SENDER_STATE_IDLE:
case MESSAGE_SENDER_STATE_CLOSING:
case MESSAGE_SENDER_STATE_ERROR:
amqp_management_instance->amqp_management_state = AMQP_MANAGEMENT_STATE_ERROR;
amqp_management_instance->on_amqp_management_error(amqp_management_instance->on_amqp_management_error_context);
break;
case MESSAGE_SENDER_STATE_OPEN:
/* Codes_SRS_AMQP_MANAGEMENT_01_145: [ - If `new_state` is `MESSAGE_SENDER_STATE_OPEN`, `on_message_sender_state_changed` shall do nothing. ]*/
break;
}
break;
}
/* Codes_SRS_AMQP_MANAGEMENT_09_001: [ For the current state of AMQP management being `CLOSING`: ]*/
case AMQP_MANAGEMENT_STATE_CLOSING:
{
switch (new_state)
{
default:
/* 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. ]*/
case MESSAGE_SENDER_STATE_OPEN:
case MESSAGE_SENDER_STATE_OPENING:
case MESSAGE_SENDER_STATE_ERROR:
amqp_management_instance->amqp_management_state = AMQP_MANAGEMENT_STATE_ERROR;
amqp_management_instance->on_amqp_management_error(amqp_management_instance->on_amqp_management_error_context);
break;
case MESSAGE_SENDER_STATE_IDLE:
case MESSAGE_SENDER_STATE_CLOSING:
/* 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. ]*/
break;
}
break;
}
/* Codes_SRS_AMQP_MANAGEMENT_01_146: [ For the current state of AMQP management being `ERROR`: ]*/
case AMQP_MANAGEMENT_STATE_ERROR:
/* Codes_SRS_AMQP_MANAGEMENT_01_147: [ - All state transitions shall be ignored. ]*/
break;
}
}
}
}