in iothub_client/src/iothub_client_core_ll.c [1382:1661]
IOTHUB_CLIENT_CORE_LL_HANDLE IoTHubClientCore_LL_CreateFromConnectionString(const char* connectionString, IOTHUB_CLIENT_TRANSPORT_PROVIDER protocol)
{
IOTHUB_CLIENT_CORE_LL_HANDLE result;
if (connectionString == NULL)
{
LogError("Input parameter is NULL: connectionString");
result = NULL;
}
else if (protocol == NULL)
{
LogError("Input parameter is NULL: protocol");
result = NULL;
}
else
{
IOTHUB_CLIENT_CONFIG* config = (IOTHUB_CLIENT_CONFIG*) malloc(sizeof(IOTHUB_CLIENT_CONFIG));
if (config == NULL)
{
LogError("Malloc failed");
result = NULL;
}
else
{
STRING_TOKENIZER_HANDLE tokenizer1 = NULL;
STRING_HANDLE connString = NULL;
STRING_HANDLE tokenString = NULL;
STRING_HANDLE valueString = NULL;
STRING_HANDLE hostNameString = NULL;
STRING_HANDLE hostSuffixString = NULL;
STRING_HANDLE deviceIdString = NULL;
STRING_HANDLE deviceKeyString = NULL;
STRING_HANDLE deviceSasTokenString = NULL;
STRING_HANDLE protocolGateway = NULL;
STRING_HANDLE moduleId = NULL;
memset(config, 0, sizeof(*config));
config->protocol = protocol;
config->protocolGatewayHostName = NULL;
if ((connString = STRING_construct(connectionString)) == NULL)
{
LogError("Error constructing connection String");
result = NULL;
}
else if ((tokenizer1 = STRING_TOKENIZER_create(connString)) == NULL)
{
LogError("Error creating Tokenizer");
result = NULL;
}
else if ((tokenString = STRING_new()) == NULL)
{
LogError("Error creating Token String");
result = NULL;
}
else if ((valueString = STRING_new()) == NULL)
{
LogError("Error creating Value String");
result = NULL;
}
else if ((hostNameString = STRING_new()) == NULL)
{
LogError("Error creating HostName String");
result = NULL;
}
else if ((hostSuffixString = STRING_new()) == NULL)
{
LogError("Error creating HostSuffix String");
result = NULL;
}
else
{
int isx509found = 0;
bool use_provisioning = false;
while ((STRING_TOKENIZER_get_next_token(tokenizer1, tokenString, "=") == 0))
{
if (STRING_TOKENIZER_get_next_token(tokenizer1, valueString, ";") != 0)
{
LogError("Tokenizer error");
break;
}
else
{
if (tokenString != NULL)
{
const char* s_token = STRING_c_str(tokenString);
if (strcmp(s_token, HOSTNAME_TOKEN) == 0)
{
STRING_TOKENIZER_HANDLE tokenizer2 = NULL;
if ((tokenizer2 = STRING_TOKENIZER_create(valueString)) == NULL)
{
LogError("Error creating Tokenizer");
break;
}
else
{
if (STRING_TOKENIZER_get_next_token(tokenizer2, hostNameString, ".") != 0)
{
LogError("Tokenizer error");
STRING_TOKENIZER_destroy(tokenizer2);
break;
}
else
{
config->iotHubName = STRING_c_str(hostNameString);
if (STRING_TOKENIZER_get_next_token(tokenizer2, hostSuffixString, ";") != 0)
{
LogError("Tokenizer error");
STRING_TOKENIZER_destroy(tokenizer2);
break;
}
else
{
config->iotHubSuffix = STRING_c_str(hostSuffixString);
}
}
STRING_TOKENIZER_destroy(tokenizer2);
}
}
else if (strcmp(s_token, DEVICEID_TOKEN) == 0)
{
deviceIdString = STRING_clone(valueString);
if (deviceIdString != NULL)
{
config->deviceId = STRING_c_str(deviceIdString);
}
else
{
LogError("Failure cloning device id string");
break;
}
}
else if (strcmp(s_token, DEVICEKEY_TOKEN) == 0)
{
deviceKeyString = STRING_clone(valueString);
if (deviceKeyString != NULL)
{
config->deviceKey = STRING_c_str(deviceKeyString);
}
else
{
LogError("Failure cloning device key string");
break;
}
}
else if (strcmp(s_token, DEVICESAS_TOKEN) == 0)
{
deviceSasTokenString = STRING_clone(valueString);
if (deviceSasTokenString != NULL)
{
config->deviceSasToken = STRING_c_str(deviceSasTokenString);
}
else
{
LogError("Failure cloning device sasToken string");
break;
}
}
else if (strcmp(s_token, X509_TOKEN) == 0)
{
if (strcmp(STRING_c_str(valueString), X509_TOKEN_ONLY_ACCEPTABLE_VALUE) != 0)
{
LogError("x509 option has wrong value, the only acceptable one is \"true\"");
break;
}
else
{
isx509found = 1;
}
}
else if (strcmp(s_token, PROVISIONING_TOKEN) == 0)
{
if (strcmp(STRING_c_str(valueString), PROVISIONING_ACCEPTABLE_VALUE) != 0)
{
LogError("provisioning option has wrong value, the only acceptable one is \"true\"");
break;
}
else
{
use_provisioning = 1;
}
}
else if (strcmp(s_token, PROTOCOL_GATEWAY_HOST_TOKEN) == 0)
{
protocolGateway = STRING_clone(valueString);
if (protocolGateway != NULL)
{
config->protocolGatewayHostName = STRING_c_str(protocolGateway);
}
else
{
LogError("Failure cloning protocol Gateway Name");
break;
}
}
else if (strcmp(s_token, MODULE_ID_TOKEN) == 0)
{
moduleId = STRING_clone(valueString);
if (moduleId == NULL)
{
LogError("Failure cloning moduleId string");
break;
}
}
else
{
// If we get an unknown token, log it to error stream but do not cause a fatal error.
LogError("Unknown token <%s> in connection string. Ignoring error and continuing to parse", s_token);
}
}
}
}
/* parsing is done - check the result */
if (config->iotHubName == NULL)
{
LogError("iotHubName is not found");
result = NULL;
}
else if (config->iotHubSuffix == NULL)
{
LogError("iotHubSuffix is not found");
result = NULL;
}
else if (config->deviceId == NULL)
{
LogError("deviceId is not found");
result = NULL;
}
else if (!(
((!use_provisioning && !isx509found) && (config->deviceSasToken == NULL) ^ (config->deviceKey == NULL)) ||
((use_provisioning || isx509found) && (config->deviceSasToken == NULL) && (config->deviceKey == NULL))
))
{
LogError("invalid combination of x509, provisioning, deviceSasToken and deviceKey");
result = NULL;
}
else
{
result = initialize_iothub_client(config, NULL, use_provisioning, STRING_c_str(moduleId));
if (result == NULL)
{
LogError("IoTHubClientCore_LL_Create failed");
}
else
{
/*return as is*/
}
}
}
if (deviceSasTokenString != NULL)
STRING_delete(deviceSasTokenString);
if (deviceKeyString != NULL)
STRING_delete(deviceKeyString);
if (deviceIdString != NULL)
STRING_delete(deviceIdString);
if (hostSuffixString != NULL)
STRING_delete(hostSuffixString);
if (hostNameString != NULL)
STRING_delete(hostNameString);
if (valueString != NULL)
STRING_delete(valueString);
if (tokenString != NULL)
STRING_delete(tokenString);
if (connString != NULL)
STRING_delete(connString);
if (protocolGateway != NULL)
STRING_delete(protocolGateway);
if (moduleId != NULL)
STRING_delete(moduleId);
if (tokenizer1 != NULL)
STRING_TOKENIZER_destroy(tokenizer1);
free(config);
}
}
return result;
}