20#include <winpr/config.h>
22#include "ConsoleAppender.h"
26#include <android/log.h>
29#define WLOG_CONSOLE_DEFAULT 0
30#define WLOG_CONSOLE_STDOUT 1
31#define WLOG_CONSOLE_STDERR 2
32#define WLOG_CONSOLE_DEBUG 4
36 WLOG_APPENDER_COMMON();
41static BOOL WLog_ConsoleAppender_Open(WINPR_ATTR_UNUSED wLog* log,
42 WINPR_ATTR_UNUSED wLogAppender* appender)
47static BOOL WLog_ConsoleAppender_Close(WINPR_ATTR_UNUSED wLog* log,
48 WINPR_ATTR_UNUSED wLogAppender* appender)
53static BOOL WLog_ConsoleAppender_WriteMessage(wLog* log, wLogAppender* appender,
57 char prefix[WLOG_MAX_PREFIX_SIZE] = { 0 };
58 wLogConsoleAppender* consoleAppender = NULL;
62 consoleAppender = (wLogConsoleAppender*)appender;
64 message->PrefixString = prefix;
65 WLog_Layout_GetMessagePrefix(log, appender->Layout, message);
68 if (consoleAppender->outputStream == WLOG_CONSOLE_DEBUG)
70 OutputDebugStringA(message->PrefixString);
71 OutputDebugStringA(message->TextString);
72 OutputDebugStringA(
"\n");
79 android_LogPriority level;
80 switch (message->Level)
83 level = ANDROID_LOG_VERBOSE;
86 level = ANDROID_LOG_DEBUG;
89 level = ANDROID_LOG_INFO;
92 level = ANDROID_LOG_WARN;
95 level = ANDROID_LOG_ERROR;
98 level = ANDROID_LOG_FATAL;
101 level = ANDROID_LOG_SILENT;
104 level = ANDROID_LOG_FATAL;
108 if (level != ANDROID_LOG_SILENT)
109 __android_log_print(level, log->Name,
"%s%s", message->PrefixString, message->TextString);
112 switch (consoleAppender->outputStream)
114 case WLOG_CONSOLE_STDOUT:
117 case WLOG_CONSOLE_STDERR:
121 switch (message->Level)
135 if (message->Level != WLOG_OFF)
136 (void)fprintf(fp,
"%s%s\n", message->PrefixString, message->TextString);
141static int g_DataId = 0;
143static BOOL WLog_ConsoleAppender_WriteDataMessage(WINPR_ATTR_UNUSED wLog* log,
144 WINPR_ATTR_UNUSED wLogAppender* appender,
151 char* FullFileName = NULL;
154 FullFileName = WLog_Message_GetOutputFileName(DataId,
"dat");
156 WLog_DataMessage_Write(FullFileName, message->Data, message->Length);
164static int g_ImageId = 0;
166static BOOL WLog_ConsoleAppender_WriteImageMessage(WINPR_ATTR_UNUSED wLog* log,
167 WINPR_ATTR_UNUSED wLogAppender* appender,
174 char* FullFileName = NULL;
176 ImageId = g_ImageId++;
177 FullFileName = WLog_Message_GetOutputFileName(ImageId,
"bmp");
179 WLog_ImageMessage_Write(FullFileName, message->ImageData, message->ImageWidth,
180 message->ImageHeight, message->ImageBpp);
188static int g_PacketId = 0;
190static BOOL WLog_ConsoleAppender_WritePacketMessage(WINPR_ATTR_UNUSED wLog* log,
196 char* FullFileName = NULL;
200 if (!appender->PacketMessageContext)
202 FullFileName = WLog_Message_GetOutputFileName(-1,
"pcap");
203 appender->PacketMessageContext = (
void*)Pcap_Open(FullFileName, TRUE);
207 if (appender->PacketMessageContext)
208 return WLog_PacketMessage_Write((
wPcap*)appender->PacketMessageContext, message->PacketData,
209 message->PacketLength, message->PacketFlags);
214static BOOL WLog_ConsoleAppender_Set(wLogAppender* appender,
const char* setting,
void* value)
216 wLogConsoleAppender* consoleAppender = (wLogConsoleAppender*)appender;
219 if (!value || (strnlen(value, 2) == 0))
222 if (strcmp(
"outputstream", setting) != 0)
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;
239static void WLog_ConsoleAppender_Free(wLogAppender* appender)
243 if (appender->PacketMessageContext)
245 Pcap_Close((
wPcap*)appender->PacketMessageContext);
252wLogAppender* WLog_ConsoleAppender_New(WINPR_ATTR_UNUSED wLog* log)
254 wLogConsoleAppender* ConsoleAppender = NULL;
256 ConsoleAppender = (wLogConsoleAppender*)calloc(1,
sizeof(wLogConsoleAppender));
258 if (!ConsoleAppender)
261 ConsoleAppender->Type = WLOG_APPENDER_CONSOLE;
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;
272 ConsoleAppender->outputStream = WLOG_CONSOLE_DEFAULT;
275 if (IsDebuggerPresent())
276 ConsoleAppender->outputStream = WLOG_CONSOLE_DEBUG;
279 return (wLogAppender*)ConsoleAppender;