in iothub_client/src/iothub_client_core_ll.c [2284:2414]
IOTHUB_CLIENT_RESULT IoTHubClientCore_LL_SetOption(IOTHUB_CLIENT_CORE_LL_HANDLE iotHubClientHandle, const char* optionName, const void* value)
{
IOTHUB_CLIENT_RESULT result;
if (
(iotHubClientHandle == NULL) ||
(optionName == NULL) ||
(value == NULL)
)
{
result = IOTHUB_CLIENT_INVALID_ARG;
LogError("invalid argument (NULL)");
}
else
{
IOTHUB_CLIENT_CORE_LL_HANDLE_DATA* handleData = (IOTHUB_CLIENT_CORE_LL_HANDLE_DATA*)iotHubClientHandle;
if (strcmp(optionName, OPTION_MESSAGE_TIMEOUT) == 0)
{
/*this is an option handled by IoTHubClientCore_LL*/
handleData->currentMessageTimeout = *(const tickcounter_ms_t*)value;
result = IOTHUB_CLIENT_OK;
}
else if (strcmp(optionName, OPTION_PRODUCT_INFO) == 0)
{
if (handleData->product_info != NULL)
{
STRING_delete(handleData->product_info);
handleData->product_info = NULL;
}
PLATFORM_INFO_OPTION supportedPlatformInfo;
if (handleData->IoTHubTransport_GetSupportedPlatformInfo(handleData->transportHandle, &supportedPlatformInfo) != 0)
{
LogError("IoTHubTransport_GetSupportedPlatformInfo failed");
result = IOTHUB_CLIENT_ERROR;
}
else if ((handleData->product_info = make_product_info((const char*)value, supportedPlatformInfo)) == NULL)
{
LogError("STRING_construct_sprintf failed");
result = IOTHUB_CLIENT_ERROR;
}
else
{
result = IOTHUB_CLIENT_OK;
}
}
else if (strcmp(optionName, OPTION_DIAGNOSTIC_SAMPLING_PERCENTAGE) == 0)
{
uint32_t percentage = *(uint32_t*)value;
if (percentage > 100)
{
LogError("The value of diag_sampling_percentage is out of range [0, 100]: %u", percentage);
result = IOTHUB_CLIENT_ERROR;
}
else
{
handleData->diagnostic_setting.diagSamplingPercentage = percentage;
handleData->diagnostic_setting.currentMessageNumber = 0;
result = IOTHUB_CLIENT_OK;
}
}
else if ((strcmp(optionName, OPTION_BLOB_UPLOAD_TIMEOUT_SECS) == 0) ||
(strcmp(optionName, OPTION_CURL_VERBOSE) == 0) ||
(strcmp(optionName, OPTION_NETWORK_INTERFACE_UPLOAD_TO_BLOB) == 0) ||
(strcmp(optionName, OPTION_BLOB_UPLOAD_TLS_RENEGOTIATION) == 0))
{
#ifndef DONT_USE_UPLOADTOBLOB
// This option just gets passed down into IoTHubClientCore_LL_UploadToBlob
result = IoTHubClient_LL_UploadToBlob_SetOption(handleData->uploadToBlobHandle, optionName, value);
if(result != IOTHUB_CLIENT_OK)
{
LogError("unable to IoTHubClientCore_LL_UploadToBlob_SetOption, result=%d", result);
}
#else
LogError("%s option being set with DONT_USE_UPLOADTOBLOB compiler switch", optionName);
result = IOTHUB_CLIENT_ERROR;
#endif /*DONT_USE_UPLOADTOBLOB*/
}
// OPTION_SAS_TOKEN_REFRESH_TIME is, but may be updated in the future
// if this becomes necessary
else if (strcmp(optionName, OPTION_SAS_TOKEN_REFRESH_TIME) == 0 || strcmp(optionName, OPTION_SAS_TOKEN_LIFETIME) == 0)
{
// API compat: while IoTHubClient_Auth_Set_SasToken_Expiry accepts uint64_t, we cannot change the public API.
if (IoTHubClient_Auth_Set_SasToken_Expiry(handleData->authorization_module, (uint64_t)(*(size_t*)value)) != 0)
{
LogError("Failed setting the Token Expiry time");
result = IOTHUB_CLIENT_ERROR;
}
else
{
result = IOTHUB_CLIENT_OK;
}
}
else if (strcmp(optionName, OPTION_MODEL_ID) == 0)
{
if (handleData->model_id != NULL)
{
LogError("DT ModelId already specified.");
result = IOTHUB_CLIENT_ERROR;
}
else if ((handleData->model_id = STRING_construct((const char*)value)) == NULL)
{
LogError("STRING_construct failed");
result = IOTHUB_CLIENT_ERROR;
}
else
{
result = IOTHUB_CLIENT_OK;
}
}
else
{
// This section is unusual for SetOption calls because it attempts to pass unhandled options
// to two downstream targets (IoTHubTransport_SetOption and IoTHubClientCore_LL_UploadToBlob_SetOption) instead of one.
result = handleData->IoTHubTransport_SetOption(handleData->transportHandle, optionName, value);
if(result != IOTHUB_CLIENT_OK)
{
LogError("unable to IoTHubTransport_SetOption");
}
#ifndef DONT_USE_UPLOADTOBLOB
else
{
(void)IoTHubClient_LL_UploadToBlob_SetOption(handleData->uploadToBlobHandle, optionName, value);
}
#endif /*DONT_USE_UPLOADTOBLOB*/
}
}
return result;
}