/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ use dom_struct::dom_struct; use js::rust::HandleObject; use crate::dom::bindings::codegen::Bindings::RTCIceCandidateBinding::{ RTCIceCandidateInit, RTCIceCandidateMethods, }; use crate::dom::bindings::error::{Error, Fallible}; use crate::dom::bindings::reflector::{Reflector, reflect_dom_object_with_proto}; use crate::dom::bindings::root::DomRoot; use crate::dom::bindings::str::DOMString; use crate::dom::window::Window; use crate::script_runtime::CanGc; #[dom_struct] pub(crate) struct RTCIceCandidate { reflector: Reflector, candidate: DOMString, sdp_m_id: Option<DOMString>, sdp_m_line_index: Option<u16>, username_fragment: Option<DOMString>, } impl RTCIceCandidate { pub(crate) fn new_inherited( candidate: DOMString, sdp_m_id: Option<DOMString>, sdp_m_line_index: Option<u16>, username_fragment: Option<DOMString>, ) -> RTCIceCandidate { RTCIceCandidate { reflector: Reflector::new(), candidate, sdp_m_id, sdp_m_line_index, username_fragment, } } pub(crate) fn new( window: &Window, candidate: DOMString, sdp_m_id: Option<DOMString>, sdp_m_line_index: Option<u16>, username_fragment: Option<DOMString>, can_gc: CanGc, ) -> DomRoot<RTCIceCandidate> { Self::new_with_proto( window, None, candidate, sdp_m_id, sdp_m_line_index, username_fragment, can_gc, ) } fn new_with_proto( window: &Window, proto: Option<HandleObject>, candidate: DOMString, sdp_m_id: Option<DOMString>, sdp_m_line_index: Option<u16>, username_fragment: Option<DOMString>, can_gc: CanGc, ) -> DomRoot<RTCIceCandidate> { reflect_dom_object_with_proto( Box::new(RTCIceCandidate::new_inherited( candidate, sdp_m_id, sdp_m_line_index, username_fragment, )), window, proto, can_gc, ) } } impl RTCIceCandidateMethods<crate::DomTypeHolder> for RTCIceCandidate { /// <https://w3c.github.io/webrtc-pc/#dom-rtcicecandidate-constructor> fn Constructor( window: &Window, proto: Option<HandleObject>, can_gc: CanGc, config: &RTCIceCandidateInit, ) -> Fallible<DomRoot<RTCIceCandidate>> { if config.sdpMid.is_none() && config.sdpMLineIndex.is_none() { return Err(Error::Type( "one of sdpMid and sdpMLineIndex must be set".to_string(), )); } Ok(RTCIceCandidate::new_with_proto( window, proto, config.candidate.clone(), config.sdpMid.clone(), config.sdpMLineIndex, config.usernameFragment.clone(), can_gc, )) } /// <https://w3c.github.io/webrtc-pc/#dom-rtcicecandidate-candidate> fn Candidate(&self) -> DOMString { self.candidate.clone() } /// <https://w3c.github.io/webrtc-pc/#dom-rtcicecandidate-sdpmid> fn GetSdpMid(&self) -> Option<DOMString> { self.sdp_m_id.clone() } /// <https://w3c.github.io/webrtc-pc/#dom-rtcicecandidate-sdpmlineindex> fn GetSdpMLineIndex(&self) -> Option<u16> { self.sdp_m_line_index } /// <https://w3c.github.io/webrtc-pc/#dom-rtcicecandidate-usernamefragment> fn GetUsernameFragment(&self) -> Option<DOMString> { self.username_fragment.clone() } /// <https://w3c.github.io/webrtc-pc/#dom-rtcicecandidate-tojson> fn ToJSON(&self) -> RTCIceCandidateInit { RTCIceCandidateInit { candidate: self.candidate.clone(), sdpMid: self.sdp_m_id.clone(), sdpMLineIndex: self.sdp_m_line_index, usernameFragment: self.username_fragment.clone(), } } }