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 wLogCallbacksEx callbacksEx;
30} wLogCallbackAppender;
31
32static BOOL WLog_CallbackAppender_Open(WINPR_ATTR_UNUSED wLog* log,
33 WINPR_ATTR_UNUSED wLogAppender* appender)
34{
35 return TRUE;
36}
37
38static BOOL WLog_CallbackAppender_Close(WINPR_ATTR_UNUSED wLog* log,
39 WINPR_ATTR_UNUSED wLogAppender* appender)
40{
41 return TRUE;
42}
43
44static BOOL WLog_CallbackAppender_WriteMessage(wLog* log, wLogAppender* appender,
45 const wLogMessage* cmessage)
46{
47 WINPR_ASSERT(cmessage);
48 if (!appender)
49 return FALSE;
50
51 char prefix[WLOG_MAX_PREFIX_SIZE] = WINPR_C_ARRAY_INIT;
52 WLog_Layout_GetMessagePrefix(log, appender->Layout, cmessage, prefix, sizeof(prefix));
53
54 wLogCallbackAppender* callbackAppender = (wLogCallbackAppender*)appender;
55
56 if (callbackAppender->callbacksEx.message)
57 {
58 wLogMessage message = *cmessage;
59 message.PrefixString = prefix;
60 return callbackAppender->callbacksEx.message(appender, &message);
61 }
62 else if (callbackAppender->callbacks.message)
63 {
64 wLogMessage message = *cmessage;
65 message.PrefixString = prefix;
66 return callbackAppender->callbacks.message(&message);
67 }
68 else
69 return FALSE;
70}
71
72static BOOL WLog_CallbackAppender_WriteDataMessage(wLog* log, wLogAppender* appender,
73 const wLogMessage* cmessage)
74{
75 if (!appender)
76 return FALSE;
77
78 char prefix[WLOG_MAX_PREFIX_SIZE] = WINPR_C_ARRAY_INIT;
79 WLog_Layout_GetMessagePrefix(log, appender->Layout, cmessage, prefix, sizeof(prefix));
80
81 wLogCallbackAppender* callbackAppender = (wLogCallbackAppender*)appender;
82 if (callbackAppender->callbacksEx.data)
83 {
84 wLogMessage message = *cmessage;
85 message.PrefixString = prefix;
86 return callbackAppender->callbacksEx.data(appender, &message);
87 }
88 else if (callbackAppender->callbacks.data)
89 {
90 wLogMessage message = *cmessage;
91 message.PrefixString = prefix;
92 return callbackAppender->callbacks.data(&message);
93 }
94 else
95 return FALSE;
96}
97
98static BOOL WLog_CallbackAppender_WriteImageMessage(wLog* log, wLogAppender* appender,
99 const wLogMessage* cmessage)
100{
101 WINPR_ASSERT(cmessage);
102 if (!appender)
103 return FALSE;
104
105 char prefix[WLOG_MAX_PREFIX_SIZE] = WINPR_C_ARRAY_INIT;
106 WLog_Layout_GetMessagePrefix(log, appender->Layout, cmessage, prefix, sizeof(prefix));
107
108 wLogCallbackAppender* callbackAppender = (wLogCallbackAppender*)appender;
109 if (callbackAppender->callbacksEx.image)
110 {
111 wLogMessage message = *cmessage;
112 message.PrefixString = prefix;
113 return callbackAppender->callbacksEx.image(appender, &message);
114 }
115 else if (callbackAppender->callbacks.image)
116 {
117 wLogMessage message = *cmessage;
118 message.PrefixString = prefix;
119 return callbackAppender->callbacks.image(&message);
120 }
121 else
122 return FALSE;
123}
124
125static BOOL WLog_CallbackAppender_WritePacketMessage(wLog* log, wLogAppender* appender,
126 const wLogMessage* cmessage)
127{
128 WINPR_ASSERT(cmessage);
129 if (!appender)
130 return FALSE;
131
132 char prefix[WLOG_MAX_PREFIX_SIZE] = WINPR_C_ARRAY_INIT;
133 WLog_Layout_GetMessagePrefix(log, appender->Layout, cmessage, prefix, sizeof(prefix));
134
135 wLogCallbackAppender* callbackAppender = (wLogCallbackAppender*)appender;
136 if (callbackAppender->callbacksEx.package)
137 {
138 wLogMessage message = *cmessage;
139 message.PrefixString = prefix;
140 return callbackAppender->callbacksEx.package(appender, &message);
141 }
142 else if (callbackAppender->callbacks.package)
143 {
144 wLogMessage message = *cmessage;
145 message.PrefixString = prefix;
146 return callbackAppender->callbacks.package(&message);
147 }
148 else
149 return FALSE;
150}
151
152static BOOL WLog_CallbackAppender_Set(wLogAppender* appender, const char* setting, void* value)
153{
154 wLogCallbackAppender* callbackAppender = (wLogCallbackAppender*)appender;
155
156 if (!value)
157 return FALSE;
158
159 if (strcmp(setting, "callbacks") == 0)
160 {
161 callbackAppender->callbacks = *(wLogCallbacks*)value;
162 return TRUE;
163 }
164
165 if (strcmp(setting, "callbacksEx") == 0)
166 {
167 callbackAppender->callbacksEx = *(wLogCallbacksEx*)value;
168 return TRUE;
169 }
170 return FALSE;
171}
172
173static void WLog_CallbackAppender_Free(wLogAppender* appender)
174{
175 free(appender);
176}
177
178wLogAppender* WLog_CallbackAppender_New(WINPR_ATTR_UNUSED wLog* log)
179{
180 wLogCallbackAppender* CallbackAppender =
181 (wLogCallbackAppender*)calloc(1, sizeof(wLogCallbackAppender));
182 if (!CallbackAppender)
183 return nullptr;
184
185 CallbackAppender->common.Type = WLOG_APPENDER_CALLBACK;
186 CallbackAppender->common.Open = WLog_CallbackAppender_Open;
187 CallbackAppender->common.Close = WLog_CallbackAppender_Close;
188 CallbackAppender->common.WriteMessage = WLog_CallbackAppender_WriteMessage;
189 CallbackAppender->common.WriteDataMessage = WLog_CallbackAppender_WriteDataMessage;
190 CallbackAppender->common.WriteImageMessage = WLog_CallbackAppender_WriteImageMessage;
191 CallbackAppender->common.WritePacketMessage = WLog_CallbackAppender_WritePacketMessage;
192 CallbackAppender->common.Free = WLog_CallbackAppender_Free;
193 CallbackAppender->common.Set = WLog_CallbackAppender_Set;
194
195 return &CallbackAppender->common;
196}
extended callback type with context