windows-nt/Source/XPSP1/NT/shell/osshell/accesory/terminal/trmspcl.c
2020-09-26 16:20:57 +08:00

453 lines
13 KiB
C

/*===========================================================================*/
/* Copyright (c) 1987 - 1988, Future Soft Engineering, Inc. */
/* Houston, Texas */
/*===========================================================================*/
#define NOLSTRING TRUE /* jtf win3 mod */
#include <windows.h>
#include "port1632.h"
#include "dcrc.h"
#include "dynacomm.h"
#include "task.h"
/*---------------------------------------------------------------------------*/
/* getScrCh() - [scf]*/
/*---------------------------------------------------------------------------*/
BOOL getScrCh ()
{
BOOL result;
if (textIndex < textLength)
{
rdCH[1] = textPtr[textIndex];
textIndex++;
result = TRUE;
}
else
result = FALSE;
return TRUE;
}
/*---------------------------------------------------------------------------*/
/* stripLeadingSpaces() - [scf]*/
/*---------------------------------------------------------------------------*/
VOID stripLeadingSpaces ()
{
INT i;
BYTE whiteSpace[20];
sprintf (whiteSpace," %c%c",CHFILL,TAB);
i = outBuf[0] - 1;
while (strchr (whiteSpace, outBuf[i]))
{
outBuf[i] = CR;
outBuf[0]--;
i--;
}
}
/*---------------------------------------------------------------------------*/
/* getChxmit() - Get xmit char. from clipBoard or file. [scf]*/
/*---------------------------------------------------------------------------*/
BOOL getChxmit()
{
BOOL result = FALSE;
INT err;
STRING str[2];
BYTE whiteSpace[20];
DWORD charsRead;
if(!trmParams.xWordWrap || (xferFlag == XFRTYP) || (scrapSeq && copiedTable))
{
if(scrapSeq)
{
if(getScrCh())
result = TRUE;
}
else
{
charsRead = _lread((int)xferRefNo, (LPSTR)(&rdCH[1]), ioCnt);
if(charsRead == (DWORD)ioCnt)
result = TRUE;
else if(charsRead != 0)
{
if(charsRead != (DWORD)-1)
charsRead = 0;
else
result = TRUE;
}
else
result = FALSE;
}
outBufSeq = FALSE;
return(result);
}
if(!outBufSeq)
{
repeat
{
if(scrapSeq)
{
if(getScrCh())
err = ioCnt;
else
err = ioCnt + 1;
}
else
{
err = _lread(xferRefNo, (LPSTR)(&rdCH[1]), ioCnt);
}
if(err == ioCnt)
{
str[0] = 0x01; str[1] = rdCH[1];
concat (outBuf, str, outBuf);
outBufCol++;
if (rdCH[1] == CR)
outBufCol = 0;
else if (rdCH[1] == LF)
outBufCol--;
else if(outBufCol > trmParams.xWrapCol) /* WRN as outBufCol is BOOL*/
{ /* and xWrapCol is INT */
xferBytes++;
str[1] = LF;
concat (outBuf, outBuf, str);
xferBytes++;
str[1] = CR;
concat (outBuf, outBuf, str);
outBufSeq = TRUE;
stripLeadingSpaces ();
outBufCol = (INT) outBuf[0];
}
sprintf(whiteSpace," %c%c%c%c",TAB,CHFILL,CR,LF);
if (strchr(whiteSpace,rdCH[1]))
outBufSeq = TRUE;
}
else
if (*outBuf == 0)
return result;
else
outBufSeq = TRUE;
}
until(outBufSeq);
}
if(outBufSeq)
{
ioCnt = 1;
result = TRUE;
rdCH[1] = outBuf[outBuf[0]];
if (*outBuf > 1)
outBuf[0]--;
else
{
outBufSeq = FALSE;
outBuf[0] = 0;
}
}
return(result);
}
/*---------------------------------------------------------------------------*/
/* xferFile() - Transfer & Receive text file handling. [scf] [mbb] */
/*---------------------------------------------------------------------------*/
/* NOTE: xferFile no longer masks off the high order bit of the
chars sent -- I don't see how they could have gotten SET in the first place
whether they came from a file or the clipboard. [mbbx 1.02] */
VOID xferFile()
{
BOOL breakXfer;
int ndx;
breakXfer = (xferPaused || xferStopped);
if(xferEndTimer > 0)
if(xferEndTimer > tickCount()) /* WRN xferEndTimer is LONG and */
breakXfer = TRUE; /* and GetCurrentTime returns DWORD*/
else /* but was same in 3.0 too -sdj */
xferEndTimer = 0;
if(xferWaitEcho)
breakXfer = TRUE;
while(!breakXfer)
{
rxEventLoop();
ioCnt = 1;
if((xferViewPause == 0) && /* mbbx: auto line count */
(((xferFlag == XFRTYP) ) ||
((xferFlag == XFRSND) && !trmParams.xWordWrap && /* mbbx 1.03: lineWrap -> xWordWrap */
(xferTxtType == XFRNORMAL))))
{
if((ioCnt = YIELDCHARS) > xferBytes)
ioCnt = xferBytes;
}
if(xferBytes > 0)
{
if(getChxmit())
{
for(ndx = 1; ndx <= ioCnt; ndx++)
{
/* mbbx 1.10: set rdCh[0] to LF if appending LF's... */
if(((theChar = rdCH[ndx]) != CR) || (rdCH[0] != CR)) /* mbbx 1.02: CR CR LF -> CR */
{
rdCH[0] = theChar; /* mbbx 1.02: save char... */
if((theChar != LF) || (xferSndLF != -1)) /* mbbx: strip LF's */
{
if(xferFlag == XFRTYP)
modemInp(theChar, FALSE);
else
modemWr(theChar);
}
if (xferStopped)
break; /* jtf 3.30 */
if(((theChar == CR) && (xferSndLF != 0)) || ((theChar == LF) && (xferSndLF == 0)))
{
if(xferSndLF == 1) /* mbbx: append LF's */
{
if(xferFlag == XFRTYP)
modemInp(LF, FALSE);
else
modemWr(LF);
rdCH[0] = LF; /* mbbx 1.10: last char sent = LF */
}
if(xferViewPause > 0)
{
if(++xferViewLine >= xferViewPause)
{
xferViewLine = 0;
termCleanUp();
xferPauseResume(TRUE, FALSE); /* mbbx 2.00: xfer ctrls... */
}
}
}
}
else
theChar = 0; /* mbbx 1.10: avoid 2 line waits on CR CR LF */
xferBytes -= 1;
if(!scrapSeq)
updateProgress(FALSE);
}
}
else
xferBytes = 0;
}
if((theChar == CR) || (xferBytes == 0) || (ioCnt > 1) || xferPaused ||
(xferTxtType == XFRCHAR) || scrapSeq)
break; /* mbbx: DO NOT set breakXfer !!! */
}
if(xferBytes == 0)
{
if(scrapSeq)
{
scrapSeq = FALSE;
GlobalUnlock(tEScrapHandle);
tEScrapHandle = GlobalFree(tEScrapHandle);
if(!IsIconic(hItWnd))
SetCursor(LoadCursor(NULL, IDC_ARROW));
xferBytes = 1L; /* Need so pasting during a Rcv. Text doesn't terminate */
}
else
{
termCleanUp(); /* mbbx: finish term update */
xferEnd();
}
}
if(((xferFlag == XFRSND) || scrapSeq) && !breakXfer)
{
if(xferTxtType == XFRCHAR)
{
if(xferChrType == XFRCHRDELAY)
xferEndTimer = tickCount() + (xferChrDelay * 6);
else
{
xferWaitEcho = TRUE;
xferCharEcho = theChar; /* jtf 3.30 allow ansi text & 0x7f; */
}
}
else if((xferTxtType == XFRLINE) && (theChar == CR))
{
if (xferLinType == XFRLINDELAY)
xferEndTimer = tickCount() + (xferLinDelay * 6);
else
xferWaitEcho = TRUE;
}
}
}
/*---------------------------------------------------------------------------*/
/* termSpecial() - [scf]*/
/*---------------------------------------------------------------------------*/
VOID termSpecial()
{
RECT buttonRect;
HDC hButtonDC;
BOOL breakTerm;
BOOL breakKey; /* jtf 3.20 */
/* mbbx: these WERE static vars */
STRING execStr[STR255];
INT execNdx;
INT brkLen;
LONG finalTicks;
breakKey = FALSE; /* jtf 3.20 */
breakTerm = FALSE;
if(useScrap)
{
if((textPtr = GlobalLock (tEScrapHandle)) != NULL)
xferBytes = textLength = (LONG) lstrlen(textPtr);
else
xferBytes = textLength = 0;
textIndex = 0;
useScrap = FALSE;
scrapSeq = TRUE;
xferSndLF = (trmParams.outCRLF ? 0 : -1); /* mbbx 1.10: CUA */
*outBuf = 0;
if(trmParams.xWordWrap && !copiedTable)
{
outBufCol = 0;
outBufSeq = FALSE;
xferBlkSize = 1;
}
xferTxtType = (TTXTTYPE) (trmParams.xTxtType - ITMSTD);
xferChrType = (TCHRTYPE) (trmParams.xChrType - ITMCHRDELAY);
xferLinType = (TLINTYPE) (trmParams.xLinType - ITMLINDELAY);
xferChrDelay = trmParams.xChrDelay;
xferLinDelay = trmParams.xLinDelay;
if (!IsIconic (hItWnd))
SetCursor (LoadCursor (NULL, IDC_WAIT));
}
/* WRN fKeyNdx is INT and *fKeyStr is BYTE -sdj */
if(fKeyNdx <= *fKeyStr) /* mbbx 2.00: dc terminal... */
{
if((theChar = fKeyStr[fKeyNdx++]) == '^')
{
if((fKeyNdx <= *fKeyStr) && ((theChar = fKeyStr[fKeyNdx++]) == '$'))
theChar = 0xFF;
else if(theChar != '^')
{
if(theChar == '~')
theChar = '^'; /* NOTE: must use ^~ to send 0x1E */
if(((theChar >= 'A') && (theChar <= '_')) || ((theChar >= 'a') && (theChar <= 'z')))
theChar &= 0x1F;
else
theChar = fKeyStr[(--fKeyNdx)-1];
}
}
if(theChar != 0xFF)
{
sendKeyInput(theChar); /* mbbx: per slc request */
}
else /* special ctrl strings... */
{
if(((theChar = fKeyStr[fKeyNdx++]) >= 'a') && (theChar <= 'z'))
theChar -= 0x20;
while((fKeyNdx <= *fKeyStr) && (fKeyStr[fKeyNdx] == ' '))
fKeyNdx++;
switch(theChar)
{
case 'L': /* ^$L - level */
setFKeyLevel(fKeyStr[fKeyNdx++] - '0', FALSE); /* mbbx 2.00: bReset */
break;
case 'C': /* mbbx 2.00: ^$C - call... */
dialPhone();
break;
case 'H': /* mbbx 2.00: ^$H - hangup... */
hangUpPhone();
break;
case 'B': /* ^$B - break */
breakKey = TRUE; /* jtf 3.20 */
case 'D': /* mbbx 1.04: ^$D - delay */
brkLen = 2;
if(((theChar = fKeyStr[fKeyNdx]) >= '0') && (theChar <= '9'))
{
brkLen = theChar - '0';
if(((theChar = fKeyStr[++fKeyNdx]) >= '0') && (theChar <= '9'))
{
fKeyNdx += 1;
brkLen = (brkLen * 10) + (theChar - '0');
}
}
if(breakKey) /* jtf 3.20 */
modemSendBreak(brkLen);
else
delay(brkLen*60, &finalTicks); /* mbbx 1.04: ^$D <secs> */
break;
}
}
}
if(!breakTerm)
{
switch(xferFlag)
{
case XFRSND:
case XFRTYP:
if(!gbXferActive)
{
gbXferActive = TRUE;
xferFile();
gbXferActive = FALSE;
}
break;
case XFRRCV:
if(!gbXferActive)
{
gbXferActive = TRUE;
if(xferBytes == 0) /* stop button was clicked */
xferEnd();
gbXferActive = FALSE;
}
break;
default:
if(!gbXferActive)
{
gbXferActive = TRUE;
if(scrapSeq)
xferFile();
gbXferActive = FALSE;
}
break;
}
}
if(!breakTerm)
rdModem(FALSE);
}