systemconfiguration/
network_sets.rs1use 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}