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