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 copy_all(preferences: &Preferences) -> Vec<Self> {
17        let raw = unsafe { ffi::network_sets::sc_network_set_copy_all(preferences.as_ptr()) };
18        bridge::take_handle_array(raw, Self::from_owned_handle)
19    }
20
21    pub fn copy_current(preferences: &Preferences) -> Option<Self> {
22        unsafe { bridge::OwnedHandle::from_raw(ffi::network_sets::sc_network_set_copy_current(preferences.as_ptr())) }
23            .map(Self::from_owned_handle)
24    }
25
26    pub fn copy_services(&self) -> Vec<NetworkService> {
27        let raw = unsafe { ffi::network_sets::sc_network_set_copy_services(self.raw.as_ptr()) };
28        bridge::take_handle_array(raw, NetworkService::from_owned_handle)
29    }
30
31    pub fn name(&self) -> Option<String> {
32        bridge::take_optional_string(unsafe { ffi::network_sets::sc_network_set_copy_name(self.raw.as_ptr()) })
33    }
34
35    pub fn set_id(&self) -> Option<String> {
36        bridge::take_optional_string(unsafe { ffi::network_sets::sc_network_set_copy_set_id(self.raw.as_ptr()) })
37    }
38
39    pub fn service_order(&self) -> Vec<String> {
40        bridge::take_string_array(unsafe {
41            ffi::network_sets::sc_network_set_copy_service_order(self.raw.as_ptr())
42        })
43    }
44
45    pub fn contains_interface(&self, interface: &NetworkInterface) -> bool {
46        unsafe {
47            ffi::network_sets::sc_network_set_contains_interface(self.raw.as_ptr(), interface.as_ptr()) != 0
48        }
49    }
50
51    pub fn add_service(&self, service: &NetworkService) -> Result<()> {
52        let ok = unsafe { ffi::network_sets::sc_network_set_add_service(self.raw.as_ptr(), service.as_ptr()) };
53        bridge::bool_result("sc_network_set_add_service", ok)
54    }
55
56    pub fn remove(&self) -> Result<()> {
57        let ok = unsafe { ffi::network_sets::sc_network_set_remove(self.raw.as_ptr()) };
58        bridge::bool_result("sc_network_set_remove", ok)
59    }
60
61    pub fn remove_service(&self, service: &NetworkService) -> Result<()> {
62        let ok = unsafe {
63            ffi::network_sets::sc_network_set_remove_service(self.raw.as_ptr(), service.as_ptr())
64        };
65        bridge::bool_result("sc_network_set_remove_service", ok)
66    }
67
68    pub fn set_current(&self) -> Result<()> {
69        let ok = unsafe { ffi::network_sets::sc_network_set_set_current(self.raw.as_ptr()) };
70        bridge::bool_result("sc_network_set_set_current", ok)
71    }
72
73    pub fn set_name(&self, name: Option<&str>) -> Result<()> {
74        let name = bridge::optional_cstring(name, "sc_network_set_set_name")?;
75        let ok = unsafe {
76            ffi::network_sets::sc_network_set_set_name(
77                self.raw.as_ptr(),
78                name.as_ref().map_or(std::ptr::null(), |value| value.as_ptr()),
79            )
80        };
81        bridge::bool_result("sc_network_set_set_name", ok)
82    }
83
84    pub fn set_service_order<S: AsRef<str>>(&self, values: &[S]) -> Result<()> {
85        let values = bridge::CStringArray::new(values, "sc_network_set_set_service_order")?;
86        let ok = unsafe {
87            ffi::network_sets::sc_network_set_set_service_order(
88                self.raw.as_ptr(),
89                values.as_ptr(),
90                values.count(),
91            )
92        };
93        bridge::bool_result("sc_network_set_set_service_order", ok)
94    }
95
96    pub(crate) fn from_owned_handle(raw: bridge::OwnedHandle) -> Self {
97        Self { raw }
98    }
99}