| 50 |
#include "layer_for_unicode.h" |
#include "layer_for_unicode.h" |
| 51 |
#include "layer_for_unicode_crt.h" |
#include "layer_for_unicode_crt.h" |
| 52 |
#include "codeconv.h" |
#include "codeconv.h" |
| 53 |
|
#include "asprintf.h" |
| 54 |
|
|
| 55 |
#include "filesys_log_res.h" |
#include "filesys_log_res.h" |
| 56 |
#include "filesys.h" |
#include "filesys.h" |
| 57 |
|
|
| 58 |
typedef struct { |
typedef struct { |
| 59 |
char FullName[MAX_PATH]; |
wchar_t *FullName; |
| 60 |
int DirLen; |
wchar_t *FileName; |
| 61 |
|
|
| 62 |
BOOL FileOpen; |
BOOL FileOpen; |
| 63 |
HANDLE FileHandle; |
HANDLE FileHandle; |
| 64 |
LONG FileSize, ByteCount; |
LONG FileSize, ByteCount; |
| 65 |
BOOL OverWrite; |
BOOL OverWrite; |
| 66 |
|
|
|
BOOL Success; |
|
|
BOOL NoMsg; |
|
|
|
|
|
char LogDefaultPath[MAX_PATH]; |
|
|
BOOL HideDialog; |
|
|
|
|
| 67 |
DWORD StartTime; |
DWORD StartTime; |
| 68 |
|
|
| 69 |
// log rotate |
// log rotate |
| 111 |
|
|
| 112 |
static BOOL OpenFTDlg_(PFileVar fv) |
static BOOL OpenFTDlg_(PFileVar fv) |
| 113 |
{ |
{ |
| 114 |
PFileTransDlg FTDlg; |
PFileTransDlg FTDlg = new CFileTransDlg(); |
| 115 |
|
if (FTDlg == NULL) { |
| 116 |
FTDlg = new CFileTransDlg(); |
return FALSE; |
|
|
|
|
fv->StartTime = 0; |
|
|
cv.FilePause &= ~OpLog; |
|
|
|
|
|
if (ts.LogHideDialog) |
|
|
fv->HideDialog = TRUE; |
|
|
|
|
|
if (FTDlg!=NULL) |
|
|
{ |
|
|
char DlgCaption[40]; |
|
|
strncpy_s(DlgCaption, _countof(DlgCaption),"Tera Term: ", _TRUNCATE); |
|
|
char uimsg[MAX_UIMSG]; |
|
|
get_lang_msg("FILEDLG_TRANS_TITLE_LOG", uimsg, sizeof(uimsg), TitLog, ts.UILanguageFile); |
|
|
strncat_s(DlgCaption, _countof(DlgCaption), uimsg, _TRUNCATE); |
|
|
|
|
|
CFileTransDlgInfo info; |
|
|
info.UILanguageFile = ts.UILanguageFile; |
|
|
info.OpId = OpLog; |
|
|
info.DlgCaption = DlgCaption; |
|
|
info.FileName = &fv->FullName[fv->DirLen]; |
|
|
info.FullName = fv->FullName; |
|
|
info.HideDialog = fv->HideDialog; |
|
|
info.HMainWin = HVTWin; |
|
|
FTDlg->Create(hInst, &info); |
|
|
FTDlg->RefreshNum(fv->StartTime, fv->FileSize, fv->ByteCount); |
|
| 117 |
} |
} |
| 118 |
|
|
| 119 |
FLogDlg = FTDlg; /* Log */ |
wchar_t *DlgCaption; |
| 120 |
|
wchar_t uimsg[MAX_UIMSG]; |
| 121 |
|
#define TitLogW L"Log" |
| 122 |
|
get_lang_msgW("FILEDLG_TRANS_TITLE_LOG", uimsg, _countof(uimsg), TitLogW, ts.UILanguageFile); |
| 123 |
|
aswprintf(&DlgCaption, L"Tera Term: %s", uimsg); |
| 124 |
|
|
| 125 |
|
CFileTransDlgInfo info; |
| 126 |
|
info.UILanguageFile = ts.UILanguageFile; |
| 127 |
|
info.OpId = OpLog; |
| 128 |
|
info.DlgCaption = DlgCaption; |
| 129 |
|
info.FileName = fv->FileName; |
| 130 |
|
info.FullName = fv->FullName; |
| 131 |
|
info.HideDialog = ts.LogHideDialog ? TRUE : FALSE; |
| 132 |
|
info.HMainWin = HVTWin; |
| 133 |
|
FTDlg->Create(hInst, &info); |
| 134 |
|
FTDlg->RefreshNum(0, fv->FileSize, fv->ByteCount); |
| 135 |
|
|
| 136 |
fv->StartTime = GetTickCount(); |
FLogDlg = FTDlg; |
| 137 |
|
|
| 138 |
return (FTDlg!=NULL); |
free(DlgCaption); |
| 139 |
|
return TRUE; |
| 140 |
} |
} |
| 141 |
|
|
| 142 |
/** |
/** |
| 638 |
return FALSE; |
return FALSE; |
| 639 |
} |
} |
| 640 |
|
|
| 641 |
static BOOL LogStart(const char *fname) |
static BOOL LogStart(const wchar_t *fname) |
| 642 |
{ |
{ |
| 643 |
unsigned tid; |
unsigned tid; |
| 644 |
|
|
| 645 |
strncpy_s(LogVar->FullName, sizeof(LogVar->FullName), fname, _TRUNCATE); |
LogVar->FullName = _wcsdup(fname); |
| 646 |
|
|
| 647 |
if (! LoadTTFILE()) return FALSE; |
if (! LoadTTFILE()) return FALSE; |
| 648 |
|
|
| 649 |
//(*SetFileVar)(LogVar); |
PFileVar fv = LogVar; |
| 650 |
{ |
wchar_t *p = wcsrchr(fv->FullName, L'\\'); |
| 651 |
int i; |
if (p == NULL) { |
| 652 |
char c; |
p = wcsrchr(fv->FullName, L'/'); |
| 653 |
PFileVar fv = LogVar; |
} |
| 654 |
GetFileNamePos(fv->FullName,&(fv->DirLen),&i); |
if (p == NULL) { |
| 655 |
c = fv->FullName[fv->DirLen]; |
fv->FileName = _wcsdup(fv->FullName); |
| 656 |
if (c=='\\'||c=='/') fv->DirLen++; |
} |
| 657 |
|
else { |
| 658 |
|
fv->FileName = _wcsdup(p++); |
| 659 |
} |
} |
| 660 |
FixLogOption(); |
FixLogOption(); |
| 661 |
|
|
| 690 |
if (!ts.LogLockExclusive) { |
if (!ts.LogLockExclusive) { |
| 691 |
dwShareMode = FILE_SHARE_READ | FILE_SHARE_WRITE; |
dwShareMode = FILE_SHARE_READ | FILE_SHARE_WRITE; |
| 692 |
} |
} |
| 693 |
LogVar->FileHandle = CreateFile(LogVar->FullName, GENERIC_WRITE, dwShareMode, NULL, |
LogVar->FileHandle = _CreateFileW(LogVar->FullName, GENERIC_WRITE, dwShareMode, NULL, |
| 694 |
OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); |
OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); |
| 695 |
if (LogVar->FileHandle != INVALID_HANDLE_VALUE){ |
if (LogVar->FileHandle != INVALID_HANDLE_VALUE){ |
| 696 |
SetFilePointer(LogVar->FileHandle, 0, NULL, FILE_END); |
SetFilePointer(LogVar->FileHandle, 0, NULL, FILE_END); |
| 697 |
/* 2007.05.24 Gentaro |
/* 2007.05.24 Gentaro |
| 706 |
if (!ts.LogLockExclusive) { |
if (!ts.LogLockExclusive) { |
| 707 |
dwShareMode = FILE_SHARE_READ | FILE_SHARE_WRITE; |
dwShareMode = FILE_SHARE_READ | FILE_SHARE_WRITE; |
| 708 |
} |
} |
| 709 |
LogVar->FileHandle = CreateFile(LogVar->FullName, GENERIC_WRITE, dwShareMode, NULL, |
LogVar->FileHandle = _CreateFileW(LogVar->FullName, GENERIC_WRITE, dwShareMode, NULL, |
| 710 |
CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); |
CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); |
| 711 |
} |
} |
| 712 |
LogVar->FileOpen = (LogVar->FileHandle != INVALID_HANDLE_VALUE); |
LogVar->FileOpen = (LogVar->FileHandle != INVALID_HANDLE_VALUE); |
| 713 |
if (! LogVar->FileOpen) |
if (! LogVar->FileOpen) |
| 714 |
{ |
{ |
|
char msg[128]; |
|
|
|
|
|
// ファイルオープンエラー時のメッセージ表示を追加した。(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); |
|
|
} |
|
|
|
|
| 715 |
FileTransEnd_(); |
FileTransEnd_(); |
| 716 |
return FALSE; |
return FALSE; |
| 717 |
} |
} |
| 736 |
return FALSE; |
return FALSE; |
| 737 |
} |
} |
| 738 |
|
|
| 739 |
|
cv.FilePause &= ~OpLog; |
| 740 |
|
LogVar->StartTime = GetTickCount(); |
| 741 |
|
|
| 742 |
// 遅延書き込み用スレッドを起こす。 |
// 遅延書き込み用スレッドを起こす。 |
| 743 |
// (2013.4.19 yutaka) |
// (2013.4.19 yutaka) |
| 744 |
// DeferredLogWriteThread スレッドが起床して、スレッドキューが作成されるより前に、 |
// DeferredLogWriteThread スレッドが起床して、スレッドキューが作成されるより前に、 |
| 884 |
static void LogRotate(void) |
static void LogRotate(void) |
| 885 |
{ |
{ |
| 886 |
int loopmax = 10000; // XXX |
int loopmax = 10000; // XXX |
|
char filename[1024]; |
|
|
char newfile[1024], oldfile[1024]; |
|
| 887 |
int i, k; |
int i, k; |
| 888 |
int dwShareMode = FILE_SHARE_READ; |
int dwShareMode = FILE_SHARE_READ; |
| 889 |
unsigned tid; |
unsigned tid; |
| 914 |
loopmax = LogVar->RotateStep; |
loopmax = LogVar->RotateStep; |
| 915 |
|
|
| 916 |
for (i = 1 ; i <= loopmax ; i++) { |
for (i = 1 ; i <= loopmax ; i++) { |
| 917 |
_snprintf_s(filename, sizeof(filename), _TRUNCATE, "%s.%d", LogVar->FullName, i); |
wchar_t *filename; |
| 918 |
if (_access_s(filename, 0) != 0) |
aswprintf(&filename, L"%s.%d", LogVar->FullName, i); |
| 919 |
|
DWORD attr = _GetFileAttributesW(filename); |
| 920 |
|
free(filename); |
| 921 |
|
if ((attr != INVALID_FILE_ATTRIBUTES) && ((attr & FILE_ATTRIBUTE_DIRECTORY) == 0)) |
| 922 |
break; |
break; |
| 923 |
} |
} |
| 924 |
if (i > loopmax) { |
if (i > loopmax) { |
| 928 |
|
|
| 929 |
// 別ファイルにリネーム。 |
// 別ファイルにリネーム。 |
| 930 |
for (k = i-1 ; k >= 0 ; k--) { |
for (k = i-1 ; k >= 0 ; k--) { |
| 931 |
|
wchar_t *oldfile; |
| 932 |
if (k == 0) |
if (k == 0) |
| 933 |
strncpy_s(oldfile, sizeof(oldfile), LogVar->FullName, _TRUNCATE); |
oldfile = _wcsdup(LogVar->FullName); |
| 934 |
else |
else |
| 935 |
_snprintf_s(oldfile, sizeof(oldfile), _TRUNCATE, "%s.%d", LogVar->FullName, k); |
aswprintf(&oldfile, L"%s.%d", LogVar->FullName, k); |
| 936 |
_snprintf_s(newfile, sizeof(newfile), _TRUNCATE, "%s.%d", LogVar->FullName, k+1); |
wchar_t *newfile; |
| 937 |
remove(newfile); |
aswprintf(&newfile, L"%s.%d", LogVar->FullName, k+1); |
| 938 |
if (rename(oldfile, newfile) != 0) { |
_DeleteFileW(newfile); |
| 939 |
|
if (_MoveFileW(oldfile, newfile) == 0) { |
| 940 |
OutputDebugPrintf("%s: rename %d\n", __FUNCTION__, errno); |
OutputDebugPrintf("%s: rename %d\n", __FUNCTION__, errno); |
| 941 |
} |
} |
| 942 |
|
free(oldfile); |
| 943 |
|
free(newfile); |
| 944 |
} |
} |
| 945 |
|
|
| 946 |
// 再オープン |
// 再オープン |
| 947 |
if (!ts.LogLockExclusive) { |
if (!ts.LogLockExclusive) { |
| 948 |
dwShareMode = FILE_SHARE_READ | FILE_SHARE_WRITE; |
dwShareMode = FILE_SHARE_READ | FILE_SHARE_WRITE; |
| 949 |
} |
} |
| 950 |
LogVar->FileHandle = CreateFile(LogVar->FullName, GENERIC_WRITE, dwShareMode, NULL, |
LogVar->FileHandle = _CreateFileW(LogVar->FullName, GENERIC_WRITE, dwShareMode, NULL, |
| 951 |
CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); |
CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); |
| 952 |
|
|
| 953 |
// 遅延書き込み用スレッドを起こす。 |
// 遅延書き込み用スレッドを起こす。 |
| 954 |
// (2013.4.19 yutaka) |
// (2013.4.19 yutaka) |
| 1119 |
} |
} |
| 1120 |
if (FLogIsPause() || cv.ProtoFlag) return; |
if (FLogIsPause() || cv.ProtoFlag) return; |
| 1121 |
if (FLogDlg!=NULL) |
if (FLogDlg!=NULL) |
|
//FLogDlg->RefreshNum(LogVar); |
|
| 1122 |
FLogDlg->RefreshNum(LogVar->StartTime, LogVar->FileSize, LogVar->ByteCount); |
FLogDlg->RefreshNum(LogVar->StartTime, LogVar->FileSize, LogVar->ByteCount); |
| 1123 |
|
|
| 1124 |
|
|
| 1196 |
if (LogVar != NULL) |
if (LogVar != NULL) |
| 1197 |
{ |
{ |
| 1198 |
CloseFileSync(LogVar); |
CloseFileSync(LogVar); |
| 1199 |
|
free(LogVar->FullName); |
| 1200 |
|
free(LogVar->FileName); |
| 1201 |
free(LogVar); |
free(LogVar); |
| 1202 |
LogVar = NULL; |
LogVar = NULL; |
| 1203 |
} |
} |
| 1213 |
*/ |
*/ |
| 1214 |
void FLogPause(BOOL Pause) |
void FLogPause(BOOL Pause) |
| 1215 |
{ |
{ |
| 1216 |
|
if (LogVar == NULL) { |
| 1217 |
|
return; |
| 1218 |
|
} |
| 1219 |
if (FLogDlg!=NULL) |
if (FLogDlg!=NULL) |
| 1220 |
FLogDlg->ChangeButton(Pause); |
FLogDlg->ChangeButton(Pause); |
| 1221 |
FileTransPause(OpLog, Pause); |
FileTransPause(OpLog, Pause); |
| 1326 |
* FLogGetLogFilename() や FLogOpenDialog() で |
* FLogGetLogFilename() や FLogOpenDialog() で |
| 1327 |
* ファイル名を取得できる。 |
* ファイル名を取得できる。 |
| 1328 |
*/ |
*/ |
| 1329 |
BOOL FLogOpen(const char *fname) |
BOOL FLogOpen(const wchar_t *fname) |
| 1330 |
{ |
{ |
| 1331 |
BOOL ret; |
BOOL ret; |
| 1332 |
|
|
| 1345 |
|
|
| 1346 |
fv->FileOpen = FALSE; |
fv->FileOpen = FALSE; |
| 1347 |
fv->OverWrite = ((ts.FTFlag & FT_RENAME) == 0); |
fv->OverWrite = ((ts.FTFlag & FT_RENAME) == 0); |
|
fv->Success = FALSE; |
|
|
fv->NoMsg = FALSE; |
|
|
fv->HideDialog = FALSE; |
|
|
|
|
|
LogVar->DirLen = 0; |
|
|
LogVar->NoMsg = TRUE; |
|
| 1348 |
|
|
| 1349 |
ret = LogStart(fname); |
ret = LogStart(fname); |
| 1350 |
return ret; |
return ret; |
| 1366 |
LogVar->ByteCount = |
LogVar->ByteCount = |
| 1367 |
LogVar->ByteCount + len; |
LogVar->ByteCount + len; |
| 1368 |
if (FLogDlg!=NULL) |
if (FLogDlg!=NULL) |
|
//FLogDlg->RefreshNum(LogVar); |
|
| 1369 |
FLogDlg->RefreshNum(LogVar->StartTime, LogVar->FileSize, LogVar->ByteCount); |
FLogDlg->RefreshNum(LogVar->StartTime, LogVar->FileSize, LogVar->ByteCount); |
| 1370 |
} |
} |
| 1371 |
} |
} |
| 1379 |
+ ((ts.LogTypePlainText != 0) << 2) |
+ ((ts.LogTypePlainText != 0) << 2) |
| 1380 |
+ ((ts.LogTimestamp != 0) << 3) |
+ ((ts.LogTimestamp != 0) << 3) |
| 1381 |
+ ((ts.LogHideDialog != 0) << 4); |
+ ((ts.LogHideDialog != 0) << 4); |
| 1382 |
strncpy_s(param_ptr + 1, param_len - 1, LogVar->FullName, _TRUNCATE); |
char *filenameU8 = ToU8W(LogVar->FullName); |
| 1383 |
|
strncpy_s(param_ptr + 1, param_len - 1, filenameU8, _TRUNCATE); |
| 1384 |
|
free(filenameU8); |
| 1385 |
} |
} |
| 1386 |
else { |
else { |
| 1387 |
param_ptr[0] = '0' - 1; |
param_ptr[0] = '0' - 1; |
| 1392 |
/** |
/** |
| 1393 |
* 現在のログファイル名を取得 |
* 現在のログファイル名を取得 |
| 1394 |
*/ |
*/ |
| 1395 |
const char *FLogGetFilename() |
const wchar_t *FLogGetFilename(void) |
| 1396 |
{ |
{ |
| 1397 |
if (LogVar == NULL) { |
if (LogVar == NULL) { |
| 1398 |
return NULL; |
return NULL; |
| 1410 |
BOOL FLogOpenDialog(HINSTANCE hInst, HWND hWnd, FLogDlgInfo_t *info) |
BOOL FLogOpenDialog(HINSTANCE hInst, HWND hWnd, FLogDlgInfo_t *info) |
| 1411 |
{ |
{ |
| 1412 |
LogDlgWork_t *work = (LogDlgWork_t *)calloc(sizeof(LogDlgWork_t), 1); |
LogDlgWork_t *work = (LogDlgWork_t *)calloc(sizeof(LogDlgWork_t), 1); |
| 1413 |
char *filenameA = ToCharW(info->filename); |
wchar_t *srcfnameW = FLogGetLogFilename(info->filename); |
|
char *srcfnameA = FLogGetLogFilename(filenameA); |
|
|
wchar_t *srcfnameW = ToWcharA(srcfnameA); |
|
|
free(filenameA); |
|
|
free(srcfnameA); |
|
| 1414 |
work->info = info; |
work->info = info; |
| 1415 |
work->info->filename = srcfnameW; |
work->info->filename = srcfnameW; |
| 1416 |
work->pts = &ts; |
work->pts = &ts; |
| 1435 |
* @return フルパスファイル名 |
* @return フルパスファイル名 |
| 1436 |
* 不要になったら free() すること |
* 不要になったら free() すること |
| 1437 |
*/ |
*/ |
| 1438 |
char *FLogGetLogFilename(const char *log_filename) |
wchar_t *FLogGetLogFilename(const wchar_t *log_filename) |
| 1439 |
{ |
{ |
| 1440 |
// フォルダ |
// フォルダ |
| 1441 |
char FileDirExpanded[MAX_PATH]; |
char FileDirExpanded[MAX_PATH]; |
| 1442 |
char *logdir; |
const char *logdir; |
| 1443 |
if (strlen(ts.LogDefaultPath) > 0) { |
if (strlen(ts.LogDefaultPath) > 0) { |
| 1444 |
logdir = ts.LogDefaultPath; |
logdir = ts.LogDefaultPath; |
| 1445 |
} |
} |
| 1457 |
strncpy_s(base_name, _countof(base_name), ts.LogDefaultName, _TRUNCATE); |
strncpy_s(base_name, _countof(base_name), ts.LogDefaultName, _TRUNCATE); |
| 1458 |
} |
} |
| 1459 |
else { |
else { |
| 1460 |
strncpy_s(base_name, _countof(base_name), log_filename, _TRUNCATE); |
char *filenameA = ToCharW(log_filename); |
| 1461 |
|
strncpy_s(base_name, _countof(base_name), filenameA, _TRUNCATE); |
| 1462 |
|
free(filenameA); |
| 1463 |
} |
} |
| 1464 |
|
|
| 1465 |
// フルパス化 |
// フルパス化 |
| 1468 |
ParseStrftimeFileName(full_path, sizeof(full_path)); |
ParseStrftimeFileName(full_path, sizeof(full_path)); |
| 1469 |
ConvertLogname(full_path, sizeof(full_path)); |
ConvertLogname(full_path, sizeof(full_path)); |
| 1470 |
|
|
| 1471 |
return _strdup(full_path); |
return ToWcharA(full_path); |
| 1472 |
} |
} |
| 1473 |
|
|
| 1474 |
BOOL FLogIsPause() |
BOOL FLogIsPause() |