File indexing completed on 2024-04-28 05:45:47

0001 /*
0002     SPDX-FileCopyrightText: 2018 Caio Jordão Carvalho <caiojcarvalho@gmail.com>
0003     SPDX-FileCopyrightText: 2018 Andrius Štikonas <andrius@stikonas.eu>
0004 
0005     SPDX-License-Identifier: GPL-3.0-or-later
0006 */
0007 
0008 #ifndef KPMCORE_SMARTATTRIBUTEPARSEDDATA_H
0009 #define KPMCORE_SMARTATTRIBUTEPARSEDDATA_H
0010 
0011 #include <QJsonObject>
0012 #include <QString>
0013 
0014 class SmartDiskInformation;
0015 
0016 /** SMART Quirk */
0017 enum SmartQuirk {
0018     None                                    = 0x000000,
0019     SMART_QUIRK_9_POWERONMINUTES            = 0x000001,
0020     SMART_QUIRK_9_POWERONSECONDS            = 0x000002,
0021     SMART_QUIRK_9_POWERONHALFMINUTES        = 0x000004,
0022     SMART_QUIRK_192_EMERGENCYRETRACTCYCLECT = 0x000008,
0023     SMART_QUIRK_193_LOADUNLOAD              = 0x000010,
0024     SMART_QUIRK_194_10XCELSIUS              = 0x000020,
0025     SMART_QUIRK_194_UNKNOWN                 = 0x000040,
0026     SMART_QUIRK_200_WRITEERRORCOUNT         = 0x000080,
0027     SMART_QUIRK_201_DETECTEDTACOUNT         = 0x000100,
0028     SMART_QUIRK_5_UNKNOWN                   = 0x000200,
0029     SMART_QUIRK_9_UNKNOWN                   = 0x000400,
0030     SMART_QUIRK_197_UNKNOWN                 = 0x000800,
0031     SMART_QUIRK_198_UNKNOWN                 = 0x001000,
0032     SMART_QUIRK_190_UNKNOWN                 = 0x002000,
0033     SMART_QUIRK_232_AVAILABLERESERVEDSPACE  = 0x004000,
0034     SMART_QUIRK_233_MEDIAWEAROUTINDICATOR   = 0x008000,
0035     SMART_QUIRK_225_TOTALLBASWRITTEN        = 0x010000,
0036     SMART_QUIRK_4_UNUSED                    = 0x020000,
0037     SMART_QUIRK_226_TIMEWORKLOADMEDIAWEAR   = 0x040000,
0038     SMART_QUIRK_227_TIMEWORKLOADHOSTREADS   = 0x080000,
0039     SMART_QUIRK_228_WORKLOADTIMER           = 0x100000,
0040     SMART_QUIRK_3_UNUSED                    = 0x200000,
0041 };
0042 
0043 /** A unit for SMART attributes */
0044 enum class SmartAttributeUnit {
0045     Unknown,
0046     None,
0047     Miliseconds,
0048     Sectors,
0049     Milikelvin,
0050     SmallPercent, /* percentage with 3 decimal points */
0051     Percent,
0052     MB,
0053 };
0054 
0055 /** A SMART parsed attribute.
0056 
0057     It receives the attribute data from JSON, retrieve its data and validates its values.
0058 
0059     @author Caio Jordão Carvalho <caiojcarvalho@gmail.com>
0060 */
0061 class SmartAttributeParsedData
0062 {
0063 public:
0064     /** SMART Quirk to some particular model and firmware */
0065     struct SmartQuirkDataBase {
0066         QString model;
0067         QString firmware;
0068         SmartQuirk quirk;
0069 
0070         SmartQuirkDataBase(const QString &m = QString(),
0071                            const QString &f = QString(),
0072                            SmartQuirk q = SmartQuirk::None) :
0073             model(m),
0074             firmware(f),
0075             quirk(q)
0076         {
0077         };
0078     };
0079 
0080 public:
0081     SmartAttributeParsedData(SmartDiskInformation *disk, QJsonObject jsonAttribute);
0082 
0083     SmartAttributeParsedData(const SmartAttributeParsedData &other);
0084 
0085 public:
0086     quint32 id() const
0087     {
0088         return m_Id;    /**< @return attribute id */
0089     }
0090 
0091     qint32 currentValue() const
0092     {
0093         return m_CurrentValue;    /**< @return attribute current value */
0094     }
0095 
0096     qint32 worstValue() const
0097     {
0098         return m_WorstValue;    /**< @return attribute worst value */
0099     }
0100 
0101     qint32 threshold() const
0102     {
0103         return m_Threshold;    /**< @return attribute threshold value */
0104     }
0105 
0106     bool prefailure() const
0107     {
0108         return m_Prefailure;    /**< @return attribute prefailure status */
0109     }
0110 
0111     bool online() const
0112     {
0113         return m_Online;    /**< @return attribute online status */
0114     }
0115 
0116     quint64 raw() const
0117     {
0118         return m_Raw;    /**< @return attribute raw value */
0119     }
0120 
0121     quint64 prettyValue() const
0122     {
0123         return m_PrettyValue;    /**< @return attribute pretty value */
0124     }
0125 
0126     SmartAttributeUnit prettyUnit() const
0127     {
0128         return m_PrettyUnit;    /**< @return pretty unit value */
0129     }
0130 
0131     bool goodNowValid() const
0132     {
0133         return m_GoodNowValid;    /**< @return good now attribute status validation */
0134     }
0135 
0136     bool goodNow() const
0137     {
0138         return m_GoodNow;    /**< @return good now attribute status */
0139     }
0140 
0141     bool goodInThePastValid() const
0142     {
0143         return m_GoodInThePastValid;    /**< @return good in the past attribute status validation */
0144     }
0145 
0146     bool goodInThePast() const
0147     {
0148         return m_GoodInThePast;    /**< @return good in the past attribute status */
0149     }
0150 
0151     bool thresholdValid() const
0152     {
0153         return m_ThresholdValid;    /**< @return threshold value validation */
0154     }
0155 
0156     bool currentValueValid() const
0157     {
0158         return m_CurrentValueValid;    /**< @return current value validation */
0159     }
0160 
0161     bool worstValueValid() const
0162     {
0163         return m_WorstValueValid;    /**< @return worst value validation */
0164     }
0165 
0166     bool warn() const
0167     {
0168         return m_Warn;    /**< @return warn status */
0169     }
0170 
0171     SmartDiskInformation *disk() const
0172     {
0173         return m_Disk;    /**< @return attribute's disk reference */
0174     }
0175 
0176 protected:
0177     void validateValues();
0178 
0179     bool updateUnit();
0180 
0181     void makePretty();
0182 
0183     void verifyAttribute();
0184 
0185     void verifyTemperature();
0186 
0187     void verifyShortTime();
0188 
0189     void verifyLongTime();
0190 
0191     void verifySectors();
0192 
0193 private:
0194     quint32 m_Id;
0195     qint32 m_CurrentValue;
0196     qint32 m_WorstValue;
0197     qint32 m_Threshold;
0198     quint64 m_Raw;
0199     quint64 m_PrettyValue;
0200     bool m_CurrentValueValid;
0201     bool m_WorstValueValid;
0202     bool m_ThresholdValid;
0203     bool m_Prefailure;
0204     bool m_Online;
0205     bool m_GoodNow;
0206     bool m_GoodNowValid;
0207     bool m_GoodInThePast;
0208     bool m_GoodInThePastValid;
0209     bool m_Warn;
0210     SmartAttributeUnit m_PrettyUnit;
0211     SmartDiskInformation *m_Disk;
0212     SmartQuirk m_Quirk;
0213 };
0214 
0215 #endif // SMARTATTRIBUTEPARSEDDATA_H