FreeRDP
Loading...
Searching...
No Matches
include/winpr/wlog.h
23#ifndef WINPR_LOG_H
24#define WINPR_LOG_H
25
26#ifdef __cplusplus
27extern "C"
28{
29#endif
30
31#include <stdarg.h>
32
33#include <winpr/platform.h>
34#include <winpr/wtypes.h>
35#include <winpr/winpr.h>
36#include <winpr/synch.h>
37#include <winpr/thread.h>
38
42typedef enum WINPR_C23_ENUM_TYPE(uint32_t)
43{
44 WLOG_TRACE = 0,
45 WLOG_DEBUG = 1,
46 WLOG_INFO = 2,
47 WLOG_WARN = 3,
48 WLOG_ERROR = 4,
49 WLOG_FATAL = 5,
50 WLOG_OFF = 6,
51 WLOG_LEVEL_INHERIT = 0xFFFF
52} wLogLevel;
53
57typedef enum WINPR_C23_ENUM_TYPE(uint32_t)
58{
59 WLOG_MESSAGE_TEXT = 0,
60 WLOG_MESSAGE_DATA = 1,
61 WLOG_MESSAGE_IMAGE = 2,
62 WLOG_MESSAGE_PACKET = 3
63} wLogMessageType;
64
72typedef enum WINPR_C23_ENUM_TYPE(uint32_t)
73{
74 WLOG_APPENDER_CONSOLE = 0,
75 WLOG_APPENDER_FILE = 1,
76 WLOG_APPENDER_BINARY = 2,
77 WLOG_APPENDER_CALLBACK = 3,
78 WLOG_APPENDER_SYSLOG = 4,
79 WLOG_APPENDER_JOURNALD = 5,
80 WLOG_APPENDER_UDP = 6
81} wLogAppenderType;
82
83typedef struct
84{
85 DWORD Type;
86
87 DWORD Level;
88
89 LPSTR PrefixString;
90
91 LPCSTR FormatString;
92 LPCSTR TextString;
93
94 size_t LineNumber; /* __LINE__ */
95 LPCSTR FileName; /* __FILE__ */
96 LPCSTR FunctionName; /* __func__ */
97
98 /* Data Message */
99
100 void* Data;
101 size_t Length;
102
103 /* Image Message */
104
105 void* ImageData;
106 size_t ImageWidth;
107 size_t ImageHeight;
108 size_t ImageBpp;
109
110 /* Packet Message */
111
112 void* PacketData;
113 size_t PacketLength;
114 DWORD PacketFlags;
116 typedef struct s_wLogLayout wLogLayout;
117 typedef struct s_wLogAppender wLogAppender;
118 typedef struct s_wLog wLog;
119
120#define WLOG_PACKET_INBOUND 1
121#define WLOG_PACKET_OUTBOUND 2
122
136 WINPR_ATTR_FORMAT_ARG(6, 7)
137 WINPR_API BOOL WLog_PrintTextMessage(wLog* log, DWORD level, size_t line, const char* file,
138 const char* function, WINPR_FORMAT_ARG const char* fmt,
139 ...);
140
154 WINPR_ATTR_FORMAT_ARG(6, 0)
155 WINPR_API BOOL WLog_PrintTextMessageVA(wLog* log, DWORD level, size_t line, const char* file,
156 const char* function, WINPR_FORMAT_ARG const char* fmt,
157 va_list args);
158
171 WINPR_API BOOL WLog_PrintMessage(wLog* log, DWORD type, DWORD level, size_t line,
172 const char* file, const char* function, ...);
173
186 WINPR_API BOOL WLog_PrintMessageVA(wLog* log, DWORD type, DWORD level, size_t line,
187 const char* file, const char* function, va_list args);
188
189 WINPR_ATTR_NODISCARD
190 WINPR_API wLog* WLog_GetRoot(void);
191
192 WINPR_ATTR_NODISCARD
193 WINPR_API wLog* WLog_Get(LPCSTR name);
194
200 WINPR_API void WLog_Discard(wLog* log);
201
210 WINPR_ATTR_MALLOC(WLog_Discard, 1)
211 WINPR_API wLog* WLog_Create(LPCSTR name, wLog* root);
212
213 WINPR_ATTR_NODISCARD
214 WINPR_API DWORD WLog_GetLogLevel(wLog* log);
215
216 WINPR_ATTR_NODISCARD
217 WINPR_API BOOL WLog_IsLevelActive(wLog* _log, DWORD _log_level);
218
233 WINPR_API BOOL WLog_SetContext(wLog* log, const char* (*fkt)(void*), void* context);
234
248 WINPR_API BOOL WLog_SetGlobalContext(const char* globalprefix);
249
250#define WLog_Print_unchecked(_log, _log_level, ...) \
251 do \
252 { \
253 WLog_PrintTextMessage(_log, _log_level, __LINE__, __FILE__, __func__, __VA_ARGS__); \
254 } while (0)
255
256#define WLog_Print(_log, _log_level, ...) \
257 do \
258 { \
259 if (WLog_IsLevelActive(_log, _log_level)) \
260 { \
261 WLog_Print_unchecked(_log, _log_level, __VA_ARGS__); \
262 } \
263 } while (0)
264
265#define WLog_Print_tag(_tag, _log_level, ...) \
266 do \
267 { \
268 static wLog* _log_cached_ptr = nullptr; \
269 if (!_log_cached_ptr) \
270 _log_cached_ptr = WLog_Get(_tag); \
271 WLog_Print(_log_cached_ptr, _log_level, __VA_ARGS__); \
272 } while (0)
273
274#define WLog_PrintVA_unchecked(_log, _log_level, _fmt, _args) \
275 do \
276 { \
277 WLog_PrintTextMessageVA(_log, _log_level, __LINE__, __FILE__, __func__, _fmt, _args); \
278 } while (0)
279
280#define WLog_PrintVA(_log, _log_level, _fmt, _args) \
281 do \
282 { \
283 if (WLog_IsLevelActive(_log, _log_level)) \
284 { \
285 WLog_PrintVA_unchecked(_log, _log_level, _fmt, _args); \
286 } \
287 } while (0)
288
289#define WLog_Data(_log, _log_level, ...) \
290 do \
291 { \
292 if (WLog_IsLevelActive(_log, _log_level)) \
293 { \
294 WLog_PrintMessage(_log, WLOG_MESSAGE_DATA, _log_level, __LINE__, __FILE__, __func__, \
295 __VA_ARGS__); \
296 } \
297 } while (0)
298
299#define WLog_Image(_log, _log_level, ...) \
300 do \
301 { \
302 if (WLog_IsLevelActive(_log, _log_level)) \
303 { \
304 WLog_PrintMessage(_log, WLOG_MESSAGE_DATA, _log_level, __LINE__, __FILE__, __func__, \
305 __VA_ARGS__); \
306 } \
307 } while (0)
308
309#define WLog_Packet(_log, _log_level, ...) \
310 do \
311 { \
312 if (WLog_IsLevelActive(_log, _log_level)) \
313 { \
314 WLog_PrintMessage(_log, WLOG_MESSAGE_PACKET, _log_level, __LINE__, __FILE__, __func__, \
315 __VA_ARGS__); \
316 } \
317 } while (0)
318
319 WINPR_ATTR_FORMAT_ARG(6, 7)
320 static inline void WLog_Print_dbg_tag(const char* WINPR_RESTRICT tag, DWORD log_level,
321 size_t line, const char* file, const char* fkt,
322 WINPR_FORMAT_ARG const char* fmt, ...)
323 {
324 static wLog* log_cached_ptr = nullptr;
325 if (!log_cached_ptr)
326 log_cached_ptr = WLog_Get(tag);
327
328 if (WLog_IsLevelActive(log_cached_ptr, log_level))
329 {
330 va_list ap = WINPR_C_ARRAY_INIT;
331 va_start(ap, fmt);
332 WLog_PrintTextMessageVA(log_cached_ptr, log_level, line, file, fkt, fmt, ap);
333 va_end(ap);
334 }
335 }
336
337#define WLog_LVL(tag, lvl, ...) \
338 WLog_Print_dbg_tag(tag, lvl, __LINE__, __FILE__, __func__, __VA_ARGS__)
339#define WLog_VRB(tag, ...) \
340 WLog_Print_dbg_tag(tag, WLOG_TRACE, __LINE__, __FILE__, __func__, __VA_ARGS__)
341#define WLog_DBG(tag, ...) \
342 WLog_Print_dbg_tag(tag, WLOG_DEBUG, __LINE__, __FILE__, __func__, __VA_ARGS__)
343#define WLog_INFO(tag, ...) \
344 WLog_Print_dbg_tag(tag, WLOG_INFO, __LINE__, __FILE__, __func__, __VA_ARGS__)
345#define WLog_WARN(tag, ...) \
346 WLog_Print_dbg_tag(tag, WLOG_WARN, __LINE__, __FILE__, __func__, __VA_ARGS__)
347#define WLog_ERR(tag, ...) \
348 WLog_Print_dbg_tag(tag, WLOG_ERROR, __LINE__, __FILE__, __func__, __VA_ARGS__)
349#define WLog_FATAL(tag, ...) \
350 WLog_Print_dbg_tag(tag, WLOG_FATAL, __LINE__, __FILE__, __func__, __VA_ARGS__)
351
352 WINPR_ATTR_NODISCARD
353 WINPR_API BOOL WLog_SetLogLevel(wLog* log, DWORD logLevel);
354
355 WINPR_ATTR_NODISCARD
356 WINPR_API BOOL WLog_SetStringLogLevel(wLog* log, LPCSTR level);
357
358 WINPR_ATTR_NODISCARD
359 WINPR_API BOOL WLog_AddStringLogFilters(LPCSTR filter);
360
361 WINPR_ATTR_NODISCARD
362 WINPR_API BOOL WLog_SetLogAppenderType(wLog* log, DWORD logAppenderType);
363
364 WINPR_ATTR_NODISCARD
365 WINPR_API wLogAppender* WLog_GetLogAppender(wLog* log);
366
367 WINPR_ATTR_NODISCARD
368 WINPR_API BOOL WLog_OpenAppender(wLog* log);
369
370 WINPR_ATTR_NODISCARD
371 WINPR_API BOOL WLog_CloseAppender(wLog* log);
372
373 WINPR_ATTR_NODISCARD
374 WINPR_API BOOL WLog_ConfigureAppender(wLogAppender* appender, const char* setting, void* value);
375
388 WINPR_ATTR_NODISCARD
389 WINPR_API BOOL WLog_SetAppenderContext(wLogAppender* appender, wLogMessageType type,
390 void* context);
391
400 WINPR_ATTR_NODISCARD
401 WINPR_API void* WLog_GetAppenderContext(wLogAppender* appender, wLogMessageType type);
402
403 WINPR_ATTR_NODISCARD
404 WINPR_API wLogLayout* WLog_GetLogLayout(wLog* log);
405
406 WINPR_ATTR_NODISCARD
407 WINPR_API BOOL WLog_Layout_SetPrefixFormat(wLog* log, wLogLayout* layout, const char* format);
408
409#if defined(WITH_WINPR_DEPRECATED)
411 WINPR_DEPRECATED(WINPR_ATTR_NODISCARD WINPR_API BOOL WLog_Init(void));
412
414 WINPR_DEPRECATED(WINPR_ATTR_NODISCARD WINPR_API BOOL WLog_Uninit(void));
415#endif
416
417 typedef BOOL (*wLogCallbackMessage_t)(const wLogMessage* msg);
418 typedef BOOL (*wLogCallbackData_t)(const wLogMessage* msg);
419 typedef BOOL (*wLogCallbackImage_t)(const wLogMessage* msg);
420 typedef BOOL (*wLogCallbackPackage_t)(const wLogMessage* msg);
421
422 typedef struct
423 {
424 WINPR_ATTR_NODISCARD wLogCallbackData_t data;
425 WINPR_ATTR_NODISCARD wLogCallbackImage_t image;
426 WINPR_ATTR_NODISCARD wLogCallbackMessage_t message;
427 WINPR_ATTR_NODISCARD wLogCallbackPackage_t package;
429
433 typedef BOOL (*wLogCallbackMessageEx_t)(wLogAppender* appender, const wLogMessage* msg);
434
438 typedef struct
439 {
440 WINPR_ATTR_NODISCARD wLogCallbackMessageEx_t data;
441 WINPR_ATTR_NODISCARD wLogCallbackMessageEx_t image;
442 WINPR_ATTR_NODISCARD wLogCallbackMessageEx_t message;
443 WINPR_ATTR_NODISCARD wLogCallbackMessageEx_t package;
445
446#ifdef __cplusplus
447}
448#endif
449
450#endif /* WINPR_WLOG_H */
extended callback type with context