webrtc_ice/candidate/
candidate_host.rs

1use portable_atomic::{AtomicU16, AtomicU8};
2
3use super::candidate_base::*;
4use super::*;
5use crate::rand::generate_cand_id;
6
7/// The config required to create a new `CandidateHost`.
8#[derive(Default)]
9pub struct CandidateHostConfig {
10    pub base_config: CandidateBaseConfig,
11
12    pub tcp_type: TcpType,
13}
14
15impl CandidateHostConfig {
16    /// Creates a new host candidate.
17    pub fn new_candidate_host(self) -> Result<CandidateBase> {
18        let mut candidate_id = self.base_config.candidate_id;
19        if candidate_id.is_empty() {
20            candidate_id = generate_cand_id();
21        }
22
23        let c = CandidateBase {
24            id: candidate_id,
25            address: self.base_config.address.clone(),
26            candidate_type: CandidateType::Host,
27            component: AtomicU16::new(self.base_config.component),
28            port: self.base_config.port,
29            tcp_type: self.tcp_type,
30            foundation_override: self.base_config.foundation,
31            priority_override: self.base_config.priority,
32            network: self.base_config.network,
33            network_type: AtomicU8::new(NetworkType::Udp4 as u8),
34            conn: self.base_config.conn,
35            ..CandidateBase::default()
36        };
37
38        if !self.base_config.address.ends_with(".local") {
39            let ip = self.base_config.address.parse()?;
40            c.set_ip(&ip)?;
41        };
42
43        Ok(c)
44    }
45}