InterfaceNamerControlPrefs.c [plain text]
#include <TargetConditionals.h>
#include <SystemConfiguration/SystemConfiguration.h>
#include <SystemConfiguration/SCPrivate.h>
#include <SystemConfiguration/scprefs_observer.h>
#include "InterfaceNamerControlPrefs.h"
#define kInterfaceNamerControlPrefsIDStr "com.apple.InterfaceNamer.control.plist"
#define kInterfaceNamerControlPrefsID CFSTR(kInterfaceNamerControlPrefsIDStr)
#define kAllowNewInterfaces CFSTR("AllowNewInterfaces")
static SCPreferencesRef S_prefs;
static InterfaceNamerControlPrefsCallBack S_callback;
static SCPreferencesRef
InterfaceNamerControlPrefsGet(void)
{
if (S_prefs == NULL) {
InterfaceNamerControlPrefsInit(NULL, NULL);
}
return (S_prefs);
}
static void
prefs_changed(void * arg)
{
#pragma unused(arg)
if (S_callback != NULL) {
(*S_callback)(S_prefs);
}
return;
}
#if TARGET_OS_IPHONE
#define kManagedPrefsDirStr "/Library/Managed Preferences/mobile/"
#define kInterfaceNamerControlManagedPrefsID CFSTR(kManagedPrefsDirStr \
kInterfaceNamerControlPrefsIDStr)
static SCPreferencesRef S_managed_prefs;
static SCPreferencesRef
InterfaceNamerControlManagedPrefsGet(void)
{
if (S_managed_prefs == NULL) {
CFMutableDictionaryRef options;
options = CFDictionaryCreateMutable(NULL,
0,
&kCFTypeDictionaryKeyCallBacks,
&kCFTypeDictionaryValueCallBacks);
CFDictionarySetValue(options, kSCPreferencesOptionRemoveWhenEmpty, kCFBooleanTrue);
S_managed_prefs = SCPreferencesCreateWithOptions(NULL,
CFSTR("InterfaceNamerControlPrefs"),
kInterfaceNamerControlManagedPrefsID,
NULL,
options);
CFRelease(options);
}
return (S_managed_prefs);
}
static void
enable_prefs_observer(CFRunLoopRef runloop)
{
CFRunLoopSourceContext context;
dispatch_queue_t queue;
CFRunLoopSourceRef source;
memset(&context, 0, sizeof(context));
context.perform = prefs_changed;
source = CFRunLoopSourceCreate(kCFAllocatorDefault, 0, &context);
CFRunLoopAddSource(runloop, source, kCFRunLoopCommonModes);
queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
_scprefs_observer_watch(scprefs_observer_type_global,
kInterfaceNamerControlPrefsIDStr,
queue,
^{
if (source != NULL) {
CFRunLoopSourceSignal(source);
if (runloop != NULL) {
CFRunLoopWakeUp(runloop);
}
};
});
return;
}
#else
static void
enable_prefs_observer(CFRunLoopRef runloop)
{
#pragma unused(runloop)
return;
}
#endif
static void
InterfaceNamerControlPrefsChanged(SCPreferencesRef prefs,
SCPreferencesNotification type,
void *info)
{
#pragma unused(prefs)
#pragma unused(type)
#pragma unused(info)
prefs_changed(NULL);
return;
}
__private_extern__ SCPreferencesRef
InterfaceNamerControlPrefsInit(CFRunLoopRef runloop,
InterfaceNamerControlPrefsCallBack callback)
{
CFMutableDictionaryRef options;
options = CFDictionaryCreateMutable(NULL,
0,
&kCFTypeDictionaryKeyCallBacks,
&kCFTypeDictionaryValueCallBacks);
CFDictionarySetValue(options, kSCPreferencesOptionRemoveWhenEmpty, kCFBooleanTrue);
S_prefs = SCPreferencesCreateWithOptions(NULL,
CFSTR("InterfaceNamerControlPrefs"),
kInterfaceNamerControlPrefsID,
NULL,
options);
CFRelease(options);
if ((runloop != NULL) && (callback != NULL)) {
S_callback = callback;
if (!SCPreferencesSetCallback(S_prefs, InterfaceNamerControlPrefsChanged, NULL)) {
SC_log(LOG_NOTICE, "SCPreferencesSetCallBack() failed: %s", SCErrorString(SCError()));
goto done;
}
if (!SCPreferencesScheduleWithRunLoop(S_prefs, runloop, kCFRunLoopCommonModes)) {
SC_log(LOG_NOTICE, "SCPreferencesScheduleWithRunLoop() failed: %s", SCErrorString(SCError()));
(void) SCPreferencesSetCallback(S_prefs, NULL, NULL);
}
enable_prefs_observer(runloop);
}
done :
return (S_prefs);
}
static Boolean
InterfaceNamerControlPrefsSave(void)
{
Boolean saved = FALSE;
if (S_prefs != NULL) {
saved = SCPreferencesCommitChanges(S_prefs);
SCPreferencesSynchronize(S_prefs);
}
return (saved);
}
static CFBooleanRef
prefs_get_boolean(CFStringRef key)
{
CFBooleanRef b = NULL;
SCPreferencesRef prefs;
#if TARGET_OS_IPHONE
prefs = InterfaceNamerControlManagedPrefsGet();
if (prefs != NULL) {
b = SCPreferencesGetValue(prefs, key);
b = isA_CFBoolean(b);
if (b != NULL) {
return (b);
}
}
#endif
prefs = InterfaceNamerControlPrefsGet();
if (prefs != NULL) {
b = SCPreferencesGetValue(prefs, key);
b = isA_CFBoolean(b);
}
return (b);
}
static void
prefs_set_boolean(CFStringRef key, CFBooleanRef b)
{
SCPreferencesRef prefs;
prefs = InterfaceNamerControlPrefsGet();
if (prefs != NULL) {
if (isA_CFBoolean(b) == NULL) {
SCPreferencesRemoveValue(prefs, key);
}
else {
SCPreferencesSetValue(prefs, key, b);
}
}
return;
}
static void
InterfaceNamerControlPrefsRefresh(void)
{
if (S_prefs != NULL) {
SCPreferencesSynchronize(S_prefs);
}
#if TARGET_OS_IPHONE
if (S_managed_prefs != NULL) {
SCPreferencesSynchronize(S_managed_prefs);
}
#endif
return;
}
__private_extern__ Boolean
InterfaceNamerControlPrefsAllowNewInterfaces(void)
{
CFBooleanRef b;
Boolean allow = FALSE;
b = prefs_get_boolean(kAllowNewInterfaces);
if (b != NULL) {
allow = CFBooleanGetValue(b);
}
InterfaceNamerControlPrefsRefresh();
return (allow);
}
__private_extern__ Boolean
InterfaceNamerControlPrefsSetAllowNewInterfaces(Boolean allow)
{
if (allow) {
prefs_set_boolean(kAllowNewInterfaces, kCFBooleanTrue);
} else {
prefs_set_boolean(kAllowNewInterfaces, NULL);
}
return (InterfaceNamerControlPrefsSave());
}