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 #ifdef _WIN32
#include "Win32/Win32Service.h" #include "Win32/Win32Service.h"
#ifdef WIN32_APP #ifdef WIN32_APP
#include <windows.h>
#include "Win32/Win32App.h" #include "Win32/Win32App.h"
#endif #endif
@ -23,6 +24,11 @@ namespace util
setlocale(LC_ALL, "Russian"); setlocale(LC_ALL, "Russian");
setlocale(LC_TIME, "C"); 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)) if (!Daemon_Singleton::init(argc, argv))
return false; return false;

View File

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

View File

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