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;
}