const CFStringRef kPrefEnabled = CFSTR("DeviceEnabled");
#if NDEBUG
-bool VERBOSE = false;
+const bool VERBOSE = false;
#else
-bool VERBOSE = true;
+const bool VERBOSE = true;
#endif
+#define LOCATION_LINE(x) #x
+#define LOCATION(line) __FILE__ ":" LOCATION_LINE(line)
+
#define LOG(msg, ...) do { \
if (VERBOSE) { \
- printf(msg " [%s:%d]\n", ##__VA_ARGS__, __FILE__, __LINE__); \
+ printf("[" LOCATION(__LINE__) "] " msg "\n", ##__VA_ARGS__); \
} \
} while(0)
-#define ERROR(msg, ...) fprintf(stderr, msg " [%s:%d]\n", ##__VA_ARGS__, __FILE__, __LINE__)
+#define ERROR(msg, ...) fprintf(stderr, "[" LOCATION(__LINE__) "] " msg "\n", ##__VA_ARGS__)
class ScopedIOHIDManager {
public:
bool SynchronizePrefs() {
bool rv = CFPreferencesSynchronize(kPrefDomain, kCFPreferencesAnyUser,
- kCFPreferencesCurrentHost);
+ kCFPreferencesCurrentHost);
if (!rv) {
ERROR("Failed to CFPreferencesSynchronize");
}
return rv;
}
-io_iterator_t CreateIOServiceIterator() {
+bool CreateIOServiceIterator(io_iterator_t* iterator) {
CFMutableDictionaryRef matching_dict = IOServiceMatching("AppleIRController");
- io_iterator_t iterator;
kern_return_t kr = IOServiceGetMatchingServices(
- kIOMasterPortDefault, matching_dict, &iterator);
+ kIOMasterPortDefault, matching_dict, iterator);
if (kr != KERN_SUCCESS) {
ERROR("Failed to IOServiceGetMatchingServices: 0x%x", kr);
- return 0;
+ return false;
}
- return iterator;
+ return true;;
}
int HandleRead() {
- if (!SynchronizePrefs())
- return EXIT_FAILURE;
-
CFTypeRef user_prop = CFPreferencesCopyValue(kPrefEnabled, kPrefDomain,
kCFPreferencesAnyUser, kCFPreferencesCurrentHost);
printf("Userspace property value: %s\n", GetBooleanDescription(user_prop));
- io_iterator_t iterator = CreateIOServiceIterator();
- if (!iterator)
+ io_iterator_t iterator;
+ if (!CreateIOServiceIterator(&iterator))
return EXIT_FAILURE;
io_object_t service;
}
if (!did_find) {
- ERROR("Failed to match AppleIRController");
+ ERROR("Failed to match any AppleIRController");
return EXIT_FAILURE;
}
if (!SynchronizePrefs())
return EXIT_FAILURE;
- io_iterator_t iterator = CreateIOServiceIterator();
+ io_iterator_t iterator;
+ if (!CreateIOServiceIterator(&iterator))
+ return EXIT_FAILURE;
+
io_object_t service;
while ((service = IOIteratorNext(iterator))) {
io_name_t name;