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"