wincolor_sink.h
Go to the documentation of this file.
1 //
2 // Copyright(c) 2016 spdlog
3 // Distributed under the MIT License (http://opensource.org/licenses/MIT)
4 //
5 
6 #pragma once
7 
10 #include "opc/spdlog/common.h"
11 
12 #include <mutex>
13 #include <string>
14 #include <map>
15 #include <wincon.h>
16 
17 namespace spdlog
18 {
19 namespace sinks
20 {
21 /*
22  * Windows color console sink. Uses WriteConsoleA to write to the console with colors
23  */
24 template<class Mutex>
25 class wincolor_sink: public base_sink<Mutex>
26 {
27 public:
28  const WORD BOLD = FOREGROUND_INTENSITY;
29  const WORD RED = FOREGROUND_RED;
30  const WORD CYAN = FOREGROUND_GREEN | FOREGROUND_BLUE;
31  const WORD WHITE = FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE;
32  const WORD YELLOW = FOREGROUND_RED | FOREGROUND_GREEN;
33 
34  wincolor_sink(HANDLE std_handle): out_handle_(std_handle)
35  {
38  colors_[level::info] = WHITE | BOLD;
39  colors_[level::warn] = YELLOW | BOLD;
40  colors_[level::err] = RED | BOLD; // red bold
41  colors_[level::critical] = BACKGROUND_RED | WHITE | BOLD; // white bold on red background
42  colors_[level::off] = 0;
43  }
44 
45  virtual ~wincolor_sink()
46  {
47  this->flush();
48  }
49 
50  wincolor_sink(const wincolor_sink& other) = delete;
51  wincolor_sink& operator=(const wincolor_sink& other) = delete;
52 
53 protected:
54  virtual void _sink_it(const details::log_msg& msg) override
55  {
56  auto color = colors_[msg.level];
57  auto orig_attribs = set_console_attribs(color);
58  WriteConsoleA(out_handle_, msg.formatted.data(), static_cast<DWORD>(msg.formatted.size()), nullptr, nullptr);
59  SetConsoleTextAttribute(out_handle_, orig_attribs); //reset to orig colors
60  }
61 
62  virtual void _flush() override
63  {
64  // windows console always flushed?
65  }
66 
67  // change the color for the given level
68  void set_color(level::level_enum level, WORD color)
69  {
70  std::lock_guard<Mutex> lock(base_sink<Mutex>::_mutex);
71  colors_[level] = color;
72  }
73 
74 private:
75  HANDLE out_handle_;
76  std::map<level::level_enum, WORD> colors_;
77 
78  // set color and return the orig console attributes (for resetting later)
79  WORD set_console_attribs(WORD attribs)
80  {
81  CONSOLE_SCREEN_BUFFER_INFO orig_buffer_info;
82  GetConsoleScreenBufferInfo(out_handle_, &orig_buffer_info);
83  WORD back_color = orig_buffer_info.wAttributes;
84  // retrieve the current background color
85  back_color &= ~(FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY);
86  // keep the background color unchanged
87  SetConsoleTextAttribute(out_handle_, attribs | back_color);
88  return orig_buffer_info.wAttributes; //return orig attribs
89  }
90 };
91 
92 //
93 // windows color console to stdout
94 //
95 template<class Mutex>
96 class wincolor_stdout_sink: public wincolor_sink<Mutex>
97 {
98 public:
99  wincolor_stdout_sink() : wincolor_sink<Mutex>(GetStdHandle(STD_OUTPUT_HANDLE))
100  {}
101 };
102 
105 
106 //
107 // windows color console to stderr
108 //
109 template<class Mutex>
111 {
112 public:
113  wincolor_stderr_sink() : wincolor_sink<Mutex>(GetStdHandle(STD_ERROR_HANDLE))
114  {}
115 };
116 
119 
120 }
121 }
virtual void _flush() override
Definition: wincolor_sink.h:62
wincolor_sink & operator=(const wincolor_sink &other)=delete
const Char * data() const FMT_NOEXCEPT
Definition: format.h:2866
wincolor_stdout_sink< details::null_mutex > wincolor_stdout_sink_st
level::level_enum level
Definition: log_msg.h:42
void flush() SPDLOG_FINAL override
Definition: base_sink.h:39
fmt::MemoryWriter formatted
Definition: log_msg.h:46
level::level_enum level() const
Definition: sink.h:46
std::size_t size() const
Definition: format.h:2857
wincolor_stderr_sink< details::null_mutex > wincolor_stderr_sink_st
WORD set_console_attribs(WORD attribs)
Definition: wincolor_sink.h:79
wincolor_stdout_sink< std::mutex > wincolor_stdout_sink_mt
void set_color(level::level_enum level, WORD color)
Definition: wincolor_sink.h:68
std::map< level::level_enum, WORD > colors_
Definition: wincolor_sink.h:76
wincolor_sink(HANDLE std_handle)
Definition: wincolor_sink.h:34
wincolor_stderr_sink< std::mutex > wincolor_stderr_sink_mt
virtual void _sink_it(const details::log_msg &msg) override
Definition: wincolor_sink.h:54


ros_opcua_impl_freeopcua
Author(s): Denis Štogl
autogenerated on Tue Jan 19 2021 03:12:08