From addb8b0bf1111cdc9da37b4cad225ee18b483716 Mon Sep 17 00:00:00 2001 From: luozijun Date: Sun, 11 Mar 2018 17:27:48 +0800 Subject: [PATCH 1/5] Add SCPreferences abstraction --- system-configuration/src/lib.rs | 1 + system-configuration/src/preferences.rs | 49 +++++++++++++++++++++++++ 2 files changed, 50 insertions(+) create mode 100644 system-configuration/src/preferences.rs 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..4aaa303 --- /dev/null +++ b/system-configuration/src/preferences.rs @@ -0,0 +1,49 @@ +// 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 + + +use core_foundation::base::CFAllocatorRef; +use core_foundation::base::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 per-system set of configuration preferences. + pub fn new(allocator: CFAllocatorRef, name: &str, prefs_id: Option<&str>) -> Self { + let prefs_id = match prefs_id { + Some(prefs_id) => CFString::new(prefs_id).as_concrete_TypeRef(), + None => ptr::null(), + }; + + unsafe { + SCPreferences::wrap_under_get_rule(SCPreferencesCreate( + allocator, + CFString::new(name).as_concrete_TypeRef(), + prefs_id, + )) + } + } +} From e88ebcebf15b71c2ee105cc9082181a9e84db574 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Linus=20F=C3=A4rnstrand?= Date: Tue, 13 Mar 2018 00:43:41 +0100 Subject: [PATCH 2/5] Add simplifying constructors to SCPreferences --- system-configuration/src/preferences.rs | 34 +++++++++++++++++++------ 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/system-configuration/src/preferences.rs b/system-configuration/src/preferences.rs index 4aaa303..d0caa36 100644 --- a/system-configuration/src/preferences.rs +++ b/system-configuration/src/preferences.rs @@ -13,8 +13,7 @@ //! [`SCPreferences`]: https://developer.apple.com/documentation/systemconfiguration/scpreferences -use core_foundation::base::CFAllocatorRef; -use core_foundation::base::TCFType; +use core_foundation::base::{CFAllocatorRef, TCFType}; use core_foundation::string::CFString; pub use system_configuration_sys::preferences::*; @@ -31,18 +30,37 @@ impl_TCFType!(SCPreferences, SCPreferencesRef, SCPreferencesGetTypeID); impl SCPreferences { - /// Initiates access to the per-system set of configuration preferences. - pub fn new(allocator: CFAllocatorRef, name: &str, prefs_id: Option<&str>) -> Self { - let prefs_id = match prefs_id { - Some(prefs_id) => CFString::new(prefs_id).as_concrete_TypeRef(), + /// Initiates access to the default system preferences using the default allocator. + pub fn default(calling_process_name: &CFString) -> Self { + Self::with_allocator(ptr::null(), 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::with_allocator(ptr::null(), 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. + pub fn with_allocator( + allocator: CFAllocatorRef, + calling_process_name: &CFString, + prefs_id: Option<&CFString>, + ) -> Self { + let prefs_id_ptr = match prefs_id { + Some(prefs_id) => prefs_id.as_concrete_TypeRef(), None => ptr::null(), }; unsafe { SCPreferences::wrap_under_get_rule(SCPreferencesCreate( allocator, - CFString::new(name).as_concrete_TypeRef(), - prefs_id, + calling_process_name.as_concrete_TypeRef(), + prefs_id_ptr, )) } } From 6ca71249ef8de7b682975d3cae83c5941ccf13e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Linus=20F=C3=A4rnstrand?= Date: Tue, 13 Mar 2018 08:15:44 +0100 Subject: [PATCH 3/5] Fix retain count bug and add test --- system-configuration/src/preferences.rs | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/system-configuration/src/preferences.rs b/system-configuration/src/preferences.rs index d0caa36..122be40 100644 --- a/system-configuration/src/preferences.rs +++ b/system-configuration/src/preferences.rs @@ -57,7 +57,7 @@ impl SCPreferences { }; unsafe { - SCPreferences::wrap_under_get_rule(SCPreferencesCreate( + SCPreferences::wrap_under_create_rule(SCPreferencesCreate( allocator, calling_process_name.as_concrete_TypeRef(), prefs_id_ptr, @@ -65,3 +65,15 @@ impl SCPreferences { } } } + + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn retain_count() { + let preferences = SCPreferences::default(&CFString::new("test")); + assert_eq!(preferences.retain_count(), 1); + } +} From e78ac6f1f367dae7fdb34730876fdf4721daeb81 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Linus=20F=C3=A4rnstrand?= Date: Tue, 13 Mar 2018 08:45:18 +0100 Subject: [PATCH 4/5] Improve SCPreferences documentation --- system-configuration/src/preferences.rs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/system-configuration/src/preferences.rs b/system-configuration/src/preferences.rs index 122be40..0c8ec68 100644 --- a/system-configuration/src/preferences.rs +++ b/system-configuration/src/preferences.rs @@ -10,7 +10,7 @@ //! //! See the examples directory for examples how to use this module. //! -//! [`SCPreferences`]: https://developer.apple.com/documentation/systemconfiguration/scpreferences +//! [`SCPreferences`]: https://developer.apple.com/documentation/systemconfiguration/scpreferences-ft8 use core_foundation::base::{CFAllocatorRef, TCFType}; @@ -45,7 +45,10 @@ impl SCPreferences { } /// Initiates access to the per-system set of configuration preferences with a given - /// allocator and preference group to access. + /// allocator and preference group to access. See the underlying [SCPreferencesCreate] function + /// documentation for details. + /// + /// [SCPreferencesCreate]: https://developer.apple.com/documentation/systemconfiguration/1516807-scpreferencescreate?language=objc pub fn with_allocator( allocator: CFAllocatorRef, calling_process_name: &CFString, From 55477ed1df848139167fbdae794729223ad17534 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Linus=20F=C3=A4rnstrand?= Date: Wed, 14 Mar 2018 11:50:47 +0100 Subject: [PATCH 5/5] Take higher level CFAllocator instead of CFAllocatorRef --- system-configuration/src/preferences.rs | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/system-configuration/src/preferences.rs b/system-configuration/src/preferences.rs index 0c8ec68..8a042b1 100644 --- a/system-configuration/src/preferences.rs +++ b/system-configuration/src/preferences.rs @@ -13,7 +13,7 @@ //! [`SCPreferences`]: https://developer.apple.com/documentation/systemconfiguration/scpreferences-ft8 -use core_foundation::base::{CFAllocatorRef, TCFType}; +use core_foundation::base::{CFAllocator, TCFType}; use core_foundation::string::CFString; pub use system_configuration_sys::preferences::*; @@ -32,7 +32,7 @@ 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::with_allocator(ptr::null(), calling_process_name, None) + Self::new(None, calling_process_name, None) } /// Initiates access to the given (`prefs_id`) group of configuration preferences using the @@ -41,29 +41,36 @@ impl SCPreferences { /// /// [`default`]: #method.default pub fn group(calling_process_name: &CFString, prefs_id: &CFString) -> Self { - Self::with_allocator(ptr::null(), calling_process_name, Some(prefs_id)) + 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. + /// 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 - pub fn with_allocator( - allocator: CFAllocatorRef, + /// [`default`]: #method.default + /// [`group`]: #method.group + pub fn new( + allocator: Option<&CFAllocator>, calling_process_name: &CFString, prefs_id: Option<&CFString>, ) -> Self { - let prefs_id_ptr = match prefs_id { + 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, + allocator_ref, calling_process_name.as_concrete_TypeRef(), - prefs_id_ptr, + prefs_id_ref, )) } }