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