Move selftesthandler to utils

This commit is contained in:
spiros
2024-06-19 02:17:46 +03:00
parent a7c7dda87f
commit f4e18061b0
6 changed files with 147 additions and 173 deletions

View File

@@ -285,59 +285,6 @@ void MainWindow::updateUI()
updateNavigationButtons(buttonGroup->buttons().indexOf(buttonGroup->checkedButton()));
}
void MainWindow::selfTestHandler(const QString &mode, const QString &name, const QString &minutes) {
QString output = Utils.initiateSelfTest(mode, name);
if (output.isEmpty()) {
QMessageBox::critical(this, tr("KDiskInfo Error"), tr("KDiskInfo needs root access in order to request a self-test!"));
} else {
QJsonDocument testDoc = QJsonDocument::fromJson(output.toUtf8());
QJsonObject testObj = testDoc.object();
QJsonObject smartctlObj = testObj.value("smartctl").toObject();
QJsonObject deviceObj = testObj.value("device").toObject();
QString name = deviceObj.value("name").toString();
int exitStatus = smartctlObj.value("exit_status").toInt();
QJsonArray outputArray = smartctlObj["output"].toArray();
static const QRegularExpression regex("\\((\\d+%)\\s*(\\w+)\\)");
QString percentage;
for (const QJsonValue &value : outputArray) {
QString line = value.toString();
QRegularExpressionMatch match = regex.match(line);
if (match.hasMatch()) {
percentage = match.captured(0);
break;
}
}
percentage.replace("remaining", tr("remaining"));
percentage.replace("completed", tr("completed"));
if (exitStatus == 4) {
QMessageBox msgBox;
msgBox.setWindowTitle(tr("Test Already Running"));
msgBox.setText(tr("A self-test is already being performed") + " " + percentage + "\n" + tr("You can press the Ok button in order to abort the test that is currently running"));
msgBox.setIcon(QMessageBox::Warning);
msgBox.addButton(QMessageBox::Cancel);
QPushButton *abortButton = msgBox.addButton(QMessageBox::Ok);
msgBox.exec();
if (msgBox.clickedButton() == abortButton) {
Utils.cancelSelfTest(name);
}
} else if (exitStatus == 0) {
QString infoMessage = tr("A self-test has been requested successfully");
if (minutes != "0") {
infoMessage = infoMessage + "\n" + tr("It will be completed after") + " " + minutes + " " + tr("minutes");
}
QMessageBox::information(this, tr("Test Requested"), infoMessage);
} else {
QMessageBox::critical(this, tr("KDiskInfo Error"), tr("Error: Something went wrong"));
}
}
}
void MainWindow::populateWindow(const QJsonObject &localObj, const QString &health, const QVector<QPair<QString, int>>& nvmeLogOrdered)
{
QJsonArray attributes = localObj["ata_smart_attributes"].toObject()["table"].toArray();
@@ -717,7 +664,7 @@ void MainWindow::populateWindow(const QJsonObject &localObj, const QString &heal
}
connect(action, &QAction::triggered, this, [this, mode, name, minutes]() {
selfTestHandler(mode, name, minutes);
Utils.selfTestHandler(mode, name, minutes);
});
i++;
@@ -746,13 +693,13 @@ void MainWindow::populateWindow(const QJsonObject &localObj, const QString &heal
QAction *actionShort = new QAction(tr("Short"), this);
selfTestMenu->addAction(actionShort);
connect(actionShort, &QAction::triggered, this, [this, mode = "short", name, minutes = "0"]() {
selfTestHandler(mode, name, minutes);
Utils.selfTestHandler(mode, name, minutes);
});
QAction *actionLong = new QAction(tr("Extended"), this);
selfTestMenu->addAction(actionLong);
connect(actionLong , &QAction::triggered, this, [this, mode = "long", name, minutes = "0"]() {
selfTestHandler(mode, name, minutes);
Utils.selfTestHandler(mode, name, minutes);
});
if (nvmeSelfTestsTable.isEmpty()) {

View File

@@ -2,21 +2,6 @@
#define MAINWINDOW_H
#include <QMainWindow>
#include <QProcess>
#include <QWidget>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
#include <QButtonGroup>
#include <QAction>
#include <QFileDialog>
#include <QMessageBox>
#include <QDesktopServices>
#include <QUrl>
#include <QTimer>
#include <QSettings>
#include <QMouseEvent>
#include <QActionGroup>
#include <cmath>
#include "statusdot.h"
@@ -95,7 +80,6 @@ private:
void onPrevButtonClicked();
void updateNavigationButtons(int currentIndex);
void updateUI();
void selfTestHandler(const QString &mode, const QString &name, const QString &minutes);
void populateWindow(const QJsonObject &tempObj, const QString &health, const QVector<QPair<QString, int>>& nvmeLogOrdered = QVector<QPair<QString, int>>());
void addNvmeLogTable(const QVector<QPair<QString, int>>& nvmeLogOrdered);
void addSmartAttributesTable(const QJsonArray &attributes);

View File

@@ -145,6 +145,59 @@ void utils::cancelSelfTest(const QString &deviceNode)
}
}
void utils::selfTestHandler(const QString &mode, const QString &name, const QString &minutes) {
QString output = initiateSelfTest(mode, name);
if (output.isEmpty()) {
QMessageBox::critical(nullptr, QObject::tr("KDiskInfo Error"), QObject::tr("KDiskInfo needs root access in order to request a self-test!"));
} else {
QJsonDocument testDoc = QJsonDocument::fromJson(output.toUtf8());
QJsonObject testObj = testDoc.object();
QJsonObject smartctlObj = testObj.value("smartctl").toObject();
QJsonObject deviceObj = testObj.value("device").toObject();
QString name = deviceObj.value("name").toString();
int exitStatus = smartctlObj.value("exit_status").toInt();
QJsonArray outputArray = smartctlObj["output"].toArray();
static const QRegularExpression regex("\\((\\d+%)\\s*(\\w+)\\)");
QString percentage;
for (const QJsonValue &value : outputArray) {
QString line = value.toString();
QRegularExpressionMatch match = regex.match(line);
if (match.hasMatch()) {
percentage = match.captured(0);
break;
}
}
percentage.replace("remaining", QObject::tr("remaining"));
percentage.replace("completed", QObject::tr("completed"));
if (exitStatus == 4) {
QMessageBox msgBox;
msgBox.setWindowTitle(QObject::tr("Test Already Running"));
msgBox.setText(QObject::tr("A self-test is already being performed") + " " + percentage + "\n" + QObject::tr("You can press the Ok button in order to abort the test that is currently running"));
msgBox.setIcon(QMessageBox::Warning);
msgBox.addButton(QMessageBox::Cancel);
QPushButton *abortButton = msgBox.addButton(QMessageBox::Ok);
msgBox.exec();
if (msgBox.clickedButton() == abortButton) {
cancelSelfTest(name);
}
} else if (exitStatus == 0) {
QString infoMessage = QObject::tr("A self-test has been requested successfully");
if (minutes != "0") {
infoMessage = infoMessage + "\n" + QObject::tr("It will be completed after") + " " + minutes + " " + QObject::tr("minutes");
}
QMessageBox::information(nullptr, QObject::tr("Test Requested"), infoMessage);
} else {
QMessageBox::critical(nullptr, QObject::tr("KDiskInfo Error"), QObject::tr("Error: Something went wrong"));
}
}
}
QString utils::toTitleCase(const QString& sentence) {
QString result;
bool capitalizeNext = true;

View File

@@ -19,6 +19,7 @@
#include <QActionGroup>
#include <QHBoxLayout>
#include <QSpacerItem>
#include <QPushButton>
#include <QAbstractButton>
#include <QMenu>
#include <QApplication>
@@ -34,6 +35,7 @@ public:
QPair<QStringList, QJsonArray> scanDevices(bool initializing);
QString initiateSelfTest(const QString &testType, const QString &deviceNode);
void cancelSelfTest(const QString &deviceNode);
void selfTestHandler(const QString &mode, const QString &name, const QString &minutes);
QString toTitleCase(const QString& sentence);
};

Binary file not shown.

View File

@@ -55,7 +55,7 @@
</message>
<message>
<location filename="../src/mainwindow.ui" line="282"/>
<location filename="../src/mainwindow.cpp" line="387"/>
<location filename="../src/mainwindow.cpp" line="334"/>
<source>Type</source>
<translation>Τύπος</translation>
</message>
@@ -81,7 +81,7 @@
</message>
<message>
<location filename="../src/mainwindow.ui" line="360"/>
<location filename="../src/mainwindow.cpp" line="387"/>
<location filename="../src/mainwindow.cpp" line="334"/>
<source>Power On Hours</source>
<translation>Ώρες Λειτουργίας</translation>
</message>
@@ -168,19 +168,19 @@
</message>
<message>
<location filename="../src/mainwindow.cpp" line="216"/>
<location filename="../src/mainwindow.cpp" line="671"/>
<location filename="../src/mainwindow.cpp" line="618"/>
<source>Good</source>
<translation>Καλή</translation>
</message>
<message>
<location filename="../src/mainwindow.cpp" line="219"/>
<location filename="../src/mainwindow.cpp" line="669"/>
<location filename="../src/mainwindow.cpp" line="616"/>
<source>Caution</source>
<translation>Προσοχή</translation>
</message>
<message>
<location filename="../src/mainwindow.cpp" line="222"/>
<location filename="../src/mainwindow.cpp" line="667"/>
<location filename="../src/mainwindow.cpp" line="614"/>
<source>Bad</source>
<translation>Κακή</translation>
</message>
@@ -190,71 +190,40 @@
<translation>Άγνωστη</translation>
</message>
<message>
<location filename="../src/mainwindow.cpp" line="775"/>
<location filename="../src/mainwindow.cpp" line="871"/>
<location filename="../src/mainwindow.cpp" line="722"/>
<location filename="../src/mainwindow.cpp" line="818"/>
<source>Attribute Name</source>
<translation>Ιδιότητα</translation>
</message>
<message>
<location filename="../src/mainwindow.cpp" line="775"/>
<location filename="../src/mainwindow.cpp" line="871"/>
<location filename="../src/mainwindow.cpp" line="722"/>
<location filename="../src/mainwindow.cpp" line="818"/>
<source>Raw Values</source>
<translation>Τιμή</translation>
</message>
<message>
<location filename="../src/mainwindow.cpp" line="871"/>
<location filename="../src/mainwindow.cpp" line="818"/>
<source>Current</source>
<translation>Τρέχουσα</translation>
</message>
<message>
<location filename="../src/mainwindow.cpp" line="871"/>
<location filename="../src/mainwindow.cpp" line="818"/>
<source>Worst</source>
<translation>Χειρότερη</translation>
</message>
<message>
<location filename="../src/mainwindow.cpp" line="871"/>
<location filename="../src/mainwindow.cpp" line="818"/>
<source>Threshold</source>
<translation>Όριο</translation>
</message>
<message>
<location filename="../src/mainwindow.cpp" line="291"/>
<location filename="../src/mainwindow.cpp" line="336"/>
<source>KDiskInfo Error</source>
<translation>Σφάλμα KDiskInfo</translation>
</message>
<message>
<location filename="../src/mainwindow.cpp" line="291"/>
<source>KDiskInfo needs root access in order to request a self-test!</source>
<translation>Το KDiskInfo χρειάζεται δικαιώματα υπερχρήστη για να εκτελέσει την αυτοδιάγνωση!</translation>
</message>
<message>
<location filename="../src/mainwindow.cpp" line="317"/>
<source>Test Already Running</source>
<translation>Μία αυτοδιάγνωση είναι ήδη σε εκτέλεση</translation>
</message>
<message>
<location filename="../src/mainwindow.cpp" line="330"/>
<source>A self-test has been requested successfully</source>
<translation>Η αυτοδιάγνωση ξεκίνησε επιτυχώς</translation>
</message>
<message>
<location filename="../src/mainwindow.cpp" line="334"/>
<source>Test Requested</source>
<translation>Η αυτοδιάγνωση ξεκίνησε</translation>
</message>
<message>
<location filename="../src/mainwindow.cpp" line="336"/>
<source>Error: Something went wrong</source>
<translation>Σφάλμα: Κάτι πήγε στραβά</translation>
</message>
<message>
<location filename="../src/mainwindow.cpp" line="387"/>
<source>Status</source>
<translation>Κατάσταση</translation>
</message>
<message>
<location filename="../src/mainwindow.cpp" line="59"/>
<location filename="../src/mainwindow.cpp" line="432"/>
<location filename="../src/mainwindow.cpp" line="379"/>
<source>Self Test Log</source>
<translation>&amp;Καταγραφολόγιο Αυτοδιάγνωσης</translation>
</message>
@@ -264,155 +233,125 @@
<translation>&amp;Εκκίνηση Αυτοδιάγνωσης</translation>
</message>
<message>
<location filename="../src/mainwindow.cpp" line="318"/>
<source>A self-test is already being performed</source>
<translation>Μία αυτοδιάγνωση εκτελείτε αυτή τη στιγμή</translation>
</message>
<message>
<location filename="../src/mainwindow.cpp" line="318"/>
<source>You can press the Ok button in order to abort the test that is currently running</source>
<translation>Μπορείτε να πατήσετε το κουμπί Εντάξει για να ακυρώσετε την τρέχουσα αυτοδιάγνωση</translation>
</message>
<message>
<location filename="../src/mainwindow.cpp" line="332"/>
<source>minutes</source>
<translation>λεπτά</translation>
</message>
<message>
<location filename="../src/mainwindow.cpp" line="708"/>
<location filename="../src/mainwindow.cpp" line="655"/>
<source>Min.)</source>
<translation>Λεπ.)</translation>
</message>
<message>
<location filename="../src/mainwindow.cpp" line="699"/>
<location filename="../src/mainwindow.cpp" line="746"/>
<location filename="../src/mainwindow.cpp" line="646"/>
<location filename="../src/mainwindow.cpp" line="693"/>
<source>Short</source>
<translation>Σύντομο</translation>
</message>
<message>
<location filename="../src/mainwindow.cpp" line="312"/>
<source>remaining</source>
<translation>απομένει</translation>
</message>
<message>
<location filename="../src/mainwindow.cpp" line="313"/>
<source>completed</source>
<translation>ολοκληρώθηκε</translation>
</message>
<message>
<location filename="../src/mainwindow.cpp" line="332"/>
<source>It will be completed after</source>
<translation>Θα τελειώσει μετά από</translation>
</message>
<message>
<location filename="../src/mainwindow.cpp" line="467"/>
<location filename="../src/mainwindow.cpp" line="414"/>
<source>count</source>
<translation>μονάδες</translation>
</message>
<message>
<location filename="../src/mainwindow.cpp" line="478"/>
<location filename="../src/mainwindow.cpp" line="425"/>
<source>hours</source>
<translation>ώρες</translation>
</message>
<message>
<location filename="../src/mainwindow.cpp" line="701"/>
<location filename="../src/mainwindow.cpp" line="648"/>
<source>Conveyance</source>
<translation>Μεταφορά</translation>
</message>
<message>
<location filename="../src/mainwindow.cpp" line="703"/>
<location filename="../src/mainwindow.cpp" line="752"/>
<location filename="../src/mainwindow.cpp" line="650"/>
<location filename="../src/mainwindow.cpp" line="699"/>
<source>Extended</source>
<translation>Εμπεριστατωμένο</translation>
</message>
<message>
<location filename="../src/mainwindow.cpp" line="775"/>
<location filename="../src/mainwindow.cpp" line="871"/>
<location filename="../src/mainwindow.cpp" line="722"/>
<location filename="../src/mainwindow.cpp" line="818"/>
<source>ID</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/mainwindow.cpp" line="802"/>
<location filename="../src/mainwindow.cpp" line="749"/>
<source>Available spare capacity has fallen below the threshold</source>
<translation>Η υγεία του δίσκου έχει πέσει κάτω από το όριο</translation>
</message>
<message>
<location filename="../src/mainwindow.cpp" line="804"/>
<location filename="../src/mainwindow.cpp" line="751"/>
<source>Temperature error (Overheat or Overcool)</source>
<translation>Σφάλμα θερμοκρασίας (Υπερθέρμανση ή Υπερψύξη)</translation>
</message>
<message>
<location filename="../src/mainwindow.cpp" line="806"/>
<location filename="../src/mainwindow.cpp" line="753"/>
<source>NVM subsystem reliability has been degraded</source>
<translation>Η αξιοπιστία του NVMe έχει μειωθεί</translation>
</message>
<message>
<location filename="../src/mainwindow.cpp" line="808"/>
<location filename="../src/mainwindow.cpp" line="755"/>
<source>Media has been placed in Read Only Mode</source>
<translation>Το μέσο έχει τεθεί αποκλειστικά σε λειτουργία ανάγνωσης</translation>
</message>
<message>
<location filename="../src/mainwindow.cpp" line="810"/>
<location filename="../src/mainwindow.cpp" line="757"/>
<source>Volatile memory backup device has Failed</source>
<translation>Η δημιουργία αρχείου επαναφοράς της μη διατηρήσιμης μνήμης απέτυχε</translation>
</message>
<message>
<location filename="../src/mainwindow.cpp" line="812"/>
<location filename="../src/mainwindow.cpp" line="759"/>
<source>Persistent memory region has become Read-Only</source>
<translation>Η διατηρήσιμη μνήμη έχει μεταβεί αποκλειστικά σε λειτουργία ανάγνωσης</translation>
</message>
<message>
<location filename="../src/mainwindow.cpp" line="864"/>
<location filename="../src/mainwindow.cpp" line="811"/>
<source>Critical Warning</source>
<translation>Σημαντική Προειδοποίηση</translation>
</message>
<message>
<location filename="../src/mainwindow.cpp" line="974"/>
<location filename="../src/mainwindow.cpp" line="921"/>
<source>Empty JSON</source>
<translation>Κενό JSON</translation>
</message>
<message>
<location filename="../src/mainwindow.cpp" line="975"/>
<location filename="../src/mainwindow.cpp" line="922"/>
<source>The JSON is empty</source>
<translation>Αυτό το JSON είναι κενό</translation>
</message>
<message>
<location filename="../src/mainwindow.cpp" line="980"/>
<location filename="../src/mainwindow.cpp" line="927"/>
<source>Save JSON</source>
<translation>Αποθήκευση JSON</translation>
</message>
<message>
<location filename="../src/mainwindow.cpp" line="981"/>
<location filename="../src/mainwindow.cpp" line="928"/>
<source>JSON (*.json);;All Files (*)</source>
<translation>JSON (*.json);;;Όλα τα αρχεία (*)</translation>
</message>
<message>
<location filename="../src/mainwindow.cpp" line="987"/>
<location filename="../src/mainwindow.cpp" line="934"/>
<source>Unable to open file for writing</source>
<translation>Δεν είναι δυνατό το άνοιγμα αυτού του αρχείου για εγγραφή</translation>
</message>
<message>
<location filename="../src/mainwindow.cpp" line="1018"/>
<location filename="../src/mainwindow.cpp" line="965"/>
<source>An ATA and NVMe S.M.A.R.T. data viewer for Linux</source>
<translation>Ένας αναγνώστης S.M.A.R.T. για τα Linux</translation>
</message>
<message>
<location filename="../src/mainwindow.cpp" line="1019"/>
<location filename="../src/mainwindow.cpp" line="966"/>
<source>Licensed under the GNU G.P.L. Version 3</source>
<translation>Διατίθεται υπό την άδεια GNU G.P.L. Έκδοση 3</translation>
</message>
<message>
<location filename="../src/mainwindow.cpp" line="1021"/>
<location filename="../src/mainwindow.cpp" line="968"/>
<source>Version</source>
<translation>Έκδοση</translation>
</message>
<message>
<location filename="../src/mainwindow.cpp" line="1020"/>
<location filename="../src/mainwindow.cpp" line="967"/>
<source>Made by Samantas5855</source>
<translation>Δημιουργήθηκε από τον Samantas5855</translation>
</message>
<message>
<location filename="../src/mainwindow.cpp" line="1023"/>
<location filename="../src/mainwindow.cpp" line="970"/>
<source>About KDiskInfo</source>
<translation>Σχετικά με το KDiskInfo</translation>
</message>
@@ -424,6 +363,8 @@
<location filename="../src/utils.cpp" line="82"/>
<location filename="../src/utils.cpp" line="140"/>
<location filename="../src/utils.cpp" line="144"/>
<location filename="../src/utils.cpp" line="151"/>
<location filename="../src/utils.cpp" line="196"/>
<source>KDiskInfo Error</source>
<translation type="unfinished">Σφάλμα KDiskInfo</translation>
</message>
@@ -444,6 +385,7 @@
</message>
<message>
<location filename="../src/utils.cpp" line="142"/>
<location filename="../src/utils.cpp" line="194"/>
<source>Test Requested</source>
<translation type="unfinished">Η αυτοδιάγνωση ξεκίνησε</translation>
</message>
@@ -454,8 +396,54 @@
</message>
<message>
<location filename="../src/utils.cpp" line="144"/>
<location filename="../src/utils.cpp" line="196"/>
<source>Error: Something went wrong</source>
<translation type="unfinished">Σφάλμα: Κάτι πήγε στραβά</translation>
</message>
<message>
<location filename="../src/utils.cpp" line="151"/>
<source>KDiskInfo needs root access in order to request a self-test!</source>
<translation type="unfinished">Το KDiskInfo χρειάζεται δικαιώματα υπερχρήστη για να εκτελέσει την αυτοδιάγνωση!</translation>
</message>
<message>
<location filename="../src/utils.cpp" line="172"/>
<source>remaining</source>
<translation type="unfinished">απομένει</translation>
</message>
<message>
<location filename="../src/utils.cpp" line="173"/>
<source>completed</source>
<translation type="unfinished">ολοκληρώθηκε</translation>
</message>
<message>
<location filename="../src/utils.cpp" line="177"/>
<source>Test Already Running</source>
<translation type="unfinished">Μία αυτοδιάγνωση είναι ήδη σε εκτέλεση</translation>
</message>
<message>
<location filename="../src/utils.cpp" line="178"/>
<source>A self-test is already being performed</source>
<translation type="unfinished">Μία αυτοδιάγνωση εκτελείτε αυτή τη στιγμή</translation>
</message>
<message>
<location filename="../src/utils.cpp" line="178"/>
<source>You can press the Ok button in order to abort the test that is currently running</source>
<translation type="unfinished">Μπορείτε να πατήσετε το κουμπί Εντάξει για να ακυρώσετε την τρέχουσα αυτοδιάγνωση</translation>
</message>
<message>
<location filename="../src/utils.cpp" line="190"/>
<source>A self-test has been requested successfully</source>
<translation type="unfinished">Η αυτοδιάγνωση ξεκίνησε επιτυχώς</translation>
</message>
<message>
<location filename="../src/utils.cpp" line="192"/>
<source>It will be completed after</source>
<translation type="unfinished">Θα τελειώσει μετά από</translation>
</message>
<message>
<location filename="../src/utils.cpp" line="192"/>
<source>minutes</source>
<translation type="unfinished">λεπτά</translation>
</message>
</context>
</TS>