diff --git a/system-configuration/src/lib.rs b/system-configuration/src/lib.rs index cf52342..87a1335 100644 --- a/system-configuration/src/lib.rs +++ b/system-configuration/src/lib.rs @@ -24,3 +24,4 @@ extern crate core_foundation; extern crate system_configuration_sys; pub mod dynamic_store; +pub mod preferences; diff --git a/system-configuration/src/preferences.rs b/system-configuration/src/preferences.rs new file mode 100644 index 0000000..8a042b1 --- /dev/null +++ b/system-configuration/src/preferences.rs @@ -0,0 +1,89 @@ +// Copyright 2017 Amagicom AB. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +//! Bindings to [`SCPreferences`]. +//! +//! See the examples directory for examples how to use this module. +//! +//! [`SCPreferences`]: https://developer.apple.com/documentation/systemconfiguration/scpreferences-ft8 + + +use core_foundation::base::{CFAllocator, TCFType}; +use core_foundation::string::CFString; + +pub use system_configuration_sys::preferences::*; + +use std::ptr; + + +declare_TCFType!{ + /// The handle to an open preferences session for accessing system configuration preferences. + SCPreferences, SCPreferencesRef +} + +impl_TCFType!(SCPreferences, SCPreferencesRef, SCPreferencesGetTypeID); + + +impl SCPreferences { + /// Initiates access to the default system preferences using the default allocator. + pub fn default(calling_process_name: &CFString) -> Self { + Self::new(None, calling_process_name, None) + } + + /// Initiates access to the given (`prefs_id`) group of configuration preferences using the + /// default allocator. To access the default system preferences, use the [`default`] + /// constructor. + /// + /// [`default`]: #method.default + pub fn group(calling_process_name: &CFString, prefs_id: &CFString) -> Self { + Self::new(None, calling_process_name, Some(prefs_id)) + } + + /// Initiates access to the per-system set of configuration preferences with a given + /// allocator and preference group to access. See the underlying [SCPreferencesCreate] function + /// documentation for details. Use the helper constructors [`default`] and [`group`] to easier + /// create an instance using the default allocator. + /// + /// [SCPreferencesCreate]: https://developer.apple.com/documentation/systemconfiguration/1516807-scpreferencescreate?language=objc + /// [`default`]: #method.default + /// [`group`]: #method.group + pub fn new( + allocator: Option<&CFAllocator>, + calling_process_name: &CFString, + prefs_id: Option<&CFString>, + ) -> Self { + let allocator_ref = match allocator { + Some(allocator) => allocator.as_concrete_TypeRef(), + None => ptr::null(), + }; + let prefs_id_ref = match prefs_id { + Some(prefs_id) => prefs_id.as_concrete_TypeRef(), + None => ptr::null(), + }; + + unsafe { + SCPreferences::wrap_under_create_rule(SCPreferencesCreate( + allocator_ref, + calling_process_name.as_concrete_TypeRef(), + prefs_id_ref, + )) + } + } +} + + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn retain_count() { + let preferences = SCPreferences::default(&CFString::new("test")); + assert_eq!(preferences.retain_count(), 1); + } +}