IOTHUB_MESSAGING_RESULT IoTHubMessaging_LL_Open()

in iothub_service_client/src/iothub_messaging_ll.c [1101:1379]


IOTHUB_MESSAGING_RESULT IoTHubMessaging_LL_Open(IOTHUB_MESSAGING_HANDLE messagingHandle, IOTHUB_OPEN_COMPLETE_CALLBACK openCompleteCallback, void* userContextCallback)
{
    IOTHUB_MESSAGING_RESULT result;

    char* send_target_address = NULL;
    char* receive_target_address = NULL;

    TLSIO_CONFIG tls_io_config;
    SASLCLIENTIO_CONFIG sasl_io_config;

    AMQP_VALUE sendSource = NULL;
    AMQP_VALUE sendTarget = NULL;

    AMQP_VALUE receiveSource = NULL;
    AMQP_VALUE receiveTarget = NULL;

    if (messagingHandle == NULL)
    {
        LogError("Input parameter cannot be NULL");
        result = IOTHUB_MESSAGING_INVALID_ARG;
    }
    else if (messagingHandle->isOpened != 0)
    {
        LogError("Messaging is already opened");
        result = IOTHUB_MESSAGING_OK;
    }
    else
    {
        messagingHandle->message_sender = NULL;
        messagingHandle->connection = NULL;
        messagingHandle->session = NULL;
        messagingHandle->sender_link = NULL;
        messagingHandle->sasl_plain_config.authzid = NULL;
        messagingHandle->sasl_mechanism_handle = NULL;
        messagingHandle->tls_io = NULL;
        messagingHandle->sasl_io = NULL;

        if ((send_target_address = createSendTargetAddress(messagingHandle)) == NULL)
        {
            LogError("Could not create sendTargetAddress");
            result = IOTHUB_MESSAGING_ERROR;
        }
        else if ((receive_target_address = createReceiveTargetAddress(messagingHandle)) == NULL)
        {
            LogError("Could not create receiveTargetAddress");
            result = IOTHUB_MESSAGING_ERROR;
        }
        else if ((messagingHandle->sasl_plain_config.authcid = createAuthCid(messagingHandle)) == NULL)
        {
            LogError("Could not create authCid");
            result = IOTHUB_MESSAGING_ERROR;
        }
        else if ((messagingHandle->sasl_plain_config.passwd = createSasToken(messagingHandle)) == NULL)
        {
            LogError("Could not create sasToken");
            result = IOTHUB_MESSAGING_ERROR;
        }
        else
        {
            const SASL_MECHANISM_INTERFACE_DESCRIPTION* sasl_mechanism_interface;

            if ((sasl_mechanism_interface = saslplain_get_interface()) == NULL)
            {
                LogError("Could not get SASL plain mechanism interface.");
                result = IOTHUB_MESSAGING_ERROR;
            }
            else if ((messagingHandle->sasl_mechanism_handle = saslmechanism_create(sasl_mechanism_interface, &messagingHandle->sasl_plain_config)) == NULL)
            {
                LogError("Could not create SASL plain mechanism.");
                result = IOTHUB_MESSAGING_ERROR;
            }
            else
            {
                tls_io_config.hostname = messagingHandle->hostname;
                tls_io_config.port = 5671;
                tls_io_config.underlying_io_interface = NULL;
                tls_io_config.underlying_io_parameters = NULL;

                const IO_INTERFACE_DESCRIPTION* tlsio_interface;

                if ((tlsio_interface = platform_get_default_tlsio()) == NULL)
                {
                    LogError("Could not get default TLS IO interface.");
                    result = IOTHUB_MESSAGING_ERROR;
                }
                else if ((messagingHandle->tls_io = xio_create(tlsio_interface, &tls_io_config)) == NULL)
                {
                    LogError("Could not create TLS IO.");
                    result = IOTHUB_MESSAGING_ERROR;
                }
                else if (messagingHandle->trusted_cert != NULL && xio_setoption(messagingHandle->tls_io, OPTION_TRUSTED_CERT, messagingHandle->trusted_cert) != 0)
                {
                    LogError("Could set tlsio trusted certificate.");
                    xio_destroy(messagingHandle->tls_io);
                    messagingHandle->tls_io = NULL;
                    result = IOTHUB_MESSAGING_ERROR;
                }
                else
                {
                    messagingHandle->callback_data.openCompleteCompleteCallback = openCompleteCallback;
                    messagingHandle->callback_data.openUserContext = userContextCallback;

                    sasl_io_config.sasl_mechanism = messagingHandle->sasl_mechanism_handle;
                    sasl_io_config.underlying_io = messagingHandle->tls_io;

                    const IO_INTERFACE_DESCRIPTION* saslclientio_interface;

                    if ((saslclientio_interface = saslclientio_get_interface_description()) == NULL)
                    {
                        LogError("Could not create get SASL IO interface description.");
                        result = IOTHUB_MESSAGING_ERROR;
                    }
                    else if ((messagingHandle->sasl_io = xio_create(saslclientio_interface, &sasl_io_config)) == NULL)
                    {
                        LogError("Could not create SASL IO.");
                        result = IOTHUB_MESSAGING_ERROR;
                    }
                    else if ((messagingHandle->connection = connection_create(messagingHandle->sasl_io, messagingHandle->hostname, "some", NULL, NULL)) == NULL)
                    {
                        LogError("Could not create connection.");
                        result = IOTHUB_MESSAGING_ERROR;
                    }
                    else if ((messagingHandle->session = session_create(messagingHandle->connection, NULL, NULL)) == NULL)
                    {
                        LogError("Could not create session.");
                        result = IOTHUB_MESSAGING_ERROR;
                    }
                    else if (session_set_incoming_window(messagingHandle->session, 2147483647) != 0)
                    {
                        LogError("Could not set incoming window.");
                        result = IOTHUB_MESSAGING_ERROR;
                    }
                    else if (session_set_outgoing_window(messagingHandle->session, 255 * 1024) != 0)
                    {
                        LogError("Could not set outgoing window.");
                        result = IOTHUB_MESSAGING_ERROR;
                    }
                    else if ((sendSource = messaging_create_source("ingress")) == NULL)
                    {
                        LogError("Could not create source for link.");
                        result = IOTHUB_MESSAGING_ERROR;
                    }
                    else if ((sendTarget = messaging_create_target(send_target_address)) == NULL)
                    {
                        LogError("Could not create target for link.");
                        result = IOTHUB_MESSAGING_ERROR;
                    }
                    else if ((messagingHandle->sender_link = link_create(messagingHandle->session, "sender-link", role_sender, sendSource, sendTarget)) == NULL)
                    {
                        LogError("Could not create link.");
                        result = IOTHUB_MESSAGING_ERROR;
                    }
                    else if (attachServiceClientTypeToLink(messagingHandle->sender_link) != 0)
                    {
                        LogError("Could not set the sender attach properties.");
                        result = IOTHUB_MESSAGING_ERROR;
                    }
                    else if (link_set_snd_settle_mode(messagingHandle->sender_link, sender_settle_mode_unsettled) != 0)
                    {
                        LogError("Could not set the sender settle mode.");
                        result = IOTHUB_MESSAGING_ERROR;
                    }
                    else if ((messagingHandle->message_sender = messagesender_create(messagingHandle->sender_link, IoTHubMessaging_LL_SenderStateChanged, messagingHandle)) == NULL)
                    {
                        LogError("Could not create message sender.");
                        result = IOTHUB_MESSAGING_ERROR;
                    }
                    else if (messagesender_open(messagingHandle->message_sender) != 0)
                    {
                        LogError("Could not open the message sender.");
                        result = IOTHUB_MESSAGING_ERROR;
                    }
                    else if ((receiveSource = messaging_create_source(receive_target_address)) == NULL)
                    {
                        LogError("Could not create source for link.");
                        result = IOTHUB_MESSAGING_ERROR;
                    }
                    else if ((receiveTarget = messaging_create_target("receiver_001")) == NULL)
                    {
                        LogError("Could not create target for link.");
                        result = IOTHUB_MESSAGING_ERROR;
                    }
                    else if ((messagingHandle->receiver_link = link_create(messagingHandle->session, "receiver-link", role_receiver, receiveSource, receiveTarget)) == NULL)
                    {
                        LogError("Could not create link.");
                        result = IOTHUB_MESSAGING_ERROR;
                    }
                    else if (attachServiceClientTypeToLink(messagingHandle->receiver_link) != 0)
                    {
                        LogError("Could not create link.");
                        result = IOTHUB_MESSAGING_ERROR;
                    }
                    else if (link_set_rcv_settle_mode(messagingHandle->receiver_link, receiver_settle_mode_first) != 0)
                    {
                        LogError("Could not set the sender settle mode.");
                        result = IOTHUB_MESSAGING_ERROR;
                    }
                    else if ((messagingHandle->message_receiver = messagereceiver_create(messagingHandle->receiver_link, IoTHubMessaging_LL_ReceiverStateChanged, messagingHandle)) == NULL)
                    {
                        LogError("Could not create message receiver.");
                        result = IOTHUB_MESSAGING_ERROR;
                    }
                    else if (messagereceiver_open(messagingHandle->message_receiver, IoTHubMessaging_LL_FeedbackMessageReceived, messagingHandle) != 0)
                    {
                        LogError("Could not open the message receiver.");
                        messagereceiver_destroy(messagingHandle->message_receiver);
                        messagingHandle->message_receiver = NULL;
                        result = IOTHUB_MESSAGING_ERROR;
                    }
                    else
                    {
                        messagingHandle->isOpened = true;
                        result = IOTHUB_MESSAGING_OK;
                    }
                }
            }
            if (result != IOTHUB_MESSAGING_OK)
            {
                if (messagingHandle->message_sender != NULL)
                {
                    messagesender_destroy(messagingHandle->message_sender);
                    messagingHandle->message_sender = NULL;
                }
                if (messagingHandle->tls_io != NULL)
                {
                    xio_destroy(messagingHandle->tls_io);
                    messagingHandle->tls_io = NULL;
                }
                if (messagingHandle->sasl_io != NULL)
                {
                    xio_destroy(messagingHandle->sasl_io);
                    messagingHandle->sasl_io = NULL;
                }
                if (messagingHandle->session != NULL)
                {
                    session_destroy(messagingHandle->session);
                    messagingHandle->session = NULL;
                }
                if (messagingHandle->connection != NULL)
                {
                    connection_destroy(messagingHandle->connection);
                    messagingHandle->connection = NULL;
                }
                if (messagingHandle->receiver_link != NULL)
                {
                    link_destroy(messagingHandle->receiver_link);
                    messagingHandle->receiver_link = NULL;
                }
            }
        }
        if (result != IOTHUB_MESSAGING_OK)
        {
            if (messagingHandle->sasl_plain_config.authcid != NULL)
            {
                free((char*)messagingHandle->sasl_plain_config.authcid);
                messagingHandle->sasl_plain_config.authcid = NULL;
            }
            if (messagingHandle->sasl_plain_config.passwd != NULL)
            {
                free((char*)messagingHandle->sasl_plain_config.passwd);
                messagingHandle->sasl_plain_config.passwd = NULL;
            }
        }
    }
    amqpvalue_destroy(sendSource);
    amqpvalue_destroy(sendTarget);
    amqpvalue_destroy(receiveSource);
    amqpvalue_destroy(receiveTarget);

    if (send_target_address != NULL)
    {
        free(send_target_address);
    }
    if (receive_target_address != NULL)
    {
        free(receive_target_address);
    }
    return result;
}