Reactos
1///////////////////////////////////////////////////////////////////////////////
2//Telnet Win32 : an ANSI telnet client.
3//Copyright (C) 1998-2000 Paul Brannan
4//Copyright (C) 1998 I.Ioannou
5//Copyright (C) 1997 Brad Johnson
6//
7//This program is free software; you can redistribute it and/or
8//modify it under the terms of the GNU General Public License
9//as published by the Free Software Foundation; either version 2
10//of the License, or (at your option) any later version.
11//
12//This program is distributed in the hope that it will be useful,
13//but WITHOUT ANY WARRANTY; without even the implied warranty of
14//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15//GNU General Public License for more details.
16//
17//You should have received a copy of the GNU General Public License
18//along with this program; if not, write to the Free Software
19//Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20//
21//I.Ioannou
22//roryt@hol.gr
23//
24///////////////////////////////////////////////////////////////////////////
25
26///////////////////////////////////////////////////////////////////////////////
27//
28// Module: tnerror.cpp
29//
30// Contents: error reporting
31//
32// Product: telnet
33//
34// Revisions: June 15, 1998 Paul Brannan <pbranna@clemson.edu>
35// May 15, 1998 Paul Brannan
36// 5.April.1997 jbj@nounname.com
37// 5.Dec.1996 jbj@nounname.com
38// Version 2.0
39//
40// 02.Apr.1995 igor.milavec@uni-lj.si
41// Original code
42//
43///////////////////////////////////////////////////////////////////////////////
44
45#include "precomp.h"
46
47#include <time.h>
48
49#ifndef LANG_USER_DEFAULT
50#define LANG_USER_DEFAULT 400
51#endif
52
53// This has been moved to tnconfig.cpp
54// int Telnet_Redir = 0;
55// Telnet_Redir is set to the value of the environment variable TELNET_REDIR
56// in main.
57
58int printit(const char * it){
59 DWORD numwritten;
60 if (!ini.get_output_redir()) {
61 if (!WriteConsole(
62 GetStdHandle(STD_OUTPUT_HANDLE), // handle of a console screen buffer
63 it, // address of buffer to write from
64 strlen(it), // number of characters to write
65 &numwritten, // address of number of characters written
66 0 // reserved
67 )) return -1;
68 // FIX ME!!! We need to tell the console that the cursor has moved.
69 // Does this mean making Console global?
70 // Paul Brannan 6/14/98
71 // Console.sync();
72 }else{
73 if (!WriteFile(
74 GetStdHandle(STD_OUTPUT_HANDLE), // handle of a console screen buffer
75 it, // address of buffer to write from
76 strlen(it), // number of characters to write
77 &numwritten, // address of number of characters written
78 NULL // no overlapped I/O
79 )) return -1;
80 }
81 return 0;
82}
83
84#ifdef __REACTOS__
85int wprintit(LPCWSTR it)
86{
87 DWORD numwritten;
88 if (!ini.get_output_redir())
89 {
90 if (!WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE),
91 it, wcslen(it), &numwritten, NULL))
92 {
93 return -1;
94 }
95 }
96 else
97 {
98 // calculate the number of bytes needed to store the UTF-8 string
99 int cbMultibyte = WideCharToMultiByte(CP_UTF8, 0, it, -1, NULL, 0, NULL, NULL);
100 if (cbMultibyte == 0)
101 return 0;
102 if (cbMultibyte < 0)
103 return -1;
104 // allocate the buffer for the UTF-8 string
105 char* szBuffer = new char[cbMultibyte];
106 if (!szBuffer)
107 return -1;
108
109 bool bSuccess = false;
110 if (WideCharToMultiByte(CP_UTF8, 0, it, -1, szBuffer, cbMultibyte, NULL, NULL) &&
111 WriteFile(GetStdHandle(STD_OUTPUT_HANDLE),
112 szBuffer, cbMultibyte, &numwritten, NULL))
113 {
114 bSuccess = true;
115 }
116
117 delete[] szBuffer;
118 if (!bSuccess)
119 return -1;
120 }
121 return 0;
122}
123#endif
124
125int printm(LPTSTR szModule, BOOL fSystem, DWORD dwMessageId, ...)
126{
127 int Result = 0;
128
129 HMODULE hModule = 0;
130 if (szModule)
131 hModule = LoadLibrary(szModule);
132
133 va_list Ellipsis;
134 va_start(Ellipsis, dwMessageId);
135#ifdef __REACTOS__
136 LPWSTR pszMessage = NULL;
137 DWORD dwMessage = 0;
138
139 if(fSystem) {
140 dwMessage = FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER |
141 FORMAT_MESSAGE_FROM_SYSTEM, hModule, dwMessageId,
142 LANG_USER_DEFAULT, (LPWSTR)&pszMessage, 128, &Ellipsis);
143 } else {
144 // we will use a string table.
145 WCHAR wszString[256];
146 if(LoadStringW(0, dwMessageId, wszString, sizeof(wszString) / sizeof(*wszString)))
147 dwMessage = FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER |
148 FORMAT_MESSAGE_FROM_STRING, wszString, dwMessageId,
149 LANG_USER_DEFAULT, (LPWSTR)&pszMessage, sizeof(wszString) / sizeof(*wszString), &Ellipsis);
150 }
151#else
152 LPTSTR pszMessage = 0;
153 DWORD dwMessage = 0;
154 if(fSystem) {
155 dwMessage = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
156 FORMAT_MESSAGE_FROM_SYSTEM, hModule, dwMessageId,
157 LANG_USER_DEFAULT, (LPTSTR)&pszMessage, 128, &Ellipsis);
158 } else {
159 // we will use a string table.
160 char szString[256];
161 if(LoadString(0, dwMessageId, szString, sizeof(szString)))
162 dwMessage = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
163 FORMAT_MESSAGE_FROM_STRING, szString, dwMessageId,
164 LANG_USER_DEFAULT, (LPTSTR)&pszMessage, 256, &Ellipsis);
165 }
166#endif
167
168 va_end(Ellipsis);
169
170 if (szModule)
171 FreeLibrary(hModule);
172
173 if (dwMessage) {
174#ifdef __REACTOS__
175 Result = wprintit(pszMessage);
176#else
177 Result = printit(pszMessage);
178#endif
179 LocalFree(pszMessage);
180 }
181
182 return Result;
183}
184
185
186void LogErrorConsole(LPTSTR szError)
187{
188 DWORD dwLastError = GetLastError();
189
190 const int cbLastError = 1024;
191 TCHAR szLastError[cbLastError];
192 FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, 0, dwLastError, LANG_USER_DEFAULT,
193 szLastError, cbLastError, 0);
194
195 LPTSTR lpszStrings[2];
196 lpszStrings[0] = szError;
197 lpszStrings[1] = szLastError;
198
199 const int cbErrorString = 1024;
200 TCHAR szErrorString[cbErrorString];
201 FormatMessage(FORMAT_MESSAGE_FROM_HMODULE| FORMAT_MESSAGE_ARGUMENT_ARRAY,
202 0, MSG_ERROR, LANG_USER_DEFAULT,
203 szErrorString, cbErrorString, (va_list*)lpszStrings);
204
205 time_t dwTime;
206 time(&dwTime);
207 char* szTime = ctime(&dwTime);
208 szTime[19] = 0;
209
210 // printf("E %s %s", szTime + 11, szErrorString);
211 char * buf;
212 buf = new char [ 3 + strlen(szTime) - 11 + strlen(szErrorString) + 5 ];
213 sprintf( buf,"E %s %s", szTime + 11, szErrorString);
214 printit(buf);
215 delete [] buf;
216}
217
218
219void LogWarningConsole(DWORD dwEvent, LPTSTR szWarning)
220{
221 DWORD dwLastError = GetLastError();
222
223 const int cbLastError = 1024;
224 TCHAR szLastError[cbLastError];
225 FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, 0, dwLastError, LANG_USER_DEFAULT,
226 szLastError, cbLastError, 0);
227
228 LPTSTR lpszStrings[2];
229 lpszStrings[0] = szWarning;
230 lpszStrings[1] = szLastError;
231
232 const int cbWarningString = 1024;
233 TCHAR szWarningString[cbWarningString];
234 FormatMessage(FORMAT_MESSAGE_FROM_HMODULE| FORMAT_MESSAGE_ARGUMENT_ARRAY,
235 0, dwEvent, LANG_USER_DEFAULT,
236 szWarningString, cbWarningString, (va_list*)lpszStrings);
237
238 time_t dwTime;
239 time(&dwTime);
240 char* szTime = ctime(&dwTime);
241 szTime[19] = 0;
242
243 // printf("W %s %s", szTime + 11, szWarningString);
244 char * buf;
245 buf = new char [ 3 + strlen(szTime) - 11 + strlen(szWarningString) + 5 ];
246 sprintf(buf ,"W %s %s", szTime + 11, szWarningString);
247 printit(buf);
248 delete [] buf;
249
250}
251
252
253void LogInfoConsole(DWORD dwEvent, LPTSTR szInformation)
254{
255 LPTSTR lpszStrings[1];
256 lpszStrings[0] = szInformation;
257
258 const int cbInfoString = 1024;
259 TCHAR szInfoString[cbInfoString];
260 FormatMessage(FORMAT_MESSAGE_FROM_HMODULE| FORMAT_MESSAGE_ARGUMENT_ARRAY,
261 0, dwEvent, LANG_USER_DEFAULT,
262 szInfoString, cbInfoString, (va_list*)lpszStrings);
263
264 time_t dwTime;
265 time(&dwTime);
266 char* szTime = ctime(&dwTime);
267 szTime[19] = 0;
268
269 // printf("I %s %s", szTime + 11, szInfoString);
270 char * buf;
271 buf = new char [ 3 + strlen(szTime) - 11 + strlen(szInfoString) + 5 ];
272 sprintf(buf,"I %s %s", szTime + 11, szInfoString);
273 printit(buf);
274 delete [] buf;
275
276}
277