Skip to main content

systemconfiguration/
network_sets.rs

1use crate::{
2    bridge,
3    error::Result,
4    ffi,
5    network_interface::NetworkInterface,
6    network_services::NetworkService,
7    preferences::Preferences,
8};
9
10#[derive(Clone, Debug)]
11pub struct NetworkSet {
12    raw: bridge::OwnedHandle,
13}
14
15impl NetworkSet {
16    pub fn type_id() -> u64 {
17        unsafe { ffi::network_sets::sc_network_set_get_type_id() }
18    }
19
20    pub fn copy_all(preferences: &Preferences) -> Vec<Self> {
21        let raw = unsafe { ffi::network_sets::sc_network_set_copy_all(preferences.as_ptr()) };
22        bridge::take_handle_array(raw, Self::from_owned_handle)
23    }
24
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    pub fn copy(preferences: &Preferences, set_id: &str) -> Result<Option<Self>> {
32        let set_id = bridge::cstring(set_id, "sc_network_set_copy")?;
33        let raw = unsafe { ffi::network_sets::sc_network_set_copy(preferences.as_ptr(), set_id.as_ptr()) };
34        Ok(unsafe { bridge::OwnedHandle::from_raw(raw) }.map(Self::from_owned_handle))
35    }
36
37    pub fn copy_current(preferences: &Preferences) -> Option<Self> {
38        unsafe { bridge::OwnedHandle::from_raw(ffi::network_sets::sc_network_set_copy_current(preferences.as_ptr())) }
39            .map(Self::from_owned_handle)
40    }
41
42    pub fn copy_services(&self) -> Vec<NetworkService> {
43        let raw = unsafe { ffi::network_sets::sc_network_set_copy_services(self.raw.as_ptr()) };
44        bridge::take_handle_array(raw, NetworkService::from_owned_handle)
45    }
46
47    pub fn name(&self) -> Option<String> {
48        bridge::take_optional_string(unsafe { ffi::network_sets::sc_network_set_copy_name(self.raw.as_ptr()) })
49    }
50
51    pub fn set_id(&self) -> Option<String> {
52        bridge::take_optional_string(unsafe { ffi::network_sets::sc_network_set_copy_set_id(self.raw.as_ptr()) })
53    }
54
55    pub fn service_order(&self) -> Vec<String> {
56        bridge::take_string_array(unsafe {
57            ffi::network_sets::sc_network_set_copy_service_order(self.raw.as_ptr())
58        })
59    }
60
61    pub fn contains_interface(&self, interface: &NetworkInterface) -> bool {
62        unsafe {
63            ffi::network_sets::sc_network_set_contains_interface(self.raw.as_ptr(), interface.as_ptr()) != 0
64        }
65    }
66
67    pub fn add_service(&self, service: &NetworkService) -> Result<()> {
68        let ok = unsafe { ffi::network_sets::sc_network_set_add_service(self.raw.as_ptr(), service.as_ptr()) };
69        bridge::bool_result("sc_network_set_add_service", ok)
70    }
71
72    pub fn remove(&self) -> Result<()> {
73        let ok = unsafe { ffi::network_sets::sc_network_set_remove(self.raw.as_ptr()) };
74        bridge::bool_result("sc_network_set_remove", ok)
75    }
76
77    pub fn remove_service(&self, service: &NetworkService) -> Result<()> {
78        let ok = unsafe {
79            ffi::network_sets::sc_network_set_remove_service(self.raw.as_ptr(), service.as_ptr())
80        };
81        bridge::bool_result("sc_network_set_remove_service", ok)
82    }
83
84    pub fn set_current(&self) -> Result<()> {
85        let ok = unsafe { ffi::network_sets::sc_network_set_set_current(self.raw.as_ptr()) };
86        bridge::bool_result("sc_network_set_set_current", ok)
87    }
88
89    pub fn set_name(&self, name: Option<&str>) -> Result<()> {
90        let name = bridge::optional_cstring(name, "sc_network_set_set_name")?;
91        let ok = unsafe {
92            ffi::network_sets::sc_network_set_set_name(
93                self.raw.as_ptr(),
94                name.as_ref().map_or(std::ptr::null(), |value| value.as_ptr()),
95            )
96        };
97        bridge::bool_result("sc_network_set_set_name", ok)
98    }
99
100    pub fn set_service_order<S: AsRef<str>>(&self, values: &[S]) -> Result<()> {
101        let values = bridge::CStringArray::new(values, "sc_network_set_set_service_order")?;
102        let ok = unsafe {
103            ffi::network_sets::sc_network_set_set_service_order(
104                self.raw.as_ptr(),
105                values.as_ptr(),
106                values.count(),
107            )
108        };
109        bridge::bool_result("sc_network_set_set_service_order", ok)
110    }
111
112    pub(crate) fn from_owned_handle(raw: bridge::OwnedHandle) -> Self {
113        Self { raw }
114    }
115}