File indexing completed on 2024-04-21 03:56:04

0001 /*
0002     SPDX-FileCopyrightText: 2010 Klarälvdalens Datakonsult AB, a KDAB Group company <info@kdab.net>
0003     SPDX-FileContributor: Stephen Kelly <stephen@kdab.com>
0004 
0005     SPDX-License-Identifier: LGPL-2.0-or-later
0006 */
0007 
0008 #include "eventloggerregister.h"
0009 
0010 #include "modeleventlogger.h"
0011 
0012 EventLoggerRegister::~EventLoggerRegister()
0013 {
0014 }
0015 
0016 EventLoggerRegister *EventLoggerRegister::s_instance = nullptr;
0017 std::unique_ptr<EventLoggerRegister> EventLoggerRegister::s_destroyer;
0018 
0019 EventLoggerRegister *EventLoggerRegister::instance(Behaviour behaviour)
0020 {
0021     if (!s_instance) {
0022         s_instance = new EventLoggerRegister(behaviour);
0023         s_destroyer.reset(s_instance);
0024     }
0025     return s_instance;
0026 }
0027 
0028 void EventLoggerRegister::registerLogger(ModelEventLogger *logger)
0029 {
0030     m_loggers.append(logger);
0031 }
0032 
0033 void EventLoggerRegister::unregisterLogger(ModelEventLogger *logger)
0034 {
0035     m_loggers.remove(m_loggers.indexOf(logger));
0036 }
0037 
0038 void EventLoggerRegister::writeLogs()
0039 {
0040     static bool asserting = false;
0041     if (!asserting) {
0042         // If logger->writeLog asserts, we don't segfault
0043         asserting = true;
0044         // The destructor writes the log.
0045         qDeleteAll(m_loggers);
0046         m_loggers.clear();
0047         asserting = false;
0048     }
0049 }
0050 
0051 void myMessageOutput(QtMsgType type, const QMessageLogContext &context, const QString &msg)
0052 {
0053     QByteArray localMsg = msg.toLocal8Bit();
0054     switch (type) {
0055 #if QT_VERSION >= 0x050500
0056     case QtInfoMsg:
0057         fprintf(stderr, "Info: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function);
0058         break;
0059 #endif
0060     case QtDebugMsg:
0061         fprintf(stderr, "Debug: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function);
0062         break;
0063     case QtWarningMsg:
0064         fprintf(stderr, "Warning: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function);
0065         break;
0066     case QtCriticalMsg:
0067         fprintf(stderr, "Critical: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function);
0068         break;
0069     case QtFatalMsg:
0070         fprintf(stderr, "Fatal: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function);
0071         abort();
0072     }
0073 }
0074 
0075 EventLoggerRegister::EventLoggerRegister(Behaviour behaviour)
0076 {
0077     if (behaviour == InstallMsgHandler) {
0078         qInstallMessageHandler(myMessageOutput);
0079     }
0080 }