-void
-IOPowerWatcher::iopmcallback(void * param,
- IOPMConnection connection,
- IOPMConnectionMessageToken token,
- IOPMSystemPowerStateCapabilities capabilities)
-{
- IOPowerWatcher *me = (IOPowerWatcher *)param;
-
- secnotice("powerwatch", "powerstates");
- if (capabilities & kIOPMSystemPowerStateCapabilityDisk)
- secnotice("powerwatch", "disk");
- if (capabilities & kIOPMSystemPowerStateCapabilityNetwork)
- secnotice("powerwatch", "net");
- if (capabilities & kIOPMSystemPowerStateCapabilityAudio)
- secnotice("powerwatch", "audio");
- if (capabilities & kIOPMSystemPowerStateCapabilityVideo)
- secnotice("powerwatch", "video");
-
- /* if cpu and no display -> in DarkWake */
- if ((capabilities & (kIOPMSystemPowerStateCapabilityCPU|kIOPMSystemPowerStateCapabilityVideo)) == kIOPMSystemPowerStateCapabilityCPU) {
- secnotice("powerwatch", "enter DarkWake");
- me->mInDarkWake = true;
- } else if (me->mInDarkWake) {
- secnotice("powerwatch", "exit DarkWake");
- me->mInDarkWake = false;
- }
-
- (void)IOPMConnectionAcknowledgeEvent(connection, token);
-
- return;
-}
-
-
-void
-IOPowerWatcher::setupDarkWake()
-{
- IOReturn ret;
-
- mInDarkWake = false;
-
- ret = ::IOPMConnectionCreate(CFSTR("IOPowerWatcher"),
- kIOPMSystemPowerStateCapabilityDisk
- | kIOPMSystemPowerStateCapabilityNetwork
- | kIOPMSystemPowerStateCapabilityAudio
- | kIOPMSystemPowerStateCapabilityVideo,
- &mIOPMconn);
- if (ret == kIOReturnSuccess) {
- ret = ::IOPMConnectionSetNotification(mIOPMconn, this,
- (IOPMEventHandlerType)iopmcallback);
- if (ret == kIOReturnSuccess) {
- ::IOPMConnectionSetDispatchQueue(mIOPMconn, mIOPMqueue);
- }
- }
-
- mUserActiveHandle = IOPMScheduleUserActiveChangedNotification(mIOPMqueue, ^(bool active) {
- if (active) {
- mInDarkWake = false;
- }
- });
-
- dispatch_group_leave(mDarkWakeGroup);
-}
-