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

View File

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

View File

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

View File

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