[ttssh2-commit] [10447] TTXttyplayで、ファイルが開けなかった時にTTY Replayが選べなくなる問題を修正した。

Back to archive index
scmno****@osdn***** scmno****@osdn*****
2023年 1月 3日 (火) 19:46:33 JST


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


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