IOPMRepeatingPower.c [plain text]
#include <mach/mach_init.h>
#include <mach/mach_port.h>
#include <mach/vm_map.h>
#include <servers/bootstrap.h>
#include "IOSystemConfiguration.h"
#include <CoreFoundation/CoreFoundation.h>
#include <IOKit/IOKitLib.h>
#include <IOKit/pwr_mgt/IOPMLib.h>
#include <IOKit/pwr_mgt/IOPMLibPrivate.h>
#include "powermanagement_mig.h"
#include "powermanagement.h"
__private_extern__ IOReturn _copyPMServerObject(int selector, int assertionID, CFTypeRef *objectOut);
IOReturn _pm_connect(mach_port_t *newConnection);
IOReturn _pm_disconnect(mach_port_t connection);
IOReturn IOPMScheduleRepeatingPowerEvent(CFDictionaryRef events)
{
IOReturn ret = kIOReturnError;
CFDataRef flatPackage = NULL;
kern_return_t rc = KERN_SUCCESS;
mach_port_t pm_server = MACH_PORT_NULL;
if(!isA_CFDictionary(events)) return kIOReturnBadArgument;
if(kIOReturnSuccess != _pm_connect(&pm_server)) {
ret = kIOReturnInternalError;
goto exit;
}
flatPackage = CFPropertyListCreateData(0, events,
kCFPropertyListBinaryFormat_v1_0, 0, NULL );
if ( !flatPackage ) {
ret = kIOReturnBadArgument;
goto exit;
}
rc = io_pm_schedule_repeat_event(pm_server, (vm_offset_t)CFDataGetBytePtr(flatPackage),
CFDataGetLength(flatPackage), 1, &ret);
if (rc != KERN_SUCCESS)
ret = kIOReturnInternalError;
exit:
if (MACH_PORT_NULL != pm_server) {
_pm_disconnect(pm_server);
}
if(flatPackage) CFRelease(flatPackage);
return ret;
}
CFDictionaryRef IOPMCopyRepeatingPowerEvents(void)
{
CFMutableDictionaryRef return_dict = NULL;
_copyPMServerObject(kIOPMPowerEventsMIGCopyRepeatEvents, 0, (CFTypeRef *)&return_dict);
return return_dict;
}
IOReturn IOPMCancelAllRepeatingPowerEvents(void)
{
IOReturn ret = kIOReturnError;
kern_return_t rc = KERN_SUCCESS;
mach_port_t pm_server = MACH_PORT_NULL;
if(kIOReturnSuccess != _pm_connect(&pm_server)) {
ret = kIOReturnInternalError;
goto exit;
}
rc = io_pm_cancel_repeat_events(pm_server, &ret);
if (rc != KERN_SUCCESS)
ret = kIOReturnInternalError;
if (MACH_PORT_NULL != pm_server) {
_pm_disconnect(pm_server);
}
exit:
return ret;
}