int link_detach()

in src/link.c [1220:1322]


int link_detach(LINK_HANDLE link, bool close, const char* error_condition, const char* error_description, AMQP_VALUE info)
{
    int result;

    (void)error_condition;
    (void)error_description;
    (void)info;

    if (link == NULL)
    {
        LogError("NULL link");
        result = MU_FAILURE;
    }
    else if (link->is_closed)
    {
        result = 0;
    }
    else
    {
        ERROR_HANDLE error;

        if (error_condition != NULL)
        {
            error = error_create(error_condition);
            if (error == NULL)
            {
                LogInfo("Cannot create error for detach, detaching without error anyhow");
            }
            else
            {
                if (error_description != NULL)
                {
                    if (error_set_description(error, error_description) != 0)
                    {
                        LogInfo("Cannot set error description on detach error, detaching anyhow");
                    }
                }

                if (info != NULL)
                {
                    if (error_set_info(error, info) != 0)
                    {
                        LogInfo("Cannot set info map on detach error, detaching anyhow");
                    }
                }
            }
        }
        else
        {
            error = NULL;
        }

        switch (link->link_state)
        {
        case LINK_STATE_HALF_ATTACHED_ATTACH_SENT:
        case LINK_STATE_HALF_ATTACHED_ATTACH_RECEIVED:
            /* Sending detach when remote is not yet attached */
            if (send_detach(link, close, error) != 0)
            {
                LogError("Sending detach frame failed");
                result = MU_FAILURE;
            }
            else
            {
                set_link_state(link, LINK_STATE_DETACHED);
                result = 0;
            }
            break;

        case LINK_STATE_ATTACHED:
            /* Send detach and wait for remote to respond */
            if (send_detach(link, close, error) != 0)
            {
                LogError("Sending detach frame failed");
                result = MU_FAILURE;
            }
            else
            {
                set_link_state(link, LINK_STATE_HALF_ATTACHED_ATTACH_SENT);
                result = 0;
            }
            break;

        case LINK_STATE_DETACHED:
            /* Already detached */
            result = 0;
            break;

        default:
        case LINK_STATE_ERROR:
            /* Already detached and in error state */
            result = MU_FAILURE;
            break;
        }

        if (error != NULL)
        {
            error_destroy(error);
        }
    }

    return result;
}