ReactOS  0.4.12-dev-57-g7050ac4
tncon.cpp File Reference
#include "precomp.h"
Include dependency graph for tncon.cpp:

Go to the source code of this file.

Macros

#define KEYEVENT   InputRecord[i].Event.KeyEvent
 
#define KEYEVENT_CHAR   KEYEVENT.uChar.AsciiChar
 
#define KEYEVENT_PCHAR   &KEYEVENT_CHAR
 

Functions

void DoEcho (const char *p, int l, TConsole &Console, TNetwork &Network, NetParams *pParams)
 
bool DoLineModeSpecial (char keychar, TConsole &Console, TNetwork &Network, NetParams *pParams)
 
void DoLineMode (const char *p, int p_len, TConsole &Console, TNetwork &Network)
 
const charClosestStateKey (WORD keyCode, DWORD keyState, KeyTranslator &KeyTrans)
 
const charFindClosestKey (WORD keyCode, DWORD keyState, KeyTranslator &KeyTrans)
 
int do_op (tn_ops op, TNetwork &Network, Tnclip &Clipboard)
 
int telProcessConsole (NetParams *pParams, KeyTranslator &KeyTrans, TConsole &Console, TNetwork &Network, TMouse &Mouse, Tnclip &Clipboard, HANDLE hThread)
 
WORD scrollkeys ()
 
void setTNetwork (TNetwork tnet)
 
BOOL WINAPI ControlEventHandler (DWORD event)
 

Variables

static char buffer [1024]
 
static unsigned int bufptr = 0
 
static TNetwork net
 

Macro Definition Documentation

◆ KEYEVENT

#define KEYEVENT   InputRecord[i].Event.KeyEvent

Definition at line 49 of file tncon.cpp.

Referenced by telProcessConsole().

◆ KEYEVENT_CHAR

#define KEYEVENT_CHAR   KEYEVENT.uChar.AsciiChar

Definition at line 55 of file tncon.cpp.

Referenced by telProcessConsole().

◆ KEYEVENT_PCHAR

#define KEYEVENT_PCHAR   &KEYEVENT_CHAR

Definition at line 58 of file tncon.cpp.

Referenced by telProcessConsole().

Function Documentation

◆ ClosestStateKey()

const char* ClosestStateKey ( WORD  keyCode,
DWORD  keyState,
KeyTranslator KeyTrans 
)

Definition at line 118 of file tncon.cpp.

Referenced by FindClosestKey().

119  {
120  char const *p;
121 
122  if((p = KeyTrans.TranslateKey(keyCode, keyState))) return p;
123 
124  // Check numlock and scroll lock (Paul Brannan 9/23/98)
125  if((p = KeyTrans.TranslateKey(keyCode, keyState & ~NUMLOCK_ON))) return p;
126  if((p = KeyTrans.TranslateKey(keyCode, keyState & ~ENHANCED_KEY
127  & ~NUMLOCK_ON))) return p;
128  if((p = KeyTrans.TranslateKey(keyCode, keyState & ~SCROLLLOCK_ON))) return p;
129  if((p = KeyTrans.TranslateKey(keyCode, keyState & ~ENHANCED_KEY
130  & ~SCROLLLOCK_ON))) return p;
131 
132  // John Ioannou (roryt@hol.gr)
133  // Athens 31/03/97 00:25am GMT+2
134  // fix for win95 CAPSLOCK bug
135  // first check if the user has keys with capslock and then we filter it
136  if((p = KeyTrans.TranslateKey(keyCode, keyState & ~ENHANCED_KEY))) return p;
137  if((p = KeyTrans.TranslateKey(keyCode, keyState & ~CAPSLOCK_ON))) return p;
138  if((p = KeyTrans.TranslateKey(keyCode, keyState & ~ENHANCED_KEY
139  & ~CAPSLOCK_ON))) return p;
140 
141  return 0; // we couldn't find a suitable key translation
142 }
#define SCROLLLOCK_ON
Definition: wincon.h:137
#define ENHANCED_KEY
Definition: wincon.h:139
GLfloat GLfloat p
Definition: glext.h:8902
const char * TranslateKey(WORD wVirtualKeyCode, DWORD dwControlKeyState)
Definition: keytrans.cpp:94
#define NUMLOCK_ON
Definition: wincon.h:136
#define CAPSLOCK_ON
Definition: wincon.h:138

◆ ControlEventHandler()

BOOL WINAPI ControlEventHandler ( DWORD  event)

Definition at line 357 of file tncon.cpp.

Referenced by Telnet::Open().

357  {
358  switch(event) {
359  case CTRL_BREAK_EVENT:
360  // Bryan Montgomery 10/14/98
361  if(ini.get_control_break_as_c()) net.WriteString("\x3",1);
362  return TRUE;
363  default:
364  return FALSE;
365  }
366 }
#define TRUE
Definition: types.h:120
#define CTRL_BREAK_EVENT
Definition: wincon.h:66
bool get_control_break_as_c() const
Definition: tnconfig.h:61
TConfig ini
Definition: tnconfig.cpp:45
int WriteString(const char *str, const int length)
Definition: tnetwork.cpp:53
struct _cl_event * event
Definition: glext.h:7739
static TNetwork net
Definition: tncon.cpp:351

◆ do_op()

int do_op ( tn_ops  op,
TNetwork Network,
Tnclip Clipboard 
)

Definition at line 174 of file tncon.cpp.

Referenced by telProcessConsole().

174  {
175  switch(op) {
176  case TN_ESCAPE:
177  return TNPROMPT;
178  case TN_SCROLLBACK:
179  return TNSCROLLBACK;
180  case TN_DIAL:
181  return TNSPAWN;
182  case TN_PASTE:
183  if(ini.get_keyboard_paste()) Clipboard.Paste();
184  else return 0;
185  break;
186  case TN_NULL:
187  Network.WriteString("", 1);
188  return 0;
189  case TN_CR:
190  Network.WriteString("\r", 2); // CR must be followed by NUL
191  return 0;
192  case TN_CRLF:
193  Network.WriteString("\r\n", 2);
194  return 0;
195  }
196  return 0;
197 }
bool get_keyboard_paste() const
Definition: tnconfig.h:86
void Paste()
Definition: tnclip.cpp:48
UINT op
Definition: effect.c:223
TConfig ini
Definition: tnconfig.cpp:45
int WriteString(const char *str, const int length)
Definition: tnetwork.cpp:53
Definition: tkeydef.h:19
Definition: tncon.h:18
Definition: tncon.h:16

◆ DoEcho()

void DoEcho ( const char p,
int  l,
TConsole Console,
TNetwork Network,
NetParams pParams 
)
inline

Definition at line 61 of file tncon.cpp.

Referenced by DoLineModeSpecial(), and telProcessConsole().

62  {
63  // Pause the console (Paul Brannan 8/24/98)
64  if(Network.get_local_echo()) {
65  ResetEvent(pParams->hUnPause);
66  SetEvent(pParams->hPause);
67  while (!*pParams->bNetPaused); // Pause
68 
69  Console.WriteCtrlString(p, l);
70 
71  SetEvent(pParams->hUnPause); // Unpause
72  }
73 }
HANDLE hUnPause
Definition: tparams.h:7
unsigned long WriteCtrlString(const char *pszString, unsigned long cbString)
Definition: tconsole.cpp:542
BOOL WINAPI DECLSPEC_HOTPATCH SetEvent(IN HANDLE hEvent)
Definition: synch.c:679
volatile int * bNetPaused
Definition: tparams.h:8
BOOL get_local_echo()
Definition: tnetwork.h:40
r l[0]
Definition: byte_order.h:167
BOOL WINAPI DECLSPEC_HOTPATCH ResetEvent(IN HANDLE hEvent)
Definition: synch.c:660
HANDLE hPause
Definition: tparams.h:7
GLfloat GLfloat p
Definition: glext.h:8902

◆ DoLineMode()

void DoLineMode ( const char p,
int  p_len,
TConsole Console,
TNetwork Network 
)
inline

Definition at line 100 of file tncon.cpp.

Referenced by telProcessConsole().

101  {
102  if(Network.get_line_mode()) {
103  if(bufptr < sizeof(buffer) + p_len - 1) {
104  memcpy(buffer + bufptr, p, p_len);
105  bufptr += p_len;
106  } else {
107  Console.Beep();
108  }
109  } else {
110  Network.WriteString(p, p_len);
111  }
112 }
static unsigned int bufptr
Definition: tncon.cpp:77
GLuint buffer
Definition: glext.h:5915
int WriteString(const char *str, const int length)
Definition: tnetwork.cpp:53
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
BOOL get_line_mode()
Definition: tnetwork.h:43
GLfloat GLfloat p
Definition: glext.h:8902
void Beep()
Definition: tconsole.cpp:922

◆ DoLineModeSpecial()

bool DoLineModeSpecial ( char  keychar,
TConsole Console,
TNetwork Network,
NetParams pParams 
)
inline

Definition at line 84 of file tncon.cpp.

Referenced by telProcessConsole().

85  {
86  if(keychar == VK_BACK) {
87  if(bufptr) bufptr--;
88  DoEcho("\b \b", 3, Console, Network, pParams);
89  return true;
90  } else if(keychar == VK_RETURN) {
91  Network.WriteString(buffer, bufptr);
92  Network.WriteString("\012", 1);
93  DoEcho("\r\n", 2, Console, Network, pParams);
94  bufptr = 0;
95  return true;
96  }
97  return false;
98 }
void DoEcho(const char *p, int l, TConsole &Console, TNetwork &Network, NetParams *pParams)
Definition: tncon.cpp:61
static unsigned int bufptr
Definition: tncon.cpp:77
GLuint buffer
Definition: glext.h:5915
#define VK_RETURN
Definition: winuser.h:2155
int WriteString(const char *str, const int length)
Definition: tnetwork.cpp:53
#define VK_BACK
Definition: winuser.h:2152

◆ FindClosestKey()

const char* FindClosestKey ( WORD  keyCode,
DWORD  keyState,
KeyTranslator KeyTrans 
)

Definition at line 144 of file tncon.cpp.

Referenced by telProcessConsole().

145  {
146  char const *p;
147 
148  // Paul Brannan 7/20/98
149  if(ini.get_alt_erase()) {
150  if(keyCode == VK_BACK) {
151  keyCode = VK_DELETE;
152  keyState |= ENHANCED_KEY;
153  } else if(keyCode == VK_DELETE && (keyState & ENHANCED_KEY)) {
154  keyCode = VK_BACK;
155  keyState &= ~ENHANCED_KEY;
156  }
157  }
158 
159  DWORD ext_mode = KeyTrans.get_ext_mode();
160  if(ext_mode) {
161  // Not as fast as an unrolled loop, but certainly more
162  // compact (Paul Brannan 12/9/98)
163  for(DWORD j = ext_mode; j >= APP_KEY; j -= APP_KEY) {
164  if((j | ext_mode) == ext_mode) {
165  if((p = ClosestStateKey(keyCode, keyState | j,
166  KeyTrans))) return p;
167  }
168  }
169  }
170  return ClosestStateKey(keyCode, keyState, KeyTrans);
171 }
bool get_alt_erase() const
Definition: tnconfig.h:85
GLenum GLclampf GLint GLenum GLuint GLenum GLenum GLsizei GLenum const GLvoid GLfloat GLfloat GLfloat GLfloat GLclampd GLint GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean GLboolean GLboolean GLboolean GLint GLenum GLsizei const GLvoid GLenum GLint GLenum GLint GLint GLsizei GLint GLenum GLint GLint GLint GLint GLsizei GLenum GLsizei const GLuint GLboolean GLenum GLenum GLint GLsizei GLenum GLsizei GLenum const GLvoid GLboolean const GLboolean GLenum const GLdouble const GLfloat const GLdouble const GLfloat GLenum GLint GLint GLint GLint GLint GLint j
Definition: glfuncs.h:98
#define APP_KEY
Definition: keytrans.h:41
const char * ClosestStateKey(WORD keyCode, DWORD keyState, KeyTranslator &KeyTrans)
Definition: tncon.cpp:118
DWORD get_ext_mode()
Definition: keytrans.h:77
#define VK_DELETE
Definition: winuser.h:2187
TConfig ini
Definition: tnconfig.cpp:45
#define ENHANCED_KEY
Definition: wincon.h:139
unsigned long DWORD
Definition: ntddk_ex.h:95
#define VK_BACK
Definition: winuser.h:2152
GLfloat GLfloat p
Definition: glext.h:8902

◆ scrollkeys()

WORD scrollkeys ( )

Definition at line 320 of file tncon.cpp.

Referenced by TScroller::ScrollBack().

320  {
322  INPUT_RECORD InputRecord;
323  BOOL done = FALSE;
324 
325  while (!done) {
326  DWORD dwInput;
327  WaitForSingleObject( hConsole, INFINITE );
328  if (!ReadConsoleInput(hConsole, &InputRecord, 1, &dwInput)){
329  done = TRUE;
330  continue;
331  }
332  if (InputRecord.EventType == KEY_EVENT &&
333  InputRecord.Event.KeyEvent.bKeyDown ) {
334  // Why not just return the key code? (Paul Brannan 12/5/98)
335  return InputRecord.Event.KeyEvent.wVirtualKeyCode;
336  } else if(InputRecord.EventType == MOUSE_EVENT) {
337  if(!InputRecord.Event.MouseEvent.dwEventFlags) {
338  // Put the mouse's X and Y coords back into the input buffer
339  WriteConsoleInput(hConsole, &InputRecord, 1, &dwInput);
340  return SC_MOUSE;
341  }
342  }
343  }
344  return SC_ESC;
345 }
#define TRUE
Definition: types.h:120
DWORD dwEventFlags
Definition: wincon.h:245
#define WriteConsoleInput
Definition: wincon.h:773
HANDLE WINAPI GetStdHandle(IN DWORD nStdHandle)
Definition: console.c:152
WORD wVirtualKeyCode
Definition: wincon.h:227
DWORD WINAPI WaitForSingleObject(IN HANDLE hHandle, IN DWORD dwMilliseconds)
Definition: synch.c:82
#define ReadConsoleInput
Definition: wincon.h:766
#define KEY_EVENT
Definition: wincon.h:122
#define STD_INPUT_HANDLE
Definition: winbase.h:264
unsigned int BOOL
Definition: ntddk_ex.h:94
#define MOUSE_EVENT
Definition: wincon.h:123
KEY_EVENT_RECORD KeyEvent
Definition: wincon.h:263
unsigned long DWORD
Definition: ntddk_ex.h:95
Definition: tncon.h:11
WORD EventType
Definition: wincon.h:261
MOUSE_EVENT_RECORD MouseEvent
Definition: wincon.h:264
Definition: tncon.h:10
#define INFINITE
Definition: serial.h:102
union _INPUT_RECORD::@3146 Event

◆ setTNetwork()

void setTNetwork ( TNetwork  tnet)

Definition at line 352 of file tncon.cpp.

352  {
353  net = tnet;
354 }
static TNetwork net
Definition: tncon.cpp:351

◆ telProcessConsole()

int telProcessConsole ( NetParams pParams,
KeyTranslator KeyTrans,
TConsole Console,
TNetwork Network,
TMouse Mouse,
Tnclip Clipboard,
HANDLE  hThread 
)

Definition at line 199 of file tncon.cpp.

Referenced by Telnet::Resume().

202 {
203  KeyDefType_const keydef;
204  const char *p;
205  int p_len;
206  unsigned int i;
207  int opval;
209 
211 
212  const DWORD nHandle = 2;
213  HANDLE hHandle[nHandle] = {hConsole, pParams->hExit};
214 
215  for (;;) {
216  DWORD dwInput;
217  switch (WaitForMultipleObjects(nHandle, hHandle, FALSE, INFINITE)) {
218  case WAIT_OBJECT_0: {
219 
220  // Paul Brannan 7/29/98
221  if(ini.get_input_redir()) {
222  char InputBuffer[10];
223 
224  // Correction from Joe Manns <joe.manns@ardenenginneers.com>
225  // to fix race conditions (4/13/99)
226  int bResult;
227  bResult = ReadFile(hConsole, InputBuffer, 10, &dwInput, 0);
228  if(bResult && dwInput == 0) return TNNOCON;
229 
230  // no key translation for redirected input
231  Network.WriteString(InputBuffer, dwInput);
232  break;
233  }
234 
235  INPUT_RECORD InputRecord[11];
236  if (!ReadConsoleInput(hConsole, &InputRecord[0], 10, &dwInput))
237  return TNPROMPT;
238 
239  for (i = 0; (unsigned)i < dwInput; i++){
240  switch (InputRecord[i].EventType) {
241  case KEY_EVENT:{
242  if (KEYEVENT.bKeyDown) {
243 
244  WORD keyCode = KEYEVENT.wVirtualKeyCode;
245  DWORD keyState = KEYEVENT.dwControlKeyState;
246 
247  // Paul Brannan 5/27/98
248  // Moved the code that was here to FindClosestKey()
249  keydef.szKeyDef = FindClosestKey(keyCode,
250  keyState, KeyTrans);
251 
252  if(keydef.szKeyDef) {
253  if(!keydef.op->sendstr)
254  if((opval = do_op(keydef.op->the_op, Network,
255  Clipboard)) != 0)
256  return opval;
257  }
258 
259  if(Network.get_line_mode()) {
260  if(DoLineModeSpecial(KEYEVENT_CHAR, Console, Network, pParams))
261  continue;
262  }
263 
264  p = keydef.szKeyDef;
265  if (p == NULL) { // if we don't have a translator
266  if(!KEYEVENT_CHAR) continue;
267  p_len = 1;
268  p = KEYEVENT_PCHAR;
269  } else {
270  p_len = strlen(p);
271  }
272 
273  // Local echo (Paul Brannan 5/16/98)
274  DoEcho(p, p_len, Console, Network, pParams);
275  // Line mode (Paul Brannan 12/31/98)
276  DoLineMode(p, p_len, Console, Network);
277  }
278  }
279  break;
280 
281  case MOUSE_EVENT:
282  if(!InputRecord[i].Event.MouseEvent.dwEventFlags) {
283  ResetEvent(pParams->hUnPause);
284  SetEvent(pParams->hPause);
285  while (!*pParams->bNetPaused); // thread paused
286  // SuspendThread(hThread);
287 
288  // Put the mouse's X and Y coords back into the
289  // input buffer
290  DWORD Result;
291  WriteConsoleInput(hConsole, &InputRecord[i], 1,
292  &Result);
293 
294  Mouse.doMouse();
295 
296  SetEvent(pParams->hUnPause);
297  // ResumeThread(hThread);
298  }
299  break;
300 
301  case FOCUS_EVENT:
302  break;
304  // FIX ME!! This should take care of the window re-sizing bug
305  // Unfortunately, it doesn't.
306  Console.sync();
307  Network.do_naws(Console.GetWidth(), Console.GetHeight());
308  break;
309  }
310 
311  } // keep going until no more input
312  break;
313  }
314  default:
315  return TNNOCON;
316  }
317  }
318 }
const optype * op
Definition: tkeydef.h:33
void DoEcho(const char *p, int l, TConsole &Console, TNetwork &Network, NetParams *pParams)
Definition: tncon.cpp:61
void DoLineMode(const char *p, int p_len, TConsole &Console, TNetwork &Network)
Definition: tncon.cpp:100
HANDLE hUnPause
Definition: tparams.h:7
ACPI_SIZE strlen(const char *String)
Definition: utclib.c:269
#define WINDOW_BUFFER_SIZE_EVENT
Definition: wincon.h:124
void sync()
Definition: tconsole.cpp:109
#define WriteConsoleInput
Definition: wincon.h:773
BOOL WINAPI DECLSPEC_HOTPATCH SetEvent(IN HANDLE hEvent)
Definition: synch.c:679
HANDLE WINAPI GetStdHandle(IN DWORD nStdHandle)
Definition: console.c:152
tn_ops the_op
Definition: tkeydef.h:23
DWORD WINAPI WaitForMultipleObjects(IN DWORD nCount, IN CONST HANDLE *lpHandles, IN BOOL bWaitAll, IN DWORD dwMilliseconds)
Definition: synch.c:151
CHAR InputBuffer[80]
Definition: conmgr.c:33
volatile int * bNetPaused
Definition: tparams.h:8
#define KEYEVENT_PCHAR
Definition: tncon.cpp:58
GLenum GLclampf GLint i
Definition: glfuncs.h:14
#define ReadConsoleInput
Definition: wincon.h:766
BOOL WINAPI DECLSPEC_HOTPATCH SetConsoleMode(HANDLE hConsoleHandle, DWORD dwMode)
Definition: console.c:1608
#define KEY_EVENT
Definition: wincon.h:122
const char * szKeyDef
Definition: tkeydef.h:32
smooth NULL
Definition: ftsmooth.c:416
_At_(*)(_In_ PWSK_CLIENT Client, _In_opt_ PUNICODE_STRING NodeName, _In_opt_ PUNICODE_STRING ServiceName, _In_opt_ ULONG NameSpace, _In_opt_ GUID *Provider, _In_opt_ PADDRINFOEXW Hints, _Outptr_ PADDRINFOEXW *Result, _In_opt_ PEPROCESS OwningProcess, _In_opt_ PETHREAD OwningThread, _Inout_ PIRP Irp Result)(Mem)) NTSTATUS(WSKAPI *PFN_WSK_GET_ADDRESS_INFO
Definition: wsk.h:426
Definition: tncon.h:15
#define FOCUS_EVENT
Definition: wincon.h:126
#define STD_INPUT_HANDLE
Definition: winbase.h:264
TConfig ini
Definition: tnconfig.cpp:45
int WriteString(const char *str, const int length)
Definition: tnetwork.cpp:53
#define WAIT_OBJECT_0
Definition: winbase.h:387
#define KEYEVENT_CHAR
Definition: tncon.cpp:55
#define KEYEVENT
Definition: tncon.cpp:49
#define MOUSE_EVENT
Definition: wincon.h:123
unsigned short WORD
Definition: ntddk_ex.h:93
unsigned long DWORD
Definition: ntddk_ex.h:95
void doMouse()
Definition: tmouse.cpp:141
#define ENABLE_MOUSE_INPUT
Definition: wincon.h:79
int get_input_redir() const
Definition: tnconfig.h:42
int GetWidth()
Definition: tconsole.h:81
bool get_enable_mouse() const
Definition: tnconfig.h:79
BOOL get_line_mode()
Definition: tnetwork.h:43
bool DoLineModeSpecial(char keychar, TConsole &Console, TNetwork &Network, NetParams *pParams)
Definition: tncon.cpp:84
HANDLE hExit
Definition: tparams.h:6
BOOL WINAPI DECLSPEC_HOTPATCH ResetEvent(IN HANDLE hEvent)
Definition: synch.c:660
HANDLE hPause
Definition: tparams.h:7
char sendstr
Definition: tkeydef.h:22
void do_naws(int width, int height)
Definition: tnetwork.cpp:81
_In_ ACCESS_MASK _In_opt_ POBJECT_ATTRIBUTES _In_ EVENT_TYPE EventType
Definition: exfuncs.h:165
GLfloat GLfloat p
Definition: glext.h:8902
#define INFINITE
Definition: serial.h:102
BOOL WINAPI ReadFile(IN HANDLE hFile, IN LPVOID lpBuffer, IN DWORD nNumberOfBytesToRead, OUT LPDWORD lpNumberOfBytesRead OPTIONAL, IN LPOVERLAPPED lpOverlapped OPTIONAL)
Definition: rw.c:123
Definition: tncon.h:16
const char * FindClosestKey(WORD keyCode, DWORD keyState, KeyTranslator &KeyTrans)
Definition: tncon.cpp:144
int do_op(tn_ops op, TNetwork &Network, Tnclip &Clipboard)
Definition: tncon.cpp:174
int GetHeight()
Definition: tconsole.h:82

Variable Documentation

◆ buffer

char buffer[1024]
static

Definition at line 76 of file tncon.cpp.

◆ bufptr

◆ net