OLD | NEW |
| (Empty) |
1 /* | |
2 * This file is part of Adblock Plus <https://adblockplus.org/>, | |
3 * Copyright (C) 2006-2015 Eyeo GmbH | |
4 * | |
5 * Adblock Plus is free software: you can redistribute it and/or modify | |
6 * it under the terms of the GNU General Public License version 3 as | |
7 * published by the Free Software Foundation. | |
8 * | |
9 * Adblock Plus is distributed in the hope that it will be useful, | |
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
12 * GNU General Public License for more details. | |
13 * | |
14 * You should have received a copy of the GNU General Public License | |
15 * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. | |
16 */ | |
17 | |
18 /* | |
19 Macros CONSOLE, CONSOLE_WARN, CONSOLE_ERROR are used for Console output | |
20 CONSOLE_WAIT waits for user to hit Enter | |
21 In order to see Console output macro USE_CONSOLE should be defined before Cons
ole.h is included. | |
22 Since Console.h is added in PluginStdAfx.h, then 2 ways to log in Console oupu
t: | |
23 1. Uncomment "#define USE_CONSOLE" in PluginStdAfx.h - Console ouput will be a
vailable in all files. | |
24 2. Add "#define USE_CONSOLE" as very first line of a cpp file - Console ouput
will be available in this file | |
25 */ | |
26 | |
27 #pragma once | |
28 | |
29 #if defined(USE_CONSOLE) | |
30 | |
31 #include <Strsafe.h> | |
32 | |
33 enum {eLog = 0, eWarn = 1, eError = 2}; | |
34 | |
35 static long g_consoleCount = -1; | |
36 static bool s_hasError = false; | |
37 | |
38 void CONSOLE(const char* format, ...); | |
39 | |
40 inline void WritelnToConsole(int code, int count, const char* format, va_list ar
gs) | |
41 { | |
42 // In an exe application, if there is an error and exe exists, Console disap
pears and error or warning are not visible | |
43 // On exit destructor will be called and Console waits for keyboard input. | |
44 struct ConsoleWaitReturn | |
45 { | |
46 ConsoleWaitReturn(){} | |
47 ~ConsoleWaitReturn() | |
48 { | |
49 if (s_hasError) | |
50 { | |
51 CONSOLE("Hit 'ENTER' to exit"); | |
52 | |
53 HANDLE hInput = GetStdHandle(STD_INPUT_HANDLE); | |
54 | |
55 wchar_t buf[128]; | |
56 DWORD nRead = 0; | |
57 ReadConsole(hInput, buf, countof(buf), &nRead, 0); | |
58 } | |
59 } | |
60 } static s_ConsoleWaitReturn; | |
61 | |
62 DWORD lastError = GetLastError(); | |
63 | |
64 if (eError == code) | |
65 { | |
66 s_hasError = true; | |
67 } | |
68 | |
69 static bool s_log = false; | |
70 if (!s_log) | |
71 { | |
72 s_log = true; | |
73 | |
74 char log[] = "Log \""; | |
75 | |
76 const int lenLog = sizeof(log) - 1; | |
77 | |
78 char title[lenLog + MAX_PATH + 2]; | |
79 strcpy_s(title, sizeof(title), log); | |
80 | |
81 char* pFileName = title + lenLog; | |
82 | |
83 if (GetModuleFileNameA(0, pFileName, MAX_PATH)) | |
84 { | |
85 char* pDelim = strrchr(pFileName, '\\') + 1; | |
86 if (pDelim) | |
87 { | |
88 strcpy_s(pFileName, sizeof(title) - lenLog, pDelim); | |
89 } | |
90 //Explicit conversion here, to disable compilation wr | |
91 size_t lenFileName = strlen(pFileName); | |
92 *(pFileName + lenFileName) = '"'; | |
93 *(pFileName + lenFileName + 1) = 0; | |
94 } | |
95 | |
96 AllocConsole(); | |
97 SetConsoleTitleA(title); | |
98 } | |
99 | |
100 SYSTEMTIME systemTime; | |
101 GetLocalTime(&systemTime); | |
102 | |
103 char buf[1024]; | |
104 sprintf_s(buf, countof(buf), "%d [%.2d:%.2d:%.2d] {%d} %s\n", count, systemT
ime.wMinute, systemTime.wSecond, systemTime.wMilliseconds, GetCurrentThreadId(),
format); | |
105 | |
106 HANDLE hError = GetStdHandle(STD_ERROR_HANDLE); | |
107 | |
108 WORD color; | |
109 if (eLog == code) | |
110 { | |
111 color = FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE; | |
112 } | |
113 else if (eWarn == code) | |
114 { | |
115 color = FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY
; | |
116 } else if (eError == code) | |
117 { | |
118 color = FOREGROUND_RED | FOREGROUND_INTENSITY; | |
119 } | |
120 | |
121 SetConsoleTextAttribute(hError, color); | |
122 | |
123 char out[4096]; | |
124 StringCbVPrintfA(out, sizeof(out), buf, args); | |
125 | |
126 DWORD dwOutput; | |
127 WriteConsoleA(hError, out, (DWORD)strlen(out), &dwOutput, 0); | |
128 FlushConsoleInputBuffer(hError); | |
129 | |
130 SetLastError(lastError); | |
131 } | |
132 | |
133 | |
134 inline void CONSOLE(const char* format, ...) | |
135 { | |
136 InterlockedIncrement(&g_consoleCount); | |
137 | |
138 va_list args; | |
139 va_start(args, format); | |
140 WritelnToConsole(eLog, g_consoleCount, format, args); | |
141 va_end(args); | |
142 } | |
143 | |
144 inline void CONSOLE_WARN(const char* format, ...) | |
145 { | |
146 va_list args; | |
147 va_start(args, format); | |
148 WritelnToConsole(eWarn, g_consoleCount, format, args); | |
149 va_end(args); | |
150 } | |
151 | |
152 inline void CONSOLE_ERROR(const char* format, ...) | |
153 { | |
154 va_list args; | |
155 va_start(args, format); | |
156 WritelnToConsole(eError, g_consoleCount, format, args); | |
157 va_end(args); | |
158 } | |
159 | |
160 inline void CONSOLE_WAIT(const char* format = "", ...) | |
161 { | |
162 if (format && 0 != format[0]) | |
163 { | |
164 InterlockedIncrement(&g_consoleCount); | |
165 | |
166 va_list args; | |
167 va_start(args, format); | |
168 WritelnToConsole(eLog, g_consoleCount, format, args); | |
169 va_end(args); | |
170 } | |
171 | |
172 CONSOLE("Hit 'ENTER' to continue"); | |
173 wchar_t buf[128]; | |
174 DWORD nRead = 0; | |
175 ReadConsole(GetStdHandle(STD_INPUT_HANDLE), buf, countof(buf), &nRead, 0
); | |
176 } | |
177 | |
178 | |
179 #else | |
180 int RemoveConsole(...); | |
181 | |
182 #define CONSOLE sizeof RemoveConsole | |
183 #define CONSOLE_WARN sizeof RemoveConsole | |
184 #define CONSOLE_ERROR sizeof RemoveConsole | |
185 #define CONSOLE_WAIT sizeof RemoveConsole | |
186 #endif | |
187 | |
OLD | NEW |