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 {
9 raw: bridge::OwnedHandle,
10}
11
12impl NetworkSet {
13 pub fn type_id() -> u64 {
15 unsafe { ffi::network_sets::sc_network_set_get_type_id() }
16 }
17
18 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 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>> {
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 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 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 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 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 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 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 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 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 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 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 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 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}