Revision: 10447 https://osdn.net/projects/ttssh2/scm/svn/commits/10447 Author: zmatsuo Date: 2023-01-03 19:46:33 +0900 (Tue, 03 Jan 2023) Log Message: ----------- TTXttyplayで、ファイルが開けなかった時にTTY Replayが選べなくなる問題を修正した。 Ticket: #44431 問題: TTXttyplay で再生するファイルが開けなかった時、以降 TTY Replay が グレーアウトされて選べなくなる。 原因: CreateFile がエラーになった場合 TTXCloseFile が呼ばれないので、 再生終了後の処理か行われない為。 対処: CreateFile をフックし、エラーになった場合に必要な終了処理を行う ようにした。 Tera Term 本体の CreateFile が失敗した時に TTXCloseFile を呼ばない 事に対しては別途検討する。 MFT r10110 Revision Links: -------------- https://osdn.net/projects/ttssh2/scm/svn/commits/10110 Ticket Links: ------------ https://osdn.net/projects/ttssh2/tracker/detail/44431 Modified Paths: -------------- branches/4-stable/TTXSamples/TTXttyrec/TTXttyplay.c -------------- next part -------------- Modified: branches/4-stable/TTXSamples/TTXttyrec/TTXttyplay.c =================================================================== --- branches/4-stable/TTXSamples/TTXttyrec/TTXttyplay.c 2023-01-03 10:46:23 UTC (rev 10446) +++ branches/4-stable/TTXSamples/TTXttyrec/TTXttyplay.c 2023-01-03 10:46:33 UTC (rev 10447) @@ -40,6 +40,7 @@ typedef struct { PTTSet ts; PComVar cv; + TCreateFile origPCreateFile; TReadFile origPReadFile; TWriteFile origPWriteFile; PParseParam origParseParam; @@ -54,6 +55,7 @@ int speed; BOOL pause; BOOL nowait; + BOOL open_error; struct timeval last; struct timeval wait; char openfn[MAX_PATH]; @@ -108,6 +110,7 @@ static void PASCAL TTXInit(PTTSet ts, PComVar cv) { pvar->ts = ts; pvar->cv = cv; + pvar->origPCreateFile = NULL; pvar->origPReadFile = NULL; pvar->origPWriteFile = NULL; pvar->enable = FALSE; @@ -119,6 +122,7 @@ pvar->wait.tv_usec = 1; pvar->pause = FALSE; pvar->nowait = FALSE; + pvar->open_error = FALSE; } void RestoreTitle() { @@ -137,6 +141,27 @@ SendMessage(pvar->cv->HWin, WM_COMMAND, MAKELONG(ID_SETUP_WINDOW, 0), 0); } +static HANDLE PASCAL TTXCreateFile(LPCTSTR FName, DWORD AcMode, DWORD ShMode, + LPSECURITY_ATTRIBUTES SecAttr, DWORD CreateDisposition, DWORD FileAttr, HANDLE Template) { + + HANDLE ret; + + ret = pvar->origPCreateFile(FName, AcMode, ShMode, SecAttr, CreateDisposition, FileAttr, Template); + + if (pvar->enable) { + if (ret == INVALID_HANDLE_VALUE) { + pvar->enable = FALSE; + pvar->open_error = TRUE; + pvar->played = FALSE; + } + else { + pvar->open_error = FALSE; + } + } + + return ret; +} + static BOOL PASCAL TTXReadFile(HANDLE fh, LPVOID obuff, DWORD oblen, LPDWORD rbytes, LPOVERLAPPED rol) { static struct recheader prh = { 0, 0, 0 }; static DWORD lbytes; @@ -350,8 +375,10 @@ static void PASCAL TTXOpenFile(TTXFileHooks *hooks) { if (pvar->cv->PortType == IdFile && pvar->enable) { + pvar->origPCreateFile = *hooks->PCreateFile; pvar->origPReadFile = *hooks->PReadFile; pvar->origPWriteFile = *hooks->PWriteFile; + *hooks->PCreateFile = TTXCreateFile; *hooks->PReadFile = TTXReadFile; *hooks->PWriteFile = TTXWriteFile; @@ -360,6 +387,9 @@ } static void PASCAL TTXCloseFile(TTXFileHooks *hooks) { + if (pvar->origPCreateFile) { + *hooks->PCreateFile = pvar->origPCreateFile; + } if (pvar->origPReadFile) { *hooks->PReadFile = pvar->origPReadFile; }