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"