]> granicus.if.org Git - icinga2/blob - lib/base/console.cpp
Merge pull request #7185 from Icinga/bugfix/gelfwriter-wrong-log-facility
[icinga2] / lib / base / console.cpp
1 /* Icinga 2 | (c) 2012 Icinga GmbH | GPLv2+ */
2
3 #include "base/console.hpp"
4 #include "base/initialize.hpp"
5 #include <iostream>
6
7 using namespace icinga;
8
9 static ConsoleType l_ConsoleType = Console_Dumb;
10
11 static void InitializeConsole()
12 {
13         l_ConsoleType = Console_Dumb;
14
15 #ifndef _WIN32
16         if (isatty(1))
17                 l_ConsoleType = Console_VT100;
18 #else /* _WIN32 */
19         l_ConsoleType = Console_Windows;
20 #endif /* _WIN32 */
21 }
22
23 INITIALIZE_ONCE(InitializeConsole);
24
25 ConsoleColorTag::ConsoleColorTag(int color, ConsoleType consoleType)
26         : m_Color(color), m_ConsoleType(consoleType)
27 { }
28
29 std::ostream& icinga::operator<<(std::ostream& fp, const ConsoleColorTag& cct)
30 {
31 #ifndef _WIN32
32         if (cct.m_ConsoleType == Console_VT100 || Console::GetType(fp) == Console_VT100)
33                 Console::PrintVT100ColorCode(fp, cct.m_Color);
34 #else /* _WIN32 */
35         if (Console::GetType(fp) == Console_Windows) {
36                 fp.flush();
37                 Console::SetWindowsConsoleColor(fp, cct.m_Color);
38         }
39 #endif /* _WIN32 */
40
41         return fp;
42 }
43
44 void Console::SetType(std::ostream& fp, ConsoleType type)
45 {
46         if (&fp == &std::cout || &fp == &std::cerr)
47         l_ConsoleType = type;
48 }
49
50 ConsoleType Console::GetType(std::ostream& fp)
51 {
52         if (&fp == &std::cout || &fp == &std::cerr)
53                 return l_ConsoleType;
54         else
55                 return Console_Dumb;
56 }
57
58 #ifndef _WIN32
59 void Console::PrintVT100ColorCode(std::ostream& fp, int color)
60 {
61         if (color == Console_Normal) {
62                 fp << "\33[0m";
63                 return;
64         }
65
66         switch (color & 0xff) {
67                 case Console_ForegroundBlack:
68                         fp << "\33[30m";
69                         break;
70                 case Console_ForegroundRed:
71                         fp << "\33[31m";
72                         break;
73                 case Console_ForegroundGreen:
74                         fp << "\33[32m";
75                         break;
76                 case Console_ForegroundYellow:
77                         fp << "\33[33m";
78                         break;
79                 case Console_ForegroundBlue:
80                         fp << "\33[34m";
81                         break;
82                 case Console_ForegroundMagenta:
83                         fp << "\33[35m";
84                         break;
85                 case Console_ForegroundCyan:
86                         fp << "\33[36m";
87                         break;
88                 case Console_ForegroundWhite:
89                         fp << "\33[37m";
90                         break;
91         }
92
93         switch (color & 0xff00) {
94                 case Console_BackgroundBlack:
95                         fp << "\33[40m";
96                         break;
97                 case Console_BackgroundRed:
98                         fp << "\33[41m";
99                         break;
100                 case Console_BackgroundGreen:
101                         fp << "\33[42m";
102                         break;
103                 case Console_BackgroundYellow:
104                         fp << "\33[43m";
105                         break;
106                 case Console_BackgroundBlue:
107                         fp << "\33[44m";
108                         break;
109                 case Console_BackgroundMagenta:
110                         fp << "\33[45m";
111                         break;
112                 case Console_BackgroundCyan:
113                         fp << "\33[46m";
114                         break;
115                 case Console_BackgroundWhite:
116                         fp << "\33[47m";
117                         break;
118         }
119
120         if (color & Console_Bold)
121                 fp << "\33[1m";
122 }
123 #else /* _WIN32 */
124 void Console::SetWindowsConsoleColor(std::ostream& fp, int color)
125 {
126         CONSOLE_SCREEN_BUFFER_INFO consoleInfo;
127         HANDLE hConsole;
128
129         if (&fp == &std::cout)
130                 hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
131         else if (&fp == &std::cerr)
132                 hConsole = GetStdHandle(STD_ERROR_HANDLE);
133         else
134                 return;
135
136         if (!GetConsoleScreenBufferInfo(hConsole, &consoleInfo))
137                 return;
138
139         WORD attrs = 0;
140
141         if (color == Console_Normal)
142                 attrs = FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE;
143
144         switch (color & 0xff) {
145                 case Console_ForegroundBlack:
146                         attrs |= 0;
147                         break;
148                 case Console_ForegroundRed:
149                         attrs |= FOREGROUND_RED;
150                         break;
151                 case Console_ForegroundGreen:
152                         attrs |= FOREGROUND_GREEN;
153                         break;
154                 case Console_ForegroundYellow:
155                         attrs |= FOREGROUND_RED | FOREGROUND_GREEN;
156                         break;
157                 case Console_ForegroundBlue:
158                         attrs |= FOREGROUND_BLUE;
159                         break;
160                 case Console_ForegroundMagenta:
161                         attrs |= FOREGROUND_RED | FOREGROUND_BLUE;
162                         break;
163                 case Console_ForegroundCyan:
164                         attrs |= FOREGROUND_GREEN | FOREGROUND_BLUE;
165                         break;
166                 case Console_ForegroundWhite:
167                         attrs |= FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE;
168                         break;
169         }
170
171         switch (color & 0xff00) {
172                 case Console_BackgroundBlack:
173                         attrs |= 0;
174                         break;
175                 case Console_BackgroundRed:
176                         attrs |= BACKGROUND_RED;
177                         break;
178                 case Console_BackgroundGreen:
179                         attrs |= BACKGROUND_GREEN;
180                         break;
181                 case Console_BackgroundYellow:
182                         attrs |= BACKGROUND_RED | BACKGROUND_GREEN;
183                         break;
184                 case Console_BackgroundBlue:
185                         attrs |= BACKGROUND_BLUE;
186                         break;
187                 case Console_BackgroundMagenta:
188                         attrs |= BACKGROUND_RED | BACKGROUND_BLUE;
189                         break;
190                 case Console_BackgroundCyan:
191                         attrs |= BACKGROUND_GREEN | BACKGROUND_BLUE;
192                         break;
193                 case Console_BackgroundWhite:
194                         attrs |= BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE;
195                         break;
196         }
197
198         if (color & Console_Bold)
199                 attrs |= FOREGROUND_INTENSITY;
200
201         SetConsoleTextAttribute(hConsole, attrs);
202 }
203 #endif /* _WIN32 */