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] = { 0 };
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,
148 char* FullFileName = NULL;
151 FullFileName = WLog_Message_GetOutputFileName(DataId,
"dat");
153 WLog_DataMessage_Write(FullFileName, message->Data, message->Length);
161static int g_ImageId = 0;
163static BOOL WLog_ConsoleAppender_WriteImageMessage(WINPR_ATTR_UNUSED wLog* log,
164 WINPR_ATTR_UNUSED wLogAppender* appender,
171 char* FullFileName = NULL;
173 ImageId = g_ImageId++;
174 FullFileName = WLog_Message_GetOutputFileName(ImageId,
"bmp");
176 WLog_ImageMessage_Write(FullFileName, message->ImageData, message->ImageWidth,
177 message->ImageHeight, message->ImageBpp);
185static int g_PacketId = 0;
187static BOOL WLog_ConsoleAppender_WritePacketMessage(WINPR_ATTR_UNUSED wLog* log,
188 wLogAppender* appender,
194 char* FullFileName = NULL;
198 if (!appender->PacketMessageContext)
200 FullFileName = WLog_Message_GetOutputFileName(-1,
"pcap");
201 appender->PacketMessageContext = (
void*)Pcap_Open(FullFileName, TRUE);
205 if (appender->PacketMessageContext)
206 return WLog_PacketMessage_Write((
wPcap*)appender->PacketMessageContext, message->PacketData,
207 message->PacketLength, message->PacketFlags);
212static BOOL WLog_ConsoleAppender_Set(wLogAppender* appender,
const char* setting,
void* value)
214 wLogConsoleAppender* consoleAppender = (wLogConsoleAppender*)appender;
217 if (!value || (strnlen(value, 2) == 0))
220 if (strcmp(
"outputstream", setting) != 0)
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;
237static void WLog_ConsoleAppender_Free(wLogAppender* appender)
241 if (appender->PacketMessageContext)
243 Pcap_Close((
wPcap*)appender->PacketMessageContext);
250wLogAppender* WLog_ConsoleAppender_New(WINPR_ATTR_UNUSED wLog* log)
252 wLogConsoleAppender* ConsoleAppender =
253 (wLogConsoleAppender*)calloc(1,
sizeof(wLogConsoleAppender));
255 if (!ConsoleAppender)
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;
268 ConsoleAppender->outputStream = WLOG_CONSOLE_DEFAULT;
271 if (IsDebuggerPresent())
272 ConsoleAppender->outputStream = WLOG_CONSOLE_DEBUG;
275 return &ConsoleAppender->common;