script/dom/webrtc/
rtcicecandidate.rs1use dom_struct::dom_struct;
6use js::rust::HandleObject;
7
8use crate::dom::bindings::codegen::Bindings::RTCIceCandidateBinding::{
9 RTCIceCandidateInit, RTCIceCandidateMethods,
10};
11use crate::dom::bindings::error::{Error, Fallible};
12use crate::dom::bindings::reflector::{Reflector, reflect_dom_object_with_proto};
13use crate::dom::bindings::root::DomRoot;
14use crate::dom::bindings::str::DOMString;
15use crate::dom::window::Window;
16use crate::script_runtime::CanGc;
17
18#[dom_struct]
19pub(crate) struct RTCIceCandidate {
20 reflector: Reflector,
21 candidate: DOMString,
22 sdp_m_id: Option<DOMString>,
23 sdp_m_line_index: Option<u16>,
24 username_fragment: Option<DOMString>,
25}
26
27impl RTCIceCandidate {
28 pub(crate) fn new_inherited(
29 candidate: DOMString,
30 sdp_m_id: Option<DOMString>,
31 sdp_m_line_index: Option<u16>,
32 username_fragment: Option<DOMString>,
33 ) -> RTCIceCandidate {
34 RTCIceCandidate {
35 reflector: Reflector::new(),
36 candidate,
37 sdp_m_id,
38 sdp_m_line_index,
39 username_fragment,
40 }
41 }
42
43 pub(crate) fn new(
44 window: &Window,
45 candidate: DOMString,
46 sdp_m_id: Option<DOMString>,
47 sdp_m_line_index: Option<u16>,
48 username_fragment: Option<DOMString>,
49 can_gc: CanGc,
50 ) -> DomRoot<RTCIceCandidate> {
51 Self::new_with_proto(
52 window,
53 None,
54 candidate,
55 sdp_m_id,
56 sdp_m_line_index,
57 username_fragment,
58 can_gc,
59 )
60 }
61
62 fn new_with_proto(
63 window: &Window,
64 proto: Option<HandleObject>,
65 candidate: DOMString,
66 sdp_m_id: Option<DOMString>,
67 sdp_m_line_index: Option<u16>,
68 username_fragment: Option<DOMString>,
69 can_gc: CanGc,
70 ) -> DomRoot<RTCIceCandidate> {
71 reflect_dom_object_with_proto(
72 Box::new(RTCIceCandidate::new_inherited(
73 candidate,
74 sdp_m_id,
75 sdp_m_line_index,
76 username_fragment,
77 )),
78 window,
79 proto,
80 can_gc,
81 )
82 }
83}
84
85impl RTCIceCandidateMethods<crate::DomTypeHolder> for RTCIceCandidate {
86 fn Constructor(
88 window: &Window,
89 proto: Option<HandleObject>,
90 can_gc: CanGc,
91 config: &RTCIceCandidateInit,
92 ) -> Fallible<DomRoot<RTCIceCandidate>> {
93 if config.sdpMid.is_none() && config.sdpMLineIndex.is_none() {
94 return Err(Error::Type(
95 "one of sdpMid and sdpMLineIndex must be set".to_string(),
96 ));
97 }
98 Ok(RTCIceCandidate::new_with_proto(
99 window,
100 proto,
101 config.candidate.clone(),
102 config.sdpMid.clone(),
103 config.sdpMLineIndex,
104 config.usernameFragment.clone(),
105 can_gc,
106 ))
107 }
108
109 fn Candidate(&self) -> DOMString {
111 self.candidate.clone()
112 }
113
114 fn GetSdpMid(&self) -> Option<DOMString> {
116 self.sdp_m_id.clone()
117 }
118
119 fn GetSdpMLineIndex(&self) -> Option<u16> {
121 self.sdp_m_line_index
122 }
123
124 fn GetUsernameFragment(&self) -> Option<DOMString> {
126 self.username_fragment.clone()
127 }
128
129 fn ToJSON(&self) -> RTCIceCandidateInit {
131 RTCIceCandidateInit {
132 candidate: self.candidate.clone(),
133 sdpMid: self.sdp_m_id.clone(),
134 sdpMLineIndex: self.sdp_m_line_index,
135 usernameFragment: self.username_fragment.clone(),
136 }
137 }
138}