in src/source/Signaling/FileCache.c [27:115]
STATUS deserializeSignalingCacheEntries(PCHAR cachedFileContent, UINT64 fileSize, PSignalingFileCacheEntry pSignalingFileCacheEntryList,
PUINT32 pEntryCount, PCHAR cacheFilePath)
{
ENTERS();
STATUS retStatus = STATUS_SUCCESS;
UINT32 listSize = 0, entryCount = 0, tokenCount = 0, remainingSize, tokenSize = 0;
PCHAR pCurrent = NULL, nextToken = NULL, nextLine = NULL;
CHK(cachedFileContent != NULL && pSignalingFileCacheEntryList != NULL && pEntryCount != NULL && cacheFilePath != NULL, STATUS_NULL_ARG);
listSize = *pEntryCount;
pCurrent = cachedFileContent;
remainingSize = (UINT32) fileSize;
/* detect end of file */
while (remainingSize > MAX_SIGNALING_CACHE_ENTRY_TIMESTAMP_STR_LEN) {
nextLine = STRCHR(pCurrent, '\n');
while ((nextToken = STRCHR(pCurrent, ',')) != NULL && nextToken < nextLine) {
switch (tokenCount % 7) {
case 0:
STRNCPY(pSignalingFileCacheEntryList[entryCount].channelName, pCurrent, nextToken - pCurrent);
break;
case 1:
STRNCPY(pSignalingFileCacheEntryList[entryCount].region, pCurrent, nextToken - pCurrent);
if (STRNCMP(pCurrent, SIGNALING_FILE_CACHE_ROLE_TYPE_MASTER_STR, STRLEN(SIGNALING_FILE_CACHE_ROLE_TYPE_MASTER_STR)) == 0) {
pSignalingFileCacheEntryList[entryCount].role = SIGNALING_CHANNEL_ROLE_TYPE_MASTER;
} else if (STRNCMP(pCurrent, SIGNALING_FILE_CACHE_ROLE_TYPE_VIEWER_STR, STRLEN(SIGNALING_FILE_CACHE_ROLE_TYPE_VIEWER_STR)) == 0) {
pSignalingFileCacheEntryList[entryCount].role = SIGNALING_CHANNEL_ROLE_TYPE_VIEWER;
} else {
CHK_WARN(FALSE, STATUS_INVALID_ARG, "Unknown role type");
}
break;
case 2:
STRNCPY(pSignalingFileCacheEntryList[entryCount].region, pCurrent, nextToken - pCurrent);
break;
case 3:
STRNCPY(pSignalingFileCacheEntryList[entryCount].channelArn, pCurrent, nextToken - pCurrent);
break;
case 4:
STRNCPY(pSignalingFileCacheEntryList[entryCount].httpsEndpoint, pCurrent, nextToken - pCurrent);
break;
case 5:
STRNCPY(pSignalingFileCacheEntryList[entryCount].wssEndpoint, pCurrent, nextToken - pCurrent);
break;
default:
break;
}
tokenCount++;
tokenSize = (UINT32) (nextToken - pCurrent);
pCurrent += tokenSize + 1;
remainingSize -= tokenSize + 1;
}
/* time stamp element is always 10 characters */
CHK_STATUS(STRTOUI64(pCurrent, pCurrent + MAX_SIGNALING_CACHE_ENTRY_TIMESTAMP_STR_LEN, 10,
&pSignalingFileCacheEntryList[entryCount].creationTsEpochSeconds));
tokenCount++;
pCurrent += MAX_SIGNALING_CACHE_ENTRY_TIMESTAMP_STR_LEN + 1;
remainingSize -= MAX_SIGNALING_CACHE_ENTRY_TIMESTAMP_STR_LEN + 1;
CHK(!IS_EMPTY_STRING(pSignalingFileCacheEntryList[entryCount].channelArn) &&
!IS_EMPTY_STRING(pSignalingFileCacheEntryList[entryCount].channelName) &&
!IS_EMPTY_STRING(pSignalingFileCacheEntryList[entryCount].region) &&
!IS_EMPTY_STRING(pSignalingFileCacheEntryList[entryCount].httpsEndpoint) &&
!IS_EMPTY_STRING(pSignalingFileCacheEntryList[entryCount].wssEndpoint),
STATUS_INVALID_ARG);
entryCount++;
/* Stop parsing once we reach cache entry limit */
if (entryCount == listSize) {
break;
}
}
CleanUp:
if (pEntryCount != NULL) {
*pEntryCount = entryCount;
}
CHK_LOG_ERR(retStatus);
if (STATUS_FAILED(retStatus) && cacheFilePath != NULL) {
FREMOVE(cacheFilePath);
}
LEAVES();
return retStatus;
}