static VOID onIceCandidateHandler()

in main/AppCommon.c [275:309]


static VOID onIceCandidateHandler(UINT64 userData, PCHAR candidateJson)
{
    STATUS retStatus = STATUS_SUCCESS;
    PStreamingSession pStreamingSession = (PStreamingSession) userData;
    PSignalingMessage pMessage = NULL;

    CHK(pStreamingSession != NULL, STATUS_APP_COMMON_NULL_ARG);
    CHK(NULL != (pMessage = (PSignalingMessage) MEMCALLOC(1, SIZEOF(SignalingMessage))), STATUS_APP_COMMON_NOT_ENOUGH_MEMORY);

    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)) {
        pMessage->version = SIGNALING_MESSAGE_CURRENT_VERSION;
        pMessage->messageType = SIGNALING_MESSAGE_TYPE_ICE_CANDIDATE;
        STRNCPY(pMessage->peerClientId, pStreamingSession->peerId, MAX_SIGNALING_CLIENT_ID_LEN);
        pMessage->payloadLen = (UINT32) STRNLEN(candidateJson, MAX_SIGNALING_MESSAGE_LEN);
        STRNCPY(pMessage->payload, candidateJson, pMessage->payloadLen);
        pMessage->correlationId[0] = '\0';
        CHK_STATUS((sendAppSignalingMessage(&pStreamingSession->pAppConfiguration->appSignaling, pMessage)));
    }

CleanUp:
    SAFE_MEMFREE(pMessage);
    CHK_LOG_ERR((retStatus));
}