From 0eb76e9636bc83ce19d76fe7a12a2a6565407098 Mon Sep 17 00:00:00 2001 From: Carter Li Date: Sat, 20 Jan 2024 21:38:24 +0800 Subject: [PATCH] Battery (macOS): improve manufacture info detection --- src/detection/battery/battery_apple.c | 33 +++++++++++++++++-------- src/detection/battery/battery_windows.c | 6 ++--- 2 files changed, 26 insertions(+), 13 deletions(-) diff --git a/src/detection/battery/battery_apple.c b/src/detection/battery/battery_apple.c index 8aafed206..a77cf6369 100644 --- a/src/detection/battery/battery_apple.c +++ b/src/detection/battery/battery_apple.c @@ -44,10 +44,12 @@ const char* ffDetectBattery(FFBatteryOptions* options, FFlist* results) ffCfDictGetString(properties, CFSTR(kIOPMDeviceNameKey), &battery->modelName); ffCfDictGetString(properties, CFSTR(kIOPMPSSerialKey), &battery->serial); + ffCfDictGetString(properties, CFSTR(kIOPMPSManufacturerKey), &battery->manufacturer); if (!ffCfDictGetBool(properties, CFSTR("built-in"), &boolValue) && boolValue) { - ffStrbufAppendS(&battery->manufacturer, "Apple Inc."); + if (!battery->manufacturer.length) + ffStrbufAppendS(&battery->manufacturer, "Apple Inc."); ffStrbufAppendS(&battery->technology, "Lithium"); if (!battery->modelName.length) ffStrbufAppendS(&battery->modelName, "Built-in"); @@ -68,17 +70,28 @@ const char* ffDetectBattery(FFBatteryOptions* options, FFlist* results) ffStrbufTrimRight(&battery->status, ' '); ffStrbufTrimRight(&battery->status, ','); - CFDictionaryRef batteryData; - if (ffCfDictGetDict(properties, CFSTR("BatteryData"), &batteryData) == NULL) + int sbdsManufactureDate = 0; + if (ffCfDictGetInt(properties, CFSTR(kIOPMPSManufactureDateKey), &sbdsManufactureDate) == NULL) { - char manufactureDate[sizeof(uint64_t)]; - if (ffCfDictGetInt64(batteryData, CFSTR(kIOPMPSManufactureDateKey), (int64_t*) manufactureDate) == NULL) + int day = sbdsManufactureDate & 0b11111; + int month = (sbdsManufactureDate >> 5) & 0b1111; + int year = (sbdsManufactureDate >> 9) + 1800; + ffStrbufSetF(&battery->manufactureDate, "%.4d-%.2d-%.2d", year, month, day); + } + else + { + CFDictionaryRef batteryData; + if (ffCfDictGetDict(properties, CFSTR("BatteryData"), &batteryData) == NULL) { - // https://github.com/AsahiLinux/linux/blob/b5c05cbffb0488c7618106926d522cc3b43d93d5/drivers/power/supply/macsmc_power.c#L410-L419 - int year = (manufactureDate[0] - '0') * 10 + (manufactureDate[1] - '0') + 2000 - 8; - int month = (manufactureDate[2] - '0') * 10 + (manufactureDate[3] - '0'); - int day = (manufactureDate[4] - '0') * 10 + (manufactureDate[3] - '5'); - ffStrbufSetF(&battery->manufactureDate, "%.4d-%.2d-%.2d", year, month, day); + char manufactureDate[sizeof(uint64_t)]; + if (ffCfDictGetInt64(batteryData, CFSTR(kIOPMPSManufactureDateKey), (int64_t*) manufactureDate) == NULL) + { + // https://github.com/AsahiLinux/linux/blob/b5c05cbffb0488c7618106926d522cc3b43d93d5/drivers/power/supply/macsmc_power.c#L410-L419 + int year = (manufactureDate[0] - '0') * 10 + (manufactureDate[1] - '0') + 2000 - 8; + int month = (manufactureDate[2] - '0') * 10 + (manufactureDate[3] - '0'); + int day = (manufactureDate[4] - '0') * 10 + (manufactureDate[3] - '5'); + ffStrbufSetF(&battery->manufactureDate, "%.4d-%.2d-%.2d", year, month, day); + } } } diff --git a/src/detection/battery/battery_windows.c b/src/detection/battery/battery_windows.c index 4e1a44db4..d0fec9557 100644 --- a/src/detection/battery/battery_windows.c +++ b/src/detection/battery/battery_windows.c @@ -203,9 +203,9 @@ const char* detectBySmbios(FFBatteryResult* battery) } else if (data->Header.Length > offsetof(FFSmbiosPortableBattery, SbdsManufactureDate)) { - uint16_t day = data->SbdsManufactureDate & 0b11111; - uint16_t month = (data->SbdsManufactureDate >> 5) & 0b1111; - uint16_t year = (data->SbdsManufactureDate >> 9) + 1800; + int day = data->SbdsManufactureDate & 0b11111; + int month = (data->SbdsManufactureDate >> 5) & 0b1111; + int year = (data->SbdsManufactureDate >> 9) + 1800; ffStrbufSetF(&battery->manufactureDate, "%.4d-%.2d-%.2d", year, month, day); }