use crate::sys::preferences::{SCPreferencesCreate, SCPreferencesGetTypeID, SCPreferencesRef};
use core_foundation::base::{CFAllocator, TCFType};
use core_foundation::string::CFString;
use std::ptr;
declare_TCFType! {
SCPreferences, SCPreferencesRef
}
impl_TCFType!(SCPreferences, SCPreferencesRef, SCPreferencesGetTypeID);
impl SCPreferences {
pub fn default(calling_process_name: &CFString) -> Self {
Self::new(None, calling_process_name, None)
}
pub fn group(calling_process_name: &CFString, prefs_id: &CFString) -> Self {
Self::new(None, calling_process_name, Some(prefs_id))
}
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);
}
}