l2-unlegits/d3d9_proxy_loader/logger/Logger.cpp
2012-02-04 07:51:41 +00:00

196 lines
5.8 KiB
C++

#include "pch.h"
#include "Logger.h"
// global ErrorLogger vars
bool g_error_logger_enabled;
bool g_error_logger_enabled_console;
FILE *g_error_logger_file;
bool g_error_logger_auto_prepend;
CRITICAL_SECTION g_error_logger_cs;
HANDLE g_error_logger_stdout;
// strings
char g_error_logger_strtype_unknown[16];
char g_error_logger_strtype[LOG_LEVELS][16];
//
LOG_LEVEL g_errorLogger_WarnMessageLevel;
void ErrorLogger_InitStrings()
{
strcpy( g_error_logger_strtype_unknown, "[??] " );
strcpy( g_error_logger_strtype[LOG_OK], "[++] " );
strcpy( g_error_logger_strtype[LOG_ERROR], "[--] " );
strcpy( g_error_logger_strtype[LOG_WARNING], "[WARN] " );
strcpy( g_error_logger_strtype[LOG_USERAI], "[AI] " );
strcpy( g_error_logger_strtype[LOG_PACKETNAME], "[PACK] " );
strcpy( g_error_logger_strtype[LOG_DEBUG], "[DBG] " );
strcpy( g_error_logger_strtype[LOG_DEBUGDUMP], "[DUMP] " );
}
void ErrorLogger_Init()
{
g_error_logger_enabled = false;
g_error_logger_enabled_console = false;
g_error_logger_file = stdout;
g_error_logger_auto_prepend = false;
g_error_logger_stdout = INVALID_HANDLE_VALUE;
g_errorLogger_WarnMessageLevel = LOG_DEBUG;
InitializeCriticalSection( &g_error_logger_cs );
ErrorLogger_InitStrings();
}
void ErrorLogger_Enable( bool bEnable )
{
g_error_logger_enabled = bEnable;
}
void ErrorLogger_SetWarnMessageLevel( LOG_LEVEL level )
{
g_errorLogger_WarnMessageLevel = level;
}
void ErrorLogger_EnableLoggingToConsole( bool bEnable )
{
EnterCriticalSection( &g_error_logger_cs );
if( bEnable )
{
if( g_error_logger_enabled_console == false ) AllocConsole();
g_error_logger_stdout = GetStdHandle( STD_OUTPUT_HANDLE );
}
else
{
g_error_logger_stdout = INVALID_HANDLE_VALUE;
if( g_error_logger_enabled_console == true ) FreeConsole();
}
g_error_logger_enabled_console = bEnable;
LeaveCriticalSection( &g_error_logger_cs );
}
void ErrorLogger_SetLogFile( FILE *f )
{
EnterCriticalSection( &g_error_logger_cs );
if( !f ) g_error_logger_file = stdout; else g_error_logger_file = f;
LeaveCriticalSection( &g_error_logger_cs );
}
FILE *ErrorLogger_GetLogFile()
{
return g_error_logger_file;
}
void ErrorLogger_FlushLogFile()
{
EnterCriticalSection( &g_error_logger_cs );
if( g_error_logger_file ) fflush( g_error_logger_file );
LeaveCriticalSection( &g_error_logger_cs );
}
void ErrorLogger_SetAutoPrependErrorType( bool bPrepend )
{
g_error_logger_auto_prepend = bPrepend;
}
int log_error( LOG_LEVEL logLevel, const char *_Format, ... )
{
if( !g_error_logger_enabled ) return 0;
int ret = 0;
if( (logLevel < 0) || (!_Format) ) return 0;
if( logLevel > g_errorLogger_WarnMessageLevel ) return 0;
EnterCriticalSection( &g_error_logger_cs );
va_list l;
va_start( l, _Format );
if( g_error_logger_auto_prepend )
{
char *szPrepend = g_error_logger_strtype_unknown;
if( (logLevel >= LOG_OK) && (logLevel <= LOGLEVEL_LAST) )
szPrepend = g_error_logger_strtype[logLevel];
fprintf( g_error_logger_file, "%s", szPrepend );
// also write to console, if enabled
if( g_error_logger_enabled_console )
{
DWORD numWritten = 0;
WriteConsoleA( g_error_logger_stdout, szPrepend, (DWORD)strlen(szPrepend), &numWritten, NULL );
}
}
ret = vfprintf( g_error_logger_file, _Format, l );
// also write to console, if enabled
if( g_error_logger_enabled_console )
{
char *cbuffer = (char *)malloc( 20480 ); // 20 Kb >_<
if( cbuffer )
{
va_list l2;
va_start( l2, _Format );
vsprintf( cbuffer, _Format, l2 );
DWORD numWritten = 0;
WriteConsoleA( g_error_logger_stdout, cbuffer, (DWORD)strlen(cbuffer), &numWritten, NULL );
free( cbuffer );
}
}
LeaveCriticalSection( &g_error_logger_cs );
return ret;
}
// forces NO prepend even if set to
int log_error_np( LOG_LEVEL logLevel, const char *_Format, ... )
{
if( !g_error_logger_enabled ) return 0;
int ret = 0;
if( (logLevel < 0) || (!_Format) ) return 0;
if( logLevel > g_errorLogger_WarnMessageLevel ) return 0;
EnterCriticalSection( &g_error_logger_cs );
va_list l;
va_start( l, _Format );
// no prepend, just vfprintf
ret = vfprintf( g_error_logger_file, _Format, l );
// also write to console, if enabled?
if( g_error_logger_enabled_console )
{
char *cbuffer = (char *)malloc( 20480 );
if( cbuffer )
{
va_list l2;
va_start( l2, _Format );
vsprintf( cbuffer, _Format, l2 );
DWORD numWritten = 0;
WriteConsoleA( g_error_logger_stdout, cbuffer, (DWORD)strlen(cbuffer), &numWritten, NULL );
free( cbuffer );
}
}
LeaveCriticalSection( &g_error_logger_cs );
return ret;
}
//int log_console( LOG_LEVEL logLevel, const char *_Format, ... )
//{
// if( !g_error_logger_enabled_console ) return 0;
//}
//
//int log_console_np( LOG_LEVEL logLevel, const char *_Format, ... )
//{
// if( !g_error_logger_enabled_console ) return 0;
//}
void ErrorLogger_FormatLastError( char *msg, size_t nMaxCount, DWORD error_code )
{
FormatMessageA( FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
NULL, error_code, 0/*MAKELANGID(LANG_ENGLISH, SUBLANG_DEFAULT)*/, msg, nMaxCount, NULL );
}
void ErrorLogger_LogLastError( char *comment, DWORD error_code )
{
char errbuf[512];
errbuf[0] = 0;
ErrorLogger_FormatLastError( errbuf, 511, error_code );
errbuf[511] = 0;
size_t ll = strlen( errbuf );
if( ll > 0 )
{
if( errbuf[ll-1] == '\n' || errbuf[ll-1] == '\r' ) errbuf[ll-1] = 0;
if( ll > 1 )
{
if( errbuf[ll-2] == '\n' || errbuf[ll-2] == '\r' ) errbuf[ll-2] = 0;
}
}
log_error( LOG_ERROR, "%s: error code: %u (%s)\n", comment, (unsigned int)error_code, errbuf );
}