Skip to main content

systemconfiguration/
network_services.rs

1use crate::{
2    bridge, error::Result, ffi, network_interface::NetworkInterface,
3    network_protocol::NetworkProtocol, preferences::Preferences,
4};
5
6#[derive(Clone, Debug)]
7pub struct NetworkService {
8    raw: bridge::OwnedHandle,
9}
10
11impl NetworkService {
12    pub fn type_id() -> u64 {
13        unsafe { ffi::network_services::sc_network_service_get_type_id() }
14    }
15
16    pub fn copy_all(preferences: &Preferences) -> Vec<Self> {
17        let raw =
18            unsafe { ffi::network_services::sc_network_service_copy_all(preferences.as_ptr()) };
19        bridge::take_handle_array(raw, Self::from_owned_handle)
20    }
21
22    pub fn create(preferences: &Preferences, interface: &NetworkInterface) -> Result<Self> {
23        let raw = unsafe {
24            ffi::network_services::sc_network_service_create(
25                preferences.as_ptr(),
26                interface.as_ptr(),
27            )
28        };
29        let raw = bridge::owned_handle_or_last("sc_network_service_create", raw)?;
30        Ok(Self { raw })
31    }
32
33    pub fn copy(preferences: &Preferences, service_id: &str) -> Result<Option<Self>> {
34        let service_id = bridge::cstring(service_id, "sc_network_service_copy")?;
35        let raw = unsafe {
36            ffi::network_services::sc_network_service_copy(
37                preferences.as_ptr(),
38                service_id.as_ptr(),
39            )
40        };
41        Ok(unsafe { bridge::OwnedHandle::from_raw(raw) }.map(Self::from_owned_handle))
42    }
43
44    pub fn copy_protocols(&self) -> Vec<NetworkProtocol> {
45        let raw =
46            unsafe { ffi::network_services::sc_network_service_copy_protocols(self.raw.as_ptr()) };
47        bridge::take_handle_array(raw, NetworkProtocol::from_owned_handle)
48    }
49
50    pub fn copy_protocol(&self, protocol_type: &str) -> Result<Option<NetworkProtocol>> {
51        let protocol_type = bridge::cstring(protocol_type, "sc_network_service_copy_protocol")?;
52        let raw = unsafe {
53            ffi::network_services::sc_network_service_copy_protocol(
54                self.raw.as_ptr(),
55                protocol_type.as_ptr(),
56            )
57        };
58        Ok(unsafe { bridge::OwnedHandle::from_raw(raw) }.map(NetworkProtocol::from_owned_handle))
59    }
60
61    pub fn add_protocol_type(&self, protocol_type: &str) -> Result<()> {
62        let protocol_type = bridge::cstring(protocol_type, "sc_network_service_add_protocol_type")?;
63        let ok = unsafe {
64            ffi::network_services::sc_network_service_add_protocol_type(
65                self.raw.as_ptr(),
66                protocol_type.as_ptr(),
67            )
68        };
69        bridge::bool_result("sc_network_service_add_protocol_type", ok)
70    }
71
72    pub fn establish_default_configuration(&self) -> Result<()> {
73        let ok = unsafe {
74            ffi::network_services::sc_network_service_establish_default_configuration(
75                self.raw.as_ptr(),
76            )
77        };
78        bridge::bool_result("sc_network_service_establish_default_configuration", ok)
79    }
80
81    pub fn is_enabled(&self) -> bool {
82        unsafe { ffi::network_services::sc_network_service_get_enabled(self.raw.as_ptr()) != 0 }
83    }
84
85    pub fn interface(&self) -> Option<NetworkInterface> {
86        unsafe {
87            bridge::OwnedHandle::from_raw(ffi::network_services::sc_network_service_copy_interface(
88                self.raw.as_ptr(),
89            ))
90        }
91        .map(NetworkInterface::from_owned_handle)
92    }
93
94    pub fn name(&self) -> Result<Option<String>> {
95        Ok(bridge::take_optional_string(unsafe {
96            ffi::network_services::sc_network_service_copy_name(self.raw.as_ptr())
97        }))
98    }
99
100    pub fn service_id(&self) -> Result<Option<String>> {
101        Ok(bridge::take_optional_string(unsafe {
102            ffi::network_services::sc_network_service_copy_service_id(self.raw.as_ptr())
103        }))
104    }
105
106    pub fn remove(&self) -> Result<()> {
107        let ok = unsafe { ffi::network_services::sc_network_service_remove(self.raw.as_ptr()) };
108        bridge::bool_result("sc_network_service_remove", ok)
109    }
110
111    pub fn remove_protocol_type(&self, protocol_type: &str) -> Result<()> {
112        let protocol_type =
113            bridge::cstring(protocol_type, "sc_network_service_remove_protocol_type")?;
114        let ok = unsafe {
115            ffi::network_services::sc_network_service_remove_protocol_type(
116                self.raw.as_ptr(),
117                protocol_type.as_ptr(),
118            )
119        };
120        bridge::bool_result("sc_network_service_remove_protocol_type", ok)
121    }
122
123    pub fn set_enabled(&self, enabled: bool) -> Result<()> {
124        let ok = unsafe {
125            ffi::network_services::sc_network_service_set_enabled(
126                self.raw.as_ptr(),
127                u8::from(enabled),
128            )
129        };
130        bridge::bool_result("sc_network_service_set_enabled", ok)
131    }
132
133    pub fn set_name(&self, name: Option<&str>) -> Result<()> {
134        let name = bridge::optional_cstring(name, "sc_network_service_set_name")?;
135        let ok = unsafe {
136            ffi::network_services::sc_network_service_set_name(
137                self.raw.as_ptr(),
138                name.as_ref()
139                    .map_or(std::ptr::null(), |value| value.as_ptr()),
140            )
141        };
142        bridge::bool_result("sc_network_service_set_name", ok)
143    }
144
145    pub(crate) fn from_owned_handle(raw: bridge::OwnedHandle) -> Self {
146        Self { raw }
147    }
148
149    pub(crate) fn as_ptr(&self) -> bridge::RawHandle {
150        self.raw.as_ptr()
151    }
152}