Reactos
at master 277 lines 7.8 kB view raw
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