[Ttssh2-commit] [8863] logダイアログをUnicode対応、動作を調整

Back to archive index
scmno****@osdn***** scmno****@osdn*****
2020年 7月 26日 (日) 01:00:58 JST


Revision: 8863
          https://osdn.net/projects/ttssh2/scm/svn/commits/8863
Author:   zmatsuo
Date:     2020-07-26 01:00:58 +0900 (Sun, 26 Jul 2020)
Log Message:
-----------
logダイアログをUnicode対応、動作を調整

- ダイアログはUnicode化した
  - ログのファイル名はANSI
- BOM、コードが設定できるようになった
  - 起動直後の自動ログ UTF-8,BOM なし

Modified Paths:
--------------
    trunk/teraterm/teraterm/filesys.cpp
    trunk/teraterm/teraterm/filesys.h
    trunk/teraterm/teraterm/filesys_log.rc
    trunk/teraterm/teraterm/filesys_log_res.h
    trunk/teraterm/teraterm/ttdde.c
    trunk/teraterm/teraterm/vtterm.c
    trunk/teraterm/teraterm/vtterm.h
    trunk/teraterm/teraterm/vtwin.cpp
    trunk/teraterm/ttpmacro/ttl_gui.cpp

-------------- next part --------------
Modified: trunk/teraterm/teraterm/filesys.cpp
===================================================================
--- trunk/teraterm/teraterm/filesys.cpp	2020-07-25 16:00:46 UTC (rev 8862)
+++ trunk/teraterm/teraterm/filesys.cpp	2020-07-25 16:00:58 UTC (rev 8863)
@@ -52,9 +52,11 @@
 #include "buffer.h"
 #include "helpid.h"
 #include "layer_for_unicode.h"
+#include "layer_for_unicode_crt.h"
+#include "codeconv.h"
 
 #include "filesys.h"
-#include "tt_res.h"
+//#include "tt_res.h"
 #include "filesys_log_res.h"
 
 #define FS_BRACKET_NONE  0
@@ -129,7 +131,7 @@
 	Line_FileHead = 2,
 };
 
-enum enumLineEnd eLineEnd = Line_LineHead;
+static enum enumLineEnd eLineEnd = Line_LineHead;
 
 
 // \x92x\x89\x84\x8F\x91\x82\xAB\x8D\x9E\x82ݗp\x83X\x83\x8C\x83b\x83h\x82̃\x81\x83b\x83Z\x81[\x83W
@@ -519,70 +521,109 @@
  *						2	UTF-16LE
  *						3	UTF-16BE
  */
-static void CheckLogFile(const char *filename, BOOL *exist, int *bom)
+static void CheckLogFile(const wchar_t *filename, BOOL *exist, int *bom)
 {
+	*exist = FALSE;
+	*bom = 0;
+
 	// \x83t\x83@\x83C\x83\x8B\x82\xAA\x91\xB6\x8D݂\xB7\x82\xE9?
-	DWORD logdir = GetFileAttributes(filename);
+	DWORD logdir = _GetFileAttributesW(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
+		// \x83t\x83@\x83C\x83\x8B\x82\xAA\x82\xA0\x82\xC1\x82\xBD
 		*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;
+		FILE *fp = __wfopen(filename, L"rb");
+		if (fp != NULL) {
+			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;
+			}
 		}
 	}
+}
+
+typedef struct {
+	FLogDlgInfo_t *info;
+	// work
+	BOOL file_exist;
+	int current_bom;
+	TTTSet *pts;
+} LogDlgWork_t;
+
+static void ArrangeControls(HWND Dialog, LogDlgWork_t *work)
+{
+	if (work->file_exist) {
+		EnableWindow(GetDlgItem(Dialog, IDC_APPEND), TRUE);
+	}
 	else {
-		// \x83t\x83@\x83C\x83\x8B\x82\xAA\x82Ȃ\xA2\x81A\x90V\x8BK
-		*exist = FALSE;
-		*bom = 0;
+		// \x83t\x83@\x83C\x83\x8B\x82\xAA\x82Ȃ\xA2 -> \x90V\x8BK
+		EnableWindow(GetDlgItem(Dialog, IDC_APPEND), FALSE);
+		CheckRadioButton(Dialog, IDC_NEW_OVERWRITE, IDC_APPEND, IDC_NEW_OVERWRITE);
 	}
-}
 
-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 (work->file_exist && IsDlgButtonChecked(Dialog, IDC_APPEND) == BST_CHECKED) {
+		// \x83t\x83@\x83C\x83\x8B\x82\xAA\x91\xB6\x8D݂\xB7\x82\xE9 && append
+		int bom = work->current_bom;
 		if (bom != 0) {
 			// BOM\x97L\x82\xE8
 			CheckDlgButton(Dialog, IDC_BOM, BST_CHECKED);
+			int cur =
+				bom == 1 ? 0 :
+				bom == 2 ? 1 :
+				bom == 3 ? 2 : 0;
+			SendDlgItemMessage(Dialog, IDC_TEXTCODING_DROPDOWN, CB_SETCURSEL, cur, 0);
 		}
 		else {
 			// BOM\x82Ȃ\xB5
 			CheckDlgButton(Dialog, IDC_BOM, BST_UNCHECKED);
+			SendDlgItemMessage(Dialog, IDC_TEXTCODING_DROPDOWN, CB_SETCURSEL, 0, 0);
 		}
+		if (IsDlgButtonChecked(Dialog, IDC_FOPTTEXT) == BST_CHECKED) {
+			EnableWindow(GetDlgItem(Dialog, IDC_BOM), FALSE);
+			if (bom != 0) {
+				// BOM\x97L\x82\xE8
+				EnableWindow(GetDlgItem(Dialog, IDC_TEXTCODING_DROPDOWN), FALSE);
+			}
+			else {
+				// BOM\x82Ȃ\xB5
+				EnableWindow(GetDlgItem(Dialog, IDC_TEXTCODING_DROPDOWN), TRUE);
+			}
+		}
 	}
 	else {
 		// \x83t\x83@\x83C\x83\x8B\x82\xAA\x82Ȃ\xA2\x81A\x90V\x8BK
-		CheckDlgButton(Dialog, IDC_FOPTAPPEND, BST_UNCHECKED);
+		CheckRadioButton(Dialog, IDC_NEW_OVERWRITE, IDC_APPEND, IDC_NEW_OVERWRITE);
 		CheckDlgButton(Dialog, IDC_BOM, BST_CHECKED);
+		SendDlgItemMessage(Dialog, IDC_TEXTCODING_DROPDOWN, CB_SETCURSEL, 0, 0);
+		if (IsDlgButtonChecked(Dialog, IDC_FOPTTEXT) == BST_CHECKED) {
+			EnableWindow(GetDlgItem(Dialog, IDC_BOM), TRUE);
+		}
 	}
 }
 
-typedef struct {
-	char *filename;
-	BOOL append;
-	BOOL bom;
-} LogDlgData_t;
+static void CheckLogFile(HWND Dialog, const wchar_t *filename, LogDlgWork_t *work)
+{
+	BOOL exist;
+	int bom;
+	CheckLogFile(filename, &exist, &bom);
+	work->file_exist = exist;
+	work->current_bom = bom;
+	ArrangeControls(Dialog, work);
+}
 
 static INT_PTR CALLBACK LogFnHook(HWND Dialog, UINT Message, WPARAM wParam, LPARAM lParam)
 {
@@ -589,7 +630,7 @@
 	static const DlgTextInfo TextInfos[] = {
 		{ 0, "DLG_TABSHEET_TITLE_LOG" },
 		{ IDC_FOPTBIN, "DLG_FOPT_BINARY" },
-		{ IDC_FOPTAPPEND, "DLG_FOPT_APPEND" },
+//		{ IDC_FOPTAPPEND, "DLG_FOPT_APPEND" },
 		{ IDC_PLAINTEXT, "DLG_FOPT_PLAIN" },
 		{ IDC_HIDEDIALOG, "DLG_FOPT_HIDEDIALOG" },
 		{ IDC_ALLBUFF_INFIRST, "DLG_FOPT_ALLBUFFINFIRST" },
@@ -601,8 +642,7 @@
 		{ "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);
+	LogDlgWork_t *work = (LogDlgWork_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
@@ -611,8 +651,10 @@
 	}
 	switch (Message) {
 	case WM_INITDIALOG: {
-		data = (LogDlgData_t *)lParam;
-		SetWindowLongPtr(Dialog, DWLP_USER, (LONG_PTR)data);
+		work = (LogDlgWork_t *)lParam;
+		TTTSet *pts = work->pts;
+		const char *UILanguageFile = pts->UILanguageFile;
+		SetWindowLongPtr(Dialog, DWLP_USER, (LONG_PTR)work);
 		::DragAcceptFiles(Dialog, TRUE);
 
 		SetDlgTexts(Dialog, TextInfos, _countof(TextInfos), UILanguageFile);
@@ -620,60 +662,56 @@
 					UILanguageFile, 0);
 
 		SendDlgItemMessage(Dialog, IDC_TEXTCODING_DROPDOWN, CB_ADDSTRING, 0, (LPARAM)"UTF-8");
+		SendDlgItemMessage(Dialog, IDC_TEXTCODING_DROPDOWN, CB_ADDSTRING, 0, (LPARAM)"UTF-16LE");
+		SendDlgItemMessage(Dialog, IDC_TEXTCODING_DROPDOWN, CB_ADDSTRING, 0, (LPARAM)"UTF-16BE");
 		SendDlgItemMessage(Dialog, IDC_TEXTCODING_DROPDOWN, CB_SETCURSEL, 0, 0);
 
-		SetDlgItemTextA(Dialog, IDC_FOPT_FILENAME_EDIT, data->filename);
-		free(data->filename);
-		data->filename = NULL;
+		_SetDlgItemTextW(Dialog, IDC_FOPT_FILENAME_EDIT, work->info->filename);
+		work->info->filename = NULL;
 
 		// Binary/Text \x83`\x83F\x83b\x83N\x83{\x83b\x83N\x83X
-		if (ts.LogBinary) {
-			SendDlgItemMessage(Dialog, IDC_FOPTBIN, BM_SETCHECK, BST_CHECKED, 0);
+		if (pts->LogBinary) {
+			CheckRadioButton(Dialog, IDC_FOPTBIN, IDC_FOPTTEXT, IDC_FOPTBIN);
 		}
 		else {
-			SendDlgItemMessage(Dialog, IDC_FOPTTEXT, BM_SETCHECK, BST_CHECKED, 0);
+			CheckRadioButton(Dialog, IDC_FOPTBIN, IDC_FOPTTEXT, IDC_FOPTTEXT);
 		}
 
-		// Append \x83`\x83F\x83b\x83N\x83{\x83b\x83N\x83X
-		if (ts.Append) {
-			SetRB(Dialog, 1, IDC_FOPTAPPEND, IDC_FOPTAPPEND);
-		}
-
 		// Plain Text \x83`\x83F\x83b\x83N\x83{\x83b\x83N\x83X
-		if (ts.LogBinary) {
+		if (pts->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);
 		}
-		else if (ts.LogTypePlainText) {
+		else if (pts->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) {
+		if (pts->LogHideDialog) {
 			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) {
+		if (pts->LogAllBuffIncludedInFirst) {
 			SetRB(Dialog, 1, IDC_ALLBUFF_INFIRST, IDC_ALLBUFF_INFIRST);
 		}
 
 		// timestamp\x83`\x83F\x83b\x83N\x83{\x83b\x83N\x83X (2006.7.23 maya)
-		if (ts.LogBinary) {
+		if (pts->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) {
+		else if (pts->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;
+		int tstype = pts->LogTimestampType == TIMESTAMP_LOCAL ? 0 :
+				pts->LogTimestampType == TIMESTAMP_UTC ? 1 :
+				pts->LogTimestampType == TIMESTAMP_ELAPSED_LOGSTART ? 2 :
+				pts->LogTimestampType == TIMESTAMP_ELAPSED_CONNECTED ? 3 : 0;
 		SendDlgItemMessage(Dialog, IDC_TIMESTAMPTYPE, CB_SETCURSEL, tstype, 0);
-		if (ts.LogBinary || !ts.LogTimestamp) {
+		if (pts->LogBinary || !pts->LogTimestamp) {
 			DisableDlgItem(Dialog, IDC_TIMESTAMPTYPE, IDC_TIMESTAMPTYPE);
 		}
 
@@ -685,11 +723,12 @@
 	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;
+			wchar_t filename[MAX_PATH];
+			_GetDlgItemTextW(Dialog, IDC_FOPT_FILENAME_EDIT, filename, _countof(filename));
+			work->info->filename = _wcsdup(filename);
+			work->info->append = IsDlgButtonChecked(Dialog, IDC_FOPTAPPEND) == BST_CHECKED;
+			work->info->bom = IsDlgButtonChecked(Dialog, IDC_BOM) == BST_CHECKED;
+			work->info->code = (int)SendDlgItemMessageA(Dialog, IDC_TEXTCODING_DROPDOWN, CB_GETCURSEL, 0, 0);
 			SetLogFlags(Dialog);
 			EndDialog(Dialog, IDOK);
 			break;
@@ -698,27 +737,29 @@
 			EndDialog(Dialog, IDCANCEL);
 			break;
 		case IDHELP:
-			OpenHelp(HH_HELP_CONTEXT, HlpFileLog, ts.UILanguageFile);
+			OpenHelp(HH_HELP_CONTEXT, HlpFileLog, work->pts->UILanguageFile);
 			break;
 		case IDC_FOPT_FILENAME_BUTTON: {
 			/* save current dir */
+			const char *UILanguageFile = work->pts->UILanguageFile;
 			wchar_t curdir[MAXPATHLEN];
 			_GetCurrentDirectoryW(_countof(curdir), curdir);
 
-			char fname[MAX_PATH];
-			GetDlgItemTextA(Dialog, IDC_FOPT_FILENAME_EDIT, fname, _countof(fname));
+			wchar_t fname[MAX_PATH];
+			GetDlgItemTextW(Dialog, IDC_FOPT_FILENAME_EDIT, fname, _countof(fname));
 
-			char FNFilter[128*3];
-			get_lang_msg("FILEDLG_ALL_FILTER", FNFilter, sizeof(FNFilter), "All(*.*)\\0*.*\\0\\0", UILanguageFile);
+			wchar_t FNFilter[128*3];
+			get_lang_msgW("FILEDLG_ALL_FILTER", FNFilter, sizeof(FNFilter), L"All(*.*)\\0*.*\\0\\0", UILanguageFile);
 
-			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);
+			wchar_t caption[MAX_PATH];
+			wchar_t uimsg[MAX_UIMSG];
+#define TitLogW      L"Log"
+			get_lang_msgW("FILEDLG_TRANS_TITLE_LOG", uimsg, _countof(uimsg), TitLogW, UILanguageFile);
+			wcsncpy_s(caption, _countof(caption), L"Tera Term: ", _TRUNCATE);
+			wcsncat_s(caption, _countof(caption), uimsg, _TRUNCATE);
 
-			OPENFILENAME ofn = {};
-			ofn.lStructSize = get_OPENFILENAME_SIZEA();
+			OPENFILENAMEW ofn = {};
+			ofn.lStructSize = get_OPENFILENAME_SIZEW();
 			//ofn.Flags = OFN_PATHMUSTEXIST | OFN_OVERWRITEPROMPT;
 			ofn.Flags |= OFN_EXPLORER | OFN_ENABLESIZING;
 			ofn.Flags |= OFN_SHOWHELP;
@@ -727,11 +768,11 @@
 			ofn.lpstrFilter = FNFilter;
 			ofn.nFilterIndex = 1;
 			ofn.lpstrFile = fname;
-			ofn.nMaxFile = sizeof(fname);
+			ofn.nMaxFile = _countof(fname);
 			ofn.lpstrTitle = caption;
-			BOOL Ok = GetSaveFileName(&ofn);
+			BOOL Ok = GetSaveFileNameW(&ofn);
 			if (Ok) {
-				SetDlgItemTextA(Dialog, IDC_FOPT_FILENAME_EDIT, fname);
+				SetDlgItemTextW(Dialog, IDC_FOPT_FILENAME_EDIT, fname);
 			}
 
 			/* restore dir */
@@ -740,12 +781,13 @@
 			break;
 		}
 		case IDC_FOPTBIN:
+			EnableWindow(GetDlgItem(Dialog, IDC_TEXTCODING_DROPDOWN), FALSE);
+			EnableWindow(GetDlgItem(Dialog, IDC_BOM), FALSE);
 			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);
+			ArrangeControls(Dialog, work);
 			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:
@@ -758,11 +800,22 @@
 			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);
+				wchar_t filename[MAX_PATH];
+				GetDlgItemTextW(Dialog, IDC_FOPT_FILENAME_EDIT, filename, _countof(filename));
+				CheckLogFile(Dialog, filename, work);
 			}
 			break;
+		case IDC_NEW_OVERWRITE:
+			if (IsDlgButtonChecked(Dialog, IDC_FOPTTEXT) == BST_CHECKED) {
+				EnableWindow(GetDlgItem(Dialog, IDC_BOM), TRUE);
+				EnableWindow(GetDlgItem(Dialog, IDC_TEXTCODING_DROPDOWN), TRUE);
+				CheckDlgButton(Dialog, IDC_BOM, BST_CHECKED);
+				SendDlgItemMessage(Dialog, IDC_TEXTCODING_DROPDOWN, CB_SETCURSEL, 0, 0);
+			}
+			break;
+		case IDC_APPEND:
+			ArrangeControls(Dialog, work);
+			break;
 		}
 		break;
 	case WM_DROPFILES: {
@@ -776,6 +829,7 @@
 		wchar_t *filename = (wchar_t *)malloc(sizeof(wchar_t) * (len + 1));
 		_DragQueryFileW(hDrop, 0, filename, len + 1);
 		filename[len] = '\0';
+		CheckRadioButton(Dialog, IDC_NEW_OVERWRITE, IDC_APPEND, IDC_APPEND);
 		_SetDlgItemTextW(Dialog, IDC_FOPT_FILENAME_EDIT, filename);
 		SendDlgItemMessage(Dialog, IDC_FOPT_FILENAME_EDIT, EM_SETSEL, len, len);
 		free(filename);
@@ -2261,21 +2315,27 @@
 
 /**
  *	\x83\x8D\x83O\x83_\x83C\x83A\x83\x8D\x83O\x82\xF0\x8AJ\x82\xAD
+ *	@param[in,out]	info.filename	\x83t\x83@\x83C\x83\x8B\x96\xBC\x8F\x89\x8A\xFA\x92l
+ *									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
  *	@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 FLogOpenDialog(char **filename)
+BOOL FLogOpenDialog(HINSTANCE hInst, HWND hWnd, FLogDlgInfo_t *info)
 {
-	LogDlgData_t *data = (LogDlgData_t *)calloc(sizeof(LogDlgData_t), 1);
-	data->filename = FLogGetLogFilename(NULL);
+	LogDlgWork_t *work = (LogDlgWork_t *)calloc(sizeof(LogDlgWork_t), 1);
+	char *filenameA = ToCharW(info->filename);
+	char *srcfnameA = FLogGetLogFilename(filenameA);
+	wchar_t *srcfnameW = ToWcharA(srcfnameA);
+	free(filenameA);
+	free(srcfnameA);
+	work->info = info;
+	work->info->filename = srcfnameW;
+	work->pts = &ts;
 	INT_PTR ret = TTDialogBoxParam(
 		hInst, MAKEINTRESOURCE(IDD_LOGDLG),
-		HVTWin, LogFnHook, (LPARAM)data);
-	if (ret == IDOK) {
-		*filename = data->filename;
-	}
-	free(data);
+		hWnd, LogFnHook, (LPARAM)work);
+	free(srcfnameW);
+	free(work);
 	return ret == IDOK ? TRUE : FALSE;
 }
 

Modified: trunk/teraterm/teraterm/filesys.h
===================================================================
--- trunk/teraterm/teraterm/filesys.h	2020-07-25 16:00:46 UTC (rev 8862)
+++ trunk/teraterm/teraterm/filesys.h	2020-07-25 16:00:58 UTC (rev 8863)
@@ -103,6 +103,12 @@
 extern BOOL FileLog, BinLog;
 
 // log
+typedef struct {
+	wchar_t *filename;		// [in] \x83t\x83@\x83C\x83\x8B\x96\xBC\x8F\x89\x8A\xFA\x92l(NULL=default) [out] \x93\xFC\x97̓t\x83@\x83C\x83\x8B\x96\xBC\x81Afree()\x82\xB7\x82邱\x82\xC6
+	BOOL append;			// TRUE/FALSE = append/new(overwrite)
+	BOOL bom;				// TRUE = BOM\x82\xA0\x82\xE8
+	int code;				// 0/1/2 = UTF-8/UTF-16LE/UTF-16BE
+} FLogDlgInfo_t;
 void logfile_lock_initialize(void);
 void FLogRotateSize(size_t size);
 void FLogRotateRotate(int step);
@@ -114,7 +120,7 @@
 void FLogWriteStr(const char *str);
 void FLogInfo(char *param_ptr, size_t param_len);
 const char *FLogGetFilename(void);
-BOOL FLogOpenDialog(char **filename);
+BOOL FLogOpenDialog(HINSTANCE hInst, HWND hWnd, FLogDlgInfo_t *info);
 char *FLogGetLogFilename(const char *log_filename);
 BOOL FLogIsPause(void);
 void FLogWindow(int nCmdShow);

Modified: trunk/teraterm/teraterm/filesys_log.rc
===================================================================
--- trunk/teraterm/teraterm/filesys_log.rc	2020-07-25 16:00:46 UTC (rev 8862)
+++ trunk/teraterm/teraterm/filesys_log.rc	2020-07-25 16:00:58 UTC (rev 8863)
@@ -60,7 +60,7 @@
 // Dialog
 //
 
-IDD_LOGDLG DIALOGEX 0, 0, 267, 241
+IDD_LOGDLG DIALOGEX 0, 0, 267, 242
 STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
 CAPTION "Log"
 FONT 8, "MS Shell Dlg", 400, 0, 0x1
@@ -68,19 +68,20 @@
     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
+    CONTROL         "New / Overwrite",IDC_NEW_OVERWRITE,"Button",BS_AUTORADIOBUTTON | WS_GROUP,7,44,93,10
+    CONTROL         "Append",IDC_APPEND,"Button",BS_AUTORADIOBUTTON,7,58,93,10
+    CONTROL         "T&ext",IDC_FOPTTEXT,"Button",BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,7,75,61,10
+    CONTROL         "Bina&ry",IDC_FOPTBIN,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,7,167,61,10
+    COMBOBOX        IDC_TEXTCODING_DROPDOWN,19,104,64,53,CBS_DROPDOWNLIST | WS_VSCROLL | WS_GROUP | WS_TABSTOP
+    CONTROL         "&Plain text",IDC_PLAINTEXT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,19,122,80,10
+    CONTROL         "&BOM",IDC_BOM,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,19,88,80,10
+    CONTROL         "&Timestamp",IDC_TIMESTAMP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,19,135,80,10
+    COMBOBOX        IDC_TIMESTAMPTYPE,31,150,120,60,CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP
+    CONTROL         "Hide &dialog",IDC_HIDEDIALOG,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,184,88,10
+    CONTROL         "In&clude screen buffer",IDC_ALLBUFF_INFIRST,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,200,96,10
+    DEFPUSHBUTTON   "OK",IDOK,156,221,50,14
+    PUSHBUTTON      "Cancel",IDCANCEL,210,221,50,14
+    PUSHBUTTON      "Help",IDHELP,101,221,50,14
 END
 
 IDD_FOPT DIALOGEX 0, 0, 300, 67
@@ -121,7 +122,7 @@
         RIGHTMARGIN, 260
         VERTGUIDE, 19
         TOPMARGIN, 7
-        BOTTOMMARGIN, 234
+        BOTTOMMARGIN, 235
     END
 
     IDD_FOPT, DIALOG

Modified: trunk/teraterm/teraterm/filesys_log_res.h
===================================================================
--- trunk/teraterm/teraterm/filesys_log_res.h	2020-07-25 16:00:46 UTC (rev 8862)
+++ trunk/teraterm/teraterm/filesys_log_res.h	2020-07-25 16:00:58 UTC (rev 8863)
@@ -5,7 +5,6 @@
 #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
@@ -12,38 +11,28 @@
 #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_FOPTBIN                     2608
 #define IDC_FOPTTEXT                    2609
-#define IDC_CHECK1                      2611
+#define IDC_NEW_OVERWRITE               2612
+#define IDC_APPEND                      2613
 #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_CONTROL_VALUE         2613
 #define _APS_NEXT_SYMED_VALUE           101
 #endif
 #endif

Modified: trunk/teraterm/teraterm/ttdde.c
===================================================================
--- trunk/teraterm/teraterm/ttdde.c	2020-07-25 16:00:46 UTC (rev 8862)
+++ trunk/teraterm/teraterm/ttdde.c	2020-07-25 16:00:58 UTC (rev 8863)
@@ -275,7 +275,6 @@
 static HDDEDATA AcceptRequest(HSZ ItemHSz)
 {
 	BYTE b;
-	BOOL Unlock;
 	HDDEDATA DH;
 	LPSTR DP;
 	int i;

Modified: trunk/teraterm/teraterm/vtterm.c
===================================================================
--- trunk/teraterm/teraterm/vtterm.c	2020-07-25 16:00:46 UTC (rev 8862)
+++ trunk/teraterm/teraterm/vtterm.c	2020-07-25 16:00:58 UTC (rev 8863)
@@ -634,6 +634,49 @@
 	return cv.HLogBuf != 0 || DDELog;
 }
 
+void TermLogSetCode(int code)
+{
+	vtterm_work_t *vtterm = &vtterm_work;
+	vtterm->log_code = code;
+}
+
+void TermLogOutputBOM(void)
+{
+	vtterm_work_t *vtterm = &vtterm_work;
+	BOOL needs_unlock = FALSE;
+
+	if ((cv.HLogBuf!=NULL) && (cv.LogBuf==NULL)) {
+		cv.LogBuf = (PCHAR)GlobalLock(cv.HLogBuf);
+		needs_unlock = TRUE;
+	}
+
+	switch (vtterm->log_code) {
+	case 0:
+		// UTF-8
+		LogPut1(0xef);
+		LogPut1(0xbb);
+		LogPut1(0xbf);
+		break;
+	case 1:
+		// UTF-16LE
+		LogPut1(0xfe);
+		LogPut1(0xff);
+		break;
+	case 2:
+		// UTF-16BE
+		LogPut1(0xff);
+		LogPut1(0xfe);
+		break;
+	default:
+		break;
+	}
+
+	if (needs_unlock) {
+		GlobalUnlock(cv.HLogBuf);
+		cv.LogBuf = NULL;
+	}
+}
+
 void MoveToStatusLine()
 {
 	MainX = CursorX;

Modified: trunk/teraterm/teraterm/vtterm.h
===================================================================
--- trunk/teraterm/teraterm/vtterm.h	2020-07-25 16:00:46 UTC (rev 8862)
+++ trunk/teraterm/teraterm/vtterm.h	2020-07-25 16:00:58 UTC (rev 8863)
@@ -49,8 +49,9 @@
 void TermPasteString(char *str, int len);
 void TermSendStartBracket(void);
 void TermSendEndBracket(void);
+void TermLogSetCode(int code);
+void TermLogOutputBOM(void);
 
 #ifdef __cplusplus
 }
 #endif
-

Modified: trunk/teraterm/teraterm/vtwin.cpp
===================================================================
--- trunk/teraterm/teraterm/vtwin.cpp	2020-07-25 16:00:46 UTC (rev 8862)
+++ trunk/teraterm/teraterm/vtwin.cpp	2020-07-25 16:00:58 UTC (rev 8863)
@@ -4136,11 +4136,24 @@
 
 void CVTWindow::OnFileLog()
 {
-	char *filename;
-	BOOL r = FLogOpenDialog(&filename);
+	FLogDlgInfo_t info;
+	info.filename = NULL;
+	BOOL r = FLogOpenDialog(hInst, m_hWnd, &info);
 	if (r) {
-		FLogOpen(filename);
-		free(filename);
+		if (!info.append) {
+			// \x83t\x83@\x83C\x83\x8B\x8D폜
+			_DeleteFileW(info.filename);
+		}
+		TermLogSetCode(info.code);
+		char *filenameA = ToCharW(info.filename);
+		free(info.filename);
+		BOOL r = FLogOpen(filenameA);
+		if (r != FALSE) {
+			if (info.bom) {
+				TermLogOutputBOM();
+			}
+		}
+		free(filenameA);
 	}
 }
 

Modified: trunk/teraterm/ttpmacro/ttl_gui.cpp
===================================================================
--- trunk/teraterm/ttpmacro/ttl_gui.cpp	2020-07-25 16:00:46 UTC (rev 8862)
+++ trunk/teraterm/ttpmacro/ttl_gui.cpp	2020-07-25 16:00:58 UTC (rev 8863)
@@ -158,10 +158,9 @@
 	SetInputStr("");
 	if (CheckVar("inputstr", &ValType, &VarId) && (ValType==TypString)) {
 		wchar_t uimsg[MAX_UIMSG];
-		OPENFILENAMEW ofn;
-		wchar_t filename[MaxStrLen];
+		OPENFILENAMEW ofn = {};
+		wchar_t filename[MAX_PATH];
 		filename[0] = 0;
-		memset(&ofn, 0, sizeof(ofn));
 		ofn.lStructSize     = get_OPENFILENAME_SIZEW();
 		ofn.hwndOwner       = GetHWND();
 		ofn.lpstrTitle      = Str1T;
@@ -419,7 +418,7 @@
 			return -1;
 		}
 
-		// return 
+		// return
 		//   0\x88ȏ\xE3: \x91I\x91\xF0\x8D\x80\x96\xDA
 		//   -1: \x83L\x83\x83\x83\x93\x83Z\x83\x8B
 		//	 -2: close
@@ -482,4 +481,3 @@
 	SetResult(YesNo);
 	return Err;
 }
-


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