svnno****@sourc*****
svnno****@sourc*****
2015年 11月 5日 (木) 00:36:50 JST
Revision: 6071 http://sourceforge.jp/projects/ttssh2/scm/svn/commits/6071 Author: maya Date: 2015-11-05 00:36:50 +0900 (Thu, 05 Nov 2015) Log Message: ----------- シリアル接続でボーレートが高速な場合にファイル送信を高速化するパッチを適用 https://osdn.jp/ticket/browse.php?group_id=1412&tid=35554 Modified Paths: -------------- trunk/teraterm/common/tttypes.h trunk/teraterm/teraterm/filesys.cpp -------------- next part -------------- Modified: trunk/teraterm/common/tttypes.h =================================================================== --- trunk/teraterm/common/tttypes.h 2015-11-04 09:36:16 UTC (rev 6070) +++ trunk/teraterm/common/tttypes.h 2015-11-04 15:36:50 UTC (rev 6071) @@ -914,7 +914,7 @@ #define APC 0x9F #define InBuffSize 1024 -#define OutBuffSize 1024 +#define OutBuffSize (1024*16) typedef struct { BYTE InBuff[InBuffSize]; Modified: trunk/teraterm/teraterm/filesys.cpp =================================================================== --- trunk/teraterm/teraterm/filesys.cpp 2015-11-04 09:36:16 UTC (rev 6070) +++ trunk/teraterm/teraterm/filesys.cpp 2015-11-04 15:36:50 UTC (rev 6071) @@ -44,6 +44,15 @@ static BOOL FileRetrySend, FileRetryEcho, FileCRSend, FileReadEOF, BinaryMode; static BYTE FileByte; +#define FILE_SEND_BUF_SIZE 8192 +struct FileSendHandler { + CHAR buf[FILE_SEND_BUF_SIZE]; + int pos; + int end; +}; +static struct FileSendHandler FileSendHandler; +static int FileDlgRefresh; + static int FileBracketMode = FS_BRACKET_NONE; static int FileBracketPtr = 0; static char BracketStartStr[] = "\033[200~"; @@ -1112,7 +1121,7 @@ SendVar->FileHandle = _lopen(SendVar->FullName,OF_READ); #else SendVar->FileHandle = (int)CreateFile(SendVar->FullName, GENERIC_READ, FILE_SHARE_READ, NULL, - OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); + OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL); #endif SendVar->FileOpen = (SendVar->FileHandle>0); if (! SendVar->FileOpen) @@ -1128,6 +1137,9 @@ FileRetryEcho = FALSE; FileCRSend = FALSE; FileReadEOF = FALSE; + FileSendHandler.pos = 0; + FileSendHandler.end = 0; + FileDlgRefresh = 0; if (BracketedPasteMode()) { FileBracketMode = FS_BRACKET_START; @@ -1200,12 +1212,85 @@ } extern "C" { +// \x88ȉ\xBA\x82̎\x9E\x82͂\xB1\x82\xBF\x82\xE7\x82̊\x94\x82\xF0\x8Eg\x82\xA4 +// - BinaryMode == true +// - FileRetryEcho == false +// - FileBracketMode == false +// - cv.TelFlag == false +// - ts.LocalEcho == 0 +void FileSendBinayBoost() +{ + WORD c, fc; + LONG BCOld; + DWORD read_bytes; + + if ((SendDlg == NULL) || + ((cv.FilePause & OpSendFile) != 0)) + return; + + BCOld = SendVar->ByteCount; + + if (FileRetrySend) + { + c = CommRawOut(&cv, &(FileSendHandler.buf[FileSendHandler.pos]), + FileSendHandler.end - FileSendHandler.pos); + FileSendHandler.pos += c; + FileRetrySend = (FileSendHandler.end != FileSendHandler.pos); + if (FileRetrySend) + return; + } + + do { + if (FileSendHandler.pos == FileSendHandler.end) { +#ifdef FileVarWin16 + fc = _lread(SendVar->FileHandle, &(FileSendHandler.buf[0]), sizeof(FileSendHandler.buf)); +#else + ReadFile((HANDLE)SendVar->FileHandle, &(FileSendHandler.buf[0]), sizeof(FileSendHandler.buf), &read_bytes, NULL); + fc = LOWORD(read_bytes); +#endif + FileSendHandler.pos = 0; + FileSendHandler.end = fc; + } else { + fc = FileSendHandler.end - FileSendHandler.end; + } + + if (fc != 0) + { + c = CommRawOut(&cv, &(FileSendHandler.buf[FileSendHandler.pos]), + FileSendHandler.end - FileSendHandler.pos); + FileSendHandler.pos += c; + FileRetrySend = (FileSendHandler.end != FileSendHandler.pos); + SendVar->ByteCount = SendVar->ByteCount + c; + if (FileRetrySend) + { + if (SendVar->ByteCount != BCOld) + SendDlg->RefreshNum(); + return; + } + } + FileDlgRefresh = SendVar->ByteCount; + SendDlg->RefreshNum(); + BCOld = SendVar->ByteCount; + if (fc != 0) + return; + } while (fc != 0); + + FileTransEnd(OpSendFile); +} +} + +extern "C" { void FileSend() { WORD c, fc; LONG BCOld; DWORD read_bytes; + if (BinaryMode && !FileRetryEcho && !FileBracketMode && !cv.TelFlag && + (ts.LocalEcho == 0) && (ts.Baud >= 115200)) { + return FileSendBinayBoost(); + } + if ((SendDlg==NULL) || ((cv.FilePause & OpSendFile) !=0)) return;