configurable throw function

This commit is contained in:
orignal 2020-05-05 11:13:59 -04:00
parent dbe1e3f577
commit d7d70b707f
3 changed files with 20 additions and 11 deletions

View File

@ -8,6 +8,7 @@
#ifdef _WIN32
#include "Win32/Win32Service.h"
#ifdef WIN32_APP
#include <windows.h>
#include "Win32/Win32App.h"
#endif
@ -23,6 +24,11 @@ namespace util
setlocale(LC_ALL, "Russian");
setlocale(LC_TIME, "C");
i2p::log::SetThrowFunction ([](const std::string& s)
{
MessageBox(0, TEXT(s.c_str ()), TEXT("i2pd"), MB_ICONERROR | MB_TASKMODAL | MB_OK );
});
if (!Daemon_Singleton::init(argc, argv))
return false;

View File

@ -236,5 +236,11 @@ namespace log {
Log & Logger() {
return logger;
}
static ThrowFunction g_ThrowFunction;
ThrowFunction GetThrowFunction () { return g_ThrowFunction; }
void SetThrowFunction (ThrowFunction f) { g_ThrowFunction = f; }
} // log
} // i2p

View File

@ -17,16 +17,13 @@
#include <chrono>
#include <memory>
#include <thread>
#include <functional>
#include "Queue.h"
#ifndef _WIN32
#include <syslog.h>
#endif
#ifdef WIN32_APP
#include <windows.h> // TODO: move away to win32app
#endif
enum LogLevel
{
eLogNone = 0,
@ -155,6 +152,10 @@ namespace log {
};
Log & Logger();
typedef std::function<void (const std::string&)> ThrowFunction;
ThrowFunction GetThrowFunction ();
void SetThrowFunction (ThrowFunction f);
} // log
}
@ -201,7 +202,6 @@ void LogPrint (LogLevel level, TArgs&&... args) noexcept
log.Append(msg);
}
/**
* @brief Throw fatal error message with the list of arguments
* @param args Array of message parts
@ -209,6 +209,8 @@ void LogPrint (LogLevel level, TArgs&&... args) noexcept
template<typename... TArgs>
void ThrowFatal (TArgs&&... args) noexcept
{
auto f = i2p::log::GetThrowFunction ();
if (!f) return;
// fold message to single string
std::stringstream ss("");
#if (__cplusplus >= 201703L) // C++ 17 or higher
@ -216,12 +218,7 @@ void ThrowFatal (TArgs&&... args) noexcept
#else
LogPrint (ss, std::forward<TArgs>(args)...);
#endif
#ifdef WIN32_APP
MessageBox(0, TEXT(ss.str ().c_str ()), TEXT("i2pd"), MB_ICONERROR | MB_TASKMODAL | MB_OK );
#else
std::cout << ss.str ();
#endif
f (ss.str ());
}
#endif // LOG_H__