1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
// Copyright 2017 Amagicom AB.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, 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 crate::sys::preferences::{SCPreferencesCreate, SCPreferencesGetTypeID, SCPreferencesRef};
use core_foundation::base::{CFAllocator, TCFType};
use core_foundation::string::CFString;
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);
}
}