systemconfiguration/
preferences.rs1use crate::{bridge, error::Result, ffi, network_services::NetworkService, PropertyList};
2
3#[derive(Clone, Debug)]
4pub struct Preferences {
5 raw: bridge::OwnedHandle,
6}
7
8impl Preferences {
9 pub fn new(name: &str, prefs_id: Option<&str>) -> Result<Self> {
10 let name = bridge::cstring(name, "sc_preferences_create")?;
11 let prefs_id = bridge::optional_cstring(prefs_id, "sc_preferences_create")?;
12 let raw = unsafe {
13 ffi::preferences::sc_preferences_create(
14 name.as_ptr(),
15 prefs_id.as_ref().map_or(std::ptr::null(), |value| value.as_ptr()),
16 )
17 };
18 let raw = bridge::owned_handle_or_last("sc_preferences_create", raw)?;
19 Ok(Self { raw })
20 }
21
22 pub fn lock(&self, wait: bool) -> Result<()> {
23 let ok = unsafe { ffi::preferences::sc_preferences_lock(self.raw.as_ptr(), u8::from(wait)) };
24 bridge::bool_result("sc_preferences_lock", ok)
25 }
26
27 pub fn commit_changes(&self) -> Result<()> {
28 let ok = unsafe { ffi::preferences::sc_preferences_commit_changes(self.raw.as_ptr()) };
29 bridge::bool_result("sc_preferences_commit_changes", ok)
30 }
31
32 pub fn apply_changes(&self) -> Result<()> {
33 let ok = unsafe { ffi::preferences::sc_preferences_apply_changes(self.raw.as_ptr()) };
34 bridge::bool_result("sc_preferences_apply_changes", ok)
35 }
36
37 pub fn unlock(&self) -> Result<()> {
38 let ok = unsafe { ffi::preferences::sc_preferences_unlock(self.raw.as_ptr()) };
39 bridge::bool_result("sc_preferences_unlock", ok)
40 }
41
42 pub fn synchronize(&self) {
43 unsafe { ffi::preferences::sc_preferences_synchronize(self.raw.as_ptr()) };
44 }
45
46 pub fn signature(&self) -> Option<String> {
47 bridge::take_optional_string(unsafe { ffi::preferences::sc_preferences_copy_signature(self.raw.as_ptr()) })
48 }
49
50 pub fn copy_key_list(&self) -> Vec<String> {
51 bridge::take_string_array(unsafe { ffi::preferences::sc_preferences_copy_key_list(self.raw.as_ptr()) })
52 }
53
54 pub fn get_value(&self, key: &str) -> Result<Option<PropertyList>> {
55 let key = bridge::cstring(key, "sc_preferences_get_value")?;
56 let raw = unsafe { ffi::preferences::sc_preferences_get_value(self.raw.as_ptr(), key.as_ptr()) };
57 Ok(unsafe { bridge::OwnedHandle::from_raw(raw) }.map(PropertyList::from_owned_handle))
58 }
59
60 pub fn add_value(&self, key: &str, value: &PropertyList) -> Result<()> {
61 let key = bridge::cstring(key, "sc_preferences_add_value")?;
62 let ok = unsafe { ffi::preferences::sc_preferences_add_value(self.raw.as_ptr(), key.as_ptr(), value.as_ptr()) };
63 bridge::bool_result("sc_preferences_add_value", ok)
64 }
65
66 pub fn set_value(&self, key: &str, value: &PropertyList) -> Result<()> {
67 let key = bridge::cstring(key, "sc_preferences_set_value")?;
68 let ok = unsafe { ffi::preferences::sc_preferences_set_value(self.raw.as_ptr(), key.as_ptr(), value.as_ptr()) };
69 bridge::bool_result("sc_preferences_set_value", ok)
70 }
71
72 pub fn remove_value(&self, key: &str) -> Result<()> {
73 let key = bridge::cstring(key, "sc_preferences_remove_value")?;
74 let ok = unsafe { ffi::preferences::sc_preferences_remove_value(self.raw.as_ptr(), key.as_ptr()) };
75 bridge::bool_result("sc_preferences_remove_value", ok)
76 }
77
78 pub fn path_create_unique_child(&self, prefix: &str) -> Result<Option<String>> {
79 let prefix = bridge::cstring(prefix, "sc_preferences_path_create_unique_child")?;
80 Ok(bridge::take_optional_string(unsafe {
81 ffi::preferences::sc_preferences_path_create_unique_child(self.raw.as_ptr(), prefix.as_ptr())
82 }))
83 }
84
85 pub fn path_get_value(&self, path: &str) -> Result<Option<PropertyList>> {
86 let path = bridge::cstring(path, "sc_preferences_path_get_value")?;
87 let raw = unsafe { ffi::preferences::sc_preferences_path_get_value(self.raw.as_ptr(), path.as_ptr()) };
88 Ok(unsafe { bridge::OwnedHandle::from_raw(raw) }.map(PropertyList::from_owned_handle))
89 }
90
91 pub fn path_get_link(&self, path: &str) -> Result<Option<String>> {
92 let path = bridge::cstring(path, "sc_preferences_path_get_link")?;
93 Ok(bridge::take_optional_string(unsafe {
94 ffi::preferences::sc_preferences_path_get_link(self.raw.as_ptr(), path.as_ptr())
95 }))
96 }
97
98 pub fn path_set_value(&self, path: &str, value: &PropertyList) -> Result<()> {
99 let path = bridge::cstring(path, "sc_preferences_path_set_value")?;
100 let ok = unsafe {
101 ffi::preferences::sc_preferences_path_set_value(self.raw.as_ptr(), path.as_ptr(), value.as_ptr())
102 };
103 bridge::bool_result("sc_preferences_path_set_value", ok)
104 }
105
106 pub fn path_set_link(&self, path: &str, link: &str) -> Result<()> {
107 let path = bridge::cstring(path, "sc_preferences_path_set_link")?;
108 let link = bridge::cstring(link, "sc_preferences_path_set_link")?;
109 let ok = unsafe {
110 ffi::preferences::sc_preferences_path_set_link(self.raw.as_ptr(), path.as_ptr(), link.as_ptr())
111 };
112 bridge::bool_result("sc_preferences_path_set_link", ok)
113 }
114
115 pub fn path_remove_value(&self, path: &str) -> Result<()> {
116 let path = bridge::cstring(path, "sc_preferences_path_remove_value")?;
117 let ok = unsafe { ffi::preferences::sc_preferences_path_remove_value(self.raw.as_ptr(), path.as_ptr()) };
118 bridge::bool_result("sc_preferences_path_remove_value", ok)
119 }
120
121 pub fn set_computer_name(&self, name: Option<&str>) -> Result<()> {
122 let name = bridge::optional_cstring(name, "sc_preferences_set_computer_name")?;
123 let ok = unsafe {
124 ffi::preferences::sc_preferences_set_computer_name(
125 self.raw.as_ptr(),
126 name.as_ref().map_or(std::ptr::null(), |value| value.as_ptr()),
127 )
128 };
129 bridge::bool_result("sc_preferences_set_computer_name", ok)
130 }
131
132 pub fn set_local_host_name(&self, name: Option<&str>) -> Result<()> {
133 let name = bridge::optional_cstring(name, "sc_preferences_set_local_host_name")?;
134 let ok = unsafe {
135 ffi::preferences::sc_preferences_set_local_host_name(
136 self.raw.as_ptr(),
137 name.as_ref().map_or(std::ptr::null(), |value| value.as_ptr()),
138 )
139 };
140 bridge::bool_result("sc_preferences_set_local_host_name", ok)
141 }
142
143 pub fn network_services(&self) -> Vec<NetworkService> {
144 NetworkService::copy_all(self)
145 }
146
147 pub(crate) fn as_ptr(&self) -> bridge::RawHandle {
148 self.raw.as_ptr()
149 }
150}