- Changed m_Quirk variable in SmartAttributeParsedData to SmartQuirk value instead of reference

- Changed smartctl call to use ExternalCommand class instead of QProcess
- Changed Q_FOREACH to C++11 ranged based for
- Changed quint64 json parsing
This commit is contained in:
Caio Carvalho 2018-01-09 01:35:59 -03:00
parent 8177fb9738
commit d71731141c
5 changed files with 42 additions and 46 deletions

View File

@ -21,6 +21,7 @@
#include <QJsonObject> #include <QJsonObject>
#include <QMap> #include <QMap>
#include <QRegExp> #include <QRegExp>
#include <QVariant>
#define MKELVIN_VALID_MIN ((qint64) ((-15LL*1000LL) + 273150LL)) #define MKELVIN_VALID_MIN ((qint64) ((-15LL*1000LL) + 273150LL))
#define MKELVIN_VALID_MAX ((qint64) ((100LL*1000LL) + 273150LL)) #define MKELVIN_VALID_MAX ((qint64) ((100LL*1000LL) + 273150LL))
@ -30,7 +31,7 @@
#define MSECOND_VALID_LONG_MAX (30ULL * 365ULL * 24ULL * 60ULL * 60ULL * 1000ULL) #define MSECOND_VALID_LONG_MAX (30ULL * 365ULL * 24ULL * 60ULL * 60ULL * 1000ULL)
static const QMap<qint32, SmartAttributeParsedData::SmartAttributeUnit> tableUnit(); static const QMap<qint32, SmartAttributeParsedData::SmartAttributeUnit> tableUnit();
static SmartAttributeParsedData::SmartQuirk *getQuirk(QString model, QString firmware); static SmartAttributeParsedData::SmartQuirk getQuirk(QString model, QString firmware);
SmartAttributeParsedData::SmartAttributeParsedData(SmartDiskInformation *disk, SmartAttributeParsedData::SmartAttributeParsedData(SmartDiskInformation *disk,
QJsonObject jsonAttribute) : QJsonObject jsonAttribute) :
@ -52,7 +53,7 @@ SmartAttributeParsedData::SmartAttributeParsedData(SmartDiskInformation *disk,
m_Warn(false), m_Warn(false),
m_PrettyUnit(SMART_ATTRIBUTE_UNIT_UNKNOWN), m_PrettyUnit(SMART_ATTRIBUTE_UNIT_UNKNOWN),
m_Disk(disk), m_Disk(disk),
m_Quirk(nullptr) m_Quirk((SmartAttributeParsedData::SmartQuirk) 0)
{ {
if (disk) if (disk)
m_Quirk = getQuirk(disk->model(), disk->firmware()); m_Quirk = getQuirk(disk->model(), disk->firmware());
@ -63,7 +64,6 @@ SmartAttributeParsedData::SmartAttributeParsedData(SmartDiskInformation *disk,
QString worst = QString::fromLocal8Bit("worst"); QString worst = QString::fromLocal8Bit("worst");
QString thresh = QString::fromLocal8Bit("thresh"); QString thresh = QString::fromLocal8Bit("thresh");
QString raw = QString::fromLocal8Bit("raw"); QString raw = QString::fromLocal8Bit("raw");
QString str = QString::fromLocal8Bit("string");
QString flags = QString::fromLocal8Bit("flags"); QString flags = QString::fromLocal8Bit("flags");
QString prefailure = QString::fromLocal8Bit("prefailure"); QString prefailure = QString::fromLocal8Bit("prefailure");
QString online = QString::fromLocal8Bit("updated_online"); QString online = QString::fromLocal8Bit("updated_online");
@ -75,7 +75,7 @@ SmartAttributeParsedData::SmartAttributeParsedData(SmartDiskInformation *disk,
QJsonObject rawObj = jsonAttribute[raw].toObject(); QJsonObject rawObj = jsonAttribute[raw].toObject();
m_Raw = rawObj[str].toString().toULongLong(); m_Raw = rawObj[value].toVariant().toULongLong();
QJsonObject flagsObj = jsonAttribute[flags].toObject(); QJsonObject flagsObj = jsonAttribute[flags].toObject();
@ -264,119 +264,119 @@ bool SmartAttributeParsedData::updateUnit()
if (m_Quirk) { if (m_Quirk) {
switch (id()) { switch (id()) {
case 3: case 3:
if (*m_Quirk & SMART_QUIRK_3_UNUSED) { if (m_Quirk & SMART_QUIRK_3_UNUSED) {
m_PrettyUnit = SMART_ATTRIBUTE_UNIT_UNKNOWN; m_PrettyUnit = SMART_ATTRIBUTE_UNIT_UNKNOWN;
return true; return true;
} }
break; break;
case 4: case 4:
if (*m_Quirk & SMART_QUIRK_4_UNUSED) { if (m_Quirk & SMART_QUIRK_4_UNUSED) {
m_PrettyUnit = SMART_ATTRIBUTE_UNIT_UNKNOWN; m_PrettyUnit = SMART_ATTRIBUTE_UNIT_UNKNOWN;
return true; return true;
} }
break; break;
case 5: case 5:
if (*m_Quirk & SMART_QUIRK_5_UNKNOWN) if (m_Quirk & SMART_QUIRK_5_UNKNOWN)
return false; return false;
break; break;
case 9: case 9:
if (*m_Quirk & SMART_QUIRK_9_POWERONMINUTES) { if (m_Quirk & SMART_QUIRK_9_POWERONMINUTES) {
m_PrettyUnit = SMART_ATTRIBUTE_UNIT_MSECONDS; m_PrettyUnit = SMART_ATTRIBUTE_UNIT_MSECONDS;
return true; return true;
} else if (*m_Quirk & SMART_QUIRK_9_POWERONSECONDS) { } else if (m_Quirk & SMART_QUIRK_9_POWERONSECONDS) {
m_PrettyUnit = SMART_ATTRIBUTE_UNIT_MSECONDS; m_PrettyUnit = SMART_ATTRIBUTE_UNIT_MSECONDS;
return true; return true;
} else if (*m_Quirk & SMART_QUIRK_9_POWERONHALFMINUTES) { } else if (m_Quirk & SMART_QUIRK_9_POWERONHALFMINUTES) {
m_PrettyUnit = SMART_ATTRIBUTE_UNIT_MSECONDS; m_PrettyUnit = SMART_ATTRIBUTE_UNIT_MSECONDS;
return true; return true;
} else if (*m_Quirk & SMART_QUIRK_9_UNKNOWN) } else if (m_Quirk & SMART_QUIRK_9_UNKNOWN)
return false; return false;
break; break;
case 190: case 190:
if (*m_Quirk & SMART_QUIRK_190_UNKNOWN) if (m_Quirk & SMART_QUIRK_190_UNKNOWN)
return false; return false;
break; break;
case 192: case 192:
if (*m_Quirk & SMART_QUIRK_192_EMERGENCYRETRACTCYCLECT) { if (m_Quirk & SMART_QUIRK_192_EMERGENCYRETRACTCYCLECT) {
m_PrettyUnit = SMART_ATTRIBUTE_UNIT_NONE; m_PrettyUnit = SMART_ATTRIBUTE_UNIT_NONE;
return true; return true;
} }
break; break;
case 194: case 194:
if (*m_Quirk & SMART_QUIRK_194_10XCELSIUS) { if (m_Quirk & SMART_QUIRK_194_10XCELSIUS) {
m_PrettyUnit = SMART_ATTRIBUTE_UNIT_MKELVIN; m_PrettyUnit = SMART_ATTRIBUTE_UNIT_MKELVIN;
return true; return true;
} else if (*m_Quirk & SMART_QUIRK_194_UNKNOWN) } else if (m_Quirk & SMART_QUIRK_194_UNKNOWN)
return false; return false;
break; break;
case 197: case 197:
if (*m_Quirk & SMART_QUIRK_197_UNKNOWN) if (m_Quirk & SMART_QUIRK_197_UNKNOWN)
return false; return false;
break; break;
case 198: case 198:
if (*m_Quirk & SMART_QUIRK_198_UNKNOWN) if (m_Quirk & SMART_QUIRK_198_UNKNOWN)
return false; return false;
break; break;
case 200: case 200:
if (*m_Quirk & SMART_QUIRK_200_WRITEERRORCOUNT) { if (m_Quirk & SMART_QUIRK_200_WRITEERRORCOUNT) {
m_PrettyUnit = SMART_ATTRIBUTE_UNIT_NONE; m_PrettyUnit = SMART_ATTRIBUTE_UNIT_NONE;
return true; return true;
} }
break; break;
case 201: case 201:
if (*m_Quirk & SMART_QUIRK_201_DETECTEDTACOUNT) { if (m_Quirk & SMART_QUIRK_201_DETECTEDTACOUNT) {
m_PrettyUnit = SMART_ATTRIBUTE_UNIT_NONE; m_PrettyUnit = SMART_ATTRIBUTE_UNIT_NONE;
return true; return true;
} }
break; break;
case 225: case 225:
if (*m_Quirk & SMART_QUIRK_225_TOTALLBASWRITTEN) { if (m_Quirk & SMART_QUIRK_225_TOTALLBASWRITTEN) {
m_PrettyUnit = SMART_ATTRIBUTE_UNIT_MB; m_PrettyUnit = SMART_ATTRIBUTE_UNIT_MB;
return true; return true;
} }
break; break;
case 226: case 226:
if (*m_Quirk & SMART_QUIRK_226_TIMEWORKLOADMEDIAWEAR) { if (m_Quirk & SMART_QUIRK_226_TIMEWORKLOADMEDIAWEAR) {
m_PrettyUnit = SMART_ATTRIBUTE_UNIT_SMALL_PERCENT; m_PrettyUnit = SMART_ATTRIBUTE_UNIT_SMALL_PERCENT;
return true; return true;
} }
break; break;
case 227: case 227:
if (*m_Quirk & SMART_QUIRK_227_TIMEWORKLOADHOSTREADS) { if (m_Quirk & SMART_QUIRK_227_TIMEWORKLOADHOSTREADS) {
m_PrettyUnit = SMART_ATTRIBUTE_UNIT_SMALL_PERCENT; m_PrettyUnit = SMART_ATTRIBUTE_UNIT_SMALL_PERCENT;
return true; return true;
} }
break; break;
case 228: case 228:
if (*m_Quirk & SMART_QUIRK_228_WORKLOADTIMER) { if (m_Quirk & SMART_QUIRK_228_WORKLOADTIMER) {
m_PrettyUnit = SMART_ATTRIBUTE_UNIT_MSECONDS; m_PrettyUnit = SMART_ATTRIBUTE_UNIT_MSECONDS;
return true; return true;
} }
break; break;
case 232: case 232:
if (*m_Quirk & SMART_QUIRK_232_AVAILABLERESERVEDSPACE) { if (m_Quirk & SMART_QUIRK_232_AVAILABLERESERVEDSPACE) {
m_PrettyUnit = SMART_ATTRIBUTE_UNIT_PERCENT; m_PrettyUnit = SMART_ATTRIBUTE_UNIT_PERCENT;
return true; return true;
} }
break; break;
case 233: case 233:
if (*m_Quirk & SMART_QUIRK_233_MEDIAWEAROUTINDICATOR) { if (m_Quirk & SMART_QUIRK_233_MEDIAWEAROUTINDICATOR) {
m_PrettyUnit = SMART_ATTRIBUTE_UNIT_PERCENT; m_PrettyUnit = SMART_ATTRIBUTE_UNIT_PERCENT;
return true; return true;
} }
@ -628,7 +628,7 @@ static const SmartAttributeParsedData::SmartQuirkDataBase *quirkDatabase()
return quirkDb; return quirkDb;
} }
static SmartAttributeParsedData::SmartQuirk *getQuirk(QString model, QString firmware) static SmartAttributeParsedData::SmartQuirk getQuirk(QString model, QString firmware)
{ {
const SmartAttributeParsedData::SmartQuirkDataBase *db; const SmartAttributeParsedData::SmartQuirkDataBase *db;
@ -646,8 +646,8 @@ static SmartAttributeParsedData::SmartQuirk *getQuirk(QString model, QString fir
if (!firmwareRegex.exactMatch(firmware)) if (!firmwareRegex.exactMatch(firmware))
continue; continue;
} }
return (SmartAttributeParsedData::SmartQuirk *)&db->quirk; return db->quirk;
} }
return nullptr; return (SmartAttributeParsedData::SmartQuirk) 0;
} }

View File

@ -201,7 +201,7 @@ private:
bool m_Warn; bool m_Warn;
SmartAttributeUnit m_PrettyUnit; SmartAttributeUnit m_PrettyUnit;
SmartDiskInformation *m_Disk; SmartDiskInformation *m_Disk;
SmartQuirk *m_Quirk; SmartQuirk m_Quirk;
}; };
#endif // SMARTATTRIBUTEPARSEDDATA_H #endif // SMARTATTRIBUTEPARSEDDATA_H

View File

@ -154,7 +154,7 @@ bool SmartDiskInformation::updatePowerCycle()
void SmartDiskInformation::validateBadAttributes() void SmartDiskInformation::validateBadAttributes()
{ {
foreach (SmartAttributeParsedData attribute, m_Attributes) { for (const SmartAttributeParsedData &attribute : qAsConst(m_Attributes)) {
if (attribute.prefailure()) { if (attribute.prefailure()) {
if (attribute.goodNowValid() && !attribute.goodNow()) if (attribute.goodNowValid() && !attribute.goodNow())
m_BadAttributeNow = true; m_BadAttributeNow = true;
@ -167,7 +167,7 @@ void SmartDiskInformation::validateBadAttributes()
SmartAttributeParsedData *SmartDiskInformation::findAttribute(quint32 id) SmartAttributeParsedData *SmartDiskInformation::findAttribute(quint32 id)
{ {
SmartAttributeParsedData *attr = nullptr; SmartAttributeParsedData *attr = nullptr;
foreach (SmartAttributeParsedData attribute, m_Attributes) { for (const SmartAttributeParsedData &attribute : qAsConst(m_Attributes)) {
if (id == attribute.id()) { if (id == attribute.id()) {
attr = new SmartAttributeParsedData(attribute); attr = new SmartAttributeParsedData(attribute);
break; break;

View File

@ -20,11 +20,12 @@
#include "core/smartattributeparseddata.h" #include "core/smartattributeparseddata.h"
#include "core/smartdiskinformation.h" #include "core/smartdiskinformation.h"
#include "util/externalcommand.h"
#include <QDebug> #include <QDebug>
#include <QJsonArray> #include <QJsonArray>
#include <QJsonDocument> #include <QJsonDocument>
#include <QJsonObject> #include <QJsonObject>
#include <QProcess>
#include <QString> #include <QString>
SmartParser::SmartParser(const QString &device_path) : SmartParser::SmartParser(const QString &device_path) :
@ -80,7 +81,7 @@ bool SmartParser::init()
m_DiskInformation->setModel(smartJson[model_name].toString()); m_DiskInformation->setModel(smartJson[model_name].toString());
m_DiskInformation->setFirmware(smartJson[firmware].toString()); m_DiskInformation->setFirmware(smartJson[firmware].toString());
m_DiskInformation->setSerial(smartJson[serial_number].toString()); m_DiskInformation->setSerial(smartJson[serial_number].toString());
m_DiskInformation->setSize(smartJson[user_capacity].toString().toULongLong()); m_DiskInformation->setSize(smartJson[user_capacity].toVariant().toULongLong());
QJsonObject selfTest = smartJson[self_test].toObject(); QJsonObject selfTest = smartJson[self_test].toObject();
QJsonObject selfTestStatus = selfTest[status].toObject(); QJsonObject selfTestStatus = selfTest[status].toObject();
@ -114,20 +115,15 @@ void SmartParser::loadSmartOutput()
args.append(QString::fromLocal8Bit("-j")); args.append(QString::fromLocal8Bit("-j"));
args.append(devicePath()); args.append(devicePath());
QProcess smartctl; ExternalCommand smartctl(QString::fromLocal8Bit("smartctl"), args);
smartctl.start(QString::fromLocal8Bit("smartctl"), args);
bool success = smartctl.waitForFinished(); if (smartctl.run() && smartctl.exitCode() == 0) {
QByteArray output = smartctl.rawOutput();
if (!success || smartctl.exitStatus() == QProcess::CrashExit) { m_SmartOutput = QJsonDocument::fromJson(output);
qDebug() << "smartctl initialization failed for " << devicePath() << ": " << strerror(errno);
return;
} }
else
QByteArray output = smartctl.readAllStandardOutput(); qDebug() << "smartctl initialization failed for " << devicePath() << ": " << strerror(errno);
smartctl.close();
m_SmartOutput = QJsonDocument::fromJson(output);
} }
} }
@ -152,7 +148,7 @@ void SmartParser::loadAttributes()
return; return;
} }
foreach (QJsonValue value, attributeArray) { for (const QJsonValue &value : qAsConst(attributeArray)) {
SmartAttributeParsedData parsedObject(m_DiskInformation, value.toObject()); SmartAttributeParsedData parsedObject(m_DiskInformation, value.toObject());
m_DiskInformation->addAttribute(parsedObject); m_DiskInformation->addAttribute(parsedObject);
} }

View File

@ -230,7 +230,7 @@ void SmartStatus::addAttributes(QList<SmartAttributeParsedData> attr)
{ {
m_Attributes.clear(); m_Attributes.clear();
foreach (SmartAttributeParsedData at, attr) { for (const SmartAttributeParsedData &at : qAsConst(attr)) {
SmartAttribute sm(at); SmartAttribute sm(at);
m_Attributes.append(sm); m_Attributes.append(sm);
} }