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