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
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,
59 wLogConsoleAppender* consoleAppender = (wLogConsoleAppender*)appender;
61 char prefix[WLOG_MAX_PREFIX_SIZE] = WINPR_C_ARRAY_INIT;
62 WLog_Layout_GetMessagePrefix(log, appender->Layout, cmessage, prefix,
sizeof(prefix));
65 if (consoleAppender->outputStream == WLOG_CONSOLE_DEBUG)
67 OutputDebugStringA(prefix);
68 OutputDebugStringA(cmessage->TextString);
69 OutputDebugStringA(
"\n");
75 android_LogPriority level;
76 switch (cmessage->Level)
79 level = ANDROID_LOG_VERBOSE;
82 level = ANDROID_LOG_DEBUG;
85 level = ANDROID_LOG_INFO;
88 level = ANDROID_LOG_WARN;
91 level = ANDROID_LOG_ERROR;
94 level = ANDROID_LOG_FATAL;
97 level = ANDROID_LOG_SILENT;
100 level = ANDROID_LOG_FATAL;
104 if (level != ANDROID_LOG_SILENT)
105 __android_log_print(level, log->Name,
"%s%s", prefix, cmessage->TextString);
109 switch (consoleAppender->outputStream)
111 case WLOG_CONSOLE_STDOUT:
114 case WLOG_CONSOLE_STDERR:
118 switch (cmessage->Level)
132 if (cmessage->Level != WLOG_OFF)
133 (void)fprintf(fp,
"%s%s\n", prefix, cmessage->TextString);
138static int g_DataId = 0;
140static BOOL WLog_ConsoleAppender_WriteDataMessage(WINPR_ATTR_UNUSED wLog* log,
141 WINPR_ATTR_UNUSED wLogAppender* appender,
147 const int DataId = g_DataId++;
148 char* FullFileName = WLog_Message_GetOutputFileName(DataId,
"dat");
150 WLog_DataMessage_Write(FullFileName, message->Data, message->Length);
158static int g_ImageId = 0;
160static BOOL WLog_ConsoleAppender_WriteImageMessage(WINPR_ATTR_UNUSED wLog* log,
161 WINPR_ATTR_UNUSED wLogAppender* appender,
167 const int ImageId = g_ImageId++;
168 char* FullFileName = WLog_Message_GetOutputFileName(ImageId,
"bmp");
170 WLog_ImageMessage_Write(FullFileName, message->ImageData, message->ImageWidth,
171 message->ImageHeight, message->ImageBpp);
179static int g_PacketId = 0;
181static BOOL WLog_ConsoleAppender_WritePacketMessage(WINPR_ATTR_UNUSED wLog* log,
182 wLogAppender* appender,
190 if (!appender->PacketMessageContext)
192 char* FullFileName = WLog_Message_GetOutputFileName(-1,
"pcap");
193 appender->PacketMessageContext = (
void*)Pcap_Open(FullFileName, TRUE);
197 if (appender->PacketMessageContext)
198 return WLog_PacketMessage_Write((
wPcap*)appender->PacketMessageContext, message->PacketData,
199 message->PacketLength, message->PacketFlags);
204static BOOL WLog_ConsoleAppender_Set(wLogAppender* appender,
const char* setting,
void* value)
206 wLogConsoleAppender* consoleAppender = (wLogConsoleAppender*)appender;
209 if (!value || (strnlen(value, 2) == 0))
212 if (strcmp(
"outputstream", setting) != 0)
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;
229static void WLog_ConsoleAppender_Free(wLogAppender* appender)
233 if (appender->PacketMessageContext)
235 Pcap_Close((
wPcap*)appender->PacketMessageContext);
242wLogAppender* WLog_ConsoleAppender_New(WINPR_ATTR_UNUSED wLog* log)
244 wLogConsoleAppender* ConsoleAppender =
245 (wLogConsoleAppender*)calloc(1,
sizeof(wLogConsoleAppender));
247 if (!ConsoleAppender)
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;
260 ConsoleAppender->outputStream = WLOG_CONSOLE_DEFAULT;
263 if (IsDebuggerPresent())
264 ConsoleAppender->outputStream = WLOG_CONSOLE_DEBUG;
267 return &ConsoleAppender->common;