File indexing completed on 2024-05-05 05:48:56

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 "globals.h"
0008 
0009 #include <QMap>
0010 
0011 #include <KLocalizedString>
0012 
0013 #include "defaults.h"
0014 #include "logFile.h"
0015 #include "logLevel.h"
0016 
0017 #include "analyzer.h"
0018 #include "logModeAction.h"
0019 #include "logModeConfiguration.h"
0020 #include "logModeConfigurationWidget.h"
0021 
0022 #include "ksystemlog_debug.h"
0023 
0024 #include <KColorScheme>
0025 
0026 Globals &Globals::instance()
0027 {
0028     static Globals self;
0029     return self;
0030 }
0031 
0032 class GlobalsPrivate
0033 {
0034 public:
0035     /**
0036      * Existing Log modes.
0037      */
0038     QMap<QString, LogMode *> mLogModes;
0039 
0040     QList<LogModeAction *> mLogModeActions;
0041 
0042     QMetaEnum mLogLevelsMetaEnum;
0043 
0044     /**
0045      * Existing Log levels. The id value corresponds to the index in the vector
0046      */
0047     QHash<Globals::LogLevelIds, LogLevel *> mLogLevels;
0048 
0049     QList<LogModeFactory *> mFactories;
0050 
0051     /**
0052      * These value are only pointers to item of the previous vector,
0053      * they are provided for convenience
0054      */
0055     LogLevel *mNoLogLevel = nullptr;
0056     LogLevel *mDebugLogLevel = nullptr;
0057     LogLevel *mInformationLogLevel = nullptr;
0058     LogLevel *mNoticeLogLevel = nullptr;
0059     LogLevel *mWarningLogLevel = nullptr;
0060     LogLevel *mErrorLogLevel = nullptr;
0061     LogLevel *mCriticalLogLevel = nullptr;
0062     LogLevel *mAlertLogLevel = nullptr;
0063     LogLevel *mEmergencyLogLevel = nullptr;
0064 };
0065 
0066 Globals::Globals()
0067     : d(new GlobalsPrivate())
0068 {
0069     setupLogLevels();
0070 }
0071 
0072 Globals::~Globals()
0073 {
0074     qDeleteAll(d->mLogModeActions);
0075     d->mLogModeActions.clear();
0076 
0077     qDeleteAll(d->mLogModes);
0078     d->mLogModes.clear();
0079 
0080     qDeleteAll(d->mLogLevels);
0081     d->mLogLevels.clear();
0082 
0083     qDeleteAll(d->mFactories);
0084     d->mFactories.clear();
0085 
0086     delete d;
0087 }
0088 
0089 QString Globals::formatDate(Globals::DateFormat format, const QDateTime &dateTime) const
0090 {
0091     switch (format) {
0092     case LongFormat:
0093     case ShortFormat:
0094         return QLocale().toString(dateTime, static_cast<QLocale::FormatType>(format));
0095     case PreciseFormat:
0096         return dateTime.toString(QStringLiteral("dd.MM.yyyy hh:mm:ss:zzz"));
0097     }
0098     return QLocale().toString(dateTime, QLocale::ShortFormat);
0099 }
0100 
0101 void Globals::setupLogLevels()
0102 {
0103     KColorScheme const scheme(QPalette::Active, KColorScheme::View);
0104 
0105     QColor const redColor = scheme.foreground(KColorScheme::NegativeText).color();
0106     QColor const inactiveText = scheme.foreground(KColorScheme::InactiveText).color();
0107     int const index = metaObject()->indexOfEnumerator("LogLevelIds");
0108     d->mLogLevelsMetaEnum = metaObject()->enumerator(index);
0109 
0110     d->mNoLogLevel = new LogLevel(NONE_LOG_LEVEL_ID, i18n("None"), QStringLiteral("edit-none"), inactiveText.darker(120));
0111     d->mLogLevels[NONE_LOG_LEVEL_ID] = d->mNoLogLevel;
0112 
0113     d->mDebugLogLevel = new LogLevel(DEBUG_LOG_LEVEL_ID, i18n("Debug"), QStringLiteral("debug-run"), inactiveText);
0114     d->mLogLevels[DEBUG_LOG_LEVEL_ID] = d->mDebugLogLevel;
0115 
0116     d->mInformationLogLevel = new LogLevel(INFORMATION_LOG_LEVEL_ID,
0117                                            i18n("Information"),
0118                                            QStringLiteral("dialog-information"),
0119                                            scheme.foreground(KColorScheme::ActiveText).color() /*QColor(0, 0, 0)*/);
0120     d->mLogLevels[INFORMATION_LOG_LEVEL_ID] = d->mInformationLogLevel;
0121 
0122     d->mNoticeLogLevel = new LogLevel(NOTICE_LOG_LEVEL_ID, i18n("Notice"), QStringLiteral("note"), scheme.foreground(KColorScheme::PositiveText).color());
0123     d->mLogLevels[NOTICE_LOG_LEVEL_ID] = d->mNoticeLogLevel;
0124 
0125     d->mWarningLogLevel =
0126         new LogLevel(WARNING_LOG_LEVEL_ID, i18n("Warning"), QStringLiteral("dialog-warning"), scheme.foreground(KColorScheme::NeutralText).color());
0127     d->mLogLevels[WARNING_LOG_LEVEL_ID] = d->mWarningLogLevel;
0128 
0129     d->mErrorLogLevel = new LogLevel(ERROR_LOG_LEVEL_ID, i18n("Error"), QStringLiteral("dialog-error"), redColor.darker(200));
0130     d->mLogLevels[ERROR_LOG_LEVEL_ID] = d->mErrorLogLevel;
0131 
0132     d->mCriticalLogLevel = new LogLevel(CRITICAL_LOG_LEVEL_ID, i18n("Critical"), QStringLiteral("dialog-error"), redColor.darker(150));
0133     d->mLogLevels[CRITICAL_LOG_LEVEL_ID] = d->mCriticalLogLevel;
0134 
0135     d->mAlertLogLevel = new LogLevel(ALERT_LOG_LEVEL_ID, i18n("Alert"), QStringLiteral("preferences-desktop-notification-bell"), redColor.darker(120));
0136     d->mLogLevels[ALERT_LOG_LEVEL_ID] = d->mAlertLogLevel;
0137 
0138     d->mEmergencyLogLevel = new LogLevel(EMERGENCY_LOG_LEVEL_ID, i18n("Emergency"), QStringLiteral("application-exit"), redColor);
0139     d->mLogLevels[EMERGENCY_LOG_LEVEL_ID] = d->mEmergencyLogLevel;
0140 }
0141 
0142 QList<LogMode *> Globals::logModes() const
0143 {
0144     return d->mLogModes.values();
0145 }
0146 
0147 QHash<Globals::LogLevelIds, LogLevel *> Globals::logLevels() const
0148 {
0149     return d->mLogLevels;
0150 }
0151 
0152 LogLevel *Globals::noLogLevel() const
0153 {
0154     return d->mNoLogLevel;
0155 }
0156 
0157 LogLevel *Globals::debugLogLevel() const
0158 {
0159     return d->mDebugLogLevel;
0160 }
0161 
0162 LogLevel *Globals::informationLogLevel() const
0163 {
0164     return d->mInformationLogLevel;
0165 }
0166 
0167 LogLevel *Globals::noticeLogLevel() const
0168 {
0169     return d->mNoticeLogLevel;
0170 }
0171 
0172 LogLevel *Globals::warningLogLevel() const
0173 {
0174     return d->mWarningLogLevel;
0175 }
0176 
0177 LogLevel *Globals::errorLogLevel() const
0178 {
0179     return d->mErrorLogLevel;
0180 }
0181 
0182 LogLevel *Globals::criticalLogLevel() const
0183 {
0184     return d->mCriticalLogLevel;
0185 }
0186 
0187 LogLevel *Globals::alertLogLevel() const
0188 {
0189     return d->mAlertLogLevel;
0190 }
0191 
0192 LogLevel *Globals::emergencyLogLevel() const
0193 {
0194     return d->mEmergencyLogLevel;
0195 }
0196 
0197 LogLevel *Globals::logLevelByPriority(int id)
0198 {
0199     switch (id) {
0200     case 0:
0201         return emergencyLogLevel();
0202     case 1:
0203         return alertLogLevel();
0204     case 2:
0205         return criticalLogLevel();
0206     case 3:
0207         return errorLogLevel();
0208     case 4:
0209         return warningLogLevel();
0210     case 5:
0211         return noticeLogLevel();
0212     case 6:
0213         return informationLogLevel();
0214     case 7:
0215         return debugLogLevel();
0216     }
0217     return noLogLevel();
0218 }
0219 
0220 QMetaEnum &Globals::logLevelsMetaEnum() const
0221 {
0222     return d->mLogLevelsMetaEnum;
0223 }
0224 
0225 void Globals::registerLogModeFactory(LogModeFactory *logModeFactory)
0226 {
0227     const QList<LogMode *> logModes = logModeFactory->createLogModes();
0228 
0229     for (LogMode *logMode : logModes) {
0230         // Log mode
0231         d->mLogModes.insert(logMode->id(), logMode);
0232     }
0233 
0234     // Log mode Actions
0235     LogModeAction *logModeAction = logModeFactory->createLogModeAction();
0236     if (logModeAction) {
0237         d->mLogModeActions.append(logModeAction);
0238     }
0239 
0240     d->mFactories.append(logModeFactory);
0241 }
0242 
0243 LogMode *Globals::findLogMode(const QString &logModeName)
0244 {
0245     return d->mLogModes.value(logModeName);
0246 }
0247 
0248 void Globals::recreateLogModeActions()
0249 {
0250     // Delete existing log mode actions.
0251     qDeleteAll(d->mLogModeActions);
0252     d->mLogModeActions.clear();
0253 
0254     // Create new log mode action for each log mode.
0255     for (LogModeFactory *factory : std::as_const(d->mFactories)) {
0256         LogModeAction *logModeAction = factory->createLogModeAction();
0257         if (logModeAction) {
0258             d->mLogModeActions.append(logModeAction);
0259         }
0260     }
0261 }
0262 
0263 QList<LogModeAction *> Globals::logModeActions() const
0264 {
0265     return d->mLogModeActions;
0266 }
0267 
0268 #include "moc_globals.cpp"