diff options
Diffstat (limited to 'src/LoggerListeners.cpp')
-rw-r--r-- | src/LoggerListeners.cpp | 120 |
1 files changed, 71 insertions, 49 deletions
diff --git a/src/LoggerListeners.cpp b/src/LoggerListeners.cpp index ba8139678..3b6ed2147 100644 --- a/src/LoggerListeners.cpp +++ b/src/LoggerListeners.cpp @@ -251,11 +251,11 @@ class cNullConsoleListener -cLogger::cListener * MakeConsoleListener(bool a_IsService) +std::unique_ptr<cLogger::cListener> MakeConsoleListener(bool a_IsService) { if (a_IsService) { - return new cNullConsoleListener; + return cpp14::make_unique<cNullConsoleListener>(); } #ifdef _WIN32 @@ -267,25 +267,25 @@ cLogger::cListener * MakeConsoleListener(bool a_IsService) HANDLE Console = GetStdHandle(STD_OUTPUT_HANDLE); GetConsoleScreenBufferInfo(Console, &sbi); WORD DefaultConsoleAttrib = sbi.wAttributes; - return new cWindowsConsoleListener(Console, DefaultConsoleAttrib); + return cpp14::make_unique<cWindowsConsoleListener>(Console, DefaultConsoleAttrib); } else { - return new cVanillaCPPConsoleListener; + return cpp14::make_unique<cVanillaCPPConsoleListener>(); } #elif defined (__linux) && !defined(ANDROID_NDK) // TODO: lookup terminal in terminfo if (isatty(fileno(stdout))) { - return new cLinuxConsoleListener(); + return cpp14::make_unique<cLinuxConsoleListener>(); } else { - return new cVanillaCPPConsoleListener(); + return cpp14::make_unique<cVanillaCPPConsoleListener>(); } #else - return new cVanillaCPPConsoleListener(); + return cpp14::make_unique<cVanillaCPPConsoleListener>(); #endif } @@ -296,60 +296,82 @@ cLogger::cListener * MakeConsoleListener(bool a_IsService) //////////////////////////////////////////////////////////////////////////////// // cFileListener: -cFileListener::cFileListener(void) +class cFileListener + : public cLogger::cListener { - cFile::CreateFolder(FILE_IO_PREFIX + AString("logs")); - m_File.Open( - FILE_IO_PREFIX + Printf( - "logs/LOG_%d.txt", - std::chrono::duration_cast<std::chrono::duration<int, std::ratio<1>>>( - std::chrono::system_clock::now().time_since_epoch() - ).count() - ), - cFile::fmAppend - ); -} - - +public: + cFileListener(void) {} + bool Open() + { + // Assume creation succeeds, as the API does not provide a way to tell if the folder exists. + cFile::CreateFolder(FILE_IO_PREFIX + AString("logs")); + bool success = m_File.Open( + FILE_IO_PREFIX + Printf( + "logs/LOG_%d.txt", + std::chrono::duration_cast<std::chrono::duration<int, std::ratio<1>>>( + std::chrono::system_clock::now().time_since_epoch() + ).count() + ), + cFile::fmAppend + ); + return success; + } -void cFileListener::Log(AString a_Message, cLogger::eLogLevel a_LogLevel) -{ - const char * LogLevelPrefix = "Unkn "; - bool ShouldFlush = false; - switch (a_LogLevel) + virtual void Log(AString a_Message, cLogger::eLogLevel a_LogLevel) override { - case cLogger::llRegular: - { - LogLevelPrefix = " "; - break; - } - case cLogger::llInfo: - { - LogLevelPrefix = "Info "; - break; - } - case cLogger::llWarning: + const char * LogLevelPrefix = "Unkn "; + bool ShouldFlush = false; + switch (a_LogLevel) { - LogLevelPrefix = "Warn "; - ShouldFlush = true; - break; + case cLogger::llRegular: + { + LogLevelPrefix = " "; + break; + } + case cLogger::llInfo: + { + LogLevelPrefix = "Info "; + break; + } + case cLogger::llWarning: + { + LogLevelPrefix = "Warn "; + ShouldFlush = true; + break; + } + case cLogger::llError: + { + LogLevelPrefix = "Err "; + ShouldFlush = true; + break; + } } - case cLogger::llError: + m_File.Printf("%s%s", LogLevelPrefix, a_Message.c_str()); + if (ShouldFlush) { - LogLevelPrefix = "Err "; - ShouldFlush = true; - break; + m_File.Flush(); } } - m_File.Printf("%s%s", LogLevelPrefix, a_Message.c_str()); - if (ShouldFlush) + +private: + + cFile m_File; +}; + + + + + +std::pair<bool, std::unique_ptr<cLogger::cListener>> MakeFileListener() +{ + auto listener = cpp14::make_unique<cFileListener>(); + if (!listener->Open()) { - m_File.Flush(); + return {false, nullptr}; } + return {true, std::move(listener)}; } - - |