[Ttssh2-commit] [8852] ログファイルダイアログを追加

Back to archive index
scmno****@osdn***** scmno****@osdn*****
2020年 7月 14日 (火) 00:31:47 JST


Revision: 8852
          https://osdn.net/projects/ttssh2/scm/svn/commits/8852
Author:   zmatsuo
Date:     2020-07-14 00:31:46 +0900 (Tue, 14 Jul 2020)
Log Message:
-----------
ログファイルダイアログを追加

- ログダイアログ(IDD_LOGDLG)を追加
  - ログファイルのダイアログ表示に共通関数を使用しないよう修正
    - GetTransFname()#ttpfile を使用しない
  - filesys_log.rc, filesys_log_res.h 追加
  - ログコメントダイアログ(IDD_COMMENT_DIALOG)を移動
  - VS2005,2019,cmake にファイルを追加
- LogVar#filesys.cpp をグローバル変数からファイル内変数に変更
  - APIを追加,Log...()#filesys.cpp

Modified Paths:
--------------
    trunk/teraterm/common/tt_res.h
    trunk/teraterm/common/ttftypes.h
    trunk/teraterm/common/tttypes.h
    trunk/teraterm/teraterm/CMakeLists.txt
    trunk/teraterm/teraterm/filesys.cpp
    trunk/teraterm/teraterm/filesys.h
    trunk/teraterm/teraterm/ttdde.c
    trunk/teraterm/teraterm/ttermpro.rc
    trunk/teraterm/teraterm/ttermpro.v16.vcxproj
    trunk/teraterm/teraterm/ttermpro.v16.vcxproj.filters
    trunk/teraterm/teraterm/ttermpro.vcproj
    trunk/teraterm/teraterm/vtwin.cpp
    trunk/teraterm/ttpfile/ttfile.c

Added Paths:
-----------
    trunk/teraterm/teraterm/filesys_log.rc
    trunk/teraterm/teraterm/filesys_log_res.h

-------------- next part --------------
Modified: trunk/teraterm/common/tt_res.h
===================================================================
--- trunk/teraterm/common/tt_res.h	2020-07-13 15:31:31 UTC (rev 8851)
+++ trunk/teraterm/common/tt_res.h	2020-07-13 15:31:46 UTC (rev 8852)
@@ -10,7 +10,6 @@
 #define IDI_TTERM_CLASSIC               103
 #define IDI_VT_CLASSIC                  104
 #define IDI_CYGTERM                     105
-#define IDD_COMMENT_DIALOG              110
 #define IDD_EXTERNAL_SETUP              111
 #define IDD_TABSHEET_GENERAL            111
 #define IDD_BROADCAST_DIALOG            112
@@ -30,7 +29,6 @@
 #define IDD_TABSHEET_CODING             128
 #define IDD_TABSHEET_FONT               129
 #define IDR_TEKMENU                     1000
-#define IDC_EDIT_COMMENT                1000
 #define IDC_EDIT_FULLPATH               1001
 #define IDC_FULLPATH_LABEL              1002
 #define IDC_LINECOPY                    1003

Modified: trunk/teraterm/common/ttftypes.h
===================================================================
--- trunk/teraterm/common/ttftypes.h	2020-07-13 15:31:31 UTC (rev 8851)
+++ trunk/teraterm/common/ttftypes.h	2020-07-13 15:31:46 UTC (rev 8852)
@@ -37,7 +37,7 @@
 
 /* GetTransFname function id */
 #define GTF_SEND 0 /* Send file */
-#define GTF_LOG  1 /* Log */
+//#define GTF_LOG  1 /* Log */
 #define GTF_BP   2 /* B-Plus Send */
 
 /* GetMultiFname function id */

Modified: trunk/teraterm/common/tttypes.h
===================================================================
--- trunk/teraterm/common/tttypes.h	2020-07-13 15:31:31 UTC (rev 8851)
+++ trunk/teraterm/common/tttypes.h	2020-07-13 15:31:46 UTC (rev 8852)
@@ -194,6 +194,7 @@
 
 // LogDialog Option
 #define LOGDLG_BINARY          1
+#if 0	// TODO\x8F\xC1\x82\xB7
 #define LOGDLG_APPEND          (1 << 1)
 #define LOGDLG_PLAINTEXT       (1 << 2)
 #define LOGDLG_TIMESTAMP       (1 << 3)
@@ -207,6 +208,7 @@
  * LOGDLG_ELAPSEDCON == 1 => \x90ڑ\xB1\x8AJ\x8En\x82\xA9\x82\xE7
  */
 #define LOGDLG_ELAPSEDCON      LOGDLG_UTC
+#endif
 
 // Log Timestamp Type
 enum LogTimestampType {
@@ -216,7 +218,7 @@
     TIMESTAMP_ELAPSED_CONNECTED
 };
 
-// log flags (used in ts.LogFlag) 
+// log flags (used in ts.LogFlag)
 #define LOG_TEL 1
 #define LOG_KMT 2
 #define LOG_X   4
@@ -822,7 +824,7 @@
 typedef struct {
 	PCHAR SetupFN; // setup file name
 	WORD PortType; // TCPIP/Serial
-	PCHAR HostName; // host name 
+	PCHAR HostName; // host name
 	WORD Telnet; // non-zero: enable telnet
 	WORD TelPort; // default TCP port# for telnet
 	WORD TCPPort; // TCP port #

Modified: trunk/teraterm/teraterm/CMakeLists.txt
===================================================================
--- trunk/teraterm/teraterm/CMakeLists.txt	2020-07-13 15:31:31 UTC (rev 8851)
+++ trunk/teraterm/teraterm/CMakeLists.txt	2020-07-13 15:31:46 UTC (rev 8852)
@@ -27,6 +27,8 @@
   dnddlg.h
   filesys.cpp
   filesys.h
+  filesys_log.rc
+  filesys_log_res.h
   font_pp.cpp
   font_pp.h
   font_pp.rc

Modified: trunk/teraterm/teraterm/filesys.cpp
===================================================================
--- trunk/teraterm/teraterm/filesys.cpp	2020-07-13 15:31:31 UTC (rev 8851)
+++ trunk/teraterm/teraterm/filesys.cpp	2020-07-13 15:31:46 UTC (rev 8852)
@@ -31,11 +31,13 @@
 #include <stdio.h>
 #include <io.h>
 #include <process.h>
+#include <windows.h>
+#include <htmlhelp.h>
+#include <assert.h>
 
 #include "teraterm.h"
 #include "tttypes.h"
 #include "ttftypes.h"
-#include "tt_res.h"
 #include "ftdlg.h"
 #include "protodlg.h"
 #include "ttwinman.h"
@@ -46,20 +48,20 @@
 #include "dlglib.h"
 #include "vtterm.h"
 #include "win16api.h"
-
-#include "filesys.h"
 #include "ftlib.h"
-
 #include "buffer.h"
+#include "helpid.h"
+#include "layer_for_unicode.h"
 
-#include <io.h>
-#include <process.h>
+#include "filesys.h"
+#include "tt_res.h"
+#include "filesys_log_res.h"
 
 #define FS_BRACKET_NONE  0
 #define FS_BRACKET_START 1
 #define FS_BRACKET_END   2
 
-PFileVar LogVar = NULL;
+static PFileVar LogVar = NULL;
 PFileVar SendVar = NULL;
 PFileVar FileVar = NULL;
 static PCHAR ProtoVar = NULL;
@@ -93,7 +95,7 @@
 static int TTFILECount = 0;
 
 PGetSetupFname GetSetupFname;
-PGetTransFname GetTransFname;
+static PGetTransFname GetTransFname;
 PGetMultiFname GetMultiFname;
 PGetGetFname GetGetFname;
 PSetFileVar SetFileVar;
@@ -350,9 +352,13 @@
 	}
 }
 
-// &h \x82\xF0\x83z\x83X\x83g\x96\xBC\x82ɒu\x8A\xB7 (2007.5.14)
-// &p \x82\xF0TCP\x83|\x81[\x83g\x94ԍ\x86\x82ɒu\x8A\xB7 (2009.6.12)
-void ConvertLogname(char *c, int destlen)
+/**
+ *	\x83t\x83@\x83C\x83\x8B\x96\xBC\x95\xB6\x8E\x9A\x97\xF1\x82̒u\x82\xAB\x8A\xB7\x82\xA6
+ *		&h	\x83z\x83X\x83g\x96\xBC\x82ɒu\x8A\xB7 (2007.5.14)
+ *		&p	TCP\x83|\x81[\x83g\x94ԍ\x86\x82ɒu\x8A\xB7 (2009.6.12)
+ *		&u	\x83\x8D\x83O\x83I\x83\x93\x92\x86\x82̃\x86\x81[\x83U\x96\xBC
+ */
+static void ConvertLogname(char *c, int destlen)
 {
 	char buf[MAXPATHLEN], buf2[MAXPATHLEN], *p = c;
 	char tmphost[1024];
@@ -410,7 +416,7 @@
 	strncpy_s(c, destlen, buf, _TRUNCATE);
 }
 
-void FixLogOption()
+static void FixLogOption()
 {
 	if (ts.LogBinary) {
 		ts.LogTypePlainText = false;
@@ -423,7 +429,6 @@
 static void CloseFileSync(PFileVar ptr)
 {
 	BOOL ret;
-	DWORD code;
 
 	if (!ptr->FileOpen)
 		return;
@@ -436,7 +441,7 @@
 			WaitForSingleObject(ptr->LogThread, INFINITE);
 		}
 		else {
-			code = GetLastError();
+			//DWORD code = GetLastError();
 		}
 		CloseHandle(ptr->LogThread);
 		ptr->LogThread = INVALID_HANDLE_VALUE;
@@ -480,139 +485,336 @@
 	return (0);
 }
 
-
-BOOL LogStart()
+/**
+ *	\x83_\x83C\x83A\x83\x8D\x83O\x82̓\xE0\x97e\x82\xF0 ts \x82ɏ\x91\x82\xAB\x96߂\xB5
+ *
+ *	TODO
+ *		\x83_\x83C\x83A\x83\x8D\x83O\x82Őݒ肵\x82\xBD\x92l\x82͈ꎞ\x93I\x82Ȃ\xE0\x82̂\xC5
+ *		\x90ݒ\xE8\x82\xF0\x8F㏑\x82\xAB\x82\xB7\x82\xE9\x82̂͗ǂ\xAD\x82Ȃ\xA2\x82̂ł͂Ȃ\xA2\x82\xBE\x82낤\x82\xA9?
+ */
+static void SetLogFlags(HWND Dialog)
 {
-	LONG Option;
-	char *logdir;
-	unsigned tid;
-	DWORD ofs, size, written_size;
-	char buf[512];
-	const char *crlf = "\r\n";
-	DWORD crlf_len = 2;
-	char FileDirExpanded[MAX_PATH];
+	WORD BinFlag, val;
 
-	if ((FileLog) || (BinLog)) return FALSE;
+	GetRB(Dialog, &BinFlag, IDC_FOPTBIN, IDC_FOPTBIN);
+	ts.LogBinary = BinFlag;
 
-	if (! LoadTTFILE()) return FALSE;
-	if (! NewFileVar(&LogVar))
-	{
-		FreeTTFILE();
-		return FALSE;
+	GetRB(Dialog, &val, IDC_FOPTAPPEND, IDC_FOPTAPPEND);
+	ts.Append = val;
+
+	if (!BinFlag) {
+		GetRB(Dialog, &val, IDC_PLAINTEXT, IDC_PLAINTEXT);
+		ts.LogTypePlainText = val;
+
+		GetRB(Dialog, &val, IDC_TIMESTAMP, IDC_TIMESTAMP);
+		ts.LogTimestamp = val;
 	}
-	LogVar->OpId = OpLog;
 
-	if (strlen(ts.LogDefaultPath) > 0) {
-		logdir = ts.LogDefaultPath;
+	GetRB(Dialog, &val, IDC_HIDEDIALOG, IDC_HIDEDIALOG);
+	ts.LogHideDialog = val;
+
+	GetRB(Dialog, &val, IDC_ALLBUFF_INFIRST, IDC_ALLBUFF_INFIRST);
+	ts.LogAllBuffIncludedInFirst = val;
+
+	ts.LogTimestampType = (GetCurSel(Dialog, IDC_TIMESTAMPTYPE) - 1);
+}
+
+/**
+ *	\x83\x8D\x83O\x83t\x83@\x83C\x83\x8B\x83`\x83F\x83b\x83N
+ *
+ *	@param[in]	filename
+ *	@param[out]	exist	TURE/FALSE
+ *	@param[out]	bom		0	no BOM (or file not exist)
+ *						1	UTF-8
+ *						2	UTF-16LE
+ *						3	UTF-16BE
+ */
+static void CheckLogFile(const char *filename, BOOL *exist, int *bom)
+{
+	// \x83t\x83@\x83C\x83\x8B\x82\xAA\x91\xB6\x8D݂\xB7\x82\xE9?
+	DWORD logdir = GetFileAttributes(filename);
+	if ((logdir != INVALID_FILE_ATTRIBUTES) && ((logdir & FILE_ATTRIBUTE_DIRECTORY) == 0)) {
+		// \x83t\x83@\x83C\x83\x8B\x82\xAA\x82\xA0\x82\xC1\x82\xBD , \x83A\x83y\x83\x93\x83h\x82\xB7\x82\xE9\x82‚\xE0\x82\xE8
+		*exist = TRUE;
+
+		// BOM\x97L\x82\xE8/\x96\xB3\x82\xB5\x83`\x83F\x83b\x83N
+		FILE *fp = fopen(filename, "rb");
+		unsigned char tmp[4];
+		size_t l = fread(tmp, 1, sizeof(tmp), fp);
+		fclose(fp);
+		if (l < 2) {
+			*bom = 0;
+		} else if (l >= 2 && tmp[0] == 0xff && tmp[1] == 0xfe) {
+			// UTF-16LE
+			*bom = 2;
+		} else if (l >= 2 && tmp[0] == 0xfe && tmp[1] == 0xff) {
+			// UTF-16BE
+			*bom = 3;
+		} else if (l >= 3 && tmp[0] == 0xef && tmp[1] == 0xbb && tmp[2] == 0xbf) {
+			// UTF-8
+			*bom = 1;
+		} else {
+			*bom = 0;
+		}
 	}
-	else if (strlen(ts.FileDir) > 0) {
-		ExpandEnvironmentStrings(ts.FileDir, FileDirExpanded, sizeof(FileDirExpanded));
-		logdir = FileDirExpanded;
+	else {
+		// \x83t\x83@\x83C\x83\x8B\x82\xAA\x82Ȃ\xA2\x81A\x90V\x8BK
+		*exist = FALSE;
+		*bom = 0;
 	}
+}
+
+static void CheckLogFile(HWND Dialog, const char *filename)
+{
+	BOOL exist;
+	int bom;
+	CheckLogFile(filename, &exist, &bom);
+	if (exist) {
+		// \x83t\x83@\x83C\x83\x8B\x82\xAA\x91\xB6\x8D݂\xB7\x82\xE9 -> \x83A\x83y\x83\x93\x83h\x82\xB7\x82\xE9\x82‚\xE0\x82\xE8?
+		CheckDlgButton(Dialog, IDC_FOPTAPPEND, BST_CHECKED);
+		if (bom != 0) {
+			// BOM\x97L\x82\xE8
+			CheckDlgButton(Dialog, IDC_BOM, BST_CHECKED);
+		}
+		else {
+			// BOM\x82Ȃ\xB5
+			CheckDlgButton(Dialog, IDC_BOM, BST_UNCHECKED);
+		}
+	}
 	else {
-		logdir = ts.HomeDir;
+		// \x83t\x83@\x83C\x83\x8B\x82\xAA\x82Ȃ\xA2\x81A\x90V\x8BK
+		CheckDlgButton(Dialog, IDC_FOPTAPPEND, BST_UNCHECKED);
+		CheckDlgButton(Dialog, IDC_BOM, BST_CHECKED);
 	}
+}
 
-	if (strlen(&(LogVar->FullName[LogVar->DirLen]))==0) {
-		Option = 0;
+typedef struct {
+	char *filename;
+	BOOL append;
+	BOOL bom;
+} LogDlgData_t;
+
+static INT_PTR CALLBACK LogFnHook(HWND Dialog, UINT Message, WPARAM wParam, LPARAM lParam)
+{
+	static const DlgTextInfo TextInfos[] = {
+		{ 0, "DLG_TABSHEET_TITLE_LOG" },
+		{ IDC_FOPTBIN, "DLG_FOPT_BINARY" },
+		{ IDC_FOPTAPPEND, "DLG_FOPT_APPEND" },
+		{ IDC_PLAINTEXT, "DLG_FOPT_PLAIN" },
+		{ IDC_HIDEDIALOG, "DLG_FOPT_HIDEDIALOG" },
+		{ IDC_ALLBUFF_INFIRST, "DLG_FOPT_ALLBUFFINFIRST" },
+		{ IDC_TIMESTAMP, "DLG_FOPT_TIMESTAMP" },
+	};
+	static const I18nTextInfo timestamp_list[] = {
+		{ "DLG_FOPT_TIMESTAMP_LOCAL", L"Local Time" },
+		{ "DLG_FOPT_TIMESTAMP_UTC", L"UTC" },
+		{ "DLG_FOPT_TIMESTAMP_ELAPSED_LOGGING", L"Elapsed Time (Logging)" },
+		{ "DLG_FOPT_TIMESTAMP_ELAPSED_CONNECTION", L"Elapsed Time (Connection)" },
+	};
+	const char *UILanguageFile = ts.UILanguageFile;
+	LogDlgData_t *data = (LogDlgData_t *)GetWindowLongPtr(Dialog, DWLP_USER);
+
+	if (Message == 	RegisterWindowMessage(HELPMSGSTRING)) {
+		// \x83R\x83\x82\x83\x93\x83_\x83C\x83A\x83\x8D\x83O\x82\xA9\x82\xE7\x82̃w\x83\x8B\x83v\x83\x81\x83b\x83Z\x81[\x83W\x82\xF0\x95t\x82\xAF\x91ւ\xA6\x82\xE9
+		Message = WM_COMMAND;
+		wParam = IDHELP;
+	}
+	switch (Message) {
+	case WM_INITDIALOG: {
+		data = (LogDlgData_t *)lParam;
+		SetWindowLongPtr(Dialog, DWLP_USER, (LONG_PTR)data);
+		::DragAcceptFiles(Dialog, TRUE);
+
+		SetDlgTexts(Dialog, TextInfos, _countof(TextInfos), UILanguageFile);
+		SetI18nList("Tera Term", Dialog, IDC_TIMESTAMPTYPE, timestamp_list, _countof(timestamp_list),
+					UILanguageFile, 0);
+
+		SendDlgItemMessage(Dialog, IDC_TEXTCODING_DROPDOWN, CB_ADDSTRING, 0, (LPARAM)"UTF-8");
+		SendDlgItemMessage(Dialog, IDC_TEXTCODING_DROPDOWN, CB_SETCURSEL, 0, 0);
+
+		SetDlgItemTextA(Dialog, IDC_FOPT_FILENAME_EDIT, data->filename);
+		free(data->filename);
+		data->filename = NULL;
+
+		// Binary/Text \x83`\x83F\x83b\x83N\x83{\x83b\x83N\x83X
 		if (ts.LogBinary) {
-			Option |= LOGDLG_BINARY;
+			SendDlgItemMessage(Dialog, IDC_FOPTBIN, BM_SETCHECK, BST_CHECKED, 0);
 		}
+		else {
+			SendDlgItemMessage(Dialog, IDC_FOPTTEXT, BM_SETCHECK, BST_CHECKED, 0);
+		}
+
+		// Append \x83`\x83F\x83b\x83N\x83{\x83b\x83N\x83X
 		if (ts.Append) {
-			Option |= LOGDLG_APPEND;
+			SetRB(Dialog, 1, IDC_FOPTAPPEND, IDC_FOPTAPPEND);
 		}
-		if (ts.LogTypePlainText) {
-			Option |= LOGDLG_PLAINTEXT;
+
+		// Plain Text \x83`\x83F\x83b\x83N\x83{\x83b\x83N\x83X
+		if (ts.LogBinary) {
+			// Binary\x83t\x83\x89\x83O\x82\xAA\x97L\x8C\xF8\x82ȂƂ\xAB\x82̓`\x83F\x83b\x83N\x82ł\xAB\x82Ȃ\xA2
+			DisableDlgItem(Dialog, IDC_PLAINTEXT, IDC_PLAINTEXT);
 		}
-		if (ts.LogTimestamp) {
-			Option |= LOGDLG_TIMESTAMP;
+		else if (ts.LogTypePlainText) {
+			SetRB(Dialog, 1, IDC_PLAINTEXT, IDC_PLAINTEXT);
 		}
+
+		// Hide dialog\x83`\x83F\x83b\x83N\x83{\x83b\x83N\x83X (2008.1.30 maya)
 		if (ts.LogHideDialog) {
-			Option |= LOGDLG_HIDEDIALOG;
+			SetRB(Dialog, 1, IDC_HIDEDIALOG, IDC_HIDEDIALOG);
 		}
+
+		// Include screen buffer\x83`\x83F\x83b\x83N\x83{\x83b\x83N\x83X (2013.9.29 yutaka)
 		if (ts.LogAllBuffIncludedInFirst) {
-			Option |= LOGDLG_INCSCRBUFF;
+			SetRB(Dialog, 1, IDC_ALLBUFF_INFIRST, IDC_ALLBUFF_INFIRST);
 		}
 
-		switch (ts.LogTimestampType) {
-		case TIMESTAMP_LOCAL:
-			// nothing to do
+		// timestamp\x83`\x83F\x83b\x83N\x83{\x83b\x83N\x83X (2006.7.23 maya)
+		if (ts.LogBinary) {
+			// Binary\x83t\x83\x89\x83O\x82\xAA\x97L\x8C\xF8\x82ȂƂ\xAB\x82̓`\x83F\x83b\x83N\x82ł\xAB\x82Ȃ\xA2
+			DisableDlgItem(Dialog, IDC_TIMESTAMP, IDC_TIMESTAMP);
+		}
+		else if (ts.LogTimestamp) {
+			SetRB(Dialog, 1, IDC_TIMESTAMP, IDC_TIMESTAMP);
+		}
+
+		// timestamp \x8E\xED\x95\xCA
+		int tstype = ts.LogTimestampType == TIMESTAMP_LOCAL ? 0 :
+				ts.LogTimestampType == TIMESTAMP_UTC ? 1 :
+				ts.LogTimestampType == TIMESTAMP_ELAPSED_LOGSTART ? 2 :
+				ts.LogTimestampType == TIMESTAMP_ELAPSED_CONNECTED ? 3 : 0;
+		SendDlgItemMessage(Dialog, IDC_TIMESTAMPTYPE, CB_SETCURSEL, tstype, 0);
+		if (ts.LogBinary || !ts.LogTimestamp) {
+			DisableDlgItem(Dialog, IDC_TIMESTAMPTYPE, IDC_TIMESTAMPTYPE);
+		}
+
+		CenterWindow(Dialog, GetParent(Dialog));
+
+		return TRUE;
+	}
+
+	case WM_COMMAND:
+		switch (LOWORD(wParam)) {
+		case IDOK: {
+			char filename[MAX_PATH];
+			GetDlgItemTextA(Dialog, IDC_FOPT_FILENAME_EDIT, filename, _countof(filename));
+			data->filename = _strdup(filename);
+			data->append = IsDlgButtonChecked(Dialog, IDC_FOPTAPPEND) == BST_CHECKED;
+			data->bom = IsDlgButtonChecked(Dialog, IDC_BOM) == BST_CHECKED;
+			SetLogFlags(Dialog);
+			EndDialog(Dialog, IDOK);
 			break;
-		case TIMESTAMP_UTC:
-			Option |= LOGDLG_UTC;
+		}
+		case IDCANCEL:
+			EndDialog(Dialog, IDCANCEL);
 			break;
-		case TIMESTAMP_ELAPSED_LOGSTART:
-			Option |= LOGDLG_ELAPSED;
+		case IDHELP:
+			OpenHelp(HH_HELP_CONTEXT, HlpFileLog, ts.UILanguageFile);
 			break;
-		case TIMESTAMP_ELAPSED_CONNECTED:
-			Option |= LOGDLG_ELAPSED | LOGDLG_ELAPSEDCON;
-			break;
-		default:
-			// not reached
-			break;
-		}
+		case IDC_FOPT_FILENAME_BUTTON: {
+			/* save current dir */
+			wchar_t curdir[MAXPATHLEN];
+			_GetCurrentDirectoryW(_countof(curdir), curdir);
 
-		// \x83\x8D\x83O\x82̃f\x83t\x83H\x83\x8B\x83g\x83t\x83@\x83C\x83\x8B\x96\xBC\x82\xF0\x90ݒ\xE8 (2006.8.28 maya)
-		strncat_s(LogVar->FullName, sizeof(LogVar->FullName), ts.LogDefaultName, _TRUNCATE);
-		ParseStrftimeFileName(LogVar->FullName, sizeof(LogVar->FullName));
-		ConvertLogname(LogVar->FullName, sizeof(LogVar->FullName));
+			char fname[MAX_PATH];
+			GetDlgItemTextA(Dialog, IDC_FOPT_FILENAME_EDIT, fname, _countof(fname));
 
-		strncpy_s(LogVar->LogDefaultPath, sizeof(LogVar->LogDefaultPath), ts.LogDefaultPath, _TRUNCATE);
-		if (! (*GetTransFname)(LogVar, logdir, GTF_LOG, &Option)) {
-			FreeFileVar(&LogVar);
-			FreeTTFILE();
-			return FALSE;
-		}
+			char FNFilter[128*3];
+			get_lang_msg("FILEDLG_ALL_FILTER", FNFilter, sizeof(FNFilter), "All(*.*)\\0*.*\\0\\0", UILanguageFile);
 
-		ts.LogBinary = CheckFlag(Option, LOGDLG_BINARY);
-			CheckFlag(Option, LOGDLG_BINARY);
-		ts.Append =
-			CheckFlag(Option, LOGDLG_APPEND);
-		ts.LogTypePlainText =
-			CheckFlag(Option, LOGDLG_PLAINTEXT);
-		ts.LogTimestamp =
-			CheckFlag(Option, LOGDLG_TIMESTAMP);
-		ts.LogHideDialog =
-			CheckFlag(Option, LOGDLG_HIDEDIALOG);
-		ts.LogAllBuffIncludedInFirst =
-			CheckFlag(Option, LOGDLG_INCSCRBUFF);
+			char caption[MAX_PATH];
+			char uimsg[MAX_UIMSG];
+			get_lang_msg("FILEDLG_TRANS_TITLE_LOG", uimsg, sizeof(uimsg), TitLog, UILanguageFile);
+			strncpy_s(caption, sizeof(caption),"Tera Term: ", _TRUNCATE);
+			strncat_s(caption, sizeof(caption), uimsg, _TRUNCATE);
 
-		if (Option & LOGDLG_ELAPSED) {
-			// \x8Co\x89ߎ\x9E\x8A\xD4
-			if (Option & LOGDLG_ELAPSEDCON) {
-				ts.LogTimestampType = TIMESTAMP_ELAPSED_CONNECTED;
+			OPENFILENAME ofn = {};
+			ofn.lStructSize = get_OPENFILENAME_SIZEA();
+			//ofn.Flags = OFN_PATHMUSTEXIST | OFN_OVERWRITEPROMPT;
+			ofn.Flags |= OFN_EXPLORER | OFN_ENABLESIZING;
+			ofn.Flags |= OFN_SHOWHELP;
+			ofn.Flags |= OFN_NOCHANGEDIR;		// \x82\xA4\x82܂\xAD\x93\xAE\x8D삵\x82Ȃ\xA2\x8A‹\xAB\x82\xE0\x82\xA0\x82\xE9\x82悤\x82\xBE
+			ofn.hwndOwner = Dialog;
+			ofn.lpstrFilter = FNFilter;
+			ofn.nFilterIndex = 1;
+			ofn.lpstrFile = fname;
+			ofn.nMaxFile = sizeof(fname);
+			ofn.lpstrTitle = caption;
+			BOOL Ok = GetSaveFileName(&ofn);
+			if (Ok) {
+				SetDlgItemTextA(Dialog, IDC_FOPT_FILENAME_EDIT, fname);
 			}
-			else {
-				ts.LogTimestampType = TIMESTAMP_ELAPSED_LOGSTART;
-			}
+
+			/* restore dir */
+			_SetCurrentDirectoryW(curdir);
+
+			break;
 		}
-		else {
-			// \x93\xFA\x8E\x9E\x8C`\x8E\xAE
-			if (Option & LOGDLG_UTC) {
-				ts.LogTimestampType = TIMESTAMP_UTC;
+		case IDC_FOPTBIN:
+			DisableDlgItem(Dialog, IDC_PLAINTEXT, IDC_TIMESTAMP);
+			DisableDlgItem(Dialog, IDC_TIMESTAMPTYPE, IDC_TIMESTAMPTYPE);
+			EnableWindow(GetDlgItem(Dialog, IDC_TEXTCODING_DROPDOWN), FALSE);
+			break;
+		case IDC_FOPTTEXT:
+			EnableWindow(GetDlgItem(Dialog, IDC_TEXTCODING_DROPDOWN), TRUE);
+			EnableDlgItem(Dialog, IDC_PLAINTEXT, IDC_TIMESTAMP);
+			// FALLTHROUGH -- BinFlag \x82\xAA off \x82̎\x9E\x82\xCD Timestamp \x8E\xED\x95ʂ̗L\x8C\xF8/\x96\xB3\x8C\xF8\x82\xF0\x90ݒ肷\x82\xE9
+		case IDC_TIMESTAMP:
+			if (IsDlgButtonChecked(Dialog, IDC_TIMESTAMP) == BST_CHECKED) {
+				EnableDlgItem(Dialog, IDC_TIMESTAMPTYPE, IDC_TIMESTAMPTYPE);
 			}
 			else {
-				ts.LogTimestampType = TIMESTAMP_LOCAL;
+				DisableDlgItem(Dialog, IDC_TIMESTAMPTYPE, IDC_TIMESTAMPTYPE);
 			}
+			break;
+		case IDC_FOPT_FILENAME_EDIT:
+			if (HIWORD(wParam) == EN_CHANGE){
+				char filename[MAX_PATH];
+				GetDlgItemTextA(Dialog, IDC_FOPT_FILENAME_EDIT, filename, _countof(filename));
+				CheckLogFile(Dialog, filename);
+			}
+			break;
 		}
+		break;
+	case WM_DROPFILES: {
+		// \x95\xA1\x90\x94\x83h\x83\x8D\x83b\x83v\x82\xB3\x82\xEA\x82Ă\xE0\x8Dŏ\x89\x82\xCC1\x82‚\xBE\x82\xAF\x82\xF0\x88\xB5\x82\xA4
+		HDROP hDrop = (HDROP)wParam;
+		const UINT len = _DragQueryFileW(hDrop, 0, NULL, 0);
+		if (len == 0) {
+			DragFinish(hDrop);
+			return TRUE;
+		}
+		wchar_t *filename = (wchar_t *)malloc(sizeof(wchar_t) * (len + 1));
+		_DragQueryFileW(hDrop, 0, filename, len + 1);
+		filename[len] = '\0';
+		_SetDlgItemTextW(Dialog, IDC_FOPT_FILENAME_EDIT, filename);
+		SendDlgItemMessage(Dialog, IDC_FOPT_FILENAME_EDIT, EM_SETSEL, len, len);
+		free(filename);
+		DragFinish(hDrop);
+		return TRUE;
 	}
-	else {
-		// LogVar->DirLen = 0 \x82\xBE\x82Ƃ\xB1\x82\xB1\x82ɗ\x88\x82\xE9
-		// \x83t\x83\x8B\x83p\x83X\x81E\x91\x8A\x91΃p\x83X\x82Ƃ\xE0\x82\xC9 LogVar->FullName \x82ɓ\xFC\x82\xEA\x82Ă\xA8\x82\xAD\x95K\x97v\x82\xAA\x82\xA0\x82\xE9
-		char FileName[MAX_PATH];
+	}
+	return FALSE;
+}
 
-		// \x83t\x83\x8B\x83p\x83X\x89\xBB
-		strncpy_s(FileName, sizeof(FileName), LogVar->FullName, _TRUNCATE);
-		ConvFName(logdir, FileName, sizeof(FileName), "", LogVar->FullName, sizeof(LogVar->FullName));
+static BOOL LogStart()
+{
+	unsigned tid;
 
-		ParseStrftimeFileName(LogVar->FullName, sizeof(LogVar->FullName));
-		ConvertLogname(LogVar->FullName, sizeof(LogVar->FullName));
+	if ((FileLog) || (BinLog)) return FALSE;
 
-		(*SetFileVar)(LogVar);
+	assert(LogVar != NULL);
 
-		FixLogOption();
+	if (strlen(&(LogVar->FullName[LogVar->DirLen]))==0) {
+		// \x83t\x83@\x83C\x83\x8B\x96\xBC\x82\xAA\x90ݒ肳\x82\xEA\x82Ă\xA2\x82Ȃ\xA2
+		return FALSE;
 	}
 
+	if (! LoadTTFILE()) return FALSE;
+
+	LogVar->OpId = OpLog;
+	(*SetFileVar)(LogVar);
+	FixLogOption();
+
 	if (ts.LogBinary > 0)
 	{
 		BinLog = TRUE;
@@ -690,7 +892,7 @@
 	// \x8Dŏ\x89\x82̃t\x83@\x83C\x83\x8B\x82\xAA\x90ݒ肵\x82\xBD\x83T\x83C\x83Y\x82Ń\x8D\x81[\x83e\x81[\x83g\x82\xB5\x82Ȃ\xA2\x96\xE2\x91\xE8\x82̏C\x90\xB3\x81B
 	// (2016.4.9 yutaka)
 	if (LogVar->RotateMode != ROTATE_NONE) {
-		size = GetFileSize(LogVar->FileHandle, NULL);
+		DWORD size = GetFileSize(LogVar->FileHandle, NULL);
 		if (size != -1)
 			LogVar->ByteCount = size;
 	}
@@ -721,6 +923,10 @@
 	// \x83\x8D\x83O\x8D̎\xE6\x82\xF0\x8AJ\x8En\x82\xB7\x82\xE9\x81B
 	// (2013.9.29 yutaka)
 	if (ts.LogAllBuffIncludedInFirst) {
+		DWORD ofs, size, written_size;
+		char buf[512];
+		const char *crlf = "\r\n";
+		DWORD crlf_len = 2;
 		for (ofs = 0 ;  ; ofs++ ) {
 			// 1\x82‚̍s\x82\xF0\x8E擾\x82\xB7\x82\xE9\x81B\x95\xB6\x8E\x9A\x82\xBE\x82\xAF\x82Ȃ̂ŁA\x83G\x83X\x83P\x81[\x83v\x83V\x81[\x83P\x83\x93\x83X\x82͊܂܂\xEA\x82Ȃ\xA2\x81B
 			size = BuffGetAnyLineData(ofs, buf, sizeof(buf));
@@ -820,7 +1026,7 @@
 }
 
  // \x83R\x83\x81\x83\x93\x83g\x82\xF0\x83\x8D\x83O\x82֒lj\xC1\x82\xB7\x82\xE9
-void CommentLogToFile(char *buf, int size)
+static void CommentLogToFile(char *buf, int size)
 {
 	DWORD wrote;
 
@@ -1469,6 +1675,10 @@
 		case PROTO_QV:
 			vsize = sizeof(TQVVar);
 			break;
+		default:
+			vsize = 0;
+			assert(FALSE);
+			break;
 	}
 	ProtoVar = (PCHAR)malloc(vsize);
 	if (ProtoVar==NULL)
@@ -1910,3 +2120,226 @@
 	if (! OpenProtoDlg(FileVar,PROTO_QV,mode,0,0))
 		ProtoEnd();
 }
+
+/**
+ *	\x83\x8D\x83O\x83\x8D\x81[\x83e\x81[\x83g\x82̐ݒ\xE8
+ *	\x83\x8D\x83O\x82̃T\x83C\x83Y\x82\xAA<size>\x83o\x83C\x83g\x82𒴂\xA6\x82Ă\xA2\x82\xEA\x82΁A\x83\x8D\x81[\x83e\x81[\x83V\x83\x87\x83\x93\x82\xB7\x82\xE9\x82悤\x90ݒ肷\x82\xE9
+ */
+void LogRotateSize(size_t size)
+{
+	if (LogVar == NULL) {
+		return;
+	}
+	LogVar->RotateMode = ROTATE_SIZE;
+	LogVar->RotateSize = size;
+}
+
+/**
+ *	\x83\x8D\x83O\x83\x8D\x81[\x83e\x81[\x83g\x82̐ݒ\xE8
+ *	\x83\x8D\x83O\x83t\x83@\x83C\x83\x8B\x82̐\xA2\x91\xE3\x82\xF0\x90ݒ肷\x82\xE9
+ */
+void LogRotateRotate(int step)
+{
+	if (LogVar == NULL) {
+		return;
+	}
+	LogVar->RotateStep = step;
+}
+
+/**
+ *	\x83\x8D\x83O\x83\x8D\x81[\x83e\x81[\x83g\x82̐ݒ\xE8
+ *	\x83\x8D\x81[\x83e\x81[\x83V\x83\x87\x83\x93\x82\xF0\x92\xE2\x8E~
+ */
+void LogRotateHalt(void)
+{
+	if (LogVar == NULL) {
+		return;
+	}
+	LogVar->RotateMode = ROTATE_NONE;
+	LogVar->RotateSize = 0;
+	LogVar->RotateStep = 0;
+}
+
+static INT_PTR CALLBACK OnCommentDlgProc(HWND hDlgWnd, UINT msg, WPARAM wp, LPARAM lp)
+{
+	static const DlgTextInfo TextInfos[] = {
+		{ 0, "DLG_COMMENT_TITLE" },
+		{ IDOK, "BTN_OK" }
+	};
+	char buf[256];
+	UINT ret;
+
+	switch (msg) {
+		case WM_INITDIALOG:
+			//SetDlgItemText(hDlgWnd, IDC_EDIT_COMMENT, "\x83T\x83\x93\x83v\x83\x8B");
+			// \x83G\x83f\x83B\x83b\x83g\x83R\x83\x93\x83g\x83\x8D\x81[\x83\x8B\x82Ƀt\x83H\x81[\x83J\x83X\x82\xF0\x82\xA0\x82Ă\xE9
+			SetFocus(GetDlgItem(hDlgWnd, IDC_EDIT_COMMENT));
+			SetDlgTexts(hDlgWnd, TextInfos, _countof(TextInfos), ts.UILanguageFile);
+			return FALSE;
+
+		case WM_COMMAND:
+			switch (LOWORD(wp)) {
+				case IDOK:
+					memset(buf, 0, sizeof(buf));
+					ret = GetDlgItemTextA(hDlgWnd, IDC_EDIT_COMMENT, buf, sizeof(buf) - 1);
+					if (ret > 0) { // \x83e\x83L\x83X\x83g\x8E擾\x90\xAC\x8C\xF7
+						//buf[sizeof(buf) - 1] = '\0';  // null-terminate
+						CommentLogToFile(buf, ret);
+					}
+					TTEndDialog(hDlgWnd, IDOK);
+					break;
+				default:
+					return FALSE;
+			}
+			break;
+		case WM_CLOSE:
+			TTEndDialog(hDlgWnd, 0);
+			return TRUE;
+
+		default:
+			return FALSE;
+	}
+	return TRUE;
+}
+
+void LogAddCommentDlg(HINSTANCE hInst, HWND hWnd)
+{
+	// \x83\x8D\x83O\x83t\x83@\x83C\x83\x8B\x82փR\x83\x81\x83\x93\x83g\x82\xF0\x92lj\xC1\x82\xB7\x82\xE9 (2004.8.6 yutaka)
+	TTDialogBox(hInst, MAKEINTRESOURCE(IDD_COMMENT_DIALOG),
+				HVTWin, OnCommentDlgProc);
+}
+
+void LogClose()
+{
+	if (LogVar != NULL)
+		FileTransEnd(OpLog);
+}
+
+BOOL LogOpen(const char *fname)
+{
+	BOOL ret;
+
+	if ((LogVar==NULL) && !NewFileVar(&LogVar)) {
+		return FALSE;
+	}
+
+	LogVar->DirLen = 0;
+	LogVar->NoMsg = TRUE;
+	strncpy_s(LogVar->FullName, sizeof(LogVar->FullName), fname, _TRUNCATE);
+	ret = LogStart();
+	return ret;
+}
+
+BOOL LogIsOpend()
+{
+	// LogVar->FileOpen
+	return LogVar != NULL;
+}
+
+void LogWriteStr(const char *str)
+{
+	if (LogVar != NULL)
+	{
+		DWORD wrote;
+		size_t len = strlen(str);
+		WriteFile(LogVar->FileHandle, str, len, &wrote, NULL);
+		LogVar->ByteCount =
+			LogVar->ByteCount + len;
+		FLogRefreshNum();
+	}
+}
+
+void LogInfo(char *param_ptr, size_t param_len)
+{
+	if (LogVar) {
+		param_ptr[0] = '0'
+			+ (ts.LogBinary != 0)
+			+ ((ts.Append != 0) << 1)
+			+ ((ts.LogTypePlainText != 0) << 2)
+			+ ((ts.LogTimestamp != 0) << 3)
+			+ ((ts.LogHideDialog != 0) << 4);
+		strncpy_s(param_ptr + 1, param_len - 1, LogVar->FullName, _TRUNCATE);
+	}
+	else {
+		param_ptr[0] = '0' - 1;
+		param_ptr[1] = 0;
+	}
+}
+
+/**
+ *	\x8C\xBB\x8D݂̃\x8D\x83O\x83t\x83@\x83C\x83\x8B\x96\xBC\x82\xF0\x8E擾
+ */
+const char *LogGetFilename()
+{
+	if (LogVar == NULL) {
+		return NULL;
+	}
+	return LogVar->FullName;
+}
+
+/**
+ *	\x83\x8D\x83O\x83_\x83C\x83A\x83\x8D\x83O\x82\xF0\x8AJ\x82\xAD
+ *	@retval	TRUE	[ok] \x82\xAA\x89\x9F\x82\xB3\x82ꂽ
+ *	@retval	FALSE	\x83L\x83\x83\x83\x93\x83Z\x83\x8B\x82\xB3\x82ꂽ
+ *	@param[in,out]	filename	OK\x8E\x9E\x81A\x83t\x83@\x83C\x83\x8B\x96\xBC\x81A\x95s\x97v\x82ɂȂ\xC1\x82\xBD\x82\xE7free()\x82\xB7\x82邱\x82\xC6
+ */
+BOOL LogOpenDialog(char **filename)
+{
+	LogDlgData_t *data = (LogDlgData_t *)calloc(sizeof(LogDlgData_t), 1);
+	data->filename = LogGetLogFilename(NULL);
+	INT_PTR ret = TTDialogBoxParam(
+		hInst, MAKEINTRESOURCE(IDD_LOGDLG),
+		HVTWin, LogFnHook, (LPARAM)data);
+	if (ret == IDOK) {
+		*filename = data->filename;
+	}
+	free(data);
+	return ret == IDOK ? TRUE : FALSE;
+}
+
+/**
+ *	\x83\x8D\x83O\x83t\x83@\x83C\x83\x8B\x96\xBC\x82\xF0\x8E擾
+ *	\x83\x8D\x83O\x83t\x83@\x83C\x83\x8B\x96\xBC\x97p\x82̏C\x8F\xFC\x82\xF0\x8Ds\x82\xA4
+ *	- strftime() \x82Ɠ\xAF\x82\xB6\x93\xFA\x95t\x93W\x8AJ
+ *	- \x90ݒ肳\x82ꂽ\x83\x8D\x83O\x83t\x83@\x83C\x83\x8B\x83t\x83H\x83\x8B\x83_\x82\xF0\x92lj\xC1
+ *	- \x83z\x83X\x83g\x96\xBC,\x83|\x81[\x83g\x94ԍ\x86\x93W\x8AJ
+ *
+ *	@param[in]	log_filename	\x83t\x83@\x83C\x83\x8B\x96\xBC(\x91\x8A\x91\xCE/\x90\xE2\x91΂ǂ\xBF\x82\xE7\x82ł\xE0ok)
+ *								NULL\x82̏ꍇ\x83f\x83t\x83H\x83\x8B\x83g\x83t\x83@\x83C\x83\x8B\x96\xBC\x82ƂȂ\xE9
+ *								strftime\x8C`\x8E\xAEok
+ *	@return						\x83t\x83\x8B\x83p\x83X\x83t\x83@\x83C\x83\x8B\x96\xBC
+ *								\x95s\x97v\x82ɂȂ\xC1\x82\xBD\x82\xE7 free() \x82\xB7\x82邱\x82\xC6
+ */
+char *LogGetLogFilename(const char *log_filename)
+{
+	// \x83t\x83H\x83\x8B\x83_
+	char FileDirExpanded[MAX_PATH];
+	char *logdir;
+	if (strlen(ts.LogDefaultPath) > 0) {
+		logdir = ts.LogDefaultPath;
+	}
+	else if (strlen(ts.FileDir) > 0) {
+		ExpandEnvironmentStrings(ts.FileDir, FileDirExpanded, sizeof(FileDirExpanded));
+		logdir = FileDirExpanded;
+	}
+	else {
+		logdir = ts.HomeDir;
+	}
+
+	// \x8C\xB3\x82ƂȂ\xE9\x83t\x83@\x83C\x83\x8B\x96\xBC
+	char base_name[MAX_PATH];
+	if (log_filename == NULL) {
+		strncpy_s(base_name, _countof(base_name), ts.LogDefaultName, _TRUNCATE);
+	}
+	else {
+		strncpy_s(base_name, _countof(base_name), log_filename, _TRUNCATE);
+	}
+
+	// \x83t\x83\x8B\x83p\x83X\x89\xBB
+	char full_path[MAX_PATH];
+	ConvFName(logdir, base_name, sizeof(base_name), "", full_path, sizeof(full_path));
+	ParseStrftimeFileName(full_path, sizeof(full_path));
+	ConvertLogname(full_path, sizeof(full_path));
+
+	return _strdup(full_path);
+}

Modified: trunk/teraterm/teraterm/filesys.h
===================================================================
--- trunk/teraterm/teraterm/filesys.h	2020-07-13 15:31:31 UTC (rev 8851)
+++ trunk/teraterm/teraterm/filesys.h	2020-07-13 15:31:46 UTC (rev 8852)
@@ -56,7 +56,7 @@
   (char *file);
 
 extern PGetSetupFname GetSetupFname;
-extern PGetTransFname GetTransFname;
+//extern PGetTransFname GetTransFname;
 extern PGetMultiFname GetMultiFname;
 extern PGetGetFname GetGetFname;
 extern PSetFileVar SetFileVar;
@@ -74,7 +74,6 @@
 BOOL NewFileVar(PFileVar *FV);
 void FreeFileVar(PFileVar *FV);
 
-BOOL LogStart();
 void LogPut1(BYTE b);
 void LogToFile();
 BOOL CreateLogBuf();
@@ -99,11 +98,24 @@
 void BPStart(int mode);
 void QVStart(int mode);
 
-extern PFileVar LogVar, SendVar, FileVar;
+extern PFileVar SendVar, FileVar;
 extern BOOL FileLog, BinLog, DDELog;
 
+
+// log
 void logfile_lock_initialize(void);
-void CommentLogToFile(char *buf, int size);
+void LogRotateSize(size_t size);
+void LogRotateRotate(int step);
+void LogRotateHalt(void);
+void LogAddCommentDlg(HINSTANCE hInst, HWND hWnd);
+void LogClose();
+BOOL LogOpen(const char *fname);
+BOOL LogIsOpend();
+void LogWriteStr(const char *str);
+void LogInfo(char *param_ptr, size_t param_len);
+const char *LogGetFilename();
+BOOL LogOpenDialog(char **filename);
+char *LogGetLogFilename(const char *log_filename);
 
 #ifdef __cplusplus
 }

Added: trunk/teraterm/teraterm/filesys_log.rc
===================================================================
--- trunk/teraterm/teraterm/filesys_log.rc	                        (rev 0)
+++ trunk/teraterm/teraterm/filesys_log.rc	2020-07-13 15:31:46 UTC (rev 8852)
@@ -0,0 +1,154 @@
+// Microsoft Visual C++ generated resource script.
+//
+#include "filesys_log_res.h"
+
+#define APSTUDIO_READONLY_SYMBOLS
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 2 resource.
+//
+#include <winresrc.h>
+#define IDC_STATIC -1
+/////////////////////////////////////////////////////////////////////////////
+#undef APSTUDIO_READONLY_SYMBOLS
+
+/////////////////////////////////////////////////////////////////////////////
+// \x93\xFA\x96{\x8C\xEA (\x93\xFA\x96{) resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_JPN)
+LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT
+#pragma code_page(932)
+
+#ifdef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// TEXTINCLUDE
+//
+
+1 TEXTINCLUDE 
+BEGIN
+    "filesys_log_res.h\0"
+END
+
+2 TEXTINCLUDE 
+BEGIN
+    "#include <winresrc.h>\r\n"
+    "#define IDC_STATIC -1\0"
+END
+
+3 TEXTINCLUDE 
+BEGIN
+    "\r\n"
+    "\0"
+END
+
+#endif    // APSTUDIO_INVOKED
+
+#endif    // \x93\xFA\x96{\x8C\xEA (\x93\xFA\x96{) resources
+/////////////////////////////////////////////////////////////////////////////
+
+
+/////////////////////////////////////////////////////////////////////////////
+// \x89p\x8C\xEA (\x95č\x91) resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
+LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
+#pragma code_page(1252)
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Dialog
+//
+
+IDD_LOGDLG DIALOGEX 0, 0, 267, 241
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Log"
+FONT 8, "MS Shell Dlg", 400, 0, 0x1
+BEGIN
+    LTEXT           "&Filename (drop file in this dialog)",IDC_SENDFILE_FILENAME_TITLE,9,7,172,8
+    EDITTEXT        IDC_FOPT_FILENAME_EDIT,19,21,224,14,ES_AUTOHSCROLL
+    PUSHBUTTON      "...",IDC_FOPT_FILENAME_BUTTON,245,21,14,14
+    CONTROL         "T&ext",IDC_FOPTTEXT,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,7,45,61,10
+    CONTROL         "Bina&ry",IDC_FOPTBIN,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,7,138,61,10
+    COMBOBOX        IDC_TEXTCODING_DROPDOWN,19,58,64,53,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP
+    CONTROL         "&Plain text",IDC_PLAINTEXT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,19,76,80,10
+    CONTROL         "&BOM",IDC_BOM,"Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,19,91,80,10
+    CONTROL         "&Timestamp",IDC_TIMESTAMP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,19,105,80,10
+    COMBOBOX        IDC_TIMESTAMPTYPE,31,120,120,60,CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP
+    CONTROL         "Hide &dialog",IDC_HIDEDIALOG,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,153,88,10
+    CONTROL         "&Append",IDC_FOPTAPPEND,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,167,117,10
+    CONTROL         "In&clude screen buffer",IDC_ALLBUFF_INFIRST,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,182,96,10
+    DEFPUSHBUTTON   "OK",IDOK,156,220,50,14
+    PUSHBUTTON      "Cancel",IDCANCEL,210,220,50,14
+    PUSHBUTTON      "Help",IDHELP,101,220,50,14
+END
+
+IDD_FOPT DIALOGEX 0, 0, 300, 67
+STYLE DS_SETFONT | DS_3DLOOK | DS_CONTROL | WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS
+FONT 8, "Tahoma", 0, 0, 0x0
+BEGIN
+    GROUPBOX        "Option",IDC_FOPT,5,2,290,59
+    CONTROL         "Bina&ry",IDC_FOPTBIN,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,10,10,60,16
+    CONTROL         "&Append",IDC_FOPTAPPEND,"Button",BS_AUTOCHECKBOX | NOT WS_VISIBLE | WS_TABSTOP,100,10,60,16
+    CONTROL         "&Plain text",IDC_PLAINTEXT,"Button",BS_AUTOCHECKBOX | NOT WS_VISIBLE | WS_TABSTOP,179,10,80,16
+    CONTROL         "Hide &dialog",IDC_HIDEDIALOG,"Button",BS_AUTOCHECKBOX | NOT WS_VISIBLE | WS_TABSTOP,10,24,88,16
+    CONTROL         "In&clude screen buffer",IDC_ALLBUFF_INFIRST,"Button",BS_AUTOCHECKBOX | NOT WS_VISIBLE | WS_TABSTOP,100,24,96,16
+    CONTROL         "&Timestamp",IDC_TIMESTAMP,"Button",BS_AUTOCHECKBOX | NOT WS_VISIBLE | WS_TABSTOP,10,38,80,16
+    COMBOBOX        IDC_TIMESTAMPTYPE,90,40,120,60,CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | NOT WS_VISIBLE | WS_VSCROLL | WS_TABSTOP
+END
+
+IDD_COMMENT_DIALOG DIALOGEX 0, 0, 239, 19
+STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Comment to Log"
+FONT 14, "System", 0, 0, 0x0
+BEGIN
+    DEFPUSHBUTTON   "OK",IDOK,201,3,32,12
+    EDITTEXT        IDC_EDIT_COMMENT,6,3,189,12,ES_AUTOHSCROLL
+END
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// DESIGNINFO
+//
+
+#ifdef APSTUDIO_INVOKED
+GUIDELINES DESIGNINFO
+BEGIN
+    IDD_LOGDLG, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 260
+        VERTGUIDE, 19
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 234
+    END
+
+    IDD_FOPT, DIALOG
+    BEGIN
+    END
+
+    IDD_COMMENT_DIALOG, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 17
+    END
+END
+#endif    // APSTUDIO_INVOKED
+
+#endif    // \x89p\x8C\xEA (\x95č\x91) resources
+/////////////////////////////////////////////////////////////////////////////
+
+
+
+#ifndef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 3 resource.
+//
+
+
+/////////////////////////////////////////////////////////////////////////////
+#endif    // not APSTUDIO_INVOKED
+

Added: trunk/teraterm/teraterm/filesys_log_res.h
===================================================================
--- trunk/teraterm/teraterm/filesys_log_res.h	                        (rev 0)
+++ trunk/teraterm/teraterm/filesys_log_res.h	2020-07-13 15:31:46 UTC (rev 8852)
@@ -0,0 +1,49 @@
+//{{NO_DEPENDENCIES}}
+// Microsoft Visual C++ \x82Ő\xB6\x90\xAC\x82\xB3\x82ꂽ\x83C\x83\x93\x83N\x83\x8B\x81[\x83h \x83t\x83@\x83C\x83\x8B\x81B
+// filesys_log.rc \x82Ŏg\x97p
+//
+#define IDD_COMMENT_DIALOG              110
+#define IDD_LOGDLG                      115
+#define IDC_EDIT_COMMENT                1000
+#define IDC_FOPTBIN                     1001
+#define IDC_FOPTAPPEND                  1002
+#define IDC_PLAINTEXT                   1003
+#define IDC_TIMESTAMP                   1004
+#define IDC_HIDEDIALOG                  1005
+#define IDC_ALLBUFF_INFIRST             1006
+#define IDC_TIMESTAMPTYPE               1007
+#define IDC_PLAINTEXT2                  1008
+#define IDC_BOM                         1008
+#define IDD_XOPT                        1100
+#define IDC_XOPTCHECK                   1101
+#define IDC_XOPTCRC                     1102
+#define IDC_XOPT1K                      1103
+#define IDC_XOPTBIN                     1104
+#define IDD_GETFNDLG                    2000
+#define IDC_GETFN                       2001
+#define IDC_GETFNHELP                   2099
+#define IDC_SENDFILE_FILENAME_BUTTON    2596
+#define IDC_FOPT_FILENAME_BUTTON        2596
+#define IDC_SENDFILE_FILENAME_TITLE     2598
+#define IDC_SENDFILE_FILENAME_EDIT      2599
+#define IDC_FOPT_FILENAME_EDIT          2599
+#define IDC_SENDFILE_DELAYTYPE_DROPDOWN 2601
+#define IDC_TEXTCODING_DROPDOWN         2601
+#define IDD_FOPT                        2606
+#define IDC_FOPTTEXT                    2609
+#define IDC_CHECK1                      2611
+#define IDC_FOPT                        65535
+#define IDC_FILENAME                    65535
+#define IDC_XOPT                        65535
+
+// Next default values for new objects
+//
+#ifdef APSTUDIO_INVOKED
+#ifndef APSTUDIO_READONLY_SYMBOLS
+#define _APS_NO_MFC                     1
+#define _APS_NEXT_RESOURCE_VALUE        116
+#define _APS_NEXT_COMMAND_VALUE         52031
+#define _APS_NEXT_CONTROL_VALUE         2612
+#define _APS_NEXT_SYMED_VALUE           101
+#endif
+#endif

Modified: trunk/teraterm/teraterm/ttdde.c
===================================================================
--- trunk/teraterm/teraterm/ttdde.c	2020-07-13 15:31:31 UTC (rev 8851)
+++ trunk/teraterm/teraterm/ttdde.c	2020-07-13 15:31:46 UTC (rev 8852)
@@ -516,27 +516,23 @@
 		PostMessage(HVTWin,WM_USER_ACCELCOMMAND,IdCmdLoadKeyMap,0);
 		break;
 
-	case CmdLogRotate:
-		if (LogVar != NULL) {
-			char *p = ParamFileName;
-			int s;
+	case CmdLogRotate: {
+		char *p = ParamFileName;
+		int s;
 
-			if (strncmp(p, "size", 4) == 0) {
-				s = atoi(&p[5]);
-				LogVar->RotateMode = ROTATE_SIZE;
-				LogVar->RotateSize = s;
+		if (strncmp(p, "size", 4) == 0) {
+			s = atoi(&p[5]);
+			LogRotateSize(s);
 
-			} else if (strncmp(p, "rotate", 6) == 0) {
-				s = atoi(&p[7]);
-				LogVar->RotateStep = s;
+		} else if (strncmp(p, "rotate", 6) == 0) {
+			s = atoi(&p[7]);
+			LogRotateRotate(s);
 
-			} else if (strncmp(p, "halt", 4) == 0) {
-				LogVar->RotateMode = ROTATE_NONE;
-				LogVar->RotateSize = 0;
-				LogVar->RotateStep = 0;
-			}
+		} else if (strncmp(p, "halt", 4) == 0) {
+			LogRotateHalt();
 		}
 		break;
+	}
 
 	case CmdLogAutoClose:
 		AutoLogClose = (ParamBinaryFlag!=0);
@@ -543,26 +539,20 @@
 		break;
 
 	case CmdLogClose:
-		if (LogVar != NULL) FileTransEnd(OpLog);
+		LogClose();
 		break;
 	case CmdLogOpen:
-		if ((LogVar==NULL) && NewFileVar(&LogVar))
-		{
-			BOOL ret;
-			LogVar->DirLen = 0;
-			LogVar->NoMsg = TRUE;
-			strncpy_s(LogVar->FullName, sizeof(LogVar->FullName),ParamFileName, _TRUNCATE);
-			ParseStrftimeFileName(LogVar->FullName, sizeof(LogVar->FullName));
-			ret = LogStart();
-			if (ret) {
-				strncpy_s(ParamFileName, sizeof(ParamFileName),"1", _TRUNCATE);
-			}
-			else {
-				strncpy_s(ParamFileName, sizeof(ParamFileName),"0", _TRUNCATE);
-			}
+		if (LogIsOpend()) {
+			return DDE_FNOTPROCESSED;
 		}
-		else
-			return DDE_FNOTPROCESSED;
+		else {
+			char *ParamFileNameA = ToCharU8(ParamFileName);
+			char *log_filenameA = LogGetLogFilename(ParamFileNameA);
+			BOOL ret = LogOpen(log_filenameA);
+			free(log_filenameA);
+			free(ParamFileNameA);
+			strncpy_s(ParamFileName, sizeof(ParamFileName), ret ? "1" : "0", _TRUNCATE);
+		}
 		break;
 	case CmdLogPause:
 		FLogChangeButton(TRUE);
@@ -571,14 +561,7 @@
 		FLogChangeButton(FALSE);
 		break;
 	case CmdLogWrite:
-		if (LogVar != NULL)
-		{
-			DWORD wrote;
-			WriteFile(LogVar->FileHandle, ParamFileName, strlen(ParamFileName), &wrote, NULL);
-			LogVar->ByteCount =
-				LogVar->ByteCount + strlen(ParamFileName);
-			FLogRefreshNum();
-		}
+		LogWriteStr(ParamFileName);
 		break;
 	case CmdQVRecv:
 		if ((FileVar==NULL) && NewFileVar(&FileVar))
@@ -893,7 +876,7 @@
 
 		val = atoi(ParamFileName);
 		switch(val) {
-			case 1: // Xon/Xoff 
+			case 1: // Xon/Xoff
 			case 2: // RTS/CTS
 			case 3: // none
 			case 4: // DSR/DTR
@@ -1017,19 +1000,7 @@
 	}
 
 	case CmdLogInfo:
-		if (LogVar) {
-			ParamFileName[0] = '0'
-				+ (ts.LogBinary != 0)
-				+ ((ts.Append != 0) << 1)
-				+ ((ts.LogTypePlainText != 0) << 2)
-				+ ((ts.LogTimestamp != 0) << 3)
-				+ ((ts.LogHideDialog != 0) << 4);
-			strncpy_s(ParamFileName+1, sizeof(ParamFileName)-1, LogVar->FullName, _TRUNCATE);
-		}
-		else {
-			ParamFileName[0] = '0' - 1;
-			ParamFileName[1] = 0;
-		}
+		LogInfo(ParamFileName, sizeof(ParamFileName) - 1);
 		break;
 
 	default:
@@ -1103,7 +1074,7 @@
 		case XTYP_DISCONNECT:
 			// \x83}\x83N\x83\x8D\x8FI\x97\xB9\x8E\x9E\x81A\x83\x8D\x83O\x8D̎\xE6\x82\xF0\x8E\xA9\x93\xAE\x93I\x82ɒ\xE2\x8E~\x82\xB7\x82\xE9\x81B(2013.6.24 yutaka)
 			if (AutoLogClose) {
-				if (LogVar != NULL) FileTransEnd(OpLog);
+				LogClose();
 				AutoLogClose = FALSE;
 			}
 			ConvH = 0;

Modified: trunk/teraterm/teraterm/ttermpro.rc
===================================================================
--- trunk/teraterm/teraterm/ttermpro.rc	2020-07-13 15:31:31 UTC (rev 8851)
+++ trunk/teraterm/teraterm/ttermpro.rc	2020-07-13 15:31:46 UTC (rev 8852)
@@ -53,15 +53,6 @@
     LTEXT           "Drop with CTRL, this dialog is displayed",IDC_DAD_NOTE,7,221,236,8
 END
 
-IDD_COMMENT_DIALOG DIALOGEX 0, 0, 239, 19
-STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
-CAPTION "Comment to Log"
-FONT 14, "System", 0, 0, 0x0
-BEGIN
-    DEFPUSHBUTTON   "OK",IDOK,201,3,32,12
-    EDITTEXT        IDC_EDIT_COMMENT,6,3,189,12,ES_AUTOHSCROLL
-END
-
 IDD_TABSHEET_GENERAL DIALOGEX 0, 0, 258, 188
 STYLE DS_SETFONT | DS_CONTROL | WS_CHILD | WS_SYSMENU
 FONT 8, "Tahoma", 0, 0, 0x0
@@ -390,13 +381,6 @@
         BOTTOMMARGIN, 250
     END
 
-    IDD_COMMENT_DIALOG, DIALOG
-    BEGIN
-        LEFTMARGIN, 7
-        TOPMARGIN, 7
-        BOTTOMMARGIN, 17
-    END
-
     IDD_TABSHEET_GENERAL, DIALOG
     BEGIN
         LEFTMARGIN, 5

Modified: trunk/teraterm/teraterm/ttermpro.v16.vcxproj
===================================================================
--- trunk/teraterm/teraterm/ttermpro.v16.vcxproj	2020-07-13 15:31:31 UTC (rev 8851)
+++ trunk/teraterm/teraterm/ttermpro.v16.vcxproj	2020-07-13 15:31:46 UTC (rev 8852)
@@ -178,6 +178,7 @@
     <ClInclude Include="broadcast.h" />
     <ClInclude Include="coding_pp.h" />
     <ClInclude Include="coding_pp_res.h" />
+    <ClInclude Include="filesys_log_res.h" />
     <ClInclude Include="font_pp.h" />
     <ClInclude Include="font_pp_res.h" />
     <ClInclude Include="sendfiledlg.h" />
@@ -204,6 +205,7 @@
     <ResourceCompile Include="../ttpdlg/ttpdlg.rc" />
     <ResourceCompile Include="coding_pp.rc" />
     <ResourceCompile Include="debug_pp.rc" />
+    <ResourceCompile Include="filesys_log.rc" />
     <ResourceCompile Include="font_pp.rc" />
     <ResourceCompile Include="teraterm_manifest.rc" />
     <ResourceCompile Include="tt-version.rc" />

Modified: trunk/teraterm/teraterm/ttermpro.v16.vcxproj.filters
===================================================================
--- trunk/teraterm/teraterm/ttermpro.v16.vcxproj.filters	2020-07-13 15:31:31 UTC (rev 8851)
+++ trunk/teraterm/teraterm/ttermpro.v16.vcxproj.filters	2020-07-13 15:31:46 UTC (rev 8852)
@@ -196,6 +196,9 @@
     <ResourceCompile Include="font_pp.rc">
       <Filter>dialog</Filter>
     </ResourceCompile>
+    <ResourceCompile Include="filesys_log.rc">
+      <Filter>Source Files</Filter>
+    </ResourceCompile>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="sizetip.h">
@@ -372,5 +375,8 @@
     <ClInclude Include="broadcast.h">
       <Filter>Header Files</Filter>
     </ClInclude>
+    <ClInclude Include="filesys_log_res.h">
+      <Filter>Source Files</Filter>
+    </ClInclude>
   </ItemGroup>
 </Project>
\ No newline at end of file

Modified: trunk/teraterm/teraterm/ttermpro.vcproj
===================================================================
--- trunk/teraterm/teraterm/ttermpro.vcproj	2020-07-13 15:31:31 UTC (rev 8851)
+++ trunk/teraterm/teraterm/ttermpro.vcproj	2020-07-13 15:31:46 UTC (rev 8852)
@@ -254,6 +254,14 @@
 				>
 			</File>
 			<File
+				RelativePath=".\filesys_log.rc"
+				>
+			</File>
+			<File
+				RelativePath=".\filesys_log_res.h"
+				>
+			</File>
+			<File
 				RelativePath="..\common\tek.ico"
 				>
 			</File>

Modified: trunk/teraterm/teraterm/vtwin.cpp
===================================================================
--- trunk/teraterm/teraterm/vtwin.cpp	2020-07-13 15:31:31 UTC (rev 8851)
+++ trunk/teraterm/teraterm/vtwin.cpp	2020-07-13 15:31:46 UTC (rev 8852)
@@ -1247,7 +1247,7 @@
 		EnableMenuItem(FileMenu,ID_FILE_LOGMEIN,MF_BYCOMMAND | MF_ENABLED);
 
 		// XXX: \x82\xB1\x82̈ʒu\x82ɂ\xB5\x82Ȃ\xA2\x82ƁAlog\x82\xAA\x83O\x83\x8C\x83C\x82ɂȂ\xE7\x82Ȃ\xA2\x81B (2005.2.1 yutaka)
-		if (LogVar!=NULL) { // \x83\x8D\x83O\x8D̎惂\x81[\x83h\x82̏ꍇ
+		if (LogIsOpend()) { // \x83\x8D\x83O\x8D̎惂\x81[\x83h\x82̏ꍇ
 			EnableMenuItem(FileMenu,ID_FILE_LOG,MF_BYCOMMAND | MF_GRAYED);
 			EnableMenuItem(FileMenu,ID_FILE_COMMENTTOLOG, MF_BYCOMMAND | MF_ENABLED);
 			EnableMenuItem(FileMenu,ID_FILE_VIEWLOG, MF_BYCOMMAND | MF_ENABLED);
@@ -3572,17 +3572,17 @@
 		return 0;
 	}
 
-	/* Auto start logging (2007.5.31 maya) */
-	if (ts.LogAutoStart && ts.LogFN[0]==0) {
-		strncpy_s(ts.LogFN, sizeof(ts.LogFN), ts.LogDefaultName, _TRUNCATE);
+	/* Auto start logging or /L= option */
+	if (ts.LogAutoStart || ts.LogFN[0] != 0) {
+		if (ts.LogFN[0] == 0) {
+			char *filename = LogGetLogFilename(NULL);
+			strncpy_s(ts.LogFN, sizeof(ts.LogFN), filename, _TRUNCATE);
+			free(filename);
+		}
+		if (ts.LogFN[0]!=0) {
+			LogOpen(ts.LogFN);
+		}
 	}
-	/* \x83\x8D\x83O\x8D̎悪\x97L\x8C\xF8\x82ŊJ\x8En\x82\xB5\x82Ă\xA2\x82Ȃ\xAF\x82\xEA\x82ΊJ\x8En\x82\xB7\x82\xE9 (2006.9.18 maya) */
-	if ((ts.LogFN[0]!=0) && (LogVar==NULL) && NewFileVar(&LogVar)) {
-		LogVar->DirLen = 0;
-		strncpy_s(LogVar->FullName, sizeof(LogVar->FullName), ts.LogFN, _TRUNCATE);
-		HelpId = HlpFileLog;
-		LogStart();
-	}
 
 	if ((ts.PortType==IdTCPIP) &&
 	    ((ts.PortFlag & PF_BEEPONCONNECT) != 0)) {
@@ -4135,58 +4135,17 @@
 
 void CVTWindow::OnFileLog()
 {
-	HelpId = HlpFileLog;
-	LogStart();
-}
-
-
-static LRESULT CALLBACK OnCommentDlgProc(HWND hDlgWnd, UINT msg, WPARAM wp, LPARAM lp)
-{
-	static const DlgTextInfo TextInfos[] = {
-		{ 0, "DLG_COMMENT_TITLE" },
-		{ IDOK, "BTN_OK" }
-	};
-	char buf[256];
-	UINT ret;
-
-	switch (msg) {
-		case WM_INITDIALOG:
-			//SetDlgItemText(hDlgWnd, IDC_EDIT_COMMENT, "\x83T\x83\x93\x83v\x83\x8B");
-			// \x83G\x83f\x83B\x83b\x83g\x83R\x83\x93\x83g\x83\x8D\x81[\x83\x8B\x82Ƀt\x83H\x81[\x83J\x83X\x82\xF0\x82\xA0\x82Ă\xE9
-			SetFocus(GetDlgItem(hDlgWnd, IDC_EDIT_COMMENT));
-			SetDlgTexts(hDlgWnd, TextInfos, _countof(TextInfos), ts.UILanguageFile);
-			return FALSE;
-
-		case WM_COMMAND:
-			switch (LOWORD(wp)) {
-				case IDOK:
-					memset(buf, 0, sizeof(buf));
-					ret = GetDlgItemTextA(hDlgWnd, IDC_EDIT_COMMENT, buf, sizeof(buf) - 1);
-					if (ret > 0) { // \x83e\x83L\x83X\x83g\x8E擾\x90\xAC\x8C\xF7
-						//buf[sizeof(buf) - 1] = '\0';  // null-terminate
-						CommentLogToFile(buf, ret);
-					}
-					TTEndDialog(hDlgWnd, IDOK);
-					break;
-				default:
-					return FALSE;
-			}
-			break;
-		case WM_CLOSE:
-			TTEndDialog(hDlgWnd, 0);
-			return TRUE;
-
-		default:
-			return FALSE;
+	char *filename;
+	BOOL r = LogOpenDialog(&filename);
+	if (r) {
+		LogOpen(filename);
+		free(filename);
 	}
-	return TRUE;
 }
 
 void CVTWindow::OnCommentToLog()
 {
-	// \x83\x8D\x83O\x83t\x83@\x83C\x83\x8B\x82փR\x83\x81\x83\x93\x83g\x82\xF0\x92lj\xC1\x82\xB7\x82\xE9 (2004.8.6 yutaka)
-	TTDialogBox(m_hInst, MAKEINTRESOURCE(IDD_COMMENT_DIALOG),
-				HVTWin, (DLGPROC)OnCommentDlgProc);
+	LogAddCommentDlg(m_hInst, HVTWin);
 }
 
 // \x83\x8D\x83O\x82̉{\x97\x97 (2005.1.29 yutaka)
@@ -4193,15 +4152,14 @@
 void CVTWindow::OnViewLog()
 {
 	char command[MAX_PATH*2+3]; // command "filename"
-	char *file;
 	STARTUPINFO si;
 	PROCESS_INFORMATION pi;
 
-	if (LogVar == NULL || !LogVar->FileOpen) {
+	if(!LogIsOpend()) {
 		return;
 	}
 
-	file = LogVar->FullName;
+	const char *file = LogGetFilename();
 
 	memset(&si, 0, sizeof(si));
 	GetStartupInfo(&si);
@@ -4760,12 +4718,12 @@
 	FreeTTDLG();
 
 	if (Ok && ts.ComPort > 0) {
-		/* 
+		/*
 		 * TCP/IP\x82ɂ\xE6\x82\xE9\x90ڑ\xB1\x92\x86\x82̏ꍇ\x82͐V\x8BK\x83v\x83\x8D\x83Z\x83X\x82Ƃ\xB5\x82ċN\x93\xAE\x82\xB7\x82\xE9\x81B
 		 * New connection\x82\xA9\x82\xE7\x83V\x83\x8A\x83A\x83\x8B\x90ڑ\xB1\x82\xB7\x82铮\x8D\xEC\x82Ɗ\xEE\x96{\x93I\x82ɓ\xAF\x82\xB6\x93\xAE\x8D\xEC\x82ƂȂ\xE9\x81B
 		 */
 		if ( cv.Ready && (cv.PortType != IdSerial) ) {
-			_snprintf_s(Command, sizeof(Command), 
+			_snprintf_s(Command, sizeof(Command),
 				"ttermpro /C=%u /SPEED=%lu /CDELAYPERCHAR=%u /CDELAYPERLINE=%u ",
 				ts.ComPort, ts.Baud, ts.DelayPerChar, ts.DelayPerLine);
 
@@ -6040,5 +5998,3 @@
 	}
 	return retval;
 }
-
-

Modified: trunk/teraterm/ttpfile/ttfile.c
===================================================================
--- trunk/teraterm/ttpfile/ttfile.c	2020-07-13 15:31:31 UTC (rev 8851)
+++ trunk/teraterm/ttpfile/ttfile.c	2020-07-13 15:31:46 UTC (rev 8852)
@@ -160,6 +160,10 @@
 		if (Ok)
 			strncpy_s(ts->KeyCnfFN, sizeof(ts->KeyCnfFN),Name, _TRUNCATE);
 		break;
+	default:
+		assert(FALSE);
+		Ok = FALSE;
+		break;
 	}
 
 #if defined(_DEBUG)
@@ -176,68 +180,6 @@
 	return Ok;
 }
 
-static void SetLogFlags(HWND Dialog)
-{
-	LPLONG pl;
-	WORD BinFlag, val;
-	long opt = 0;
-
-	pl = (LPLONG)GetWindowLongPtr(Dialog, DWLP_USER);
-	if (pl) {
-		GetRB(Dialog, &BinFlag, IDC_FOPTBIN, IDC_FOPTBIN);
-		if (BinFlag) {
-			opt |= LOGDLG_BINARY;
-		}
-
-		GetRB(Dialog, &val, IDC_FOPTAPPEND, IDC_FOPTAPPEND);
-		if (val) {
-			opt |= LOGDLG_APPEND;
-		}
-
-		if (!BinFlag) {
-			GetRB(Dialog, &val, IDC_PLAINTEXT, IDC_PLAINTEXT);
-			if (val) {
-				opt |= LOGDLG_PLAINTEXT;
-			}
-
-			GetRB(Dialog, &val, IDC_TIMESTAMP, IDC_TIMESTAMP);
-			if (val) {
-				opt |= LOGDLG_TIMESTAMP;
-			}
-		}
-
-		GetRB(Dialog, &val, IDC_HIDEDIALOG, IDC_HIDEDIALOG);
-		if (val) {
-			opt |= LOGDLG_HIDEDIALOG;
-		}
-
-		GetRB(Dialog, &val, IDC_ALLBUFF_INFIRST, IDC_ALLBUFF_INFIRST);
-		if (val) {
-			opt |= LOGDLG_INCSCRBUFF;
-		}
-
-		switch (GetCurSel(Dialog, IDC_TIMESTAMPTYPE) - 1) {
-		case TIMESTAMP_LOCAL:
-			// nothing to do
-			break;
-		case TIMESTAMP_UTC:
-			opt |= LOGDLG_UTC;
-			break;
-		case TIMESTAMP_ELAPSED_LOGSTART:
-			opt |= LOGDLG_ELAPSED;
-			break;
-		case TIMESTAMP_ELAPSED_CONNECTED:
-			opt |= LOGDLG_ELAPSED | LOGDLG_ELAPSEDCON;
-			break;
-		default:
-			// not reached
-			break;
-		}
-
-		*pl = opt;
-	}
-}
-
 /* \x83_\x83C\x83A\x83\x8D\x83O\x82𒆉\x9B\x82Ɉړ\xAE\x82\xB7\x82\xE9 */
 static void CenterCommonDialog(HWND hDlg)
 {
@@ -246,198 +188,6 @@
 	CenterWindow(hWndDlgRoot, GetParent(hWndDlgRoot));
 }
 
-/* Hook function for file name dialog box */
-static UINT_PTR CALLBACK LogFnHook(HWND Dialog, UINT Message, WPARAM wParam, LPARAM lParam)
-{
-	LPOPENFILENAME ofn;
-	WORD BinFlag, TsFlag;
-	LPLONG pl;
-	long opt;
-	LPOFNOTIFY notify;
-	char uimsg[MAX_UIMSG], uimsg2[MAX_UIMSG];
-	LOGFONT logfont;
-	HFONT font;
-	int tstype;
-
-	switch (Message) {
-	case WM_INITDIALOG:
-		ofn = (LPOPENFILENAME)lParam;
-		pl = (LPLONG)(ofn->lCustData);
-		opt = *pl;
-		SetWindowLongPtr(Dialog, DWLP_USER, (LONG_PTR)pl);
-
-		font = (HFONT)SendMessage(Dialog, WM_GETFONT, 0, 0);
-		GetObject(font, sizeof(LOGFONT), &logfont);
-		if (get_lang_font("DLG_TAHOMA_FONT", Dialog, &logfont, &DlgFoptFont, UILanguageFile)) {
-			SendDlgItemMessage(Dialog, IDC_FOPT, WM_SETFONT, (WPARAM)DlgFoptFont, MAKELPARAM(TRUE,0));
-			SendDlgItemMessage(Dialog, IDC_FOPTBIN, WM_SETFONT, (WPARAM)DlgFoptFont, MAKELPARAM(TRUE,0));
-			SendDlgItemMessage(Dialog, IDC_FOPTAPPEND, WM_SETFONT, (WPARAM)DlgFoptFont, MAKELPARAM(TRUE,0));
-			SendDlgItemMessage(Dialog, IDC_PLAINTEXT, WM_SETFONT, (WPARAM)DlgFoptFont, MAKELPARAM(TRUE,0));
-			SendDlgItemMessage(Dialog, IDC_HIDEDIALOG, WM_SETFONT, (WPARAM)DlgFoptFont, MAKELPARAM(TRUE,0));
-			SendDlgItemMessage(Dialog, IDC_ALLBUFF_INFIRST, WM_SETFONT, (WPARAM)DlgFoptFont, MAKELPARAM(TRUE,0));
-			SendDlgItemMessage(Dialog, IDC_TIMESTAMP, WM_SETFONT, (WPARAM)DlgFoptFont, MAKELPARAM(TRUE,0));
-			SendDlgItemMessage(Dialog, IDC_TIMESTAMPTYPE, WM_SETFONT, (WPARAM)DlgFoptFont, MAKELPARAM(TRUE,0));
-		}
-		else {
-			DlgFoptFont = NULL;
-		}
-
-		GetDlgItemText(Dialog, IDC_FOPT, uimsg2, sizeof(uimsg2));
-		get_lang_msg("DLG_FOPT", uimsg, sizeof(uimsg), uimsg2, UILanguageFile);
-		SetDlgItemText(Dialog, IDC_FOPT, uimsg);
-		GetDlgItemText(Dialog, IDC_FOPTBIN, uimsg2, sizeof(uimsg2));
-		get_lang_msg("DLG_FOPT_BINARY", uimsg, sizeof(uimsg), uimsg2, UILanguageFile);
-		SetDlgItemText(Dialog, IDC_FOPTBIN, uimsg);
-		GetDlgItemText(Dialog, IDC_FOPTAPPEND, uimsg2, sizeof(uimsg2));
-		get_lang_msg("DLG_FOPT_APPEND", uimsg, sizeof(uimsg), uimsg2, UILanguageFile);
-		SetDlgItemText(Dialog, IDC_FOPTAPPEND, uimsg);
-		GetDlgItemText(Dialog, IDC_PLAINTEXT, uimsg2, sizeof(uimsg2));
-		get_lang_msg("DLG_FOPT_PLAIN", uimsg, sizeof(uimsg), uimsg2, UILanguageFile);
-		SetDlgItemText(Dialog, IDC_PLAINTEXT, uimsg);
-		GetDlgItemText(Dialog, IDC_HIDEDIALOG, uimsg2, sizeof(uimsg2));
-		get_lang_msg("DLG_FOPT_HIDEDIALOG", uimsg, sizeof(uimsg), uimsg2, UILanguageFile);
-		SetDlgItemText(Dialog, IDC_HIDEDIALOG, uimsg);
-		GetDlgItemText(Dialog, IDC_ALLBUFF_INFIRST, uimsg2, sizeof(uimsg2));
-		get_lang_msg("DLG_FOPT_ALLBUFFINFIRST", uimsg, sizeof(uimsg), uimsg2, UILanguageFile);
-		SetDlgItemText(Dialog, IDC_ALLBUFF_INFIRST, uimsg);
-		GetDlgItemText(Dialog, IDC_TIMESTAMP, uimsg2, sizeof(uimsg2));
-		get_lang_msg("DLG_FOPT_TIMESTAMP", uimsg, sizeof(uimsg), uimsg2, UILanguageFile);
-		SetDlgItemText(Dialog, IDC_TIMESTAMP, uimsg);
-
-		get_lang_msg("DLG_FOPT_TIMESTAMP_LOCAL", uimsg, sizeof(uimsg), "Local Time", UILanguageFile);
-		SendDlgItemMessage(Dialog, IDC_TIMESTAMPTYPE, CB_ADDSTRING, 0, (LPARAM)uimsg);
-		get_lang_msg("DLG_FOPT_TIMESTAMP_UTC", uimsg, sizeof(uimsg), "UTC", UILanguageFile);
-		SendDlgItemMessage(Dialog, IDC_TIMESTAMPTYPE, CB_ADDSTRING, 0, (LPARAM)uimsg);
-		get_lang_msg("DLG_FOPT_TIMESTAMP_ELAPSED_LOGGING", uimsg, sizeof(uimsg), "Elapsed Time (Logging)", UILanguageFile);
-		SendDlgItemMessage(Dialog, IDC_TIMESTAMPTYPE, CB_ADDSTRING, 0, (LPARAM)uimsg);
-		get_lang_msg("DLG_FOPT_TIMESTAMP_ELAPSED_CONNECTION", uimsg, sizeof(uimsg), "Elapsed Time (Connection)", UILanguageFile);
-		SendDlgItemMessage(Dialog, IDC_TIMESTAMPTYPE, CB_ADDSTRING, 0, (LPARAM)uimsg);
-
-		// Binary \x83`\x83F\x83b\x83N\x83{\x83b\x83N\x83X
-		BinFlag = CheckFlag(opt, LOGDLG_BINARY);
-		SetRB(Dialog, BinFlag, IDC_FOPTBIN, IDC_FOPTBIN);
-
-		// Append \x83`\x83F\x83b\x83N\x83{\x83b\x83N\x83X
-		ShowDlgItem(Dialog, IDC_FOPTAPPEND, IDC_FOPTAPPEND);
-		if (opt & LOGDLG_APPEND) {
-			SetRB(Dialog, 1, IDC_FOPTAPPEND, IDC_FOPTAPPEND);
-		}
-
-		// Plain Text \x83`\x83F\x83b\x83N\x83{\x83b\x83N\x83X
-		ShowDlgItem(Dialog, IDC_PLAINTEXT, IDC_PLAINTEXT);
-		if (BinFlag) {
-			// Binary\x83t\x83\x89\x83O\x82\xAA\x97L\x8C\xF8\x82ȂƂ\xAB\x82̓`\x83F\x83b\x83N\x82ł\xAB\x82Ȃ\xA2
-			DisableDlgItem(Dialog, IDC_PLAINTEXT, IDC_PLAINTEXT);
-		}
-		else if (opt & LOGDLG_PLAINTEXT) {
-			SetRB(Dialog, 1, IDC_PLAINTEXT, IDC_PLAINTEXT);
-		}
-
-		// Hide dialog\x83`\x83F\x83b\x83N\x83{\x83b\x83N\x83X (2008.1.30 maya)
-		ShowDlgItem(Dialog, IDC_HIDEDIALOG, IDC_HIDEDIALOG);
-		if (opt & LOGDLG_HIDEDIALOG) {
-			SetRB(Dialog, 1, IDC_HIDEDIALOG, IDC_HIDEDIALOG);
-		}
-
-		// Include screen buffer\x83`\x83F\x83b\x83N\x83{\x83b\x83N\x83X (2013.9.29 yutaka)
-		ShowDlgItem(Dialog, IDC_ALLBUFF_INFIRST, IDC_ALLBUFF_INFIRST);
-		if (opt & LOGDLG_INCSCRBUFF) {
-			SetRB(Dialog, 1, IDC_ALLBUFF_INFIRST, IDC_ALLBUFF_INFIRST);
-		}
-
-		// timestamp\x83`\x83F\x83b\x83N\x83{\x83b\x83N\x83X (2006.7.23 maya)
-		TsFlag = FALSE;
-		ShowDlgItem(Dialog, IDC_TIMESTAMP, IDC_TIMESTAMP);
-		if (BinFlag) {
-			// Binary\x83t\x83\x89\x83O\x82\xAA\x97L\x8C\xF8\x82ȂƂ\xAB\x82̓`\x83F\x83b\x83N\x82ł\xAB\x82Ȃ\xA2
-			DisableDlgItem(Dialog, IDC_TIMESTAMP, IDC_TIMESTAMP);
-		}
-		else if (opt & LOGDLG_TIMESTAMP) {
-			TsFlag = TRUE;
-			SetRB(Dialog, 1, IDC_TIMESTAMP, IDC_TIMESTAMP);
-		}
-
-		// timestamp \x8E\xED\x95\xCA
-		ShowDlgItem(Dialog, IDC_TIMESTAMPTYPE, IDC_TIMESTAMPTYPE);
-		if (opt & LOGDLG_ELAPSED) {
-			// \x8Co\x89ߎ\x9E\x8A\xD4
-			if (opt & LOGDLG_ELAPSEDCON) {
-				tstype = TIMESTAMP_ELAPSED_CONNECTED;
-			}
-			else {
-				tstype = TIMESTAMP_ELAPSED_LOGSTART;
-			}
-		}
-		else {
-			// \x93\xFA\x8E\x9E\x8C`\x8E\xAE
-			if (opt & LOGDLG_UTC) {
-				tstype = TIMESTAMP_UTC;
-			}
-			else {
-				tstype = TIMESTAMP_LOCAL;
-			}
-		}
-		SendDlgItemMessage(Dialog, IDC_TIMESTAMPTYPE, CB_SETCURSEL, tstype, 0);
-		if (BinFlag || !TsFlag) {
-			DisableDlgItem(Dialog, IDC_TIMESTAMPTYPE, IDC_TIMESTAMPTYPE);
-		}
-
-		CenterCommonDialog(Dialog);
-
-		return TRUE;
-
-	case WM_COMMAND: // for old style dialog
-		switch (LOWORD(wParam)) {
-		case IDOK:
-			SetLogFlags(Dialog);
-
-			if (DlgFoptFont != NULL) {
-				DeleteObject(DlgFoptFont);
-			}
-			break;
-		case IDCANCEL:
-			if (DlgFoptFont != NULL) {
-				DeleteObject(DlgFoptFont);
-			}
-			break;
-		case IDC_FOPTBIN:
-			GetRB(Dialog, &BinFlag, IDC_FOPTBIN, IDC_FOPTBIN);
-			if (BinFlag) {
-				DisableDlgItem(Dialog, IDC_PLAINTEXT, IDC_TIMESTAMP);
-				DisableDlgItem(Dialog, IDC_TIMESTAMPTYPE, IDC_TIMESTAMPTYPE);
-				break; // BinFlag \x82\xAA on \x82̎\x9E\x82\xCD Fall Through \x82\xB5\x82Ȃ\xA2
-			}
-			else {
-				EnableDlgItem(Dialog, IDC_PLAINTEXT, IDC_TIMESTAMP);
-			}
-			// FALLTHROUGH -- BinFlag \x82\xAA off \x82̎\x9E\x82\xCD Timestamp \x8E\xED\x95ʂ̗L\x8C\xF8/\x96\xB3\x8C\xF8\x82\xF0\x90ݒ肷\x82\xE9
-		case IDC_TIMESTAMP:
-			GetRB(Dialog, &TsFlag, IDC_TIMESTAMP, IDC_TIMESTAMP);
-			if (TsFlag) {
-				EnableDlgItem(Dialog, IDC_TIMESTAMPTYPE, IDC_TIMESTAMPTYPE);
-			}
-			else {
-				DisableDlgItem(Dialog, IDC_TIMESTAMPTYPE, IDC_TIMESTAMPTYPE);
-			}
-			break;
-		}
-		break;
-	case WM_NOTIFY:	// for Explorer-style dialog
-		notify = (LPOFNOTIFY)lParam;
-		switch (notify->hdr.code) {
-		case CDN_FILEOK:
-			SetLogFlags(Dialog);
-
-			if (DlgFoptFont != NULL) {
-				DeleteObject(DlgFoptFont);
-			}
-			break;
-		}
-		break;
-	}
-	return FALSE;
-}
-
 static UINT_PTR CALLBACK TransFnHook(HWND Dialog, UINT Message, WPARAM wParam, LPARAM lParam);
 
 BOOL WINAPI GetTransFname(PFileVar fv, PCHAR CurDir, WORD FuncId, LPLONG Option)
@@ -445,7 +195,9 @@
 	char uimsg[MAX_UIMSG];
 	char FNFilter[sizeof(FileSendFilter)*3], *pf;
 	OPENFILENAME ofn;
+#if 0
 	LONG optl;
+#endif
 	WORD optw;
 	char TempDir[MAXPATHLEN];
 	BOOL Ok;
@@ -471,10 +223,12 @@
 			pf = pf + strlen(pf) + 1;
 		}
 		break;
+#if 0
 	case GTF_LOG:
 		get_lang_msg("FILEDLG_TRANS_TITLE_LOG", uimsg, sizeof(uimsg), TitLog, UILanguageFile);
 		strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
 		break;
+#endif
 	case GTF_BP:
 		get_lang_msg("FILEDLG_TRANS_TITLE_BPSEND", uimsg, sizeof(uimsg), TitBPSend, UILanguageFile);
 		strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
@@ -502,6 +256,7 @@
 	ofn.lpstrFile = fv->FullName;
 	ofn.nMaxFile = sizeof(fv->FullName);
 
+#if 0
 	if (FuncId == GTF_LOG) {
 		DWORD logdir = GetFileAttributes(fv->LogDefaultPath);
 		// \x83\x8D\x83O\x95ۑ\xB6\x82̏ꍇ\x82͏\x89\x8A\xFA\x83t\x83H\x83\x8B\x83_\x82\xF0\x8C\x88\x82ߑł\xBF\x82\xB5\x82Ȃ\xA2\x82悤\x82ɂ\xB7\x82\xE9\x81B(2007.8.24 yutaka)
@@ -512,11 +267,14 @@
 		else {
 			ofn.lpstrInitialDir = NULL;
 		}
-	} else {
+	} else
+#endif
+	{
 		ofn.lpstrInitialDir = CurDir;
 	}
 
 	switch (FuncId) {
+#if 0
 	case GTF_LOG:
 		ofn.Flags = OFN_PATHMUSTEXIST | OFN_OVERWRITEPROMPT;
 		ofn.Flags |= OFN_ENABLETEMPLATE | OFN_ENABLEHOOK | OFN_EXPLORER | OFN_ENABLESIZING;
@@ -526,6 +284,7 @@
 		optl = *Option;
 		ofn.lCustData = (LPARAM)&optl;
 		break;
+#endif
 	case GTF_SEND:
 		ofn.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
 		ofn.Flags |= OFN_ENABLETEMPLATE | OFN_ENABLEHOOK | OFN_EXPLORER | OFN_ENABLESIZING;
@@ -542,6 +301,7 @@
 
 	ofn.Flags |= OFN_SHOWHELP;
 
+#if 0
 	if (FuncId != GTF_LOG) {
 		// \x83t\x83B\x83\x8B\x83^\x82\xAA\x83\x8F\x83C\x83\x8B\x83h\x83J\x81[\x83h\x82ł͂Ȃ\xAD\x81A\x82\xBB\x82̃t\x83@\x83C\x83\x8B\x82\xAA\x91\xB6\x8D݂\xB7\x82\xE9\x8Fꍇ
 		// \x82\xA0\x82炩\x82\xB6\x82߃f\x83t\x83H\x83\x8B\x83g\x82̃t\x83@\x83C\x83\x8B\x96\xBC\x82\xF0\x93\xFC\x82\xEA\x82Ă\xA8\x82\xAD (2008.5.18 maya)
@@ -556,21 +316,27 @@
 			}
 		}
 	}
+#endif
 	ofn.lpstrTitle = fv->DlgCaption;
 
 	ofn.hInstance = hInst;
 
 	// logging\x82̏ꍇ\x81A\x83I\x81[\x83v\x83\x93\x83_\x83C\x83A\x83\x8D\x83O\x82\xF0\x83Z\x81[\x83u\x83_\x83C\x83A\x83\x8D\x83O\x82֕ύX (2005.1.6 yutaka)
+#if 0
 	if (FuncId == GTF_LOG) {
 		Ok = GetSaveFileName(&ofn);
-	} else {
+	} else
+#endif
+	{
 		Ok = GetOpenFileName(&ofn);
 	}
 
 	if (Ok) {
+#if 0
 		if (FuncId==GTF_LOG)
 			*Option = optl;
 		else
+#endif
 			*Option = (long)optw;
 
 		fv->DirLen = ofn.nFileOffset;


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