1 /*
2     SPDX-FileCopyrightText: 2010 Klarälvdalens Datakonsult AB, a KDAB Group company <info@kdab.net>
3     SPDX-FileContributor: Stephen Kelly <stephen@kdab.com>
4 
5     SPDX-License-Identifier: LGPL-2.0-or-later
6 */
7 
8 #include "eventloggerregister.h"
9 
10 #include "modeleventlogger.h"
11 
~EventLoggerRegister()12 EventLoggerRegister::~EventLoggerRegister()
13 {
14 }
15 
16 EventLoggerRegister *EventLoggerRegister::s_instance = nullptr;
17 std::unique_ptr<EventLoggerRegister> EventLoggerRegister::s_destroyer;
18 
instance(Behaviour behaviour)19 EventLoggerRegister *EventLoggerRegister::instance(Behaviour behaviour)
20 {
21     if (!s_instance) {
22         s_instance = new EventLoggerRegister(behaviour);
23         s_destroyer.reset(s_instance);
24     }
25     return s_instance;
26 }
27 
registerLogger(ModelEventLogger * logger)28 void EventLoggerRegister::registerLogger(ModelEventLogger *logger)
29 {
30     m_loggers.append(logger);
31 }
32 
unregisterLogger(ModelEventLogger * logger)33 void EventLoggerRegister::unregisterLogger(ModelEventLogger *logger)
34 {
35     m_loggers.remove(m_loggers.indexOf(logger));
36 }
37 
writeLogs()38 void EventLoggerRegister::writeLogs()
39 {
40     static bool asserting = false;
41     if (!asserting) {
42         // If logger->writeLog asserts, we don't segfault
43         asserting = true;
44         // The destructor writes the log.
45         qDeleteAll(m_loggers);
46         m_loggers.clear();
47         asserting = false;
48     }
49 }
50 
myMessageOutput(QtMsgType type,const QMessageLogContext & context,const QString & msg)51 void myMessageOutput(QtMsgType type, const QMessageLogContext &context, const QString &msg)
52 {
53     QByteArray localMsg = msg.toLocal8Bit();
54     switch (type) {
55 #if QT_VERSION >= 0x050500
56     case QtInfoMsg:
57         fprintf(stderr, "Info: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function);
58         break;
59 #endif
60     case QtDebugMsg:
61         fprintf(stderr, "Debug: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function);
62         break;
63     case QtWarningMsg:
64         fprintf(stderr, "Warning: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function);
65         break;
66     case QtCriticalMsg:
67         fprintf(stderr, "Critical: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function);
68         break;
69     case QtFatalMsg:
70         fprintf(stderr, "Fatal: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function);
71         abort();
72     }
73 }
74 
EventLoggerRegister(Behaviour behaviour)75 EventLoggerRegister::EventLoggerRegister(Behaviour behaviour)
76 {
77     if (behaviour == InstallMsgHandler) {
78         qInstallMessageHandler(myMessageOutput);
79     }
80 }
81