From 396112e8eaaf3ed9dddb68753023f83803feef49 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Fri, 5 Jan 2024 11:01:16 +0800 Subject: [PATCH] PowerAdapter: simplify implementation and support serial number detection --- src/detection/poweradapter/poweradapter.h | 2 +- .../poweradapter/poweradapter_apple.c | 57 ++++++------------- .../poweradapter/poweradapter_linux.c | 6 ++ src/modules/poweradapter/poweradapter.c | 43 +++++++------- 4 files changed, 47 insertions(+), 61 deletions(-) diff --git a/src/detection/poweradapter/poweradapter.h b/src/detection/poweradapter/poweradapter.h index 405480690..8af98a6fa 100644 --- a/src/detection/poweradapter/poweradapter.h +++ b/src/detection/poweradapter/poweradapter.h @@ -8,10 +8,10 @@ typedef struct FFPowerAdapterResult FFstrbuf name; FFstrbuf modelName; FFstrbuf manufacturer; + FFstrbuf serial; int watts; } FFPowerAdapterResult; const char* ffDetectPowerAdapter(FFlist* results); -#define FF_POWERADAPTER_UNSET -2 #define FF_POWERADAPTER_NOT_CONNECTED -1 diff --git a/src/detection/poweradapter/poweradapter_apple.c b/src/detection/poweradapter/poweradapter_apple.c index 7c17a4f0b..794fccd45 100644 --- a/src/detection/poweradapter/poweradapter_apple.c +++ b/src/detection/poweradapter/poweradapter_apple.c @@ -2,51 +2,30 @@ #include "poweradapter.h" #include "util/apple/cf_helpers.h" -#include +#include +#include const char* ffDetectPowerAdapter(FFlist* results) { - io_iterator_t iterator; - if(IOServiceGetMatchingServices(MACH_PORT_NULL, IOServiceMatching("AppleSmartBattery"), &iterator) != kIOReturnSuccess) - return "IOServiceGetMatchingServices() failed"; + FF_CFTYPE_AUTO_RELEASE CFDictionaryRef details = IOPSCopyExternalPowerAdapterDetails(); + FFPowerAdapterResult* adapter = ffListAdd(results); - io_registry_entry_t registryEntry; - while((registryEntry = IOIteratorNext(iterator)) != 0) + ffStrbufInit(&adapter->name); + ffStrbufInit(&adapter->description); + ffStrbufInit(&adapter->manufacturer); + ffStrbufInit(&adapter->modelName); + ffStrbufInit(&adapter->serial); + adapter->watts = FF_POWERADAPTER_NOT_CONNECTED; + + if (details) { - CFMutableDictionaryRef properties; - if(IORegistryEntryCreateCFProperties(registryEntry, &properties, kCFAllocatorDefault, kNilOptions) != kIOReturnSuccess) - { - IOObjectRelease(registryEntry); - continue; - } - - FFPowerAdapterResult* adapter = ffListAdd(results); - - ffStrbufInit(&adapter->name); - ffStrbufInit(&adapter->description); - ffStrbufInit(&adapter->manufacturer); - ffStrbufInit(&adapter->modelName); - adapter->watts = FF_POWERADAPTER_UNSET; - - CFDictionaryRef adapterDict; - if(!ffCfDictGetDict(properties, CFSTR("AdapterDetails"), &adapterDict)) - { - if (ffCfDictGetInt(adapterDict, CFSTR("Watts"), &adapter->watts)) - { - adapter->watts = FF_POWERADAPTER_NOT_CONNECTED; - continue; - } - ffCfDictGetString(adapterDict, CFSTR("Name"), &adapter->name); - ffCfDictGetString(adapterDict, CFSTR("Description"), &adapter->description); - ffCfDictGetString(adapterDict, CFSTR("Manufacturer"), &adapter->manufacturer); - ffCfDictGetString(adapterDict, CFSTR("Model"), &adapter->modelName); - } - - CFRelease(properties); - IOObjectRelease(registryEntry); + ffCfDictGetString(details, CFSTR(kIOPSNameKey), &adapter->name); + ffCfDictGetString(details, CFSTR("Model"), &adapter->modelName); + ffCfDictGetString(details, CFSTR("Manufacturer"), &adapter->manufacturer); + ffCfDictGetString(details, CFSTR("Description"), &adapter->description); + ffCfDictGetString(details, CFSTR("SerialString"), &adapter->serial); + ffCfDictGetInt(details, CFSTR(kIOPSPowerAdapterWattsKey), &adapter->watts); } - IOObjectRelease(iterator); - return NULL; } diff --git a/src/detection/poweradapter/poweradapter_linux.c b/src/detection/poweradapter/poweradapter_linux.c index b514c2590..8058ad7c6 100644 --- a/src/detection/poweradapter/poweradapter_linux.c +++ b/src/detection/poweradapter/poweradapter_linux.c @@ -65,6 +65,12 @@ static void parsePowerAdapter(FFstrbuf* dir, FF_MAYBE_UNUSED const char* id, FFl if (ffReadFileBuffer(dir->chars, &result->modelName)) ffStrbufTrimRightSpace(&result->modelName); ffStrbufSubstrBefore(dir, dirLength); + + ffStrbufInit(&result->serial); + ffStrbufAppendS(dir, "/serial_number"); + if (ffReadFileBuffer(dir->chars, &result->serial)) + ffStrbufTrimRightSpace(&result->serial); + ffStrbufSubstrBefore(dir, dirLength); } const char* ffDetectPowerAdapter(FFlist* results) diff --git a/src/modules/poweradapter/poweradapter.c b/src/modules/poweradapter/poweradapter.c index a4f599d4b..23cd10732 100644 --- a/src/modules/poweradapter/poweradapter.c +++ b/src/modules/poweradapter/poweradapter.c @@ -5,7 +5,7 @@ #include "util/stringUtils.h" #define FF_POWERADAPTER_DISPLAY_NAME "Power Adapter" -#define FF_POWERADAPTER_NUM_FORMAT_ARGS 5 +#define FF_POWERADAPTER_NUM_FORMAT_ARGS 6 void ffPrintPowerAdapter(FFPowerAdapterOptions* options) { @@ -27,35 +27,34 @@ void ffPrintPowerAdapter(FFPowerAdapterOptions* options) { FFPowerAdapterResult* result = ffListGet(&results, i); - if(result->watts != FF_POWERADAPTER_UNSET) + if(options->moduleArgs.outputFormat.length == 0) { - if(options->moduleArgs.outputFormat.length == 0) - { - ffPrintLogoAndKey(FF_POWERADAPTER_DISPLAY_NAME, i, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT); + ffPrintLogoAndKey(FF_POWERADAPTER_DISPLAY_NAME, i, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT); - if(result->name.length > 0) - puts(result->name.chars); - else if(result->watts == FF_POWERADAPTER_NOT_CONNECTED) - puts("not connected"); - else - printf("%dW\n", result->watts); - } + if(result->name.length > 0) + puts(result->name.chars); + else if(result->watts == FF_POWERADAPTER_NOT_CONNECTED) + puts("not connected"); else - { - ffPrintFormat(FF_POWERADAPTER_DISPLAY_NAME, i, &options->moduleArgs, FF_POWERADAPTER_NUM_FORMAT_ARGS, (FFformatarg[]){ - {FF_FORMAT_ARG_TYPE_INT, &result->watts}, - {FF_FORMAT_ARG_TYPE_STRBUF, &result->name}, - {FF_FORMAT_ARG_TYPE_STRBUF, &result->manufacturer}, - {FF_FORMAT_ARG_TYPE_STRBUF, &result->modelName}, - {FF_FORMAT_ARG_TYPE_STRBUF, &result->description}, - }); - } + printf("%dW\n", result->watts); + } + else + { + ffPrintFormat(FF_POWERADAPTER_DISPLAY_NAME, i, &options->moduleArgs, FF_POWERADAPTER_NUM_FORMAT_ARGS, (FFformatarg[]){ + {FF_FORMAT_ARG_TYPE_INT, &result->watts}, + {FF_FORMAT_ARG_TYPE_STRBUF, &result->name}, + {FF_FORMAT_ARG_TYPE_STRBUF, &result->manufacturer}, + {FF_FORMAT_ARG_TYPE_STRBUF, &result->modelName}, + {FF_FORMAT_ARG_TYPE_STRBUF, &result->description}, + {FF_FORMAT_ARG_TYPE_STRBUF, &result->serial}, + }); } ffStrbufDestroy(&result->manufacturer); ffStrbufDestroy(&result->description); ffStrbufDestroy(&result->modelName); ffStrbufDestroy(&result->name); + ffStrbufDestroy(&result->serial); } } } @@ -119,6 +118,7 @@ void ffGeneratePowerAdapterJsonResult(FF_MAYBE_UNUSED FFPowerAdapterOptions* opt yyjson_mut_obj_add_strbuf(doc, obj, "manufacturer", &item->manufacturer); yyjson_mut_obj_add_strbuf(doc, obj, "modelName", &item->modelName); yyjson_mut_obj_add_strbuf(doc, obj, "name", &item->name); + yyjson_mut_obj_add_strbuf(doc, obj, "serial", &item->serial); yyjson_mut_obj_add_int(doc, obj, "watts", item->watts); } } @@ -132,6 +132,7 @@ void ffPrintPowerAdapterHelpFormat(void) "PowerAdapter manufacturer", "PowerAdapter model", "PowerAdapter description" + "PowerAdapter serial number" }); }