From 89a1a9c17bb41f1159ccf812431e740b696f01bf Mon Sep 17 00:00:00 2001 From: zenen jaimes Date: Mon, 9 Dec 2019 21:27:16 -0800 Subject: [PATCH] iStats #86: CFStringGetCStringPtr usually returns null. Added fallback with CFStringGetCString. This is consistent and in compliance with Apple documentation. --- ext/osx_stats/smc.c | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/ext/osx_stats/smc.c b/ext/osx_stats/smc.c index 70e00be..b822b01 100644 --- a/ext/osx_stats/smc.c +++ b/ext/osx_stats/smc.c @@ -281,12 +281,23 @@ const char* getBatteryHealth() { if(powerSourceInformation == NULL) return "Unknown"; - CFStringRef batteryHealthRef = (CFStringRef) CFDictionaryGetValue(powerSourceInformation, CFSTR("BatteryHealth")); + CFStringRef batteryHealthRef = (CFStringRef) CFDictionaryGetValue(powerSourceInformation, CFSTR(kIOPSBatteryHealthKey)); - const char *batteryHealth = CFStringGetCStringPtr(batteryHealthRef, // CFStringRef theString, - kCFStringEncodingMacRoman); //CFStringEncoding encoding); - if(batteryHealth == NULL) - return "unknown"; + const char *batteryHealth = CFStringGetCStringPtr(batteryHealthRef, kCFStringEncodingMacRoman); + + if(batteryHealth == NULL) { + CFIndex length = CFStringGetLength(batteryHealthRef); + CFIndex bufSize = CFStringGetMaximumSizeForEncoding(length, kCFStringEncodingMacRoman) + 1; + char *buffer = (char *)malloc(bufSize); + + if (CFStringGetCString(batteryHealthRef, buffer, bufSize, kCFStringEncodingMacRoman)) { + return buffer; + } + + free(buffer); + + return "Unknown"; + } return batteryHealth; }