[Ttssh2-commit] [4971] YMODEM: 受信中に一時停止した場合、タイムアウトでNAKを送信していないため、再送できていなかった問題を修正した。

Zurück zum Archiv-Index

svnno****@sourc***** svnno****@sourc*****
2012年 7月 24日 (火) 23:41:00 JST


Revision: 4971
          http://sourceforge.jp/projects/ttssh2/scm/svn/commits/4971
Author:   yutakapon
Date:     2012-07-24 23:41:00 +0900 (Tue, 24 Jul 2012)
Log Message:
-----------
YMODEM: 受信中に一時停止した場合、タイムアウトでNAKを送信していないため、再送できていなかった問題を修正した。
http://sourceforge.jp/ticket/browse.php?group_id=1412&tid=29036

Modified Paths:
--------------
    trunk/doc/en/html/about/history.html
    trunk/doc/ja/html/about/history.html
    trunk/teraterm/ttpfile/ymodem.c

-------------- next part --------------
Modified: trunk/doc/en/html/about/history.html
===================================================================
--- trunk/doc/en/html/about/history.html	2012-07-20 14:28:11 UTC (rev 4970)
+++ trunk/doc/en/html/about/history.html	2012-07-24 14:41:00 UTC (rev 4971)
@@ -49,6 +49,7 @@
       <li>Named pipe: The pipe can not be disconnected when the Oracle Virtual Box is terminated.</li>
       <li>COM port: The default setting can not be saved in the teraterm.ini file.</li>
       <li>Macro command: The send and sendln can not transmit a character #01.</li>
+      <li>YMODEM: When the receiving a file is temporarily stopped, Tera Term can not send a NAK after timeout. So, the transfering can not be continued.</li>
     </ul>
   </li>
 

Modified: trunk/doc/ja/html/about/history.html
===================================================================
--- trunk/doc/ja/html/about/history.html	2012-07-20 14:28:11 UTC (rev 4970)
+++ trunk/doc/ja/html/about/history.html	2012-07-24 14:41:00 UTC (rev 4971)
@@ -49,6 +49,7 @@
       <li>\x96\xBC\x91O\x95t\x82\xAB\x83p\x83C\x83v: Oracle Virtual Box\x82̏I\x97\xB9\x8E\x9E\x81A\x83p\x83C\x83v\x82̐ؒf\x82\xAA\x82ł\xAB\x82Ă\xA2\x82Ȃ\xA9\x82\xC1\x82\xBD\x96\xE2\x91\xE8\x82\xF0\x8FC\x90\xB3\x82\xB5\x82\xBD\x81B</li>
       <li>COM\x83|\x81[\x83g\x82\xF0\x83f\x83t\x83H\x83\x8B\x83g\x90ݒ\xE8\x82ŕۑ\xB6\x82ł\xAB\x82Ȃ\xA2\x96\xE2\x91\xE8\x82\xF0\x8FC\x90\xB3\x82\xB5\x82\xBD\x81B</li>
       <li>\x83}\x83N\x83\x8D\x83R\x83}\x83\x93\x83h send, sendln \x82ŁA0x01 \x82\xF0\x8A܂ޕ\xB6\x8E\x9A\x97\xF1\x82𐳂\xB5\x82\xAD\x91\x97\x82\xEA\x82Ȃ\xA2\x96\xE2\x91\xE8\x82\xF0\x8FC\x90\xB3\x82\xB5\x82\xBD\x81B</li>
+      <li>YMODEM: \x8E\xF3\x90M\x92\x86\x82Ɉꎞ\x92\xE2\x8E~\x82\xB5\x82\xBD\x8Fꍇ\x81A\x83^\x83C\x83\x80\x83A\x83E\x83g\x82\xC5NAK\x82𑗐M\x82\xB5\x82Ă\xA2\x82Ȃ\xA2\x82\xBD\x82߁A\x8Dđ\x97\x82ł\xAB\x82Ă\xA2\x82Ȃ\xA9\x82\xC1\x82\xBD\x96\xE2\x91\xE8\x82\xF0\x8FC\x90\xB3\x82\xB5\x82\xBD\x81B</li>
     </ul>
   </li>
 

Modified: trunk/teraterm/ttpfile/ymodem.c
===================================================================
--- trunk/teraterm/ttpfile/ymodem.c	2012-07-20 14:28:11 UTC (rev 4970)
+++ trunk/teraterm/ttpfile/ymodem.c	2012-07-24 14:41:00 UTC (rev 4971)
@@ -145,6 +145,48 @@
 	FTSetTimeOut(fv,t);
 }
 
+void YSendNAKTimeout(PFileVar fv, PYVar yv, PComVar cv)
+{
+	BYTE b;
+	int t;
+
+	/* flush comm buffer */
+	cv->InBuffCount = 0;
+	cv->InPtr = 0;
+
+	yv->NAKCount--;
+	if (yv->NAKCount<0)
+	{
+		if (yv->NAKMode==YnakC)
+		{
+			YSetOpt(fv,yv,XoptCheck);
+			yv->NAKMode = YnakC;
+			yv->NAKCount = 9;
+		}
+		else {
+			YCancel(fv,yv,cv);
+			return;
+		}
+	}
+
+	//if (yv->NAKMode!=YnakC)
+	if (1)
+	{
+		b = NAK;
+		if ((yv->PktNum==0) && (yv->PktNumOffset==0))
+			t = TimeOutInit;
+		else
+			t = yv->TOutLong;
+	}
+	else {
+		b = 'C';
+		t = TimeOutC;
+	}
+	YWrite(fv,yv,cv,&b,1);
+	yv->PktReadMode = XpktSOH;
+	FTSetTimeOut(fv,t);
+}
+
 WORD YCalcCheck(PYVar yv, PCHAR PktBuf)
 {
 	int i;
@@ -310,7 +352,10 @@
 		yv->YMode = 0; // quit
 		break;
 	case IdXReceive:
-		YSendNAK(fv,yv,cv);
+		if ((yv->PktNum == 0) && yv->PktNumOffset == 0) 
+			YSendNAK(fv,yv,cv);
+		else
+			YSendNAKTimeout(fv,yv,cv);
 		break;
 	}
 }
@@ -486,11 +531,11 @@
 
 		p = &(yv->PktIn[3]);
 		name = p;
-		strncpy_s(&(fv->FullName[fv->DirLen]),
-				  sizeof(fv->FullName) - fv->DirLen, name,
-				  _TRUNCATE);
-		if (!FTCreateFile(fv))
-			return FALSE;
+		strncpy_s(&(fv->FullName[fv->DirLen]),
+				  sizeof(fv->FullName) - fv->DirLen, name,
+				  _TRUNCATE);
+		if (!FTCreateFile(fv))
+			return FALSE;
 		nameend = name + 1 + strlen(name);
 		if (*nameend) {
 			ret = sscanf(nameend, "%ld%lo%o", &bytes_total, &modtime, &mode);



Ttssh2-commit メーリングリストの案内
Zurück zum Archiv-Index