systemconfiguration/
network_services.rs1use crate::{
2 bridge, error::Result, ffi, network_interface::NetworkInterface,
3 network_protocol::NetworkProtocol, preferences::Preferences,
4};
5
6#[derive(Clone, Debug)]
7pub struct NetworkService {
8 raw: bridge::OwnedHandle,
9}
10
11impl NetworkService {
12 pub fn type_id() -> u64 {
13 unsafe { ffi::network_services::sc_network_service_get_type_id() }
14 }
15
16 pub fn copy_all(preferences: &Preferences) -> Vec<Self> {
17 let raw =
18 unsafe { ffi::network_services::sc_network_service_copy_all(preferences.as_ptr()) };
19 bridge::take_handle_array(raw, Self::from_owned_handle)
20 }
21
22 pub fn create(preferences: &Preferences, interface: &NetworkInterface) -> Result<Self> {
23 let raw = unsafe {
24 ffi::network_services::sc_network_service_create(
25 preferences.as_ptr(),
26 interface.as_ptr(),
27 )
28 };
29 let raw = bridge::owned_handle_or_last("sc_network_service_create", raw)?;
30 Ok(Self { raw })
31 }
32
33 pub fn copy(preferences: &Preferences, service_id: &str) -> Result<Option<Self>> {
34 let service_id = bridge::cstring(service_id, "sc_network_service_copy")?;
35 let raw = unsafe {
36 ffi::network_services::sc_network_service_copy(
37 preferences.as_ptr(),
38 service_id.as_ptr(),
39 )
40 };
41 Ok(unsafe { bridge::OwnedHandle::from_raw(raw) }.map(Self::from_owned_handle))
42 }
43
44 pub fn copy_protocols(&self) -> Vec<NetworkProtocol> {
45 let raw =
46 unsafe { ffi::network_services::sc_network_service_copy_protocols(self.raw.as_ptr()) };
47 bridge::take_handle_array(raw, NetworkProtocol::from_owned_handle)
48 }
49
50 pub fn copy_protocol(&self, protocol_type: &str) -> Result<Option<NetworkProtocol>> {
51 let protocol_type = bridge::cstring(protocol_type, "sc_network_service_copy_protocol")?;
52 let raw = unsafe {
53 ffi::network_services::sc_network_service_copy_protocol(
54 self.raw.as_ptr(),
55 protocol_type.as_ptr(),
56 )
57 };
58 Ok(unsafe { bridge::OwnedHandle::from_raw(raw) }.map(NetworkProtocol::from_owned_handle))
59 }
60
61 pub fn add_protocol_type(&self, protocol_type: &str) -> Result<()> {
62 let protocol_type = bridge::cstring(protocol_type, "sc_network_service_add_protocol_type")?;
63 let ok = unsafe {
64 ffi::network_services::sc_network_service_add_protocol_type(
65 self.raw.as_ptr(),
66 protocol_type.as_ptr(),
67 )
68 };
69 bridge::bool_result("sc_network_service_add_protocol_type", ok)
70 }
71
72 pub fn establish_default_configuration(&self) -> Result<()> {
73 let ok = unsafe {
74 ffi::network_services::sc_network_service_establish_default_configuration(
75 self.raw.as_ptr(),
76 )
77 };
78 bridge::bool_result("sc_network_service_establish_default_configuration", ok)
79 }
80
81 pub fn is_enabled(&self) -> bool {
82 unsafe { ffi::network_services::sc_network_service_get_enabled(self.raw.as_ptr()) != 0 }
83 }
84
85 pub fn interface(&self) -> Option<NetworkInterface> {
86 unsafe {
87 bridge::OwnedHandle::from_raw(ffi::network_services::sc_network_service_copy_interface(
88 self.raw.as_ptr(),
89 ))
90 }
91 .map(NetworkInterface::from_owned_handle)
92 }
93
94 pub fn name(&self) -> Result<Option<String>> {
95 Ok(bridge::take_optional_string(unsafe {
96 ffi::network_services::sc_network_service_copy_name(self.raw.as_ptr())
97 }))
98 }
99
100 pub fn service_id(&self) -> Result<Option<String>> {
101 Ok(bridge::take_optional_string(unsafe {
102 ffi::network_services::sc_network_service_copy_service_id(self.raw.as_ptr())
103 }))
104 }
105
106 pub fn remove(&self) -> Result<()> {
107 let ok = unsafe { ffi::network_services::sc_network_service_remove(self.raw.as_ptr()) };
108 bridge::bool_result("sc_network_service_remove", ok)
109 }
110
111 pub fn remove_protocol_type(&self, protocol_type: &str) -> Result<()> {
112 let protocol_type =
113 bridge::cstring(protocol_type, "sc_network_service_remove_protocol_type")?;
114 let ok = unsafe {
115 ffi::network_services::sc_network_service_remove_protocol_type(
116 self.raw.as_ptr(),
117 protocol_type.as_ptr(),
118 )
119 };
120 bridge::bool_result("sc_network_service_remove_protocol_type", ok)
121 }
122
123 pub fn set_enabled(&self, enabled: bool) -> Result<()> {
124 let ok = unsafe {
125 ffi::network_services::sc_network_service_set_enabled(
126 self.raw.as_ptr(),
127 u8::from(enabled),
128 )
129 };
130 bridge::bool_result("sc_network_service_set_enabled", ok)
131 }
132
133 pub fn set_name(&self, name: Option<&str>) -> Result<()> {
134 let name = bridge::optional_cstring(name, "sc_network_service_set_name")?;
135 let ok = unsafe {
136 ffi::network_services::sc_network_service_set_name(
137 self.raw.as_ptr(),
138 name.as_ref()
139 .map_or(std::ptr::null(), |value| value.as_ptr()),
140 )
141 };
142 bridge::bool_result("sc_network_service_set_name", ok)
143 }
144
145 pub(crate) fn from_owned_handle(raw: bridge::OwnedHandle) -> Self {
146 Self { raw }
147 }
148
149 pub(crate) fn as_ptr(&self) -> bridge::RawHandle {
150 self.raw.as_ptr()
151 }
152}