tnmain.cpp
来自「一个类似windows」· C++ 代码 · 共 719 行 · 第 1/2 页
CPP
719 行
///////////////////////////////////////////////////////////////////////////////
//Telnet Win32 : an ANSI telnet client.
//Copyright (C) 1998 Paul Brannan
//Copyright (C) 1998 I.Ioannou
//Copyright (C) 1997 Brad Johnson
//
//This program is free software; you can redistribute it and/or
//modify it under the terms of the GNU General Public License
//as published by the Free Software Foundation; either version 2
//of the License, or (at your option) any later version.
//
//This program is distributed in the hope that it will be useful,
//but WITHOUT ANY WARRANTY; without even the implied warranty of
//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
//GNU General Public License for more details.
//
//You should have received a copy of the GNU General Public License
//along with this program; if not, write to the Free Software
//Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
//
//I.Ioannou
//roryt@hol.gr
//
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
//
// Module: tnmain.cpp
//
// Contents: telnet main program
//
// Product: telnet
//
// Revisions: August 11, 1998 Thomas Briggs <tbriggs@qmetric.com>
// May 14, 1998 Paul Brannan <pbranna@clemson.edu>
// 5.April.1997 jbj@nounname.com
// 5.Dec.1996 jbj@nounname.com
// Version 2.0
//
// 02.Apr.1995 igor.milavec@uni-lj.si
// Original code
//
///////////////////////////////////////////////////////////////////////////////
#include <string.h>
#include <locale.h>
#include "tnmain.h"
#include "tnmisc.h"
int telCommandLine (Telnet &MyConnection);
void waitforkey() {
HANDLE hConsole = GetStdHandle(STD_INPUT_HANDLE);
INPUT_RECORD InputRecord;
DWORD dwInput;
BOOL done = FALSE;
while (!done){
WaitForSingleObject( hConsole, INFINITE );
if (!ReadConsoleInput(hConsole, &InputRecord, 1, &dwInput)){
done = TRUE;
continue;
}
if (InputRecord.EventType == KEY_EVENT &&
InputRecord.Event.KeyEvent.bKeyDown )
done = TRUE;
}
}
//char * cfgets ( char * buf, unsigned int length, char pszHistory[][80], int iHistLength){
struct cmdHistory * cfgets (char *buf, unsigned int length, struct cmdHistory *cmdhist) {
HANDLE hConsole = GetStdHandle(STD_INPUT_HANDLE);
unsigned int current=0, cursor =0, iEraseLength=0, i;
char chr;
char temp[2];
char temp1[80];
INPUT_RECORD InputRecord;
BOOL done = FALSE;
temp[1] = 0;
buf[0] = '\0';
if(!ini.get_input_redir()) {
while (!done) {
DWORD dwInput;
int MustRefresh = 0;
WaitForSingleObject( hConsole, INFINITE );
if (!ReadConsoleInput(hConsole, &InputRecord, 1, &dwInput)){
done = TRUE;
continue;
}
MustRefresh = 0;
if (InputRecord.EventType == KEY_EVENT &&
InputRecord.Event.KeyEvent.bKeyDown ) {
if(InputRecord.Event.KeyEvent.dwControlKeyState &
(LEFT_CTRL_PRESSED | RIGHT_CTRL_PRESSED)) {
switch(InputRecord.Event.KeyEvent.wVirtualKeyCode) {
case 'D': // Thomas Briggs 8/11/98
buf[0] = '\04';
buf[1] = '\0';
current = 1;
done = true;
continue;
case 'U': // Paul Brannan 8/11/98
buf[0] = '\0';
current = 0;
cursor = 0;
MustRefresh = 1;
break;
}
}
switch (InputRecord.Event.KeyEvent.wVirtualKeyCode) {
case VK_UP:
// crn@ozemail.com.au
if (cmdhist != NULL) {
if (!strcmp(buf, ""))
strncpy(buf, cmdhist->cmd, 79);
else if (cmdhist->prev != NULL) {
cmdhist = cmdhist->prev;
strncpy(buf, cmdhist->cmd, 79);
}
current = strlen(buf);
}
///
MustRefresh = 1;
break;
case VK_DOWN:
// crn@ozemail.com.au
if (cmdhist != NULL) {
if (cmdhist->next != NULL) {
cmdhist = cmdhist->next;
strncpy(buf, cmdhist->cmd, 79);
} else {
strncpy(buf, "", 79);
}
current = strlen(buf);
}
///
MustRefresh = 1;
break;
case VK_RIGHT: //crn@ozemail.com.au (added ctrl+arrow)
if (cursor < current)
if (InputRecord.Event.KeyEvent.dwControlKeyState &
(LEFT_CTRL_PRESSED | RIGHT_CTRL_PRESSED)) {
unsigned int j, k;
for (j = cursor; j <= current; j++)
if (buf[j+1] == ' ' || (j+1)==current)
break;
for (k = ++j; k <= current; k++)
if (buf[k] != ' ' || k == current) {
cursor = k == current ? --k : k;
break;
}
} else
cursor++;
MustRefresh = 1;
break;
case VK_LEFT: //crn@ozemail.com.au (added ctrl+arrow)
if (cursor > 0)
if(InputRecord.Event.KeyEvent.dwControlKeyState &
(LEFT_CTRL_PRESSED | RIGHT_CTRL_PRESSED)) {
int j, k;
for (j = cursor; j >= 0; j--)
if (buf[j-1] != ' ')
break;
for (k = --j; k >= 0; k--)
if (buf[k] == ' ' || k == 0) {
cursor = !k ? k : ++k;
break;
}
} else
cursor--;
MustRefresh = 1;
break;
case VK_HOME:
if (cursor>0) cursor = 0;
MustRefresh = 1;
break;
case VK_END:
if (cursor<current) cursor = current;
MustRefresh = 1;
break;
case VK_DELETE:
if (current > 0 && current > cursor) {
strcpy(&buf[cursor],&buf[cursor+1]);
current--;
buf[current] = 0;
printit("\r");
for (i = 0; i < current+strlen("telnet>")+1 ;i++)
printit(" ");
}
MustRefresh = 1;
break;
case VK_BACK:
if (cursor > 0 ) {
strcpy(&buf[cursor-1],&buf[cursor]);
current--;
cursor--;
buf[current] = 0;
printit("\r");
for (i = 0; i < current+strlen("telnet>")+1 ;i++)
printit(" ");
}
MustRefresh = 1;
break;
default:
chr = InputRecord.Event.KeyEvent.uChar.AsciiChar;
if (chr == '\r') {
done = TRUE;
continue;
}
if (current >= length-1){
done = TRUE;
continue;
}
if ( isprint (chr) ){
strncpy(temp1,&buf[cursor],79);
strncpy(&buf[cursor+1],temp1,79-(cursor+1));
buf[cursor++]=chr;
current++;
buf[current] = 0;
MustRefresh = 1;
}
break;
}
if (MustRefresh == 1)
{
printit("\rtelnet");
for (i = 0; i <= iEraseLength ;i++)
printit(" ");
printit("\rtelnet>");
printit(buf);
iEraseLength = strlen(buf);
for (i = 0; i < current-cursor; i++)
printit("\b");
}
}
}
buf[current] = 0;
if (strcmp(buf, "")) {
if (cmdhist == NULL) {
cmdhist = new struct cmdHistory;
if (cmdhist == NULL) {
printit ("\nUnable to allocate memory for history buffer -- use the \"flush\" command to clear the buffer.\n");
return cmdhist;
}
strncpy(cmdhist->cmd, buf, 79);
cmdhist->next = NULL;
cmdhist->prev = NULL;
} else {
while (cmdhist->next != NULL) // move to the end of the list
cmdhist = cmdhist->next;
cmdhist->next = new struct cmdHistory;
if (cmdhist->next == NULL) {
printit ("\nUnable to allocate memory for history buffer -- use the \"flush\" command to clear the buffer.\n");
return cmdhist;
}
cmdhist->next->prev = cmdhist; // previous is where we are now
cmdhist = cmdhist->next;
strncpy(cmdhist->cmd, buf, 79);
cmdhist->next = NULL;
}
while (cmdhist->next)
cmdhist = cmdhist->next;
}
return cmdhist;
///
} else {
WaitForSingleObject( hConsole, INFINITE );
DWORD dwInput;
DWORD OldMode;
GetConsoleMode(hConsole, &OldMode);
SetConsoleMode(hConsole,
OldMode &~ (ENABLE_ECHO_INPUT | ENABLE_LINE_INPUT) );
while (ReadFile(hConsole, &chr, 1, &dwInput, NULL)) {
if (chr == '\r') {
temp[0] = chr;
printit(&temp[0]);
break;
}
if (chr == '\b' && current > 0) {
current--;
printit("\b \b");
}
if (current >= length-1){
break;
}
if ( isprint (chr) ){
temp[0] = chr;
printit(&temp[0]);
buf[current++]=chr;
}
}
buf[current] = 0;
SetConsoleMode(hConsole, OldMode);
return NULL;
}
}
// AVS ** for fix bug in command 'keys load keymapname' without file
// static char keyfile[MAX_PATH*2];
int main(int ArgC, char* ArgV[]) {
CONSOLE_SCREEN_BUFFER_INFO ConsoleScreenBufferInfo;
GetConsoleScreenBufferInfo(
GetStdHandle(STD_OUTPUT_HANDLE),
&ConsoleScreenBufferInfo
);
char *k;
char startdir[MAX_PATH*2];
char exename[MAX_PATH];
// strncpy(startdir, ArgV[0],MAX_PATH);
// This should be more accurate than using argv[0] (Paul Brannan 9/16/98)
GetModuleFileName(NULL, startdir, sizeof(startdir));
// Get the current console title so it can be set later
// ("Pedro A. Aranda Guti閞rez" <paag@coppi.tid.es>)
TCHAR ConsoleTitle[255];
GetConsoleTitle(ConsoleTitle, sizeof(ConsoleTitle));
k = strrchr(startdir, '\\');
if (k == NULL){ // if the \ character is not found...
strcpy(exename, startdir);
strcpy(startdir,""); // set the path to nothing
} else {
// end the string after the last '\' to get rid of the file name
strcpy(exename, k+1);
k[1] = 0;
}
printm(0, FALSE, MSG_COPYRIGHT);
printm(0, FALSE, MSG_COPYRIGHT_1);
// set up the ini class
ini.init(startdir, exename);
// Process the command line arguments and connect to a host if necessary
if(ini.Process_Params(ArgC, ArgV)) {
const char *szHost = ini.get_host();
const char *strPort = ini.get_port();
if(!*szHost) {
Telnet MyConnection;
while(telCommandLine(MyConnection));
} else {
Telnet MyConnection;
if(MyConnection.Open(szHost, strPort) == TNPROMPT) {
// still connected
printit("\n");
telCommandLine(MyConnection);
}
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?