NS_IMETHOD Run() { CSFLogInfo(logTag, "PeerConnectionObserverDispatch processing " "mCallState = %d (%s)", mCallState, mStateStr.c_str()); if (mCallState == SETLOCALDESCERROR || mCallState == SETREMOTEDESCERROR) { const std::vector<std::string> &errors = mPC->GetSdpParseErrors(); std::vector<std::string>::const_iterator i; for (i = errors.begin(); i != errors.end(); ++i) { mReason += " | SDP Parsing Error: " + *i; } if (errors.size()) { mCode = PeerConnectionImpl::kInvalidSessionDescription; } mPC->ClearSdpParseErrorMessages(); } if (mReason.length()) { CSFLogInfo(logTag, "Message contains error: %d: %s", mCode, mReason.c_str()); } switch (mCallState) { case CREATEOFFERSUCCESS: mObserver->OnCreateOfferSuccess(mSdpStr.c_str()); break; case CREATEANSWERSUCCESS: mObserver->OnCreateAnswerSuccess(mSdpStr.c_str()); break; case CREATEOFFERERROR: mObserver->OnCreateOfferError(mCode, mReason.c_str()); break; case CREATEANSWERERROR: mObserver->OnCreateAnswerError(mCode, mReason.c_str()); break; case SETLOCALDESCSUCCESS: // TODO: The SDP Parse error list should be copied out and sent up // to the Javascript layer before being cleared here. Even though // there was not a failure, it is possible that the SDP parse generated // warnings. The WebRTC spec does not currently have a mechanism for // providing non-fatal warnings. mPC->ClearSdpParseErrorMessages(); mObserver->OnSetLocalDescriptionSuccess(); break; case SETREMOTEDESCSUCCESS: // TODO: The SDP Parse error list should be copied out and sent up // to the Javascript layer before being cleared here. Even though // there was not a failure, it is possible that the SDP parse generated // warnings. The WebRTC spec does not currently have a mechanism for // providing non-fatal warnings. mPC->ClearSdpParseErrorMessages(); mObserver->OnSetRemoteDescriptionSuccess(); break; case SETLOCALDESCERROR: mObserver->OnSetLocalDescriptionError(mCode, mReason.c_str()); break; case SETREMOTEDESCERROR: mObserver->OnSetRemoteDescriptionError(mCode, mReason.c_str()); break; case ADDICECANDIDATE: mObserver->OnAddIceCandidateSuccess(); break; case ADDICECANDIDATEERROR: mObserver->OnAddIceCandidateError(mCode, mReason.c_str()); break; case REMOTESTREAMADD: { DOMMediaStream* stream = nullptr; if (!mRemoteStream) { CSFLogError(logTag, "%s: GetRemoteStream returned NULL", __FUNCTION__); } else { stream = mRemoteStream->GetMediaStream(); } if (!stream) { CSFLogError(logTag, "%s: GetMediaStream returned NULL", __FUNCTION__); } else { #ifdef MOZILLA_INTERNAL_API TracksAvailableCallback* tracksAvailableCallback = new TracksAvailableCallback(mRemoteStream->mTrackTypeHints, mObserver); stream->OnTracksAvailable(tracksAvailableCallback); #else mObserver->OnAddStream(stream); #endif } break; } case UPDATELOCALDESC: /* No action necessary */ break; default: CSFLogError(logTag, ": **** UNHANDLED CALL STATE : %d (%s)", mCallState, mStateStr.c_str()); break; } return NS_OK; }
NS_IMETHOD Run() { CSFLogInfo(logTag, "PeerConnectionObserverDispatch processing " "mCallState = %d (%s), mFsmState = %d (%s)", mCallState, mStateStr.c_str(), mFsmState, mFsmStateStr.c_str()); if (mCallState == SETLOCALDESCERROR || mCallState == SETREMOTEDESCERROR) { const std::vector<std::string> &errors = mPC->GetSdpParseErrors(); std::vector<std::string>::const_iterator i; for (i = errors.begin(); i != errors.end(); ++i) { mReason += " | SDP Parsing Error: " + *i; } if (errors.size()) { mCode = PeerConnectionImpl::kInvalidSessionDescription; } mPC->ClearSdpParseErrorMessages(); } if (mReason.length()) { CSFLogInfo(logTag, "Message contains error: %d: %s", mCode, mReason.c_str()); } /* * While the fsm_states_t (FSM_DEF_*) constants are a proper superset * of SignalingState, and the order in which the SignalingState values * appear matches the order they appear in fsm_states_t, their underlying * numeric representation is different. Hence, we need to perform an * offset calculation to map from one to the other. */ if (mFsmState >= FSMDEF_S_STABLE && mFsmState <= FSMDEF_S_CLOSED) { int offset = FSMDEF_S_STABLE - PeerConnectionImpl::kSignalingStable; mPC->SetSignalingState_m( static_cast<PeerConnectionImpl::SignalingState>(mFsmState - offset)); } else { CSFLogError(logTag, ": **** UNHANDLED SIGNALING STATE : %d (%s)", mFsmState, mFsmStateStr.c_str()); } switch (mCallState) { case CREATEOFFERSUCCESS: mObserver->OnCreateOfferSuccess(mSdpStr.c_str()); break; case CREATEANSWERSUCCESS: mObserver->OnCreateAnswerSuccess(mSdpStr.c_str()); break; case CREATEOFFERERROR: mObserver->OnCreateOfferError(mCode, mReason.c_str()); break; case CREATEANSWERERROR: mObserver->OnCreateAnswerError(mCode, mReason.c_str()); break; case SETLOCALDESCSUCCESS: // TODO: The SDP Parse error list should be copied out and sent up // to the Javascript layer before being cleared here. Even though // there was not a failure, it is possible that the SDP parse generated // warnings. The WebRTC spec does not currently have a mechanism for // providing non-fatal warnings. mPC->ClearSdpParseErrorMessages(); mObserver->OnSetLocalDescriptionSuccess(); break; case SETREMOTEDESCSUCCESS: // TODO: The SDP Parse error list should be copied out and sent up // to the Javascript layer before being cleared here. Even though // there was not a failure, it is possible that the SDP parse generated // warnings. The WebRTC spec does not currently have a mechanism for // providing non-fatal warnings. mPC->ClearSdpParseErrorMessages(); mObserver->OnSetRemoteDescriptionSuccess(); break; case SETLOCALDESCERROR: mObserver->OnSetLocalDescriptionError(mCode, mReason.c_str()); break; case SETREMOTEDESCERROR: mObserver->OnSetRemoteDescriptionError(mCode, mReason.c_str()); break; case ADDICECANDIDATE: mObserver->OnAddIceCandidateSuccess(); break; case ADDICECANDIDATEERROR: mObserver->OnAddIceCandidateError(mCode, mReason.c_str()); break; case REMOTESTREAMADD: { DOMMediaStream* stream = nullptr; if (!mRemoteStream) { CSFLogError(logTag, "%s: GetRemoteStream returned NULL", __FUNCTION__); } else { stream = mRemoteStream->GetMediaStream(); } if (!stream) { CSFLogError(logTag, "%s: GetMediaStream returned NULL", __FUNCTION__); } else { #ifdef MOZILLA_INTERNAL_API TracksAvailableCallback* tracksAvailableCallback = new TracksAvailableCallback(mRemoteStream->mTrackTypeHints, mObserver); stream->OnTracksAvailable(tracksAvailableCallback); #else mObserver->OnAddStream(stream); #endif } break; } case UPDATELOCALDESC: /* No action necessary */ break; default: CSFLogError(logTag, ": **** UNHANDLED CALL STATE : %d (%s)", mCallState, mStateStr.c_str()); break; } return NS_OK; }