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