FreeRDP
Loading...
Searching...
No Matches
ConsoleAppender.c
1
20#include <winpr/config.h>
21
22#include "ConsoleAppender.h"
23#include "Message.h"
24
25#ifdef ANDROID
26#include <android/log.h>
27#endif
28
29#define WLOG_CONSOLE_DEFAULT 0
30#define WLOG_CONSOLE_STDOUT 1
31#define WLOG_CONSOLE_STDERR 2
32#define WLOG_CONSOLE_DEBUG 4
33
34typedef struct
35{
36 wLogAppender common;
37
38 int outputStream;
39} wLogConsoleAppender;
40
41static BOOL WLog_ConsoleAppender_Open(WINPR_ATTR_UNUSED wLog* log,
42 WINPR_ATTR_UNUSED wLogAppender* appender)
43{
44 return TRUE;
45}
46
47static BOOL WLog_ConsoleAppender_Close(WINPR_ATTR_UNUSED wLog* log,
48 WINPR_ATTR_UNUSED wLogAppender* appender)
49{
50 return TRUE;
51}
52
53static BOOL WLog_ConsoleAppender_WriteMessage(wLog* log, wLogAppender* appender,
54 const wLogMessage* cmessage)
55{
56 if (!appender)
57 return FALSE;
58
59 wLogConsoleAppender* consoleAppender = (wLogConsoleAppender*)appender;
60
61 char prefix[WLOG_MAX_PREFIX_SIZE] = WINPR_C_ARRAY_INIT;
62 WLog_Layout_GetMessagePrefix(log, appender->Layout, cmessage, prefix, sizeof(prefix));
63
64#ifdef _WIN32
65 if (consoleAppender->outputStream == WLOG_CONSOLE_DEBUG)
66 {
67 OutputDebugStringA(prefix);
68 OutputDebugStringA(cmessage->TextString);
69 OutputDebugStringA("\n");
70
71 return TRUE;
72 }
73#endif
74#ifdef ANDROID
75 android_LogPriority level;
76 switch (cmessage->Level)
77 {
78 case WLOG_TRACE:
79 level = ANDROID_LOG_VERBOSE;
80 break;
81 case WLOG_DEBUG:
82 level = ANDROID_LOG_DEBUG;
83 break;
84 case WLOG_INFO:
85 level = ANDROID_LOG_INFO;
86 break;
87 case WLOG_WARN:
88 level = ANDROID_LOG_WARN;
89 break;
90 case WLOG_ERROR:
91 level = ANDROID_LOG_ERROR;
92 break;
93 case WLOG_FATAL:
94 level = ANDROID_LOG_FATAL;
95 break;
96 case WLOG_OFF:
97 level = ANDROID_LOG_SILENT;
98 break;
99 default:
100 level = ANDROID_LOG_FATAL;
101 break;
102 }
103
104 if (level != ANDROID_LOG_SILENT)
105 __android_log_print(level, log->Name, "%s%s", prefix, cmessage->TextString);
106
107#else
108 FILE* fp = nullptr;
109 switch (consoleAppender->outputStream)
110 {
111 case WLOG_CONSOLE_STDOUT:
112 fp = stdout;
113 break;
114 case WLOG_CONSOLE_STDERR:
115 fp = stderr;
116 break;
117 default:
118 switch (cmessage->Level)
119 {
120 case WLOG_TRACE:
121 case WLOG_DEBUG:
122 case WLOG_INFO:
123 fp = stdout;
124 break;
125 default:
126 fp = stderr;
127 break;
128 }
129 break;
130 }
131
132 if (cmessage->Level != WLOG_OFF)
133 (void)fprintf(fp, "%s%s\n", prefix, cmessage->TextString);
134#endif
135 return TRUE;
136}
137
138static int g_DataId = 0;
139
140static BOOL WLog_ConsoleAppender_WriteDataMessage(WINPR_ATTR_UNUSED wLog* log,
141 WINPR_ATTR_UNUSED wLogAppender* appender,
142 const wLogMessage* message)
143{
144#if defined(ANDROID)
145 return FALSE;
146#else
147 const int DataId = g_DataId++;
148 char* FullFileName = WLog_Message_GetOutputFileName(DataId, "dat");
149
150 WLog_DataMessage_Write(FullFileName, message->Data, message->Length);
151
152 free(FullFileName);
153
154 return TRUE;
155#endif
156}
157
158static int g_ImageId = 0;
159
160static BOOL WLog_ConsoleAppender_WriteImageMessage(WINPR_ATTR_UNUSED wLog* log,
161 WINPR_ATTR_UNUSED wLogAppender* appender,
162 const wLogMessage* message)
163{
164#if defined(ANDROID)
165 return FALSE;
166#else
167 const int ImageId = g_ImageId++;
168 char* FullFileName = WLog_Message_GetOutputFileName(ImageId, "bmp");
169
170 WLog_ImageMessage_Write(FullFileName, message->ImageData, message->ImageWidth,
171 message->ImageHeight, message->ImageBpp);
172
173 free(FullFileName);
174
175 return TRUE;
176#endif
177}
178
179static int g_PacketId = 0;
180
181static BOOL WLog_ConsoleAppender_WritePacketMessage(WINPR_ATTR_UNUSED wLog* log,
182 wLogAppender* appender,
183 const wLogMessage* message)
184{
185#if defined(ANDROID)
186 return FALSE;
187#else
188 g_PacketId++;
189
190 if (!appender->PacketMessageContext)
191 {
192 char* FullFileName = WLog_Message_GetOutputFileName(-1, "pcap");
193 appender->PacketMessageContext = (void*)Pcap_Open(FullFileName, TRUE);
194 free(FullFileName);
195 }
196
197 if (appender->PacketMessageContext)
198 return WLog_PacketMessage_Write((wPcap*)appender->PacketMessageContext, message->PacketData,
199 message->PacketLength, message->PacketFlags);
200
201 return TRUE;
202#endif
203}
204static BOOL WLog_ConsoleAppender_Set(wLogAppender* appender, const char* setting, void* value)
205{
206 wLogConsoleAppender* consoleAppender = (wLogConsoleAppender*)appender;
207
208 /* Just check the value string is not empty */
209 if (!value || (strnlen(value, 2) == 0))
210 return FALSE;
211
212 if (strcmp("outputstream", setting) != 0)
213 return FALSE;
214
215 if (!strcmp("stdout", value))
216 consoleAppender->outputStream = WLOG_CONSOLE_STDOUT;
217 else if (!strcmp("stderr", value))
218 consoleAppender->outputStream = WLOG_CONSOLE_STDERR;
219 else if (!strcmp("default", value))
220 consoleAppender->outputStream = WLOG_CONSOLE_DEFAULT;
221 else if (!strcmp("debug", value))
222 consoleAppender->outputStream = WLOG_CONSOLE_DEBUG;
223 else
224 return FALSE;
225
226 return TRUE;
227}
228
229static void WLog_ConsoleAppender_Free(wLogAppender* appender)
230{
231 if (appender)
232 {
233 if (appender->PacketMessageContext)
234 {
235 Pcap_Close((wPcap*)appender->PacketMessageContext);
236 }
237
238 free(appender);
239 }
240}
241
242wLogAppender* WLog_ConsoleAppender_New(WINPR_ATTR_UNUSED wLog* log)
243{
244 wLogConsoleAppender* ConsoleAppender =
245 (wLogConsoleAppender*)calloc(1, sizeof(wLogConsoleAppender));
246
247 if (!ConsoleAppender)
248 return nullptr;
249
250 ConsoleAppender->common.Type = WLOG_APPENDER_CONSOLE;
251 ConsoleAppender->common.Open = WLog_ConsoleAppender_Open;
252 ConsoleAppender->common.Close = WLog_ConsoleAppender_Close;
253 ConsoleAppender->common.WriteMessage = WLog_ConsoleAppender_WriteMessage;
254 ConsoleAppender->common.WriteDataMessage = WLog_ConsoleAppender_WriteDataMessage;
255 ConsoleAppender->common.WriteImageMessage = WLog_ConsoleAppender_WriteImageMessage;
256 ConsoleAppender->common.WritePacketMessage = WLog_ConsoleAppender_WritePacketMessage;
257 ConsoleAppender->common.Set = WLog_ConsoleAppender_Set;
258 ConsoleAppender->common.Free = WLog_ConsoleAppender_Free;
259
260 ConsoleAppender->outputStream = WLOG_CONSOLE_DEFAULT;
261
262#ifdef _WIN32
263 if (IsDebuggerPresent())
264 ConsoleAppender->outputStream = WLOG_CONSOLE_DEBUG;
265#endif
266
267 return &ConsoleAppender->common;
268}