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);