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] = { 0 };
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 = NULL;
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 int DataId = 0;
148 char* FullFileName = NULL;
149
150 DataId = g_DataId++;
151 FullFileName = WLog_Message_GetOutputFileName(DataId, "dat");
152
153 WLog_DataMessage_Write(FullFileName, message->Data, message->Length);
154
155 free(FullFileName);
156
157 return TRUE;
158#endif
159}
160
161static int g_ImageId = 0;
162
163static BOOL WLog_ConsoleAppender_WriteImageMessage(WINPR_ATTR_UNUSED wLog* log,
164 WINPR_ATTR_UNUSED wLogAppender* appender,
165 const wLogMessage* message)
166{
167#if defined(ANDROID)
168 return FALSE;
169#else
170 int ImageId = 0;
171 char* FullFileName = NULL;
172
173 ImageId = g_ImageId++;
174 FullFileName = WLog_Message_GetOutputFileName(ImageId, "bmp");
175
176 WLog_ImageMessage_Write(FullFileName, message->ImageData, message->ImageWidth,
177 message->ImageHeight, message->ImageBpp);
178
179 free(FullFileName);
180
181 return TRUE;
182#endif
183}
184
185static int g_PacketId = 0;
186
187static BOOL WLog_ConsoleAppender_WritePacketMessage(WINPR_ATTR_UNUSED wLog* log,
188 wLogAppender* appender,
189 const wLogMessage* message)
190{
191#if defined(ANDROID)
192 return FALSE;
193#else
194 char* FullFileName = NULL;
195
196 g_PacketId++;
197
198 if (!appender->PacketMessageContext)
199 {
200 FullFileName = WLog_Message_GetOutputFileName(-1, "pcap");
201 appender->PacketMessageContext = (void*)Pcap_Open(FullFileName, TRUE);
202 free(FullFileName);
203 }
204
205 if (appender->PacketMessageContext)
206 return WLog_PacketMessage_Write((wPcap*)appender->PacketMessageContext, message->PacketData,
207 message->PacketLength, message->PacketFlags);
208
209 return TRUE;
210#endif
211}
212static BOOL WLog_ConsoleAppender_Set(wLogAppender* appender, const char* setting, void* value)
213{
214 wLogConsoleAppender* consoleAppender = (wLogConsoleAppender*)appender;
215
216 /* Just check the value string is not empty */
217 if (!value || (strnlen(value, 2) == 0))
218 return FALSE;
219
220 if (strcmp("outputstream", setting) != 0)
221 return FALSE;
222
223 if (!strcmp("stdout", value))
224 consoleAppender->outputStream = WLOG_CONSOLE_STDOUT;
225 else if (!strcmp("stderr", value))
226 consoleAppender->outputStream = WLOG_CONSOLE_STDERR;
227 else if (!strcmp("default", value))
228 consoleAppender->outputStream = WLOG_CONSOLE_DEFAULT;
229 else if (!strcmp("debug", value))
230 consoleAppender->outputStream = WLOG_CONSOLE_DEBUG;
231 else
232 return FALSE;
233
234 return TRUE;
235}
236
237static void WLog_ConsoleAppender_Free(wLogAppender* appender)
238{
239 if (appender)
240 {
241 if (appender->PacketMessageContext)
242 {
243 Pcap_Close((wPcap*)appender->PacketMessageContext);
244 }
245
246 free(appender);
247 }
248}
249
250wLogAppender* WLog_ConsoleAppender_New(WINPR_ATTR_UNUSED wLog* log)
251{
252 wLogConsoleAppender* ConsoleAppender =
253 (wLogConsoleAppender*)calloc(1, sizeof(wLogConsoleAppender));
254
255 if (!ConsoleAppender)
256 return NULL;
257
258 ConsoleAppender->common.Type = WLOG_APPENDER_CONSOLE;
259 ConsoleAppender->common.Open = WLog_ConsoleAppender_Open;
260 ConsoleAppender->common.Close = WLog_ConsoleAppender_Close;
261 ConsoleAppender->common.WriteMessage = WLog_ConsoleAppender_WriteMessage;
262 ConsoleAppender->common.WriteDataMessage = WLog_ConsoleAppender_WriteDataMessage;
263 ConsoleAppender->common.WriteImageMessage = WLog_ConsoleAppender_WriteImageMessage;
264 ConsoleAppender->common.WritePacketMessage = WLog_ConsoleAppender_WritePacketMessage;
265 ConsoleAppender->common.Set = WLog_ConsoleAppender_Set;
266 ConsoleAppender->common.Free = WLog_ConsoleAppender_Free;
267
268 ConsoleAppender->outputStream = WLOG_CONSOLE_DEFAULT;
269
270#ifdef _WIN32
271 if (IsDebuggerPresent())
272 ConsoleAppender->outputStream = WLOG_CONSOLE_DEBUG;
273#endif
274
275 return &ConsoleAppender->common;
276}