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