in canary/webrtc-c/src/Peer.cpp [428:529]
STATUS Peer::handleSignalingMsg(PReceivedSignalingMessage pMsg)
{
auto handleOffer = [this](SignalingMessage& msg) -> STATUS {
STATUS retStatus = STATUS_SUCCESS;
RtcSessionDescriptionInit offerSDPInit, answerSDPInit;
NullableBool canTrickle;
UINT32 buffLen;
this->offerReceiveTimestamp = GETTIME();
if (!this->isMaster) {
DLOGW("Unexpected message SIGNALING_MESSAGE_TYPE_OFFER");
CHK(FALSE, retStatus);
}
if (receivedOffer.exchange(TRUE)) {
DLOGW("Offer already received, ignore new offer from client id %s", msg.peerClientId);
CHK(FALSE, retStatus);
}
MEMSET(&offerSDPInit, 0, SIZEOF(offerSDPInit));
MEMSET(&answerSDPInit, 0, SIZEOF(answerSDPInit));
CHK_STATUS(deserializeSessionDescriptionInit(msg.payload, msg.payloadLen, &offerSDPInit));
CHK_STATUS(setRemoteDescription(this->pPeerConnection, &offerSDPInit));
canTrickle = canTrickleIceCandidates(this->pPeerConnection);
/* cannot be null after setRemoteDescription */
CHECK(!NULLABLE_CHECK_EMPTY(canTrickle));
CHK_STATUS(createAnswer(this->pPeerConnection, &answerSDPInit));
CHK_STATUS(setLocalDescription(this->pPeerConnection, &answerSDPInit));
if (!canTrickle.value) {
CHK_STATUS(this->awaitIceGathering(&answerSDPInit));
}
msg.messageType = SIGNALING_MESSAGE_TYPE_ANSWER;
CHK_STATUS(serializeSessionDescriptionInit(&answerSDPInit, NULL, &buffLen));
CHK_STATUS(serializeSessionDescriptionInit(&answerSDPInit, msg.payload, &buffLen));
CHK_STATUS(this->send(&msg));
CleanUp:
return retStatus;
};
auto handleAnswer = [this](SignalingMessage& msg) -> STATUS {
STATUS retStatus = STATUS_SUCCESS;
RtcSessionDescriptionInit answerSDPInit;
if (this->isMaster) {
DLOGW("Unexpected message SIGNALING_MESSAGE_TYPE_ANSWER");
} else if (receivedAnswer.exchange(TRUE)) {
DLOGW("Offer already received, ignore new offer from client id %s", msg.peerClientId);
} else {
MEMSET(&answerSDPInit, 0x00, SIZEOF(RtcSessionDescriptionInit));
CHK_STATUS(deserializeSessionDescriptionInit(msg.payload, msg.payloadLen, &answerSDPInit));
CHK_STATUS(setRemoteDescription(this->pPeerConnection, &answerSDPInit));
}
CleanUp:
return retStatus;
};
auto handleICECandidate = [this](SignalingMessage& msg) -> STATUS {
STATUS retStatus = STATUS_SUCCESS;
RtcIceCandidateInit iceCandidate;
CHK_STATUS(deserializeRtcIceCandidateInit(msg.payload, msg.payloadLen, &iceCandidate));
CHK_STATUS(addIceCandidate(this->pPeerConnection, iceCandidate.candidate));
CleanUp:
CHK_LOG_ERR(retStatus);
return retStatus;
};
STATUS retStatus = STATUS_SUCCESS;
auto& msg = pMsg->signalingMessage;
CHK(!this->terminated.load(), retStatus);
switch (msg.messageType) {
case SIGNALING_MESSAGE_TYPE_OFFER:
CHK_STATUS(handleOffer(msg));
break;
case SIGNALING_MESSAGE_TYPE_ICE_CANDIDATE:
CHK_STATUS(handleICECandidate(msg));
break;
case SIGNALING_MESSAGE_TYPE_ANSWER:
CHK_STATUS(handleAnswer(msg));
break;
default:
DLOGW("Unknown message type %u", msg.messageType);
break;
}
CleanUp:
return retStatus;
}