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