Skip to main content

systemconfiguration/
network_services.rs

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