[Ttssh2-commit] [6071] シリアル接続でボーレートが高速な場合にファイル送信を高速化するパッチを適用

Back to archive index

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;



Ttssh2-commit メーリングリストの案内
Back to archive index