diff --git a/src/core/smartattributeparseddata.cpp b/src/core/smartattributeparseddata.cpp index 3de8344..d3e832f 100644 --- a/src/core/smartattributeparseddata.cpp +++ b/src/core/smartattributeparseddata.cpp @@ -22,6 +22,7 @@ #include #include #include +#include #define MKELVIN_VALID_MIN ((qint64) ((-15LL*1000LL) + 273150LL)) #define MKELVIN_VALID_MAX ((qint64) ((100LL*1000LL) + 273150LL)) @@ -477,187 +478,171 @@ static const QMap tableUni return table; } -static const SmartAttributeParsedData::SmartQuirkDataBase *quirkDatabase() +static const QVector quirkDatabase() { - static const SmartAttributeParsedData::SmartQuirkDataBase quirkDb[] = { - { - "^(FUJITSU MHY2120BH|FUJITSU MHY2250BH)$", - "^0085000B$", - (SmartAttributeParsedData::SmartQuirk) (SmartAttributeParsedData::SMART_QUIRK_9_POWERONMINUTES | - SmartAttributeParsedData::SMART_QUIRK_197_UNKNOWN | - SmartAttributeParsedData::SMART_QUIRK_198_UNKNOWN) - }, - { - "^FUJITSU MHR2040AT$", - NULL, - (SmartAttributeParsedData::SmartQuirk) (SmartAttributeParsedData::SMART_QUIRK_9_POWERONSECONDS | - SmartAttributeParsedData::SMART_QUIRK_192_EMERGENCYRETRACTCYCLECT | - SmartAttributeParsedData::SMART_QUIRK_200_WRITEERRORCOUNT) - }, - { - "^FUJITSU MHS20[6432]0AT( .)?$", - NULL, - (SmartAttributeParsedData::SmartQuirk) (SmartAttributeParsedData::SMART_QUIRK_9_POWERONSECONDS | - SmartAttributeParsedData::SMART_QUIRK_192_EMERGENCYRETRACTCYCLECT | - SmartAttributeParsedData::SMART_QUIRK_200_WRITEERRORCOUNT | - SmartAttributeParsedData::SMART_QUIRK_201_DETECTEDTACOUNT) - }, - { - "^(" - "FUJITSU M1623TAU|" - "FUJITSU MHG2...ATU?.*|" - "FUJITSU MHH2...ATU?.*|" - "FUJITSU MHJ2...ATU?.*|" - "FUJITSU MHK2...ATU?.*|" - "FUJITSU MHL2300AT|" - "FUJITSU MHM2(20|15|10|06)0AT|" - "FUJITSU MHN2...AT|" - "FUJITSU MHR2020AT|" - "FUJITSU MHT2...(AH|AS|AT|BH)U?.*|" - "FUJITSU MHU2...ATU?.*|" - "FUJITSU MHV2...(AH|AS|AT|BH|BS|BT).*|" - "FUJITSU MP[A-G]3...A[HTEV]U?.*" - ")$", - NULL, - SmartAttributeParsedData::SMART_QUIRK_9_POWERONSECONDS - }, - { - "^(" - "SAMSUNG SV4012H|" - "SAMSUNG SP(0451|08[0124]2|12[0145]3|16[0145]4)[CN]" - ")$", - NULL, - SmartAttributeParsedData::SMART_QUIRK_9_POWERONHALFMINUTES - }, - { - "^(" - "SAMSUNG SV0412H|" - "SAMSUNG SV1204H" - ")$", - NULL, - (SmartAttributeParsedData::SmartQuirk) (SmartAttributeParsedData::SMART_QUIRK_9_POWERONHALFMINUTES | - SmartAttributeParsedData::SMART_QUIRK_194_10XCELSIUS) - }, - { - "^SAMSUNG SP40A2H$", - "^RR100-07$", - SmartAttributeParsedData::SMART_QUIRK_9_POWERONHALFMINUTES - }, - { - "^SAMSUNG SP80A4H$", - "^RT100-06$", - SmartAttributeParsedData::SMART_QUIRK_9_POWERONHALFMINUTES - }, - { - "^SAMSUNG SP8004H$", - "^QW100-61$", - SmartAttributeParsedData::SMART_QUIRK_9_POWERONHALFMINUTES - }, - { - "^(" - "Maxtor 2B0(0[468]|1[05]|20)H1|" - "Maxtor 4G(120J6|160J[68])|" - "Maxtor 4D0(20H1|40H2|60H3|80H4)" - ")$", - NULL, - (SmartAttributeParsedData::SmartQuirk) (SmartAttributeParsedData::SMART_QUIRK_9_POWERONMINUTES | - SmartAttributeParsedData::SMART_QUIRK_194_UNKNOWN) - }, - { - "^(" - "Maxtor 2F0[234]0[JL]0|" - "Maxtor 8(1280A2|2160A4|2560A4|3840A6|4000A6|5120A8)|" - "Maxtor 8(2160D2|3228D3|3240D3|4320D4|6480D6|8400D8|8455D8)|" - "Maxtor 9(0510D4|0576D4|0648D5|0720D5|0840D6|0845D6|0864D6|1008D7|1080D8|1152D8)|" - "Maxtor 9(1(360|350|202)D8|1190D7|10[12]0D6|0840D5|06[48]0D4|0510D3|1(350|202)E8|1010E6|0840E5|0640E4)|" - "Maxtor 9(0512D2|0680D3|0750D3|0913D4|1024D4|1360D6|1536D6|1792D7|2048D8)|" - "Maxtor 9(2732U8|2390U7|204[09]U6|1707U5|1366U4|1024U3|0845U3|0683U2)|" - "Maxtor 4(R0[68]0[JL]0|R1[26]0L0|A160J0|R120L4)|" - "Maxtor (91728D8|91512D7|91303D6|91080D5|90845D4|90645D3|90648D[34]|90432D2)|" - "Maxtor 9(0431U1|0641U2|0871U2|1301U3|1741U4)|" - "Maxtor (94091U8|93071U6|92561U5|92041U4|91731U4|91531U3|91361U3|91021U2|90841U2|90651U2)|" - "Maxtor (33073U4|32049U3|31536U2|30768U1|33073H4|32305H3|31536H2|30768H1)|" - "Maxtor (93652U8|92739U6|91826U4|91369U3|90913U2|90845U2|90435U1)|" - "Maxtor 9(0684U2|1024U2|1362U3|1536U3|2049U4|2562U5|3073U6|4098U8)|" - "Maxtor (54098[UH]8|53073[UH]6|52732[UH]6|52049[UH]4|51536[UH]3|51369[UH]3|51024[UH]2)|" - "Maxtor 3(1024H1|1535H2|2049H2|3073H3|4098H4)( B)?|" - "Maxtor 5(4610H6|4098H6|3073H4|2049H3|1536H2|1369H2|1023H2)|" - "Maxtor 9(1023U2|1536U2|2049U3|2305U3|3073U4|4610U6|6147U8)|" - "Maxtor 9(1023H2|1536H2|2049H3|2305H3|3073H4|4098H6|4610H6|6147H8)|" - "Maxtor 5T0(60H6|40H4|30H3|20H2|10H1)|" - "Maxtor (98196H8|96147H6)|" - "Maxtor 4W(100H6|080H6|060H4|040H3|030H2)|" - "Maxtor 6(E0[234]|K04)0L0|" - "Maxtor 6(B(30|25|20|16|12|10|08)0[MPRS]|L(080[MLP]|(100|120)[MP]|160[MP]|200[MPRS]|250[RS]|300[RS]))0|" - "Maxtor 6Y((060|080|120|160)L0|(060|080|120|160|200|250)P0|(060|080|120|160|200|250)M0)|" - "Maxtor 7Y250[PM]0|" - "Maxtor [45]A(25|30|32)0[JN]0|" - "Maxtor 7L(25|30)0[SR]0" - ")$", - NULL, - SmartAttributeParsedData::SMART_QUIRK_9_POWERONMINUTES - }, - { - "^(" - "HITACHI_DK14FA-20B|" - "HITACHI_DK23..-..B?|" - "HITACHI_DK23FA-20J|HTA422020F9AT[JN]0|" - "HE[JN]4230[23]0F9AT00|" - "HTC4260[23]0G5CE00|HTC4260[56]0G8CE00" - ")$", - NULL, - (SmartAttributeParsedData::SmartQuirk) (SmartAttributeParsedData::SMART_QUIRK_9_POWERONMINUTES | - SmartAttributeParsedData::SMART_QUIRK_193_LOADUNLOAD) - }, - { - "^HTS541010G9SA00$", - "^MBZOC60P$", - SmartAttributeParsedData::SMART_QUIRK_5_UNKNOWN - }, - { - "^MCCOE64GEMPP$", - "^2.9.0[3-9]$", - (SmartAttributeParsedData::SmartQuirk) (SmartAttributeParsedData::SMART_QUIRK_5_UNKNOWN | - SmartAttributeParsedData::SMART_QUIRK_190_UNKNOWN) - }, - { - "^INTEL SSDSA2(CT|BT|CW|BW)[0-9]{3}G3.*$", - NULL, - (SmartAttributeParsedData::SmartQuirk) (SmartAttributeParsedData::SMART_QUIRK_3_UNUSED | - SmartAttributeParsedData::SMART_QUIRK_4_UNUSED | - SmartAttributeParsedData::SMART_QUIRK_225_TOTALLBASWRITTEN | - SmartAttributeParsedData::SMART_QUIRK_226_TIMEWORKLOADMEDIAWEAR | - SmartAttributeParsedData::SMART_QUIRK_227_TIMEWORKLOADHOSTREADS | - SmartAttributeParsedData::SMART_QUIRK_228_WORKLOADTIMER | - SmartAttributeParsedData::SMART_QUIRK_232_AVAILABLERESERVEDSPACE | - SmartAttributeParsedData::SMART_QUIRK_233_MEDIAWEAROUTINDICATOR) - } - }; + typedef SmartAttributeParsedData::SmartQuirkDataBase QuirkDatabase; + + QVector quirkDb; + + quirkDb << QuirkDatabase(QStringLiteral("^(FUJITSU MHY2120BH|FUJITSU MHY2250BH)$"), QStringLiteral("^0085000B$"), + (SmartAttributeParsedData::SmartQuirk) (SmartAttributeParsedData::SMART_QUIRK_9_POWERONMINUTES | + SmartAttributeParsedData::SMART_QUIRK_197_UNKNOWN | + SmartAttributeParsedData::SMART_QUIRK_198_UNKNOWN)); + + quirkDb << QuirkDatabase(QStringLiteral("^FUJITSU MHR2040AT$"), QStringLiteral(), + (SmartAttributeParsedData::SmartQuirk) (SmartAttributeParsedData::SMART_QUIRK_9_POWERONSECONDS | + SmartAttributeParsedData::SMART_QUIRK_192_EMERGENCYRETRACTCYCLECT | + SmartAttributeParsedData::SMART_QUIRK_200_WRITEERRORCOUNT)); + + quirkDb << QuirkDatabase(QStringLiteral("^FUJITSU MHS20[6432]0AT( .)?$"), QStringLiteral(), + (SmartAttributeParsedData::SmartQuirk) (SmartAttributeParsedData::SMART_QUIRK_9_POWERONSECONDS | + SmartAttributeParsedData::SMART_QUIRK_192_EMERGENCYRETRACTCYCLECT | + SmartAttributeParsedData::SMART_QUIRK_200_WRITEERRORCOUNT | + SmartAttributeParsedData::SMART_QUIRK_201_DETECTEDTACOUNT)); + + quirkDb << QuirkDatabase(QStringLiteral("^(" + "FUJITSU M1623TAU|" + "FUJITSU MHG2...ATU?.*|" + "FUJITSU MHH2...ATU?.*|" + "FUJITSU MHJ2...ATU?.*|" + "FUJITSU MHK2...ATU?.*|" + "FUJITSU MHL2300AT|" + "FUJITSU MHM2(20|15|10|06)0AT|" + "FUJITSU MHN2...AT|" + "FUJITSU MHR2020AT|" + "FUJITSU MHT2...(AH|AS|AT|BH)U?.*|" + "FUJITSU MHU2...ATU?.*|" + "FUJITSU MHV2...(AH|AS|AT|BH|BS|BT).*|" + "FUJITSU MP[A-G]3...A[HTEV]U?.*" + ")$"), + QStringLiteral(), + SmartAttributeParsedData::SMART_QUIRK_9_POWERONSECONDS); + + quirkDb << QuirkDatabase(QStringLiteral("^(" + "SAMSUNG SV4012H|" + "SAMSUNG SP(0451|08[0124]2|12[0145]3|16[0145]4)[CN]" + ")$"), + QStringLiteral(), + SmartAttributeParsedData::SMART_QUIRK_9_POWERONHALFMINUTES); + + quirkDb << QuirkDatabase(QStringLiteral("^(" + "SAMSUNG SV0412H|" + "SAMSUNG SV1204H" + ")$"), + QStringLiteral(), + (SmartAttributeParsedData::SmartQuirk) (SmartAttributeParsedData::SMART_QUIRK_9_POWERONHALFMINUTES | + SmartAttributeParsedData::SMART_QUIRK_194_10XCELSIUS)); + + quirkDb << QuirkDatabase(QStringLiteral("^SAMSUNG SP40A2H$"), + QStringLiteral("^RR100-07$"), + SmartAttributeParsedData::SMART_QUIRK_9_POWERONHALFMINUTES); + + quirkDb << QuirkDatabase(QStringLiteral("^SAMSUNG SP80A4H$"), + QStringLiteral("^RT100-06$"), + SmartAttributeParsedData::SMART_QUIRK_9_POWERONHALFMINUTES); + + quirkDb << QuirkDatabase(QStringLiteral("^SAMSUNG SP8004H$"), + QStringLiteral("^QW100-61$"), + SmartAttributeParsedData::SMART_QUIRK_9_POWERONHALFMINUTES); + + quirkDb << QuirkDatabase(QStringLiteral("^(" + "Maxtor 2B0(0[468]|1[05]|20)H1|" + "Maxtor 4G(120J6|160J[68])|" + "Maxtor 4D0(20H1|40H2|60H3|80H4)" + ")$"), + QStringLiteral(), + (SmartAttributeParsedData::SmartQuirk) (SmartAttributeParsedData::SMART_QUIRK_9_POWERONMINUTES | + SmartAttributeParsedData::SMART_QUIRK_194_UNKNOWN)); + + quirkDb << QuirkDatabase(QStringLiteral("^(" + "Maxtor 2F0[234]0[JL]0|" + "Maxtor 8(1280A2|2160A4|2560A4|3840A6|4000A6|5120A8)|" + "Maxtor 8(2160D2|3228D3|3240D3|4320D4|6480D6|8400D8|8455D8)|" + "Maxtor 9(0510D4|0576D4|0648D5|0720D5|0840D6|0845D6|0864D6|1008D7|1080D8|1152D8)|" + "Maxtor 9(1(360|350|202)D8|1190D7|10[12]0D6|0840D5|06[48]0D4|0510D3|1(350|202)E8|1010E6|0840E5|0640E4)|" + "Maxtor 9(0512D2|0680D3|0750D3|0913D4|1024D4|1360D6|1536D6|1792D7|2048D8)|" + "Maxtor 9(2732U8|2390U7|204[09]U6|1707U5|1366U4|1024U3|0845U3|0683U2)|" + "Maxtor 4(R0[68]0[JL]0|R1[26]0L0|A160J0|R120L4)|" + "Maxtor (91728D8|91512D7|91303D6|91080D5|90845D4|90645D3|90648D[34]|90432D2)|" + "Maxtor 9(0431U1|0641U2|0871U2|1301U3|1741U4)|" + "Maxtor (94091U8|93071U6|92561U5|92041U4|91731U4|91531U3|91361U3|91021U2|90841U2|90651U2)|" + "Maxtor (33073U4|32049U3|31536U2|30768U1|33073H4|32305H3|31536H2|30768H1)|" + "Maxtor (93652U8|92739U6|91826U4|91369U3|90913U2|90845U2|90435U1)|" + "Maxtor 9(0684U2|1024U2|1362U3|1536U3|2049U4|2562U5|3073U6|4098U8)|" + "Maxtor (54098[UH]8|53073[UH]6|52732[UH]6|52049[UH]4|51536[UH]3|51369[UH]3|51024[UH]2)|" + "Maxtor 3(1024H1|1535H2|2049H2|3073H3|4098H4)( B)?|" + "Maxtor 5(4610H6|4098H6|3073H4|2049H3|1536H2|1369H2|1023H2)|" + "Maxtor 9(1023U2|1536U2|2049U3|2305U3|3073U4|4610U6|6147U8)|" + "Maxtor 9(1023H2|1536H2|2049H3|2305H3|3073H4|4098H6|4610H6|6147H8)|" + "Maxtor 5T0(60H6|40H4|30H3|20H2|10H1)|" + "Maxtor (98196H8|96147H6)|" + "Maxtor 4W(100H6|080H6|060H4|040H3|030H2)|" + "Maxtor 6(E0[234]|K04)0L0|" + "Maxtor 6(B(30|25|20|16|12|10|08)0[MPRS]|L(080[MLP]|(100|120)[MP]|160[MP]|200[MPRS]|250[RS]|300[RS]))0|" + "Maxtor 6Y((060|080|120|160)L0|(060|080|120|160|200|250)P0|(060|080|120|160|200|250)M0)|" + "Maxtor 7Y250[PM]0|" + "Maxtor [45]A(25|30|32)0[JN]0|" + "Maxtor 7L(25|30)0[SR]0" + ")$"), + QStringLiteral(), + SmartAttributeParsedData::SMART_QUIRK_9_POWERONMINUTES); + + quirkDb << QuirkDatabase(QStringLiteral("^(" + "HITACHI_DK14FA-20B|" + "HITACHI_DK23..-..B?|" + "HITACHI_DK23FA-20J|HTA422020F9AT[JN]0|" + "HE[JN]4230[23]0F9AT00|" + "HTC4260[23]0G5CE00|HTC4260[56]0G8CE00" + ")$"), + QStringLiteral(), + (SmartAttributeParsedData::SmartQuirk) (SmartAttributeParsedData::SMART_QUIRK_9_POWERONMINUTES | + SmartAttributeParsedData::SMART_QUIRK_193_LOADUNLOAD)); + + quirkDb << QuirkDatabase(QStringLiteral("^HTS541010G9SA00$"), + QStringLiteral("^MBZOC60P$"), + SmartAttributeParsedData::SMART_QUIRK_5_UNKNOWN); + + quirkDb << QuirkDatabase(QStringLiteral("^MCCOE64GEMPP$"), + QStringLiteral("^2.9.0[3-9]$"), + (SmartAttributeParsedData::SmartQuirk) (SmartAttributeParsedData::SMART_QUIRK_5_UNKNOWN | + SmartAttributeParsedData::SMART_QUIRK_190_UNKNOWN)); + + quirkDb << QuirkDatabase(QStringLiteral("^INTEL SSDSA2(CT|BT|CW|BW)[0-9]{3}G3.*$"), + QStringLiteral(), + (SmartAttributeParsedData::SmartQuirk) + (SmartAttributeParsedData::SMART_QUIRK_3_UNUSED | + SmartAttributeParsedData::SMART_QUIRK_4_UNUSED | + SmartAttributeParsedData::SMART_QUIRK_225_TOTALLBASWRITTEN | + SmartAttributeParsedData::SMART_QUIRK_226_TIMEWORKLOADMEDIAWEAR | + SmartAttributeParsedData::SMART_QUIRK_227_TIMEWORKLOADHOSTREADS | + SmartAttributeParsedData::SMART_QUIRK_228_WORKLOADTIMER | + SmartAttributeParsedData::SMART_QUIRK_232_AVAILABLERESERVEDSPACE | + SmartAttributeParsedData::SMART_QUIRK_233_MEDIAWEAROUTINDICATOR)); return quirkDb; } static SmartAttributeParsedData::SmartQuirk getQuirk(QString model, QString firmware) { - const SmartAttributeParsedData::SmartQuirkDataBase *db; + const QVector db = quirkDatabase(); QRegularExpression modelRegex; QRegularExpression firmwareRegex; - for (db = quirkDatabase(); db->model || db->firmware; db++) { - if (db->model) { - modelRegex.setPattern(QString::fromLocal8Bit(db->model)); + for (const SmartAttributeParsedData::SmartQuirkDataBase &item : qAsConst(db)) { + if (!item.model.isEmpty()) { + modelRegex.setPattern(item.model); QRegularExpressionMatch match = modelRegex.match(model); if (!match.hasMatch()) continue; } - if (db->firmware) { - firmwareRegex.setPattern(QString::fromLocal8Bit(db->firmware)); + if (!item.firmware.isEmpty()) { + firmwareRegex.setPattern(item.firmware); QRegularExpressionMatch match = firmwareRegex.match(firmware); if (!match.hasMatch()) continue; } - return db->quirk; + return item.quirk; } return (SmartAttributeParsedData::SmartQuirk) 0; diff --git a/src/core/smartattributeparseddata.h b/src/core/smartattributeparseddata.h index d11a6bb..5116aa3 100644 --- a/src/core/smartattributeparseddata.h +++ b/src/core/smartattributeparseddata.h @@ -74,9 +74,18 @@ public: /** SMART Quirk to some particular model and firmware */ struct SmartQuirkDataBase { - const char *model; - const char *firmware; + QString model; + QString firmware; SmartAttributeParsedData::SmartQuirk quirk; + + SmartQuirkDataBase(const QString &m = QString(), + const QString &f = QString(), + SmartAttributeParsedData::SmartQuirk q = (SmartAttributeParsedData::SmartQuirk) 0) : + model(m), + firmware(f), + quirk(q) + { + }; }; public: