Enrollment 28.2.0
Loading...
Searching...
No Matches
Logger.h
Go to the documentation of this file.
1
9
10#pragma once
12#include "enrollment/Export.h"
13#include <memory>
14#include <mutex>
15
16namespace inno
17{
23 */
24 class LogMessage
25 {
26 public:
31 virtual const char* Compose() = 0;
32
33 LogMessage() = default;
34 LogMessage(LogMessage&&) = delete;
35 LogMessage(const LogMessage&) = delete;
36 LogMessage& operator=(LogMessage&&) = delete;
37 LogMessage& operator=(const LogMessage&) = delete;
38 virtual ~LogMessage() = default;
39 };
44 */
45 class Logger
46 {
47 public:
52 virtual void LogInfo(LogMessage& composer) = 0;
57 virtual void LogError(LogMessage& composer) = 0;
62 virtual void LogDebug(LogMessage& composer) = 0;
63
64 Logger(const Logger&) = delete;
65 Logger(Logger&&) = delete;
66 Logger& operator=(const Logger&) = delete;
67 Logger& operator=(Logger&&) = delete;
68 Logger() = default;
69 virtual ~Logger() = default;
70 };
71
75 */
76 class NullLogger : public Logger
77 {
78 public:
81 */
82 void LogInfo(LogMessage& /* composer */) final
83 {
84 }
87 */
88 void LogError(LogMessage& /* composer */) final
89 {
90 }
93 */
94 void LogDebug(LogMessage& /* composer */) final
95 {
96 }
97
98 NullLogger(const NullLogger&) = delete;
99 NullLogger(NullLogger&&) = delete;
100 NullLogger& operator=(const NullLogger&) = delete;
101 NullLogger& operator=(NullLogger&&) = delete;
102 NullLogger() = default;
103 virtual ~NullLogger() = default;
104 };
105
115 using LogMessageCallback = const char* (*)(void* composerData);
116
128 using LoggerCallback = void (*)(void* logger, LogMessageCallback composer, void* composerData);
129
130 // See doc/Main.markdown "Header and Binary parts" for reason why we use pragma pack 1
131#pragma pack(push, 1)
136 */
137 extern "C" struct LoggerCallBacks
138 {
141 void* log;
148 };
149#pragma pack(pop)
150
156 */
157 class CallbackLogger
158 {
159 public:
165 // The clang-tidy generates false positive. The function uses member variable log
166 // NOLINTNEXTLINE(readability-convert-member-functions-to-static)
167 [[nodiscard]] LoggerCallBacks GetCallbacks() const
168 {
169 LoggerCallBacks cb = {};
170 cb.log = log.get();
174 return cb;
175 }
176
183 */
184 static void LogInfo(void* log, LogMessageCallback composer, void* composerData)
185 {
186 if (log != nullptr)
187 {
188 ForwardingComposer msg(composer, composerData);
189 static_cast<Logger*>(log)->LogInfo(msg);
190 }
191 }
198 */
199 static void LogError(void* log, LogMessageCallback composer, void* composerData)
200 {
201 if (log != nullptr)
202 {
203 ForwardingComposer msg(composer, composerData);
204 static_cast<Logger*>(log)->LogError(msg);
205 }
206 }
213 */
214 static void LogDebug(void* log, LogMessageCallback composer, void* composerData)
215 {
216 if (log != nullptr)
217 {
218 ForwardingComposer msg(composer, composerData);
219 static_cast<Logger*>(log)->LogDebug(msg);
220 }
221 }
226 */
227 explicit CallbackLogger(std::shared_ptr<Logger> logger)
228 : log(std::move(logger))
229 {
230 }
231 CallbackLogger() = delete;
232 CallbackLogger(const CallbackLogger&) = delete;
233 CallbackLogger(CallbackLogger&&) = delete;
234 CallbackLogger& operator=(const CallbackLogger&) = delete;
235 CallbackLogger& operator=(CallbackLogger&&) = delete;
236 ~CallbackLogger() = default;
237
238 private:
239 std::shared_ptr<Logger> log;
240
241 class ForwardingComposer : public LogMessage
242 {
243 public:
244 const char* Compose() final
245 {
246 return msg(data);
247 }
248
249 ForwardingComposer(LogMessageCallback composer, void* composerData)
250 : msg(composer)
251 , data(composerData)
252 {
253 }
254 ForwardingComposer() = delete;
255 ForwardingComposer(ForwardingComposer&&) = delete;
256 ForwardingComposer(const ForwardingComposer&) = delete;
257 ForwardingComposer& operator=(ForwardingComposer&&) = delete;
258 ForwardingComposer& operator=(const ForwardingComposer&) = delete;
259 ~ForwardingComposer() = default;
260
261 private:
263 void* data;
264 };
265 };
266
267 extern "C" INNO_ENROLLMENT_API void inno_local_image_redirect_error(LoggerCallBacks lcb);
268
274 */
275 class GlobalLogger
276 {
277 public:
281 */
282 static std::shared_ptr<Logger> Get()
283 {
284 return GlobalLogger::Instance().GetInternal();
285 }
286
291 */
292 static void Set(std::shared_ptr<Logger> logger)
293 {
294 if (logger == nullptr)
295 {
296 throw NullArgumentException("logger can not be null");
297 }
298
299 GlobalLogger::Instance().SetInternal(std::move(logger));
300 }
301
302 GlobalLogger() = delete;
303 virtual ~GlobalLogger() = default;
304 GlobalLogger(const GlobalLogger&) = delete;
305 GlobalLogger(GlobalLogger&&) = delete;
306 GlobalLogger& operator=(const GlobalLogger&) = delete;
307 GlobalLogger& operator=(GlobalLogger&&) = delete;
308
309 private:
310 std::shared_ptr<Logger> pe;
311 std::unique_ptr<CallbackLogger> cbLogger;
312 std::mutex peMux;
313
314 // The clang-tidy generates false positive. The function uses member variable peMux and pe
315 // NOLINTNEXTLINE(readability-convert-member-functions-to-static)
316 std::shared_ptr<Logger> GetInternal()
317 {
318 const std::scoped_lock lock(peMux);
319 return pe;
320 }
321
322 static GlobalLogger& Instance()
323 {
324 static GlobalLogger e(std::make_shared<NullLogger>());
325 return e;
326 }
327
328 void SetInternal(std::shared_ptr<Logger> logger)
329 {
330 if (logger != nullptr)
331 {
332 UpdateLogger(std::move(logger));
333 }
334 else
335 {
336 UpdateLogger(std::make_shared<NullLogger>());
337 }
338 }
339
340 // The clang-tidy generates false positive for cbLogger
341 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-member-init,hicpp-member-init)
342 explicit GlobalLogger(std::shared_ptr<Logger> e)
343 : pe(std::move(e))
344 , cbLogger(std::make_unique<CallbackLogger>(pe))
345 {
346 inno_local_image_redirect_error(cbLogger->GetCallbacks());
347 }
348
349 // The clang-tidy generates false positive. The function uses member variable peMux and cbLogger
350 // NOLINTNEXTLINE(readability-convert-member-functions-to-static)
351 void UpdateLogger(std::shared_ptr<Logger> logger)
352 {
353 const std::scoped_lock lock(peMux);
354 pe = std::move(logger);
355 auto replacingCallbackLogger = std::make_unique<CallbackLogger>(pe);
356 inno_local_image_redirect_error(replacingCallbackLogger->GetCallbacks());
357 cbLogger = std::move(replacingCallbackLogger);
358 }
359 };
360} // namespace inno
CallbackLogger is logger for binary part of libary due to C boundary.
Definition Logger.h:157
static void LogInfo(void *log, LogMessageCallback composer, void *composerData)
Log message on info level.
Definition Logger.h:183
CallbackLogger(std::shared_ptr< Logger > logger)
Construct a new Callback Logger object.
Definition Logger.h:226
static void LogError(void *log, LogMessageCallback composer, void *composerData)
Log message on error level.
Definition Logger.h:198
static void LogDebug(void *log, LogMessageCallback composer, void *composerData)
Log message on debug level.
Definition Logger.h:213
LoggerCallBacks GetCallbacks() const
Get the Callbacks object.
Definition Logger.h:166
Holds instance of Logger.
Definition Logger.h:275
static std::shared_ptr< Logger > Get()
Provides current logger.
Definition Logger.h:281
static void Set(std::shared_ptr< Logger > logger)
Sets new global logger.
Definition Logger.h:291
Compose Logger message.
Definition Logger.h:24
virtual const char * Compose()=0
It composes message.
Interface for library logging.
Definition Logger.h:45
virtual void LogInfo(LogMessage &composer)=0
It logs info message.
virtual void LogError(LogMessage &composer)=0
It logs error message.
virtual void LogDebug(LogMessage &composer)=0
It logs debug message.
Null argument is not allowed.
Definition EnrollmentException.h:156
The logger implementation that do not logs.
Definition Logger.h:76
void LogDebug(LogMessage &) final
It ignores debug messages.
Definition Logger.h:93
void LogError(LogMessage &) final
It ignores error messages.
Definition Logger.h:87
void LogInfo(LogMessage &) final
It ignores info messages.
Definition Logger.h:81
const char *(*)(void *composerData) LogMessageCallback
Function pointer to compose message in binary.
Definition Logger.h:114
void(*)(void *logger, LogMessageCallback composer, void *composerData) LoggerCallback
Function pointer to log from binary.
Definition Logger.h:127
LoggerCallBacks contains logger handle and function pointers as callbacks.
Definition Logger.h:137
LoggerCallback logDebug
Callback to log debug level.
Definition Logger.h:146
LoggerCallback logInfo
Callback to log info level.
Definition Logger.h:142
void * log
Logger handle.
Definition Logger.h:140
LoggerCallback logError
Callback to error info level.
Definition Logger.h:144