From bc58e08b9370382d6495ce9fa859dc1263e2f648 Mon Sep 17 00:00:00 2001 From: Volker Lanz Date: Tue, 27 Apr 2010 16:10:54 +0000 Subject: [PATCH] add saving of smart report to a html file svn path=/trunk/extragear/sysadmin/partitionmanager/; revision=1119675 --- TODO | 2 - src/gui/smartdialog.cpp | 172 +++++++++++++++++++++++++++++++++++++++- src/gui/smartdialog.h | 7 ++ 3 files changed, 177 insertions(+), 4 deletions(-) diff --git a/TODO b/TODO index c12502a..36c9f6f 100644 --- a/TODO +++ b/TODO @@ -1,7 +1,5 @@ Plans and ideas for 1.1: -* save SMART details to html file? - =============================================================================== Bugs to fix for 1.1: diff --git a/src/gui/smartdialog.cpp b/src/gui/smartdialog.cpp index 34307e1..62e3e9a 100644 --- a/src/gui/smartdialog.cpp +++ b/src/gui/smartdialog.cpp @@ -24,6 +24,9 @@ #include "core/smartstatus.h" #include "core/smartattribute.h" +#include "backend/corebackend.h" +#include "backend/corebackendmanager.h" + #include "util/helpers.h" #include @@ -32,8 +35,24 @@ #include #include #include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include +#include +#include +#include + +#include +#include #include @@ -48,7 +67,9 @@ SmartDialog::SmartDialog(QWidget* parent, Device& d) : { setMainWidget(&dialogWidget()); setCaption(i18nc("@title:window", "SMART Properties: %1", device().deviceNode())); - setButtons(Close); + setButtons(Close|User1); + setButtonText(User1, i18nc("@action:button", "Save SMART Report")); + button(User1)->setIcon(KIcon("document-save")); setupDialog(); setupConnections(); @@ -104,7 +125,7 @@ void SmartDialog::setupDialog() QTreeWidgetItem* item = new QTreeWidgetItem( QStringList() << KGlobal::locale()->formatNumber(a.id(), 0) - << QString("%1
%2").arg(a.name()).arg(st + a.desc() + "") + << QString("%1
%2").arg(a.name()).arg(st + a.desc() + "") << (a.failureType() == SmartAttribute::PreFailure ? i18nc("@item:intable", "Pre-Failure") : i18nc("@item:intable", "Old-Age")) << (a.updateType() == SmartAttribute::Online ? i18nc("@item:intable", "Online") : i18nc("@item:intable", "Offline")) << KGlobal::locale()->formatNumber(a.worst(), 0) @@ -127,4 +148,151 @@ void SmartDialog::setupDialog() void SmartDialog::setupConnections() { + connect(this, SIGNAL(user1Clicked()), SLOT(saveSmartReport())); +} + +static QString tableLine(const QString& label, const QString contents) +{ + QString s; + + s += "\n"; + s += QString("%1\n").arg(Qt::escape(label)); + s += QString("%1\n").arg(Qt::escape(contents)); + s += "\n"; + + return s; +} + +QString SmartDialog::toHtml() const +{ + QString rval; + QTextStream s(&rval); + + if (device().smartStatus().isValid()) + { + + const QFont f = KGlobalSettings::smallestReadableFont(); + const QString size = f.pixelSize() != -1 ? QString("%1px").arg(f.pixelSize()) : QString("%1pt").arg(f.pointSize()); + + const QString st = QString("").arg(f.family()).arg(size); + + s << "\n"; + + foreach (const SmartAttribute& a, device().smartStatus().attributes()) + { + s << "\n"; + + s << "\n" + << "\n" + << "\n" + << "\n" + << "\n" + << "\n" + << "\n" + << "\n" + << "\n" + << "\n"; + + s << "\n"; + } + + s << "
" << KGlobal::locale()->formatNumber(a.id(), 0) << "" << QString("%1
%2").arg(a.name()).arg(st + a.desc() + "") << "
" << (a.failureType() == SmartAttribute::PreFailure ? i18nc("@item:intable", "Pre-Failure") : i18nc("@item:intable", "Old-Age")) << "" << (a.updateType() == SmartAttribute::Online ? i18nc("@item:intable", "Online") : i18nc("@item:intable", "Offline")) << "" << KGlobal::locale()->formatNumber(a.worst(), 0) << "" << KGlobal::locale()->formatNumber(a.current(), 0) << "" << KGlobal::locale()->formatNumber(a.threshold(), 0) << "" << a.raw() << "" << a.assessmentToString() << "" << a.value() << "
\n"; + } + else + s << "(unknown)"; + + s.flush(); + + return rval; +} + +QString SmartDialog::htmlHeader() const +{ + QString rval; + QTextStream s(&rval); + + s << + "\n" + "\n" + "\n" + " " + << i18n("%1: SMART Status Report", Qt::escape(KGlobal::mainComponent().aboutData()->programName())) + << "\n" + " \n" + "\n\n" + "\n"; + + s << "

" + << i18n("%1: SMART Status Report", Qt::escape(KGlobal::mainComponent().aboutData()->programName())) + << "

\n\n"; + + struct utsname info; + uname(&info); + const QString unameString = QString(info.sysname) + ' ' + info.nodename + ' ' + info.release + ' ' + info.version + ' ' + info.machine; + + s << "\n" + << tableLine(i18n("Date:"), KGlobal::locale()->formatDateTime(KDateTime::currentLocalDateTime())) + << tableLine(i18n("Program version:"), KGlobal::mainComponent().aboutData()->version()) + << tableLine(i18n("Backend:"), QString("%1 (%2)").arg(CoreBackendManager::self()->backend()->about().programName()).arg(CoreBackendManager::self()->backend()->about().version())) + << tableLine(i18n("KDE version:"), KDE_VERSION_STRING) + << tableLine(i18n("Machine:"), unameString) + << "
\n
\n"; + + s << "\n"; + if (device().smartStatus().status()) + s << tableLine(i18n("SMART status:"), i18nc("@label SMART disk status", "good")); + else + s << tableLine(i18n("SMART status:"), i18nc("@label SMART disk status", "BAD")); + + const QString badSectors = device().smartStatus().badSectors() > 0 + ? KGlobal::locale()->formatNumber(device().smartStatus().badSectors(), 0) + : i18nc("@label SMART number of bad sectors", "none"); + + s << tableLine(i18n("Model:"), device().smartStatus().modelName()) + << tableLine(i18n("Serial number:"), device().smartStatus().serial()) + << tableLine(i18n("Firmware revision:"), device().smartStatus().firmware()) + << tableLine(i18n("Temperature:"), SmartStatus::tempToString(device().smartStatus().temp())) + << tableLine(i18n("Bad sectors:"), badSectors) + << tableLine(i18n("Powered on for:"), KGlobal::locale()->formatDuration(device().smartStatus().poweredOn())) + << tableLine(i18n("Power cycles:"), KGlobal::locale()->formatNumber(device().smartStatus().powerCycles(), 0)) + << tableLine(i18n("Self tests:"), SmartStatus::selfTestStatusToString(device().smartStatus().selfTestStatus())) + << tableLine(i18n("Overall assessment:"), SmartStatus::overallAssessmentToString(device().smartStatus().overall())); + + s << "

"; + + s.flush(); + + return rval; +} + +QString SmartDialog::htmlFooter() const +{ + return "\n\n\n\n"; +} + +void SmartDialog::saveSmartReport() +{ + const KUrl url = KFileDialog::getSaveUrl(KUrl("kfiledialog://saveSMARTReport")); + + if (url.isEmpty()) + return; + + KTemporaryFile tempFile; + + if (tempFile.open()) + { + tempFile.write(htmlHeader().toUtf8()); + tempFile.write(toHtml().toUtf8()); + tempFile.write(htmlFooter().toUtf8()); + + tempFile.close(); + + KIO::CopyJob* job = KIO::move(tempFile.fileName(), url, KIO::HideProgressInfo); + if (!KIO::NetAccess::synchronousRun(job, NULL)) + job->ui()->showErrorMessage(); + } + else + KMessageBox::sorry(this, i18nc("@info", "Could not create temporary file when trying to save to %1.", url.fileName()), i18nc("@title:window", "Could Not Save SMART Report.")); + } diff --git a/src/gui/smartdialog.h b/src/gui/smartdialog.h index 1a86375..efa8d59 100644 --- a/src/gui/smartdialog.h +++ b/src/gui/smartdialog.h @@ -45,6 +45,9 @@ class SmartDialog : public KDialog SmartDialog(QWidget* parent, Device& d); ~SmartDialog(); + protected slots: + void saveSmartReport(); + protected: void setupDialog(); void setupConnections(); @@ -55,6 +58,10 @@ class SmartDialog : public KDialog SmartDialogWidget& dialogWidget() { Q_ASSERT(m_DialogWidget); return *m_DialogWidget; } const SmartDialogWidget& dialogWidget() const { Q_ASSERT(m_DialogWidget); return *m_DialogWidget; } + QString toHtml() const; + QString htmlHeader() const; + QString htmlFooter() const; + private: Device& m_Device; SmartDialogWidget* m_DialogWidget;