File indexing completed on 2024-04-21 05:46:23

0001 /*
0002     SPDX-FileCopyrightText: 2007 Nicolas Ternisien <nicolas.ternisien@gmail.com>
0003 
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #include "loggerDialog.h"
0008 
0009 #include <QProcess>
0010 
0011 #include <KLocalizedString>
0012 #include <KMessageBox>
0013 #include <QDesktopServices>
0014 
0015 // Project includes
0016 #include "ksystemlog_debug.h"
0017 
0018 #include "globals.h"
0019 #include "logLevel.h"
0020 
0021 LoggerDialog::LoggerDialog(QWidget *parent)
0022     : QDialog(parent)
0023 {
0024     setupUi(this);
0025 
0026     connect(buttonOK, &QAbstractButton::clicked, this, &LoggerDialog::sendMessage);
0027     connect(buttonCancel, &QAbstractButton::clicked, this, &QWidget::hide);
0028 
0029     connect(tagActivation, &QAbstractButton::toggled, this, &LoggerDialog::changeTagActivation);
0030     connect(fileActivation, &QAbstractButton::toggled, this, &LoggerDialog::changeFileActivation);
0031     connect(messageActivation, &QAbstractButton::toggled, this, &LoggerDialog::changeMessageActivation);
0032 
0033     connect(file, &KUrlRequester::textChanged, this, &LoggerDialog::textChanged);
0034     connect(message, &QLineEdit::textChanged, this, &LoggerDialog::textChanged);
0035     connect(tag, &QLineEdit::textChanged, this, &LoggerDialog::textChanged);
0036     connect(loggerManual, &QLabel::linkActivated, this, &LoggerDialog::slotLinkClicked);
0037     buildMaps();
0038 
0039     // Fill the priority ComboBox
0040     QList<QString> prioKeys(mPriorities.keys());
0041 
0042     QList<QString>::Iterator itPriority;
0043     for (itPriority = prioKeys.begin(); itPriority != prioKeys.end(); ++itPriority) {
0044         priority->addItem(mPriorityIcons[*itPriority], *itPriority);
0045     }
0046 
0047     // Select the right priority
0048     for (int i = 0; i < priority->count(); ++i) {
0049         if (priority->itemText(i) == Globals::instance().noticeLogLevel()->name()) {
0050             priority->setCurrentIndex(i);
0051             break;
0052         }
0053     }
0054 
0055     // Fill the priority ComboBox
0056     QList<QString> keys(mFacilities.keys());
0057 
0058     QList<QString>::Iterator itFacility;
0059     for (itFacility = keys.begin(); itFacility != keys.end(); ++itFacility) {
0060         facility->addItem(*itFacility);
0061     }
0062 
0063     // Select the right facility
0064     for (int i = 0, total = facility->count(); i < total; ++i) {
0065         if (facility->itemText(i) == i18n("User")) {
0066             facility->setCurrentIndex(i);
0067             break;
0068         }
0069     }
0070     tag->setEnabled(false);
0071 }
0072 
0073 LoggerDialog::~LoggerDialog()
0074 {
0075 }
0076 
0077 void LoggerDialog::slotLinkClicked(const QString &link)
0078 {
0079     QDesktopServices::openUrl(QUrl::fromUserInput(link));
0080 }
0081 
0082 void LoggerDialog::initialize()
0083 {
0084     qCDebug(KSYSTEMLOG) << "Initializing Logger dialog...";
0085 
0086     message->clear();
0087     message->setFocus();
0088 }
0089 
0090 void LoggerDialog::buildMaps()
0091 {
0092     // Fill the facility map
0093     mFacilities[i18n("Authentication")] = QStringLiteral("auth");
0094     mFacilities[i18n("Private Authentication")] = QStringLiteral("authpriv");
0095     mFacilities[i18n("Cron")] = QStringLiteral("cron");
0096     mFacilities[i18n("Daemon")] = QStringLiteral("daemon");
0097     mFacilities[i18n("FTP")] = QStringLiteral("ftp");
0098     mFacilities[i18n("Kernel")] = QStringLiteral("kern");
0099     mFacilities[i18n("LPR")] = QStringLiteral("lpr");
0100     mFacilities[i18n("Mail")] = QStringLiteral("mail");
0101     mFacilities[i18n("News")] = QStringLiteral("news");
0102     mFacilities[i18n("Syslog")] = QStringLiteral("syslog");
0103     mFacilities[i18n("User")] = QStringLiteral("user");
0104     mFacilities[i18n("UUCP")] = QStringLiteral("uucp");
0105 
0106     mFacilities[i18n("Local 0")] = QStringLiteral("local0");
0107     mFacilities[i18n("Local 1")] = QStringLiteral("local1");
0108     mFacilities[i18n("Local 2")] = QStringLiteral("local2");
0109     mFacilities[i18n("Local 3")] = QStringLiteral("local3");
0110     mFacilities[i18n("Local 4")] = QStringLiteral("local4");
0111     mFacilities[i18n("Local 5")] = QStringLiteral("local5");
0112     mFacilities[i18n("Local 6")] = QStringLiteral("local6");
0113     mFacilities[i18n("Local 7")] = QStringLiteral("local7");
0114 
0115     // Fill the priority map
0116     mPriorities[Globals::instance().debugLogLevel()->name()] = QStringLiteral("debug");
0117     mPriorities[Globals::instance().informationLogLevel()->name()] = QStringLiteral("info");
0118     mPriorities[Globals::instance().noticeLogLevel()->name()] = QStringLiteral("notice");
0119     mPriorities[Globals::instance().warningLogLevel()->name()] = QStringLiteral("warning");
0120     mPriorities[Globals::instance().errorLogLevel()->name()] = QStringLiteral("err");
0121     mPriorities[Globals::instance().criticalLogLevel()->name()] = QStringLiteral("crit");
0122     mPriorities[Globals::instance().alertLogLevel()->name()] = QStringLiteral("alert");
0123     mPriorities[Globals::instance().emergencyLogLevel()->name()] = QStringLiteral("emerg");
0124 
0125     // Fill the priority icon map
0126     mPriorityIcons[Globals::instance().debugLogLevel()->name()] = QIcon::fromTheme(Globals::instance().debugLogLevel()->icon().name());
0127     mPriorityIcons[Globals::instance().informationLogLevel()->name()] = QIcon::fromTheme(Globals::instance().informationLogLevel()->icon().name());
0128     mPriorityIcons[Globals::instance().noticeLogLevel()->name()] = QIcon::fromTheme(Globals::instance().noticeLogLevel()->icon().name());
0129     mPriorityIcons[Globals::instance().warningLogLevel()->name()] = QIcon::fromTheme(Globals::instance().warningLogLevel()->icon().name());
0130     mPriorityIcons[Globals::instance().errorLogLevel()->name()] = QIcon::fromTheme(Globals::instance().errorLogLevel()->icon().name());
0131     mPriorityIcons[Globals::instance().criticalLogLevel()->name()] = QIcon::fromTheme(Globals::instance().criticalLogLevel()->icon().name());
0132     mPriorityIcons[Globals::instance().alertLogLevel()->name()] = QIcon::fromTheme(Globals::instance().alertLogLevel()->icon().name());
0133     mPriorityIcons[Globals::instance().emergencyLogLevel()->name()] = QIcon::fromTheme(Globals::instance().emergencyLogLevel()->icon().name());
0134 }
0135 
0136 void LoggerDialog::textChanged()
0137 {
0138     if (fileActivation->isChecked() && file->url().isEmpty()) {
0139         buttonOK->setEnabled(false);
0140         return;
0141     }
0142 
0143     if (tagActivation->isChecked() && tag->text().isEmpty()) {
0144         buttonOK->setEnabled(false);
0145         return;
0146     }
0147 
0148     if (messageActivation->isChecked() && message->text().isEmpty()) {
0149         buttonOK->setEnabled(false);
0150         return;
0151     }
0152 
0153     buttonOK->setEnabled(true);
0154 }
0155 
0156 void LoggerDialog::changeTagActivation(bool activation)
0157 {
0158     tag->setEnabled(activation);
0159 
0160     textChanged();
0161 }
0162 
0163 void LoggerDialog::changeFileActivation(bool activation)
0164 {
0165     file->setEnabled(activation);
0166 
0167     textChanged();
0168 }
0169 
0170 void LoggerDialog::changeMessageActivation(bool activation)
0171 {
0172     message->setEnabled(activation);
0173 
0174     textChanged();
0175 }
0176 
0177 void LoggerDialog::sendMessage()
0178 {
0179     QProcess process;
0180 
0181     QStringList arguments;
0182 
0183     if (useProcessIdentifier->isChecked()) {
0184         arguments << QStringLiteral("-i");
0185     }
0186 
0187     if (tagActivation->isChecked()) {
0188         arguments << QStringLiteral("-t");
0189 
0190         arguments << tag->text();
0191     }
0192 
0193     const QString prioritySelected = priority->currentText();
0194 
0195     if (prioritySelected != Globals::instance().noLogLevel()->name()) {
0196         arguments << QStringLiteral("-p");
0197 
0198         QString p(mFacilities[facility->currentText()]);
0199         p += QLatin1Char('.');
0200         p += mPriorities[priority->currentText()];
0201 
0202         arguments << p;
0203     }
0204 
0205     // If we read the content of a file
0206     if (fileActivation->isChecked()) {
0207         arguments << QStringLiteral("-f");
0208 
0209         arguments << file->url().toLocalFile();
0210     }
0211     // Else, the user types the content of its message
0212     else {
0213         // Remove bad "\n" characters
0214         arguments << message->text().replace(QLatin1String("\n"), QLatin1String(" "));
0215     }
0216 
0217     // QProcess::Block, QProcess::Stdout
0218     process.start(QStringLiteral("logger"), arguments);
0219 
0220     // If the launching of the command failed
0221     if (process.error() == QProcess::FailedToStart) {
0222         KMessageBox::error(this,
0223                            i18n("Unable to find the 'logger' command on your system. Please type "
0224                                 "'logger' in a Konsole to determine whether this command is installed."),
0225                            i18n("Command not found"));
0226         return;
0227     }
0228 
0229     if (process.exitStatus() == QProcess::CrashExit) {
0230         KMessageBox::error(this, i18n("The 'logger' command has not been properly exited."), i18n("Execution problem"));
0231         return;
0232     }
0233 
0234     // No such file or directory
0235     if (process.exitCode() == 1) {
0236         KMessageBox::error(this, i18n("This file does not exist, please choose another."), i18n("File not valid"));
0237         return;
0238     }
0239 
0240     // Hide the Logger Dialog
0241     hide();
0242 }
0243 
0244 #include "moc_loggerDialog.cpp"