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