Warning, file /libraries/qca/plugins/qca-logger/qca-logger.cpp was not indexed or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).
0001 /* 0002 * Copyright (C) 2007 Alon Bar-Lev <alon.barlev@gmail.com> 0003 * 0004 * This library is free software; you can redistribute it and/or 0005 * modify it under the terms of the GNU Lesser General Public 0006 * License as published by the Free Software Foundation; either 0007 * version 2.1 of the License, or (at your option) any later version. 0008 * 0009 * This library is distributed in the hope that it will be useful, 0010 * but WITHANY WARRANTY; without even the implied warranty of 0011 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 0012 * Lesser General Public License for more details. 0013 * 0014 * You should have received a copy of the GNU Lesser General Public 0015 * License along with this library; if not, write to the Free Software 0016 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA 0017 * 0018 */ 0019 0020 #include <QFile> 0021 #include <QTextStream> 0022 #include <QtCrypto> 0023 #include <QtPlugin> 0024 #include <qcaprovider.h> 0025 0026 #include <cstdlib> 0027 0028 using namespace QCA; 0029 0030 namespace loggerQCAPlugin { 0031 0032 class StreamLogger : public QCA::AbstractLogDevice 0033 { 0034 Q_OBJECT 0035 public: 0036 StreamLogger(QTextStream &stream) 0037 : QCA::AbstractLogDevice(QStringLiteral("Stream logger")) 0038 , _stream(stream) 0039 { 0040 QCA::logger()->registerLogDevice(this); 0041 } 0042 0043 ~StreamLogger() override 0044 { 0045 QCA::logger()->unregisterLogDevice(name()); 0046 } 0047 0048 void logTextMessage(const QString &message, enum QCA::Logger::Severity severity) override 0049 { 0050 _stream << now() << " " << severityName(severity) << " " << message << Qt::endl; 0051 } 0052 0053 void logBinaryMessage(const QByteArray &blob, enum QCA::Logger::Severity severity) override 0054 { 0055 Q_UNUSED(blob); 0056 _stream << now() << " " << severityName(severity) << " " 0057 << "Binary blob not implemented yet" << Qt::endl; 0058 } 0059 0060 private: 0061 inline const char *severityName(enum QCA::Logger::Severity severity) 0062 { 0063 if (severity <= QCA::Logger::Debug) { 0064 return s_severityNames[severity]; 0065 } else { 0066 return s_severityNames[QCA::Logger::Debug + 1]; 0067 } 0068 } 0069 0070 inline QString now() 0071 { 0072 static const QString format = QStringLiteral("yyyy-MM-dd hh:mm:ss"); 0073 return QDateTime::currentDateTime().toString(format); 0074 } 0075 0076 private: 0077 static const char *s_severityNames[]; 0078 QTextStream &_stream; 0079 }; 0080 0081 const char *StreamLogger::s_severityNames[] = {"Q", "M", "A", "C", "E", "W", "N", "I", "D", "U"}; 0082 0083 } 0084 0085 using namespace loggerQCAPlugin; 0086 0087 class loggerProvider : public Provider 0088 { 0089 private: 0090 QFile _logFile; 0091 QTextStream _logStream; 0092 StreamLogger *_streamLogger; 0093 bool _externalConfig; 0094 0095 public: 0096 loggerProvider() 0097 { 0098 _externalConfig = false; 0099 _streamLogger = nullptr; 0100 0101 const QByteArray level = qgetenv("QCALOGGER_LEVEL"); 0102 const QByteArray file = qgetenv("QCALOGGER_FILE"); 0103 0104 if (!level.isEmpty()) { 0105 printf("XXXX %s %s\n", level.data(), file.data()); 0106 _externalConfig = true; 0107 createLogger(atoi(level.constData()), file.isEmpty() ? QString() : QString::fromUtf8(file)); 0108 } 0109 } 0110 0111 ~loggerProvider() override 0112 { 0113 delete _streamLogger; 0114 _streamLogger = nullptr; 0115 } 0116 0117 public: 0118 int qcaVersion() const override 0119 { 0120 return QCA_VERSION; 0121 } 0122 0123 void init() override 0124 { 0125 } 0126 0127 QString name() const override 0128 { 0129 return QStringLiteral("qca-logger"); 0130 } 0131 0132 QStringList features() const override 0133 { 0134 QStringList list; 0135 list += QStringLiteral("log"); 0136 return list; 0137 } 0138 0139 Context *createContext(const QString &type) override 0140 { 0141 Q_UNUSED(type); 0142 return nullptr; 0143 } 0144 0145 QVariantMap defaultConfig() const override 0146 { 0147 QVariantMap mytemplate; 0148 0149 mytemplate[QStringLiteral("formtype")] = QStringLiteral("http://affinix.com/qca/forms/qca-logger#1.0"); 0150 mytemplate[QStringLiteral("enabled")] = false; 0151 mytemplate[QStringLiteral("file")] = QLatin1String(""); 0152 mytemplate[QStringLiteral("level")] = (int)Logger::Quiet; 0153 0154 return mytemplate; 0155 } 0156 0157 void configChanged(const QVariantMap &config) override 0158 { 0159 if (!_externalConfig) { 0160 delete _streamLogger; 0161 _streamLogger = nullptr; 0162 0163 if (config[QStringLiteral("enabled")].toBool()) { 0164 createLogger(config[QStringLiteral("level")].toInt(), config[QStringLiteral("file")].toString()); 0165 } 0166 } 0167 } 0168 0169 private: 0170 void createLogger(const int level, const QString &file) 0171 { 0172 bool success = false; 0173 if (file.isEmpty()) { 0174 success = _logFile.open(stderr, QIODevice::WriteOnly | QIODevice::Text | QIODevice::Unbuffered); 0175 } else { 0176 _logFile.setFileName(file); 0177 success = _logFile.open(QIODevice::Append | QIODevice::Text | QIODevice::Unbuffered); 0178 } 0179 0180 if (success) { 0181 _logStream.setDevice(&_logFile); 0182 logger()->setLevel((Logger::Severity)level); 0183 _streamLogger = new StreamLogger(_logStream); 0184 } 0185 } 0186 }; 0187 0188 class loggerPlugin : public QObject, public QCAPlugin 0189 { 0190 Q_OBJECT 0191 Q_PLUGIN_METADATA(IID "com.affinix.qca.Plugin/1.0") 0192 Q_INTERFACES(QCAPlugin) 0193 0194 public: 0195 Provider *createProvider() override 0196 { 0197 return new loggerProvider; 0198 } 0199 }; 0200 0201 #include "qca-logger.moc"