1/* 2 * PMDynamicStore.c 3 * PowerManagement 4 * 5 * Created by Ethan Bold on 1/13/11. 6 * Copyright 2011 __MyCompanyName__. All rights reserved. 7 * 8 */ 9 10#include <SystemConfiguration/SystemConfiguration.h> 11#include <SystemConfiguration/SCValidation.h> 12#include <SystemConfiguration/SCDynamicStorePrivate.h> 13#include <CoreFoundation/CoreFoundation.h> 14#include "PMStore.h" 15 16 17/* TBD 18typedef (void *)PMStoreKeysChangedCallBack(void *param, CFArrayRef keys); 19__private_extern__ void PMStoreRequestCallBack(void *param, (PMStoreKeysChangedCallBack *)callback, CFArrayRef keys); 20*/ 21 22static CFMutableDictionaryRef gPMStore = NULL; 23SCDynamicStoreRef gSCDynamicStore = NULL; 24 25static void PMDynamicStoreDisconnectCallBack(SCDynamicStoreRef store, void *info __unused); 26 27/* dynamicStoreNotifyCallBack 28 * defined in pmconfigd.c 29 */ 30__private_extern__ void dynamicStoreNotifyCallBack( 31 SCDynamicStoreRef store, 32 CFArrayRef changedKeys, 33 void *info); 34 35 36void PMStoreLoad() 37{ 38 CFRunLoopSourceRef _storeRLS = NULL; 39 40 gPMStore = CFDictionaryCreateMutable(0, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); 41 42 gSCDynamicStore = SCDynamicStoreCreate(0, CFSTR("powerd"), dynamicStoreNotifyCallBack, NULL); 43 44 if (gSCDynamicStore) { 45 _storeRLS = SCDynamicStoreCreateRunLoopSource(0, gSCDynamicStore, 0); 46 } 47 48 if (_storeRLS) { 49 CFRunLoopAddSource(CFRunLoopGetCurrent(), _storeRLS, kCFRunLoopDefaultMode); 50 CFRelease(_storeRLS); 51 } 52 53 SCDynamicStoreSetDisconnectCallBack(gSCDynamicStore, PMDynamicStoreDisconnectCallBack); 54} 55 56 57bool PMStoreSetValue(CFStringRef key, CFTypeRef value) 58{ 59 CFTypeRef lastValue = NULL; 60 61 if (!key || !value || !gPMStore) 62 return false; 63 64 lastValue = CFDictionaryGetValue(gPMStore, key); 65 66 if (lastValue && CFEqual(lastValue, value)) { 67 return true; 68 } 69 70 CFDictionarySetValue(gPMStore, key, value); 71 return SCDynamicStoreSetValue(gSCDynamicStore, key, value); 72} 73 74bool PMStoreRemoveValue(CFStringRef key) 75{ 76 if (key) { 77 CFDictionaryRemoveValue(gPMStore, key); 78 return SCDynamicStoreRemoveValue(gSCDynamicStore, key); 79 } 80 81 return false; 82} 83 84static void PMDynamicStoreDisconnectCallBack( 85 SCDynamicStoreRef store, 86 void *info __unused) 87{ 88 assert (store == gSCDynamicStore); 89 90 SCDynamicStoreSetMultiple(gSCDynamicStore, gPMStore, NULL, NULL); 91} 92