1// Copyright (C) 2016 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3// Qt-Security score:significant reason:default
4
5#ifndef QLOGGINGREGISTRY_P_H
6#define QLOGGINGREGISTRY_P_H
7
8//
9// W A R N I N G
10// -------------
11//
12// This file is not part of the Qt API. It exists for the convenience
13// of a number of Qt sources files. This header file may change from
14// version to version without notice, or even be removed.
15//
16// We mean it.
17//
18
19#include <QtCore/private/qloggingcategory_p.h>
20#include <QtCore/qlist.h>
21#include <QtCore/qhash.h>
22#include <QtCore/qmutex.h>
23#include <QtCore/qstring.h>
24#include <QtCore/qtextstream.h>
25
26#include <map>
27
28class tst_QLoggingRegistry;
29
30QT_BEGIN_NAMESPACE
31
32#define Q_LOGGING_CATEGORY_WITH_ENV_OVERRIDE_IMPL(name, env, categoryName) \
33 const QLoggingCategory &name() \
34 { \
35 static constexpr char cname[] = categoryName; \
36 static_assert(cname[0] == 'q' && cname[1] == 't' && cname[2] == '.' \
37 && cname[4] != '\0', "Category name must start with 'qt.'"); \
38 static const QLoggingCategoryWithEnvironmentOverride category(cname, env); \
39 return category; \
40 }
41
42#define Q_LOGGING_CATEGORY_WITH_ENV_OVERRIDE(name, env, categoryName) \
43 inline namespace QtPrivateLogging { \
44 Q_LOGGING_CATEGORY_WITH_ENV_OVERRIDE_IMPL(name, env, categoryName) \
45 } \
46 Q_WEAK_OVERLOAD \
47 Q_DECL_DEPRECATED_X("Logging categories should either be static or declared in a header") \
48 const QLoggingCategory &name() { return QtPrivateLogging::name(); }
49
50#define Q_STATIC_LOGGING_CATEGORY_WITH_ENV_OVERRIDE(name, env, categoryName) \
51 static Q_LOGGING_CATEGORY_WITH_ENV_OVERRIDE_IMPL(name, env, categoryName)
52
53class Q_AUTOTEST_EXPORT QLoggingRule
54{
55public:
56 QLoggingRule();
57 QLoggingRule(QStringView pattern, bool enabled);
58 int pass(QLatin1StringView categoryName, QtMsgType type) const;
59
60 enum PatternFlag {
61 FullText = 0x1,
62 LeftFilter = 0x2,
63 RightFilter = 0x4,
64 MidFilter = LeftFilter | RightFilter
65 };
66 Q_DECLARE_FLAGS(PatternFlags, PatternFlag)
67
68 QString category;
69 int messageType = -1;
70 PatternFlags flags;
71 bool enabled = false;
72
73private:
74 void parse(QStringView pattern);
75};
76
77Q_DECLARE_OPERATORS_FOR_FLAGS(QLoggingRule::PatternFlags)
78Q_DECLARE_TYPEINFO(QLoggingRule, Q_RELOCATABLE_TYPE);
79
80class Q_AUTOTEST_EXPORT QLoggingSettingsParser
81{
82public:
83 void setImplicitRulesSection(bool inRulesSection) { m_inRulesSection = inRulesSection; }
84
85 void setContent(QStringView content, char16_t separator = u'\n');
86 void setContent(FILE *stream);
87
88 QList<QLoggingRule> rules() const { return _rules; }
89
90private:
91 void parseNextLine(QStringView line);
92
93private:
94 bool m_inRulesSection = false;
95 QList<QLoggingRule> _rules;
96};
97
98class QLoggingRegistry
99{
100 Q_DISABLE_COPY_MOVE(QLoggingRegistry)
101public:
102 QLoggingRegistry();
103
104 Q_AUTOTEST_EXPORT void initializeRules();
105
106 void registerCategory(QLoggingCategory *category, QtMsgType enableForLevel);
107 void unregisterCategory(QLoggingCategory *category);
108
109 Q_CORE_EXPORT void registerEnvironmentOverrideForCategory(const char *categoryName,
110 const char *environment);
111
112 void setApiRules(const QString &content);
113
114 QLoggingCategory::CategoryFilter
115 installFilter(QLoggingCategory::CategoryFilter filter);
116
117 Q_CORE_EXPORT static QLoggingRegistry *instance();
118
119 static constexpr const char defaultCategoryName[] = "default";
120 static QLoggingCategory *defaultCategory();
121
122private:
123 Q_AUTOTEST_EXPORT void updateRules();
124 static inline QLoggingRegistry *self = nullptr;
125
126 static void defaultCategoryFilter(QLoggingCategory *category);
127
128 enum RuleSet {
129 // sorted by order in which defaultCategoryFilter considers them:
130 QtConfigRules,
131 ConfigRules,
132 ApiRules,
133 EnvironmentRules,
134
135 NumRuleSets
136 };
137
138 QMutex registryMutex;
139
140 // protected by mutex:
141 QList<QLoggingRule> ruleSets[NumRuleSets];
142 QHash<QLoggingCategory *, QtMsgType> categories;
143 QLoggingCategory::CategoryFilter categoryFilter;
144 std::map<QByteArrayView, const char *> qtCategoryEnvironmentOverrides;
145
146 friend class ::tst_QLoggingRegistry;
147};
148
149class QLoggingCategoryWithEnvironmentOverride : public QLoggingCategory
150{
151public:
152 QLoggingCategoryWithEnvironmentOverride(const char *category, const char *env)
153 : QLoggingCategory(registerOverride(categoryName: category, environment: env), QtInfoMsg)
154 {}
155
156private:
157 static const char *registerOverride(const char *categoryName, const char *environment)
158 {
159 QLoggingRegistry *c = QLoggingRegistry::instance();
160 if (c)
161 c->registerEnvironmentOverrideForCategory(categoryName, environment);
162 return categoryName;
163 }
164};
165
166QT_END_NAMESPACE
167
168#endif // QLOGGINGREGISTRY_P_H
169

source code of qtbase/src/corelib/io/qloggingregistry_p.h