diff --git a/src/solid/devices/backends/iokit/cfhelper.cpp b/src/solid/devices/backends/iokit/cfhelper.cpp index 9272c30..d20b60c 100644 --- a/src/solid/devices/backends/iokit/cfhelper.cpp +++ b/src/solid/devices/backends/iokit/cfhelper.cpp @@ -1,195 +1,195 @@ /* Copyright 2009 Harald Fernengel Copyright 2017 René J.V. Bertin This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) version 3, or any later version accepted by the membership of KDE e.V. (or its successor approved by the membership of KDE e.V.), which shall act as a proxy defined in Section 6 of version 3 of the license. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library. If not, see . */ #include #include #include #include #include #include #include #include /* helper classes to convert from CF types to Qt */ static QString q_toString(const CFStringRef &str) { CFIndex length = CFStringGetLength(str); QVarLengthArray buffer(length); CFRange range = { 0, length }; CFStringGetCharacters(str, range, buffer.data()); return QString(reinterpret_cast(buffer.data()), length); } template static inline T convertCFNumber(const CFNumberRef &num, CFNumberType type) { T n; CFNumberGetValue(num, type, &n); return n; } static QVariant q_toVariant(const CFTypeRef &obj) { const CFTypeID typeId = CFGetTypeID(obj); if (typeId == CFStringGetTypeID()) { return QVariant(q_toString(static_cast(obj))); } if (typeId == CFNumberGetTypeID()) { const CFNumberRef num = static_cast(obj); const CFNumberType type = CFNumberGetType(num); switch (type) { case kCFNumberSInt8Type: return qVariantFromValue(convertCFNumber(num, type)); case kCFNumberSInt16Type: return qVariantFromValue(convertCFNumber(num, type)); case kCFNumberSInt32Type: return qVariantFromValue(convertCFNumber(num, type)); case kCFNumberSInt64Type: return qVariantFromValue(convertCFNumber(num, type)); case kCFNumberCharType: return qVariantFromValue(convertCFNumber(num, type)); case kCFNumberShortType: return qVariantFromValue(convertCFNumber(num, type)); case kCFNumberIntType: return qVariantFromValue(convertCFNumber(num, type)); case kCFNumberLongType: return qVariantFromValue(convertCFNumber(num, type)); case kCFNumberLongLongType: return qVariantFromValue(convertCFNumber(num, type)); case kCFNumberFloatType: return qVariantFromValue(convertCFNumber(num, type)); case kCFNumberDoubleType: return qVariantFromValue(convertCFNumber(num, type)); default: if (CFNumberIsFloatType(num)) { return qVariantFromValue(convertCFNumber(num, kCFNumberDoubleType)); } return qVariantFromValue(convertCFNumber(num, kCFNumberLongLongType)); } } if (typeId == CFDateGetTypeID()) { QDateTime dt; - dt.setTime_t(uint(kCFAbsoluteTimeIntervalSince1970)); + dt.setSecsSinceEpoch(qint64(kCFAbsoluteTimeIntervalSince1970)); return dt.addSecs(int(CFDateGetAbsoluteTime(static_cast(obj)))); } if (typeId == CFDataGetTypeID()) { const CFDataRef cfdata = static_cast(obj); return QByteArray(reinterpret_cast(CFDataGetBytePtr(cfdata)), CFDataGetLength(cfdata)); } if (typeId == CFBooleanGetTypeID()) { return QVariant(bool(CFBooleanGetValue(static_cast(obj)))); } if (typeId == CFArrayGetTypeID()) { const CFArrayRef cfarray = static_cast(obj); QList list; CFIndex size = CFArrayGetCount(cfarray); bool metNonString = false; for (CFIndex i = 0; i < size; ++i) { QVariant value = q_toVariant(CFArrayGetValueAtIndex(cfarray, i)); if (value.type() != QVariant::String) { metNonString = true; } list << value; } if (metNonString) { return list; } else { return QVariant(list).toStringList(); } } if (typeId == CFDictionaryGetTypeID()) { const CFDictionaryRef cfdict = static_cast(obj); const CFTypeID arrayTypeId = CFArrayGetTypeID(); int size = int(CFDictionaryGetCount(cfdict)); QVarLengthArray keys(size); QVarLengthArray values(size); CFDictionaryGetKeysAndValues(cfdict, keys.data(), values.data()); QMultiMap map; for (int i = 0; i < size; ++i) { QString key = q_toString(static_cast(keys[i])); if (CFGetTypeID(values[i]) == arrayTypeId) { const CFArrayRef cfarray = static_cast(values[i]); CFIndex arraySize = CFArrayGetCount(cfarray); for (CFIndex j = arraySize - 1; j >= 0; --j) { map.insert(key, q_toVariant(CFArrayGetValueAtIndex(cfarray, j))); } } else { map.insert(key, q_toVariant(values[i])); } } return map; } return QVariant(); } QMap q_toVariantMap(const CFMutableDictionaryRef &dict) { Q_ASSERT(dict); QMap result; const int count = CFDictionaryGetCount(dict); QVarLengthArray keys(count); QVarLengthArray values(count); CFDictionaryGetKeysAndValues(dict, const_cast(keys.data()), const_cast(values.data())); for (int i = 0; i < count; ++i) { const QString key = q_toString((CFStringRef)keys[i]); const QVariant value = q_toVariant((CFTypeRef)values[i]); result[key] = value; } return result; } bool q_sysctlbyname(const char *name, QString &result) { char *property = nullptr; size_t size = 0; int error = 0; if (name && sysctlbyname(name, nullptr, &size, nullptr, 0) == 0 && size > 0) { property = new char [size]; error = sysctlbyname(name, property, &size, nullptr, 0); if (!error) { result = QLatin1String(property); } delete[] property; } return !error; }