ttelhndl.cpp
来自「一个类似windows」· C++ 代码 · 共 549 行 · 第 1/2 页
CPP
549 行
SendIAC(DO, TELOPT_ECHO);
bInEchoRx = 1;
Network.set_local_echo(0); // Paul Brannan 8/25/98
if(iWillSGA) Network.set_line_mode(0);
TELOPT_PRINTD2("SENT DO TELOPT_ECHO", pszBuffer[2]);
if(Network.get_local_echo()) Network.set_line_mode(0);
}
break;
// Suppress Go Ahead (Paul Brannan 12/31/98)
case TELOPT_SGA:
TELOPT_PRINTD("RCVD WILL TELOPT_SGA\n");
if(!iWillSGA) {
SendIAC(DO, TELOPT_SGA);
if(bInEchoRx) Network.set_line_mode(0);
iWillSGA = 1;
TELOPT_PRINTD("SENT DO TELOPT_SGA\n");
}
break;
////added 1/28/97
default:
TELOPT_PRINTD2("RCVD WILL", pszBuffer[2]);
SendIAC(DONT, pszBuffer[2]);
TELOPT_PRINTD2("SENT DONT", pszBuffer[2]);
break;
////
}
if (pszBuffer + 2 < pszBufferEnd)
pszBuffer += 3;
break;
}
///////////////// WONT ////////////////////
case WONT:
{
switch ((unsigned char)pszBuffer[2]){
case TELOPT_ECHO:
TELOPT_PRINTD("RCVD WONT TELOPT_ECHO\n");
if (bInEchoRx){
SendIAC(DONT, TELOPT_ECHO);
// bInBinaryRx = 0;
bInEchoRx = 0; // Paul Brannan 8/25/98
Network.set_local_echo(1);
Network.set_line_mode(0);
TELOPT_PRINTD("SENT DONT TELOPT_ECHO\n");
}
break;
// Suppress Go Ahead (Paul Brannan 12/31/98)
case TELOPT_SGA:
TELOPT_PRINTD("RCVD WONT TELOPT_SGA\n");
if(iWillSGA) {
SendIAC(DONT, TELOPT_SGA);
Network.set_line_mode(0);
iWillSGA = 0;
TELOPT_PRINTD("SENT DONT TELOPT_SGA\n");
}
break;
default:
TELOPT_PRINTD2("RCVD WONT", pszBuffer[2]);
break;
}
if (pszBuffer + 2 < pszBufferEnd)
pszBuffer += 3;
break;
}
///////////////// DONT ////////////////////
case DONT:
{
switch ((unsigned char)pszBuffer[2]){
case TELOPT_ECHO:
TELOPT_PRINTD("RCVD DONT TELOPT_ECHO\n");
if (bInEchoTx){
SendIAC(WONT, TELOPT_ECHO);
bInEchoTx = 0;
TELOPT_PRINTD("SENT WONT TELOPT_ECHO\n");
}
break;
case TELOPT_NAWS:
TELOPT_PRINTD("RCVD DONT TELOPT_NAWS\n");
SendIAC(WONT, TELOPT_NAWS);
Network.SetNawsFunc(naws_string);
TELOPT_PRINTD("SENT WONT TELOPT_NAWS\n");
break;
default:
TELOPT_PRINTD2("RCVD DONT", pszBuffer[2]);
break;
}
if (pszBuffer + 2 < pszBufferEnd)
pszBuffer += 3;
break;
}
///////////////// SB ////////////////////
case SB:
{
switch ((unsigned char)pszBuffer[2]){
case TELOPT_TTYPE:
if (pszBuffer + 5 < pszBufferEnd) {
TELOPT_PRINTD("RCVD SB TELOPT_TTYPE\n");
if (pszBuffer[3] == 1){
TELOPT_PRINTD("SENT SB TT");
TELOPT_PRINTD(pszTerms[iTermSet]);
TELOPT_PRINTD("\n");
SendIAC(SB, TELOPT_TTYPE);
SendIACParams(0);
Network.WriteString(pszTerms[iTermSet], strlen(pszTerms[iTermSet]));
SendIAC(SE);
if (iTermSet < LASTTERM )
iTermSet+=1;
}
if (pszBuffer + 5 < pszBufferEnd)
pszBuffer += 6;
}
break;
case TELOPT_XDISPLOC:
if(pszBuffer + 5 < pszBufferEnd) {
TELOPT_PRINTD("RCVD SB XDISPLOC\n");
SendIAC(SB, TELOPT_XDISPLOC);
TELOPT_PRINTD("SENT SB XDISPLOC");
SendIACParams(0);
if(Network.GetLocalAddress()) Network.WriteString(Network.GetLocalAddress(),
strlen(Network.GetLocalAddress()));
TELOPT_PRINTD(Network.GetLocalAddress());
TELOPT_PRINTD("\n");
SendIAC(SE);
if (pszBuffer + 5 < pszBufferEnd)
pszBuffer += 6;
}
break;
default: break;
}
break;
}
default:
pszBuffer += 2;
break;
}
}
return pszBuffer;
}
#ifdef __BORLANDC__
// bring bug optimazations
#pragma -O.
#endif
// This is the code from TANSIParser::ParseBuffer. It parses out IACs, and
// then calls TParser::ParseBuffer to do the terminal emulation.
// (Paul Brannan 6/15/98)
// Hopefully eliminating the unnecessary copying should speed things up a
// little. (Paul Brannan 6/28/98)
char* TTelnetHandler::ParseBuffer(char* pszBuffer, char* pszBufferEnd){
char *pszResult;
char *pszHead = pszBuffer;
if(Network.get_net_type() == TN_NETSOCKET) {
while (pszBuffer < pszBufferEnd) {
// if IAC then parse IAC
if((unsigned char) *pszBuffer == IAC) {
// check for escaped IAC
if((pszBufferEnd >= pszBuffer + 1) &&
(unsigned char)*(pszBuffer + 1) == IAC) {
// we move data at the front of the buffer to the end so
// that if we only have IACs we won't return pszBuffer
// even though we did parse something. Returning
// pszBuffer is an error condition.
memmove(pszHead + 1, pszHead, pszBuffer - pszHead);
pszBuffer+=2;
pszHead++;
}
// parse the IAC
else {
pszResult = ParseIAC(pszBuffer, pszBufferEnd);
if(pszBuffer == pszResult) return pszBuffer;
// see above regarding moving from front to end.
memmove(pszHead + (pszResult - pszBuffer), pszHead,
pszBuffer - pszHead);
pszHead += (pszResult - pszBuffer);
pszBuffer = pszResult;
}
}
// else copy char over to ANSI buffer
else {
pszBuffer++;
}
}
// Not a socket connection, so don't parse out IACs.
// (Paul Brannan 3/19/99)
} else {
pszBuffer = pszBufferEnd;
}
return(Parser.ParseBuffer(pszHead, pszBuffer));
}
// telProcessNetwork calls the member function TTelnetHandler::Go, since
// TTelnetHandler::Go is not a static function, and cannot be called with
// CreateThread(). (Paul Brannan 6/15/98)
DWORD WINAPI telProcessNetwork(LPVOID lpParameter) {
TelThreadParams *pParams = (TelThreadParams *)lpParameter;
return pParams->TelHandler.Go(&pParams->p);
}
// This function is what used to be telProcessNetwork (Paul Brannan 6/15/98)
DWORD TTelnetHandler::Go(LPVOID pvParams)
{
NetParams *pParams = (NetParams *)pvParams;
// No longer a need to copy pParams-> socket and create an instance
// of TANSIParser (Paul Brannan 6/15/98)
Console.sync(); // Sync with the parser so the cursor is positioned
Parser.Init(); // Reset the parser (Paul Brannan 9/19/98)
init(); // Turn on local echo (Paul Brannan 9/19/98)
*pParams->bNetFinished = 0;
char* pszHead = szBuffer;
char* pszTail = szBuffer;
while (!*pParams->bNetFinish) {
// Get data from Socket
*pParams->bNetPaused = 1; //Pause
int Result = Network.ReadString(pszTail, (szBuffer + dwBuffer) - pszTail);
// Speed up mouse by not going into loop (Paul Brannan 8/10/98)
// while(*pParams->bNetPause && !*pParams->bNetFinish) *pParams->bNetPaused = 1; //Pause
if(WaitForSingleObject(pParams->hPause, 0) == WAIT_OBJECT_0)
WaitForSingleObject(pParams->hUnPause, INFINITE);
*pParams->bNetPaused = 0; //UnPause
if (Result <= 0 || Result > dwBuffer ){
break;
}
pszTail += Result;
// Process the buffer
char* pszNewHead = pszHead;
do {
// Speed up mouse by not going into loop (Paul Brannan 8/10/98)
if(WaitForSingleObject(pParams->hPause, 0) == WAIT_OBJECT_0) {
*pParams->bNetPaused = 1;
WaitForSingleObject(pParams->hUnPause, INFINITE);
*pParams->bNetPaused = 0;
}
pszHead = pszNewHead;
pszNewHead = ParseBuffer(pszHead, pszTail); // Parse buffer
} while ((pszNewHead != pszHead) && (pszNewHead < pszTail) && !*pParams->bNetFinish);
pszHead = pszNewHead;
// When we reach the end of the buffer, move contents to the
// beginning of the buffer to get free space at the end.
if (pszTail == (szBuffer + dwBuffer)) {
memmove(szBuffer, pszHead, pszTail - pszHead);
pszTail = szBuffer + (pszTail - pszHead);
pszHead = szBuffer;
}
}
SetEvent(pParams->hExit);
printm(0, FALSE, MSG_TERMBYREM);
*pParams->bNetPaused = 1; //Pause
*pParams->bNetFinished = 1;
return 0;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?