FreeRDP
Loading...
Searching...
No Matches
CallbackAppender.c
1
20#include <winpr/config.h>
21
22#include "CallbackAppender.h"
23
24typedef struct
25{
26 wLogAppender common;
27
28 wLogCallbacks* callbacks;
29} wLogCallbackAppender;
30
31static BOOL WLog_CallbackAppender_Open(WINPR_ATTR_UNUSED wLog* log,
32 WINPR_ATTR_UNUSED wLogAppender* appender)
33{
34 return TRUE;
35}
36
37static BOOL WLog_CallbackAppender_Close(WINPR_ATTR_UNUSED wLog* log,
38 WINPR_ATTR_UNUSED wLogAppender* appender)
39{
40 return TRUE;
41}
42
43static BOOL WLog_CallbackAppender_WriteMessage(wLog* log, wLogAppender* appender,
44 const wLogMessage* cmessage)
45{
46 WINPR_ASSERT(cmessage);
47 if (!appender)
48 return FALSE;
49
50 char prefix[WLOG_MAX_PREFIX_SIZE] = { 0 };
51 WLog_Layout_GetMessagePrefix(log, appender->Layout, cmessage, prefix, sizeof(prefix));
52
53 wLogCallbackAppender* callbackAppender = (wLogCallbackAppender*)appender;
54
55 if (callbackAppender->callbacks && callbackAppender->callbacks->message)
56 {
57 wLogMessage message = *cmessage;
58 message.PrefixString = prefix;
59 return callbackAppender->callbacks->message(&message);
60 }
61 else
62 return FALSE;
63}
64
65static BOOL WLog_CallbackAppender_WriteDataMessage(wLog* log, wLogAppender* appender,
66 const wLogMessage* cmessage)
67{
68 if (!appender)
69 return FALSE;
70
71 char prefix[WLOG_MAX_PREFIX_SIZE] = { 0 };
72 WLog_Layout_GetMessagePrefix(log, appender->Layout, cmessage, prefix, sizeof(prefix));
73
74 wLogCallbackAppender* callbackAppender = (wLogCallbackAppender*)appender;
75 if (callbackAppender->callbacks && callbackAppender->callbacks->data)
76 {
77 wLogMessage message = *cmessage;
78 message.PrefixString = prefix;
79 return callbackAppender->callbacks->data(&message);
80 }
81 else
82 return FALSE;
83}
84
85static BOOL WLog_CallbackAppender_WriteImageMessage(wLog* log, wLogAppender* appender,
86 const wLogMessage* cmessage)
87{
88 WINPR_ASSERT(cmessage);
89 if (!appender)
90 return FALSE;
91
92 char prefix[WLOG_MAX_PREFIX_SIZE] = { 0 };
93 WLog_Layout_GetMessagePrefix(log, appender->Layout, cmessage, prefix, sizeof(prefix));
94
95 wLogCallbackAppender* callbackAppender = (wLogCallbackAppender*)appender;
96 if (callbackAppender->callbacks && callbackAppender->callbacks->image)
97 {
98 wLogMessage message = *cmessage;
99 message.PrefixString = prefix;
100 return callbackAppender->callbacks->image(&message);
101 }
102 else
103 return FALSE;
104}
105
106static BOOL WLog_CallbackAppender_WritePacketMessage(wLog* log, wLogAppender* appender,
107 const wLogMessage* cmessage)
108{
109 WINPR_ASSERT(cmessage);
110 if (!appender)
111 return FALSE;
112
113 char prefix[WLOG_MAX_PREFIX_SIZE] = { 0 };
114 WLog_Layout_GetMessagePrefix(log, appender->Layout, cmessage, prefix, sizeof(prefix));
115
116 wLogCallbackAppender* callbackAppender = (wLogCallbackAppender*)appender;
117 if (callbackAppender->callbacks && callbackAppender->callbacks->package)
118 {
119 wLogMessage message = *cmessage;
120 message.PrefixString = prefix;
121 return callbackAppender->callbacks->package(&message);
122 }
123 else
124 return FALSE;
125}
126
127static BOOL WLog_CallbackAppender_Set(wLogAppender* appender, const char* setting, void* value)
128{
129 wLogCallbackAppender* callbackAppender = (wLogCallbackAppender*)appender;
130
131 if (!value || (strcmp(setting, "callbacks") != 0))
132 return FALSE;
133
134 if (!(callbackAppender->callbacks = calloc(1, sizeof(wLogCallbacks))))
135 {
136 return FALSE;
137 }
138
139 callbackAppender->callbacks = memcpy(callbackAppender->callbacks, value, sizeof(wLogCallbacks));
140 return TRUE;
141}
142
143static void WLog_CallbackAppender_Free(wLogAppender* appender)
144{
145 wLogCallbackAppender* callbackAppender = NULL;
146 if (!appender)
147 {
148 return;
149 }
150
151 callbackAppender = (wLogCallbackAppender*)appender;
152
153 free(callbackAppender->callbacks);
154 free(appender);
155}
156
157wLogAppender* WLog_CallbackAppender_New(WINPR_ATTR_UNUSED wLog* log)
158{
159 wLogCallbackAppender* CallbackAppender =
160 (wLogCallbackAppender*)calloc(1, sizeof(wLogCallbackAppender));
161 if (!CallbackAppender)
162 return NULL;
163
164 CallbackAppender->common.Type = WLOG_APPENDER_CALLBACK;
165 CallbackAppender->common.Open = WLog_CallbackAppender_Open;
166 CallbackAppender->common.Close = WLog_CallbackAppender_Close;
167 CallbackAppender->common.WriteMessage = WLog_CallbackAppender_WriteMessage;
168 CallbackAppender->common.WriteDataMessage = WLog_CallbackAppender_WriteDataMessage;
169 CallbackAppender->common.WriteImageMessage = WLog_CallbackAppender_WriteImageMessage;
170 CallbackAppender->common.WritePacketMessage = WLog_CallbackAppender_WritePacketMessage;
171 CallbackAppender->common.Free = WLog_CallbackAppender_Free;
172 CallbackAppender->common.Set = WLog_CallbackAppender_Set;
173
174 return &CallbackAppender->common;
175}