aboutsummaryrefslogtreecommitdiff
path: root/contrib
diff options
context:
space:
mode:
Diffstat (limited to 'contrib')
-rw-r--r--contrib/CMakeLists.txt1
-rw-r--r--contrib/epee/include/console_handler.h6
-rw-r--r--contrib/epee/include/misc_log_ex.h1435
-rw-r--r--contrib/epee/include/net/abstract_tcp_server.h3
-rw-r--r--contrib/epee/include/net/abstract_tcp_server2.h4
-rw-r--r--contrib/epee/include/net/abstract_tcp_server2.inl85
-rw-r--r--contrib/epee/include/net/abstract_tcp_server_cp.h3
-rw-r--r--contrib/epee/include/net/abstract_tcp_server_cp.inl3
-rw-r--r--contrib/epee/include/net/http_auth.h3
-rw-r--r--contrib/epee/include/net/http_base.h4
-rw-r--r--contrib/epee/include/net/http_client.h17
-rw-r--r--contrib/epee/include/net/http_client_abstract_invoke.h3
-rw-r--r--contrib/epee/include/net/http_client_base.h3
-rw-r--r--contrib/epee/include/net/http_client_via_api_helper.h3
-rw-r--r--contrib/epee/include/net/http_protocol_handler.h3
-rw-r--r--contrib/epee/include/net/http_protocol_handler.inl19
-rw-r--r--contrib/epee/include/net/http_server_cp.h4
-rw-r--r--contrib/epee/include/net/http_server_cp2.h4
-rw-r--r--contrib/epee/include/net/http_server_handlers_map2.h9
-rw-r--r--contrib/epee/include/net/http_server_impl_base.h8
-rw-r--r--contrib/epee/include/net/levin_client.inl4
-rw-r--r--contrib/epee/include/net/levin_client_async.h3
-rw-r--r--contrib/epee/include/net/levin_helper.h3
-rw-r--r--contrib/epee/include/net/levin_protocol_handler.h11
-rw-r--r--contrib/epee/include/net/levin_protocol_handler_async.h30
-rw-r--r--contrib/epee/include/net/net_helper.h17
-rw-r--r--contrib/epee/include/net/net_parse_helpers.h2
-rw-r--r--contrib/epee/include/net/net_utils_base.h43
-rw-r--r--contrib/epee/include/profile_tools.h6
-rw-r--r--contrib/epee/include/storages/levin_abstract_invoke2.h7
-rw-r--r--contrib/epee/include/storages/portable_storage_from_json.h4
-rw-r--r--contrib/epee/src/CMakeLists.txt2
-rw-r--r--contrib/epee/src/mlog.cpp319
-rw-r--r--contrib/otshell_utils/CMakeLists.txt18
-rw-r--r--contrib/otshell_utils/LICENCE.txt21
-rw-r--r--contrib/otshell_utils/ccolor.cpp116
-rw-r--r--contrib/otshell_utils/ccolor.hpp73
-rw-r--r--contrib/otshell_utils/lib_common1.hpp53
-rw-r--r--contrib/otshell_utils/runoptions.cpp69
-rw-r--r--contrib/otshell_utils/runoptions.hpp58
-rw-r--r--contrib/otshell_utils/utils.cpp806
-rw-r--r--contrib/otshell_utils/utils.hpp532
-rw-r--r--contrib/otshell_utils/windows_stream.cpp64
-rw-r--r--contrib/otshell_utils/windows_stream.h20
44 files changed, 603 insertions, 3298 deletions
diff --git a/contrib/CMakeLists.txt b/contrib/CMakeLists.txt
index 92b44e0db..6c2ee73ca 100644
--- a/contrib/CMakeLists.txt
+++ b/contrib/CMakeLists.txt
@@ -27,5 +27,4 @@
# THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
add_subdirectory(epee)
-add_subdirectory(otshell_utils)
diff --git a/contrib/epee/include/console_handler.h b/contrib/epee/include/console_handler.h
index 554a48488..54e3e966d 100644
--- a/contrib/epee/include/console_handler.h
+++ b/contrib/epee/include/console_handler.h
@@ -277,11 +277,11 @@ namespace epee
{
if (!m_prompt.empty())
{
- epee::log_space::set_console_color(epee::log_space::console_color_yellow, true);
+ epee::set_console_color(epee::console_color_yellow, true);
std::cout << m_prompt;
if (' ' != m_prompt.back())
std::cout << ' ';
- epee::log_space::reset_console_color();
+ epee::reset_console_color();
std::cout.flush();
}
}
@@ -310,7 +310,7 @@ namespace epee
}
if (!get_line_ret)
{
- LOG_PRINT("Failed to read line.", LOG_LEVEL_0);
+ MERROR("Failed to read line.");
}
string_tools::trim(command);
diff --git a/contrib/epee/include/misc_log_ex.h b/contrib/epee/include/misc_log_ex.h
index 82760dfff..f04282438 100644
--- a/contrib/epee/include/misc_log_ex.h
+++ b/contrib/epee/include/misc_log_ex.h
@@ -28,9 +28,13 @@
#ifndef _MISC_LOG_EX_H_
#define _MISC_LOG_EX_H_
-//#include <windows.h>
-#include <atomic>
-#include <string>
+#include "static_initializer.h"
+#include "string_tools.h"
+#include "time_helper.h"
+#include "misc_os_dependent.h"
+
+#include "syncobj.h"
+
#include <iostream>
#include <sstream>
#include <iomanip>
@@ -38,42 +42,79 @@
#include <algorithm>
#include <list>
#include <map>
+#include <string>
#include <time.h>
#include <boost/cstdint.hpp>
#include <boost/thread.hpp>
#include <boost/filesystem.hpp>
#include <boost/algorithm/string.hpp>
-#if defined(WIN32)
-#include <io.h>
-#else
-#include <unistd.h>
-#endif
-
-#include "static_initializer.h"
-#include "string_tools.h"
-#include "time_helper.h"
-#include "misc_os_dependent.h"
-
-#include "syncobj.h"
-
-
-#define LOG_LEVEL_SILENT -1
-#define LOG_LEVEL_0 0
-#define LOG_LEVEL_1 1
-#define LOG_LEVEL_2 2
-#define LOG_LEVEL_3 3
-#define LOG_LEVEL_4 4
-#define LOG_LEVEL_MIN LOG_LEVEL_SILENT
-#define LOG_LEVEL_MAX LOG_LEVEL_4
-
-
-#define LOGGER_NULL 0
-#define LOGGER_FILE 1
-#define LOGGER_DEBUGGER 2
-#define LOGGER_CONSOLE 3
-#define LOGGER_DUMP 4
-
+#define ELPP_THREAD_SAFE
+#define ELPP_DEFAULT_LOG_FILE ""
+#define ELPP_STACKTRACE 0
+#define ELPP_DISABLE_DEFAULT_CRASH_HANDLING
+#define ELPP_DISABLE_CHECK_MACROS
+#include "easylogging++.h"
+
+#define MONERO_DEFAULT_LOG_CATEGORY "default"
+
+#define MCFATAL(cat,x) CLOG(FATAL,cat) << x
+#define MCERROR(cat,x) CLOG(ERROR,cat) << x
+#define MCWARNING(cat,x) CLOG(WARNING,cat) << x
+#define MCINFO(cat,x) CLOG(INFO,cat) << x
+#define MCDEBUG(cat,x) CLOG(DEBUG,cat) << x
+#define MCTRACE(cat,x) CLOG(TRACE,cat) << x
+#define MCLOG(level,cat,x) ELPP_WRITE_LOG(el::base::Writer, level, el::base::DispatchAction::NormalLog, cat) << x
+
+#define MCLOG_COLOR(level,cat,color,x) MCLOG(level,cat,"\033[1;" color "m" << x << "\033[0m")
+#define MCLOG_RED(level,cat,x) MCLOG_COLOR(level,cat,"31",x)
+#define MCLOG_GREEN(level,cat,x) MCLOG_COLOR(level,cat,"32",x)
+#define MCLOG_YELLOW(level,cat,x) MCLOG_COLOR(level,cat,"33",x)
+#define MCLOG_BLUE(level,cat,x) MCLOG_COLOR(level,cat,"34",x)
+#define MCLOG_MAGENTA(level,cat,x) MCLOG_COLOR(level,cat,"35",x)
+#define MCLOG_CYAN(level,cat,x) MCLOG_COLOR(level,cat,"36",x)
+
+#define MLOG_RED(level,x) MCLOG_RED(level,MONERO_DEFAULT_LOG_CATEGORY,x)
+#define MLOG_GREEN(level,x) MCLOG_GREEN(level,MONERO_DEFAULT_LOG_CATEGORY,x)
+#define MLOG_YELLOW(level,x) MCLOG_YELLOW(level,MONERO_DEFAULT_LOG_CATEGORY,x)
+#define MLOG_BLUE(level,x) MCLOG_BLUE(level,MONERO_DEFAULT_LOG_CATEGORY,x)
+#define MLOG_MAGENTA(level,x) MCLOG_MAGENTA(level,MONERO_DEFAULT_LOG_CATEGORY,x)
+#define MLOG_CYAN(level,x) MCLOG_CYAN(level,MONERO_DEFAULT_LOG_CATEGORY,x)
+
+#define MFATAL(x) MCFATAL(MONERO_DEFAULT_LOG_CATEGORY,x)
+#define MERROR(x) MCERROR(MONERO_DEFAULT_LOG_CATEGORY,x)
+#define MWARNING(x) MCWARNING(MONERO_DEFAULT_LOG_CATEGORY,x)
+#define MINFO(x) MCINFO(MONERO_DEFAULT_LOG_CATEGORY,x)
+#define MDEBUG(x) MCDEBUG(MONERO_DEFAULT_LOG_CATEGORY,x)
+#define MTRACE(x) MCTRACE(MONERO_DEFAULT_LOG_CATEGORY,x)
+#define MLOG(level,x) MCLOG(level,MONERO_DEFAULT_LOG_CATEGORY,x)
+
+#define MGINFO(x) MCINFO("global",x)
+#define MGINFO_RED(x) MCLOG_RED(el::Level::Info, "global",x)
+#define MGINFO_GREEN(x) MCLOG_GREEN(el::Level::Info, "global",x)
+#define MGINFO_YELLOW(x) MCLOG_YELLOW(el::Level::Info, "global",x)
+#define MGINFO_BLUE(x) MCLOG_BLUE(el::Level::Info, "global",x)
+#define MGINFO_MAGENTA(x) MCLOG_MAGENTA(el::Level::Info, "global",x)
+#define MGINFO_CYAN(x) MCLOG_CYAN(el::Level::Info, "global",x)
+
+#define LOG_ERROR(x) MERROR(x)
+#define LOG_PRINT_L0(x) MWARNING(x)
+#define LOG_PRINT_L1(x) MINFO(x)
+#define LOG_PRINT_L2(x) MDEBUG(x)
+#define LOG_PRINT_L3(x) MTRACE(x)
+#define LOG_PRINT_L4(x) MTRACE(x)
+
+#define _dbg3(x) MTRACE(x)
+#define _dbg2(x) MDEBUG(x)
+#define _dbg1(x) MDEBUG(x)
+#define _info(x) MINFO(x)
+#define _note(x) MINFO(x)
+#define _fact(x) MINFO(x)
+#define _mark(x) MINFO(x)
+#define _warn(x) MWARNING(x)
+#define _erro(x) MERROR(x)
+
+#define MLOG_SET_THREAD_NAME(x) el::Loggers::setThreadName(x)
#ifndef LOCAL_ASSERT
#include <assert.h>
@@ -85,6 +126,12 @@
#endif
+std::string mlog_get_default_log_path(const char *default_filename);
+void mlog_configure(const std::string &filename_base, bool console);
+void mlog_set_categories(const char *categories);
+void mlog_set_log_level(int level);
+void mlog_set_log(const char *log);
+
namespace epee
{
namespace debug
@@ -97,1312 +144,8 @@ namespace debug
return e;
}
}
-namespace log_space
-{
- class logger;
- class log_message;
- class log_singletone;
-
- /************************************************************************/
- /* */
- /************************************************************************/
- enum console_colors
- {
- console_color_default,
- console_color_white,
- console_color_red,
- console_color_green,
- console_color_blue,
- console_color_cyan,
- console_color_magenta,
- console_color_yellow
- };
-
-
- struct ibase_log_stream
- {
- ibase_log_stream(){}
- virtual ~ibase_log_stream(){}
- virtual bool out_buffer( const char* buffer, int buffer_len , int log_level, int color, const char* plog_name = NULL)=0;
- virtual int get_type(){return 0;}
-
- virtual bool set_max_logfile_size(uint64_t max_size){return true;};
- virtual bool set_log_rotate_cmd(const std::string& cmd){return true;};
- };
-
- /************************************************************************/
- /* */
- /************************************************************************/
- /*struct ibase_log_value
- {
- public:
- virtual void debug_out( std::stringstream* p_stream)const = 0;
- };*/
-
- /************************************************************************/
- /* */
- /************************************************************************/
- /*class log_message: public std::stringstream
- {
- public:
- log_message(const log_message& lm): std::stringstream(), std::stringstream::basic_ios()
- {}
- log_message(){}
-
- template<class T>
- log_message& operator<< (T t)
- {
- std::stringstream* pstrstr = this;
- (*pstrstr) << t;
-
- return *this;
- }
- };
- inline
- log_space::log_message& operator<<(log_space::log_message& sstream, const ibase_log_value& log_val)
- {
- log_val.debug_out(&sstream);
- return sstream;
- }
- */
- /************************************************************************/
- /* */
- /************************************************************************/
- struct delete_ptr
- {
- template <class P>
- void operator() (P p)
- {
- delete p.first;
- }
- };
-
- /************************************************************************/
- /* */
- /************************************************************************/
- //------------------------------------------------------------------------
-#define max_dbg_str_len 80
-#ifdef _MSC_VER
- class debug_output_stream: public ibase_log_stream
- {
- virtual bool out_buffer( const char* buffer, int buffer_len , int log_level, int color, const char* plog_name = NULL)
- {
- for ( int i = 0; i < buffer_len; i = i + max_dbg_str_len )
- {
- std::string s( buffer + i, buffer_len- i < max_dbg_str_len ?
- buffer_len - i : max_dbg_str_len );
-
- ::OutputDebugStringA( s.c_str() );
- }
- return true;
- }
-
- };
-#endif
-
- inline bool is_stdout_a_tty()
- {
- static std::atomic<bool> initialized(false);
- static std::atomic<bool> is_a_tty(false);
-
- if (!initialized.load(std::memory_order_acquire))
- {
-#if defined(WIN32)
- is_a_tty.store(0 != _isatty(_fileno(stdout)), std::memory_order_relaxed);
-#else
- is_a_tty.store(0 != isatty(fileno(stdout)), std::memory_order_relaxed);
-#endif
- initialized.store(true, std::memory_order_release);
- }
-
- return is_a_tty.load(std::memory_order_relaxed);
- }
-
- inline void set_console_color(int color, bool bright)
- {
- if (!is_stdout_a_tty())
- return;
-
- switch(color)
- {
- case console_color_default:
- {
-#ifdef WIN32
- HANDLE h_stdout = GetStdHandle(STD_OUTPUT_HANDLE);
- SetConsoleTextAttribute(h_stdout, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE| (bright ? FOREGROUND_INTENSITY:0));
-#else
- if(bright)
- std::cout << "\033[1;37m";
- else
- std::cout << "\033[0m";
-#endif
- }
- break;
- case console_color_white:
- {
-#ifdef WIN32
- HANDLE h_stdout = GetStdHandle(STD_OUTPUT_HANDLE);
- SetConsoleTextAttribute(h_stdout, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | (bright ? FOREGROUND_INTENSITY:0));
-#else
- if(bright)
- std::cout << "\033[1;37m";
- else
- std::cout << "\033[0;37m";
-#endif
- }
- break;
- case console_color_red:
- {
-#ifdef WIN32
- HANDLE h_stdout = GetStdHandle(STD_OUTPUT_HANDLE);
- SetConsoleTextAttribute(h_stdout, FOREGROUND_RED | (bright ? FOREGROUND_INTENSITY:0));
-#else
- if(bright)
- std::cout << "\033[1;31m";
- else
- std::cout << "\033[0;31m";
-#endif
- }
- break;
- case console_color_green:
- {
-#ifdef WIN32
- HANDLE h_stdout = GetStdHandle(STD_OUTPUT_HANDLE);
- SetConsoleTextAttribute(h_stdout, FOREGROUND_GREEN | (bright ? FOREGROUND_INTENSITY:0));
-#else
- if(bright)
- std::cout << "\033[1;32m";
- else
- std::cout << "\033[0;32m";
-#endif
- }
- break;
-
- case console_color_blue:
- {
-#ifdef WIN32
- HANDLE h_stdout = GetStdHandle(STD_OUTPUT_HANDLE);
- SetConsoleTextAttribute(h_stdout, FOREGROUND_BLUE | FOREGROUND_INTENSITY);//(bright ? FOREGROUND_INTENSITY:0));
-#else
- if(bright)
- std::cout << "\033[1;34m";
- else
- std::cout << "\033[0;34m";
-#endif
- }
- break;
-
- case console_color_cyan:
- {
-#ifdef WIN32
- HANDLE h_stdout = GetStdHandle(STD_OUTPUT_HANDLE);
- SetConsoleTextAttribute(h_stdout, FOREGROUND_GREEN | FOREGROUND_BLUE | (bright ? FOREGROUND_INTENSITY:0));
-#else
- if(bright)
- std::cout << "\033[1;36m";
- else
- std::cout << "\033[0;36m";
-#endif
- }
- break;
-
- case console_color_magenta:
- {
-#ifdef WIN32
- HANDLE h_stdout = GetStdHandle(STD_OUTPUT_HANDLE);
- SetConsoleTextAttribute(h_stdout, FOREGROUND_BLUE | FOREGROUND_RED | (bright ? FOREGROUND_INTENSITY:0));
-#else
- if(bright)
- std::cout << "\033[1;35m";
- else
- std::cout << "\033[0;35m";
-#endif
- }
- break;
-
- case console_color_yellow:
- {
-#ifdef WIN32
- HANDLE h_stdout = GetStdHandle(STD_OUTPUT_HANDLE);
- SetConsoleTextAttribute(h_stdout, FOREGROUND_RED | FOREGROUND_GREEN | (bright ? FOREGROUND_INTENSITY:0));
-#else
- if(bright)
- std::cout << "\033[1;33m";
- else
- std::cout << "\033[0;33m";
-#endif
- }
- break;
-
- }
- }
-
- inline void reset_console_color() {
- if (!is_stdout_a_tty())
- return;
-
-#ifdef WIN32
- HANDLE h_stdout = GetStdHandle(STD_OUTPUT_HANDLE);
- SetConsoleTextAttribute(h_stdout, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
-#else
- std::cout << "\033[0m";
- std::cout.flush();
-#endif
- }
-
- class console_output_stream: public ibase_log_stream
- {
-#ifdef _MSC_VER
- bool m_have_to_kill_console;
-#endif
-
- public:
- console_output_stream()
- {
-#ifdef _MSC_VER
-
- if(!::GetStdHandle(STD_OUTPUT_HANDLE))
- m_have_to_kill_console = true;
- else
- m_have_to_kill_console = false;
-
- ::AllocConsole();
-#endif
- }
-
- ~console_output_stream()
- {
-#ifdef _MSC_VER
- if(m_have_to_kill_console)
- ::FreeConsole();
-#endif
- }
- int get_type(){return LOGGER_CONSOLE;}
-
-
-
- virtual bool out_buffer( const char* buffer, int buffer_len , int log_level, int color, const char* plog_name = NULL)
- {
- if(plog_name)
- return true; //skip alternative logs from console
-
- set_console_color(color, log_level < 1);
-
-#ifdef _MSC_VER
- const char* ptarget_buf = NULL;
- char* pallocated_buf = NULL;
-
- //
- int i = 0;
- for(; i < buffer_len; i++)
- if(buffer[i] == '\a') break;
- if(i == buffer_len)
- ptarget_buf = buffer;
- else
- {
- pallocated_buf = new char[buffer_len];
- ptarget_buf = pallocated_buf;
- for(i = 0; i < buffer_len; i++)
- {
- if(buffer[i] == '\a')
- pallocated_buf[i] = '^';
- else
- pallocated_buf[i] = buffer[i];
- }
- }
-
- //uint32_t b = 0;
- //::WriteConsoleA(::GetStdHandle(STD_OUTPUT_HANDLE), ptarget_buf, buffer_len, (DWORD*)&b, 0);
- std::cout << ptarget_buf;
- if(pallocated_buf) delete [] pallocated_buf;
-#else
- std::string buf(buffer, buffer_len);
- for(size_t i = 0; i!= buf.size(); i++)
- {
- if(buf[i] == 7 || (buf[i]&0xff) == 0x95)
- buf[i] = '^';
- }
-
- std::cout << buf;
- std::cout << std::flush;
-#endif
- reset_console_color();
- return true;
- }
-
-
- };
-
- inline bool rotate_log_file(const char* pfile_path)
- {
-#ifdef _MSC_VER
- if(!pfile_path)
- return false;
-
- std::string file_path = pfile_path;
- std::string::size_type a = file_path .rfind('.');
- if ( a != std::string::npos )
- file_path .erase( a, file_path .size());
-
- ::DeleteFileA( (file_path + ".0").c_str() );
- ::MoveFileA( (file_path + ".log").c_str(), (file_path + ".0").c_str() );
-#else
- return false;//not implemented yet
-#endif
- return true;
- }
-
-
-
-
- //--------------------------------------------------------------------------//
- class file_output_stream : public ibase_log_stream
- {
- public:
- typedef std::map<std::string, std::ofstream*> named_log_streams;
-
- file_output_stream( std::string default_log_file_name, std::string log_path )
- {
- m_default_log_filename = default_log_file_name;
- m_max_logfile_size = 0;
- m_default_log_path = log_path;
- m_pdefault_file_stream = add_new_stream_and_open(default_log_file_name.c_str());
- }
-
- ~file_output_stream()
- {
- for(named_log_streams::iterator it = m_log_file_names.begin(); it!=m_log_file_names.end(); it++)
- {
- if ( it->second->is_open() )
- {
- it->second->flush();
- it->second->close();
- }
- delete it->second;
- }
- }
- private:
- named_log_streams m_log_file_names;
- std::string m_default_log_path;
- std::ofstream* m_pdefault_file_stream;
- std::string m_log_rotate_cmd;
- std::string m_default_log_filename;
- uint64_t m_max_logfile_size;
-
-
- std::ofstream* add_new_stream_and_open(const char* pstream_name)
- {
- //log_space::rotate_log_file((m_default_log_path + "\\" + pstream_name).c_str());
-
- std::ofstream* pstream = (m_log_file_names[pstream_name] = new std::ofstream);
- std::string target_path = m_default_log_path + "/" + pstream_name;
- pstream->open( target_path.c_str(), std::ios_base::out | std::ios::app /*ios_base::trunc */);
- if(pstream->fail())
- return NULL;
- return pstream;
- }
-
- bool set_max_logfile_size(uint64_t max_size)
- {
- m_max_logfile_size = max_size;
- return true;
- }
-
- bool set_log_rotate_cmd(const std::string& cmd)
- {
- m_log_rotate_cmd = cmd;
- return true;
- }
-
-
-
- virtual bool out_buffer( const char* buffer, int buffer_len, int log_level, int color, const char* plog_name = NULL )
- {
- std::ofstream* m_target_file_stream = m_pdefault_file_stream;
- if(plog_name)
- { //find named stream
- named_log_streams::iterator it = m_log_file_names.find(plog_name);
- if(it == m_log_file_names.end())
- m_target_file_stream = add_new_stream_and_open(plog_name);
- else
- m_target_file_stream = it->second;
- }
- if(!m_target_file_stream || !m_target_file_stream->is_open())
- return false;//TODO: add assert here
-
- m_target_file_stream->write(buffer, buffer_len );
- m_target_file_stream->flush();
-
- if(m_max_logfile_size)
- {
- std::ofstream::pos_type pt = m_target_file_stream->tellp();
- uint64_t current_sz = pt;
- if(current_sz > m_max_logfile_size)
- {
- std::cout << "current_sz= " << current_sz << " m_max_logfile_size= " << m_max_logfile_size << std::endl;
- std::string log_file_name;
- if(!plog_name)
- log_file_name = m_default_log_filename;
- else
- log_file_name = plog_name;
-
- m_target_file_stream->close();
- std::string new_log_file_name = log_file_name;
-
- time_t tm = 0;
- time(&tm);
-
- int err_count = 0;
- boost::system::error_code ec;
- do
- {
- new_log_file_name = string_tools::cut_off_extension(log_file_name);
- if(err_count)
- new_log_file_name += misc_utils::get_time_str_v2(tm) + "(" + boost::lexical_cast<std::string>(err_count) + ")" + ".log";
- else
- new_log_file_name += misc_utils::get_time_str_v2(tm) + ".log";
-
- err_count++;
- }while(boost::filesystem::exists(m_default_log_path + "/" + new_log_file_name, ec));
-
- std::string new_log_file_path = m_default_log_path + "/" + new_log_file_name;
- boost::filesystem::rename(m_default_log_path + "/" + log_file_name, new_log_file_path, ec);
- if(ec)
- {
- std::cout << "Filed to rename, ec = " << ec.message() << std::endl;
- }
-
- if(m_log_rotate_cmd.size())
- {
-
- std::string m_log_rotate_cmd_local_copy = m_log_rotate_cmd;
- //boost::replace_all(m_log_rotate_cmd, "[*SOURCE*]", new_log_file_path);
- boost::replace_all(m_log_rotate_cmd_local_copy, "[*TARGET*]", new_log_file_path);
-
- misc_utils::call_sys_cmd(m_log_rotate_cmd_local_copy);
- }
-
- m_target_file_stream->open( (m_default_log_path + "/" + log_file_name).c_str(), std::ios_base::out | std::ios::app /*ios_base::trunc */);
- if(m_target_file_stream->fail())
- return false;
- }
- }
-
- return true;
- }
- int get_type(){return LOGGER_FILE;}
- };
- /************************************************************************/
- /* */
- /************************************************************************/
- class log_stream_splitter
- {
- public:
- typedef std::list<std::pair<ibase_log_stream*, int> > streams_container;
-
- log_stream_splitter(){}
- ~log_stream_splitter()
- {
- //free pointers
- std::for_each(m_log_streams.begin(), m_log_streams.end(), delete_ptr());
- }
-
- bool set_max_logfile_size(uint64_t max_size)
- {
- for(streams_container::iterator it = m_log_streams.begin(); it!=m_log_streams.end();it++)
- it->first->set_max_logfile_size(max_size);
- return true;
- }
-
- bool set_log_rotate_cmd(const std::string& cmd)
- {
- for(streams_container::iterator it = m_log_streams.begin(); it!=m_log_streams.end();it++)
- it->first->set_log_rotate_cmd(cmd);
- return true;
- }
-
- bool do_log_message(const std::string& rlog_mes, int log_level, int color, const char* plog_name = NULL)
- {
- std::string str_mess = rlog_mes;
- size_t str_len = str_mess.size();
- const char* pstr = str_mess.c_str();
- for(streams_container::iterator it = m_log_streams.begin(); it!=m_log_streams.end();it++)
- if(it->second >= log_level)
- it->first->out_buffer(pstr, (int)str_len, log_level, color, plog_name);
- return true;
- }
-
- bool add_logger( int type, const char* pdefault_file_name, const char* pdefault_log_folder, int log_level_limit = LOG_LEVEL_4 )
- {
- ibase_log_stream* ls = NULL;
-
- switch( type )
- {
- case LOGGER_FILE:
- ls = new file_output_stream( pdefault_file_name, pdefault_log_folder );
- break;
-
- case LOGGER_DEBUGGER:
-#ifdef _MSC_VER
- ls = new debug_output_stream( );
-#else
- return false;//not implemented yet
-#endif
- break;
- case LOGGER_CONSOLE:
- ls = new console_output_stream( );
- break;
- }
-
- if ( ls ) {
- m_log_streams.push_back(streams_container::value_type(ls, log_level_limit));
- return true;
- }
- return ls ? true:false;
- }
- bool add_logger( ibase_log_stream* pstream, int log_level_limit = LOG_LEVEL_4 )
- {
- m_log_streams.push_back(streams_container::value_type(pstream, log_level_limit) );
- return true;
- }
-
- bool remove_logger(int type)
- {
- streams_container::iterator it = m_log_streams.begin();
- for(;it!=m_log_streams.end(); it++)
- {
- if(it->first->get_type() == type)
- {
- delete it->first;
- m_log_streams.erase(it);
- return true;
- }
- }
- return false;
-
- }
-
- protected:
- private:
-
- streams_container m_log_streams;
- };
-
- /************************************************************************/
- /* */
- /************************************************************************/
- inline int get_set_log_detalisation_level(bool is_need_set = false, int log_level_to_set = LOG_LEVEL_1);
- inline int get_set_time_level(bool is_need_set = false, int time_log_level = LOG_LEVEL_0);
- inline bool get_set_need_thread_id(bool is_need_set = false, bool is_need_val = false);
- inline bool get_set_need_proc_name(bool is_need_set = false, bool is_need_val = false);
-
-
- inline std::string get_daytime_string2()
- {
- boost::posix_time::ptime p = boost::posix_time::microsec_clock::local_time();
- return misc_utils::get_time_str_v3(p);
- }
- inline std::string get_day_time_string()
- {
- return get_daytime_string2();
- //time_t tm = 0;
- //time(&tm);
- //return misc_utils::get_time_str(tm);
- }
-
- inline std::string get_time_string()
- {
- return get_daytime_string2();
-
- }
-#ifdef _MSC_VER
- inline std::string get_time_string_adv(SYSTEMTIME* pst = NULL)
- {
- SYSTEMTIME st = {0};
- if(!pst)
- {
- pst = &st;
- GetSystemTime(&st);
- }
- std::stringstream str_str;
- str_str.fill('0');
- str_str << std::setw(2) << pst->wHour << "_"
- << std::setw(2) << pst->wMinute << "_"
- << std::setw(2) << pst->wSecond << "_"
- << std::setw(3) << pst->wMilliseconds;
- return str_str.str();
- }
-#endif
-
-
-
-
-
- class logger
- {
- public:
- friend class log_singletone;
-
- logger()
- {
- CRITICAL_REGION_BEGIN(m_critical_sec);
- init();
- CRITICAL_REGION_END();
- }
- ~logger()
- {
- }
-
- bool set_max_logfile_size(uint64_t max_size)
- {
- CRITICAL_REGION_BEGIN(m_critical_sec);
- m_log_target.set_max_logfile_size(max_size);
- CRITICAL_REGION_END();
- return true;
- }
-
- bool set_log_rotate_cmd(const std::string& cmd)
- {
- CRITICAL_REGION_BEGIN(m_critical_sec);
- m_log_target.set_log_rotate_cmd(cmd);
- CRITICAL_REGION_END();
- return true;
- }
-
- bool take_away_journal(std::list<std::string>& journal)
- {
- CRITICAL_REGION_BEGIN(m_critical_sec);
- m_journal.swap(journal);
- CRITICAL_REGION_END();
- return true;
- }
-
- bool do_log_message(const std::string& rlog_mes, int log_level, int color, bool add_to_journal = false, const char* plog_name = NULL)
- {
- CRITICAL_REGION_BEGIN(m_critical_sec);
- m_log_target.do_log_message(rlog_mes, log_level, color, plog_name);
- if(add_to_journal)
- m_journal.push_back(rlog_mes);
-
- return true;
- CRITICAL_REGION_END();
- }
-
- bool add_logger( int type, const char* pdefault_file_name, const char* pdefault_log_folder , int log_level_limit = LOG_LEVEL_4)
- {
- CRITICAL_REGION_BEGIN(m_critical_sec);
- return m_log_target.add_logger( type, pdefault_file_name, pdefault_log_folder, log_level_limit);
- CRITICAL_REGION_END();
- }
- bool add_logger( ibase_log_stream* pstream, int log_level_limit = LOG_LEVEL_4)
- {
- CRITICAL_REGION_BEGIN(m_critical_sec);
- return m_log_target.add_logger(pstream, log_level_limit);
- CRITICAL_REGION_END();
- }
-
- bool remove_logger(int type)
- {
- CRITICAL_REGION_BEGIN(m_critical_sec);
- return m_log_target.remove_logger(type);
- CRITICAL_REGION_END();
- }
-
-
- bool set_thread_prefix(const std::string& prefix)
- {
- CRITICAL_REGION_BEGIN(m_critical_sec);
- m_thr_prefix_strings[misc_utils::get_thread_string_id()] = prefix;
- CRITICAL_REGION_END();
- return true;
- }
-
-
- std::string get_default_log_file()
- {
- return m_default_log_file;
- }
-
- std::string get_default_log_folder()
- {
- return m_default_log_folder;
- }
-
- protected:
- private:
- bool init()
- {
- //
-
- m_process_name = string_tools::get_current_module_name();
-
- init_log_path_by_default();
-
- //init default set of loggers
- init_default_loggers();
-
- std::stringstream ss;
- ss << get_time_string() << " Init logging. Level=" << get_set_log_detalisation_level()
- << " Log path=" << m_default_log_folder << std::endl;
- this->do_log_message(ss.str(), console_color_white, LOG_LEVEL_0);
- return true;
- }
- bool init_default_loggers()
- {
- //TODO:
- return true;
- }
-
- bool init_log_path_by_default()
- {
- //load process name
- m_default_log_folder = string_tools::get_current_module_folder();
-
- m_default_log_file = m_process_name;
- std::string::size_type a = m_default_log_file.rfind('.');
- if ( a != std::string::npos )
- m_default_log_file.erase( a, m_default_log_file.size());
- if ( ! m_default_log_file.empty() )
- m_default_log_file += ".log";
-
- return true;
- }
-
- log_stream_splitter m_log_target;
-
- std::string m_default_log_folder;
- std::string m_default_log_file;
- std::string m_process_name;
- std::map<std::string, std::string> m_thr_prefix_strings;
- std::list<std::string> m_journal;
- critical_section m_critical_sec;
- };
- /************************************************************************/
- /* */
- /************************************************************************/
- class log_singletone
- {
- public:
- friend class initializer<log_singletone>;
- friend class logger;
- static int get_log_detalisation_level()
- {
- get_or_create_instance();//to initialize logger, if it not initialized
- return get_set_log_detalisation_level();
- }
-
- static bool is_filter_error(int error_code)
- {
- return false;
- }
-
-
- static bool do_log_message(const std::string& rlog_mes, int log_level, int color, bool keep_in_journal, const char* plog_name = NULL)
- {
- logger* plogger = get_or_create_instance();
- bool res = false;
- if(plogger)
- res = plogger->do_log_message(rlog_mes, log_level, color, keep_in_journal, plog_name);
- else
- { //globally uninitialized, create new logger for each call of do_log_message() and then delete it
- plogger = new logger();
- //TODO: some extra initialization
- res = plogger->do_log_message(rlog_mes, log_level, color, keep_in_journal, plog_name);
- delete plogger;
- plogger = NULL;
- }
- return res;
- }
-
- static bool take_away_journal(std::list<std::string>& journal)
- {
- logger* plogger = get_or_create_instance();
- bool res = false;
- if(plogger)
- res = plogger->take_away_journal(journal);
-
- return res;
- }
-
- static bool set_max_logfile_size(uint64_t file_size)
- {
- logger* plogger = get_or_create_instance();
- if(!plogger) return false;
- return plogger->set_max_logfile_size(file_size);
- }
-
-
- static bool set_log_rotate_cmd(const std::string& cmd)
- {
- logger* plogger = get_or_create_instance();
- if(!plogger) return false;
- return plogger->set_log_rotate_cmd(cmd);
- }
-
-
- static bool add_logger( int type, const char* pdefault_file_name, const char* pdefault_log_folder, int log_level_limit = LOG_LEVEL_4)
- {
- logger* plogger = get_or_create_instance();
- if(!plogger) return false;
- return plogger->add_logger(type, pdefault_file_name, pdefault_log_folder, log_level_limit);
- }
-
- static std::string get_default_log_file()
- {
- logger* plogger = get_or_create_instance();
- if(plogger)
- return plogger->get_default_log_file();
-
- return "";
- }
-
- static std::string get_default_log_folder()
- {
- logger* plogger = get_or_create_instance();
- if(plogger)
- return plogger->get_default_log_folder();
-
- return "";
- }
-
- static bool add_logger( ibase_log_stream* pstream, int log_level_limit = LOG_LEVEL_4 )
- {
- logger* plogger = get_or_create_instance();
- if(!plogger) return false;
- return plogger->add_logger(pstream, log_level_limit);
- }
-
-
- static bool remove_logger( int type )
- {
- logger* plogger = get_or_create_instance();
- if(!plogger) return false;
- return plogger->remove_logger(type);
- }
-PUSH_WARNINGS
-DISABLE_GCC_WARNING(maybe-uninitialized)
- static int get_set_log_detalisation_level(bool is_need_set = false, int log_level_to_set = LOG_LEVEL_1)
- {
- static int log_detalisation_level = LOG_LEVEL_1;
- if(is_need_set)
- log_detalisation_level = log_level_to_set;
- return log_detalisation_level;
- }
-POP_WARNINGS
- static int get_set_time_level(bool is_need_set = false, int time_log_level = LOG_LEVEL_0)
- {
- static int val_time_log_level = LOG_LEVEL_0;
- if(is_need_set)
- val_time_log_level = time_log_level;
-
- return val_time_log_level;
- }
-
- static int get_set_process_level(bool is_need_set = false, int process_log_level = LOG_LEVEL_0)
- {
- static int val_process_log_level = LOG_LEVEL_0;
- if(is_need_set)
- val_process_log_level = process_log_level;
-
- return val_process_log_level;
- }
-
- /*static int get_set_tid_level(bool is_need_set = false, int tid_log_level = LOG_LEVEL_0)
- {
- static int val_tid_log_level = LOG_LEVEL_0;
- if(is_need_set)
- val_tid_log_level = tid_log_level;
-
- return val_tid_log_level;
- }*/
-
- static bool get_set_need_thread_id(bool is_need_set = false, bool is_need_val = false)
- {
- static bool is_need = false;
- if(is_need_set)
- is_need = is_need_val;
-
- return is_need;
- }
-
- static bool get_set_need_proc_name(bool is_need_set = false, bool is_need_val = false)
- {
- static bool is_need = true;
- if(is_need_set)
- is_need = is_need_val;
-
- return is_need;
- }
- static uint64_t get_set_err_count(bool is_need_set = false, uint64_t err_val = false)
- {
- static uint64_t err_count = 0;
- if(is_need_set)
- err_count = err_val;
-
- return err_count;
- }
-
-
-#ifdef _MSC_VER
-
-
- static void SetThreadName( DWORD dwThreadID, const char* threadName)
- {
-#define MS_VC_EXCEPTION 0x406D1388
-
-#pragma pack(push,8)
- typedef struct tagTHREADNAME_INFO
- {
- DWORD dwType; // Must be 0x1000.
- LPCSTR szName; // Pointer to name (in user addr space).
- DWORD dwThreadID; // Thread ID (-1=caller thread).
- DWORD dwFlags; // Reserved for future use, must be zero.
- } THREADNAME_INFO;
-#pragma pack(pop)
-
-
-
- Sleep(10);
- THREADNAME_INFO info;
- info.dwType = 0x1000;
- info.szName = (char*)threadName;
- info.dwThreadID = dwThreadID;
- info.dwFlags = 0;
-
- __try
- {
- RaiseException( MS_VC_EXCEPTION, 0, sizeof(info)/sizeof(ULONG_PTR), (ULONG_PTR*)&info );
- }
- __except(EXCEPTION_EXECUTE_HANDLER)
- {
- }
- }
-#endif
-
- static bool set_thread_log_prefix(const std::string& prefix)
- {
-#ifdef _MSC_VER
- SetThreadName(-1, prefix.c_str());
-#endif
-
-
- logger* plogger = get_or_create_instance();
- if(!plogger) return false;
- return plogger->set_thread_prefix(prefix);
- }
-
-
- static std::string get_prefix_entry()
- {
- std::stringstream str_prefix;
- //write time entry
- if ( get_set_time_level() <= get_set_log_detalisation_level() )
- str_prefix << get_day_time_string() << " ";
-
- //write process info
- logger* plogger = get_or_create_instance();
- //bool res = false;
- if(!plogger)
- { //globally uninitialized, create new logger for each call of get_prefix_entry() and then delete it
- plogger = new logger();
- }
-
- //if ( get_set_need_proc_name() && get_set_process_level() <= get_set_log_detalisation_level() )
- // str_prefix << "[" << plogger->m_process_name << " (id=" << GetCurrentProcessId() << ")] ";
-//#ifdef _MSC_VER_EX
- if ( get_set_need_thread_id() /*&& get_set_tid_level() <= get_set_log_detalisation_level()*/ )
- str_prefix << "tid:" << misc_utils::get_thread_string_id() << " ";
-//#endif
-
- if(plogger->m_thr_prefix_strings.size())
- {
- CRITICAL_REGION_LOCAL(plogger->m_critical_sec);
- std::string thr_str = misc_utils::get_thread_string_id();
- std::map<std::string, std::string>::iterator it = plogger->m_thr_prefix_strings.find(thr_str);
- if(it!=plogger->m_thr_prefix_strings.end())
- {
- str_prefix << it->second;
- }
- }
-
-
- if(get_set_is_uninitialized())
- delete plogger;
-
- return str_prefix.str();
- }
-
- private:
- log_singletone(){}//restric to create an instance
- //static initializer<log_singletone> m_log_initializer;//must be in one .cpp file (for example main.cpp) via DEFINE_LOGGING macro
-
- static bool init()
- {
- return true;/*do nothing here*/
- }
- static bool un_init()
- {
- //delete object
- logger* plogger = get_set_instance_internal();
- if(plogger) delete plogger;
- //set uninitialized
- get_set_is_uninitialized(true, true);
- get_set_instance_internal(true, NULL);
- return true;
- }
-
- static logger* get_or_create_instance()
- {
- logger* plogger = get_set_instance_internal();
- if(!plogger)
- if(!get_set_is_uninitialized())
- get_set_instance_internal(true, plogger = new logger);
-
- return plogger;
- }
-
- static logger* get_set_instance_internal(bool is_need_set = false, logger* pnew_logger_val = NULL)
- {
- static logger* val_plogger = NULL;
-
- if(is_need_set)
- val_plogger = pnew_logger_val;
-
- return val_plogger;
- }
-
- static bool get_set_is_uninitialized(bool is_need_set = false, bool is_uninitialized = false)
- {
- static bool val_is_uninitialized = false;
-
- if(is_need_set)
- val_is_uninitialized = is_uninitialized;
-
- return val_is_uninitialized;
- }
- //static int get_set_error_filter(bool is_need_set = false)
- };
-
- const static initializer<log_singletone> log_initializer;
- /************************************************************************/
- /* */
-// /************************************************************************/
-// class log_array_value
-// {
-// int num;
-// log_message& m_ref_log_mes;
-//
-// public:
-//
-// log_array_value( log_message& log_mes ) : num(0), m_ref_log_mes(log_mes) {}
-//
-// void operator ( )( ibase_log_value *val ) {
-// m_ref_log_mes << "\n[" << num++ << "] "/* << val*/; }
-//
-//
-// template<class T>
-// void operator ()(T &value )
-// {
-// m_ref_log_mes << "\n[" << num++ << "] " << value;
-// }
-// };
-
- class log_frame
- {
- std::string m_name;
- int m_level;
- const char* m_plog_name;
- public:
-
- log_frame(const std::string& name, int dlevel = LOG_LEVEL_2 , const char* plog_name = NULL)
- {
-#ifdef _MSC_VER
- int lasterr=::GetLastError();
-#endif
- m_plog_name = plog_name;
- if ( dlevel <= log_singletone::get_log_detalisation_level() )
- {
- m_name = name;
- std::stringstream ss;
- ss << log_space::log_singletone::get_prefix_entry() << "-->>" << m_name << std::endl;
- log_singletone::do_log_message(ss.str(), dlevel, console_color_default, false, m_plog_name);
- }
- m_level = dlevel;
-#ifdef _MSC_VER
- ::SetLastError(lasterr);
-#endif
- }
- ~log_frame()
- {
-#ifdef _MSC_VER
- int lasterr=::GetLastError();
-#endif
-
- if (m_level <= log_singletone::get_log_detalisation_level() )
- {
- std::stringstream ss;
- ss << log_space::log_singletone::get_prefix_entry() << "<<--" << m_name << std::endl;
- log_singletone::do_log_message(ss.str(), m_level, console_color_default, false,m_plog_name);
- }
-#ifdef _MSC_VER
- ::SetLastError(lasterr);
-#endif
- }
- };
-
- inline int get_set_time_level(bool is_need_set, int time_log_level)
- {
- return log_singletone::get_set_time_level(is_need_set, time_log_level);
- }
- inline int get_set_log_detalisation_level(bool is_need_set, int log_level_to_set)
- {
- return log_singletone::get_set_log_detalisation_level(is_need_set, log_level_to_set);
- }
- inline std::string get_prefix_entry()
- {
- return log_singletone::get_prefix_entry();
- }
- inline bool get_set_need_thread_id(bool is_need_set, bool is_need_val)
- {
- return log_singletone::get_set_need_thread_id(is_need_set, is_need_val);
- }
- inline bool get_set_need_proc_name(bool is_need_set, bool is_need_val )
- {
- return log_singletone::get_set_need_proc_name(is_need_set, is_need_val);
- }
-
- inline std::string get_win32_err_descr(int err_no)
- {
-#ifdef _MSC_VER
- LPVOID lpMsgBuf;
-
- FormatMessageA(
- FORMAT_MESSAGE_ALLOCATE_BUFFER |
- FORMAT_MESSAGE_FROM_SYSTEM,
- NULL,
- err_no,
- MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
- (char*) &lpMsgBuf,
- 0, NULL );
-
- std::string fix_sys_message = "(null)";
- if(lpMsgBuf) fix_sys_message = (char*)lpMsgBuf;
- std::string::size_type a;
- if ( (a = fix_sys_message.rfind( '\n' )) != std::string::npos )
- fix_sys_message.erase(a);
- if ( (a = fix_sys_message.rfind( '\r' )) != std::string::npos )
- fix_sys_message.erase(a);
-
- LocalFree(lpMsgBuf);
- return fix_sys_message;
-#else
- return "Not implemented yet";
-#endif
- }
-
- inline bool getwin32_err_text(std::stringstream& ref_message, int error_no)
- {
- ref_message << "win32 error:" << get_win32_err_descr(error_no);
- return true;
- }
-}
-#if defined(_DEBUG) || defined(__GNUC__)
- #define ENABLE_LOGGING_INTERNAL
-#endif
-#if defined(ENABLE_RELEASE_LOGGING)
- #define ENABLE_LOGGING_INTERNAL
-#endif
-
-
-#if defined(ENABLE_LOGGING_INTERNAL)
-
-#define LOG_PRINT_NO_PREFIX2(log_name, x, y) do {if ( y <= epee::log_space::log_singletone::get_log_detalisation_level() )\
- {std::stringstream ss________; ss________ << x << std::endl; epee::log_space::log_singletone::do_log_message(ss________.str() , y, epee::log_space::console_color_default, false, log_name);}} while(0)
-
-#define LOG_PRINT_NO_PREFIX_NO_POSTFIX2(log_name, x, y) do {if ( y <= epee::log_space::log_singletone::get_log_detalisation_level() )\
- {std::stringstream ss________; ss________ << x; epee::log_space::log_singletone::do_log_message(ss________.str(), y, epee::log_space::console_color_default, false, log_name);}} while(0)
-
-
-#define LOG_PRINT_NO_POSTFIX2(log_name, x, y) do {if ( y <= epee::log_space::log_singletone::get_log_detalisation_level() )\
- {std::stringstream ss________; ss________ << epee::log_space::log_singletone::get_prefix_entry() << x; epee::log_space::log_singletone::do_log_message(ss________.str(), y, epee::log_space::console_color_default, false, log_name);}} while(0)
-
-
-#define LOG_PRINT2(log_name, x, y) do {if ( y <= epee::log_space::log_singletone::get_log_detalisation_level() )\
- {std::stringstream ss________; ss________ << epee::log_space::log_singletone::get_prefix_entry() << x << std::endl;epee::log_space::log_singletone::do_log_message(ss________.str(), y, epee::log_space::console_color_default, false, log_name);}} while(0)
-
-#define LOG_PRINT_COLOR2(log_name, x, y, color) do {if ( y <= epee::log_space::log_singletone::get_log_detalisation_level() )\
- {std::stringstream ss________; ss________ << epee::log_space::log_singletone::get_prefix_entry() << x << std::endl;epee::log_space::log_singletone::do_log_message(ss________.str(), y, color, false, log_name);}} while(0)
-
-
-#define LOG_PRINT2_JORNAL(log_name, x, y) do {if ( y <= epee::log_space::log_singletone::get_log_detalisation_level() )\
- {std::stringstream ss________; ss________ << epee::log_space::log_singletone::get_prefix_entry() << x << std::endl;epee::log_space::log_singletone::do_log_message(ss________.str(), y, epee::log_space::console_color_default, true, log_name);}} while(0)
-
-
-#define LOG_ERROR2(log_name, x) do { \
- std::stringstream ss________; ss________ << epee::log_space::log_singletone::get_prefix_entry() << "ERROR " << __FILE__ << ":" << __LINE__ << " " << x << std::endl; epee::log_space::log_singletone::do_log_message(ss________.str(), LOG_LEVEL_0, epee::log_space::console_color_red, true, log_name);LOCAL_ASSERT(0); epee::log_space::log_singletone::get_set_err_count(true, epee::log_space::log_singletone::get_set_err_count()+1);} while(0)
-
-#define LOG_FRAME2(log_name, x, y) epee::log_space::log_frame frame(x, y, log_name)
-
-#else
-
-
-#define LOG_PRINT_NO_PREFIX2(log_name, x, y) ((void)0)
-
-#define LOG_PRINT_NO_PREFIX_NO_POSTFIX2(log_name, x, y) ((void)0)
-
-#define LOG_PRINT_NO_POSTFIX2(log_name, x, y) ((void)0)
-#define LOG_PRINT_COLOR2(log_name, x, y, color) ((void)0)
-
-#define LOG_PRINT2_JORNAL(log_name, x, y) ((void)0)
-
-#define LOG_PRINT2(log_name, x, y) ((void)0)
-
-#define LOG_ERROR2(log_name, x) ((void)0)
-
-
-#define LOG_FRAME2(log_name, x, y) ((void)0)
-
-
-#endif
-
-
-#ifndef LOG_DEFAULT_TARGET
- #define LOG_DEFAULT_TARGET NULL
-#endif
-
-
-#define LOG_PRINT_NO_POSTFIX(mess, level) LOG_PRINT_NO_POSTFIX2(LOG_DEFAULT_TARGET, mess, level)
-#define LOG_PRINT_NO_PREFIX(mess, level) LOG_PRINT_NO_PREFIX2(LOG_DEFAULT_TARGET, mess, level)
-#define LOG_PRINT_NO_PREFIX_NO_POSTFIX(mess, level) LOG_PRINT_NO_PREFIX_NO_POSTFIX2(LOG_DEFAULT_TARGET, mess, level)
-#define LOG_PRINT(mess, level) LOG_PRINT2(LOG_DEFAULT_TARGET, mess, level)
-
-#define LOG_PRINT_COLOR(mess, level, color) LOG_PRINT_COLOR2(LOG_DEFAULT_TARGET, mess, level, color)
-#define LOG_PRINT_RED(mess, level) LOG_PRINT_COLOR2(LOG_DEFAULT_TARGET, mess, level, epee::log_space::console_color_red)
-#define LOG_PRINT_GREEN(mess, level) LOG_PRINT_COLOR2(LOG_DEFAULT_TARGET, mess, level, epee::log_space::console_color_green)
-#define LOG_PRINT_BLUE(mess, level) LOG_PRINT_COLOR2(LOG_DEFAULT_TARGET, mess, level, epee::log_space::console_color_blue)
-#define LOG_PRINT_YELLOW(mess, level) LOG_PRINT_COLOR2(LOG_DEFAULT_TARGET, mess, level, epee::log_space::console_color_yellow)
-#define LOG_PRINT_CYAN(mess, level) LOG_PRINT_COLOR2(LOG_DEFAULT_TARGET, mess, level, epee::log_space::console_color_cyan)
-#define LOG_PRINT_MAGENTA(mess, level) LOG_PRINT_COLOR2(LOG_DEFAULT_TARGET, mess, level, epee::log_space::console_color_magenta)
-
-#define LOG_PRINT_RED_L0(mess) LOG_PRINT_COLOR2(LOG_DEFAULT_TARGET, mess, LOG_LEVEL_0, epee::log_space::console_color_red)
-#define LOG_PRINT_RED_L1(mess) LOG_PRINT_COLOR2(LOG_DEFAULT_TARGET, mess, LOG_LEVEL_1, epee::log_space::console_color_red)
-
-#define LOG_PRINT_L0(mess) LOG_PRINT(mess, LOG_LEVEL_0)
-#define LOG_PRINT_L1(mess) LOG_PRINT(mess, LOG_LEVEL_1)
-#define LOG_PRINT_L2(mess) LOG_PRINT(mess, LOG_LEVEL_2)
-#define LOG_PRINT_L3(mess) LOG_PRINT(mess, LOG_LEVEL_3)
-#define LOG_PRINT_L4(mess) LOG_PRINT(mess, LOG_LEVEL_4)
-#define LOG_PRINT_J(mess, level) LOG_PRINT2_JORNAL(LOG_DEFAULT_TARGET, mess, level)
-
-#define LOG_ERROR(mess) LOG_ERROR2(LOG_DEFAULT_TARGET, mess)
-#define LOG_FRAME(mess, level) LOG_FRAME2(LOG_DEFAULT_TARGET, mess, level)
-#define LOG_VALUE(mess, level) LOG_VALUE2(LOG_DEFAULT_TARGET, mess, level)
-#define LOG_ARRAY(mess, level) LOG_ARRAY2(LOG_DEFAULT_TARGET, mess, level)
-//#define LOGWIN_PLATFORM_ERROR(err_no) LOGWINDWOS_PLATFORM_ERROR2(LOG_DEFAULT_TARGET, err_no)
-#define LOG_SOCKET_ERROR(err_no) LOG_SOCKET_ERROR2(LOG_DEFAULT_TARGET, err_no)
-//#define LOGWIN_PLATFORM_ERROR_UNCRITICAL(mess) LOGWINDWOS_PLATFORM_ERROR_UNCRITICAL2(LOG_DEFAULT_TARGET, mess)
#define ENDL std::endl
@@ -1435,8 +178,6 @@ POP_WARNINGS
#define CHECK_AND_ASSERT(expr, fail_ret_val) do{if(!(expr)){LOCAL_ASSERT(expr); return fail_ret_val;};}while(0)
#endif
-#define NOTHING
-
#ifndef CHECK_AND_ASSERT_MES
#define CHECK_AND_ASSERT_MES(expr, fail_ret_val, message) do{if(!(expr)) {LOG_ERROR(message); return fail_ret_val;};}while(0)
#endif
@@ -1463,5 +204,21 @@ POP_WARNINGS
#define CHECK_AND_ASSERT_MES2(expr, message) do{if(!(expr)) {LOG_ERROR(message); };}while(0)
#endif
+enum console_colors
+{
+ console_color_default,
+ console_color_white,
+ console_color_red,
+ console_color_green,
+ console_color_blue,
+ console_color_cyan,
+ console_color_magenta,
+ console_color_yellow
+};
+
+bool is_stdout_a_tty();
+void set_console_color(int color, bool bright);
+void reset_console_color();
+
}
#endif //_MISC_LOG_EX_H_
diff --git a/contrib/epee/include/net/abstract_tcp_server.h b/contrib/epee/include/net/abstract_tcp_server.h
index c74444c8e..1efd5091c 100644
--- a/contrib/epee/include/net/abstract_tcp_server.h
+++ b/contrib/epee/include/net/abstract_tcp_server.h
@@ -38,6 +38,9 @@
#pragma comment(lib, "Ws2_32.lib")
+#undef MONERO_DEFAULT_LOG_CATEGORY
+#define MONERO_DEFAULT_LOG_CATEGORY "net"
+
namespace epee
{
namespace net_utils
diff --git a/contrib/epee/include/net/abstract_tcp_server2.h b/contrib/epee/include/net/abstract_tcp_server2.h
index f0a1ddd7c..506949dbd 100644
--- a/contrib/epee/include/net/abstract_tcp_server2.h
+++ b/contrib/epee/include/net/abstract_tcp_server2.h
@@ -55,9 +55,11 @@
#include "net_utils_base.h"
#include "syncobj.h"
#include "../../../../src/p2p/connection_basic.hpp"
-#include "../../../../contrib/otshell_utils/utils.hpp"
#include "../../../../src/p2p/network_throttle-detail.hpp"
+#undef MONERO_DEFAULT_LOG_CATEGORY
+#define MONERO_DEFAULT_LOG_CATEGORY "net"
+
#define ABSTRACT_SERVER_SEND_QUE_MAX_COUNT 1000
namespace epee
diff --git a/contrib/epee/include/net/abstract_tcp_server2.inl b/contrib/epee/include/net/abstract_tcp_server2.inl
index 834b5a7a6..75a9c5be9 100644
--- a/contrib/epee/include/net/abstract_tcp_server2.inl
+++ b/contrib/epee/include/net/abstract_tcp_server2.inl
@@ -51,9 +51,8 @@
#include "../../../../src/cryptonote_core/cryptonote_core.h" // e.g. for the send_stop_signal()
-#include "../../../../contrib/otshell_utils/utils.hpp"
-#include "../../../../src/p2p/data_logger.hpp"
-using namespace nOT::nUtils; // TODO
+#undef MONERO_DEFAULT_LOG_CATEGORY
+#define MONERO_DEFAULT_LOG_CATEGORY "net"
#define CONNECTION_CLEANUP_TIME 30 // seconds
@@ -83,7 +82,7 @@ PRAGMA_WARNING_DISABLE_VS(4355)
m_throttle_speed_in("speed_in", "throttle_speed_in"),
m_throttle_speed_out("speed_out", "throttle_speed_out")
{
- _info_c("net/sleepRPC", "test, connection constructor set m_connection_type="<<m_connection_type);
+ MINFO("test, connection constructor set m_connection_type="<<m_connection_type);
}
PRAGMA_WARNING_DISABLE_VS(4355)
//---------------------------------------------------------------------------------
@@ -229,7 +228,7 @@ PRAGMA_WARNING_DISABLE_VS(4355)
{
TRY_ENTRY();
boost::shared_ptr<connection<t_protocol_handler> > back_connection_copy;
- LOG_PRINT_L4("[sock " << socket_.native_handle() << "] release");
+ LOG_TRACE_CC(context, "[sock " << socket_.native_handle() << "] release");
CRITICAL_REGION_BEGIN(m_self_refs_lock);
CHECK_AND_ASSERT_MES(m_self_refs.size(), false, "[sock " << socket_.native_handle() << "] m_self_refs empty at connection<t_protocol_handler>::release() call");
//erasing from container without additional copy can cause start deleting object, including m_self_refs
@@ -266,8 +265,7 @@ PRAGMA_WARNING_DISABLE_VS(4355)
address = endpoint.address().to_string();
port = boost::lexical_cast<std::string>(endpoint.port());
}
- _mark_c("net/kind" ,
- " connection type " << to_string( m_connection_type ) << " "
+ MINFO(" connection type " << to_string( m_connection_type ) << " "
<< socket_.local_endpoint().address().to_string() << ":" << socket_.local_endpoint().port()
<< " <--> " << address << ":" << port);
}
@@ -306,7 +304,6 @@ PRAGMA_WARNING_DISABLE_VS(4355)
delay *= 0.5;
if (delay > 0) {
long int ms = (long int)(delay * 100);
- epee::net_utils::data_logger::get_instance().add_data("sleep_down", ms);
boost::this_thread::sleep_for(boost::chrono::milliseconds(ms));
}
} while(delay > 0);
@@ -397,14 +394,14 @@ PRAGMA_WARNING_DISABLE_VS(4355)
const t_safe chunksize_max = chunksize_good * 2 ;
const bool allow_split = (m_connection_type == e_connection_type_RPC) ? false : true; // do not split RPC data
- ASRT(! (chunksize_max<0) ); // make sure it is unsigned before removin sign with cast:
+ CHECK_AND_ASSERT_MES(! (chunksize_max<0), false, "Negative chunksize_max" ); // make sure it is unsigned before removin sign with cast:
long long unsigned int chunksize_max_unsigned = static_cast<long long unsigned int>( chunksize_max ) ;
if (allow_split && (cb > chunksize_max_unsigned)) {
{ // LOCK: chunking
epee::critical_region_t<decltype(m_chunking_lock)> send_guard(m_chunking_lock); // *** critical ***
- _dbg3_c("net/out/size", "do_send() will SPLIT into small chunks, from packet="<<cb<<" B for ptr="<<ptr);
+ MDEBUG("do_send() will SPLIT into small chunks, from packet="<<cb<<" B for ptr="<<ptr);
t_safe all = cb; // all bytes to send
t_safe pos = 0; // current sending position
// 01234567890
@@ -419,39 +416,39 @@ PRAGMA_WARNING_DISABLE_VS(4355)
while (pos < all) {
t_safe lenall = all-pos; // length from here to end
t_safe len = std::min( chunksize_good , lenall); // take a smaller part
- ASRT(len<=chunksize_good);
+ CHECK_AND_ASSERT_MES(len<=chunksize_good, false, "len too large");
// pos=8; len=4; all=10; len=3;
- ASRT(! (len<0) ); // check before we cast away sign:
+ CHECK_AND_ASSERT_MES(! (len<0), false, "negative len"); // check before we cast away sign:
unsigned long long int len_unsigned = static_cast<long long int>( len );
- ASRT(len>0); // (redundand)
- ASRT(len_unsigned < std::numeric_limits<size_t>::max()); // yeap we want strong < then max size, to be sure
+ CHECK_AND_ASSERT_MES(len>0, false, "len not strictly positive"); // (redundant)
+ CHECK_AND_ASSERT_MES(len_unsigned < std::numeric_limits<size_t>::max(), false, "Invalid len_unsigned"); // yeap we want strong < then max size, to be sure
void *chunk_start = ((char*)ptr) + pos;
- _fact_c("net/out/size","chunk_start="<<chunk_start<<" ptr="<<ptr<<" pos="<<pos);
- ASRT(chunk_start >= ptr); // not wrapped around address?
+ MDEBUG("chunk_start="<<chunk_start<<" ptr="<<ptr<<" pos="<<pos);
+ CHECK_AND_ASSERT_MES(chunk_start >= ptr, false, "Pointer wraparound"); // not wrapped around address?
//std::memcpy( (void*)buf, chunk_start, len);
- _dbg3_c("net/out/size", "part of " << lenall << ": pos="<<pos << " len="<<len);
+ MDEBUG("part of " << lenall << ": pos="<<pos << " len="<<len);
bool ok = do_send_chunk(chunk_start, len); // <====== ***
all_ok = all_ok && ok;
if (!all_ok) {
- _dbg1_c("net/out/size", "do_send() DONE ***FAILED*** from packet="<<cb<<" B for ptr="<<ptr);
- _dbg1("do_send() SEND was aborted in middle of big package - this is mostly harmless "
+ MDEBUG("do_send() DONE ***FAILED*** from packet="<<cb<<" B for ptr="<<ptr);
+ MDEBUG("do_send() SEND was aborted in middle of big package - this is mostly harmless "
<< " (e.g. peer closed connection) but if it causes trouble tell us at #monero-dev. " << cb);
return false; // partial failure in sending
}
- pos = pos+len; ASRT(pos >0);
+ pos = pos+len;
+ CHECK_AND_ASSERT_MES(pos >0, false, "pos <= 0");
// (in catch block, or uniq pointer) delete buf;
} // each chunk
- _dbg3_c("net/out/size", "do_send() DONE SPLIT from packet="<<cb<<" B for ptr="<<ptr);
- _dbg3 ( "do_send() DONE SPLIT from packet="<<cb<<" B for ptr="<<ptr);
+ MDEBUG("do_send() DONE SPLIT from packet="<<cb<<" B for ptr="<<ptr);
- _info_c("net/sleepRPC", "do_send() m_connection_type = " << m_connection_type);
+ MDEBUG("do_send() m_connection_type = " << m_connection_type);
return all_ok; // done - e.g. queued - all the chunks of current do_send call
} // LOCK: chunking
@@ -505,15 +502,14 @@ PRAGMA_WARNING_DISABLE_VS(4355)
}*/
long int ms = 250 + (rand()%50);
- _info_c("net/sleep", "Sleeping because QUEUE is FULL, in " << __FUNCTION__ << " for " << ms << " ms before packet_size="<<cb); // XXX debug sleep
+ MDEBUG("Sleeping because QUEUE is FULL, in " << __FUNCTION__ << " for " << ms << " ms before packet_size="<<cb); // XXX debug sleep
m_send_que_lock.unlock();
boost::this_thread::sleep(boost::posix_time::milliseconds( ms ) );
m_send_que_lock.lock();
_dbg1("sleep for queue: " << ms);
if (retry > retry_limit) {
- _erro("send que size is more than ABSTRACT_SERVER_SEND_QUE_MAX_COUNT(" << ABSTRACT_SERVER_SEND_QUE_MAX_COUNT << "), shutting down connection");
- // _dbg1_c("net/sleep", "send que size is more than ABSTRACT_SERVER_SEND_QUE_MAX_COUNT(" << ABSTRACT_SERVER_SEND_QUE_MAX_COUNT << "), shutting down connection");
+ MWARNING("send que size is more than ABSTRACT_SERVER_SEND_QUE_MAX_COUNT(" << ABSTRACT_SERVER_SEND_QUE_MAX_COUNT << "), shutting down connection");
shutdown();
return false;
}
@@ -525,10 +521,10 @@ PRAGMA_WARNING_DISABLE_VS(4355)
if(m_send_que.size() > 1)
{ // active operation should be in progress, nothing to do, just wait last operation callback
auto size_now = cb;
- _info_c("net/out/size", "do_send() NOW just queues: packet="<<size_now<<" B, is added to queue-size="<<m_send_que.size());
+ MDEBUG("do_send() NOW just queues: packet="<<size_now<<" B, is added to queue-size="<<m_send_que.size());
//do_send_handler_delayed( ptr , size_now ); // (((H))) // empty function
- LOG_PRINT_L4("[sock " << socket_.native_handle() << "] Async send requested " << m_send_que.front().size());
+ LOG_TRACE_CC(context, "[sock " << socket_.native_handle() << "] Async send requested " << m_send_que.front().size());
}
else
{ // no active operation
@@ -540,11 +536,11 @@ PRAGMA_WARNING_DISABLE_VS(4355)
}
auto size_now = m_send_que.front().size();
- _dbg1_c("net/out/size", "do_send() NOW SENSD: packet="<<size_now<<" B");
+ MDEBUG("do_send() NOW SENSD: packet="<<size_now<<" B");
if (speed_limit_is_enabled())
do_send_handler_write( ptr , size_now ); // (((H)))
- ASRT( size_now == m_send_que.front().size() );
+ CHECK_AND_ASSERT_MES( size_now == m_send_que.front().size(), false, "Unexpected queue size");
boost::asio::async_write(socket_, boost::asio::buffer(m_send_que.front().data(), size_now ) ,
//strand_.wrap(
boost::bind(&connection<t_protocol_handler>::handle_write, self, _1, _2)
@@ -602,7 +598,7 @@ PRAGMA_WARNING_DISABLE_VS(4355)
void connection<t_protocol_handler>::handle_write(const boost::system::error_code& e, size_t cb)
{
TRY_ENTRY();
- LOG_PRINT_L4("[sock " << socket_.native_handle() << "] Async send calledback " << cb);
+ LOG_TRACE_CC(context, "[sock " << socket_.native_handle() << "] Async send calledback " << cb);
if (e)
{
@@ -635,10 +631,10 @@ PRAGMA_WARNING_DISABLE_VS(4355)
{
//have more data to send
auto size_now = m_send_que.front().size();
- _dbg1_c("net/out/size", "handle_write() NOW SENDS: packet="<<size_now<<" B" <<", from queue size="<<m_send_que.size());
+ MDEBUG("handle_write() NOW SENDS: packet="<<size_now<<" B" <<", from queue size="<<m_send_que.size());
if (speed_limit_is_enabled())
do_send_handler_write_from_queue(e, m_send_que.front().size() , m_send_que.size()); // (((H)))
- ASRT( size_now == m_send_que.front().size() );
+ CHECK_AND_ASSERT_MES( size_now == m_send_que.front().size(), void(), "Unexpected queue size");
boost::asio::async_write(socket_, boost::asio::buffer(m_send_que.front().data(), size_now) ,
// strand_.wrap(
boost::bind(&connection<t_protocol_handler>::handle_write, connection<t_protocol_handler>::shared_from_this(), _1, _2)
@@ -660,8 +656,7 @@ PRAGMA_WARNING_DISABLE_VS(4355)
void connection<t_protocol_handler>::setRpcStation()
{
m_connection_type = e_connection_type_RPC;
- _fact_c("net/sleepRPC", "set m_connection_type = RPC ");
- _info_c("net/kind", "set m_connection_type = RPC ");
+ MDEBUG("set m_connection_type = RPC ");
}
@@ -735,7 +730,7 @@ PRAGMA_WARNING_DISABLE_VS(4355)
acceptor_.listen();
boost::asio::ip::tcp::endpoint binded_endpoint = acceptor_.local_endpoint();
m_port = binded_endpoint.port();
- _fact_c("net/RPClog", "start accept");
+ MDEBUG("start accept");
new_connection_.reset(new connection<t_protocol_handler>(io_service_, m_config, m_sock_count, m_sock_number, m_pfilter, m_connection_type));
acceptor_.async_accept(new_connection_->socket(),
boost::bind(&boosted_tcp_server<t_protocol_handler>::handle_accept, this,
@@ -753,7 +748,7 @@ DISABLE_GCC_WARNING(maybe-uninitialized)
uint32_t p = 0;
if (port.size() && !string_tools::get_xtype_from_string(p, port)) {
- LOG_ERROR("Failed to convert port no = " << port);
+ MERROR("Failed to convert port no = " << port);
return false;
}
return this->init_server(p, address);
@@ -767,7 +762,7 @@ POP_WARNINGS
uint32_t local_thr_index = boost::interprocess::ipcdetail::atomic_inc32(&m_thread_index);
std::string thread_name = std::string("[") + m_thread_name_prefix;
thread_name += boost::to_string(local_thr_index) + "]";
- log_space::log_singletone::set_thread_log_prefix(thread_name);
+ MLOG_SET_THREAD_NAME(thread_name);
// _fact("Thread name: " << m_thread_name_prefix);
while(!m_stop_signal_sent)
{
@@ -796,8 +791,7 @@ POP_WARNINGS
auto it = server_type_map.find(m_thread_name_prefix);
if (it==server_type_map.end()) throw std::runtime_error("Unknown prefix/server type:" + std::string(prefix_name));
auto connection_type = it->second; // the value of type
- _info_c("net/RPClog", "Set server type to: " << connection_type << " from name: " << m_thread_name_prefix);
- _info_c("net/RPClog", "prefix_name = " << prefix_name);
+ MINFO("Set server type to: " << connection_type << " from name: " << m_thread_name_prefix << ", prefix_name = " << prefix_name);
}
//---------------------------------------------------------------------------------
template<class t_protocol_handler>
@@ -812,7 +806,7 @@ POP_WARNINGS
TRY_ENTRY();
m_threads_count = threads_count;
m_main_thread_id = boost::this_thread::get_id();
- log_space::log_singletone::set_thread_log_prefix("[SRV_MAIN]");
+ MLOG_SET_THREAD_NAME("[SRV_MAIN]");
add_idle_handler(boost::bind(&boosted_tcp_server::cleanup_connections, this), 5000);
while(!m_stop_signal_sent)
{
@@ -933,13 +927,12 @@ POP_WARNINGS
template<class t_protocol_handler>
void boosted_tcp_server<t_protocol_handler>::handle_accept(const boost::system::error_code& e)
{
- _fact_c("net/RPClog", "handle_accept");
+ MDEBUG("handle_accept");
TRY_ENTRY();
if (!e)
{
if (m_connection_type == e_connection_type_RPC) {
- _note_c("net/rpc", "New server for RPC connections");
- _fact_c("net/RPClog", "New server for RPC connections");
+ MDEBUG("New server for RPC connections");
new_connection_->setRpcStation(); // hopefully this is not needed actually
}
connection_ptr conn(std::move(new_connection_));
@@ -965,7 +958,7 @@ POP_WARNINGS
connection_ptr new_connection_l(new connection<t_protocol_handler>(io_service_, m_config, m_sock_count, m_sock_number, m_pfilter, m_connection_type) );
connections_mutex.lock();
connections_.push_back(std::make_pair(boost::get_system_time(), new_connection_l));
- LOG_PRINT_L2("connections_ size now " << connections_.size());
+ MDEBUG("connections_ size now " << connections_.size());
connections_mutex.unlock();
boost::asio::ip::tcp::socket& sock_ = new_connection_l->socket();
@@ -1069,7 +1062,7 @@ POP_WARNINGS
connection_ptr new_connection_l(new connection<t_protocol_handler>(io_service_, m_config, m_sock_count, m_sock_number, m_pfilter, m_connection_type) );
connections_mutex.lock();
connections_.push_back(std::make_pair(boost::get_system_time(), new_connection_l));
- LOG_PRINT_L2("connections_ size now " << connections_.size());
+ MDEBUG("connections_ size now " << connections_.size());
connections_mutex.unlock();
boost::asio::ip::tcp::socket& sock_ = new_connection_l->socket();
diff --git a/contrib/epee/include/net/abstract_tcp_server_cp.h b/contrib/epee/include/net/abstract_tcp_server_cp.h
index b6410e120..f10f4203f 100644
--- a/contrib/epee/include/net/abstract_tcp_server_cp.h
+++ b/contrib/epee/include/net/abstract_tcp_server_cp.h
@@ -42,6 +42,9 @@
#include "net_utils_base.h"
#include "pragma_comp_defs.h"
+#undef MONERO_DEFAULT_LOG_CATEGORY
+#define MONERO_DEFAULT_LOG_CATEGORY "net"
+
#define LEVIN_DEFAULT_DATA_BUFF_SIZE 2000
namespace epee
diff --git a/contrib/epee/include/net/abstract_tcp_server_cp.inl b/contrib/epee/include/net/abstract_tcp_server_cp.inl
index a582c660a..ba201e3bf 100644
--- a/contrib/epee/include/net/abstract_tcp_server_cp.inl
+++ b/contrib/epee/include/net/abstract_tcp_server_cp.inl
@@ -27,6 +27,9 @@
#pragma comment(lib, "Ws2_32.lib")
+#undef MONERO_DEFAULT_LOG_CATEGORY
+#define MONERO_DEFAULT_LOG_CATEGORY "net"
+
namespace epee
{
namespace net_utils
diff --git a/contrib/epee/include/net/http_auth.h b/contrib/epee/include/net/http_auth.h
index bdbfa7524..f43a19457 100644
--- a/contrib/epee/include/net/http_auth.h
+++ b/contrib/epee/include/net/http_auth.h
@@ -36,6 +36,9 @@
#include "http_base.h"
+#undef MONERO_DEFAULT_LOG_CATEGORY
+#define MONERO_DEFAULT_LOG_CATEGORY "net.http"
+
namespace epee
{
namespace net_utils
diff --git a/contrib/epee/include/net/http_base.h b/contrib/epee/include/net/http_base.h
index 4ff74fe27..d8e31521f 100644
--- a/contrib/epee/include/net/http_base.h
+++ b/contrib/epee/include/net/http_base.h
@@ -31,6 +31,10 @@
#include <boost/regex.hpp>
#include "string_tools.h"
+
+#undef MONERO_DEFAULT_LOG_CATEGORY
+#define MONERO_DEFAULT_LOG_CATEGORY "net.http"
+
namespace epee
{
namespace net_utils
diff --git a/contrib/epee/include/net/http_client.h b/contrib/epee/include/net/http_client.h
index 336153384..a54318ebb 100644
--- a/contrib/epee/include/net/http_client.h
+++ b/contrib/epee/include/net/http_client.h
@@ -52,6 +52,9 @@
//#pragma comment(lib, "shlwapi.lib")
+#undef MONERO_DEFAULT_LOG_CATEGORY
+#define MONERO_DEFAULT_LOG_CATEGORY "net.http"
+
extern epee::critical_section gregexp_lock;
@@ -325,10 +328,10 @@ using namespace std;
CRITICAL_REGION_LOCAL(m_lock);
if(!is_connected())
{
- LOG_PRINT("Reconnecting...", LOG_LEVEL_3);
+ MDEBUG("Reconnecting...");
if(!connect(m_host_buff, m_port, m_timeout))
{
- LOG_PRINT("Failed to connect to " << m_host_buff << ":" << m_port, LOG_LEVEL_3);
+ MDEBUG("Failed to connect to " << m_host_buff << ":" << m_port);
return false;
}
}
@@ -376,7 +379,7 @@ using namespace std;
{
if(!m_net_client.recv(recv_buffer))
{
- LOG_PRINT("Unexpected reciec fail", LOG_LEVEL_3);
+ MERROR("Unexpected recv fail");
m_state = reciev_machine_state_error;
}
if(!recv_buffer.size())
@@ -464,7 +467,7 @@ using namespace std;
CRITICAL_REGION_LOCAL(m_lock);
if(!recv_buff.size())
{
- LOG_PRINT("Warning: Content-Len mode, but connection unexpectedly closed", LOG_LEVEL_3);
+ MERROR("Warning: Content-Len mode, but connection unexpectedly closed");
m_state = reciev_machine_state_done;
return true;
}
@@ -578,7 +581,7 @@ using namespace std;
CRITICAL_REGION_LOCAL(m_lock);
if(!recv_buff.size())
{
- LOG_PRINT("Warning: CHUNKED mode, but connection unexpectedly closed", LOG_LEVEL_3);
+ MERROR("Warning: CHUNKED mode, but connection unexpectedly closed");
m_state = reciev_machine_state_done;
return true;
}
@@ -665,7 +668,7 @@ using namespace std;
inline
bool parse_header(http_header_info& body_info, const std::string& m_cache_to_process)
{
- LOG_FRAME("http_stream_filter::parse_cached_header(*)", LOG_LEVEL_4);
+ MTRACE("http_stream_filter::parse_cached_header(*)");
STATIC_REGEXP_EXPR_1(rexp_mach_field,
"\n?((Connection)|(Referer)|(Content-Length)|(Content-Type)|(Transfer-Encoding)|(Content-Encoding)|(Host)|(Cookie)|(User-Agent)"
@@ -833,7 +836,7 @@ using namespace std;
}else
{ //Apparently there are no signs of the form of transfer, will receive data until the connection is closed
m_state = reciev_machine_state_error;
- LOG_PRINT("Undefinded transfer type, consider http_body_transfer_connection_close method. header: " << m_header_cache, LOG_LEVEL_2);
+ MERROR("Undefinded transfer type, consider http_body_transfer_connection_close method. header: " << m_header_cache);
return false;
}
return false;
diff --git a/contrib/epee/include/net/http_client_abstract_invoke.h b/contrib/epee/include/net/http_client_abstract_invoke.h
index 425a355ee..9b6ab4db8 100644
--- a/contrib/epee/include/net/http_client_abstract_invoke.h
+++ b/contrib/epee/include/net/http_client_abstract_invoke.h
@@ -28,6 +28,9 @@
#pragma once
#include "storages/serializeble_struct_helper.h"
+#undef MONERO_DEFAULT_LOG_CATEGORY
+#define MONERO_DEFAULT_LOG_CATEGORY "net.http"
+
namespace epee
{
namespace net_utils
diff --git a/contrib/epee/include/net/http_client_base.h b/contrib/epee/include/net/http_client_base.h
index 450d44823..f5fb57d03 100644
--- a/contrib/epee/include/net/http_client_base.h
+++ b/contrib/epee/include/net/http_client_base.h
@@ -26,6 +26,9 @@
#pragma once
+#undef MONERO_DEFAULT_LOG_CATEGORY
+#define MONERO_DEFAULT_LOG_CATEGORY "net.http"
+
namespace epee
{
namespace net_utils
diff --git a/contrib/epee/include/net/http_client_via_api_helper.h b/contrib/epee/include/net/http_client_via_api_helper.h
index 391c44964..3242e4162 100644
--- a/contrib/epee/include/net/http_client_via_api_helper.h
+++ b/contrib/epee/include/net/http_client_via_api_helper.h
@@ -32,6 +32,9 @@
#include <atlutil.h>
#pragma comment(lib, "Wininet.lib")
+#undef MONERO_DEFAULT_LOG_CATEGORY
+#define MONERO_DEFAULT_LOG_CATEGORY "net.http"
+
namespace epee
{
namespace net_utils
diff --git a/contrib/epee/include/net/http_protocol_handler.h b/contrib/epee/include/net/http_protocol_handler.h
index 69ea04fbe..c2e44c536 100644
--- a/contrib/epee/include/net/http_protocol_handler.h
+++ b/contrib/epee/include/net/http_protocol_handler.h
@@ -37,6 +37,9 @@
#include "http_auth.h"
#include "http_base.h"
+#undef MONERO_DEFAULT_LOG_CATEGORY
+#define MONERO_DEFAULT_LOG_CATEGORY "net.http"
+
namespace epee
{
namespace net_utils
diff --git a/contrib/epee/include/net/http_protocol_handler.inl b/contrib/epee/include/net/http_protocol_handler.inl
index 6beff0109..5bfaf4767 100644
--- a/contrib/epee/include/net/http_protocol_handler.inl
+++ b/contrib/epee/include/net/http_protocol_handler.inl
@@ -33,6 +33,9 @@
#include "file_io_utils.h"
#include "net_parse_helpers.h"
+#undef MONERO_DEFAULT_LOG_CATEGORY
+#define MONERO_DEFAULT_LOG_CATEGORY "net.http"
+
#define HTTP_MAX_URI_LEN 9000
#define HTTP_MAX_HEADER_LEN 100000
@@ -133,7 +136,7 @@ namespace net_utils
std::string boundary;
if(!match_boundary(content_type, boundary))
{
- LOG_PRINT("Failed to match boundary in content type: " << content_type, LOG_LEVEL_0);
+ MERROR("Failed to match boundary in content type: " << content_type);
return false;
}
@@ -155,7 +158,7 @@ namespace net_utils
pos = body.find(boundary, std::distance(body.begin(), it_begin));
if(std::string::npos == pos)
{
- LOG_PRINT("Error: Filed to match closing multipart tag", LOG_LEVEL_0);
+ MERROR("Error: Filed to match closing multipart tag");
it_end = body.end();
}else
{
@@ -177,7 +180,7 @@ namespace net_utils
out_values.push_back(multipart_entry());
if(!handle_part_of_multipart(it_begin, it_end, out_values.back()))
{
- LOG_PRINT("Failed to handle_part_of_multipart", LOG_LEVEL_0);
+ MERROR("Failed to handle_part_of_multipart");
return false;
}
@@ -331,8 +334,6 @@ namespace net_utils
template<class t_connection_context>
bool simple_http_connection_handler<t_connection_context>::handle_invoke_query_line()
{
- LOG_FRAME("simple_http_connection_handler<t_connection_context>::handle_recognize_protocol_out(*)", LOG_LEVEL_3);
-
STATIC_REGEXP_EXPR_1(rexp_match_command_line, "^(((OPTIONS)|(GET)|(HEAD)|(POST)|(PUT)|(DELETE)|(TRACE)) (\\S+) HTTP/(\\d+).(\\d+))\r?\n", boost::regex::icase | boost::regex::normal);
// 123 4 5 6 7 8 9 10 11 12
//size_t match_len = 0;
@@ -379,8 +380,6 @@ namespace net_utils
{
//LOG_PRINT_L4("HTTP HEAD:\r\n" << m_cache.substr(0, pos));
- LOG_FRAME("simple_http_connection_handler<t_connection_context>::analize_cached_request_header_and_invoke_state(*)", LOG_LEVEL_3);
-
m_query_info.m_full_request_buf_size = pos;
m_query_info.m_request_head.assign(m_cache.begin(), m_cache.begin()+pos);
@@ -479,8 +478,6 @@ namespace net_utils
template<class t_connection_context>
bool simple_http_connection_handler<t_connection_context>::parse_cached_header(http_header_info& body_info, const std::string& m_cache_to_process, size_t pos)
{
- LOG_FRAME("http_stream_filter::parse_cached_header(*)", LOG_LEVEL_3);
-
STATIC_REGEXP_EXPR_1(rexp_mach_field,
"\n?((Connection)|(Referer)|(Content-Length)|(Content-Type)|(Transfer-Encoding)|(Content-Encoding)|(Host)|(Cookie)|(User-Agent)"
// 12 3 4 5 6 7 8 9 10
@@ -576,7 +573,7 @@ namespace net_utils
m_config.m_lock.unlock();
if(!file_io_utils::load_file_to_string(destination_file_path.c_str(), response.m_body))
{
- LOG_PRINT("URI \""<< query_info.m_full_request_str.substr(0, query_info.m_full_request_str.size()-2) << "\" [" << destination_file_path << "] Not Found (404 )" , LOG_LEVEL_1);
+ MWARNING("URI \""<< query_info.m_full_request_str.substr(0, query_info.m_full_request_str.size()-2) << "\" [" << destination_file_path << "] Not Found (404 )");
response.m_body = get_not_found_response_body(query_info.m_URI);
response.m_response_code = 404;
response.m_response_comment = "Not found";
@@ -584,7 +581,7 @@ namespace net_utils
return true;
}
- LOG_PRINT(" -->> " << query_info.m_full_request_str << "\r\n<<--OK" , LOG_LEVEL_3);
+ MDEBUG(" -->> " << query_info.m_full_request_str << "\r\n<<--OK");
response.m_response_code = 200;
response.m_response_comment = "OK";
response.m_mime_tipe = get_file_mime_tipe(uri_to_path);
diff --git a/contrib/epee/include/net/http_server_cp.h b/contrib/epee/include/net/http_server_cp.h
index bbb167f9f..1ac2223c7 100644
--- a/contrib/epee/include/net/http_server_cp.h
+++ b/contrib/epee/include/net/http_server_cp.h
@@ -32,6 +32,10 @@
#include "abstract_tcp_server_cp.h"
#include "http_server.h"
+
+#undef MONERO_DEFAULT_LOG_CATEGORY
+#define MONERO_DEFAULT_LOG_CATEGORY "net.http"
+
namespace epee
{
namespace net_utils
diff --git a/contrib/epee/include/net/http_server_cp2.h b/contrib/epee/include/net/http_server_cp2.h
index 1a503a4de..8dfd43a16 100644
--- a/contrib/epee/include/net/http_server_cp2.h
+++ b/contrib/epee/include/net/http_server_cp2.h
@@ -32,6 +32,10 @@
#include "abstract_tcp_server2.h"
#include "http_protocol_handler.h"
+
+#undef MONERO_DEFAULT_LOG_CATEGORY
+#define MONERO_DEFAULT_LOG_CATEGORY "net.http"
+
namespace epee
{
namespace net_utils
diff --git a/contrib/epee/include/net/http_server_handlers_map2.h b/contrib/epee/include/net/http_server_handlers_map2.h
index 3a7d5333b..8e39b4104 100644
--- a/contrib/epee/include/net/http_server_handlers_map2.h
+++ b/contrib/epee/include/net/http_server_handlers_map2.h
@@ -31,6 +31,9 @@
#include "storages/portable_storage.h"
#include "storages/portable_storage_template_helper.h"
+#undef MONERO_DEFAULT_LOG_CATEGORY
+#define MONERO_DEFAULT_LOG_CATEGORY "net.http"
+
#define CHAIN_HTTP_TO_MAP2(context_type) bool handle_http_request(const epee::net_utils::http::http_request_info& query_info, \
epee::net_utils::http::http_response_info& response, \
@@ -77,7 +80,7 @@
uint64_t ticks3 = epee::misc_utils::get_tick_count(); \
response_info.m_mime_tipe = "application/json"; \
response_info.m_header_info.m_content_type = " application/json"; \
- LOG_PRINT( s_pattern << " processed with " << ticks1-ticks << "/"<< ticks2-ticks1 << "/" << ticks3-ticks2 << "ms", LOG_LEVEL_2); \
+ MDEBUG( s_pattern << " processed with " << ticks1-ticks << "/"<< ticks2-ticks1 << "/" << ticks3-ticks2 << "ms"); \
}
#define MAP_URI_AUTO_JON2(s_pattern, callback_f, command_type) MAP_URI_AUTO_JON2_IF(s_pattern, callback_f, command_type, true)
@@ -104,7 +107,7 @@
uint64_t ticks3 = epee::misc_utils::get_tick_count(); \
response_info.m_mime_tipe = " application/octet-stream"; \
response_info.m_header_info.m_content_type = " application/octet-stream"; \
- LOG_PRINT( s_pattern << "() processed with " << ticks1-ticks << "/"<< ticks2-ticks1 << "/" << ticks3-ticks2 << "ms", LOG_LEVEL_2); \
+ MDEBUG( s_pattern << "() processed with " << ticks1-ticks << "/"<< ticks2-ticks1 << "/" << ticks3-ticks2 << "ms"); \
}
#define CHAIN_URI_MAP2(callback) else {callback(query_info, response_info, m_conn_context);handled = true;}
@@ -166,7 +169,7 @@
uint64_t ticks3 = epee::misc_utils::get_tick_count(); \
response_info.m_mime_tipe = "application/json"; \
response_info.m_header_info.m_content_type = " application/json"; \
- LOG_PRINT( query_info.m_URI << "[" << method_name << "] processed with " << ticks1-ticks << "/"<< ticks2-ticks1 << "/" << ticks3-ticks2 << "ms", LOG_LEVEL_2);
+ MDEBUG( query_info.m_URI << "[" << method_name << "] processed with " << ticks1-ticks << "/"<< ticks2-ticks1 << "/" << ticks3-ticks2 << "ms");
#define MAP_JON_RPC_WE_IF(method_name, callback_f, command_type, cond) \
else if((callback_name == method_name) && (cond)) \
diff --git a/contrib/epee/include/net/http_server_impl_base.h b/contrib/epee/include/net/http_server_impl_base.h
index a5cc1a917..f2a580167 100644
--- a/contrib/epee/include/net/http_server_impl_base.h
+++ b/contrib/epee/include/net/http_server_impl_base.h
@@ -36,6 +36,9 @@
#include "net/http_server_cp2.h"
#include "net/http_server_handlers_map2.h"
+#undef MONERO_DEFAULT_LOG_CATEGORY
+#define MONERO_DEFAULT_LOG_CATEGORY "net.http"
+
namespace epee
{
@@ -79,15 +82,14 @@ namespace epee
bool run(size_t threads_count, bool wait = true)
{
//go to loop
- LOG_PRINT("Run net_service loop( " << threads_count << " threads)...", LOG_LEVEL_0);
- _fact_c("net/RPClog", "Run net_service loop( " << threads_count << " threads)...");
+ MINFO("Run net_service loop( " << threads_count << " threads)...");
if(!m_net_server.run_server(threads_count, wait))
{
LOG_ERROR("Failed to run net tcp server!");
}
if(wait)
- LOG_PRINT("net_service loop stopped.", LOG_LEVEL_0);
+ MINFO("net_service loop stopped.");
return true;
}
diff --git a/contrib/epee/include/net/levin_client.inl b/contrib/epee/include/net/levin_client.inl
index a802d55fa..50a01aaa5 100644
--- a/contrib/epee/include/net/levin_client.inl
+++ b/contrib/epee/include/net/levin_client.inl
@@ -30,6 +30,10 @@
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
#include "string_tools.h"
+
+#undef MONERO_DEFAULT_LOG_CATEGORY
+#define MONERO_DEFAULT_LOG_CATEGORY "net"
+
namespace epee
{
namespace levin
diff --git a/contrib/epee/include/net/levin_client_async.h b/contrib/epee/include/net/levin_client_async.h
index be5847c74..2cbdb4587 100644
--- a/contrib/epee/include/net/levin_client_async.h
+++ b/contrib/epee/include/net/levin_client_async.h
@@ -31,6 +31,9 @@
#include "net_helper.h"
#include "levin_base.h"
+#undef MONERO_DEFAULT_LOG_CATEGORY
+#define MONERO_DEFAULT_LOG_CATEGORY "net"
+
namespace epee
{
diff --git a/contrib/epee/include/net/levin_helper.h b/contrib/epee/include/net/levin_helper.h
index 53b19c9fa..c51d7244b 100644
--- a/contrib/epee/include/net/levin_helper.h
+++ b/contrib/epee/include/net/levin_helper.h
@@ -31,6 +31,9 @@
#include "levin_base.h"
#include "serializeble_struct_helper.h"
+#undef MONERO_DEFAULT_LOG_CATEGORY
+#define MONERO_DEFAULT_LOG_CATEGORY "net"
+
namespace epee
{
namespace levin
diff --git a/contrib/epee/include/net/levin_protocol_handler.h b/contrib/epee/include/net/levin_protocol_handler.h
index 512ba1c3c..3e1b8493a 100644
--- a/contrib/epee/include/net/levin_protocol_handler.h
+++ b/contrib/epee/include/net/levin_protocol_handler.h
@@ -32,6 +32,9 @@
#include <boost/uuid/uuid_generators.hpp>
#include "levin_base.h"
+#undef MONERO_DEFAULT_LOG_CATEGORY
+#define MONERO_DEFAULT_LOG_CATEGORY "net"
+
namespace epee
{
namespace levin
@@ -85,7 +88,7 @@ namespace levin
{
if(!m_config.m_pcommands_handler)
{
- LOG_ERROR("Command handler not set!");
+ LOG_ERROR_CC(m_conn_context, "Command handler not set!");
return false;
}
m_cach_in_buffer.append((const char*)ptr, cb);
@@ -100,7 +103,7 @@ namespace levin
{
if(m_cach_in_buffer.size() >= sizeof(uint64_t) && *((uint64_t*)m_cach_in_buffer.data()) != LEVIN_SIGNATURE)
{
- LOG_ERROR("Signature missmatch on accepted connection");
+ LOG_ERROR_CC(m_conn_context, "Signature missmatch on accepted connection");
return false;
}
is_continue = false;
@@ -110,7 +113,7 @@ namespace levin
bucket_head* phead = (bucket_head*)m_cach_in_buffer.data();
if(LEVIN_SIGNATURE != phead->m_signature)
{
- LOG_ERROR("Signature missmatch on accepted connection");
+ LOG_ERROR_CC(m_conn_context, "Signature missmatch on accepted connection");
return false;
}
m_current_head = *phead;
@@ -154,7 +157,7 @@ namespace levin
m_state = conn_state_reading_head;
break;
default:
- LOG_ERROR("Undefined state in levin_server_impl::connection_handler, m_state=" << m_state);
+ LOG_ERROR_CC(m_conn_context, "Undefined state in levin_server_impl::connection_handler, m_state=" << m_state);
return false;
}
}
diff --git a/contrib/epee/include/net/levin_protocol_handler_async.h b/contrib/epee/include/net/levin_protocol_handler_async.h
index 67daceaf5..cc6987e8f 100644
--- a/contrib/epee/include/net/levin_protocol_handler_async.h
+++ b/contrib/epee/include/net/levin_protocol_handler_async.h
@@ -38,6 +38,8 @@
#include <random>
#include <chrono>
+#undef MONERO_DEFAULT_LOG_CATEGORY
+#define MONERO_DEFAULT_LOG_CATEGORY "net"
namespace epee
{
@@ -151,7 +153,7 @@ public:
{
if(ec == boost::asio::error::operation_aborted)
return;
- LOG_PRINT_CC(con.get_context_ref(), "Timeout on invoke operation happened, command: " << command, LOG_LEVEL_2);
+ MINFO(con.get_context_ref() << "Timeout on invoke operation happened, command: " << command);
std::string fake;
cb(LEVIN_ERROR_CONNECTION_TIMEDOUT, fake, con.get_context_ref());
con.close();
@@ -244,15 +246,15 @@ public:
}
CHECK_AND_ASSERT_MES_NO_RET(0 == boost::interprocess::ipcdetail::atomic_read32(&m_wait_count), "Failed to wait for operation completion. m_wait_count = " << m_wait_count);
- LOG_PRINT_CC(m_connection_context, "~async_protocol_handler()", LOG_LEVEL_4);
+ MTRACE(m_connection_context << "~async_protocol_handler()");
}
bool start_outer_call()
{
- LOG_PRINT_CC_L4(m_connection_context, "[levin_protocol] -->> start_outer_call");
+ MTRACE(m_connection_context << "[levin_protocol] -->> start_outer_call");
if(!m_pservice_endpoint->add_ref())
{
- LOG_PRINT_CC_RED(m_connection_context, "[levin_protocol] -->> start_outer_call failed", LOG_LEVEL_4);
+ MERROR(m_connection_context << "[levin_protocol] -->> start_outer_call failed");
return false;
}
boost::interprocess::ipcdetail::atomic_inc32(&m_wait_count);
@@ -260,7 +262,7 @@ public:
}
bool finish_outer_call()
{
- LOG_PRINT_CC_L4(m_connection_context, "[levin_protocol] <<-- finish_outer_call");
+ MTRACE(m_connection_context << "[levin_protocol] <<-- finish_outer_call");
boost::interprocess::ipcdetail::atomic_dec32(&m_wait_count);
m_pservice_endpoint->release();
return true;
@@ -316,13 +318,13 @@ public:
if(!m_config.m_pcommands_handler)
{
- LOG_ERROR_CC(m_connection_context, "Commands handler not set!");
+ MERROR(m_connection_context << "Commands handler not set!");
return false;
}
if(m_cache_in_buffer.size() + cb > m_config.m_max_packet_size)
{
- LOG_ERROR_CC(m_connection_context, "Maximum packet size exceed!, m_max_packet_size = " << m_config.m_max_packet_size
+ MWARNING(m_connection_context << "Maximum packet size exceed!, m_max_packet_size = " << m_config.m_max_packet_size
<< ", packet received " << m_cache_in_buffer.size() + cb
<< ", connection will be closed.");
return false;
@@ -353,7 +355,7 @@ public:
bool is_response = (m_oponent_protocol_ver == LEVIN_PROTOCOL_VER_1 && m_current_head.m_flags&LEVIN_PACKET_RESPONSE);
- LOG_PRINT_CC_L4(m_connection_context, "LEVIN_PACKET_RECIEVED. [len=" << m_current_head.m_cb
+ MDEBUG(m_connection_context << "LEVIN_PACKET_RECIEVED. [len=" << m_current_head.m_cb
<< ", flags" << m_current_head.m_flags
<< ", r?=" << m_current_head.m_have_to_return_data
<<", cmd = " << m_current_head.m_command
@@ -381,7 +383,7 @@ public:
//use sync call scenario
if(!boost::interprocess::ipcdetail::atomic_read32(&m_wait_count) && !boost::interprocess::ipcdetail::atomic_read32(&m_close_called))
{
- LOG_ERROR_CC(m_connection_context, "no active invoke when response came, wtf?");
+ MERROR(m_connection_context << "no active invoke when response came, wtf?");
return false;
}else
{
@@ -413,7 +415,7 @@ public:
if(!m_pservice_endpoint->do_send(send_buff.data(), send_buff.size()))
return false;
CRITICAL_REGION_END();
- LOG_PRINT_CC_L4(m_connection_context, "LEVIN_PACKET_SENT. [len=" << m_current_head.m_cb
+ MDEBUG(m_connection_context << "LEVIN_PACKET_SENT. [len=" << m_current_head.m_cb
<< ", flags" << m_current_head.m_flags
<< ", r?=" << m_current_head.m_have_to_return_data
<<", cmd = " << m_current_head.m_command
@@ -431,7 +433,7 @@ public:
{
if(m_cache_in_buffer.size() >= sizeof(uint64_t) && *((uint64_t*)m_cache_in_buffer.data()) != LEVIN_SIGNATURE)
{
- LOG_ERROR_CC(m_connection_context, "Signature mismatch, connection will be closed");
+ MWARNING(m_connection_context << "Signature mismatch, connection will be closed");
return false;
}
is_continue = false;
@@ -585,7 +587,7 @@ public:
}
CRITICAL_REGION_END();
- LOG_PRINT_CC_L4(m_connection_context, "LEVIN_PACKET_SENT. [len=" << head.m_cb
+ MDEBUG(m_connection_context << "LEVIN_PACKET_SENT. [len=" << head.m_cb
<< ", f=" << head.m_flags
<< ", r?=" << head.m_have_to_return_data
<< ", cmd = " << head.m_command
@@ -597,7 +599,7 @@ public:
{
if(misc_utils::get_tick_count() - ticks_start > m_config.m_invoke_timeout)
{
- LOG_PRINT_CC_L2(m_connection_context, "invoke timeout (" << m_config.m_invoke_timeout << "), closing connection ");
+ MWARNING(m_connection_context << "invoke timeout (" << m_config.m_invoke_timeout << "), closing connection ");
close();
return LEVIN_ERROR_CONNECTION_TIMEDOUT;
}
@@ -650,7 +652,7 @@ public:
return -1;
}
CRITICAL_REGION_END();
- LOG_PRINT_CC_L4(m_connection_context, "LEVIN_PACKET_SENT. [len=" << head.m_cb <<
+ LOG_DEBUG_CC(m_connection_context, "LEVIN_PACKET_SENT. [len=" << head.m_cb <<
", f=" << head.m_flags <<
", r?=" << head.m_have_to_return_data <<
", cmd = " << head.m_command <<
diff --git a/contrib/epee/include/net/net_helper.h b/contrib/epee/include/net/net_helper.h
index a0ade10a3..22cea122f 100644
--- a/contrib/epee/include/net/net_helper.h
+++ b/contrib/epee/include/net/net_helper.h
@@ -46,6 +46,9 @@
//#include "profile_tools.h"
#include "../string_tools.h"
+#undef MONERO_DEFAULT_LOG_CATEGORY
+#define MONERO_DEFAULT_LOG_CATEGORY "net"
+
#ifndef MAKE_IP
#define MAKE_IP( a1, a2, a3, a4 ) (a1|(a2<<8)|(a3<<16)|(a4<<24))
#endif
@@ -180,19 +183,19 @@ namespace net_utils
return true;
}else
{
- LOG_PRINT("Some problems at connect, message: " << ec.message(), LOG_LEVEL_3);
+ MWARNING("Some problems at connect, message: " << ec.message());
return false;
}
}
catch(const boost::system::system_error& er)
{
- LOG_PRINT("Some problems at connect, message: " << er.what(), LOG_LEVEL_4);
+ MDEBUG("Some problems at connect, message: " << er.what());
return false;
}
catch(...)
{
- LOG_PRINT("Some fatal problems.", LOG_LEVEL_4);
+ MDEBUG("Some fatal problems.");
return false;
}
@@ -387,20 +390,20 @@ namespace net_utils
if (ec)
{
- LOG_PRINT_L4("READ ENDS: Connection err_code " << ec.value());
+ MTRACE("READ ENDS: Connection err_code " << ec.value());
if(ec == boost::asio::error::eof)
{
- LOG_PRINT_L4("Connection err_code eof.");
+ MTRACE("Connection err_code eof.");
//connection closed there, empty
return true;
}
- LOG_PRINT_L3("Problems at read: " << ec.message());
+ MDEBUG("Problems at read: " << ec.message());
m_connected = false;
return false;
}else
{
- LOG_PRINT_L4("READ ENDS: Success. bytes_tr: " << bytes_transfered);
+ MTRACE("READ ENDS: Success. bytes_tr: " << bytes_transfered);
m_deadline.expires_at(boost::posix_time::pos_infin);
}
diff --git a/contrib/epee/include/net/net_parse_helpers.h b/contrib/epee/include/net/net_parse_helpers.h
index ce6ca60dc..08d2a2000 100644
--- a/contrib/epee/include/net/net_parse_helpers.h
+++ b/contrib/epee/include/net/net_parse_helpers.h
@@ -31,6 +31,8 @@
#include "http_base.h"
#include "reg_exp_definer.h"
+#undef MONERO_DEFAULT_LOG_CATEGORY
+#define MONERO_DEFAULT_LOG_CATEGORY "net"
namespace epee
{
diff --git a/contrib/epee/include/net/net_utils_base.h b/contrib/epee/include/net/net_utils_base.h
index 78e555fac..cfa51e10d 100644
--- a/contrib/epee/include/net/net_utils_base.h
+++ b/contrib/epee/include/net/net_utils_base.h
@@ -31,6 +31,10 @@
#include <boost/uuid/uuid.hpp>
#include "string_tools.h"
+#include "misc_log_ex.h"
+
+#undef MONERO_DEFAULT_LOG_CATEGORY
+#define MONERO_DEFAULT_LOG_CATEGORY "net"
#ifndef MAKE_IP
#define MAKE_IP( a1, a2, a3, a4 ) (a1|(a2<<8)|(a3<<16)|(a4<<24))
@@ -142,20 +146,24 @@ namespace net_utils
return ss.str();
}
-#define LOG_PRINT_CC(ct, message, log_level) LOG_PRINT("[" << epee::net_utils::print_connection_context_short(ct) << "]" << message, log_level)
-#define LOG_PRINT_CC_GREEN(ct, message, log_level) LOG_PRINT_GREEN("[" << epee::net_utils::print_connection_context_short(ct) << "]" << message, log_level)
-#define LOG_PRINT_CC_RED(ct, message, log_level) LOG_PRINT_RED("[" << epee::net_utils::print_connection_context_short(ct) << "]" << message, log_level)
-#define LOG_PRINT_CC_BLUE(ct, message, log_level) LOG_PRINT_BLUE("[" << epee::net_utils::print_connection_context_short(ct) << "]" << message, log_level)
-#define LOG_PRINT_CC_YELLOW(ct, message, log_level) LOG_PRINT_YELLOW("[" << epee::net_utils::print_connection_context_short(ct) << "]" << message, log_level)
-#define LOG_PRINT_CC_CYAN(ct, message, log_level) LOG_PRINT_CYAN("[" << epee::net_utils::print_connection_context_short(ct) << "]" << message, log_level)
-#define LOG_PRINT_CC_MAGENTA(ct, message, log_level) LOG_PRINT_MAGENTA("[" << epee::net_utils::print_connection_context_short(ct) << "]" << message, log_level)
-#define LOG_ERROR_CC(ct, message) LOG_PRINT_RED("[" << epee::net_utils::print_connection_context_short(ct) << "]" << message, LOG_LEVEL_2)
-
-#define LOG_PRINT_CC_L0(ct, message) LOG_PRINT_L0("[" << epee::net_utils::print_connection_context_short(ct) << "]" << message)
-#define LOG_PRINT_CC_L1(ct, message) LOG_PRINT_L1("[" << epee::net_utils::print_connection_context_short(ct) << "]" << message)
-#define LOG_PRINT_CC_L2(ct, message) LOG_PRINT_L2("[" << epee::net_utils::print_connection_context_short(ct) << "]" << message)
-#define LOG_PRINT_CC_L3(ct, message) LOG_PRINT_L3("[" << epee::net_utils::print_connection_context_short(ct) << "]" << message)
-#define LOG_PRINT_CC_L4(ct, message) LOG_PRINT_L4("[" << epee::net_utils::print_connection_context_short(ct) << "]" << message)
+inline MAKE_LOGGABLE(connection_context_base, ct, os)
+{
+ os << "[" << epee::net_utils::print_connection_context_short(ct) << "] ";
+ return os;
+}
+
+#define LOG_ERROR_CC(ct, message) MERROR(ct << message)
+#define LOG_WARNING_CC(ct, message) MWARNING(ct << message)
+#define LOG_INFO_CC(ct, message) MINFO(ct << message)
+#define LOG_DEBUG_CC(ct, message) MDEBUG(ct << message)
+#define LOG_TRACE_CC(ct, message) MTRACE(ct << message)
+#define LOG_CC(level, ct, message) MLOG(level, ct << message)
+
+#define LOG_PRINT_CC_L0(ct, message) LOG_PRINT_L0(epee::net_utils::print_connection_context_short(ct) << message)
+#define LOG_PRINT_CC_L1(ct, message) LOG_PRINT_L1(epee::net_utils::print_connection_context_short(ct) << message)
+#define LOG_PRINT_CC_L2(ct, message) LOG_PRINT_L2(epee::net_utils::print_connection_context_short(ct) << message)
+#define LOG_PRINT_CC_L3(ct, message) LOG_PRINT_L3(epee::net_utils::print_connection_context_short(ct) << message)
+#define LOG_PRINT_CC_L4(ct, message) LOG_PRINT_L4(epee::net_utils::print_connection_context_short(ct) << message)
#define LOG_PRINT_CCONTEXT_L0(message) LOG_PRINT_CC_L0(context, message)
#define LOG_PRINT_CCONTEXT_L1(message) LOG_PRINT_CC_L1(context, message)
@@ -163,13 +171,6 @@ namespace net_utils
#define LOG_PRINT_CCONTEXT_L3(message) LOG_PRINT_CC_L3(context, message)
#define LOG_ERROR_CCONTEXT(message) LOG_ERROR_CC(context, message)
-#define LOG_PRINT_CCONTEXT_GREEN(message, log_level) LOG_PRINT_CC_GREEN(context, message, log_level)
-#define LOG_PRINT_CCONTEXT_RED(message, log_level) LOG_PRINT_CC_RED(context, message, log_level)
-#define LOG_PRINT_CCONTEXT_BLUE(message, log_level) LOG_PRINT_CC_BLUE(context, message, log_level)
-#define LOG_PRINT_CCONTEXT_YELLOW(message, log_level) LOG_PRINT_CC_YELLOW(context, message, log_level)
-#define LOG_PRINT_CCONTEXT_CYAN(message, log_level) LOG_PRINT_CC_CYAN(context, message, log_level)
-#define LOG_PRINT_CCONTEXT_MAGENTA(message, log_level) LOG_PRINT_CC_MAGENTA(context, message, log_level)
-
#define CHECK_AND_ASSERT_MES_CC(condition, return_val, err_message) CHECK_AND_ASSERT_MES(condition, return_val, "[" << epee::net_utils::print_connection_context_short(context) << "]" << err_message)
}
diff --git a/contrib/epee/include/profile_tools.h b/contrib/epee/include/profile_tools.h
index 0e1646f60..d3b1e4db4 100644
--- a/contrib/epee/include/profile_tools.h
+++ b/contrib/epee/include/profile_tools.h
@@ -52,8 +52,8 @@ namespace epee
#endif
#define START_WAY_POINTS() uint64_t _____way_point_time = epee::misc_utils::get_tick_count();
-#define WAY_POINT(name) {uint64_t delta = epee::misc_utils::get_tick_count()-_____way_point_time; LOG_PRINT("Way point " << name << ": " << delta, LOG_LEVEL_2);_____way_point_time = misc_utils::get_tick_count();}
-#define WAY_POINT2(name, avrg_obj) {uint64_t delta = epee::misc_utils::get_tick_count()-_____way_point_time; avrg_obj.push(delta); LOG_PRINT("Way point " << name << ": " << delta, LOG_LEVEL_2);_____way_point_time = misc_utils::get_tick_count();}
+#define WAY_POINT(name) {uint64_t delta = epee::misc_utils::get_tick_count()-_____way_point_time; MDEBUG("Way point " << name << ": " << delta);_____way_point_time = misc_utils::get_tick_count();}
+#define WAY_POINT2(name, avrg_obj) {uint64_t delta = epee::misc_utils::get_tick_count()-_____way_point_time; avrg_obj.push(delta); MDEBUG("Way point " << name << ": " << delta);_____way_point_time = misc_utils::get_tick_count();}
#define TIME_MEASURE_START(var_name) uint64_t var_name = epee::misc_utils::get_tick_count();
@@ -67,7 +67,7 @@ namespace profile_tools
{}
~local_call_account()
{
- LOG_PRINT2("profile_details.log", "PROFILE "<<m_pname<<":av_time:\t" << (m_count_of_call ? (m_summary_time_used/m_count_of_call):0) <<" sum_time:\t"<<m_summary_time_used<<" call_count:\t" << m_count_of_call, LOG_LEVEL_0);
+ MINFO("PROFILE "<<m_pname<<":av_time:\t" << (m_count_of_call ? (m_summary_time_used/m_count_of_call):0) <<" sum_time:\t"<<m_summary_time_used<<" call_count:\t" << m_count_of_call);
}
size_t m_count_of_call;
diff --git a/contrib/epee/include/storages/levin_abstract_invoke2.h b/contrib/epee/include/storages/levin_abstract_invoke2.h
index 8c4fb9ccd..14e7d402a 100644
--- a/contrib/epee/include/storages/levin_abstract_invoke2.h
+++ b/contrib/epee/include/storages/levin_abstract_invoke2.h
@@ -30,6 +30,9 @@
#include <boost/utility/value_init.hpp>
#include "net/levin_base.h"
+#undef MONERO_DEFAULT_LOG_CATEGORY
+#define MONERO_DEFAULT_LOG_CATEGORY "net"
+
namespace epee
{
namespace net_utils
@@ -48,7 +51,7 @@ namespace epee
int res = transport.invoke(command, buff_to_send, buff_to_recv);
if( res <=0 )
{
- LOG_PRINT_RED("Failed to invoke command " << command << " return code " << res, LOG_LEVEL_1);
+ MERROR("Failed to invoke command " << command << " return code " << res);
return false;
}
serialization::portable_storage stg_ret;
@@ -154,7 +157,7 @@ namespace epee
int res = transport.notify(command, buff_to_send, conn_id);
if(res <=0 )
{
- LOG_PRINT_RED_L0("Failed to notify command " << command << " return code " << res);
+ MERROR("Failed to notify command " << command << " return code " << res);
return false;
}
return true;
diff --git a/contrib/epee/include/storages/portable_storage_from_json.h b/contrib/epee/include/storages/portable_storage_from_json.h
index 41f270627..04b57376c 100644
--- a/contrib/epee/include/storages/portable_storage_from_json.h
+++ b/contrib/epee/include/storages/portable_storage_from_json.h
@@ -365,12 +365,12 @@ namespace epee
}
catch(const std::exception& ex)
{
- LOG_PRINT_RED_L0("Failed to parse json, what: " << ex.what());
+ MERROR("Failed to parse json, what: " << ex.what());
return false;
}
catch(...)
{
- LOG_PRINT_RED_L0("Failed to parse json");
+ MERROR("Failed to parse json");
return false;
}
}
diff --git a/contrib/epee/src/CMakeLists.txt b/contrib/epee/src/CMakeLists.txt
index 8426cd45d..8bc512893 100644
--- a/contrib/epee/src/CMakeLists.txt
+++ b/contrib/epee/src/CMakeLists.txt
@@ -26,4 +26,4 @@
# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
# THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-add_library(epee STATIC http_auth.cpp)
+add_library(epee STATIC http_auth.cpp mlog.cpp)
diff --git a/contrib/epee/src/mlog.cpp b/contrib/epee/src/mlog.cpp
new file mode 100644
index 000000000..37a15bbd5
--- /dev/null
+++ b/contrib/epee/src/mlog.cpp
@@ -0,0 +1,319 @@
+// Copyright (c) 2006-2013, Andrey N. Sabelnikov, www.sabelnikov.net
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above copyright
+// notice, this list of conditions and the following disclaimer in the
+// documentation and/or other materials provided with the distribution.
+// * Neither the name of the Andrey N. Sabelnikov nor the
+// names of its contributors may be used to endorse or promote products
+// derived from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER BE LIABLE FOR ANY
+// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+
+
+#ifndef _MLOG_H_
+#define _MLOG_H_
+
+#include <atomic>
+#include "misc_log_ex.h"
+
+INITIALIZE_EASYLOGGINGPP
+
+//#define MLOG_BASE_FORMAT "%datetime{%Y-%M-%d %H:%m:%s.%g}\t%thread\t%level\t%logger\t%fbase:%line\t%msg"
+#define MLOG_BASE_FORMAT "%datetime{%Y-%M-%d %H:%m:%s.%g}\t%thread\t%level\t%logger\t%loc\t%msg"
+
+using namespace epee;
+
+static std::string generate_log_filename(const char *base)
+{
+ std::string filename(base);
+ char tmp[200];
+ struct tm tm;
+ time_t now = time(NULL);
+ if (!gmtime_r(&now, &tm))
+ strcpy(tmp, "unknown");
+ else
+ strftime(tmp, sizeof(tmp), "%Y-%m-%d-%H-%M-%S", &tm);
+ filename += "-";
+ filename += tmp;
+ return filename;
+}
+
+std::string mlog_get_default_log_path(const char *default_filename)
+{
+ std::string process_name = epee::string_tools::get_current_module_name();
+ std::string default_log_folder = epee::string_tools::get_current_module_folder();
+ std::string default_log_file = process_name;
+ std::string::size_type a = default_log_file.rfind('.');
+ if ( a != std::string::npos )
+ default_log_file.erase( a, default_log_file.size());
+ if ( ! default_log_file.empty() )
+ default_log_file += ".log";
+ else
+ default_log_file = default_filename;
+
+ return (boost::filesystem::path(default_log_folder) / boost::filesystem::path(default_log_file)).string();
+}
+
+static void mlog_set_common_prefix()
+{
+ static const char * const expected_filename = "contrib/epee/src/mlog.cpp";
+ const char *path = __FILE__, *expected_ptr = strstr(path, expected_filename);
+ if (!expected_ptr)
+ return;
+ el::Loggers::setFilenameCommonPrefix(std::string(path, expected_ptr - path));
+}
+
+void mlog_configure(const std::string &filename_base, bool console)
+{
+ el::Configurations c;
+ c.setGlobally(el::ConfigurationType::Filename, filename_base);
+ c.setGlobally(el::ConfigurationType::ToFile, "true");
+ c.setGlobally(el::ConfigurationType::Format, MLOG_BASE_FORMAT);
+ c.setGlobally(el::ConfigurationType::ToStandardOutput, console ? "true" : "false");
+ c.setGlobally(el::ConfigurationType::MaxLogFileSize, "104850000"); // 100 MB - 7600 bytes
+ el::Loggers::setDefaultConfigurations(c, true);
+
+ el::Loggers::addFlag(el::LoggingFlag::HierarchicalLogging);
+ el::Loggers::addFlag(el::LoggingFlag::CreateLoggerAutomatically);
+ el::Loggers::addFlag(el::LoggingFlag::DisableApplicationAbortOnFatalLog);
+ el::Loggers::addFlag(el::LoggingFlag::ColoredTerminalOutput);
+ el::Loggers::addFlag(el::LoggingFlag::StrictLogFileSizeCheck);
+ el::Helpers::installPreRollOutCallback([&filename_base](const char *name, size_t){
+ std::string rname = generate_log_filename(filename_base.c_str());
+ rename(name, rname.c_str());
+ });
+ mlog_set_common_prefix();
+ const char *monero_log = getenv("MONERO_LOGS");
+ if (!monero_log)
+ {
+ monero_log = "*:WARNING,net*:FATAL,global:INFO,verify:FATAL";
+ }
+ mlog_set_categories(monero_log);
+}
+
+void mlog_set_categories(const char *categories)
+{
+ el::Loggers::setCategories(categories);
+ MINFO("Mew log categories: " << categories);
+}
+
+// maps epee style log level to new logging system
+void mlog_set_log_level(int level)
+{
+ const char *settings = NULL;
+ switch (level)
+ {
+ case 0:
+ settings = "*:FATAL,net*:FATAL,global:INFO,verify:FATAL";
+ break;
+ case 1:
+ settings = "*:WARNING,global:INFO";
+ break;
+ case 2:
+ settings = "*:INFO";
+ break;
+ case 3:
+ settings = "*:DEBUG";
+ break;
+ case 4:
+ settings = "*:TRACE";
+ break;
+ default:
+ return;
+ }
+
+ el::Loggers::setCategories(settings);
+ MINFO("Mew log categories: " << settings);
+}
+
+void mlog_set_log(const char *log)
+{
+ long level;
+ char *ptr = NULL;
+
+ level = strtoll(log, &ptr, 10);
+ if (ptr && *ptr)
+ {
+ mlog_set_categories(log);
+ }
+ else if (level >= 0 && level <= 4)
+ {
+ mlog_set_log_level(level);
+ }
+ else
+ {
+ MERROR("Invalid numerical log level: " << log);
+ }
+}
+
+namespace epee
+{
+
+bool is_stdout_a_tty()
+{
+ static std::atomic<bool> initialized(false);
+ static std::atomic<bool> is_a_tty(false);
+
+ if (!initialized.load(std::memory_order_acquire))
+ {
+#if defined(WIN32)
+ is_a_tty.store(0 != _isatty(_fileno(stdout)), std::memory_order_relaxed);
+#else
+ is_a_tty.store(0 != isatty(fileno(stdout)), std::memory_order_relaxed);
+#endif
+ initialized.store(true, std::memory_order_release);
+ }
+
+ return is_a_tty.load(std::memory_order_relaxed);
+}
+
+void set_console_color(int color, bool bright)
+{
+ if (!is_stdout_a_tty())
+ return;
+
+ switch(color)
+ {
+ case console_color_default:
+ {
+#ifdef WIN32
+ HANDLE h_stdout = GetStdHandle(STD_OUTPUT_HANDLE);
+ SetConsoleTextAttribute(h_stdout, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE| (bright ? FOREGROUND_INTENSITY:0));
+#else
+ if(bright)
+ std::cout << "\033[1;37m";
+ else
+ std::cout << "\033[0m";
+#endif
+ }
+ break;
+ case console_color_white:
+ {
+#ifdef WIN32
+ HANDLE h_stdout = GetStdHandle(STD_OUTPUT_HANDLE);
+ SetConsoleTextAttribute(h_stdout, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | (bright ? FOREGROUND_INTENSITY:0));
+#else
+ if(bright)
+ std::cout << "\033[1;37m";
+ else
+ std::cout << "\033[0;37m";
+#endif
+ }
+ break;
+ case console_color_red:
+ {
+#ifdef WIN32
+ HANDLE h_stdout = GetStdHandle(STD_OUTPUT_HANDLE);
+ SetConsoleTextAttribute(h_stdout, FOREGROUND_RED | (bright ? FOREGROUND_INTENSITY:0));
+#else
+ if(bright)
+ std::cout << "\033[1;31m";
+ else
+ std::cout << "\033[0;31m";
+#endif
+ }
+ break;
+ case console_color_green:
+ {
+#ifdef WIN32
+ HANDLE h_stdout = GetStdHandle(STD_OUTPUT_HANDLE);
+ SetConsoleTextAttribute(h_stdout, FOREGROUND_GREEN | (bright ? FOREGROUND_INTENSITY:0));
+#else
+ if(bright)
+ std::cout << "\033[1;32m";
+ else
+ std::cout << "\033[0;32m";
+#endif
+ }
+ break;
+
+ case console_color_blue:
+ {
+#ifdef WIN32
+ HANDLE h_stdout = GetStdHandle(STD_OUTPUT_HANDLE);
+ SetConsoleTextAttribute(h_stdout, FOREGROUND_BLUE | FOREGROUND_INTENSITY);//(bright ? FOREGROUND_INTENSITY:0));
+#else
+ if(bright)
+ std::cout << "\033[1;34m";
+ else
+ std::cout << "\033[0;34m";
+#endif
+ }
+ break;
+
+ case console_color_cyan:
+ {
+#ifdef WIN32
+ HANDLE h_stdout = GetStdHandle(STD_OUTPUT_HANDLE);
+ SetConsoleTextAttribute(h_stdout, FOREGROUND_GREEN | FOREGROUND_BLUE | (bright ? FOREGROUND_INTENSITY:0));
+#else
+ if(bright)
+ std::cout << "\033[1;36m";
+ else
+ std::cout << "\033[0;36m";
+#endif
+ }
+ break;
+
+ case console_color_magenta:
+ {
+#ifdef WIN32
+ HANDLE h_stdout = GetStdHandle(STD_OUTPUT_HANDLE);
+ SetConsoleTextAttribute(h_stdout, FOREGROUND_BLUE | FOREGROUND_RED | (bright ? FOREGROUND_INTENSITY:0));
+#else
+ if(bright)
+ std::cout << "\033[1;35m";
+ else
+ std::cout << "\033[0;35m";
+#endif
+ }
+ break;
+
+ case console_color_yellow:
+ {
+#ifdef WIN32
+ HANDLE h_stdout = GetStdHandle(STD_OUTPUT_HANDLE);
+ SetConsoleTextAttribute(h_stdout, FOREGROUND_RED | FOREGROUND_GREEN | (bright ? FOREGROUND_INTENSITY:0));
+#else
+ if(bright)
+ std::cout << "\033[1;33m";
+ else
+ std::cout << "\033[0;33m";
+#endif
+ }
+ break;
+
+ }
+}
+
+void reset_console_color() {
+ if (!is_stdout_a_tty())
+ return;
+
+#ifdef WIN32
+ HANDLE h_stdout = GetStdHandle(STD_OUTPUT_HANDLE);
+ SetConsoleTextAttribute(h_stdout, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
+#else
+ std::cout << "\033[0m";
+ std::cout.flush();
+#endif
+}
+
+}
+
+#endif //_MLOG_H_
diff --git a/contrib/otshell_utils/CMakeLists.txt b/contrib/otshell_utils/CMakeLists.txt
deleted file mode 100644
index 263f07c85..000000000
--- a/contrib/otshell_utils/CMakeLists.txt
+++ /dev/null
@@ -1,18 +0,0 @@
-cmake_minimum_required (VERSION 2.6)
-project (otshell CXX)
-
-# Add executable
-
-if(APPLE AND POLICY CMP0042)
- cmake_policy(SET CMP0042 NEW)
-endif()
-
-file(GLOB otshell_utils_sources # All files in directory:
- "*.h"
- "*.hpp"
- "*.cpp"
-)
-
-add_library (otshell_utils ${otshell_utils_sources})
-set_target_properties (otshell_utils PROPERTIES OUTPUT_NAME "otshell_utils")
-#target_link_libraries (upnpc-static ${LDLIBS}) # to add used libs
diff --git a/contrib/otshell_utils/LICENCE.txt b/contrib/otshell_utils/LICENCE.txt
deleted file mode 100644
index f351acf10..000000000
--- a/contrib/otshell_utils/LICENCE.txt
+++ /dev/null
@@ -1,21 +0,0 @@
-
-This are some files also from OpenTransactions / otshell project,
-developed thanks to the awesome OpenTransaction project, organization and developers :)
-
-Parts of code here was also developed thanks to the excellent Monero project,
-thanks to Monero project, organization and developers :)
-
-[Some] files/code here (in external/otshell_utils) are under licence defined in
-src/doc/LICENCE-otshell.txt ;
-Others are from monero, with licence in src/doc/LICENCE-monero.txt ;
-
-For me (rfree) the licence seem compatbile so no problem, personally (as author of many parts of the code,
-possibly not all) I do not worry who uses it how; I'am not a lawyer.
-
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-Please share :-) This licence can be used e.g. for parts of code that are usable in both open-source FOSS project
-Monero and Open Transactions, to share and develop both faster.
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-
-
diff --git a/contrib/otshell_utils/ccolor.cpp b/contrib/otshell_utils/ccolor.cpp
deleted file mode 100644
index cd93e0de7..000000000
--- a/contrib/otshell_utils/ccolor.cpp
+++ /dev/null
@@ -1,116 +0,0 @@
-#include "ccolor.hpp"
-#include <cstdarg>
-
-// from http://stackoverflow.com/questions/2616906/how-do-i-output-coloured-text-to-a-linux-terminal
-// from http://wiznet.gr/src/ccolor.zip
-// edited by rfree - as part of https://github.com/rfree/Open-Transactions/
-
-using namespace std;
-
-#ifdef _MSC_VER
-
-#define snprintf c99_snprintf
-
-inline int c99_vsnprintf(char* str, size_t size, const char* format, va_list ap) {
- int count = -1;
- if (size != 0)
- count = _vsnprintf_s(str, size, _TRUNCATE, format, ap);
- if (count == -1)
- count = _vscprintf(format, ap);
- return count;
-}
-
-inline int c99_snprintf(char* str, size_t size, const char* format, ...) {
- int count;
- va_list ap;
- va_start(ap, format);
- count = c99_vsnprintf(str, size, format, ap);
- va_end(ap);
- return count;
-}
-#endif // _MSC_VER
-
-#define CC_CONSOLE_COLOR_DEFAULT "\033[0m"
-#define CC_FORECOLOR(C) "\033[" #C "m"
-#define CC_BACKCOLOR(C) "\033[" #C "m"
-#define CC_ATTR(A) "\033[" #A "m"
-
-namespace zkr
-{
- enum Color
- {
- Black,
- Red,
- Green,
- Yellow,
- Blue,
- Magenta,
- Cyan,
- White,
- Default = 9
- };
-
- enum Attributes
- {
- Reset,
- Bright,
- Dim,
- Underline,
- Blink,
- Reverse,
- Hidden
- };
-
- char * cc::color(int attr, int fg, int bg)
- {
- static const int size = 20;
- static char command[size];
-
- /* Command is the control command to the terminal */
- snprintf(command, size, "%c[%d;%d;%dm", 0x1B, attr, fg + 30, bg + 40);
- return command;
- }
-
-
- const char *cc::console = CC_CONSOLE_COLOR_DEFAULT;
- const char *cc::underline = CC_ATTR(4);
- const char *cc::bold = CC_ATTR(1);
-
- const char *cc::fore::black = CC_FORECOLOR(30);
- const char *cc::fore::blue = CC_FORECOLOR(34);
- const char *cc::fore::red = CC_FORECOLOR(31);
- const char *cc::fore::magenta = CC_FORECOLOR(35);
- const char *cc::fore::green = CC_FORECOLOR(92);
- const char *cc::fore::cyan = CC_FORECOLOR(36);
- const char *cc::fore::yellow = CC_FORECOLOR(33);
- const char *cc::fore::white = CC_FORECOLOR(37);
- const char *cc::fore::console = CC_FORECOLOR(39);
-
- const char *cc::fore::lightblack = CC_FORECOLOR(90);
- const char *cc::fore::lightblue = CC_FORECOLOR(94);
- const char *cc::fore::lightred = CC_FORECOLOR(91);
- const char *cc::fore::lightmagenta = CC_FORECOLOR(95);
- const char *cc::fore::lightgreen = CC_FORECOLOR(92);
- const char *cc::fore::lightcyan = CC_FORECOLOR(96);
- const char *cc::fore::lightyellow = CC_FORECOLOR(93);
- const char *cc::fore::lightwhite = CC_FORECOLOR(97);
-
- const char *cc::back::black = CC_BACKCOLOR(40);
- const char *cc::back::blue = CC_BACKCOLOR(44);
- const char *cc::back::red = CC_BACKCOLOR(41);
- const char *cc::back::magenta = CC_BACKCOLOR(45);
- const char *cc::back::green = CC_BACKCOLOR(42);
- const char *cc::back::cyan = CC_BACKCOLOR(46);
- const char *cc::back::yellow = CC_BACKCOLOR(43);
- const char *cc::back::white = CC_BACKCOLOR(47);
- const char *cc::back::console = CC_BACKCOLOR(49);
-
- const char *cc::back::lightblack = CC_BACKCOLOR(100);
- const char *cc::back::lightblue = CC_BACKCOLOR(104);
- const char *cc::back::lightred = CC_BACKCOLOR(101);
- const char *cc::back::lightmagenta = CC_BACKCOLOR(105);
- const char *cc::back::lightgreen = CC_BACKCOLOR(102);
- const char *cc::back::lightcyan = CC_BACKCOLOR(106);
- const char *cc::back::lightyellow = CC_BACKCOLOR(103);
- const char *cc::back::lightwhite = CC_BACKCOLOR(107);
-}
diff --git a/contrib/otshell_utils/ccolor.hpp b/contrib/otshell_utils/ccolor.hpp
deleted file mode 100644
index bf5a601a2..000000000
--- a/contrib/otshell_utils/ccolor.hpp
+++ /dev/null
@@ -1,73 +0,0 @@
-// ccolor.hpp
-
-// from http://stackoverflow.com/questions/2616906/how-do-i-output-coloured-text-to-a-linux-terminal
-// from http://wiznet.gr/src/ccolor.zip
-// edited by rfree - as part of https://github.com/rfree/Open-Transactions/
-
-#ifndef INCLUDE_OT_ccolor
-#define INCLUDE_OT_ccolor
-
-#include <iostream>
-#include <stdio.h>
-
-namespace zkr
-{
- class cc
- {
- public:
-
- class fore
- {
- public:
- static const char *black;
- static const char *blue;
- static const char *red;
- static const char *magenta;
- static const char *green;
- static const char *cyan;
- static const char *yellow;
- static const char *white;
- static const char *console;
-
- static const char *lightblack;
- static const char *lightblue;
- static const char *lightred;
- static const char *lightmagenta;
- static const char *lightgreen;
- static const char *lightcyan;
- static const char *lightyellow;
- static const char *lightwhite;
- };
-
- class back
- {
- public:
- static const char *black;
- static const char *blue;
- static const char *red;
- static const char *magenta;
- static const char *green;
- static const char *cyan;
- static const char *yellow;
- static const char *white;
- static const char *console;
-
- static const char *lightblack;
- static const char *lightblue;
- static const char *lightred;
- static const char *lightmagenta;
- static const char *lightgreen;
- static const char *lightcyan;
- static const char *lightyellow;
- static const char *lightwhite;
- };
-
- static char *color(int attr, int fg, int bg);
- static const char *console;
- static const char *underline;
- static const char *bold;
- };
-}
-
-#endif
-
diff --git a/contrib/otshell_utils/lib_common1.hpp b/contrib/otshell_utils/lib_common1.hpp
deleted file mode 100644
index 2cb466beb..000000000
--- a/contrib/otshell_utils/lib_common1.hpp
+++ /dev/null
@@ -1,53 +0,0 @@
-/* See other files here for the LICENCE that applies here. */
-
-
-#ifndef INCLUDE_OT_NEWCLI_COMMON1
-#define INCLUDE_OT_NEWCLI_COMMON1
-
-#include <string>
-#include <cstring>
-#include <vector>
-#include <map>
-#include <list>
-#include <algorithm>
-#include <iostream>
-#include <fstream>
-#include <sstream>
-#include <set>
-#include <iterator>
-#include <stdexcept>
-
-#include <functional>
-#include <memory>
-#include <atomic>
-#include <boost/thread.hpp>
-#include <boost/thread/mutex.hpp>
-#include <boost/thread/recursive_mutex.hpp>
-#include <boost/thread/lock_guard.hpp>
-
-
-// list of thigs from libraries that we pull into namespace nOT::nNewcli
-// we might still need to copy/paste it in few places to make IDEs pick it up correctly
-#define INJECT_OT_COMMON_USING_NAMESPACE_COMMON_1 \
- using std::string; \
- using std::vector; \
- using std::vector; \
- using std::list; \
- using std::set; \
- using std::map; \
- using std::ostream; \
- using std::istream; \
- using std::cin; \
- using std::cerr; \
- using std::cout; \
- using std::cerr; \
- using std::endl; \
- using std::function; \
- using std::unique_ptr; \
- using std::shared_ptr; \
- using std::weak_ptr; \
- using std::enable_shared_from_this; \
- using boost::lock_guard; \
-
-#endif
-
diff --git a/contrib/otshell_utils/runoptions.cpp b/contrib/otshell_utils/runoptions.cpp
deleted file mode 100644
index ffd37eae4..000000000
--- a/contrib/otshell_utils/runoptions.cpp
+++ /dev/null
@@ -1,69 +0,0 @@
-/* See other files here for the LICENCE that applies here. */
-/* See header file .hpp for info */
-
-#include "runoptions.hpp"
-
-#include "lib_common1.hpp"
-
-namespace nOT {
-
-INJECT_OT_COMMON_USING_NAMESPACE_COMMON_1 // <=== namespaces
-
-// (no debug - this is the default)
-// +nodebug (no debug)
-// +debug ...... --asdf
-// +debug +debugcerr .... --asfs
-// +debug +debugfile .... --asfs
-
-cRunOptions::cRunOptions()
- : mRunMode(eRunModeCurrent), mDebug(false), mDebugSendToFile(false), mDebugSendToCerr(false)
- ,mDoRunDebugshow(false)
-{ }
-
-vector<string> cRunOptions::ExecuteRunoptionsAndRemoveThem(const vector<string> & args) {
- vector<string> arg_clear; // will store only the arguments that are not removed
-
- for (auto arg : args) {
- bool thisIsRunoption=false;
-
- if (arg.size()>0) {
- if (arg.at(0) == '+') thisIsRunoption=true;
- }
-
- if (thisIsRunoption) Exec(arg); // ***
- if (! thisIsRunoption) arg_clear.push_back(arg);
- }
-
- Normalize();
-
- return arg_clear;
-}
-
-void cRunOptions::Exec(const string & runoption) { // eg: Exec("+debug");
- if (runoption == "+nodebug") { mDebug=false; }
- else if (runoption == "+debug") { mDebug=true; }
- else if (runoption == "+debugcerr") { mDebug=true; mDebugSendToCerr=true; }
- else if (runoption == "+debugfile") { mDebug=true; mDebugSendToFile=true; }
- else if (runoption == "+demo") { mRunMode=eRunModeDemo; }
- else if (runoption == "+normal") { mRunMode=eRunModeNormal; }
- else if (runoption == "+current") { mRunMode=eRunModeCurrent; }
- else if (runoption == "+debugshow") { mDebug=true; mDebugSendToCerr=true; mDoRunDebugshow=true; }
- else {
- cerr << "Unknown runoption in Exec: '" << runoption << "'" << endl;
- throw std::runtime_error("Unknown runoption");
- }
- // cerr<<"debug="<<mDebug<<endl;
-}
-
-void cRunOptions::Normalize() {
- if (mDebug) {
- if (!( mDebugSendToFile || mDebugSendToCerr )) mDebugSendToCerr=true; // if debug is on then send to something, e.g. to cerr
- }
-}
-
-
-cRunOptions gRunOptions; // (extern)
-
-} // namespace OT
-
-
diff --git a/contrib/otshell_utils/runoptions.hpp b/contrib/otshell_utils/runoptions.hpp
deleted file mode 100644
index 219d3b509..000000000
--- a/contrib/otshell_utils/runoptions.hpp
+++ /dev/null
@@ -1,58 +0,0 @@
-/* See other files here for the LICENCE that applies here. */
-/*
-Template for new files, replace word "template" and later delete this line here.
-*/
-
-#ifndef INCLUDE_OT_NEWCLI_runoptions_hpp
-#define INCLUDE_OT_NEWCLI_runoptions_hpp
-
-#include "lib_common1.hpp"
-
-namespace nOT {
-
-INJECT_OT_COMMON_USING_NAMESPACE_COMMON_1 // <=== namespaces
-
-/** Global options to run this program main() Eg used for developer's special options like +setdemo +setdebug.
-This is NOT for all the other options that are parsed and executed by program. */
-class cRunOptions {
- public:
- enum tRunMode { ///< Type of run mode - is this normal, or demonstration etc.
- eRunModeCurrent=1, ///< currently developed version
- eRunModeDemo, ///< best currently available Demo of something nice
- eRunModeNormal, ///< do the normal things that the program should do
- };
-
- private:
- tRunMode mRunMode; ///< selected run mode
-
- bool mDebug; // turn debug on, Eg: +debug without it probably nothing will be written to debug (maybe just error etc)
- bool mDebugSendToFile; // send to file, Eg: for +debugfile ; also turns on debug
- bool mDebugSendToCerr; // send to cerr, Eg: for +debugcerr ; also turns on debug
- // if debug is set but not any other DebugSend* then we will default to sending to debugcerr
-
- bool mDoRunDebugshow;
-
- public:
- tRunMode getTRunMode() const { return mRunMode; }
- bool getDebug() const { return mDebug; }
- bool getDebugSendToFile() const { return mDebugSendToFile; }
- bool getDebugSendToCerr() const { return mDebugSendToCerr; }
- bool getDoRunDebugshow() const { return mDoRunDebugshow; }
-
- cRunOptions();
-
- vector<string> ExecuteRunoptionsAndRemoveThem(const vector<string> & args);
- void Exec(const string & runoption); // eg: Exec("+debug");
-
- void Normalize();
-};
-
-extern cRunOptions gRunOptions;
-
-
-} // namespace nOT
-
-
-
-#endif
-
diff --git a/contrib/otshell_utils/utils.cpp b/contrib/otshell_utils/utils.cpp
deleted file mode 100644
index ef9b37f03..000000000
--- a/contrib/otshell_utils/utils.cpp
+++ /dev/null
@@ -1,806 +0,0 @@
-/// @file
-/// @author rfree (current maintainer in monero.cc project)
-/// @brief various general utils taken from (and relate to) otshell project, including loggiang/debug
-
-/* See other files here for the LICENCE that applies here. */
-/* See header file .hpp for info */
-
-#include <algorithm>
-#include <functional>
-#include <cctype>
-#include <locale>
-#include <fstream>
-#include <iostream>
-#include <iomanip>
-#include <chrono>
-
-#include "utils.hpp"
-
-#include "ccolor.hpp"
-
-#include "lib_common1.hpp"
-
-#include "runoptions.hpp"
-
-#if defined(_WIN32) || defined(WIN32) || defined(_WIN64) || defined (WIN64)
- #define OS_TYPE_WINDOWS
-#elif defined(__unix__) || defined(__posix) || defined(__linux) || defined(__darwin) || defined(__APPLE__) || defined(__clang__)
- #define OS_TYPE_POSIX
-#else
- #warning "Compiler/OS platform is not recognized. Just assuming it will work as POSIX then"
- #define OS_TYPE_POSIX
-#endif
-
-#if defined(OS_TYPE_WINDOWS)
- #include <windows.h>
- #include <process.h>
-#elif defined(OS_TYPE_POSIX)
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <unistd.h>
-#else
- #error "Compiler/OS platform detection failed - not supported"
-#endif
-
-
-namespace nOT {
-namespace nUtils {
-
-INJECT_OT_COMMON_USING_NAMESPACE_COMMON_1 // <=== namespaces
-
-// ====================================================================
-
-// Numerical values of the debug levels - see hpp
-const int _debug_level_nr_dbg3=20;
-const int _debug_level_nr_dbg2=30;
-const int _debug_level_nr_dbg1=40;
-const int _debug_level_nr_info=50;
-const int _debug_level_nr_note=60;
-const int _debug_level_nr_fact=75;
-const int _debug_level_nr_mark=80;
-const int _debug_level_nr_warn=90;
-const int _debug_level_nr_erro=100;
-
-// ====================================================================
-
-myexception::myexception(const char * what)
- : std::runtime_error(what)
-{ }
-
-myexception::myexception(const std::string &what)
- : std::runtime_error(what)
-{ }
-
-void myexception::Report() const {
- _erro("Error: " << what());
-}
-
-//myexception::~myexception() { }
-
-// ====================================================================
-
-// text trimming
-// http://stackoverflow.com/questions/216823/whats-the-best-way-to-trim-stdstring
-std::string & ltrim(std::string &s) {
- s.erase(s.begin(), std::find_if(s.begin(), s.end(), std::not1(std::ptr_fun<int, int>(std::isspace))));
- return s;
-}
-
-std::string & rtrim(std::string &s) {
- s.erase(std::find_if(s.rbegin(), s.rend(), std::not1(std::ptr_fun<int, int>(std::isspace))).base(), s.end());
- return s;
-}
-
-std::string & trim(std::string &s) {
- return ltrim(rtrim(s));
-}
-
-std::string get_current_time() {
- std::chrono::system_clock::time_point now = std::chrono::system_clock::now();
- time_t time_now = std::chrono::system_clock::to_time_t(now);
- std::chrono::high_resolution_clock::duration duration = now.time_since_epoch();
- int64_t micro = std::chrono::duration_cast<std::chrono::microseconds>(duration).count();
-
- // std::localtime() - This function may not be thread-safe.
- #ifdef OS_TYPE_WINDOWS
- struct tm * tm_pointer = std::localtime( &time_now ); // thread-safe on mingw-w64 (thread local variable) and on MSVC btw
- // http://stackoverflow.com/questions/18551409/localtime-r-support-on-mingw
- // tm_pointer points to thread-local data, memory is owned/managed by the system/library
- #else
- // linux, freebsd, have this
- struct tm tm_object; // automatic storage duration http://en.cppreference.com/w/cpp/language/storage_duration
- struct tm * tm_pointer = & tm_object; // just point to our data
- auto x = localtime_r( &time_now , tm_pointer ); // modifies our own (this thread) data in tm_object, this is safe http://linux.die.net/man/3/localtime_r
- if (x != tm_pointer) return "(internal error in get_current_time)"; // redundant check in case of broken implementation of localtime_r
- #endif
- // tm_pointer now points to proper time data, and that memory is automatically managed
- if (!tm_pointer) return "(internal error in get_current_time - NULL)"; // redundant check in case of broken implementation of used library methods
-
- std::stringstream stream;
- stream << std::setfill('0')
- << std::setw(2) << tm_pointer->tm_year+1900
- << '-' << std::setw(2) << tm_pointer->tm_mon+1
- << '-' << std::setw(2) << tm_pointer->tm_mday
- << ' ' << std::setw(2) << tm_pointer->tm_hour
- << ':' << std::setw(2) << tm_pointer->tm_min
- << ':' << std::setw(2) << tm_pointer->tm_sec
- << '.' << std::setw(6) << (micro%1000000); // 6 because microseconds
- return stream.str();
-}
-
-cNullstream g_nullstream; // extern a stream that does nothing (eats/discards data)
-
-boost::recursive_mutex gLoggerGuard; // extern
-std::atomic<int> gLoggerGuardDepth; // extern
-
-std::atomic<int> & gLoggerGuardDepth_Get() {
- // TODO std::once would be nicer here
-
- static bool once=0;
-
- if (!once) { // initialize it once
- once=1;
- gLoggerGuardDepth=0;
- }
-
- return gLoggerGuardDepth; // global, atomic counter
-}
-
-
-// ====================================================================
-
-namespace nDetail {
-
-const char* DbgShortenCodeFileName(const char *s) {
- const char *p = s;
- const char *a = s;
-
- bool inc=1;
- while (*p) {
- ++p;
- if (inc && ('\0' != * p)) { a=p; inc=false; } // point to the current character (if valid) becasue previous one was slash
- if ((*p)=='/') { a=p; inc=true; } // point at current slash (but set inc to try to point to next character)
- }
- return a;
-}
-
-}
-
-// a workaround for MSVC compiler; e.g. see https://bugs.webkit.org/show_bug.cgi?format=multiple&id=125795
-#ifndef _MSC_VER
-template<typename T, typename ...Args>
-std::unique_ptr<T> make_unique( Args&& ...args )
-{
- return std::unique_ptr<T>( new T( std::forward<Args>(args)... ) );
-}
-#else
- using std::make_unique;
-#endif
-// ====================================================================
-
-char cFilesystemUtils::GetDirSeparatorSys() {
- // TODO nicer os detection?
- #if defined(OS_TYPE_POSIX)
- return '/';
- #elif defined(OS_TYPE_WINDOWS)
- return '\\';
- #else
- #error "Do not know how to compile this for your platform."
- #endif
-}
-
-char cFilesystemUtils::GetDirSeparatorInter() {
- return '/';
-}
-
-string cFilesystemUtils::FileInternalToSystem(const std::string &name) {
- string ret;
- ret.resize(name.size());
- std::replace_copy(name.begin(), name.end(), ret.begin(),
- GetDirSeparatorInter() , GetDirSeparatorSys());
- return ret;
-}
-
-string cFilesystemUtils::FileSystemToInternal(const std::string &name) {
- string ret;
- ret.reserve(name.size());
- std::replace_copy(name.begin(), name.end(), ret.begin(),
- GetDirSeparatorSys() , GetDirSeparatorInter());
- return ret;
-}
-
-bool cFilesystemUtils::CreateDirTree(const std::string & dir, bool only_below) {
- const bool dbg=false;
- //struct stat st;
- const char dirchS = cFilesystemUtils::GetDirSeparatorSys();
- const char dirchI = cFilesystemUtils::GetDirSeparatorInter();
- std::istringstream iss(dir);
- string partI; // current par is in internal format (though it should not matter since it doesn't contain any slashes). eg "bar"
- string sofarS=""; // sofarS - the so far created dir part is in SYSTEM format. eg "foo/bar"
- if (dir.size()<1) return false; // illegal name
- // dir[0] is valid from here
- if ( only_below && ((dir[0]==dirchS) || (dir[0]==dirchI))) return false; // no jumping to top (on any os)
-
- while (getline(iss,partI,dirchI)) { // get new component eg "bar" into part
- if (dbg) cout << '['<<partI<<']' << endl;
- sofarS += partI;
- if (partI.size()<1) return false; // bad format?
- if ((only_below) && (partI=="..")) return false; // trying to go up
-
- if (dbg) cout << "test ["<<sofarS<<"]"<<endl;
- // TODO nicer os detection?
- #if defined(OS_TYPE_POSIX)
- struct stat st;
- bool exists = stat(sofarS.c_str() ,&st) == 0; // *
- if (exists) {
- if (! S_ISDIR(st.st_mode)) {
- // std::cerr << "This exists, but as a file: [" << sofar << "]" << (size_t)st.st_ino << endl;
- return false; // exists but is a file nor dir
- }
- }
- #elif defined(OS_TYPE_WINDOWS)
- DWORD dwAttrib = GetFileAttributesA(sofarS.c_str());
- bool exists = (dwAttrib != INVALID_FILE_ATTRIBUTES && (dwAttrib & FILE_ATTRIBUTE_DIRECTORY));
- #else
- #error "Do not know how to compile this for your platform."
- #endif
-
- if (!exists) {
- if (dbg) cout << "mkdir ["<<sofarS<<"]"<<endl;
- #if defined(OS_TYPE_POSIX)
- bool ok = 0== mkdir(sofarS.c_str(), 0700); // ***
- #elif defined(OS_TYPE_WINDOWS)
- bool ok = (bool) CreateDirectoryA(sofarS.c_str(), NULL); // TODO use -W() after conversion to unicode UTF16
- #else
- #error "Do not know how to compile this for your platform."
- #endif
- if (!ok) return false;
- }
- sofarS += dirchS;
- }
- return true;
-}
-// ====================================================================
-
-namespace nDetail {
-
-struct channel_use_info { ///< feedback information about using (e.g. opening) given debug channel - used internally by logging system
-/// TODO not yet used in code
-/// e.g. used to write into channel net/in/all that given message was a first logged message from never-before-logged thread or PID etc
- bool m_was_interesting; ///< anything interesting happened when using the channel?
- std::vector<std::string> m_extra_msg; ///< any additional messages about this channel use
-};
-
-cDebugScopeGuard::cDebugScopeGuard() : mLevel(-1) {
-}
-
-cDebugScopeGuard::~cDebugScopeGuard() {
- if (mLevel != -1) {
- gCurrentLogger.write_stream(mLevel,mChan) << mMsg << " ... end" << gCurrentLogger.endline() << std::flush;
- }
-}
-
-void cDebugScopeGuard::Assign(const string &chan, const int level, const string &msg) {
- mChan=chan;
- mLevel=level;
- mMsg=msg;
-}
-
-} // namespace nDetail
-
-// ====================================================================
-
-cLogger::cLogger() :
-mStream(NULL),
-mStreamBrokenDebug(NULL),
-mIsBroken(true), // before constructor finishes
-mLevel(_debug_level_nr_warn),
-mThread2Number_Biggest(0), // the CURRENT biggest value (no thread yet in map)
-mPid2Number_Biggest(0)
-{
- mStream = & std::cout;
- mStreamBrokenDebug = & std::cerr; // the backup stream
- *mStreamBrokenDebug << "Creating the logger system" << endl;
- mIsBroken=false; // ok, constr. succeeded, so string is not broken now
-
- // this is here, because it could be using logging itself to log creation of first thread/PID etc
- Thread2Number( boost::this_thread::get_id() ); // convert current id to short number, useful to reserve a number so that main thread is usually called 1
- Pid2Number( getpid() ); // add this proces ID as first one
-}
-
-cLogger::~cLogger() {
- for (auto pair : mChannels) {
- std::ofstream *ptr = pair.second;
- delete ptr;
- pair.second=NULL;
- }
-}
-
-void cLogger::SetStreamBroken() {
- SetStreamBroken("(no additional details about this problem)");
-}
-
-void cLogger::SetStreamBroken(const std::string &msg) {
- _dbg_dbg("Stream is broken (msg: " << msg << ")");
- if (!mIsBroken) { // if not already marked as broken
- _dbg_dbg("(It was not broken before)");
- std::cerr << OT_CODE_STAMP << "WARNING: due to a problem in the debug/logging system itself ("<<msg<<") - we are switching back to fallback stream (e.g. cerr)" << std::endl;
- if (mStreamBrokenDebug == nullptr) {
- std::cerr << OT_CODE_STAMP << " ERROR: in addition, while reporting this problem, mStreamBrokenDebug stream is NULL: " << mStreamBrokenDebug << std::endl;
- } else {
- (*mStreamBrokenDebug) << OT_CODE_STAMP << "WARNING: due to debug stream problem ("<<msg<<") - switching back to fallback stream (e.g. cerr)" << std::endl;
- }
- mIsBroken = true;
- }
-}
-
-std::ostream & cLogger::write_stream(int level) {
- return write_stream(level,"");
-}
-
-std::ostream & cLogger::write_stream(int level, const std::string & channel ) {
- _dbg_dbg("level="<<level<<" channel="<<channel);
- if (level >= mLevel) {
- if (mStream) { // TODO now disabling mStream also disables writting to any channel
- _dbg_dbg("Selecting output...");
- ostream & output = SelectOutput(level,channel);
- _dbg_dbg("Selecting output... done, output=" << (void*)(&output));
- #if defined(OS_TYPE_WINDOWS)
- output << windows_stream(level);
- #endif
- output << icon(level) << ' ';
- boost::thread::id this_id = boost::this_thread::get_id();
- output << "{" << Thread2Number(this_id) << "}";
- auto nicePid = Pid2Number(getpid());
- if (nicePid>0) output << " {p" << nicePid << "}";
- output << ' ';
- return output; // <--- return
- } else _dbg_dbg("Not writting: No mStream");
- } else _dbg_dbg("Not writting: Too low level level="<<level<<" not >= mLevel="<<mLevel);
- return g_nullstream;
-}
-
-std::string cLogger::GetLogBaseDir() const {
- return "log";
-}
-
-void cLogger::OpenNewChannel(const std::string & channel) noexcept {
- try {
- _dbg_dbg("Openning channel for channel="<<channel);
- OpenNewChannel_(channel);
- }
- catch (const std::exception &except) {
- SetStreamBroken(OT_CODE_STAMP + " Got exception when opening debug channel: " + ToStr(except.what()));
- }
- catch (...) {
- SetStreamBroken(OT_CODE_STAMP + " Got not-standard exception when opening debug channel.");
- }
-}
-
-void cLogger::OpenNewChannel_(const std::string & channel) { // channel=="net/sleep"
- _dbg_dbg("Openning channel for channel="<<channel);
- size_t last_split = channel.find_last_of(cFilesystemUtils::GetDirSeparatorInter());
-
- string fname_system; // the full file name in system format
-
- if (last_split==string::npos) { // The channel name has no directory, eg channel=="test"
- string dir = GetLogBaseDir();
- string basefile = channel + ".log";
- string fname = dir + cFilesystemUtils::GetDirSeparatorInter() + basefile;
- fname_system = cFilesystemUtils::FileInternalToSystem(fname); // <-
- }
- else { // there is a directory eg channel=="net/sleep"
- // net/sleep
- // ^----- last_split
- string dir = GetLogBaseDir() + cFilesystemUtils::GetDirSeparatorInter() + channel.substr(0, last_split);
- string basefile = channel.substr(last_split+1) + ".log";
- string fname = dir + cFilesystemUtils::GetDirSeparatorInter() + basefile;
- fname_system = cFilesystemUtils::FileInternalToSystem(fname); // <-
- bool dirok = cFilesystemUtils::CreateDirTree(dir);
- if (!dirok) { string err = "In logger failed to open directory (" + dir +") for channel (" + channel +")"; throw std::runtime_error(err); }
- }
-
- _dbg_dbg("Openning fname_system="<<fname_system);
- std::ofstream * thefile = new std::ofstream( fname_system.c_str() ); // file system
- *thefile << "====== Log opened: " << fname_system << " (in " << ((void*)thefile) << ") ======" << endl;
-// cerr << "====== Log opened: " << fname_system << " (in " << ((void*)thefile) << ") ======" << endl;
- _dbg_dbg( "====== Log opened: " << fname_system << " (in " << ((void*)thefile) << ") ======" );
- mChannels.insert( std::pair<string,std::ofstream*>(channel , thefile ) ); // <- created the channel mapping
-}
-
-std::ostream & cLogger::SelectOutput(int level, const std::string & channel) noexcept {
- try {
- if (mIsBroken) {
- _dbg_dbg("The stream is broken mIsBroken="<<mIsBroken<<" so will return backup stream");
- return *mStreamBrokenDebug;
- }
- if (channel=="") {
- _dbg_dbg("No channel given (channel="<<channel<<") so will return main stream");
- return *mStream;
- }
-
- auto obj = mChannels.find(channel);
- if (obj == mChannels.end()) { // not found - need to make new channel
- _dbg_dbg("No stream openened for channel="<<channel<<" so will create it now");
- OpenNewChannel(channel); // <- create channel
- obj = mChannels.find(channel); // find again
- if (obj == mChannels.end()) { // still not found! something is wrong
- SetStreamBroken( OT_CODE_STAMP + " WARNING: can not get stream for channel="+ToStr(channel)+" level="+ToStr(channel) );
- return *mStreamBrokenDebug;
- }
- }
- auto the_stream_ptr = obj->second;
- _dbg_dbg("Found the stream file for channel="<<channel<<" as the_stream_ptr="<<the_stream_ptr);
- ASRT(the_stream_ptr);
- return *the_stream_ptr; // <--- RETURN
- }
- catch (std::exception &except) {
- SetStreamBroken( OT_CODE_STAMP + " Got exception: " + ToStr(except.what()) );
- _dbg_dbg("Exception! Returning broken stream");
- return *mStreamBrokenDebug;
- }
- catch (...) {
- SetStreamBroken( OT_CODE_STAMP + " Got not-standard exception.");
- _dbg_dbg("Exception! Returning broken stream");
- return *mStreamBrokenDebug;
- }
-
- // dead code
-}
-
-void cLogger::setOutStreamFile(const string &fname) { // switch to using this file
- _mark("WILL SWITCH DEBUG NOW to file: " << fname);
- mOutfile = make_unique<std::ofstream>(fname);
- mStream = & (*mOutfile);
- _mark("Started new debug, to file: " << fname);
-}
-
-void cLogger::setOutStreamFromGlobalOptions() {
- if ( gRunOptions.getDebug() ) {
- if ( gRunOptions.getDebugSendToFile() ) {
- mOutfile = make_unique<std::ofstream> ("debuglog.txt");
- mStream = & (*mOutfile);
- }
- else if ( gRunOptions.getDebugSendToCerr() ) {
- mStream = & std::cerr;
- }
- else {
- mStream = & g_nullstream;
- }
- }
- else {
- mStream = & g_nullstream;
- }
-}
-
-void cLogger::setDebugLevel(int level) {
- bool note_before = (mLevel > level); // report the level change before or after the change? (on higher level)
- if (note_before) _note("Setting debug level to "<<level);
- mLevel = level;
- if (!note_before) _note("Setting debug level to "<<level);
-}
-
-std::string cLogger::icon(int level) const {
- // TODO replan to avoid needles converting back and forth char*, string etc
-
- using namespace zkr;
- #if defined(OS_TYPE_POSIX)
- if (level >= 100) return cc::back::lightred + ToStr(cc::fore::lightyellow) + ToStr("ERROR ") + ToStr(cc::fore::lightyellow) + " " ;
- if (level >= 90) return cc::back::lightyellow + ToStr(cc::fore::black) + ToStr("Warn ") + ToStr(cc::fore::red)+ " " ;
- if (level >= 80) return cc::back::lightmagenta + ToStr(cc::fore::black) + ToStr("MARK "); //+ zkr::cc::console + ToStr(cc::fore::lightmagenta)+ " ";
- if (level >= 75) return cc::back::lightyellow + ToStr(cc::fore::black) + ToStr("FACT ") + zkr::cc::console + ToStr(cc::fore::lightyellow)+ " ";
- if (level >= 70) return cc::fore::green + ToStr("Note ");
- if (level >= 50) return cc::fore::cyan + ToStr("info ");
- if (level >= 40) return cc::fore::lightwhite + ToStr("dbg ");
- if (level >= 30) return cc::fore::lightblue + ToStr("dbg ");
- if (level >= 20) return cc::fore::blue + ToStr("dbg ");
-
- #elif defined(OS_TYPE_WINDOWS)
- if (level >= 100) return ToStr("ERROR ");
- if (level >= 90) return ToStr("Warn ");
- if (level >= 80) return ToStr("MARK ");
- if (level >= 75) return ToStr("FACT ");
- if (level >= 70) return ToStr("Note ");
- if (level >= 50) return ToStr("info ");
- if (level >= 40) return ToStr("dbg ");
- if (level >= 30) return ToStr("dbg ");
- if (level >= 20) return ToStr("dbg ");
- #endif
-
- return " ";
-}
-
-std::string cLogger::endline() const {
- #if defined(OS_TYPE_POSIX)
- return ToStr("") + zkr::cc::console + ToStr("\n"); // TODO replan to avoid needles converting back and forth char*, string etc
- #elif defined(OS_TYPE_WINDOWS)
- return ToStr("\n");
- #endif
-}
-
-int cLogger::Thread2Number(const boost::thread::id id) {
- auto found = mThread2Number.find( id );
- if (found == mThread2Number.end()) { // new one
- mThread2Number_Biggest++;
- mThread2Number[id] = mThread2Number_Biggest;
- _info_c("dbg/main", "This is a new thread (used in debug), thread id="<<id); // can cause some recursion
- return mThread2Number_Biggest;
- } else {
- return mThread2Number[id];
- }
-}
-
-int cLogger::Pid2Number(const t_anypid id) {
- auto found = mPid2Number.find( id );
- if (found == mPid2Number.end()) { // new one
- mPid2Number_Biggest++;
- mPid2Number[id] = mPid2Number_Biggest;
- _info_c("dbg/main", "This is a new process (used in debug), process pid="<<id); // can cause some recursion
- return mPid2Number_Biggest;
- } else {
- return mPid2Number[id];
- }
-}
-
-// ====================================================================
-// object gCurrentLogger is defined later - in global namespace below
-
-
-// ====================================================================
-// vector debug
-
-void DisplayStringEndl(std::ostream & out, const std::string text) {
- out << text;
- out << std::endl;
-}
-
-std::string SpaceFromEscape(const std::string &s) {
- std::ostringstream newStr;
- for(size_t i = 0; i < s.length();i++) {
- if(s[i] == '\\' && s[i+1] ==32)
- newStr<<"";
- else
- newStr<<s[i];
- }
- return newStr.str();
-}
-
-std::string EscapeFromSpace(const std::string &s) {
- std::ostringstream newStr;
- for(size_t i = 0; i < s.length();i++) {
- if(s[i] == 32)
- newStr << "\\" << " ";
- else
- newStr << s[i];
- }
- return newStr.str();
-}
-
-
-std::string EscapeString(const std::string &s) {
- std::ostringstream newStr;
- for(size_t i = 0; i < s.length();i++) {
- if(s[i] >=32 && s[i] <= 126)
- newStr<<s[i];
- else
- newStr<<"\\"<< (int) s[i];
- }
-
- return newStr.str();
-}
-
-
-bool CheckIfBegins(const std::string & beggining, const std::string & all) {
- if (all.compare(0, beggining.length(), beggining) == 0) {
- return 1;
- }
- else {
- return 0;
- }
-}
-
-bool CheckIfEnds (std::string const & ending, std::string const & all){
- if (all.length() >= ending.length()) {
- return (0 == all.compare (all.length() - ending.length(), ending.length(), ending));
- } else {
- return false;
- }
-}
-
-
-vector<string> WordsThatMatch(const std::string & sofar, const vector<string> & possib) {
- vector<string> ret;
- for ( auto rec : possib) { // check of possibilities
- if (CheckIfBegins(sofar,rec)) {
- rec = EscapeFromSpace(rec);
- ret.push_back(rec); // this record matches
- }
- }
- return ret;
-}
-
-char GetLastChar(const std::string & str) { // TODO unicode?
- auto s = str.length();
- if (s==0) throw std::runtime_error("Getting last character of empty string (" + ToStr(s) + ")" + OT_CODE_STAMP);
- return str.at( s - 1);
-}
-
-std::string GetLastCharIf(const std::string & str) { // TODO unicode?
- auto s = str.length();
- if (s==0) return ""; // empty string signalizes ther is nothing to be returned
- return std::string( 1 , str.at( s - 1) );
-}
-
-// ====================================================================
-
-// ASRT - assert. Name like ASSERT() was too long, and ASS() was just... no.
-// Use it like this: ASRT( x>y ); with the semicolon at end, a clever trick forces this syntax :)
-
-void Assert(bool result, const std::string &stamp, const std::string &condition) {
- if (!result) {
- _erro("Assert failed at "+stamp+": ASSERT( " << condition << ")");
- throw std::runtime_error("Assert failed at "+stamp+": ASSERT( " + condition + ")");
- }
-}
-
-// ====================================================================
-// advanced string
-
-const std::string GetMultiline(string endLine) {
- std::string result(""); // Taken from OT_CLI_ReadUntilEOF
- while (true) {
- std::string input_line("");
- if (std::getline(std::cin, input_line, '\n'))
- {
- input_line += "\n";
- if (input_line[0] == '~')
- break;
- result += input_line;
- }
- if (std::cin.eof() )
- {
- std::cin.clear();
- break;
- }
- if (std::cin.fail() )
- {
- std::cin.clear();
- break;
- }
- if (std::cin.bad())
- {
- std::cin.clear();
- break;
- }
- }
- return result;
-}
-
-vector<string> SplitString(const string & str){
- std::istringstream iss(str);
- vector<string> vec { std::istream_iterator<string>{iss}, std::istream_iterator<string>{} };
- return vec;
-}
-
-bool checkPrefix(const string & str, char prefix) {
- if (str.at(0) == prefix)
- return true;
- return false;
-}
-
-// ====================================================================
-// operation on files
-
-
-#ifdef __unix
-
-void cEnvUtils::GetTmpTextFile() {
- // TODO make this name configurable (depending on project)
- char filename[] = "/tmp/otshellutils_text.XXXXXX";
- fd = mkstemp(filename);
- if (fd == -1) {
- _erro("Can't create the file: " << filename);
- return;
- }
- mFilename = filename;
-}
-
-void cEnvUtils::CloseFile() {
- close(fd);
- unlink( mFilename.c_str() );
-}
-
-void cEnvUtils::OpenEditor() {
- char* editor = std::getenv("OT_EDITOR"); //TODO Read editor from configuration file
- if (editor == NULL)
- editor = std::getenv("VISUAL");
- if (editor == NULL)
- editor = std::getenv("EDITOR");
-
- string command;
- if (editor != NULL)
- command = ToStr(editor) + " " + mFilename;
- else
- command = "/usr/bin/editor " + mFilename;
- _dbg3("Opening editor with command: " << command);
- if ( system( command.c_str() ) == -1 )
- _erro("Cannot execute system command: " << command);
-}
-
-const string cEnvUtils::ReadFromTmpFile() {
- std::ifstream ifs(mFilename);
- string msg((std::istreambuf_iterator<char>(ifs)), std::istreambuf_iterator<char>());
- return msg;
-}
-
-const string cEnvUtils::Compose() {
- GetTmpTextFile();
- OpenEditor();
- string input = ReadFromTmpFile();
- CloseFile();
- return input;
-}
-
-#endif
-
-const string cEnvUtils::ReadFromFile(const string path) {
- std::ifstream ifs(path);
- string msg((std::istreambuf_iterator<char>(ifs)), std::istreambuf_iterator<char>());
- return msg;
-}
-
-void hintingToTxt(std::fstream & file, string command, vector<string> &commands) {
- if(file.good()) {
- file<<command<<"~"<<endl;
- for (auto a: commands) {
- file <<a<< " ";
- file.flush();
- }
- file<<endl;
- }
-}
-
-string stringToColor(const string &hash) {
- // Generete vector with all possible light colors
- vector <string> lightColors;
- using namespace zkr;
- lightColors.push_back(cc::fore::lightblue);
- lightColors.push_back(cc::fore::lightred);
- lightColors.push_back(cc::fore::lightmagenta);
- lightColors.push_back(cc::fore::lightgreen);
- lightColors.push_back(cc::fore::lightcyan);
- lightColors.push_back(cc::fore::lightyellow);
- lightColors.push_back(cc::fore::lightwhite);
-
- int sum=0;
-
- for (auto ch : hash) sum+=ch;
- auto color = sum%(lightColors.size()-1);
-
- return lightColors.at( color );
-}
-
-
-// ====================================================================
-// algorthms
-
-
-} // namespace nUtil
-
-
-} // namespace OT
-
-// global namespace
-
-const extern int _dbg_ignore = 0; // see description in .hpp
-
-std::string GetObjectName() {
- //static std::string * name=nullptr;
- //if (!name) name = new std::string("(global)");
- return "";
-}
-
-// ====================================================================
-
-nOT::nUtils::cLogger gCurrentLogger;
-
diff --git a/contrib/otshell_utils/utils.hpp b/contrib/otshell_utils/utils.hpp
deleted file mode 100644
index 98508b565..000000000
--- a/contrib/otshell_utils/utils.hpp
+++ /dev/null
@@ -1,532 +0,0 @@
-/// @file
-/// @author rfree (current maintainer in monero.cc project)
-/// @brief various general utils taken from (and relate to) otshell project, including loggiang/debug
-
-/* See other files here for the LICENCE that applies here. */
-
-#include "ccolor.hpp"
-#ifndef INCLUDE_OT_NEWCLI_UTILS
-#define INCLUDE_OT_NEWCLI_UTILS
-
-#include "lib_common1.hpp"
-#ifdef __unix
- #include <unistd.h>
-#endif
-
-#if defined(_WIN32)
- #include"windows_stream.h"
-#endif
-
-#ifndef CFG_WITH_TERMCOLORS
- //#error "You requested to turn off terminal colors (CFG_WITH_TERMCOLORS), however currently they are hardcoded (this option to turn them off is not yet implemented)."
-#endif
-
-///Macros related to automatic deduction of class name etc;
-#define MAKE_CLASS_NAME(NAME) private: static std::string GetObjectName() { return #NAME; }
-#define MAKE_STRUCT_NAME(NAME) private: static std::string GetObjectName() { return #NAME; } public:
-
-// define this to debug the debug system itself:
-// #define opt_debug_debug
-
-#ifdef opt_debug_debug
- #define _dbg_dbg(X) do { std::cerr<<"_dbg_dbg: " << OT_CODE_STAMP << " {thread=" << boost::this_thread::get_id()<<"} " \
- << " {pid="<<getpid()<<"} " << ": " << X << std::endl; } while(0)
-#else
- #define _dbg_dbg(X) do { } while(0)
-#endif
-
-namespace nOT {
-
-namespace nUtils {
-
-/// @brief general based for my runtime errors
-class myexception : public std::runtime_error {
- public:
- myexception(const char * what);
- myexception(const std::string &what);
- //virtual ~myexception();
- virtual void Report() const;
-};
-
-/// @macro Use this macro INJECT_OT_COMMON_USING_NAMESPACE_COMMON_1 as a shortcut for various using std::string etc.
-INJECT_OT_COMMON_USING_NAMESPACE_COMMON_1 // <=== namespaces
-
-// ======================================================================================
-/// text trimming functions (they do mutate the passes string); they trim based on std::isspace. also return it's reference again
-/// http://stackoverflow.com/questions/216823/whats-the-best-way-to-trim-stdstring
-std::string & trim(std::string &s); ///< trim text http://stackoverflow.com/questions/216823/whats-the-best-way-to-trim-stdstring
-std::string & ltrim(std::string &s); ///< left trim
-std::string & rtrim(std::string &s); ///< right trim
-
-// ======================================================================================
-
-std::string get_current_time();
-
-// string conversions
-template <class T>
-std::string ToStr(const T & obj) {
- std::ostringstream oss;
- oss << obj;
- return oss.str();
-}
-
-struct cNullstream : std::ostream {
- cNullstream() : std::ios(0), std::ostream(0) {}
-};
-extern cNullstream g_nullstream; // a stream that does nothing (eats/discards data)
-// ========== debug ==========
-// _dbg_ignore is moved to global namespace (on purpose)
-
-// TODO make _dbg_ignore thread-safe everywhere
-
-extern boost::recursive_mutex gLoggerGuard; // the mutex guarding logging/debugging code e.g. protecting streams, files, etc
-
-std::atomic<int> & gLoggerGuardDepth_Get(); // getter for the global singleton of counter (it guarantees initializing it to 0). This counter shows the current recursion (re-entrant) level of debug macros.
-
-// TODO more debug of the debug system:
-// detect lock() error e.g. recursive limit
-// detect stream e.g. operator<< error
-
-#define _debug_level(LEVEL,VAR) do { if (_dbg_ignore< LEVEL) { \
- _dbg_dbg("WRITE DEBUG: LEVEL="<<LEVEL<<" VAR: " << VAR ); \
- auto level=LEVEL; short int part=0; \
- try { \
- boost::lock_guard<boost::recursive_mutex> mutex_guard( nOT::nUtils::gLoggerGuard ); \
- part=1; \
- try { \
- ++nOT::nUtils::gLoggerGuardDepth_Get(); \
-/* int counter = nOT::nUtils::gLoggerGuardDepth_Get(); if (counter!=1) gCurrentLogger.write_stream(100,"")<<"DEBUG-ERROR: recursion, counter="<<counter<<gCurrentLogger.endline(); */ \
- gCurrentLogger.write_stream(LEVEL,"") << nOT::nUtils::get_current_time() << ' ' << OT_CODE_STAMP << ' ' << VAR << gCurrentLogger.endline() << std::flush; \
- part=9; \
- } catch(...) { \
- gCurrentLogger.write_stream(std::max(level,90),"") << nOT::nUtils::get_current_time() << ' ' << OT_CODE_STAMP << ' ' << "(ERROR IN DEBUG)" << gCurrentLogger.endline(); \
- --nOT::nUtils::gLoggerGuardDepth_Get(); throw ; \
- } \
- --nOT::nUtils::gLoggerGuardDepth_Get(); \
- } catch(...) { if (part<8) gCurrentLogger.write_stream(100,"")<<"DEBUG-ERROR: problem in debug mechanism e.g. in locking." <<gCurrentLogger.endline(); throw ; } \
- } } while(0)
-
-// info for code below: oss object is normal stack variable, using it does not need lock protection
-#define _debug_level_c(CHANNEL,LEVEL,VAR) do { if (_dbg_ignore< LEVEL) { \
- _dbg_dbg("WRITE DEBUG: LEVEL="<<LEVEL<<" CHANNEL="<<CHANNEL<<" VAR: " << VAR ); \
- auto level=LEVEL; short int part=0; \
- try { \
- boost::lock_guard<boost::recursive_mutex> mutex_guard( nOT::nUtils::gLoggerGuard ); \
- part=1; \
- try { \
- ++nOT::nUtils::gLoggerGuardDepth_Get(); \
- std::ostringstream oss; \
- oss << nOT::nUtils::get_current_time() << ' ' << OT_CODE_STAMP << ' ' << VAR << gCurrentLogger.endline() << std::flush; \
- std::string as_string = oss.str(); \
- _dbg_dbg("START will write to log LEVEL="<<LEVEL<<" to CHANNEL="<<CHANNEL<<" as_string="<<as_string); \
-/* int counter = nOT::nUtils::gLoggerGuardDepth_Get(); if (counter!=1) gCurrentLogger.write_stream(100,"")<<"DEBUG-ERROR: recursion, counter="<<counter<<gCurrentLogger.endline(); */ \
- gCurrentLogger.write_stream(LEVEL,"" ) << as_string << gCurrentLogger.endline() << std::flush; \
- gCurrentLogger.write_stream(LEVEL,CHANNEL) << as_string << gCurrentLogger.endline() << std::flush; \
- _dbg_dbg("DONE will write to log LEVEL="<<LEVEL<<" to CHANNEL="<<CHANNEL<<" as_string="<<as_string); \
- part=9; \
- } catch(...) { \
- gCurrentLogger.write_stream(std::max(level,90),CHANNEL) << nOT::nUtils::get_current_time() << ' ' << OT_CODE_STAMP << ' ' << "(ERROR IN DEBUG)" << gCurrentLogger.endline(); \
- --nOT::nUtils::gLoggerGuardDepth_Get(); throw ; \
- } \
- --nOT::nUtils::gLoggerGuardDepth_Get(); \
- } catch(...) { if (part<8) gCurrentLogger.write_stream(100,CHANNEL)<<"DEBUG-ERROR: problem in debug mechanism e.g. in locking." <<gCurrentLogger.endline(); throw ; } \
- } } while(0)
-
-// Numerical values of the debug levels - are defined here as const ints. Full name (with namespace) given for clarity.
-extern const int _debug_level_nr_dbg3;
-extern const int _debug_level_nr_dbg2;
-extern const int _debug_level_nr_dbg1;
-extern const int _debug_level_nr_info;
-extern const int _debug_level_nr_note;
-extern const int _debug_level_nr_fact;
-extern const int _debug_level_nr_mark;
-extern const int _debug_level_nr_warn;
-extern const int _debug_level_nr_erro;
-
-#define _dbg3(VAR) _debug_level( nOT::nUtils::_debug_level_nr_dbg3,VAR) // details - most detailed
-#define _dbg2(VAR) _debug_level( nOT::nUtils::_debug_level_nr_dbg2,VAR) // details - a bit more important
-#define _dbg1(VAR) _debug_level( nOT::nUtils::_debug_level_nr_dbg1,VAR) // details - more important
-#define _info(VAR) _debug_level( nOT::nUtils::_debug_level_nr_info,VAR) // information
-#define _note(VAR) _debug_level( nOT::nUtils::_debug_level_nr_note,VAR) // more interesting information
-#define _fact(VAR) _debug_level( nOT::nUtils::_debug_level_nr_fact,VAR) // interesting events that could be interesting even for user, for logical/business things
-#define _mark(VAR) _debug_level( nOT::nUtils::_debug_level_nr_mark,VAR) // marked actions
-#define _warn(VAR) _debug_level( nOT::nUtils::_debug_level_nr_warn,VAR) // some problems
-#define _erro(VAR) _debug_level( nOT::nUtils::_debug_level_nr_erro,VAR) // errors
-
-#define _dbg3_c(C,VAR) _debug_level_c(C, nOT::nUtils::_debug_level_nr_dbg3, VAR) // details - most detailed
-#define _dbg2_c(C,VAR) _debug_level_c(C, nOT::nUtils::_debug_level_nr_dbg2, VAR) // details - a bit more important
-#define _dbg1_c(C,VAR) _debug_level_c(C, nOT::nUtils::_debug_level_nr_dbg1, VAR) // details - more important
-#define _info_c(C,VAR) _debug_level_c(C, nOT::nUtils::_debug_level_nr_info, VAR) // information
-#define _note_c(C,VAR) _debug_level_c(C, nOT::nUtils::_debug_level_nr_note, VAR) // more interesting information
-#define _fact_c(C,VAR) _debug_level_c(C, nOT::nUtils::_debug_level_nr_fact, VAR) // interesting events that could be interesting even for user, for logical/business things
-#define _mark_c(C,VAR) _debug_level_c(C, nOT::nUtils::_debug_level_nr_mark, VAR) // marked actions
-#define _warn_c(C,VAR) _debug_level_c(C, nOT::nUtils::_debug_level_nr_warn, VAR) // some problems
-#define _erro_c(C,VAR) _debug_level_c(C, nOT::nUtils::_debug_level_nr_erro, VAR) // errors
-
-// lock // because of VAR
-#define _scope_debug_level_c(CHANNEL,LEVEL,VAR) \
- std::ostringstream debug_detail_oss; \
- nOT::nUtils::gLoggerGuard.lock(); \
- debug_detail_oss << OT_CODE_STAMP << ' ' << VAR ; \
- nOT::nUtils::nDetail::cDebugScopeGuard debugScopeGuard; \
- if (_dbg_ignore<LEVEL) debugScopeGuard.Assign(CHANNEL,LEVEL, debug_detail_oss.str()); \
- if (_dbg_ignore<LEVEL) _debug_level_c(CHANNEL,LEVEL,debug_detail_oss.str() + " ... begin"); \
- nOT::nUtils::gLoggerGuard.unlock();
-#define _scope_debug_level(LEVEL,VAR) _scope_debug_level_c("",LEVEL,VAR)
-
-#define _scope_dbg1(VAR) _scope_debug_level( _debug_level_nr_dbg3, VAR)
-#define _scope_dbg2(VAR) _scope_debug_level( _debug_level_nr_dbg2, VAR)
-#define _scope_dbg3(VAR) _scope_debug_level( _debug_level_nr_dbg1, VAR)
-#define _scope_info(VAR) _scope_debug_level( _debug_level_nr_info, VAR)
-#define _scope_note(VAR) _scope_debug_level( _debug_level_nr_note, VAR)
-#define _scope_fact(VAR) _scope_debug_level( _debug_level_nr_fact, VAR)
-#define _scope_mark(VAR) _scope_debug_level( _debug_level_nr_mark, VAR)
-#define _scope_warn(VAR) _scope_debug_level( _debug_level_nr_warn, VAR)
-#define _scope_erro(VAR) _scope_debug_level( _debug_level_nr_erro, VAR)
-
-/***
-@brief do not use this namespace directly, it is implementation detail.
-*/
-namespace nDetail {
-
-/***
-@brief a Debug scope-guard, to log a debug message when current scope is left. Do NOT use this directly,
-only use it via the macros like _scope_dbg1 etc.
-*/
-class cDebugScopeGuard {
- protected:
- string mMsg;
- int mLevel;
- string mChan;
- public:
- cDebugScopeGuard();
- ~cDebugScopeGuard();
- void Assign(const string &chan, const int level, const string &msg);
-};
-
-const char* DbgShortenCodeFileName(const char *s); ///< Returns a pointer to some part of the string that was given, skipping directory names, for log/debug
-
-} // namespace nDetail
-
-// ========== logger ==========
-
-namespace nDetail {
- struct channel_use_info;
-} // namespace nDetail
-
-/***
-@brief Class to write debug into. Used it by calling the debug macros _dbg1(...) _info(...) _erro(...) etc, NOT directly!
-@author rfree (maintainer)
-@thread this class is NOT thread safe and must used only by one thread at once (use it via ot_debug_macros like _info macro they do proper locking)
-*/
-class cLogger {
- public:
- cLogger();
- ~cLogger();
- std::ostream & write_stream(int level); ///< starts a new message on given level (e.g. writes out the icon/tag) and returns stream to output to
- std::ostream & write_stream(int level, const std::string & channel); ///< the same but with name of the debug channel
-
- void setOutStreamFromGlobalOptions(); // set debug level, file etc - according to global Options
- void setOutStreamFile(const std::string &fname); // switch to using this file
- void setDebugLevel(int level); // change the debug level e.g. to mute debug from now
-
- std::string icon(int level) const; ///< returns "icon" for given debug level. It is text, might include color controll characters
- std::string endline() const; ///< returns string to be written at end of message
-
- protected:
- typedef long int t_anypid; // a portable representation of PID. long int should cover all platforms
-
- void SetStreamBroken(); ///< call in case of internal error in logger (e.g. can not open a file)
- void SetStreamBroken(const std::string &msg); ///< same but with error message
-
- unique_ptr<std::ofstream> mOutfile;
- std::ostream * mStream; ///< pointing only! can point to our own mOutfile, or maye to global null stream
- std::ostream * mStreamBrokenDebug; ///< pointing only! this is a pointer to some stream that should be used when normal debugging is broken eg std::cerr
- bool mIsBroken; ///< is the debugging system broken (this should be set when internal problems occur and should cause fallback to std::cerr)
-
- std::map< std::string , std::ofstream * > mChannels; // the ofstream objects are owned by this class
-
- int mLevel; ///< current debug level
-
- std::ostream & SelectOutput(int level, const std::string & channel) noexcept; ///< returns a proper stream for this level and channel (always usable string)
- void OpenNewChannel(const std::string & channel) noexcept; ///< tries to prepare this channel. does NOT guarantee to created mChannels[] entry!
- void OpenNewChannel_(const std::string & channel); ///< internal function, will throw in case of problems
- std::string GetLogBaseDir() const;
-
- std::map< boost::thread::id , int > mThread2Number; ///< change long thread IDs into a short nice number to show
- int mThread2Number_Biggest; ///< current biggest value held there (biggest key) - works as growing-only counter basically
- int Thread2Number(const boost::thread::id id); ///< convert the system's thread id into a nice short our id; make one if new thread
-
- std::map< t_anypid , int > mPid2Number; ///< change long proces PID into a short nice number to show
- int mPid2Number_Biggest; ///< current biggest value held there (biggest key) - works as growing-only counter basically
- int Pid2Number(const t_anypid id); ///< convert the system's PID id into a nice short our id; make one if new thread
-};
-
-
-
-// ====================================================================
-// vector debug
-
-template <class T>
-std::string vectorToStr(const T & v) {
- std::ostringstream oss;
- for(auto rec: v) {
- oss << rec <<",";
- }
- return oss.str();
-}
-
-template <class T>
-void DisplayVector(std::ostream & out, const std::vector<T> &v, const std::string &delim=" ") {
- std::copy( v.begin(), v.end(), std::ostream_iterator<T>(out, delim.c_str()) );
-}
-
-template <class T>
-void EndlDisplayVector(std::ostream & out, const std::vector<T> &v, const std::string &delim=" ") {
- out << std::endl;
- DisplayVector(out,v,delim);
-}
-
-template <class T>
-void DisplayVectorEndl(std::ostream & out, const std::vector<T> &v, const std::string &delim=" ") {
- DisplayVector(out,v,delim);
- out << std::endl;
-}
-
-template <class T>
-void DbgDisplayVector(const std::vector<T> &v, const std::string &delim=" ") {
- std::cerr << "[";
- std::copy( v.begin(), v.end(), std::ostream_iterator<T>(std::cerr, delim.c_str()) );
- std::cerr << "]";
-}
-
-string stringToColor(const string &hash);
-template <class T, class T2>
-void DisplayMap(std::ostream & out, const std::map<T, T2> &m, const std::string &delim=" ") {
- auto *no_color = zkr::cc::fore::console;
- for(auto var : m) {
- out << stringToColor(var.first) << var.first << delim << var.second << no_color << endl;
- }
-
-}
-
-template <class T, class T2>
-void EndlDisplayMap(std::ostream & out, const std::map<T, T2> &m, const std::string &delim=" ") {
- out << endl;
- for(auto var : m) {
- out << var.first << delim << var.second << endl;
- }
-}
-
-template <class T, class T2>
-void DbgDisplayMap(const std::map<T, T2> &m, const std::string &delim=" ") {
- for(auto var : m) {
- std::cerr << var.first << delim << var.second << endl;
- }
-}
-
-
-template <class T>
-void DbgDisplayVectorEndl(const std::vector<T> &v, const std::string &delim=" ") {
- DbgDisplayVector(v,delim);
- std::cerr << std::endl;
-}
-
-void DisplayStringEndl(std::ostream & out, const std::string text);
-
-bool CheckIfBegins(const std::string & beggining, const std::string & all);
-bool CheckIfEnds (std::string const & ending, std::string const & all);
-std::string SpaceFromEscape(const std::string &s);
-std::string EscapeFromSpace(const std::string &s);
-vector<string> WordsThatMatch(const std::string & sofar, const vector<string> & possib);
-char GetLastChar(const std::string & str);
-std::string GetLastCharIf(const std::string & str); // TODO unicode?
-std::string EscapeString(const std::string &s);
-
-
-template <class T>
-std::string DbgVector(const std::vector<T> &v, const std::string &delim="|") {
- std::ostringstream oss;
- oss << "[";
- bool first=true;
- for(auto vElement : v) { if (!first) oss<<delim; first=false; oss <<vElement ; }
- oss << "]";
- //std::copy( v.begin(), v.end(), std::ostream_iterator<T>(oss, delim.c_str()) );
- return oss.str();
-}
-
-template <class T>
-std::ostream & operator<<(std::ostream & os, const map< T, vector<T> > & obj){
- os << "[";
- for(auto const & elem : obj) {
- os << " [" << elem.first << "=" << DbgVector(elem.second) << "] ";
- }
- os << "]";
- return os;
-}
-
-template <class T, class T2>
-std::string DbgMap(const map<T, T2> & map) {
- std::ostringstream oss;
- oss << map;
- return oss.str();
-}
-
-// ====================================================================
-// assert
-
-// ASRT - assert. Name like ASSERT() was too long, and ASS() was just... no.
-// Use it like this: ASRT( x>y ); with the semicolon at end, a clever trick forces this syntax :)
-#define ASRT(x) do { if (!(x)) nOT::nUtils::Assert(false, OT_CODE_STAMP, #x); } while(0)
-
-void Assert(bool result, const std::string &stamp, const std::string &condition);
-
-// ====================================================================
-// advanced string
-
-const std::string GetMultiline(string endLine = "~");
-vector<string> SplitString(const string & str);
-
-bool checkPrefix(const string & str, char prefix = '^');
-
-// ====================================================================
-// nUse utils
-
-enum class eSubjectType {Account, Asset, User, Server, Unknown};
-
-string SubjectType2String(const eSubjectType & type);
-eSubjectType String2SubjectType(const string & type);
-
-// ====================================================================
-// operation on files
-
-/// @brief tools related to filesystem
-/// @author rfree (maintainer)
-class cFilesystemUtils { // if we do not want to use boost in given project (or we could optionally write boost here later)
- public:
- static bool CreateDirTree(const std::string & dir, bool only_below=false);
- static char GetDirSeparatorSys(); /// < eg '/' or '\'
- static char GetDirSeparatorInter(); /// < internal is '/'
- static string FileInternalToSystem(const std::string &name); ///< converts from internal file name string to system file name string
- static string FileSystemToInternal(const std::string &name); ///< converts from system file name string to internal file name string
-};
-
-
-/// @brief utils to e.g. edit a file from console
-/// @author rfree (maintainer)
-class cEnvUtils {
- int fd;
- string mFilename;
-
- void GetTmpTextFile();
- void CloseFile();
- void OpenEditor();
- const string ReadFromTmpFile();
-public:
- const string Compose();
- const string ReadFromFile(const string path);
-};
-void hintingToTxt(std::fstream & file, string command, vector<string> &commands);
-void generateQuestions (std::fstream & file, string command);
-void generateAnswers (std::fstream & file, string command, vector<string> &completions);
-
-// ====================================================================
-
-namespace nOper { // nOT::nUtils::nOper
-// cool shortcut operators, like vector + vecotr operator working same as string (appending)
-// isolated to namespace because it's unorthodox ide to implement this
-
-using namespace std;
-
-// TODO use && and move?
-template <class T>
-vector<T> operator+(const vector<T> &a, const vector<T> &b) {
- vector<T> ret = a;
- ret.insert( ret.end() , b.begin(), b.end() );
- return ret;
-}
-
-template <class T>
-vector<T> operator+(const T &a, const vector<T> &b) {
- vector<T> ret(1,a);
- ret.insert( ret.end() , b.begin(), b.end() );
- return ret;
-}
-
-template <class T>
-vector<T> operator+(const vector<T> &a, const T &b) {
- vector<T> b_vector(1,a);
- return a + b_vector;
-}
-
-template <class T>
-vector<T>& operator+=(vector<T> &a, const vector<T> &b) {
- a.insert( a.end() , b.begin(), b.end() );
- return a;
-}
-
-// map
-template <class TK,class TV>
-map<TK,TV> operator+(const map<TK,TV> &a, const map<TK,TV> &b) {
- map<TK,TV> ret = a;
- for (const auto & elem : b) {
- ret.insert(elem);
- }
- return ret;
-}
-
-
-} // nOT::nUtils::nOper
-
-// ====================================================================
-
-// ====================================================================
-
-// Algorithms
-
-// ====================================================================
-// ====================================================================
-
-
-/**
-@brief Special type that on creation will be initialized to have value INIT given as template argument.
-Might be usefull e.g. to express in the declaration of class what will be the default value of member variable
-See also http://www.boost.org/doc/libs/1_56_0/libs/utility/value_init.htm
-Probably not needed when using boost in your project.
-*/
-template <class T, T INIT>
-class value_init {
- private:
- T data;
- public:
- value_init();
-
- T& operator=(const T& v) { data=v; return *this; }
- operator T const &() const { return data; }
- operator T&() { return data; }
-};
-
-template <class T, T INIT>
-value_init<T, INIT>::value_init() : data(INIT) { }
-
-} // namespace nUtils
-
-} // namespace nOT
-
-
-// global namespace
-extern nOT::nUtils::cLogger gCurrentLogger; ///< The current main logger. Usually do not use it directly, instead use macros like _dbg1 etc
-
-std::string GetObjectName(); ///< Method to return name of current object; To use in debug; Can be shadowed in your classes. (Might be not used currently)
-
-const extern int _dbg_ignore; ///< the global _dbg_ignore, but local code (blocks, classes etc) you could shadow it in your code blocks,
-// to override debug compile-time setting for given block/class, e.g. to disable debug in one of your methods or increase it there.
-// Or to make it runtime by providing a class normal member and editing it in runtime
-
-#define OT_CODE_STAMP ( nOT::nUtils::ToStr("[") + nOT::nUtils::nDetail::DbgShortenCodeFileName(__FILE__) + nOT::nUtils::ToStr("+") + nOT::nUtils::ToStr(__LINE__) + nOT::nUtils::ToStr(" ") + (GetObjectName()) + nOT::nUtils::ToStr("::") + nOT::nUtils::ToStr(__FUNCTION__) + nOT::nUtils::ToStr("]"))
-
-
-
-
-#endif
-
diff --git a/contrib/otshell_utils/windows_stream.cpp b/contrib/otshell_utils/windows_stream.cpp
deleted file mode 100644
index 59d8b12a3..000000000
--- a/contrib/otshell_utils/windows_stream.cpp
+++ /dev/null
@@ -1,64 +0,0 @@
-#if defined(_WIN32)
-#include "windows_stream.h"
-#include <windows.h>
-
-windows_stream::windows_stream(unsigned int pLevel)
- :
- mLevel(pLevel)
-{
-}
-
-std::ostream& operator << (std::ostream &stream, windows_stream const& object)
-{
- HANDLE h_stdout = GetStdHandle(STD_OUTPUT_HANDLE);
-
- if (object.mLevel >= 100)
- {
- SetConsoleTextAttribute(h_stdout, FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_INTENSITY);
- return stream;
- }
- if (object.mLevel >= 90)
- {
- SetConsoleTextAttribute(h_stdout, FOREGROUND_RED | FOREGROUND_INTENSITY | BACKGROUND_GREEN | BACKGROUND_RED | BACKGROUND_INTENSITY);
- return stream;
- }
- if (object.mLevel >= 80)
- {
- SetConsoleTextAttribute(h_stdout, BACKGROUND_BLUE | BACKGROUND_RED | BACKGROUND_INTENSITY);
- return stream;
- }
- if (object.mLevel >= 75)
- {
- SetConsoleTextAttribute(h_stdout, BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_INTENSITY);
- return stream;
- }
- if (object.mLevel >= 70)
- {
- SetConsoleTextAttribute(h_stdout, FOREGROUND_GREEN | FOREGROUND_INTENSITY);
- return stream;
- }
- if (object.mLevel >= 50)
- {
- SetConsoleTextAttribute(h_stdout, FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY);
- return stream;
- }
- if (object.mLevel >= 40)
- {
- SetConsoleTextAttribute(h_stdout, FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_INTENSITY);
- return stream;
- }
- if (object.mLevel >= 30)
- {
- SetConsoleTextAttribute(h_stdout, FOREGROUND_BLUE | FOREGROUND_INTENSITY);
- return stream;
- }
- if (object.mLevel >= 20)
- {
- SetConsoleTextAttribute(h_stdout, FOREGROUND_BLUE);
- return stream;
- }
-
- return stream;
-}
-
-#endif
diff --git a/contrib/otshell_utils/windows_stream.h b/contrib/otshell_utils/windows_stream.h
deleted file mode 100644
index 859e7ee50..000000000
--- a/contrib/otshell_utils/windows_stream.h
+++ /dev/null
@@ -1,20 +0,0 @@
-#ifndef WINDOWS_STREAM_H
-#define WINDOWS_STREAM_H
-
-#if defined(_WIN32)
-
-#include <string>
-#include <iostream>
-
-class windows_stream
-{
-public:
- windows_stream(unsigned int pLevel);
- friend std::ostream& operator<<(std::ostream &stream, windows_stream const& object);
-private:
- unsigned int mLevel = 0;
-};
-
-#endif // _WIN32
-
-#endif // WINDOWS_STREAM_H