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 }