Revision: 8894 https://osdn.net/projects/ttssh2/scm/svn/commits/8894 Author: zmatsuo Date: 2020-08-19 00:27:29 +0900 (Wed, 19 Aug 2020) Log Message: ----------- ログ出力部を分離した - filesys.cpp から filesys_log.cpp を分離 - プロジェクトにファイル追加 - VS2005, VS2019, cmake Modified Paths: -------------- trunk/teraterm/teraterm/CMakeLists.txt trunk/teraterm/teraterm/filesys.cpp trunk/teraterm/teraterm/filesys.h trunk/teraterm/teraterm/ttermpro.v16.vcxproj trunk/teraterm/teraterm/ttermpro.v16.vcxproj.filters trunk/teraterm/teraterm/ttermpro.v8.vcproj Added Paths: ----------- trunk/teraterm/teraterm/filesys_log.cpp -------------- next part -------------- Modified: trunk/teraterm/teraterm/CMakeLists.txt =================================================================== --- trunk/teraterm/teraterm/CMakeLists.txt 2020-08-18 15:10:13 UTC (rev 8893) +++ trunk/teraterm/teraterm/CMakeLists.txt 2020-08-18 15:27:29 UTC (rev 8894) @@ -27,6 +27,7 @@ dnddlg.h filesys.cpp filesys.h + filesys_log.cpp filesys_log.rc filesys_log_res.h font_pp.cpp Modified: trunk/teraterm/teraterm/filesys.cpp =================================================================== --- trunk/teraterm/teraterm/filesys.cpp 2020-08-18 15:10:13 UTC (rev 8893) +++ trunk/teraterm/teraterm/filesys.cpp 2020-08-18 15:27:29 UTC (rev 8894) @@ -63,14 +63,11 @@ #define FS_BRACKET_START 1 #define FS_BRACKET_END 2 -static PFileVar LogVar = NULL; PFileVar SendVar = NULL; PFileVar FileVar = NULL; static PCHAR ProtoVar = NULL; static int ProtoId; -BOOL FileLog = FALSE; -BOOL BinLog = FALSE; static BOOL FileRetrySend, FileRetryEcho, FileCRSend, FileReadEOF, BinaryMode; static BYTE FileByte; @@ -121,25 +118,6 @@ #define IdTTFILESetUILanguageFile 11 #define IdTTFILESetFileSendFilter 12 -/* - Line Head flag for timestamping - 2007.05.24 Gentaro -*/ -enum enumLineEnd { - Line_Other = 0, - Line_LineHead = 1, - Line_FileHead = 2, -}; - -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 -#define WM_DPC_LOGTHREAD_SEND (WM_APP + 1) - -static void CloseFileSync(PFileVar ptr); - - BOOL LoadTTFILE(void) { BOOL Err; @@ -253,7 +231,6 @@ return TRUE; } -static PFileTransDlg FLogDlg = NULL; static PFileTransDlg SendDlg = NULL; static PProtoDlg PtDlg = NULL; @@ -267,10 +244,6 @@ fv->ProgStat = 0; cv.FilePause &= ~fv->OpId; - if (fv->OpId != OpLog) { - fv->HideDialog = ts.FTHideDialog; - } - if (FTDlg!=NULL) { FTDlg->Create(hInst, HVTWin, fv, &cv, &ts); @@ -277,10 +250,7 @@ FTDlg->RefreshNum(); } - if (fv->OpId==OpLog) - FLogDlg = FTDlg; /* Log */ - else - SendDlg = FTDlg; /* File send */ + SendDlg = FTDlg; /* File send */ fv->StartTime = GetTickCount(); @@ -289,18 +259,10 @@ static void ShowFTDlg(WORD OpId) { - if (OpId == OpLog) { - if (FLogDlg != NULL) { - FLogDlg->ShowWindow(SW_SHOWNORMAL); - SetForegroundWindow(FLogDlg->GetSafeHwnd()); - } + if (SendDlg != NULL) { + SendDlg->ShowWindow(SW_SHOWNORMAL); + SetForegroundWindow(SendDlg->GetSafeHwnd()); } - else { - if (SendDlg != NULL) { - SendDlg->ShowWindow(SW_SHOWNORMAL); - SetForegroundWindow(SendDlg->GetSafeHwnd()); - } - } } BOOL NewFileVar(PFileVar *fv) @@ -332,8 +294,7 @@ { if ((*fv)!=NULL) { - CloseFileSync(*fv); - //if ((*fv)->FileOpen) _lclose((*fv)->FileHandle); + if ((*fv)->FileOpen) CloseHandle((*fv)->FileHandle); if ((*fv)->FnStrMemHandle != 0) { GlobalUnlock((*fv)->FnStrMemHandle); @@ -344,1031 +305,6 @@ } } -/** - * \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]; - char tmpuser[256+1]; - DWORD len_user = sizeof(tmpuser); - - memset(buf, 0, sizeof(buf)); - - while(*p != '\0') { - if (*p == '&' && *(p+1) != '\0') { - switch (*(p+1)) { - case 'h': - if (cv.Open) { - if (cv.PortType == IdTCPIP) { - // \x83z\x83X\x83g\x96\xBC\x82\xAAIPv6\x83A\x83h\x83\x8C\x83X\x82\xBE\x82ƁA\x83t\x83@\x83C\x83\x8B\x96\xBC\x82Ɏg\x97p\x82ł\xAB\x82Ȃ\xA2\x95\xB6\x8E\x9A\x82\xAA\x93\xFC\x82邽\x82߁A - // \x97]\x8Cv\x82ȕ\xB6\x8E\x9A\x82͍폜\x82\xB7\x82\xE9\x81B - // (2013.3.9 yutaka) - strncpy_s(tmphost, sizeof(tmphost), ts.HostName, _TRUNCATE); - //strncpy_s(tmphost, sizeof(tmphost), "2001:0db8:bd05:01d2:288a:1fc0:0001:10ee", _TRUNCATE); - replaceInvalidFileNameChar(tmphost, '_'); - strncat_s(buf,sizeof(buf), tmphost, _TRUNCATE); - } - else if (cv.PortType == IdSerial) { - strncpy_s(buf2,sizeof(buf2),buf,_TRUNCATE); - _snprintf_s(buf, sizeof(buf), _TRUNCATE, "%sCOM%d", buf2, ts.ComPort); - } - } - break; - case 'p': - if (cv.Open) { - if (cv.PortType == IdTCPIP) { - char port[6]; - _snprintf_s(port, sizeof(port), _TRUNCATE, "%d", ts.TCPPort); - strncat_s(buf,sizeof(buf),port,_TRUNCATE); - } - } - break; - case 'u': - if (GetUserName(tmpuser, &len_user) != 0) { - strncat_s(buf,sizeof(buf),tmpuser,_TRUNCATE); - } - break; - default: - strncpy_s(buf2,sizeof(buf2),p,2); - strncat_s(buf,sizeof(buf),buf2,_TRUNCATE); - } - p++; - } - else { - strncpy_s(buf2,sizeof(buf2),p,1); - strncat_s(buf,sizeof(buf),buf2,_TRUNCATE); - } - p++; - } - strncpy_s(c, destlen, buf, _TRUNCATE); -} - -static void FixLogOption(void) -{ - if (ts.LogBinary) { - ts.LogTypePlainText = false; - ts.LogTimestamp = false; - } -} - - -// \x83X\x83\x8C\x83b\x83h\x82̏I\x97\xB9\x82ƃt\x83@\x83C\x83\x8B\x82̃N\x83\x8D\x81[\x83Y -static void CloseFileSync(PFileVar ptr) -{ - BOOL ret; - - if (!ptr->FileOpen) - return; - - if (ptr->LogThread != INVALID_HANDLE_VALUE) { - // \x83X\x83\x8C\x83b\x83h\x82̏I\x97\xB9\x91҂\xBF - ret = PostThreadMessage(ptr->LogThreadId, WM_QUIT, 0, 0); - if (ret != 0) { - // \x83X\x83\x8C\x83b\x83h\x83L\x83\x85\x81[\x82ɃG\x83\x93\x83L\x83\x85\x81[\x82ł\xAB\x82\xBD\x8Fꍇ\x82̂ݑ҂\xBF\x8D\x87\x82킹\x82\xF0\x8Ds\x82\xA4\x81B - WaitForSingleObject(ptr->LogThread, INFINITE); - } - else { - //DWORD code = GetLastError(); - } - CloseHandle(ptr->LogThread); - ptr->LogThread = INVALID_HANDLE_VALUE; - } - CloseHandle(ptr->FileHandle); -} - -// \x92x\x89\x84\x8F\x91\x82\xAB\x8D\x9E\x82ݗp\x83X\x83\x8C\x83b\x83h -static unsigned _stdcall DeferredLogWriteThread(void *arg) -{ - MSG msg; - PFileVar fv = (PFileVar)arg; - PCHAR buf; - DWORD buflen; - DWORD wrote; - - PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE); - - // \x83X\x83\x8C\x83b\x83h\x83L\x83\x85\x81[\x82̍쐬\x82\xAA\x8FI\x82\xED\x82\xC1\x82\xBD\x82\xB1\x82Ƃ\xF0\x83X\x83\x8C\x83b\x83h\x90\xB6\x90\xAC\x8C\xB3\x82֒ʒm\x82\xB7\x82\xE9\x81B - if (fv->LogThreadEvent != NULL) { - SetEvent(fv->LogThreadEvent); - } - - while (GetMessage(&msg, NULL, 0, 0) > 0) { - switch (msg.message) { - case WM_DPC_LOGTHREAD_SEND: - buf = (PCHAR)msg.wParam; - buflen = (DWORD)msg.lParam; - WriteFile(LogVar->FileHandle, buf, buflen, &wrote, NULL); - free(buf); // \x82\xB1\x82\xB1\x82Ń\x81\x83\x82\x83\x8A\x89\xF0\x95\xFA - break; - - case WM_QUIT: - goto end; - break; - } - } - -end: - _endthreadex(0); - return (0); -} - -/** - * \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) -{ - WORD BinFlag, val; - - GetRB(Dialog, &BinFlag, IDC_FOPTBIN, IDC_FOPTBIN); - ts.LogBinary = BinFlag; - - GetRB(Dialog, &val, IDC_APPEND, IDC_APPEND); - 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; - } - - 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 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 = _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 - *exist = TRUE; - - // BOM\x97L\x82\xE8/\x96\xB3\x82\xB5\x83`\x83F\x83b\x83N - 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); - if (work->pts->Append > 0) { - CheckRadioButton(Dialog, IDC_NEW_OVERWRITE, IDC_APPEND, IDC_APPEND); - } - } - else { - // \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); - } - - 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 \x96\x94\x82\xCD append\x82ł͂Ȃ\xA2(\x8F㏑\x82\xAB) - 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); - } - } -} - -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) -{ - static const DlgTextInfo TextInfos[] = { - { 0, "DLG_TABSHEET_TITLE_LOG" }, - { IDC_FOPTBIN, "DLG_FOPT_BINARY" }, - { IDC_APPEND, "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)" }, - }; - 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 - Message = WM_COMMAND; - wParam = IDHELP; - } - switch (Message) { - case WM_INITDIALOG: { - 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); - 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_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); - - _SetDlgItemTextW(Dialog, IDC_FOPT_FILENAME_EDIT, work->info->filename); - work->info->filename = NULL; - - // Binary/Text \x83`\x83F\x83b\x83N\x83{\x83b\x83N\x83X - if (pts->LogBinary) { - CheckRadioButton(Dialog, IDC_FOPTBIN, IDC_FOPTTEXT, IDC_FOPTBIN); - } - else { - CheckRadioButton(Dialog, IDC_FOPTBIN, IDC_FOPTTEXT, IDC_FOPTTEXT); - } - - // Plain Text \x83`\x83F\x83b\x83N\x83{\x83b\x83N\x83X - 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 (pts->LogTypePlainText) { - SetRB(Dialog, 1, IDC_PLAINTEXT, IDC_PLAINTEXT); - } - - // Hide dialog\x83`\x83F\x83b\x83N\x83{\x83b\x83N\x83X (2008.1.30 maya) - 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 (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 (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 (pts->LogTimestamp) { - SetRB(Dialog, 1, IDC_TIMESTAMP, IDC_TIMESTAMP); - } - - // timestamp \x8E\xED\x95\xCA - 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 (pts->LogBinary || !pts->LogTimestamp) { - DisableDlgItem(Dialog, IDC_TIMESTAMPTYPE, IDC_TIMESTAMPTYPE); - } - - CenterWindow(Dialog, GetParent(Dialog)); - - return TRUE; - } - - case WM_COMMAND: - switch (LOWORD(wParam)) { - case IDOK: { - 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_APPEND) == 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; - } - case IDCANCEL: - EndDialog(Dialog, IDCANCEL); - break; - case IDHELP: - 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); - - wchar_t fname[MAX_PATH]; - GetDlgItemTextW(Dialog, IDC_FOPT_FILENAME_EDIT, fname, _countof(fname)); - - wchar_t FNFilter[128*3]; - get_lang_msgW("FILEDLG_ALL_FILTER", FNFilter, sizeof(FNFilter), L"All(*.*)\\0*.*\\0\\0", UILanguageFile); - - 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); - - OPENFILENAMEW ofn = {}; - ofn.lStructSize = get_OPENFILENAME_SIZEW(); - //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 = _countof(fname); - ofn.lpstrTitle = caption; - BOOL Ok = GetSaveFileNameW(&ofn); - if (Ok) { - SetDlgItemTextW(Dialog, IDC_FOPT_FILENAME_EDIT, fname); - } - - /* restore dir */ - _SetCurrentDirectoryW(curdir); - - 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); - break; - case IDC_FOPTTEXT: - 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: - if (IsDlgButtonChecked(Dialog, IDC_TIMESTAMP) == BST_CHECKED) { - EnableDlgItem(Dialog, IDC_TIMESTAMPTYPE, IDC_TIMESTAMPTYPE); - } - else { - DisableDlgItem(Dialog, IDC_TIMESTAMPTYPE, IDC_TIMESTAMPTYPE); - } - break; - case IDC_FOPT_FILENAME_EDIT: - if (HIWORD(wParam) == EN_CHANGE){ - 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: { - // \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'; - 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); - DragFinish(hDrop); - return TRUE; - } - } - return FALSE; -} - -static BOOL LogStart(void) -{ - unsigned tid; - - if ((FileLog) || (BinLog)) return FALSE; - - assert(LogVar != NULL); - - 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; - FileLog = FALSE; - if (! CreateBinBuf()) - { - FileTransEnd(OpLog); - return FALSE; - } - } - else { - BinLog = FALSE; - FileLog = TRUE; - if (! CreateLogBuf()) - { - FileTransEnd(OpLog); - return FALSE; - } - } - cv.LStart = cv.LogPtr; - cv.LCount = 0; - if (ts.LogHideDialog) - LogVar->HideDialog = 1; - - /* 2007.05.24 Gentaro */ - eLineEnd = Line_LineHead; - - if (ts.Append > 0) - { - int dwShareMode = FILE_SHARE_READ; - if (!ts.LogLockExclusive) { - dwShareMode = FILE_SHARE_READ | FILE_SHARE_WRITE; - } - LogVar->FileHandle = CreateFile(LogVar->FullName, GENERIC_WRITE, dwShareMode, NULL, - OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); - if (LogVar->FileHandle != INVALID_HANDLE_VALUE){ - SetFilePointer(LogVar->FileHandle, 0, NULL, FILE_END); - /* 2007.05.24 Gentaro - If log file already exists, - a newline is inserted before the first timestamp. - */ - eLineEnd = Line_FileHead; - } - } - else { - int dwShareMode = FILE_SHARE_READ; - if (!ts.LogLockExclusive) { - dwShareMode = FILE_SHARE_READ | FILE_SHARE_WRITE; - } - LogVar->FileHandle = CreateFile(LogVar->FullName, GENERIC_WRITE, dwShareMode, NULL, - CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); - } - LogVar->FileOpen = (LogVar->FileHandle != INVALID_HANDLE_VALUE); - if (! LogVar->FileOpen) - { - char msg[128]; - - // \x83t\x83@\x83C\x83\x8B\x83I\x81[\x83v\x83\x93\x83G\x83\x89\x81[\x8E\x9E\x82̃\x81\x83b\x83Z\x81[\x83W\x95\\x8E\xA6\x82\xF0\x92lj\xC1\x82\xB5\x82\xBD\x81B(2008.7.9 yutaka) - if (LogVar->NoMsg == FALSE) { - _snprintf_s(msg, sizeof(msg), _TRUNCATE, "Can not create a `%s' file. (%d)", LogVar->FullName, GetLastError()); - MessageBox(NULL, msg, "Tera Term: File open error", MB_OK | MB_ICONERROR); - } - - FileTransEnd(OpLog); - return FALSE; - } - LogVar->ByteCount = 0; - - // Log rotate configuration - LogVar->RotateMode = ts.LogRotate; - LogVar->RotateSize = ts.LogRotateSize; - LogVar->RotateStep = ts.LogRotateStep; - - // Log rotate\x82\xAA\x97L\x8C\xF8\x82̏ꍇ\x81A\x8F\x89\x8A\xFA\x83t\x83@\x83C\x83\x8B\x83T\x83C\x83Y\x82\xF0\x90ݒ肷\x82\xE9\x81B - // \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) { - DWORD size = GetFileSize(LogVar->FileHandle, NULL); - if (size != -1) - LogVar->ByteCount = size; - } - - if (! OpenFTDlg(LogVar)) { - FileTransEnd(OpLog); - return FALSE; - } - - // \x92x\x89\x84\x8F\x91\x82\xAB\x8D\x9E\x82ݗp\x83X\x83\x8C\x83b\x83h\x82\xF0\x8BN\x82\xB1\x82\xB7\x81B - // (2013.4.19 yutaka) - // DeferredLogWriteThread \x83X\x83\x8C\x83b\x83h\x82\xAA\x8BN\x8F\xB0\x82\xB5\x82āA\x83X\x83\x8C\x83b\x83h\x83L\x83\x85\x81[\x82\xAA\x8D쐬\x82\xB3\x82\xEA\x82\xE9\x82\xE6\x82\xE8\x91O\x82ɁA - // \x83\x8D\x83O\x83t\x83@\x83C\x83\x8B\x82̃N\x83\x8D\x81[\x83Y(CloseFileSync)\x82\xAA\x8Ds\x82\xED\x82\xEA\x82\xE9\x82ƁA\x83G\x83\x93\x83L\x83\x85\x81[\x82\xAA\x8E\xB8\x94s\x82\xB5\x81A\x83f\x83b\x83h\x83\x8D\x83b\x83N - // \x82\xB7\x82\xE9\x82Ƃ\xA2\x82\xA4\x96\xE2\x91\xE8\x82\xF0\x8FC\x90\xB3\x82\xB5\x82\xBD\x81B - // \x83X\x83\x8C\x83b\x83h\x8AԂ̓\xAF\x8A\xFA\x82\xF0\x8Ds\x82\xA4\x82\xBD\x82߁A\x96\xBC\x91O\x82Ȃ\xB5\x83C\x83x\x83\x93\x83g\x83I\x83u\x83W\x83F\x83N\x83g\x82\xF0\x8Eg\x82\xC1\x82āA\x83X\x83\x8C\x83b\x83h\x83L\x83\x85\x81[\x82\xCC - // \x8D쐬\x82܂ő҂\xBF\x8D\x87\x82킹\x82\xB7\x82\xE9\x82悤\x82ɂ\xB5\x82\xBD\x81B\x96\xBC\x91O\x95t\x82\xAB\x83C\x83x\x83\x93\x83g\x83I\x83u\x83W\x83F\x83N\x83g\x82\xF0\x8Eg\x82\xA4\x8Fꍇ\x82́A - // \x83V\x83X\x83e\x83\x80(Windows OS)\x8F\xE3\x82Ń\x86\x83j\x81[\x83N\x82Ȗ\xBC\x91O\x82ɂ\xB7\x82\xE9\x95K\x97v\x82\xAA\x82\xA0\x82\xE9\x81B - // (2016.9.23 yutaka) - LogVar->LogThreadEvent = CreateEvent(NULL, TRUE, FALSE, NULL); - LogVar->LogThread = (HANDLE)_beginthreadex(NULL, 0, DeferredLogWriteThread, LogVar, 0, &tid); - LogVar->LogThreadId = tid; - if (LogVar->LogThreadEvent != NULL) { - WaitForSingleObject(LogVar->LogThreadEvent, INFINITE); - CloseHandle(LogVar->LogThreadEvent); - } - - // \x8C\xBB\x8D݃o\x83b\x83t\x83@\x82ɂ\xA0\x82\xE9\x83f\x81[\x83^\x82\xF0\x82\xB7\x82ׂď\x91\x82\xAB\x8Fo\x82\xB5\x82Ă\xA9\x82\xE7\x81A - // \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)); - if (size == -1) - break; - -#if 0 - if (ts.DeferredLogWriteMode) { // \x92x\x89\x84\x8F\x91\x82\xAB\x8D\x9E\x82\xDD - char *pbuf = (char *)malloc(size + 2); - memcpy(pbuf, buf, size); - pbuf[size] = '\r'; - pbuf[size+1] = '\n'; - Sleep(1); // \x83X\x83\x8C\x83b\x83h\x83L\x83\x85\x81[\x82\xAA\x8D\xEC\x82\xE7\x82\xEA\x82\xE9\x82悤\x82ɁA\x83R\x83\x93\x83e\x83L\x83X\x83g\x83X\x83C\x83b\x83`\x82𑣂\xB7\x81B - PostThreadMessage(LogVar->LogThreadId, WM_DPC_LOGTHREAD_SEND, (WPARAM)pbuf, size + 2); - } else { // \x92\xBC\x8F\x91\x82\xAB\x81B\x83l\x83b\x83g\x83\x8F\x81[\x83N\x8Co\x97R\x82\xBE\x82ƒx\x82\xA2\x81B -#endif - WriteFile(LogVar->FileHandle, buf, size, &written_size, NULL); - WriteFile(LogVar->FileHandle, crlf, crlf_len, &written_size, NULL); -#if 0 - } -#endif - } - } - - return TRUE; -} - -void LogPut1(BYTE b) -{ - cv.LogBuf[cv.LogPtr] = b; - cv.LogPtr++; - if (cv.LogPtr>=InBuffSize) - cv.LogPtr = cv.LogPtr-InBuffSize; - - if (FileLog) - { - if (cv.LCount>=InBuffSize) - { - cv.LCount = InBuffSize; - cv.LStart = cv.LogPtr; - } - else - cv.LCount++; - } - else - cv.LCount = 0; -} - -static BOOL Get1(PCHAR Buf, int *Start, int *Count, PBYTE b) -{ - if (*Count<=0) return FALSE; - *b = Buf[*Start]; - (*Start)++; - if (*Start>=InBuffSize) - *Start = *Start-InBuffSize; - (*Count)--; - return TRUE; -} - - - -static CRITICAL_SECTION g_filelog_lock; /* \x83\x8D\x83b\x83N\x97p\x95ϐ\x94 */ - -void logfile_lock_initialize(void) -{ - InitializeCriticalSection(&g_filelog_lock); -} - -static inline void logfile_lock(void) -{ - EnterCriticalSection(&g_filelog_lock); -} - -static inline void logfile_unlock(void) -{ - LeaveCriticalSection(&g_filelog_lock); -} - - // \x83R\x83\x81\x83\x93\x83g\x82\xF0\x83\x8D\x83O\x82֒lj\xC1\x82\xB7\x82\xE9 -static void CommentLogToFile(char *buf, int size) -{ - DWORD wrote; - - if (LogVar == NULL || !LogVar->FileOpen) { - char uimsg[MAX_UIMSG]; - get_lang_msg("MSG_ERROR", uimsg, sizeof(uimsg), "ERROR", ts.UILanguageFile); - get_lang_msg("MSG_COMMENT_LOG_OPEN_ERROR", ts.UIMsg, sizeof(ts.UIMsg), - "It is not opened by the log file yet.", ts.UILanguageFile); - ::MessageBox(NULL, ts.UIMsg, uimsg, MB_OK|MB_ICONEXCLAMATION); - return; - } - - logfile_lock(); - WriteFile(LogVar->FileHandle, buf, size, &wrote, NULL); - WriteFile(LogVar->FileHandle, "\r\n", 2, &wrote, NULL); // \x89\xFC\x8Ds - /* Set Line End Flag - 2007.05.24 Gentaro - */ - eLineEnd = Line_LineHead; - logfile_unlock(); -} - -// \x83\x8D\x83O\x82\xF0\x83\x8D\x81[\x83e\x81[\x83g\x82\xB7\x82\xE9\x81B -// (2013.3.21 yutaka) -static void LogRotate(void) -{ - int loopmax = 10000; // XXX - char filename[1024]; - char newfile[1024], oldfile[1024]; - int i, k; - int dwShareMode = FILE_SHARE_READ; - unsigned tid; - - if (! LogVar->FileOpen) return; - - if (LogVar->RotateMode == ROTATE_NONE) - return; - - if (LogVar->RotateMode == ROTATE_SIZE) { - if (LogVar->ByteCount <= LogVar->RotateSize) - return; - //OutputDebugPrintf("%s: mode %d size %ld\n", __FUNCTION__, LogVar->RotateMode, LogVar->ByteCount); - } else { - return; - } - - logfile_lock(); - // \x83\x8D\x83O\x83T\x83C\x83Y\x82\xF0\x8Dď\x89\x8A\x{227B0B7}\x82\xE9\x81B - LogVar->ByteCount = 0; - - // \x82\xA2\x82\xC1\x82\xBD\x82̃t\x83@\x83C\x83\x8B\x82\xF0\x83N\x83\x8D\x81[\x83Y\x82\xB5\x82āA\x95ʖ\xBC\x82̃t\x83@\x83C\x83\x8B\x82\xF0\x83I\x81[\x83v\x83\x93\x82\xB7\x82\xE9\x81B - CloseFileSync(LogVar); - //_lclose(LogVar->FileHandle); - - // \x90\xA2\x91ネ\x81[\x83e\x81[\x83V\x83\x87\x83\x93\x82̃X\x83e\x83b\x83v\x90\x94\x82̎w\x92肪\x82\xA0\x82邩 - if (LogVar->RotateStep > 0) - loopmax = LogVar->RotateStep; - - for (i = 1 ; i <= loopmax ; i++) { - _snprintf_s(filename, sizeof(filename), _TRUNCATE, "%s.%d", LogVar->FullName, i); - if (_access_s(filename, 0) != 0) - break; - } - if (i > loopmax) { - // \x90\xA2\x91オ\x82\xA2\x82\xC1\x82ς\xA2\x82ɂȂ\xC1\x82\xBD\x82\xE7\x81A\x8DŌẪt\x83@\x83C\x83\x8B\x82\xA9\x82\xE7\x94p\x8A\xFC\x82\xB7\x82\xE9\x81B - i = loopmax; - } - - // \x95ʃt\x83@\x83C\x83\x8B\x82Ƀ\x8A\x83l\x81[\x83\x80\x81B - for (k = i-1 ; k >= 0 ; k--) { - if (k == 0) - strncpy_s(oldfile, sizeof(oldfile), LogVar->FullName, _TRUNCATE); - else - _snprintf_s(oldfile, sizeof(oldfile), _TRUNCATE, "%s.%d", LogVar->FullName, k); - _snprintf_s(newfile, sizeof(newfile), _TRUNCATE, "%s.%d", LogVar->FullName, k+1); - remove(newfile); - if (rename(oldfile, newfile) != 0) { - OutputDebugPrintf("%s: rename %d\n", __FUNCTION__, errno); - } - } - - // \x8DăI\x81[\x83v\x83\x93 - if (!ts.LogLockExclusive) { - dwShareMode = FILE_SHARE_READ | FILE_SHARE_WRITE; - } - LogVar->FileHandle = CreateFile(LogVar->FullName, GENERIC_WRITE, dwShareMode, NULL, - CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); - - // \x92x\x89\x84\x8F\x91\x82\xAB\x8D\x9E\x82ݗp\x83X\x83\x8C\x83b\x83h\x82\xF0\x8BN\x82\xB1\x82\xB7\x81B - // (2013.4.19 yutaka) - // DeferredLogWriteThread \x83X\x83\x8C\x83b\x83h\x82\xAA\x8BN\x8F\xB0\x82\xB5\x82āA\x83X\x83\x8C\x83b\x83h\x83L\x83\x85\x81[\x82\xAA\x8D쐬\x82\xB3\x82\xEA\x82\xE9\x82\xE6\x82\xE8\x91O\x82ɁA - // \x83\x8D\x83O\x83t\x83@\x83C\x83\x8B\x82̃N\x83\x8D\x81[\x83Y(CloseFileSync)\x82\xAA\x8Ds\x82\xED\x82\xEA\x82\xE9\x82ƁA\x83G\x83\x93\x83L\x83\x85\x81[\x82\xAA\x8E\xB8\x94s\x82\xB5\x81A\x83f\x83b\x83h\x83\x8D\x83b\x83N - // \x82\xB7\x82\xE9\x82Ƃ\xA2\x82\xA4\x96\xE2\x91\xE8\x82\xF0\x8FC\x90\xB3\x82\xB5\x82\xBD\x81B - // \x83X\x83\x8C\x83b\x83h\x8AԂ̓\xAF\x8A\xFA\x82\xF0\x8Ds\x82\xA4\x82\xBD\x82߁A\x96\xBC\x91O\x82Ȃ\xB5\x83C\x83x\x83\x93\x83g\x83I\x83u\x83W\x83F\x83N\x83g\x82\xF0\x8Eg\x82\xC1\x82āA\x83X\x83\x8C\x83b\x83h\x83L\x83\x85\x81[\x82\xCC - // \x8D쐬\x82܂ő҂\xBF\x8D\x87\x82킹\x82\xB7\x82\xE9\x82悤\x82ɂ\xB5\x82\xBD\x81B\x96\xBC\x91O\x95t\x82\xAB\x83C\x83x\x83\x93\x83g\x83I\x83u\x83W\x83F\x83N\x83g\x82\xF0\x8Eg\x82\xA4\x8Fꍇ\x82́A - // \x83V\x83X\x83e\x83\x80(Windows OS)\x8F\xE3\x82Ń\x86\x83j\x81[\x83N\x82Ȗ\xBC\x91O\x82ɂ\xB7\x82\xE9\x95K\x97v\x82\xAA\x82\xA0\x82\xE9\x81B - // (2016.9.26 yutaka) - LogVar->LogThreadEvent = CreateEvent(NULL, TRUE, FALSE, NULL); - LogVar->LogThread = (HANDLE)_beginthreadex(NULL, 0, DeferredLogWriteThread, LogVar, 0, &tid); - LogVar->LogThreadId = tid; - if (LogVar->LogThreadEvent != NULL) { - WaitForSingleObject(LogVar->LogThreadEvent, INFINITE); - CloseHandle(LogVar->LogThreadEvent); - } - - logfile_unlock(); - -} - -void LogToFile(void) -{ - PCHAR Buf; - int Start, Count; - BYTE b; - PCHAR WriteBuf; - DWORD WriteBufMax, WriteBufLen; - CHAR tmp[128]; - DWORD wrote; - - if (! LogVar->FileOpen) return; - if (FileLog) - { - Buf = cv.LogBuf; - Start = cv.LStart; - Count = cv.LCount; - } - else if (BinLog) - { - Buf = cv.BinBuf; - Start = cv.BStart; - Count = cv.BCount; - } - else - return; - - if (Buf==NULL) return; - if (Count==0) return; - - // \x83\x8D\x83b\x83N\x82\xF0\x8E\xE6\x82\xE9(2004.8.6 yutaka) - logfile_lock(); - - if (ts.DeferredLogWriteMode) { - WriteBufMax = 8192; - WriteBufLen = 0; - WriteBuf = (PCHAR)malloc(WriteBufMax); - while (Get1(Buf,&Start,&Count,&b)) { - if (!FLogIsPause() && (! cv.ProtoFlag)) - { - tmp[0] = 0; - if ( ts.LogTimestamp && eLineEnd ) { - char *strtime = NULL; - - switch (ts.LogTimestampType) { - case TIMESTAMP_LOCAL: - strtime = mctimelocal(ts.LogTimestampFormat, FALSE); - break; - case TIMESTAMP_UTC: - strtime = mctimelocal(ts.LogTimestampFormat, TRUE); - break; - case TIMESTAMP_ELAPSED_LOGSTART: - strtime = strelapsed(LogVar->StartTime); - break; - case TIMESTAMP_ELAPSED_CONNECTED: - strtime = strelapsed(cv.ConnectedTime); - break; - } - - /* 2007.05.24 Gentaro */ - if( eLineEnd == Line_FileHead ){ - strncat_s(tmp, sizeof(tmp), "\r\n", _TRUNCATE); - } - strncat_s(tmp, sizeof(tmp), "[", _TRUNCATE); - strncat_s(tmp, sizeof(tmp), strtime, _TRUNCATE); - strncat_s(tmp, sizeof(tmp), "] ", _TRUNCATE); - } - - /* 2007.05.24 Gentaro */ - if( b == 0x0a ){ - eLineEnd = Line_LineHead; /* set endmark*/ - } - else { - eLineEnd = Line_Other; /* clear endmark*/ - } - - if (WriteBufLen >= (WriteBufMax*4/5)) { - WriteBufMax *= 2; - WriteBuf = (PCHAR)realloc(WriteBuf, WriteBufMax); - } - memcpy(&WriteBuf[WriteBufLen], tmp, strlen(tmp)); - WriteBufLen += strlen(tmp); - WriteBuf[WriteBufLen++] = b; - - (LogVar->ByteCount)++; - } - } - - PostThreadMessage(LogVar->LogThreadId, WM_DPC_LOGTHREAD_SEND, (WPARAM)WriteBuf, WriteBufLen); - - } else { - - while (Get1(Buf,&Start,&Count,&b)) - { - if (!FLogIsPause() && (! cv.ProtoFlag)) - { - if ( ts.LogTimestamp && eLineEnd ) { - char *strtime = NULL; - - switch (ts.LogTimestampType) { - case TIMESTAMP_LOCAL: - strtime = mctimelocal(ts.LogTimestampFormat, FALSE); - break; - case TIMESTAMP_UTC: - strtime = mctimelocal(ts.LogTimestampFormat, TRUE); - break; - case TIMESTAMP_ELAPSED_LOGSTART: - strtime = strelapsed(LogVar->StartTime); - break; - case TIMESTAMP_ELAPSED_CONNECTED: - strtime = strelapsed(cv.ConnectedTime); - break; - } - WriteFile(LogVar->FileHandle, "[", 1, &wrote, NULL); - WriteFile(LogVar->FileHandle, strtime, strlen(strtime), &wrote, NULL); - WriteFile(LogVar->FileHandle, "] ", 2, &wrote, NULL); - } - - /* 2007.05.24 Gentaro */ - if( b == 0x0a ){ - eLineEnd = Line_LineHead; /* set endmark*/ - } - else { - eLineEnd = Line_Other; /* clear endmark*/ - } - - WriteFile(LogVar->FileHandle, (PCHAR)&b, 1, &wrote, NULL); - (LogVar->ByteCount)++; - } - } - - } - - logfile_unlock(); - - if (FileLog) - { - cv.LStart = Start; - cv.LCount = Count; - } - else { - cv.BStart = Start; - cv.BCount = Count; - } - if (FLogIsPause() || cv.ProtoFlag) return; - if (FLogDlg!=NULL) - FLogDlg->RefreshNum(); - - // \x83\x8D\x83O\x81E\x83\x8D\x81[\x83e\x81[\x83g - LogRotate(); - -} - -BOOL CreateLogBuf(void) -{ - if (cv.HLogBuf==NULL) - { - cv.HLogBuf = GlobalAlloc(GMEM_MOVEABLE,InBuffSize); - cv.LogBuf = NULL; - cv.LogPtr = 0; - cv.LStart = 0; - cv.LCount = 0; - } - return (cv.HLogBuf!=NULL); -} - -void FreeLogBuf(void) -{ - if ((cv.HLogBuf==NULL) || FileLog) - return; - if (cv.LogBuf!=NULL) - GlobalUnlock(cv.HLogBuf); - GlobalFree(cv.HLogBuf); - cv.HLogBuf = NULL; - cv.LogBuf = NULL; - cv.LogPtr = 0; - cv.LStart = 0; - cv.LCount = 0; -} - -BOOL CreateBinBuf(void) -{ - if (cv.HBinBuf==NULL) - { - cv.HBinBuf = GlobalAlloc(GMEM_MOVEABLE,InBuffSize); - cv.BinBuf = NULL; - cv.BinPtr = 0; - cv.BStart = 0; - cv.BCount = 0; - } - return (cv.HBinBuf!=NULL); -} - -void FreeBinBuf(void) -{ - if ((cv.HBinBuf==NULL) || BinLog) - return; - if (cv.BinBuf!=NULL) - GlobalUnlock(cv.HBinBuf); - GlobalFree(cv.HBinBuf); - cv.HBinBuf = NULL; - cv.BinBuf = NULL; - cv.BinPtr = 0; - cv.BStart = 0; - cv.BCount = 0; -} - void FileSendStart(void) { LONG Option = 0; @@ -1447,17 +383,7 @@ { if (((OpId==0) || (OpId==OpLog)) && (FileLog || BinLog)) { - FileLog = FALSE; - BinLog = FALSE; - if (FLogDlg!=NULL) - { - FLogDlg->DestroyWindow(); - FLogDlg = NULL; - } - FreeFileVar(&LogVar); - FreeLogBuf(); - FreeBinBuf(); - FreeTTFILE(); + FLogClose(); } if (((OpId==0) || (OpId==OpSendFile)) && FSend) @@ -1509,7 +435,7 @@ // - FileBracketMode == false // - cv.TelFlag == false // - ts.LocalEcho == 0 -void FileSendBinayBoost(void) +static void FileSendBinayBoost(void) { WORD c, fc; LONG BCOld; @@ -1669,17 +595,6 @@ FileTransEnd(OpSendFile); } -/** - * \x83\x8D\x83O\x82\xF0\x83|\x81[\x83Y\x82\xB7\x82\xE9 - * \x8C\xB3\x82\xCD FLogChangeButton() \x82\xBE\x82\xC1\x82\xBD - */ -void FLogPause(BOOL Pause) -{ - if (FLogDlg!=NULL) - FLogDlg->ChangeButton(Pause); - FileTransPause(OpLog, Pause); -} - static BOOL OpenProtoDlg(PFileVar fv, int IdProto, int Mode, WORD Opt1, WORD Opt2) { int vsize; @@ -2158,256 +1073,3 @@ 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\x82A\x83\x8D\x81[\x83e\x81[\x83V\x83\x87\x83\x93\x82\xB7\x82\xE9\x82悤\x90ݒ肷\x82\xE9 - */ -void FLogRotateSize(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 FLogRotateRotate(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 FLogRotateHalt(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 FLogAddCommentDlg(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 FLogClose(void) -{ - if (LogVar != NULL) - FileTransEnd(OpLog); -} - -BOOL FLogOpen(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 FLogIsOpend(void) -{ - // LogVar->FileOpen - return LogVar != NULL; -} - -void FLogWriteStr(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; - if (FLogDlg!=NULL) - FLogDlg->RefreshNum(); - } -} - -void FLogInfo(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 *FLogGetFilename() -{ - if (LogVar == NULL) { - return NULL; - } - return LogVar->FullName; -} - -/** - * \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ꂽ - */ -BOOL FLogOpenDialog(HINSTANCE hInst, HWND hWnd, FLogDlgInfo_t *info) -{ - 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), - hWnd, LogFnHook, (LPARAM)work); - free(srcfnameW); - free(work); - 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 *FLogGetLogFilename(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); -} - -BOOL FLogIsPause() -{ - return ((cv.FilePause & OpLog) !=0); -} - -void FLogWindow(int nCmdShow) -{ - if (FLogDlg == NULL) - return; - - HWND HWndLog = FLogDlg->m_hWnd; - ShowWindow(HWndLog, nCmdShow); - if (nCmdShow == SW_RESTORE) { - // \x8Ag\x92\xA3\x83X\x83^\x83C\x83\x8B WS_EX_NOACTIVATE \x8F\xF3\x91Ԃ\xF0\x89\xF0\x8F\x9C\x82\xB7\x82\xE9 - SetForegroundWindow(HWndLog); - } -} - -void FLogShowDlg(void) -{ - ShowFTDlg(OpLog); -} Modified: trunk/teraterm/teraterm/filesys.h =================================================================== --- trunk/teraterm/teraterm/filesys.h 2020-08-18 15:10:13 UTC (rev 8893) +++ trunk/teraterm/teraterm/filesys.h 2020-08-18 15:27:29 UTC (rev 8894) @@ -74,17 +74,8 @@ BOOL NewFileVar(PFileVar *FV); void FreeFileVar(PFileVar *FV); -void LogPut1(BYTE b); -void LogToFile(void); -BOOL CreateLogBuf(void); -void FreeLogBuf(void); -BOOL CreateBinBuf(void); -void FreeBinBuf(void); - void FileSendStart(void); void FileSend(void); -//void FLogChangeButton(BOOL Pause); -void FLogPause(BOOL Pause); void FileTransEnd(WORD OpId); void FileTransPause(WORD OpId, BOOL Pause); @@ -100,7 +91,6 @@ void QVStart(int mode); extern PFileVar SendVar, FileVar; -extern BOOL FileLog, BinLog; // log typedef struct { @@ -109,7 +99,15 @@ BOOL bom; // TRUE = BOM\x82\xA0\x82\xE8 int code; // 0/1/2 = UTF-8/UTF-16LE/UTF-16BE } FLogDlgInfo_t; +extern BOOL FileLog, BinLog; void logfile_lock_initialize(void); +void LogPut1(BYTE b); +void LogToFile(void); +BOOL CreateLogBuf(void); +void FreeLogBuf(void); +BOOL CreateBinBuf(void); +void FreeBinBuf(void); +void FLogPause(BOOL Pause); void FLogRotateSize(size_t size); void FLogRotateRotate(int step); void FLogRotateHalt(void); Copied: trunk/teraterm/teraterm/filesys_log.cpp (from rev 8893, trunk/teraterm/teraterm/filesys.cpp) =================================================================== --- trunk/teraterm/teraterm/filesys_log.cpp (rev 0) +++ trunk/teraterm/teraterm/filesys_log.cpp 2020-08-18 15:27:29 UTC (rev 8894) @@ -0,0 +1,1557 @@ +/* + * (C) 2020 TeraTerm Project + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* TERATERM.EXE, file transfer routines */ +#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 "ftdlg.h" +#include "ttwinman.h" +#include "commlib.h" +#include "ttcommon.h" +#include "ttlib.h" +#include "dlglib.h" +#include "vtterm.h" +#include "ftlib.h" +#include "buffer.h" +#include "helpid.h" +#include "layer_for_unicode.h" +#include "layer_for_unicode_crt.h" +#include "codeconv.h" + +#include "filesys_log_res.h" +#include "filesys.h" + +#if 0 +typedef struct { + HWND HMainWin; + HWND HWin; + WORD OpId; + char DlgCaption[40]; + + char FullName[MAX_PATH]; + int DirLen; + + int NumFname, FNCount; + HANDLE FnStrMemHandle; + PCHAR FnStrMem; + int FnPtr; + + BOOL FileOpen; + HANDLE FileHandle; + LONG FileSize, ByteCount; + BOOL OverWrite; + + BOOL LogFlag; + HANDLE LogFile; + WORD LogState; + WORD LogCount; + + BOOL Success; + BOOL NoMsg; + + char LogDefaultPath[MAX_PATH]; + BOOL HideDialog; + + BYTE LogLineBuf[16]; + int FlushLogLineBuf; + + int ProgStat; + + DWORD StartTime; + + // log rotate + int RotateMode; // enum rotate_mode RotateMode; + LONG RotateSize; + int RotateStep; + + HANDLE LogThread; + DWORD LogThreadId; + + DWORD FileMtime; + HANDLE LogThreadEvent; +} TFileVar_; +typedef TFileVar_ *PFileVar_; + +#define PFileVar PFileVar_ +#define TFileVar TFileVar_ +#endif + +static PFileVar LogVar = NULL; + +BOOL FileLog = FALSE; +BOOL BinLog = FALSE; + +/* + Line Head flag for timestamping + 2007.05.24 Gentaro +*/ +enum enumLineEnd { + Line_Other = 0, + Line_LineHead = 1, + Line_FileHead = 2, +}; + +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 +#define WM_DPC_LOGTHREAD_SEND (WM_APP + 1) + +static void CloseFileSync(PFileVar ptr); +static void FileTransEnd_(WORD OpId); + + +static PFileTransDlg FLogDlg = NULL; + +static BOOL OpenFTDlg_(PFileVar fv) +{ + PFileTransDlg FTDlg; + + FTDlg = new CFileTransDlg(); + + fv->StartTime = 0; + fv->ProgStat = 0; + cv.FilePause &= ~fv->OpId; + + if (fv->OpId != OpLog) { + fv->HideDialog = ts.FTHideDialog; + } + + if (FTDlg!=NULL) + { + FTDlg->Create(hInst, HVTWin, fv, &cv, &ts); + FTDlg->RefreshNum(); + } + +// if (fv->OpId==OpLog) + FLogDlg = FTDlg; /* Log */ +#if 0 + else + SendDlg = FTDlg; /* File send */ +#endif + + fv->StartTime = GetTickCount(); + + return (FTDlg!=NULL); +} + +static void ShowFTDlg(WORD OpId) +{ +// if (OpId == OpLog) + { + if (FLogDlg != NULL) { + FLogDlg->ShowWindow(SW_SHOWNORMAL); + SetForegroundWindow(FLogDlg->GetSafeHwnd()); + } + } +#if 0 + else { + if (SendDlg != NULL) { + SendDlg->ShowWindow(SW_SHOWNORMAL); + SetForegroundWindow(SendDlg->GetSafeHwnd()); + } + } +#endif +} + +static BOOL NewFileVar_(PFileVar *fv) +{ + if ((*fv)==NULL) + { + *fv = (PFileVar)malloc(sizeof(TFileVar)); + if ((*fv)!=NULL) + { + char FileDirExpanded[MAX_PATH]; + ExpandEnvironmentStrings(ts.FileDir, FileDirExpanded, sizeof(FileDirExpanded)); + memset(*fv, 0, sizeof(TFileVar)); + strncpy_s((*fv)->FullName, sizeof((*fv)->FullName), FileDirExpanded, _TRUNCATE); + AppendSlash((*fv)->FullName,sizeof((*fv)->FullName)); + (*fv)->DirLen = strlen((*fv)->FullName); + (*fv)->FileOpen = FALSE; + (*fv)->OverWrite = ((ts.FTFlag & FT_RENAME) == 0); + (*fv)->HMainWin = HVTWin; + (*fv)->Success = FALSE; + (*fv)->NoMsg = FALSE; + (*fv)->HideDialog = FALSE; + } + } + + return ((*fv)!=NULL); +} + +static void FreeFileVar_(PFileVar *fv) +{ + if ((*fv)!=NULL) + { + CloseFileSync(*fv); + //if ((*fv)->FileOpen) _lclose((*fv)->FileHandle); + if ((*fv)->FnStrMemHandle != 0) + { + GlobalUnlock((*fv)->FnStrMemHandle); + GlobalFree((*fv)->FnStrMemHandle); + } + free(*fv); + *fv = NULL; + } +} + +/** + * \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]; + char tmpuser[256+1]; + DWORD len_user = sizeof(tmpuser); + + memset(buf, 0, sizeof(buf)); + + while(*p != '\0') { + if (*p == '&' && *(p+1) != '\0') { + switch (*(p+1)) { + case 'h': + if (cv.Open) { + if (cv.PortType == IdTCPIP) { + // \x83z\x83X\x83g\x96\xBC\x82\xAAIPv6\x83A\x83h\x83\x8C\x83X\x82\xBE\x82ƁA\x83t\x83@\x83C\x83\x8B\x96\xBC\x82Ɏg\x97p\x82ł\xAB\x82Ȃ\xA2\x95\xB6\x8E\x9A\x82\xAA\x93\xFC\x82邽\x82߁A + // \x97]\x8Cv\x82ȕ\xB6\x8E\x9A\x82͍폜\x82\xB7\x82\xE9\x81B + // (2013.3.9 yutaka) + strncpy_s(tmphost, sizeof(tmphost), ts.HostName, _TRUNCATE); + //strncpy_s(tmphost, sizeof(tmphost), "2001:0db8:bd05:01d2:288a:1fc0:0001:10ee", _TRUNCATE); + replaceInvalidFileNameChar(tmphost, '_'); + strncat_s(buf,sizeof(buf), tmphost, _TRUNCATE); + } + else if (cv.PortType == IdSerial) { + strncpy_s(buf2,sizeof(buf2),buf,_TRUNCATE); + _snprintf_s(buf, sizeof(buf), _TRUNCATE, "%sCOM%d", buf2, ts.ComPort); + } + } + break; + case 'p': + if (cv.Open) { + if (cv.PortType == IdTCPIP) { + char port[6]; + _snprintf_s(port, sizeof(port), _TRUNCATE, "%d", ts.TCPPort); + strncat_s(buf,sizeof(buf),port,_TRUNCATE); + } + } + break; + case 'u': + if (GetUserName(tmpuser, &len_user) != 0) { + strncat_s(buf,sizeof(buf),tmpuser,_TRUNCATE); + } + break; + default: + strncpy_s(buf2,sizeof(buf2),p,2); + strncat_s(buf,sizeof(buf),buf2,_TRUNCATE); + } + p++; + } + else { + strncpy_s(buf2,sizeof(buf2),p,1); + strncat_s(buf,sizeof(buf),buf2,_TRUNCATE); + } + p++; + } + strncpy_s(c, destlen, buf, _TRUNCATE); +} + +static void FixLogOption(void) +{ + if (ts.LogBinary) { + ts.LogTypePlainText = false; + ts.LogTimestamp = false; + } +} + + +// \x83X\x83\x8C\x83b\x83h\x82̏I\x97\xB9\x82ƃt\x83@\x83C\x83\x8B\x82̃N\x83\x8D\x81[\x83Y +static void CloseFileSync(PFileVar ptr) +{ + BOOL ret; + + if (!ptr->FileOpen) + return; + + if (ptr->LogThread != INVALID_HANDLE_VALUE) { + // \x83X\x83\x8C\x83b\x83h\x82̏I\x97\xB9\x91҂\xBF + ret = PostThreadMessage(ptr->LogThreadId, WM_QUIT, 0, 0); + if (ret != 0) { + // \x83X\x83\x8C\x83b\x83h\x83L\x83\x85\x81[\x82ɃG\x83\x93\x83L\x83\x85\x81[\x82ł\xAB\x82\xBD\x8Fꍇ\x82̂ݑ҂\xBF\x8D\x87\x82킹\x82\xF0\x8Ds\x82\xA4\x81B + WaitForSingleObject(ptr->LogThread, INFINITE); + } + else { + //DWORD code = GetLastError(); + } + CloseHandle(ptr->LogThread); + ptr->LogThread = INVALID_HANDLE_VALUE; + } + CloseHandle(ptr->FileHandle); +} + +// \x92x\x89\x84\x8F\x91\x82\xAB\x8D\x9E\x82ݗp\x83X\x83\x8C\x83b\x83h +static unsigned _stdcall DeferredLogWriteThread(void *arg) +{ + MSG msg; + PFileVar fv = (PFileVar)arg; + PCHAR buf; + DWORD buflen; + DWORD wrote; + + PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE); + + // \x83X\x83\x8C\x83b\x83h\x83L\x83\x85\x81[\x82̍쐬\x82\xAA\x8FI\x82\xED\x82\xC1\x82\xBD\x82\xB1\x82Ƃ\xF0\x83X\x83\x8C\x83b\x83h\x90\xB6\x90\xAC\x8C\xB3\x82֒ʒm\x82\xB7\x82\xE9\x81B + if (fv->LogThreadEvent != NULL) { + SetEvent(fv->LogThreadEvent); + } + + while (GetMessage(&msg, NULL, 0, 0) > 0) { + switch (msg.message) { + case WM_DPC_LOGTHREAD_SEND: + buf = (PCHAR)msg.wParam; + buflen = (DWORD)msg.lParam; + WriteFile(LogVar->FileHandle, buf, buflen, &wrote, NULL); + free(buf); // \x82\xB1\x82\xB1\x82Ń\x81\x83\x82\x83\x8A\x89\xF0\x95\xFA + break; + + case WM_QUIT: + goto end; + break; + } + } + +end: + _endthreadex(0); + return (0); +} + +/** + * \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) +{ + WORD BinFlag, val; + + GetRB(Dialog, &BinFlag, IDC_FOPTBIN, IDC_FOPTBIN); + ts.LogBinary = BinFlag; + + GetRB(Dialog, &val, IDC_APPEND, IDC_APPEND); + 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; + } + + 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 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 = _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 + *exist = TRUE; + + // BOM\x97L\x82\xE8/\x96\xB3\x82\xB5\x83`\x83F\x83b\x83N + 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); + if (work->pts->Append > 0) { + CheckRadioButton(Dialog, IDC_NEW_OVERWRITE, IDC_APPEND, IDC_APPEND); + } + } + else { + // \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); + } + + 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 \x96\x94\x82\xCD append\x82ł͂Ȃ\xA2(\x8F㏑\x82\xAB) + 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); + } + } +} + +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) +{ + static const DlgTextInfo TextInfos[] = { + { 0, "DLG_TABSHEET_TITLE_LOG" }, + { IDC_FOPTBIN, "DLG_FOPT_BINARY" }, + { IDC_APPEND, "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)" }, + }; + 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 + Message = WM_COMMAND; + wParam = IDHELP; + } + switch (Message) { + case WM_INITDIALOG: { + 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); + 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_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); + + _SetDlgItemTextW(Dialog, IDC_FOPT_FILENAME_EDIT, work->info->filename); + work->info->filename = NULL; + + // Binary/Text \x83`\x83F\x83b\x83N\x83{\x83b\x83N\x83X + if (pts->LogBinary) { + CheckRadioButton(Dialog, IDC_FOPTBIN, IDC_FOPTTEXT, IDC_FOPTBIN); + } + else { + CheckRadioButton(Dialog, IDC_FOPTBIN, IDC_FOPTTEXT, IDC_FOPTTEXT); + } + + // Plain Text \x83`\x83F\x83b\x83N\x83{\x83b\x83N\x83X + 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 (pts->LogTypePlainText) { + SetRB(Dialog, 1, IDC_PLAINTEXT, IDC_PLAINTEXT); + } + + // Hide dialog\x83`\x83F\x83b\x83N\x83{\x83b\x83N\x83X (2008.1.30 maya) + 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 (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 (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 (pts->LogTimestamp) { + SetRB(Dialog, 1, IDC_TIMESTAMP, IDC_TIMESTAMP); + } + + // timestamp \x8E\xED\x95\xCA + 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 (pts->LogBinary || !pts->LogTimestamp) { + DisableDlgItem(Dialog, IDC_TIMESTAMPTYPE, IDC_TIMESTAMPTYPE); + } + + CenterWindow(Dialog, GetParent(Dialog)); + + return TRUE; + } + + case WM_COMMAND: + switch (LOWORD(wParam)) { + case IDOK: { + 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_APPEND) == 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; + } + case IDCANCEL: + EndDialog(Dialog, IDCANCEL); + break; + case IDHELP: + 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); + + wchar_t fname[MAX_PATH]; + GetDlgItemTextW(Dialog, IDC_FOPT_FILENAME_EDIT, fname, _countof(fname)); + + wchar_t FNFilter[128*3]; + get_lang_msgW("FILEDLG_ALL_FILTER", FNFilter, sizeof(FNFilter), L"All(*.*)\\0*.*\\0\\0", UILanguageFile); + + 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); + + OPENFILENAMEW ofn = {}; + ofn.lStructSize = get_OPENFILENAME_SIZEW(); + //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 = _countof(fname); + ofn.lpstrTitle = caption; + BOOL Ok = GetSaveFileNameW(&ofn); + if (Ok) { + SetDlgItemTextW(Dialog, IDC_FOPT_FILENAME_EDIT, fname); + } + + /* restore dir */ + _SetCurrentDirectoryW(curdir); + + 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); + break; + case IDC_FOPTTEXT: + 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: + if (IsDlgButtonChecked(Dialog, IDC_TIMESTAMP) == BST_CHECKED) { + EnableDlgItem(Dialog, IDC_TIMESTAMPTYPE, IDC_TIMESTAMPTYPE); + } + else { + DisableDlgItem(Dialog, IDC_TIMESTAMPTYPE, IDC_TIMESTAMPTYPE); + } + break; + case IDC_FOPT_FILENAME_EDIT: + if (HIWORD(wParam) == EN_CHANGE){ + 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: { + // \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'; + 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); + DragFinish(hDrop); + return TRUE; + } + } + return FALSE; +} + +static BOOL LogStart(void) +{ + unsigned tid; + + if ((FileLog) || (BinLog)) return FALSE; + + assert(LogVar != NULL); + + 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; + FileLog = FALSE; + if (! CreateBinBuf()) + { + FileTransEnd_(OpLog); + return FALSE; + } + } + else { + BinLog = FALSE; + FileLog = TRUE; + if (! CreateLogBuf()) + { + FileTransEnd_(OpLog); + return FALSE; + } + } + cv.LStart = cv.LogPtr; + cv.LCount = 0; + if (ts.LogHideDialog) + LogVar->HideDialog = 1; + + /* 2007.05.24 Gentaro */ + eLineEnd = Line_LineHead; + + if (ts.Append > 0) + { + int dwShareMode = FILE_SHARE_READ; + if (!ts.LogLockExclusive) { + dwShareMode = FILE_SHARE_READ | FILE_SHARE_WRITE; + } + LogVar->FileHandle = CreateFile(LogVar->FullName, GENERIC_WRITE, dwShareMode, NULL, + OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); + if (LogVar->FileHandle != INVALID_HANDLE_VALUE){ + SetFilePointer(LogVar->FileHandle, 0, NULL, FILE_END); + /* 2007.05.24 Gentaro + If log file already exists, + a newline is inserted before the first timestamp. + */ + eLineEnd = Line_FileHead; + } + } + else { + int dwShareMode = FILE_SHARE_READ; + if (!ts.LogLockExclusive) { + dwShareMode = FILE_SHARE_READ | FILE_SHARE_WRITE; + } + LogVar->FileHandle = CreateFile(LogVar->FullName, GENERIC_WRITE, dwShareMode, NULL, + CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); + } + LogVar->FileOpen = (LogVar->FileHandle != INVALID_HANDLE_VALUE); + if (! LogVar->FileOpen) + { + char msg[128]; + + // \x83t\x83@\x83C\x83\x8B\x83I\x81[\x83v\x83\x93\x83G\x83\x89\x81[\x8E\x9E\x82̃\x81\x83b\x83Z\x81[\x83W\x95\\x8E\xA6\x82\xF0\x92lj\xC1\x82\xB5\x82\xBD\x81B(2008.7.9 yutaka) + if (LogVar->NoMsg == FALSE) { + _snprintf_s(msg, sizeof(msg), _TRUNCATE, "Can not create a `%s' file. (%d)", LogVar->FullName, GetLastError()); + MessageBox(NULL, msg, "Tera Term: File open error", MB_OK | MB_ICONERROR); + } + + FileTransEnd_(OpLog); + return FALSE; + } + LogVar->ByteCount = 0; + + // Log rotate configuration + LogVar->RotateMode = ts.LogRotate; + LogVar->RotateSize = ts.LogRotateSize; + LogVar->RotateStep = ts.LogRotateStep; + + // Log rotate\x82\xAA\x97L\x8C\xF8\x82̏ꍇ\x81A\x8F\x89\x8A\xFA\x83t\x83@\x83C\x83\x8B\x83T\x83C\x83Y\x82\xF0\x90ݒ肷\x82\xE9\x81B + // \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) { + DWORD size = GetFileSize(LogVar->FileHandle, NULL); + if (size != -1) + LogVar->ByteCount = size; + } + + if (! OpenFTDlg_(LogVar)) { + FileTransEnd_(OpLog); + return FALSE; + } + + // \x92x\x89\x84\x8F\x91\x82\xAB\x8D\x9E\x82ݗp\x83X\x83\x8C\x83b\x83h\x82\xF0\x8BN\x82\xB1\x82\xB7\x81B + // (2013.4.19 yutaka) + // DeferredLogWriteThread \x83X\x83\x8C\x83b\x83h\x82\xAA\x8BN\x8F\xB0\x82\xB5\x82āA\x83X\x83\x8C\x83b\x83h\x83L\x83\x85\x81[\x82\xAA\x8D쐬\x82\xB3\x82\xEA\x82\xE9\x82\xE6\x82\xE8\x91O\x82ɁA + // \x83\x8D\x83O\x83t\x83@\x83C\x83\x8B\x82̃N\x83\x8D\x81[\x83Y(CloseFileSync)\x82\xAA\x8Ds\x82\xED\x82\xEA\x82\xE9\x82ƁA\x83G\x83\x93\x83L\x83\x85\x81[\x82\xAA\x8E\xB8\x94s\x82\xB5\x81A\x83f\x83b\x83h\x83\x8D\x83b\x83N + // \x82\xB7\x82\xE9\x82Ƃ\xA2\x82\xA4\x96\xE2\x91\xE8\x82\xF0\x8FC\x90\xB3\x82\xB5\x82\xBD\x81B + // \x83X\x83\x8C\x83b\x83h\x8AԂ̓\xAF\x8A\xFA\x82\xF0\x8Ds\x82\xA4\x82\xBD\x82߁A\x96\xBC\x91O\x82Ȃ\xB5\x83C\x83x\x83\x93\x83g\x83I\x83u\x83W\x83F\x83N\x83g\x82\xF0\x8Eg\x82\xC1\x82āA\x83X\x83\x8C\x83b\x83h\x83L\x83\x85\x81[\x82\xCC + // \x8D쐬\x82܂ő҂\xBF\x8D\x87\x82킹\x82\xB7\x82\xE9\x82悤\x82ɂ\xB5\x82\xBD\x81B\x96\xBC\x91O\x95t\x82\xAB\x83C\x83x\x83\x93\x83g\x83I\x83u\x83W\x83F\x83N\x83g\x82\xF0\x8Eg\x82\xA4\x8Fꍇ\x82́A + // \x83V\x83X\x83e\x83\x80(Windows OS)\x8F\xE3\x82Ń\x86\x83j\x81[\x83N\x82Ȗ\xBC\x91O\x82ɂ\xB7\x82\xE9\x95K\x97v\x82\xAA\x82\xA0\x82\xE9\x81B + // (2016.9.23 yutaka) + LogVar->LogThreadEvent = CreateEvent(NULL, TRUE, FALSE, NULL); + LogVar->LogThread = (HANDLE)_beginthreadex(NULL, 0, DeferredLogWriteThread, LogVar, 0, &tid); + LogVar->LogThreadId = tid; + if (LogVar->LogThreadEvent != NULL) { + WaitForSingleObject(LogVar->LogThreadEvent, INFINITE); + CloseHandle(LogVar->LogThreadEvent); + } + + // \x8C\xBB\x8D݃o\x83b\x83t\x83@\x82ɂ\xA0\x82\xE9\x83f\x81[\x83^\x82\xF0\x82\xB7\x82ׂď\x91\x82\xAB\x8Fo\x82\xB5\x82Ă\xA9\x82\xE7\x81A + // \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)); + if (size == -1) + break; + +#if 0 + if (ts.DeferredLogWriteMode) { // \x92x\x89\x84\x8F\x91\x82\xAB\x8D\x9E\x82\xDD + char *pbuf = (char *)malloc(size + 2); + memcpy(pbuf, buf, size); + pbuf[size] = '\r'; + pbuf[size+1] = '\n'; + Sleep(1); // \x83X\x83\x8C\x83b\x83h\x83L\x83\x85\x81[\x82\xAA\x8D\xEC\x82\xE7\x82\xEA\x82\xE9\x82悤\x82ɁA\x83R\x83\x93\x83e\x83L\x83X\x83g\x83X\x83C\x83b\x83`\x82𑣂\xB7\x81B + PostThreadMessage(LogVar->LogThreadId, WM_DPC_LOGTHREAD_SEND, (WPARAM)pbuf, size + 2); + } else { // \x92\xBC\x8F\x91\x82\xAB\x81B\x83l\x83b\x83g\x83\x8F\x81[\x83N\x8Co\x97R\x82\xBE\x82ƒx\x82\xA2\x81B +#endif + WriteFile(LogVar->FileHandle, buf, size, &written_size, NULL); + WriteFile(LogVar->FileHandle, crlf, crlf_len, &written_size, NULL); +#if 0 + } +#endif + } + } + + return TRUE; +} + +void LogPut1(BYTE b) +{ + cv.LogBuf[cv.LogPtr] = b; + cv.LogPtr++; + if (cv.LogPtr>=InBuffSize) + cv.LogPtr = cv.LogPtr-InBuffSize; + + if (FileLog) + { + if (cv.LCount>=InBuffSize) + { + cv.LCount = InBuffSize; + cv.LStart = cv.LogPtr; + } + else + cv.LCount++; + } + else + cv.LCount = 0; +} + +static BOOL Get1(PCHAR Buf, int *Start, int *Count, PBYTE b) +{ + if (*Count<=0) return FALSE; + *b = Buf[*Start]; + (*Start)++; + if (*Start>=InBuffSize) + *Start = *Start-InBuffSize; + (*Count)--; + return TRUE; +} + + + +static CRITICAL_SECTION g_filelog_lock; /* \x83\x8D\x83b\x83N\x97p\x95ϐ\x94 */ + +void logfile_lock_initialize(void) +{ + InitializeCriticalSection(&g_filelog_lock); +} + +static inline void logfile_lock(void) +{ + EnterCriticalSection(&g_filelog_lock); +} + +static inline void logfile_unlock(void) +{ + LeaveCriticalSection(&g_filelog_lock); +} + + // \x83R\x83\x81\x83\x93\x83g\x82\xF0\x83\x8D\x83O\x82֒lj\xC1\x82\xB7\x82\xE9 +static void CommentLogToFile(char *buf, int size) +{ + DWORD wrote; + + if (LogVar == NULL || !LogVar->FileOpen) { + char uimsg[MAX_UIMSG]; + get_lang_msg("MSG_ERROR", uimsg, sizeof(uimsg), "ERROR", ts.UILanguageFile); + get_lang_msg("MSG_COMMENT_LOG_OPEN_ERROR", ts.UIMsg, sizeof(ts.UIMsg), + "It is not opened by the log file yet.", ts.UILanguageFile); + ::MessageBox(NULL, ts.UIMsg, uimsg, MB_OK|MB_ICONEXCLAMATION); + return; + } + + logfile_lock(); + WriteFile(LogVar->FileHandle, buf, size, &wrote, NULL); + WriteFile(LogVar->FileHandle, "\r\n", 2, &wrote, NULL); // \x89\xFC\x8Ds + /* Set Line End Flag + 2007.05.24 Gentaro + */ + eLineEnd = Line_LineHead; + logfile_unlock(); +} + +// \x83\x8D\x83O\x82\xF0\x83\x8D\x81[\x83e\x81[\x83g\x82\xB7\x82\xE9\x81B +// (2013.3.21 yutaka) +static void LogRotate(void) +{ + int loopmax = 10000; // XXX + char filename[1024]; + char newfile[1024], oldfile[1024]; + int i, k; + int dwShareMode = FILE_SHARE_READ; + unsigned tid; + + if (! LogVar->FileOpen) return; + + if (LogVar->RotateMode == ROTATE_NONE) + return; + + if (LogVar->RotateMode == ROTATE_SIZE) { + if (LogVar->ByteCount <= LogVar->RotateSize) + return; + //OutputDebugPrintf("%s: mode %d size %ld\n", __FUNCTION__, LogVar->RotateMode, LogVar->ByteCount); + } else { + return; + } + + logfile_lock(); + // \x83\x8D\x83O\x83T\x83C\x83Y\x82\xF0\x8Dď\x89\x8A\x{227B0B7}\x82\xE9\x81B + LogVar->ByteCount = 0; + + // \x82\xA2\x82\xC1\x82\xBD\x82̃t\x83@\x83C\x83\x8B\x82\xF0\x83N\x83\x8D\x81[\x83Y\x82\xB5\x82āA\x95ʖ\xBC\x82̃t\x83@\x83C\x83\x8B\x82\xF0\x83I\x81[\x83v\x83\x93\x82\xB7\x82\xE9\x81B + CloseFileSync(LogVar); + //_lclose(LogVar->FileHandle); + + // \x90\xA2\x91ネ\x81[\x83e\x81[\x83V\x83\x87\x83\x93\x82̃X\x83e\x83b\x83v\x90\x94\x82̎w\x92肪\x82\xA0\x82邩 + if (LogVar->RotateStep > 0) + loopmax = LogVar->RotateStep; + + for (i = 1 ; i <= loopmax ; i++) { + _snprintf_s(filename, sizeof(filename), _TRUNCATE, "%s.%d", LogVar->FullName, i); + if (_access_s(filename, 0) != 0) + break; + } + if (i > loopmax) { + // \x90\xA2\x91オ\x82\xA2\x82\xC1\x82ς\xA2\x82ɂȂ\xC1\x82\xBD\x82\xE7\x81A\x8DŌẪt\x83@\x83C\x83\x8B\x82\xA9\x82\xE7\x94p\x8A\xFC\x82\xB7\x82\xE9\x81B + i = loopmax; + } + + // \x95ʃt\x83@\x83C\x83\x8B\x82Ƀ\x8A\x83l\x81[\x83\x80\x81B + for (k = i-1 ; k >= 0 ; k--) { + if (k == 0) + strncpy_s(oldfile, sizeof(oldfile), LogVar->FullName, _TRUNCATE); + else + _snprintf_s(oldfile, sizeof(oldfile), _TRUNCATE, "%s.%d", LogVar->FullName, k); + _snprintf_s(newfile, sizeof(newfile), _TRUNCATE, "%s.%d", LogVar->FullName, k+1); + remove(newfile); + if (rename(oldfile, newfile) != 0) { + OutputDebugPrintf("%s: rename %d\n", __FUNCTION__, errno); + } + } + + // \x8DăI\x81[\x83v\x83\x93 + if (!ts.LogLockExclusive) { + dwShareMode = FILE_SHARE_READ | FILE_SHARE_WRITE; + } + LogVar->FileHandle = CreateFile(LogVar->FullName, GENERIC_WRITE, dwShareMode, NULL, + CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); + + // \x92x\x89\x84\x8F\x91\x82\xAB\x8D\x9E\x82ݗp\x83X\x83\x8C\x83b\x83h\x82\xF0\x8BN\x82\xB1\x82\xB7\x81B + // (2013.4.19 yutaka) + // DeferredLogWriteThread \x83X\x83\x8C\x83b\x83h\x82\xAA\x8BN\x8F\xB0\x82\xB5\x82āA\x83X\x83\x8C\x83b\x83h\x83L\x83\x85\x81[\x82\xAA\x8D쐬\x82\xB3\x82\xEA\x82\xE9\x82\xE6\x82\xE8\x91O\x82ɁA + // \x83\x8D\x83O\x83t\x83@\x83C\x83\x8B\x82̃N\x83\x8D\x81[\x83Y(CloseFileSync)\x82\xAA\x8Ds\x82\xED\x82\xEA\x82\xE9\x82ƁA\x83G\x83\x93\x83L\x83\x85\x81[\x82\xAA\x8E\xB8\x94s\x82\xB5\x81A\x83f\x83b\x83h\x83\x8D\x83b\x83N + // \x82\xB7\x82\xE9\x82Ƃ\xA2\x82\xA4\x96\xE2\x91\xE8\x82\xF0\x8FC\x90\xB3\x82\xB5\x82\xBD\x81B + // \x83X\x83\x8C\x83b\x83h\x8AԂ̓\xAF\x8A\xFA\x82\xF0\x8Ds\x82\xA4\x82\xBD\x82߁A\x96\xBC\x91O\x82Ȃ\xB5\x83C\x83x\x83\x93\x83g\x83I\x83u\x83W\x83F\x83N\x83g\x82\xF0\x8Eg\x82\xC1\x82āA\x83X\x83\x8C\x83b\x83h\x83L\x83\x85\x81[\x82\xCC + // \x8D쐬\x82܂ő҂\xBF\x8D\x87\x82킹\x82\xB7\x82\xE9\x82悤\x82ɂ\xB5\x82\xBD\x81B\x96\xBC\x91O\x95t\x82\xAB\x83C\x83x\x83\x93\x83g\x83I\x83u\x83W\x83F\x83N\x83g\x82\xF0\x8Eg\x82\xA4\x8Fꍇ\x82́A + // \x83V\x83X\x83e\x83\x80(Windows OS)\x8F\xE3\x82Ń\x86\x83j\x81[\x83N\x82Ȗ\xBC\x91O\x82ɂ\xB7\x82\xE9\x95K\x97v\x82\xAA\x82\xA0\x82\xE9\x81B + // (2016.9.26 yutaka) + LogVar->LogThreadEvent = CreateEvent(NULL, TRUE, FALSE, NULL); + LogVar->LogThread = (HANDLE)_beginthreadex(NULL, 0, DeferredLogWriteThread, LogVar, 0, &tid); + LogVar->LogThreadId = tid; + if (LogVar->LogThreadEvent != NULL) { + WaitForSingleObject(LogVar->LogThreadEvent, INFINITE); + CloseHandle(LogVar->LogThreadEvent); + } + + logfile_unlock(); + +} + +void LogToFile(void) +{ + PCHAR Buf; + int Start, Count; + BYTE b; + PCHAR WriteBuf; + DWORD WriteBufMax, WriteBufLen; + CHAR tmp[128]; + DWORD wrote; + + if (! LogVar->FileOpen) return; + if (FileLog) + { + Buf = cv.LogBuf; + Start = cv.LStart; + Count = cv.LCount; + } + else if (BinLog) + { + Buf = cv.BinBuf; + Start = cv.BStart; + Count = cv.BCount; + } + else + return; + + if (Buf==NULL) return; + if (Count==0) return; + + // \x83\x8D\x83b\x83N\x82\xF0\x8E\xE6\x82\xE9(2004.8.6 yutaka) + logfile_lock(); + + if (ts.DeferredLogWriteMode) { + WriteBufMax = 8192; + WriteBufLen = 0; + WriteBuf = (PCHAR)malloc(WriteBufMax); + while (Get1(Buf,&Start,&Count,&b)) { + if (!FLogIsPause() && (! cv.ProtoFlag)) + { + tmp[0] = 0; + if ( ts.LogTimestamp && eLineEnd ) { + char *strtime = NULL; + + switch (ts.LogTimestampType) { + case TIMESTAMP_LOCAL: + strtime = mctimelocal(ts.LogTimestampFormat, FALSE); + break; + case TIMESTAMP_UTC: + strtime = mctimelocal(ts.LogTimestampFormat, TRUE); + break; + case TIMESTAMP_ELAPSED_LOGSTART: + strtime = strelapsed(LogVar->StartTime); + break; + case TIMESTAMP_ELAPSED_CONNECTED: + strtime = strelapsed(cv.ConnectedTime); + break; + } + + /* 2007.05.24 Gentaro */ + if( eLineEnd == Line_FileHead ){ + strncat_s(tmp, sizeof(tmp), "\r\n", _TRUNCATE); + } + strncat_s(tmp, sizeof(tmp), "[", _TRUNCATE); + strncat_s(tmp, sizeof(tmp), strtime, _TRUNCATE); + strncat_s(tmp, sizeof(tmp), "] ", _TRUNCATE); + } + + /* 2007.05.24 Gentaro */ + if( b == 0x0a ){ + eLineEnd = Line_LineHead; /* set endmark*/ + } + else { + eLineEnd = Line_Other; /* clear endmark*/ + } + + if (WriteBufLen >= (WriteBufMax*4/5)) { + WriteBufMax *= 2; + WriteBuf = (PCHAR)realloc(WriteBuf, WriteBufMax); + } + memcpy(&WriteBuf[WriteBufLen], tmp, strlen(tmp)); + WriteBufLen += strlen(tmp); + WriteBuf[WriteBufLen++] = b; + + (LogVar->ByteCount)++; + } + } + + PostThreadMessage(LogVar->LogThreadId, WM_DPC_LOGTHREAD_SEND, (WPARAM)WriteBuf, WriteBufLen); + + } else { + + while (Get1(Buf,&Start,&Count,&b)) + { + if (!FLogIsPause() && (! cv.ProtoFlag)) + { + if ( ts.LogTimestamp && eLineEnd ) { + char *strtime = NULL; + + switch (ts.LogTimestampType) { + case TIMESTAMP_LOCAL: + strtime = mctimelocal(ts.LogTimestampFormat, FALSE); + break; + case TIMESTAMP_UTC: + strtime = mctimelocal(ts.LogTimestampFormat, TRUE); + break; + case TIMESTAMP_ELAPSED_LOGSTART: + strtime = strelapsed(LogVar->StartTime); + break; + case TIMESTAMP_ELAPSED_CONNECTED: + strtime = strelapsed(cv.ConnectedTime); + break; + } + WriteFile(LogVar->FileHandle, "[", 1, &wrote, NULL); + WriteFile(LogVar->FileHandle, strtime, strlen(strtime), &wrote, NULL); + WriteFile(LogVar->FileHandle, "] ", 2, &wrote, NULL); + } + + /* 2007.05.24 Gentaro */ + if( b == 0x0a ){ + eLineEnd = Line_LineHead; /* set endmark*/ + } + else { + eLineEnd = Line_Other; /* clear endmark*/ + } + + WriteFile(LogVar->FileHandle, (PCHAR)&b, 1, &wrote, NULL); + (LogVar->ByteCount)++; + } + } + + } + + logfile_unlock(); + + if (FileLog) + { + cv.LStart = Start; + cv.LCount = Count; + } + else { + cv.BStart = Start; + cv.BCount = Count; + } + if (FLogIsPause() || cv.ProtoFlag) return; + if (FLogDlg!=NULL) + FLogDlg->RefreshNum(); + + // \x83\x8D\x83O\x81E\x83\x8D\x81[\x83e\x81[\x83g + LogRotate(); + +} + +BOOL CreateLogBuf(void) +{ + if (cv.HLogBuf==NULL) + { + cv.HLogBuf = GlobalAlloc(GMEM_MOVEABLE,InBuffSize); + cv.LogBuf = NULL; + cv.LogPtr = 0; + cv.LStart = 0; + cv.LCount = 0; + } + return (cv.HLogBuf!=NULL); +} + +void FreeLogBuf(void) +{ + if ((cv.HLogBuf==NULL) || FileLog) + return; + if (cv.LogBuf!=NULL) + GlobalUnlock(cv.HLogBuf); + GlobalFree(cv.HLogBuf); + cv.HLogBuf = NULL; + cv.LogBuf = NULL; + cv.LogPtr = 0; + cv.LStart = 0; + cv.LCount = 0; +} + +BOOL CreateBinBuf(void) +{ + if (cv.HBinBuf==NULL) + { + cv.HBinBuf = GlobalAlloc(GMEM_MOVEABLE,InBuffSize); + cv.BinBuf = NULL; + cv.BinPtr = 0; + cv.BStart = 0; + cv.BCount = 0; + } + return (cv.HBinBuf!=NULL); +} + +void FreeBinBuf(void) +{ + if ((cv.HBinBuf==NULL) || BinLog) + return; + if (cv.BinBuf!=NULL) + GlobalUnlock(cv.HBinBuf); + GlobalFree(cv.HBinBuf); + cv.HBinBuf = NULL; + cv.BinBuf = NULL; + cv.BinPtr = 0; + cv.BStart = 0; + cv.BCount = 0; +} + +static void FileTransEnd_(WORD OpId) +/* OpId = 0: close Log and FileSend + OpLog: close Log + OpSendFile: close FileSend */ +{ + if (((OpId==0) || (OpId==OpLog)) && (FileLog || BinLog)) + { + FileLog = FALSE; + BinLog = FALSE; + if (FLogDlg!=NULL) + { + FLogDlg->DestroyWindow(); + FLogDlg = NULL; + } + FreeFileVar_(&LogVar); + FreeLogBuf(); + FreeBinBuf(); + FreeTTFILE(); + } + +#if 0 + if (((OpId==0) || (OpId==OpSendFile)) && FSend) + { + FSend = FALSE; + TalkStatus = IdTalkKeyb; + if (SendDlg!=NULL) + { + SendDlg->DestroyWindow(); + SendDlg = NULL; + } + FreeFileVar_(&SendVar); + FreeTTFILE(); + } +#endif + +// EndDdeCmnd(0); +} + + +/** + * \x83\x8D\x83O\x82\xF0\x83|\x81[\x83Y\x82\xB7\x82\xE9 + * \x8C\xB3\x82\xCD FLogChangeButton() \x82\xBE\x82\xC1\x82\xBD + */ +void FLogPause(BOOL Pause) +{ + if (FLogDlg!=NULL) + FLogDlg->ChangeButton(Pause); + FileTransPause(OpLog, Pause); +} + +/** + * \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\x82A\x83\x8D\x81[\x83e\x81[\x83V\x83\x87\x83\x93\x82\xB7\x82\xE9\x82悤\x90ݒ肷\x82\xE9 + */ +void FLogRotateSize(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 FLogRotateRotate(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 FLogRotateHalt(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 FLogAddCommentDlg(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 FLogClose(void) +{ + if (LogVar != NULL) + FileTransEnd_(OpLog); +} + +BOOL FLogOpen(const char *fname) +{ + BOOL ret; + + if (LogVar != NULL) { + return FALSE; + } + + LogVar->DirLen = 0; + LogVar->NoMsg = TRUE; + strncpy_s(LogVar->FullName, sizeof(LogVar->FullName), fname, _TRUNCATE); + ret = LogStart(); + return ret; +} + +BOOL FLogIsOpend(void) +{ + // LogVar->FileOpen + return LogVar != NULL; +} + +void FLogWriteStr(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; + if (FLogDlg!=NULL) + FLogDlg->RefreshNum(); + } +} + +void FLogInfo(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 *FLogGetFilename() +{ + if (LogVar == NULL) { + return NULL; + } + return LogVar->FullName; +} + +/** + * \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ꂽ + */ +BOOL FLogOpenDialog(HINSTANCE hInst, HWND hWnd, FLogDlgInfo_t *info) +{ + 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), + hWnd, LogFnHook, (LPARAM)work); + free(srcfnameW); + free(work); + 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 *FLogGetLogFilename(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); +} + +BOOL FLogIsPause() +{ + return ((cv.FilePause & OpLog) !=0); +} + +void FLogWindow(int nCmdShow) +{ + if (FLogDlg == NULL) + return; + + HWND HWndLog = FLogDlg->m_hWnd; + ShowWindow(HWndLog, nCmdShow); + if (nCmdShow == SW_RESTORE) { + // \x8Ag\x92\xA3\x83X\x83^\x83C\x83\x8B WS_EX_NOACTIVATE \x8F\xF3\x91Ԃ\xF0\x89\xF0\x8F\x9C\x82\xB7\x82\xE9 + SetForegroundWindow(HWndLog); + } +} + +void FLogShowDlg(void) +{ + ShowFTDlg(OpLog); +} Modified: trunk/teraterm/teraterm/ttermpro.v16.vcxproj =================================================================== --- trunk/teraterm/teraterm/ttermpro.v16.vcxproj 2020-08-18 15:10:13 UTC (rev 8893) +++ trunk/teraterm/teraterm/ttermpro.v16.vcxproj 2020-08-18 15:27:29 UTC (rev 8894) @@ -145,6 +145,7 @@ <ClCompile Include="commlib.c" /> <ClCompile Include="dnddlg.cpp" /> <ClCompile Include="filesys.cpp" /> + <ClCompile Include="filesys_log.cpp" /> <ClCompile Include="font_pp.cpp" /> <ClCompile Include="ftdlg.cpp" /> <ClCompile Include="keyboard.c" /> Modified: trunk/teraterm/teraterm/ttermpro.v16.vcxproj.filters =================================================================== --- trunk/teraterm/teraterm/ttermpro.v16.vcxproj.filters 2020-08-18 15:10:13 UTC (rev 8893) +++ trunk/teraterm/teraterm/ttermpro.v16.vcxproj.filters 2020-08-18 15:27:29 UTC (rev 8894) @@ -147,6 +147,9 @@ <ClCompile Include="broadcast.cpp"> <Filter>Source Files</Filter> </ClCompile> + <ClCompile Include="filesys_log.cpp"> + <Filter>Source Files</Filter> + </ClCompile> </ItemGroup> <ItemGroup> <Image Include="..\..\cygterm\cygterm.ico"> Modified: trunk/teraterm/teraterm/ttermpro.v8.vcproj =================================================================== --- trunk/teraterm/teraterm/ttermpro.v8.vcproj 2020-08-18 15:10:13 UTC (rev 8893) +++ trunk/teraterm/teraterm/ttermpro.v8.vcproj 2020-08-18 15:27:29 UTC (rev 8894) @@ -217,6 +217,10 @@ > </File> <File + RelativePath=".\filesys_log.cpp" + > + </File> + <File RelativePath="..\susie_plugin\libsusieplugin.cpp" > </File>