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