in src/source/Signaling/LwsApiCalls.c [740:873]
STATUS describeChannelLws(PSignalingClient pSignalingClient, UINT64 time)
{
ENTERS();
STATUS retStatus = STATUS_SUCCESS;
UNUSED_PARAM(time);
PRequestInfo pRequestInfo = NULL;
CHAR url[MAX_URI_CHAR_LEN + 1];
CHAR paramsJson[MAX_JSON_PARAMETER_STRING_LEN];
PLwsCallInfo pLwsCallInfo = NULL;
PCHAR pResponseStr;
jsmn_parser parser;
jsmntok_t tokens[MAX_JSON_TOKEN_COUNT];
UINT32 i, strLen, resultLen;
UINT32 tokenCount;
UINT64 messageTtl;
BOOL jsonInChannelDescription = FALSE, jsonInMvConfiguration = FALSE;
CHK(pSignalingClient != NULL, STATUS_NULL_ARG);
// Create the API url
STRCPY(url, pSignalingClient->pChannelInfo->pControlPlaneUrl);
STRCAT(url, DESCRIBE_SIGNALING_CHANNEL_API_POSTFIX);
// Prepare the json params for the call
SNPRINTF(paramsJson, ARRAY_SIZE(paramsJson), DESCRIBE_CHANNEL_PARAM_JSON_TEMPLATE, pSignalingClient->pChannelInfo->pChannelName);
// Create the request info with the body
CHK_STATUS(createRequestInfo(url, paramsJson, pSignalingClient->pChannelInfo->pRegion, pSignalingClient->pChannelInfo->pCertPath, NULL, NULL,
SSL_CERTIFICATE_TYPE_NOT_SPECIFIED, pSignalingClient->pChannelInfo->pUserAgent,
SIGNALING_SERVICE_API_CALL_CONNECTION_TIMEOUT, SIGNALING_SERVICE_API_CALL_COMPLETION_TIMEOUT,
DEFAULT_LOW_SPEED_LIMIT, DEFAULT_LOW_SPEED_TIME_LIMIT, pSignalingClient->pAwsCredentials, &pRequestInfo));
// createRequestInfo does not have access to the getCurrentTime callback, this hook is used for tests.
if (pSignalingClient->signalingClientCallbacks.getCurrentTimeFn != NULL) {
pRequestInfo->currentTime = pSignalingClient->signalingClientCallbacks.getCurrentTimeFn(pSignalingClient->signalingClientCallbacks.customData);
}
checkAndCorrectForClockSkew(pSignalingClient, pRequestInfo);
CHK_STATUS(createLwsCallInfo(pSignalingClient, pRequestInfo, PROTOCOL_INDEX_HTTPS, &pLwsCallInfo));
// Make a blocking call
CHK_STATUS(lwsCompleteSync(pLwsCallInfo));
// Set the service call result
ATOMIC_STORE(&pSignalingClient->result, (SIZE_T) pLwsCallInfo->callInfo.callResult);
pResponseStr = pLwsCallInfo->callInfo.responseData;
resultLen = pLwsCallInfo->callInfo.responseDataLen;
// Early return if we have a non-success result
CHK((SERVICE_CALL_RESULT) ATOMIC_LOAD(&pSignalingClient->result) == SERVICE_CALL_RESULT_OK && resultLen != 0 && pResponseStr != NULL,
STATUS_SIGNALING_LWS_CALL_FAILED);
// Parse the response
jsmn_init(&parser);
tokenCount = jsmn_parse(&parser, pResponseStr, resultLen, tokens, SIZEOF(tokens) / SIZEOF(jsmntok_t));
CHK(tokenCount > 1, STATUS_INVALID_API_CALL_RETURN_JSON);
CHK(tokens[0].type == JSMN_OBJECT, STATUS_INVALID_API_CALL_RETURN_JSON);
MEMSET(&pSignalingClient->channelDescription, 0x00, SIZEOF(SignalingChannelDescription));
// Loop through the tokens and extract the stream description
for (i = 1; i < tokenCount; i++) {
if (!jsonInChannelDescription) {
if (compareJsonString(pResponseStr, &tokens[i], JSMN_STRING, (PCHAR) "ChannelInfo")) {
pSignalingClient->channelDescription.version = SIGNALING_CHANNEL_DESCRIPTION_CURRENT_VERSION;
jsonInChannelDescription = TRUE;
i++;
}
} else {
if (compareJsonString(pResponseStr, &tokens[i], JSMN_STRING, (PCHAR) "ChannelARN")) {
strLen = (UINT32) (tokens[i + 1].end - tokens[i + 1].start);
CHK(strLen <= MAX_ARN_LEN, STATUS_INVALID_API_CALL_RETURN_JSON);
STRNCPY(pSignalingClient->channelDescription.channelArn, pResponseStr + tokens[i + 1].start, strLen);
pSignalingClient->channelDescription.channelArn[MAX_ARN_LEN] = '\0';
i++;
} else if (compareJsonString(pResponseStr, &tokens[i], JSMN_STRING, (PCHAR) "ChannelName")) {
strLen = (UINT32) (tokens[i + 1].end - tokens[i + 1].start);
CHK(strLen <= MAX_CHANNEL_NAME_LEN, STATUS_INVALID_API_CALL_RETURN_JSON);
STRNCPY(pSignalingClient->channelDescription.channelName, pResponseStr + tokens[i + 1].start, strLen);
pSignalingClient->channelDescription.channelName[MAX_CHANNEL_NAME_LEN] = '\0';
i++;
} else if (compareJsonString(pResponseStr, &tokens[i], JSMN_STRING, (PCHAR) "Version")) {
strLen = (UINT32) (tokens[i + 1].end - tokens[i + 1].start);
CHK(strLen <= MAX_UPDATE_VERSION_LEN, STATUS_INVALID_API_CALL_RETURN_JSON);
STRNCPY(pSignalingClient->channelDescription.updateVersion, pResponseStr + tokens[i + 1].start, strLen);
pSignalingClient->channelDescription.updateVersion[MAX_UPDATE_VERSION_LEN] = '\0';
i++;
} else if (compareJsonString(pResponseStr, &tokens[i], JSMN_STRING, (PCHAR) "ChannelStatus")) {
strLen = (UINT32) (tokens[i + 1].end - tokens[i + 1].start);
CHK(strLen <= MAX_DESCRIBE_CHANNEL_STATUS_LEN, STATUS_INVALID_API_CALL_RETURN_JSON);
pSignalingClient->channelDescription.channelStatus = getChannelStatusFromString(pResponseStr + tokens[i + 1].start, strLen);
i++;
} else if (compareJsonString(pResponseStr, &tokens[i], JSMN_STRING, (PCHAR) "ChannelType")) {
strLen = (UINT32) (tokens[i + 1].end - tokens[i + 1].start);
CHK(strLen <= MAX_DESCRIBE_CHANNEL_TYPE_LEN, STATUS_INVALID_API_CALL_RETURN_JSON);
pSignalingClient->channelDescription.channelType = getChannelTypeFromString(pResponseStr + tokens[i + 1].start, strLen);
i++;
} else if (compareJsonString(pResponseStr, &tokens[i], JSMN_STRING, (PCHAR) "CreationTime")) {
// TODO: In the future parse out the creation time but currently we don't need it
i++;
} else {
if (!jsonInMvConfiguration) {
if (compareJsonString(pResponseStr, &tokens[i], JSMN_STRING, (PCHAR) "SingleMasterConfiguration")) {
jsonInMvConfiguration = TRUE;
i++;
}
} else {
if (compareJsonString(pResponseStr, &tokens[i], JSMN_STRING, (PCHAR) "MessageTtlSeconds")) {
CHK_STATUS(STRTOUI64(pResponseStr + tokens[i + 1].start, pResponseStr + tokens[i + 1].end, 10, &messageTtl));
// NOTE: Ttl value is in seconds
pSignalingClient->channelDescription.messageTtl = messageTtl * HUNDREDS_OF_NANOS_IN_A_SECOND;
i++;
}
}
}
}
}
// Perform some validation on the channel description
CHK(pSignalingClient->channelDescription.channelStatus != SIGNALING_CHANNEL_STATUS_DELETING, STATUS_SIGNALING_CHANNEL_BEING_DELETED);
CleanUp:
if (STATUS_FAILED(retStatus)) {
DLOGE("Call Failed with Status: 0x%08x", retStatus);
}
freeLwsCallInfo(&pLwsCallInfo);
LEAVES();
return retStatus;
}