1
0

Fixed windows compilation and style issues.

This commit is contained in:
madmaxoft 2014-08-12 22:43:04 +02:00
parent 01c50eb53a
commit 10e58f04da
4 changed files with 177 additions and 37 deletions

View File

@ -2,6 +2,12 @@
#include "Globals.h" // NOTE: MSVC stupidness requires this to be the same across all modules #include "Globals.h" // NOTE: MSVC stupidness requires this to be the same across all modules
#include "OSSupport/IsThread.h" #include "OSSupport/IsThread.h"
#ifdef _WIN32
#include <time.h>
#endif
cLogger & cLogger::GetInstance(void) cLogger & cLogger::GetInstance(void)
@ -10,23 +16,31 @@ cLogger & cLogger::GetInstance(void)
return Instance; return Instance;
} }
void cLogger::InitiateMultithreading() void cLogger::InitiateMultithreading()
{ {
GetInstance(); GetInstance();
} }
void cLogger::LogSimple(AString a_Message, eLogLevel a_LogLevel) void cLogger::LogSimple(AString a_Message, eLogLevel a_LogLevel)
{ {
time_t rawtime; time_t rawtime;
time ( &rawtime); time(&rawtime);
struct tm* timeinfo; struct tm * timeinfo;
#ifdef _MSC_VER #ifdef _MSC_VER
struct tm timeinforeal; struct tm timeinforeal;
timeinfo = &timeinforeal; timeinfo = &timeinforeal;
localtime_s(timeinfo, &rawtime); localtime_s(timeinfo, &rawtime);
#else #else
timeinfo = localtime( &rawtime); timeinfo = localtime(&rawtime);
#endif #endif
AString Line; AString Line;
@ -38,7 +52,7 @@ void cLogger::LogSimple(AString a_Message, eLogLevel a_LogLevel)
cCSLock Lock(m_CriticalSection); cCSLock Lock(m_CriticalSection);
for(size_t i = 0; i < m_LogListeners.size(); i++) for (size_t i = 0; i < m_LogListeners.size(); i++)
{ {
m_LogListeners[i]->Log(a_Message, a_LogLevel); m_LogListeners[i]->Log(a_Message, a_LogLevel);
} }
@ -55,12 +69,20 @@ void cLogger::Log(const char * a_Format, eLogLevel a_LogLevel, va_list a_ArgList
LogSimple(Message, a_LogLevel); LogSimple(Message, a_LogLevel);
} }
void cLogger::AttachListener(cListener * a_Listener) void cLogger::AttachListener(cListener * a_Listener)
{ {
cCSLock Lock(m_CriticalSection); cCSLock Lock(m_CriticalSection);
m_LogListeners.push_back(a_Listener); m_LogListeners.push_back(a_Listener);
} }
void cLogger::DetachListener(cListener * a_Listener) void cLogger::DetachListener(cListener * a_Listener)
{ {
cCSLock Lock(m_CriticalSection); cCSLock Lock(m_CriticalSection);
@ -69,10 +91,12 @@ void cLogger::DetachListener(cListener * a_Listener)
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
// Global functions // Global functions
void LOG(const char* a_Format, ...) void LOG(const char * a_Format, ...)
{ {
va_list argList; va_list argList;
va_start(argList, a_Format); va_start(argList, a_Format);
@ -80,7 +104,11 @@ void LOG(const char* a_Format, ...)
va_end(argList); va_end(argList);
} }
void LOGINFO(const char* a_Format, ...)
void LOGINFO(const char * a_Format, ...)
{ {
va_list argList; va_list argList;
va_start(argList, a_Format); va_start(argList, a_Format);
@ -88,7 +116,11 @@ void LOGINFO(const char* a_Format, ...)
va_end(argList); va_end(argList);
} }
void LOGWARN(const char* a_Format, ...)
void LOGWARN(const char * a_Format, ...)
{ {
va_list argList; va_list argList;
va_start(argList, a_Format); va_start(argList, a_Format);
@ -96,7 +128,11 @@ void LOGWARN(const char* a_Format, ...)
va_end(argList); va_end(argList);
} }
void LOGERROR(const char* a_Format, ...)
void LOGERROR(const char * a_Format, ...)
{ {
va_list argList; va_list argList;
va_start(argList, a_Format); va_start(argList, a_Format);

View File

@ -5,6 +5,7 @@
#if defined(_WIN32) #if defined(_WIN32)
#include <io.h> // Needed for _isatty(), not available on Linux #include <io.h> // Needed for _isatty(), not available on Linux
#include <time.h>
#elif defined(__linux) && !defined(ANDROID_NDK) #elif defined(__linux) && !defined(ANDROID_NDK)
#include <unistd.h> // Needed for isatty() on Linux #include <unistd.h> // Needed for isatty() on Linux
#elif defined(ANDROID_NDK) #elif defined(ANDROID_NDK)
@ -29,10 +30,15 @@
}; };
#endif #endif
#ifdef _WIN32 #ifdef _WIN32
class cWindowsConsoleListener class cWindowsConsoleListener
: public cColouredConsoleListener : public cColouredConsoleListener
{ {
typedef cColouredConsoleListener super;
public: public:
cWindowsConsoleListener(HANDLE a_Console, WORD a_DefaultConsoleAttrib) : cWindowsConsoleListener(HANDLE a_Console, WORD a_DefaultConsoleAttrib) :
m_Console(a_Console), m_Console(a_Console),
@ -43,7 +49,7 @@
#ifdef DEBUG #ifdef DEBUG
virtual void Log(AString a_Message, cLogger::eLogLevel a_LogLevel) override virtual void Log(AString a_Message, cLogger::eLogLevel a_LogLevel) override
{ {
cColouredConsoleListener::Log(a_Message, a_LogLevel); super::Log(a_Message, a_LogLevel);
// In a Windows Debug build, output the log to debug console as well: // In a Windows Debug build, output the log to debug console as well:
OutputDebugStringA(a_Message.c_str()); OutputDebugStringA(a_Message.c_str());
} }
@ -57,33 +63,51 @@
switch (a_LogLevel) switch (a_LogLevel)
{ {
case cLogger::llRegular: case cLogger::llRegular:
{
// Gray on black // Gray on black
Attrib = FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED; Attrib = FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED;
break; break;
}
case cLogger::llInfo: case cLogger::llInfo:
{
// Yellow on black // Yellow on black
Attrib = FOREGROUND_GREEN | ; Attrib = FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY;
break; break;
}
case cLogger::llWarning: case cLogger::llWarning:
{
// Red on black // Red on black
Attrib = FOREGROUND_RED | FOREGROUND_INTENSITY; Attrib = FOREGROUND_RED | FOREGROUND_INTENSITY;
break; break;
}
case cLogger::llError: case cLogger::llError:
{
// Black on red // Black on red
Attrib = BACKGROUND_RED | BACKGROUND_INTENSITY; Attrib = BACKGROUND_RED | BACKGROUND_INTENSITY;
break; break;
} }
}
SetConsoleTextAttribute(m_Console, Attrib); SetConsoleTextAttribute(m_Console, Attrib);
} }
virtual void SetDefaultLogColour() override virtual void SetDefaultLogColour() override
{ {
SetConsoleTextAttribute(m_Console, m_DefaultConsoleAttrib); SetConsoleTextAttribute(m_Console, m_DefaultConsoleAttrib);
} }
private: private:
HANDLE m_Console; HANDLE m_Console;
WORD m_DefaultConsoleAttrib; WORD m_DefaultConsoleAttrib;
}; };
#elif defined (__linux) && !defined(ANDROID_NDK) #elif defined (__linux) && !defined(ANDROID_NDK)
class cLinuxConsoleListener class cLinuxConsoleListener
: public cColouredConsoleListener : public cColouredConsoleListener
{ {
@ -93,30 +117,46 @@
switch (a_LogLevel) switch (a_LogLevel)
{ {
case cLogger::llRegular: case cLogger::llRegular:
{
// Whatever the console default is // Whatever the console default is
printf("\x1b[0m"); printf("\x1b[0m");
break; break;
}
case cLogger::llInfo: case cLogger::llInfo:
{
// Yellow on black // Yellow on black
printf("\x1b[33;1m"); printf("\x1b[33;1m");
break; break;
}
case cLogger::llWarning: case cLogger::llWarning:
{
// Red on black // Red on black
printf("\x1b[31;1m"); printf("\x1b[31;1m");
break; break;
}
case cLogger::llError: case cLogger::llError:
{
// Yellow on red // Yellow on red
printf("\x1b[1;33;41;1m"); printf("\x1b[1;33;41;1m");
break; break;
} }
} }
}
virtual void SetDefaultLogColour() override virtual void SetDefaultLogColour() override
{ {
// Whatever the console default is // Whatever the console default is
printf("\x1b[0m"); printf("\x1b[0m");
} }
}; };
#elif defined(ANDROID_NDK) #elif defined(ANDROID_NDK)
class cAndroidConsoleListener class cAndroidConsoleListener
: public cLogger::cListener : public cLogger::cListener
{ {
@ -127,23 +167,36 @@
switch (a_LogLevel) switch (a_LogLevel)
{ {
case cLogger::llRegular: case cLogger::llRegular:
{
AndroidLogLevel = ANDROID_LOG_VERBOSE; AndroidLogLevel = ANDROID_LOG_VERBOSE;
break; break;
}
case cLogger::llInfo: case cLogger::llInfo:
{
AndroidLogLevel = ANDROID_LOG_INFO; AndroidLogLevel = ANDROID_LOG_INFO;
break; break;
}
case cLogger::llWarning: case cLogger::llWarning:
{
AndroidLogLevel = ANDROID_LOG_WARNING; AndroidLogLevel = ANDROID_LOG_WARNING;
break; break;
}
case cLogger::llError: case cLogger::llError:
{
AndroidLogLevel = ANDROID_LOG_ERROR; AndroidLogLevel = ANDROID_LOG_ERROR;
break; break;
} }
}
__android_log_print(AndroidLogLevel, "MCServer", "%s", a_Message.c_str()); __android_log_print(AndroidLogLevel, "MCServer", "%s", a_Message.c_str());
} }
}; };
#endif #endif
class cVanillaCPPConsoleListener class cVanillaCPPConsoleListener
: public cLogger::cListener : public cLogger::cListener
{ {
@ -154,25 +207,35 @@ public:
switch (a_LogLevel) switch (a_LogLevel)
{ {
case cLogger::llRegular: case cLogger::llRegular:
{
LogLevelString = "Log"; LogLevelString = "Log";
break; break;
}
case cLogger::llInfo: case cLogger::llInfo:
{
LogLevelString = "Info"; LogLevelString = "Info";
break; break;
}
case cLogger::llWarning: case cLogger::llWarning:
{
LogLevelString = "Warning"; LogLevelString = "Warning";
break; break;
}
case cLogger::llError: case cLogger::llError:
{
LogLevelString = "Error"; LogLevelString = "Error";
break; break;
} }
}
printf("%s: %s", LogLevelString.c_str(), a_Message.c_str()); printf("%s: %s", LogLevelString.c_str(), a_Message.c_str());
} }
}; };
cLogger::cListener * MakeConsoleListener()
cLogger::cListener * MakeConsoleListener(void)
{ {
#ifdef _WIN32 #ifdef _WIN32
// See whether we are writing to a console the default console attrib: // See whether we are writing to a console the default console attrib:
@ -180,12 +243,14 @@ cLogger::cListener * MakeConsoleListener()
if (ShouldColorOutput) if (ShouldColorOutput)
{ {
CONSOLE_SCREEN_BUFFER_INFO sbi; CONSOLE_SCREEN_BUFFER_INFO sbi;
HANDLE Console = getStdHandle(STD_OUTPUT_HANDLE); HANDLE Console = GetStdHandle(STD_OUTPUT_HANDLE);
GetConsoleScreenBufferInfo(Console, &sbi); GetConsoleScreenBufferInfo(Console, &sbi);
WORD DefaultConsoleAttrib = sbi.wAttributes; WORD DefaultConsoleAttrib = sbi.wAttributes;
return new cWindowsConsoleListener(Console, DefaultConsoleAttrib); return new cWindowsConsoleListener(Console, DefaultConsoleAttrib);
} else { }
return new cVanillaCPPConsoleListener(); else
{
return new cVanillaCPPConsoleListener;
} }
#elif defined (__linux) && !defined(ANDROID_NDK) #elif defined (__linux) && !defined(ANDROID_NDK)
@ -193,7 +258,9 @@ cLogger::cListener * MakeConsoleListener()
if (isatty(fileno(stdout))) if (isatty(fileno(stdout)))
{ {
return new cLinuxConsoleListener(); return new cLinuxConsoleListener();
} else { }
else
{
return new cVanillaCPPConsoleListener(); return new cVanillaCPPConsoleListener();
} }
#else #else
@ -201,7 +268,14 @@ cLogger::cListener * MakeConsoleListener()
#endif #endif
} }
cFileListener::cFileListener()
////////////////////////////////////////////////////////////////////////////////
// cFileListener:
cFileListener::cFileListener(void)
{ {
cFile::CreateFolder(FILE_IO_PREFIX + AString("logs")); cFile::CreateFolder(FILE_IO_PREFIX + AString("logs"));
AString FileName; AString FileName;
@ -209,23 +283,39 @@ cFileListener::cFileListener()
m_File.Open(FileName, cFile::fmAppend); m_File.Open(FileName, cFile::fmAppend);
} }
void cFileListener::Log(AString a_Message, cLogger::eLogLevel a_LogLevel) void cFileListener::Log(AString a_Message, cLogger::eLogLevel a_LogLevel)
{ {
AString LogLevelString; AString LogLevelString;
switch (a_LogLevel) switch (a_LogLevel)
{ {
case cLogger::llRegular: case cLogger::llRegular:
{
LogLevelString = "Log"; LogLevelString = "Log";
break; break;
}
case cLogger::llInfo: case cLogger::llInfo:
{
LogLevelString = "Info"; LogLevelString = "Info";
break; break;
}
case cLogger::llWarning: case cLogger::llWarning:
{
LogLevelString = "Warning"; LogLevelString = "Warning";
break; break;
}
case cLogger::llError: case cLogger::llError:
{
LogLevelString = "Error"; LogLevelString = "Error";
break; break;
} }
}
m_File.Printf("%s: %s", LogLevelString.c_str(), a_Message.c_str()); m_File.Printf("%s: %s", LogLevelString.c_str(), a_Message.c_str());
} }

View File

@ -1,17 +1,31 @@
#include "Logger.h" #include "Logger.h"
class cFileListener class cFileListener
: public cLogger::cListener : public cLogger::cListener
{ {
public: public:
cFileListener(); cFileListener();
cFileListener(AString a_Filename); cFileListener(AString a_Filename);
virtual void Log(AString a_Message, cLogger::eLogLevel a_LogLevel) override; virtual void Log(AString a_Message, cLogger::eLogLevel a_LogLevel) override;
private:
private:
cFile m_File; cFile m_File;
}; };
cLogger::cListener * MakeConsoleListener(); cLogger::cListener * MakeConsoleListener();