ntdll: Implement SystemBatteryState for Mac OS.
Signed-off-by: Chip Davis <cdavis@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
7026b59b48
commit
eea87600d2
|
@ -38,6 +38,9 @@
|
|||
#endif
|
||||
#ifdef HAVE_IOKIT_IOKITLIB_H
|
||||
# include <IOKit/IOKitLib.h>
|
||||
# include <IOKit/pwr_mgt/IOPM.h>
|
||||
# include <IOKit/pwr_mgt/IOPMLib.h>
|
||||
# include <IOKit/ps/IOPowerSources.h>
|
||||
#endif
|
||||
|
||||
#include <ctype.h>
|
||||
|
@ -3291,6 +3294,73 @@ static NTSTATUS fill_battery_state(SYSTEM_BATTERY_STATE *bs)
|
|||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
#elif defined(HAVE_IOKIT_IOKITLIB_H)
|
||||
|
||||
static NTSTATUS fill_battery_state(SYSTEM_BATTERY_STATE *bs)
|
||||
{
|
||||
CFArrayRef batteries;
|
||||
CFDictionaryRef battery;
|
||||
CFNumberRef prop;
|
||||
uint32_t value, voltage;
|
||||
CFTimeInterval remain;
|
||||
|
||||
if (IOPMCopyBatteryInfo( kIOMasterPortDefault, &batteries ) != kIOReturnSuccess)
|
||||
return STATUS_ACCESS_DENIED;
|
||||
|
||||
if (CFArrayGetCount( batteries ) == 0)
|
||||
{
|
||||
/* Just assume we're on AC with no battery. */
|
||||
bs->AcOnLine = TRUE;
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
/* Just use the first battery. */
|
||||
battery = CFArrayGetValueAtIndex( batteries, 0 );
|
||||
|
||||
prop = CFDictionaryGetValue( battery, CFSTR(kIOBatteryFlagsKey) );
|
||||
CFNumberGetValue( prop, kCFNumberSInt32Type, &value );
|
||||
|
||||
if (value & kIOBatteryInstalled)
|
||||
bs->BatteryPresent = TRUE;
|
||||
else
|
||||
/* Since we are executing code, we must have AC power. */
|
||||
bs->AcOnLine = TRUE;
|
||||
if (value & kIOBatteryChargerConnect)
|
||||
{
|
||||
bs->AcOnLine = TRUE;
|
||||
if (value & kIOBatteryCharge)
|
||||
bs->Charging = TRUE;
|
||||
}
|
||||
else
|
||||
bs->Discharging = TRUE;
|
||||
|
||||
/* We'll need the voltage to be able to interpret the other values. */
|
||||
prop = CFDictionaryGetValue( battery, CFSTR(kIOBatteryVoltageKey) );
|
||||
CFNumberGetValue( prop, kCFNumberSInt32Type, &voltage );
|
||||
|
||||
prop = CFDictionaryGetValue( battery, CFSTR(kIOBatteryCapacityKey) );
|
||||
CFNumberGetValue( prop, kCFNumberSInt32Type, &value );
|
||||
bs->MaxCapacity = value * voltage;
|
||||
/* Apple uses "estimated time < 10:00" and "22%" for these, but we'll follow
|
||||
* Windows for now (5% and 33%). */
|
||||
bs->DefaultAlert1 = bs->MaxCapacity / 20;
|
||||
bs->DefaultAlert2 = bs->MaxCapacity / 3;
|
||||
|
||||
prop = CFDictionaryGetValue( battery, CFSTR(kIOBatteryCurrentChargeKey) );
|
||||
CFNumberGetValue( prop, kCFNumberSInt32Type, &value );
|
||||
bs->RemainingCapacity = value * voltage;
|
||||
|
||||
prop = CFDictionaryGetValue( battery, CFSTR(kIOBatteryAmperageKey) );
|
||||
CFNumberGetValue( prop, kCFNumberSInt32Type, &value );
|
||||
bs->Rate = value * voltage;
|
||||
|
||||
remain = IOPSGetTimeRemainingEstimate();
|
||||
if (remain != kIOPSTimeRemainingUnknown && remain != kIOPSTimeRemainingUnlimited)
|
||||
bs->EstimatedTime = (ULONG)remain;
|
||||
|
||||
CFRelease( batteries );
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
static NTSTATUS fill_battery_state(SYSTEM_BATTERY_STATE *bs)
|
||||
|
|
Loading…
Reference in New Issue