Develop and Download Open Source Software

Browse Subversion Repository

Diff of /trunk/teraterm/teraterm/filesys_log.cpp

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 8897 by zmatsuo, Tue Aug 18 15:27:54 2020 UTC revision 8899 by zmatsuo, Tue Aug 18 15:29:19 2020 UTC
# Line 50  Line 50 
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
# Line 116  static PFileTransDlg FLogDlg = NULL; Line 111  static PFileTransDlg FLogDlg = NULL;
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  /**  /**
# Line 652  static INT_PTR CALLBACK LogFnHook(HWND D Line 638  static INT_PTR CALLBACK LogFnHook(HWND D
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    
# Line 702  static BOOL LogStart(const char *fname) Line 690  static BOOL LogStart(const char *fname)
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
# Line 718  static BOOL LogStart(const char *fname) Line 706  static BOOL LogStart(const char *fname)
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          }          }
# Line 756  static BOOL LogStart(const char *fname) Line 736  static BOOL LogStart(const char *fname)
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 スレッドが起床して、スレッドキューが作成されるより前に、
# Line 901  static void CommentLogToFile(char *buf, Line 884  static void CommentLogToFile(char *buf,
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;
# Line 933  static void LogRotate(void) Line 914  static void LogRotate(void)
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) {
# Line 944  static void LogRotate(void) Line 928  static void LogRotate(void)
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)
# Line 1131  static void LogToFile(void) Line 1119  static void LogToFile(void)
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    
# Line 1209  static void FileTransEnd_(void) Line 1196  static void FileTransEnd_(void)
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          }          }
# Line 1224  static void FileTransEnd_(void) Line 1213  static void FileTransEnd_(void)
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);
# Line 1334  void FLogClose(void) Line 1326  void FLogClose(void)
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    
# Line 1353  BOOL FLogOpen(const char *fname) Line 1345  BOOL FLogOpen(const char *fname)
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;
# Line 1380  void FLogWriteStr(const char *str) Line 1366  void FLogWriteStr(const char *str)
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  }  }
# Line 1394  void FLogInfo(char *param_ptr, size_t pa Line 1379  void FLogInfo(char *param_ptr, size_t pa
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;
# Line 1405  void FLogInfo(char *param_ptr, size_t pa Line 1392  void FLogInfo(char *param_ptr, size_t pa
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;
# Line 1423  const char *FLogGetFilename() Line 1410  const char *FLogGetFilename()
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;
# Line 1452  BOOL FLogOpenDialog(HINSTANCE hInst, HWN Line 1435  BOOL FLogOpenDialog(HINSTANCE hInst, HWN
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          }          }
# Line 1474  char *FLogGetLogFilename(const char *log Line 1457  char *FLogGetLogFilename(const char *log
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          // フルパス化          // フルパス化
# Line 1483  char *FLogGetLogFilename(const char *log Line 1468  char *FLogGetLogFilename(const char *log
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()

Legend:
Removed from v.8897  
changed lines
  Added in v.8899

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26