in source/src/AppCommon.c [271:304]
static VOID onIceCandidateHandler(UINT64 userData, PCHAR candidateJson)
{
STATUS retStatus = STATUS_SUCCESS;
PStreamingSession pStreamingSession = (PStreamingSession) userData;
SignalingMessage message;
CHK(pStreamingSession != NULL, STATUS_APP_COMMON_NULL_ARG);
if (candidateJson == NULL) {
DLOGD("ice candidate gathering finished");
ATOMIC_STORE_BOOL(&pStreamingSession->candidateGatheringDone, TRUE);
// if application is master and non-trickle ice, send answer now.
if (getAppSignalingRole(&pStreamingSession->pAppConfiguration->appSignaling) == SIGNALING_CHANNEL_ROLE_TYPE_MASTER &&
!pStreamingSession->remoteCanTrickleIce) {
CHK_STATUS((createAnswer(pStreamingSession->pPeerConnection, &pStreamingSession->answerSessionDescriptionInit)));
CHK_STATUS((respondWithAnswer(pStreamingSession)));
DLOGD("time taken to send answer %" PRIu64 " ms", (GETTIME() - pStreamingSession->offerReceiveTime) / HUNDREDS_OF_NANOS_IN_A_MILLISECOND);
}
} else if (pStreamingSession->remoteCanTrickleIce && ATOMIC_LOAD_BOOL(&pStreamingSession->peerIdReceived)) {
message.version = SIGNALING_MESSAGE_CURRENT_VERSION;
message.messageType = SIGNALING_MESSAGE_TYPE_ICE_CANDIDATE;
STRNCPY(message.peerClientId, pStreamingSession->peerId, MAX_SIGNALING_CLIENT_ID_LEN);
message.payloadLen = (UINT32) STRNLEN(candidateJson, MAX_SIGNALING_MESSAGE_LEN);
STRNCPY(message.payload, candidateJson, message.payloadLen);
message.correlationId[0] = '\0';
CHK_STATUS((sendAppSignalingMessage(&pStreamingSession->pAppConfiguration->appSignaling, &message)));
}
CleanUp:
CHK_LOG_ERR((retStatus));
}