Skip to main content

systemconfiguration/
preferences.rs

1use 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}