use crate::host::administered::Administered;
use core_foundation::base::{CFType, TCFType};
use core_foundation::string::CFString;
use core_foundation_sys::preferences::{CFPreferencesAppValueIsForced, CFPreferencesCopyAppValue};
pub(super) fn forced(domain: &str, key: &str) -> Administered {
let (key, application) = (CFString::new(key), CFString::new(domain));
let is_forced = || {
unsafe {
CFPreferencesAppValueIsForced(
key.as_concrete_TypeRef(),
application.as_concrete_TypeRef(),
) != 0
}
};
if !is_forced() {
return Administered::Unset;
}
let copied = unsafe {
CFPreferencesCopyAppValue(key.as_concrete_TypeRef(), application.as_concrete_TypeRef())
};
if copied.is_null() {
return Administered::Unset;
}
let value = unsafe { CFType::wrap_under_create_rule(copied) };
if !is_forced() {
return Administered::Unset;
}
match value.downcast::<CFString>() {
Some(text) => Administered::Set(text.to_string()),
None => Administered::Unreadable("is forced, and is not a string".into()),
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn nothing_forced_is_unset() {
assert_eq!(
forced(
"com.usepitboard.Pitboard.never-managed",
"config_toml_base64"
),
Administered::Unset
);
}
}