public void BackButton() { switch (_buttonStage) { case ButtonStages.HostSendToNetworking: _buttonStage = ButtonStages.HostPaste; break; case ButtonStages.ClientSendToNetworking: _buttonStage = ButtonStages.ClientPaste; break; } StartCoroutine(WaitForNetworking()); }
private IEnumerator WaitForNetworking() { var textEditor = new TextEditor(); var timeoutCounter = 0; RTCSessionDescription description; switch (_buttonStage) { case ButtonStages.Error: // Error _buttonStage = ButtonStages.Error; _buttonText.text = "ERROR."; _subtext.fontSize = 70; _subtext.text = "Something failed in establishing network connection.\n" + "Please verify that you had a valid SDP address copied."; break; case ButtonStages.DeterminingHostOrClient: // Determining host or client HostToggleStartingText.SetActive(false); HostToggleNotice.SetActive(true); InitializeWebRtc(); // True = Host. False = Client. var hostToggle = HostToggleObject.GetComponent <Toggle>().isOn; HostToggleNotice.GetComponent <Text>().text += hostToggle ? "Host." : "Client."; HostToggleObject.SetActive(false); if (hostToggle) { goto case ButtonStages.HostPaste; } goto case ButtonStages.Client; case ButtonStages.Client: // Client _subtext.text = "Please wait. Generating SDP address."; _buttonText.text = "Save SDP address to clipboard."; var clientOffer = StartClientOffer(); while (clientOffer.keepWaiting) { // Cant place in function, has goto and a yield return. if (_subtext.text.Count(c => c == '.') > 6) { _subtext.text = "Please wait. Generating SDP address"; timeoutCounter++; } if (timeoutCounter > 4) { goto case ButtonStages.Error; } _subtext.text += "."; yield return(new WaitForSeconds(1f)); } description = clientOffer.Desc; yield return(_peerConnection.SetLocalDescription(ref description)); _subtext.text = "Unique SDP protocol address received.\n" + "Please paste it in Discord for the host to copy."; textEditor.text = JsonUtility.ToJson(description).Compress(); textEditor.SelectAll(); textEditor.Copy(); _buttonStage = ButtonStages.ClientPaste; break; case ButtonStages.ClientPaste: GoBackObject.SetActive(false); _subtext.fontSize = 70; _subtext.text = "Please copy unique SDP address from Discord from host.\n" + "Make sure not to include any whitespace or external characters."; _buttonText.text = "Submit SDP address from clipboard."; _buttonStage = ButtonStages.ClientVerify; break; case ButtonStages.ClientVerify: GoBackObject.SetActive(true); _buttonText.text = "Continue."; textEditor.Paste(); _iceCompressed = textEditor.text.Trim(); _subtext.fontSize = 25; _subtext.text = "Given SDP Address:\n" + _iceCompressed; _buttonStage = ButtonStages.ClientSendToNetworking; break; case ButtonStages.ClientSendToNetworking: GoBackObject.SetActive(false); _buttonText.text = "Attempting to connect."; description = JsonUtility.FromJson <RTCSessionDescription>(_iceCompressed.Decompress()); yield return(_peerConnection.SetRemoteDescription(ref description)); _buttonText.text = _peerConnection.ConnectionState.ToString(); _buttonStage = ButtonStages.NotReady; break; case ButtonStages.HostPaste: // Host GoBackObject.SetActive(false); _subtext.fontSize = 70; _subtext.text = "Please copy unique SDP address from Discord from client.\n" + "Make sure not to include any whitespace or external characters."; _buttonText.text = "Submit SDP address from clipboard."; _buttonStage = ButtonStages.HostVerify; break; case ButtonStages.HostVerify: GoBackObject.SetActive(true); _buttonText.text = "Continue."; textEditor.Paste(); _iceCompressed = textEditor.text.Trim(); _subtext.fontSize = 25; _subtext.text = "Given SDP Address:\n" + _iceCompressed; _buttonStage = ButtonStages.HostSendToNetworking; break; case ButtonStages.HostSendToNetworking: // Host paste SDP address. GoBackObject.SetActive(false); _subtext.fontSize = 70; _subtext.text = "Please wait. Generating SDP address."; _buttonText.text = "Save SDP address to clipboard."; description = JsonUtility.FromJson <RTCSessionDescription>(_iceCompressed.Decompress()); yield return(_peerConnection.SetRemoteDescription(ref description)); RTCAnswerOptions answerOption = default; var hostAnswer = _peerConnection.CreateAnswer(ref answerOption); while (hostAnswer.keepWaiting) { // Cant place in function, has goto and a yield return. if (_subtext.text.Count(c => c == '.') > 6) { _subtext.text = "Please wait. Generating SDP address"; timeoutCounter++; } if (timeoutCounter > 4) { goto case ButtonStages.Error; } _subtext.text += "."; yield return(new WaitForSeconds(1f)); } _subtext.text = "Unique SDP protocol address received.\n" + "Please paste it in Discord for the client to copy."; description = hostAnswer.Desc; yield return(_peerConnection.SetLocalDescription(ref description)); textEditor.text = JsonUtility.ToJson(description).Compress(); textEditor.SelectAll(); textEditor.Copy(); _buttonStage = ButtonStages.NotReady; break; case ButtonStages.NotReady: break; } if (_buttonStage != ButtonStages.Error && _buttonStage != ButtonStages.NotReady) { _networkButton.interactable = true; } yield return(null); }