Handle setting the property value.
authorRobert Sesek <rsesek@bluestatic.org>
Sun, 13 Mar 2016 22:53:56 +0000 (18:53 -0400)
committerRobert Sesek <rsesek@bluestatic.org>
Sun, 13 Mar 2016 22:53:56 +0000 (18:53 -0400)
apple-ir-control.cc

index b1028954f6c55a3a42ebbea86e54a5982161b9a2..fcb3f6343d27b5da8e5acba8c52209f0b2056a3f 100644 (file)
@@ -88,6 +88,15 @@ const char* GetBooleanDescription(CFTypeRef boolean) {
   return CFBooleanGetValue(static_cast<CFBooleanRef>(boolean)) ? "on" : "off";
 }
 
+bool SynchronizePrefs() {
+  bool rv = CFPreferencesSynchronize(kPrefDomain, kCFPreferencesAnyUser,
+          kCFPreferencesCurrentHost);
+  if (!rv) {
+    ERROR("Failed to CFPreferencesSynchronize");
+  }
+  return rv;
+}
+
 CFTypeRef GetUserPropertyValue() {
   return CFPreferencesCopyValue(kPrefEnabled, kPrefDomain,
       kCFPreferencesAnyUser, kCFPreferencesCurrentHost);
@@ -96,7 +105,8 @@ CFTypeRef GetUserPropertyValue() {
 io_iterator_t CreateIOServiceIterator() {
   CFMutableDictionaryRef matching_dict = IOServiceMatching("AppleIRController");
   io_iterator_t iterator;
-  kern_return_t kr = IOServiceGetMatchingServices(kIOMasterPortDefault, matching_dict, &iterator);
+  kern_return_t kr = IOServiceGetMatchingServices(
+      kIOMasterPortDefault, matching_dict, &iterator);
   if (kr != KERN_SUCCESS) {
     ERROR("Failed to IOServiceGetMatchingServices: 0x%x", kr);
     return 0;
@@ -105,6 +115,9 @@ io_iterator_t CreateIOServiceIterator() {
 }
 
 int HandleRead() {
+  if (!SynchronizePrefs())
+    return EXIT_FAILURE;
+
   CFTypeRef user_prop = GetUserPropertyValue();
   printf("Userspace property value: %s\n", GetBooleanDescription(user_prop));
 
@@ -151,7 +164,33 @@ int HandleRead() {
 }
 
 int HandleWrite(bool enable) {
-  return EXIT_SUCCESS;
+  const CFBooleanRef enabled_value = enable ? kCFBooleanTrue : kCFBooleanFalse;
+
+  CFPreferencesSetValue(kPrefEnabled, enabled_value, kPrefDomain,
+      kCFPreferencesAnyUser, kCFPreferencesCurrentHost);
+  if (!SynchronizePrefs())
+    return EXIT_FAILURE;
+
+  io_iterator_t iterator = CreateIOServiceIterator();
+  io_object_t service;
+  while ((service = IOIteratorNext(iterator))) {
+    io_name_t name;
+    kern_return_t kr = IORegistryEntryGetName(service, name);
+    if (kr != KERN_SUCCESS) {
+      ERROR("Failed to IORegistryEntryGetName: 0x%x", kr);
+      continue;
+    }
+
+    LOG("Setting property for %s to %d", name, enable);
+
+    kr = IORegistryEntrySetCFProperty(service, kPrefEnabled, enabled_value);
+    if (kr != KERN_SUCCESS) {
+      ERROR("Failed to IORegistryEntrySetCFProperty: 0x%x", kr);
+      continue;
+    }
+  }
+
+  return HandleRead();
 }
 
 int main(int argc, char* argv[]) {
@@ -163,9 +202,9 @@ int main(int argc, char* argv[]) {
   if (argc == 1) {
     return HandleRead();
   } else if (argc == 2) {
-    if (strcmp("on", argv[1])) {
+    if (strcmp("on", argv[1]) == 0) {
       return HandleWrite(true);
-    } else if (strcmp("off", argv[1])) {
+    } else if (strcmp("off", argv[1]) == 0) {
       return HandleWrite(false);
     }
   }