20#include <winpr/config.h>
22#include "FileAppender.h"
26#include <winpr/environment.h>
27#include <winpr/file.h>
28#include <winpr/path.h>
40static BOOL WLog_FileAppender_SetOutputFileName(wLogFileAppender* appender,
const char* filename)
42 appender->FileName = _strdup(filename);
44 if (!appender->FileName)
50static BOOL WLog_FileAppender_SetOutputFilePath(wLogFileAppender* appender,
const char* filepath)
52 appender->FilePath = _strdup(filepath);
54 if (!appender->FilePath)
60static BOOL WLog_FileAppender_Open(wLog* log, wLogAppender* appender)
62 wLogFileAppender* fileAppender = NULL;
64 if (!log || !appender)
67 fileAppender = (wLogFileAppender*)appender;
69 if (!fileAppender->FilePath)
71 fileAppender->FilePath = GetKnownSubPath(KNOWN_PATH_TEMP,
"wlog");
73 if (!fileAppender->FilePath)
77 if (!fileAppender->FileName)
79 fileAppender->FileName = (
char*)malloc(MAX_PATH);
81 if (!fileAppender->FileName)
84 (void)sprintf_s(fileAppender->FileName, MAX_PATH,
"%" PRIu32
".log", GetCurrentProcessId());
87 if (!fileAppender->FullFileName)
89 fileAppender->FullFileName =
90 GetCombinedPath(fileAppender->FilePath, fileAppender->FileName);
92 if (!fileAppender->FullFileName)
96 if (!winpr_PathFileExists(fileAppender->FilePath))
98 if (!winpr_PathMakePath(fileAppender->FilePath, 0))
101 UnixChangeFileMode(fileAppender->FilePath, 0xFFFF);
104 fileAppender->FileDescriptor = winpr_fopen(fileAppender->FullFileName,
"a+");
106 if (!fileAppender->FileDescriptor)
112static BOOL WLog_FileAppender_Close(wLog* log, wLogAppender* appender)
114 wLogFileAppender* fileAppender = NULL;
116 if (!log || !appender)
119 fileAppender = (wLogFileAppender*)appender;
121 if (!fileAppender->FileDescriptor)
124 (void)fclose(fileAppender->FileDescriptor);
125 fileAppender->FileDescriptor = NULL;
129static BOOL WLog_FileAppender_WriteMessage(wLog* log, wLogAppender* appender,
132 if (!log || !appender || !cmessage)
135 wLogFileAppender* fileAppender = (wLogFileAppender*)appender;
136 FILE* fp = fileAppender->FileDescriptor;
141 char prefix[WLOG_MAX_PREFIX_SIZE] = { 0 };
142 WLog_Layout_GetMessagePrefix(log, appender->Layout, cmessage, prefix,
sizeof(prefix));
143 (void)fprintf(fp,
"%s%s\n", prefix, cmessage->TextString);
148static int g_DataId = 0;
150static BOOL WLog_FileAppender_WriteDataMessage(wLog* log, wLogAppender* appender,
154 char* FullFileName = NULL;
156 if (!log || !appender || !message)
160 FullFileName = WLog_Message_GetOutputFileName(DataId,
"dat");
161 WLog_DataMessage_Write(FullFileName, message->Data, message->Length);
166static int g_ImageId = 0;
168static BOOL WLog_FileAppender_WriteImageMessage(wLog* log, wLogAppender* appender,
172 char* FullFileName = NULL;
174 if (!log || !appender || !message)
177 ImageId = g_ImageId++;
178 FullFileName = WLog_Message_GetOutputFileName(ImageId,
"bmp");
179 WLog_ImageMessage_Write(FullFileName, message->ImageData, message->ImageWidth,
180 message->ImageHeight, message->ImageBpp);
185static BOOL WLog_FileAppender_Set(wLogAppender* appender,
const char* setting,
void* value)
187 wLogFileAppender* fileAppender = (wLogFileAppender*)appender;
190 if (!value || (strnlen(value, 2) == 0))
193 if (!strcmp(
"outputfilename", setting))
194 return WLog_FileAppender_SetOutputFileName(fileAppender, (
const char*)value);
196 if (!strcmp(
"outputfilepath", setting))
197 return WLog_FileAppender_SetOutputFilePath(fileAppender, (
const char*)value);
202static void WLog_FileAppender_Free(wLogAppender* appender)
204 wLogFileAppender* fileAppender = NULL;
208 fileAppender = (wLogFileAppender*)appender;
209 free(fileAppender->FileName);
210 free(fileAppender->FilePath);
211 free(fileAppender->FullFileName);
216wLogAppender* WLog_FileAppender_New(WINPR_ATTR_UNUSED wLog* log)
221 wLogFileAppender* FileAppender = NULL;
222 FileAppender = (wLogFileAppender*)calloc(1,
sizeof(wLogFileAppender));
227 FileAppender->common.Type = WLOG_APPENDER_FILE;
228 FileAppender->common.Open = WLog_FileAppender_Open;
229 FileAppender->common.Close = WLog_FileAppender_Close;
230 FileAppender->common.WriteMessage = WLog_FileAppender_WriteMessage;
231 FileAppender->common.WriteDataMessage = WLog_FileAppender_WriteDataMessage;
232 FileAppender->common.WriteImageMessage = WLog_FileAppender_WriteImageMessage;
233 FileAppender->common.Free = WLog_FileAppender_Free;
234 FileAppender->common.Set = WLog_FileAppender_Set;
235 name =
"WLOG_FILEAPPENDER_OUTPUT_FILE_PATH";
236 nSize = GetEnvironmentVariableA(name, NULL, 0);
241 env = (LPSTR)malloc(nSize);
246 if (GetEnvironmentVariableA(name, env, nSize) != nSize - 1)
252 status = WLog_FileAppender_SetOutputFilePath(FileAppender, env);
259 name =
"WLOG_FILEAPPENDER_OUTPUT_FILE_NAME";
260 nSize = GetEnvironmentVariableA(name, NULL, 0);
265 env = (LPSTR)malloc(nSize);
268 goto error_output_file_name;
270 if (GetEnvironmentVariableA(name, env, nSize) == nSize - 1)
271 status = WLog_FileAppender_SetOutputFileName(FileAppender, env);
275 goto error_output_file_name;
278 return (wLogAppender*)FileAppender;
279error_output_file_name:
280 free(FileAppender->FilePath);