Skip to main content

systemconfiguration/
network_sets.rs

1use crate::{
2    bridge, error::Result, ffi, network_interface::NetworkInterface,
3    network_services::NetworkService, preferences::Preferences,
4};
5
6#[derive(Clone, Debug)]
7/// Wraps `SCNetworkSetRef`.
8pub struct NetworkSet {
9    raw: bridge::OwnedHandle,
10}
11
12impl NetworkSet {
13    /// Wraps `SCNetworkSetGetTypeID`.
14    pub fn type_id() -> u64 {
15        unsafe { ffi::network_sets::sc_network_set_get_type_id() }
16    }
17
18    /// Wraps `SCNetworkSetCopyAll`.
19    pub fn copy_all(preferences: &Preferences) -> Vec<Self> {
20        let raw = unsafe { ffi::network_sets::sc_network_set_copy_all(preferences.as_ptr()) };
21        bridge::take_handle_array(raw, Self::from_owned_handle)
22    }
23
24    /// Wraps `SCNetworkSetCreate`.
25    pub fn create(preferences: &Preferences) -> Result<Self> {
26        let raw = unsafe { ffi::network_sets::sc_network_set_create(preferences.as_ptr()) };
27        let raw = bridge::owned_handle_or_last("sc_network_set_create", raw)?;
28        Ok(Self { raw })
29    }
30
31    /// Wraps `SCNetworkSetCopy`.
32    pub fn copy(preferences: &Preferences, set_id: &str) -> Result<Option<Self>> {
33        let set_id = bridge::cstring(set_id, "sc_network_set_copy")?;
34        let raw = unsafe {
35            ffi::network_sets::sc_network_set_copy(preferences.as_ptr(), set_id.as_ptr())
36        };
37        Ok(unsafe { bridge::OwnedHandle::from_raw(raw) }.map(Self::from_owned_handle))
38    }
39
40    /// Wraps `SCNetworkSetCopyCurrent`.
41    pub fn copy_current(preferences: &Preferences) -> Option<Self> {
42        unsafe {
43            bridge::OwnedHandle::from_raw(ffi::network_sets::sc_network_set_copy_current(
44                preferences.as_ptr(),
45            ))
46        }
47        .map(Self::from_owned_handle)
48    }
49
50    /// Wraps `SCNetworkSetCopyServices`.
51    pub fn copy_services(&self) -> Vec<NetworkService> {
52        let raw = unsafe { ffi::network_sets::sc_network_set_copy_services(self.raw.as_ptr()) };
53        bridge::take_handle_array(raw, NetworkService::from_owned_handle)
54    }
55
56    /// Wraps `SCNetworkSetCopyName`.
57    pub fn name(&self) -> Option<String> {
58        bridge::take_optional_string(unsafe {
59            ffi::network_sets::sc_network_set_copy_name(self.raw.as_ptr())
60        })
61    }
62
63    /// Wraps `SCNetworkSetCopySetID`.
64    pub fn set_id(&self) -> Option<String> {
65        bridge::take_optional_string(unsafe {
66            ffi::network_sets::sc_network_set_copy_set_id(self.raw.as_ptr())
67        })
68    }
69
70    /// Wraps `SCNetworkSetCopyServiceOrder`.
71    pub fn service_order(&self) -> Vec<String> {
72        bridge::take_string_array(unsafe {
73            ffi::network_sets::sc_network_set_copy_service_order(self.raw.as_ptr())
74        })
75    }
76
77    /// Wraps `SCNetworkSetContainsInterface`.
78    pub fn contains_interface(&self, interface: &NetworkInterface) -> bool {
79        unsafe {
80            ffi::network_sets::sc_network_set_contains_interface(
81                self.raw.as_ptr(),
82                interface.as_ptr(),
83            ) != 0
84        }
85    }
86
87    /// Wraps `SCNetworkSetAddService`.
88    pub fn add_service(&self, service: &NetworkService) -> Result<()> {
89        let ok = unsafe {
90            ffi::network_sets::sc_network_set_add_service(self.raw.as_ptr(), service.as_ptr())
91        };
92        bridge::bool_result("sc_network_set_add_service", ok)
93    }
94
95    /// Wraps `SCNetworkSetRemove`.
96    pub fn remove(&self) -> Result<()> {
97        let ok = unsafe { ffi::network_sets::sc_network_set_remove(self.raw.as_ptr()) };
98        bridge::bool_result("sc_network_set_remove", ok)
99    }
100
101    /// Wraps `SCNetworkSetRemoveService`.
102    pub fn remove_service(&self, service: &NetworkService) -> Result<()> {
103        let ok = unsafe {
104            ffi::network_sets::sc_network_set_remove_service(self.raw.as_ptr(), service.as_ptr())
105        };
106        bridge::bool_result("sc_network_set_remove_service", ok)
107    }
108
109    /// Wraps `SCNetworkSetSetCurrent`.
110    pub fn set_current(&self) -> Result<()> {
111        let ok = unsafe { ffi::network_sets::sc_network_set_set_current(self.raw.as_ptr()) };
112        bridge::bool_result("sc_network_set_set_current", ok)
113    }
114
115    /// Wraps `SCNetworkSetSetName`.
116    pub fn set_name(&self, name: Option<&str>) -> Result<()> {
117        let name = bridge::optional_cstring(name, "sc_network_set_set_name")?;
118        let ok = unsafe {
119            ffi::network_sets::sc_network_set_set_name(
120                self.raw.as_ptr(),
121                name.as_ref()
122                    .map_or(std::ptr::null(), |value| value.as_ptr()),
123            )
124        };
125        bridge::bool_result("sc_network_set_set_name", ok)
126    }
127
128    /// Wraps `SCNetworkSetSetServiceOrder`.
129    pub fn set_service_order<S: AsRef<str>>(&self, values: &[S]) -> Result<()> {
130        let values = bridge::CStringArray::new(values, "sc_network_set_set_service_order")?;
131        let ok = unsafe {
132            ffi::network_sets::sc_network_set_set_service_order(
133                self.raw.as_ptr(),
134                values.as_ptr(),
135                values.count(),
136            )
137        };
138        bridge::bool_result("sc_network_set_set_service_order", ok)
139    }
140
141    pub(crate) fn from_owned_handle(raw: bridge::OwnedHandle) -> Self {
142        Self { raw }
143    }
144}