| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351 |
- /**
- * WinPR: Windows Portable Runtime
- * WinPR Logger
- *
- * Copyright 2013 Marc-Andre Moreau <marcandre.moreau@gmail.com>
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
- #ifdef HAVE_CONFIG_H
- #include "config.h"
- #endif
- #include "FileAppender.h"
- #include "Message.h"
- #include <winpr/crt.h>
- #include <winpr/environment.h>
- #include <winpr/file.h>
- #include <winpr/path.h>
- struct _wLogFileAppender
- {
- WLOG_APPENDER_COMMON();
- char* FileName;
- char* FilePath;
- char* FullFileName;
- FILE* FileDescriptor;
- };
- typedef struct _wLogFileAppender wLogFileAppender;
- static SYSTEMTIME LogDateTime = { 0 };
- static BOOL WLog_FileAppender_SetOutputFileName(wLogFileAppender* appender, const char* filename)
- {
- appender->FileName = _strdup(filename);
- if (!appender->FileName)
- return FALSE;
- return TRUE;
- }
- static BOOL WLog_FileAppender_SetOutputFilePath(wLogFileAppender* appender, const char* filepath)
- {
- appender->FilePath = _strdup(filepath);
- if (!appender->FilePath)
- return FALSE;
- return TRUE;
- }
- static BOOL WLog_FileAppender_Open(wLog* log, wLogAppender* appender)
- {
- wLogFileAppender* fileAppender;
- if (!log || !appender)
- return FALSE;
- fileAppender = (wLogFileAppender*)appender;
- if (!fileAppender->FilePath)
- {
- fileAppender->FilePath = GetKnownSubPath(KNOWN_PATH_TEMP, "wlog");
- if (!fileAppender->FilePath)
- return FALSE;
- }
- if (!fileAppender->FileName)
- {
- SYSTEMTIME localTime;
- fileAppender->FileName = (char*) malloc(MAX_PATH);
- if (!fileAppender->FileName)
- return FALSE;
- GetLocalTime(&localTime);
- //sprintf_s(fileAppender->FileName, MAX_PATH, "%"PRIu32".log", GetCurrentProcessId());
- sprintf_s(fileAppender->FileName, MAX_PATH, "%u%02u%02u.log", localTime.wYear, localTime.wMonth, localTime.wDay);
- CopyMemory(&LogDateTime, &localTime, sizeof(SYSTEMTIME));
- }
- if (!fileAppender->FullFileName)
- {
- fileAppender->FullFileName = GetCombinedPath(fileAppender->FilePath, fileAppender->FileName);
- if (!fileAppender->FullFileName)
- return FALSE;
- }
- if (!PathFileExistsA(fileAppender->FilePath))
- {
- if (!PathMakePathA(fileAppender->FilePath, 0))
- return FALSE;
- UnixChangeFileMode(fileAppender->FilePath, 0xFFFF);
- }
- fileAppender->FileDescriptor = fopen(fileAppender->FullFileName, "a+");
- if (!fileAppender->FileDescriptor)
- return FALSE;
- return TRUE;
- }
- static BOOL WLog_FileAppender_Close(wLog* log, wLogAppender* appender)
- {
- wLogFileAppender* fileAppender;
- if (!log || !appender)
- return FALSE;
- fileAppender = (wLogFileAppender*)appender;
- if (!fileAppender->FileDescriptor)
- return TRUE;
- fclose(fileAppender->FileDescriptor);
- fileAppender->FileDescriptor = NULL;
- return TRUE;
- }
- static BOOL WLog_FileAppender_ReOpenFileDescriptor(wLog* log, wLogAppender* appender)
- {
- char format[MAX_PATH];
- wLogFileAppender* fileAppender;
- BOOL bReopen = FALSE;
- SYSTEMTIME localTime;
- if (!log || !appender)
- return FALSE;
- fileAppender = (wLogFileAppender*)appender;
- if (!fileAppender->FileDescriptor)
- return FALSE;
- GetLocalTime(&localTime);
- //sprintf_s(format, MAX_PATH, "%"PRIu32".log", GetCurrentProcessId());
- //if (!strcmp(fileAppender->FileName, format)) {
- // bReopen = TRUE;
- //}
- //if (!bReopen)
- {
- }
- if (LogDateTime.wYear == 0
- ||
- !(LogDateTime.wYear == localTime.wYear
- && LogDateTime.wMonth == localTime.wMonth
- && LogDateTime.wDay == localTime.wDay))
- {
- if (WLog_FileAppender_Close(log, appender))
- {
- free(fileAppender->FileName);
- fileAppender->FileName = NULL;
- free(fileAppender->FullFileName);
- fileAppender->FullFileName = NULL;
- //fileAppender->FileName = (char*)malloc(MAX_PATH);
- //if (!fileAppender->FileName)
- // return FALSE;
- //sprintf_s(fileAppender->FileName, MAX_PATH, "%u%02u%02u.log", localTime.wYear, localTime.wMonth, localTime.wDay);
- if (WLog_FileAppender_Open(log, appender))
- {
- //CopyMemory(&LogDateTime, &localTime, sizeof(SYSTEMTIME));
- return TRUE;
- }
- }
- }
- return FALSE;
- }
- static BOOL WLog_FileAppender_WriteMessage(wLog* log, wLogAppender* appender, wLogMessage* message)
- {
- FILE* fp;
- char prefix[WLOG_MAX_PREFIX_SIZE];
- wLogFileAppender* fileAppender;
- if (!log || !appender || !message)
- return FALSE;
- fileAppender = (wLogFileAppender*)appender;
- WLog_FileAppender_ReOpenFileDescriptor(log, appender);
- fp = fileAppender->FileDescriptor;
- if (!fp)
- return FALSE;
- message->PrefixString = prefix;
- WLog_Layout_GetMessagePrefix(log, appender->Layout, message);
- fprintf(fp, "%s%s\n", message->PrefixString, message->TextString);
- // Debug [3/26/2020 16:43 Gifur]
- printf("%s%s\n", message->PrefixString, message->TextString);
- fflush(fp); /* slow! */
- return TRUE;
- }
- static int g_DataId = 0;
- static BOOL WLog_FileAppender_WriteDataMessage(wLog* log, wLogAppender* appender,
- wLogMessage* message)
- {
- int DataId;
- char* FullFileName;
- if (!log || !appender || !message)
- return FALSE;
- DataId = g_DataId++;
- FullFileName = WLog_Message_GetOutputFileName(DataId, "dat");
- WLog_DataMessage_Write(FullFileName, message->Data, message->Length);
- free(FullFileName);
- return TRUE;
- }
- static int g_ImageId = 0;
- static BOOL WLog_FileAppender_WriteImageMessage(wLog* log, wLogAppender* appender,
- wLogMessage* message)
- {
- int ImageId;
- char* FullFileName;
- if (!log || !appender || !message)
- return FALSE;
- ImageId = g_ImageId++;
- FullFileName = WLog_Message_GetOutputFileName(ImageId, "bmp");
- WLog_ImageMessage_Write(FullFileName, message->ImageData, message->ImageWidth,
- message->ImageHeight, message->ImageBpp);
- free(FullFileName);
- return TRUE;
- }
- static BOOL WLog_FileAppender_Set(wLogAppender* appender, const char* setting, void* value)
- {
- wLogFileAppender* fileAppender = (wLogFileAppender*)appender;
- /* Just check the value string is not empty */
- if (!value || (strnlen(value, 2) == 0))
- return FALSE;
- if (!strcmp("outputfilename", setting))
- return WLog_FileAppender_SetOutputFileName(fileAppender, (const char*)value);
- else if (!strcmp("outputfilepath", setting))
- return WLog_FileAppender_SetOutputFilePath(fileAppender, (const char*)value);
- else
- return FALSE;
- return TRUE;
- }
- static void WLog_FileAppender_Free(wLogAppender* appender)
- {
- wLogFileAppender* fileAppender = NULL;
- if (appender)
- {
- fileAppender = (wLogFileAppender*)appender;
- free(fileAppender->FileName);
- free(fileAppender->FilePath);
- free(fileAppender->FullFileName);
- free(fileAppender);
- }
- }
- wLogAppender* WLog_FileAppender_New(wLog* log)
- {
- LPSTR env;
- LPCSTR name;
- DWORD nSize;
- wLogFileAppender* FileAppender;
- FileAppender = (wLogFileAppender*)calloc(1, sizeof(wLogFileAppender));
- if (!FileAppender)
- return NULL;
- FileAppender->Type = WLOG_APPENDER_FILE;
- FileAppender->Open = WLog_FileAppender_Open;
- FileAppender->Close = WLog_FileAppender_Close;
- FileAppender->WriteMessage = WLog_FileAppender_WriteMessage;
- FileAppender->WriteDataMessage = WLog_FileAppender_WriteDataMessage;
- FileAppender->WriteImageMessage = WLog_FileAppender_WriteImageMessage;
- FileAppender->Free = WLog_FileAppender_Free;
- FileAppender->Set = WLog_FileAppender_Set;
- name = "WLOG_FILEAPPENDER_OUTPUT_FILE_PATH";
- nSize = GetEnvironmentVariableA(name, NULL, 0);
- if (nSize)
- {
- BOOL status;
- env = (LPSTR)malloc(nSize);
- if (!env)
- goto error_free;
- if (GetEnvironmentVariableA(name, env, nSize) != nSize - 1)
- {
- free(env);
- goto error_free;
- }
- status = WLog_FileAppender_SetOutputFilePath(FileAppender, env);
- free(env);
- if (!status)
- goto error_free;
- }
- name = "WLOG_FILEAPPENDER_OUTPUT_FILE_NAME";
- nSize = GetEnvironmentVariableA(name, NULL, 0);
- if (nSize)
- {
- BOOL status = FALSE;
- env = (LPSTR)malloc(nSize);
- if (!env)
- goto error_output_file_name;
- if (GetEnvironmentVariableA(name, env, nSize) == nSize - 1)
- status = WLog_FileAppender_SetOutputFileName(FileAppender, env);
- free(env);
- if (!status)
- goto error_output_file_name;
- }
- return (wLogAppender*)FileAppender;
- error_output_file_name:
- free(FileAppender->FilePath);
- error_free:
- free(FileAppender);
- return NULL;
- }
|