Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /trunk/teraterm/teraterm/filesys_log.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 10804 - (hide annotations) (download) (as text)
Sun Jul 23 07:07:16 2023 UTC (8 months, 2 weeks ago) by zmatsuo
File MIME type: text/x-c++src
File size: 27962 byte(s)
ログダイアログを logdlg.cpp,h に分離した

- teraterm/teraterm/logdlg.cpp,h 追加
1 doda 6806 /*
2 nmaya 9048 * (C) 2020- TeraTerm Project
3 doda 6806 * All rights reserved.
4     *
5 doda 6841 * Redistribution and use in source and binary forms, with or without
6     * modification, are permitted provided that the following conditions
7     * are met:
8 doda 6806 *
9 doda 6841 * 1. Redistributions of source code must retain the above copyright
10     * notice, this list of conditions and the following disclaimer.
11     * 2. Redistributions in binary form must reproduce the above copyright
12     * notice, this list of conditions and the following disclaimer in the
13     * documentation and/or other materials provided with the distribution.
14     * 3. The name of the author may not be used to endorse or promote products
15     * derived from this software without specific prior written permission.
16 doda 6806 *
17 doda 6841 * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR
18     * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19     * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20     * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT,
21     * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22     * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23     * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24     * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25     * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26     * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 doda 6806 */
28 maya 3227
29 zmatsuo 8897 /* TERATERM.EXE, log routines */
30 zmatsuo 7526 #include <stdio.h>
31 zmatsuo 8900 #if !defined(_CRTDBG_MAP_ALLOC)
32     #define _CRTDBG_MAP_ALLOC
33     #endif
34     #include <stdlib.h>
35     #include <crtdbg.h>
36 zmatsuo 7526 #include <process.h>
37 zmatsuo 8852 #include <windows.h>
38     #include <htmlhelp.h>
39     #include <assert.h>
40 zmatsuo 7526
41 maya 3227 #include "teraterm.h"
42     #include "tttypes.h"
43     #include "ftdlg.h"
44     #include "ttwinman.h"
45     #include "commlib.h"
46     #include "ttcommon.h"
47     #include "ttlib.h"
48     #include "dlglib.h"
49 doda 3904 #include "vtterm.h"
50 maya 3227 #include "ftlib.h"
51 yutakapon 5392 #include "buffer.h"
52 zmatsuo 8852 #include "helpid.h"
53 zmatsuo 8863 #include "codeconv.h"
54 zmatsuo 8899 #include "asprintf.h"
55 zmatsuo 9857 #include "win32helper.h"
56 yutakapon 5392
57 zmatsuo 8852 #include "filesys_log_res.h"
58 zmatsuo 8900 #include "filesys_log.h"
59 zmatsuo 9103 #include "filesys.h" // for ProtoGetProtoFlag()
60 zmatsuo 8866
61 zmatsuo 9104 #define TitLog L"Log"
62    
63 zmatsuo 8901 /*
64     Line Head flag for timestamping
65     2007.05.24 Gentaro
66     */
67     enum enumLineEnd {
68     Line_Other = 0,
69     Line_LineHead = 1,
70     Line_FileHead = 2,
71     };
72    
73 zmatsuo 8894 typedef struct {
74 zmatsuo 8901 wchar_t *FullName;
75 maya 3227
76 zmatsuo 8901 HANDLE FileHandle;
77     LONG FileSize, ByteCount;
78 maya 6071
79 zmatsuo 8901 DWORD StartTime;
80 maya 3227
81 zmatsuo 8901 enum enumLineEnd eLineEnd;
82 maya 7182
83 zmatsuo 8901 // log rotate
84     int RotateMode; // enum rotate_mode RotateMode;
85     LONG RotateSize;
86     int RotateStep;
87 zmatsuo 8900
88 zmatsuo 8901 HANDLE LogThread;
89     DWORD LogThreadId;
90     HANDLE LogThreadEvent;
91    
92     BOOL IsPause;
93    
94     PFileTransDlg FLogDlg;
95 zmatsuo 8904
96 zmatsuo 8912 LogCode_t log_code;
97     BOOL bom;
98 zmatsuo 8904
99 zmatsuo 9872 BOOL FileLog;
100     BOOL BinLog;
101 zmatsuo 9873 } TFileVar;
102     typedef TFileVar *PFileVar;
103 zmatsuo 8894
104     static PFileVar LogVar = NULL;
105    
106 zmatsuo 8906 static PCHAR cv_LogBuf;
107     static int cv_LogPtr, cv_LStart, cv_LCount;
108     static PCHAR cv_BinBuf;
109     static int cv_BinPtr, cv_BStart, cv_BCount;
110     static int cv_BinSkip;
111    
112 yutakapon 5206 // �x�����������p�X���b�h�����b�Z�[�W
113     #define WM_DPC_LOGTHREAD_SEND (WM_APP + 1)
114    
115 zmatsuo 8897 static void Log1Bin(BYTE b);
116     static void LogBinSkip(int add);
117     static BOOL CreateLogBuf(void);
118     static BOOL CreateBinBuf(void);
119 zmatsuo 8905 void LogPut1(BYTE b);
120 zmatsuo 8907 static void OutputStr(const wchar_t *str);
121 zmatsuo 9873 static void LogToFile(PFileVar fv);
122     static void FLogOutputBOM(PFileVar fv);
123 yutakapon 5206
124 zmatsuo 8894 static BOOL OpenFTDlg_(PFileVar fv)
125 maya 3227 {
126 zmatsuo 8899 PFileTransDlg FTDlg = new CFileTransDlg();
127     if (FTDlg == NULL) {
128     return FALSE;
129     }
130 maya 3227
131 zmatsuo 8899 wchar_t *DlgCaption;
132 zmatsuo 10614 wchar_t *uimsg;
133     GetI18nStrWW("Tera Term", "FILEDLG_TRANS_TITLE_LOG", TitLog, ts.UILanguageFileW, &uimsg);
134 zmatsuo 8899 aswprintf(&DlgCaption, L"Tera Term: %s", uimsg);
135 zmatsuo 10614 free(uimsg);
136 maya 3227
137 zmatsuo 9070 CFileTransDlg::Info info;
138 zmatsuo 10614 info.UILanguageFileW = ts.UILanguageFileW;
139 zmatsuo 9070 info.OpId = CFileTransDlg::OpLog;
140 zmatsuo 8899 info.DlgCaption = DlgCaption;
141 zmatsuo 8911 info.FileName = NULL;
142 zmatsuo 8899 info.FullName = fv->FullName;
143     info.HideDialog = ts.LogHideDialog ? TRUE : FALSE;
144     info.HMainWin = HVTWin;
145     FTDlg->Create(hInst, &info);
146     FTDlg->RefreshNum(0, fv->FileSize, fv->ByteCount);
147 doda 4454
148 zmatsuo 8901 fv->FLogDlg = FTDlg;
149 doda 5383
150 zmatsuo 8899 free(DlgCaption);
151     return TRUE;
152 maya 3227 }
153    
154 zmatsuo 8852 /**
155 zmatsuo 10443 * �t�@�C�������������u������,���O�p
156     * �����������u��������
157     * &h �z�X�g�����u��
158     * &p TCP�|�[�g�������u��
159 zmatsuo 8852 * &u ���O�I���������[�U��
160 zmatsuo 10443 *
161     * @param pcv
162     * @param src �u���������O��������(�t�@�C����)
163     * @return �u������������������
164     * �s�v����������free()��������
165 zmatsuo 8852 */
166 zmatsuo 10444 static wchar_t *ConvertLognameW(const TComVar *pcv, const wchar_t *src)
167 maya 3227 {
168 zmatsuo 10443 const TTTSet *pts = pcv->ts;
169     size_t dest_len = wcslen(src) + 1;
170     wchar_t *dest = (wchar_t *)malloc(sizeof(wchar_t) * dest_len);
171 maya 3227
172 zmatsuo 10443 const wchar_t *s = src;
173     size_t i = 0;
174 maya 3227
175 zmatsuo 10443 while(*s != '\0') {
176     if (*s == '&' && *(s+1) != '\0') {
177     wchar_t c = *(s+1);
178     wchar_t *add_text = NULL;
179     switch (c) {
180     case 'h':
181     s += 2;
182     if (pcv->Open) {
183     switch(pcv->PortType) {
184     case IdTCPIP: {
185     // �z�X�g����IPv6�A�h���X�����A�t�@�C�������g�p������������(:)�����������u��
186     wchar_t *host = ToWcharA(pts->HostName);
187     wchar_t *host_fix = replaceInvalidFileNameCharW(host, '_');
188     free(host);
189     add_text = host_fix;
190     break;
191 maya 3227 }
192 zmatsuo 10443 case IdSerial: {
193     wchar_t *port;
194     aswprintf(&port, L"COM%d", ts.ComPort);
195     add_text = port;
196     break;
197 maya 3227 }
198 zmatsuo 10443 default:
199     ;
200     }
201 maya 3227 }
202     break;
203 zmatsuo 10443 case 'p':
204     s += 2;
205     if (pcv->Open) {
206     if (pcv->PortType == IdTCPIP) {
207     wchar_t *port;
208     aswprintf(&port, L"%d", ts.TCPPort);
209     add_text = port;
210 maya 3473 }
211     }
212     break;
213 zmatsuo 10443 case 'u': {
214     s += 2;
215     wchar_t user[256 + 1]; // 256=UNLEN
216     DWORD l = _countof(user);
217     if (GetUserNameW(user, &l) != 0) {
218 zmatsuo 10468 add_text = _wcsdup(user);
219 maya 6590 }
220     break;
221 maya 3227 }
222 zmatsuo 10443 default:
223     // pass '&'
224     s++;
225     add_text = NULL;
226     break;
227     }
228    
229 zmatsuo 10444 if (add_text != NULL) {
230 zmatsuo 10443 size_t l = wcslen(add_text);
231     dest_len += l;
232     dest = (wchar_t *)realloc(dest, sizeof(wchar_t) * dest_len);
233     wcscpy(&dest[i], add_text);
234 zmatsuo 10444 free(add_text);
235 zmatsuo 10443 i += l;
236     }
237 maya 3227 }
238     else {
239 zmatsuo 10443 dest[i] = *s++;
240     i++;
241 maya 3227 }
242     }
243 zmatsuo 10443 dest[i] = 0;
244     return dest;
245 maya 3227 }
246    
247 zmatsuo 8858 static void FixLogOption(void)
248 maya 3227 {
249 doda 3887 if (ts.LogBinary) {
250 maya 3227 ts.LogTypePlainText = false;
251     ts.LogTimestamp = false;
252     }
253     }
254    
255 yutakapon 5206
256     // �X���b�h���I�����t�@�C�����N���[�Y
257 zmatsuo 9873 static void CloseFileSync(PFileVar fv)
258 yutakapon 5206 {
259 yutakapon 6489 BOOL ret;
260    
261 zmatsuo 9873 if (fv->FileHandle == INVALID_HANDLE_VALUE) {
262 yutakapon 5206 return;
263 zmatsuo 8901 }
264 yutakapon 5206
265 zmatsuo 9873 if (fv->LogThread != INVALID_HANDLE_VALUE) {
266 yutakapon 5206 // �X���b�h���I������
267 zmatsuo 9873 ret = PostThreadMessage(fv->LogThreadId, WM_QUIT, 0, 0);
268 yutakapon 6489 if (ret != 0) {
269     // �X���b�h�L���[���G���L���[���������������������������s���B
270 zmatsuo 9873 WaitForSingleObject(fv->LogThread, INFINITE);
271 yutakapon 6489 }
272     else {
273 zmatsuo 8852 //DWORD code = GetLastError();
274 yutakapon 6489 }
275 zmatsuo 9873 CloseHandle(fv->LogThread);
276     fv->LogThread = INVALID_HANDLE_VALUE;
277 yutakapon 5206 }
278 zmatsuo 9873 CloseHandle(fv->FileHandle);
279     fv->FileHandle = INVALID_HANDLE_VALUE;
280 yutakapon 5206 }
281    
282     // �x�����������p�X���b�h
283 doda 6435 static unsigned _stdcall DeferredLogWriteThread(void *arg)
284 yutakapon 5206 {
285     MSG msg;
286     PFileVar fv = (PFileVar)arg;
287     PCHAR buf;
288     DWORD buflen;
289 maya 5273 DWORD wrote;
290 yutakapon 5206
291     PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE);
292    
293 yutakapon 6489 // �X���b�h�L���[���������I�������������X���b�h�����������m�����B
294     if (fv->LogThreadEvent != NULL) {
295     SetEvent(fv->LogThreadEvent);
296     }
297    
298 yutakapon 5206 while (GetMessage(&msg, NULL, 0, 0) > 0) {
299     switch (msg.message) {
300     case WM_DPC_LOGTHREAD_SEND:
301     buf = (PCHAR)msg.wParam;
302     buflen = (DWORD)msg.lParam;
303 zmatsuo 9873 WriteFile(fv->FileHandle, buf, buflen, &wrote, NULL);
304 yutakapon 5206 free(buf); // ����������������
305     break;
306    
307     case WM_QUIT:
308     goto end;
309     break;
310     }
311     }
312    
313     end:
314     _endthreadex(0);
315     return (0);
316     }
317    
318 zmatsuo 8901 // �x�����������p�X���b�h���N�����B
319     // (2013.4.19 yutaka)
320     // DeferredLogWriteThread �X���b�h���N�������A�X���b�h�L���[�����������������O���A
321     // ���O�t�@�C�����N���[�Y(CloseFileSync)���s���������A�G���L���[�����s���A�f�b�h���b�N
322     // �����������������C�������B
323     // �X���b�h�����������s�������A���O�����C�x���g�I�u�W�F�N�g���g�����A�X���b�h�L���[��
324     // ���������������������������������B���O�t���C�x���g�I�u�W�F�N�g���g���������A
325     // �V�X�e��(Windows OS)�������j�[�N�����O�������K�v�������B
326     // (2016.9.23 yutaka)
327     static void StartThread(PFileVar fv)
328     {
329     unsigned tid;
330     fv->LogThreadEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
331     fv->LogThread = (HANDLE)_beginthreadex(NULL, 0, DeferredLogWriteThread, fv, 0, &tid);
332     fv->LogThreadId = tid;
333     if (fv->LogThreadEvent != NULL) {
334     WaitForSingleObject(fv->LogThreadEvent, INFINITE);
335     CloseHandle(fv->LogThreadEvent);
336     }
337     }
338    
339     static void OpenLogFile(PFileVar fv)
340     {
341 nmaya 9134 // LogLockExclusive ���L���������������������L���������A
342     // ���������������O�t�@�C���������G�f�B�^���J����������
343 zmatsuo 8901 int dwShareMode = FILE_SHARE_READ;
344     if (!ts.LogLockExclusive) {
345     dwShareMode = FILE_SHARE_READ | FILE_SHARE_WRITE;
346     }
347 zmatsuo 9873 fv->FileHandle = CreateFileW(fv->FullName, GENERIC_WRITE, dwShareMode, NULL,
348     OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
349 zmatsuo 8901 }
350    
351 zmatsuo 9873 static BOOL LogStart(PFileVar fv, const wchar_t *fname)
352 zmatsuo 8852 {
353 zmatsuo 8901 fv->FullName = _wcsdup(fname);
354 zmatsuo 8852 FixLogOption();
355    
356 doda 3887 if (ts.LogBinary > 0)
357 maya 3227 {
358 zmatsuo 9872 fv->BinLog = TRUE;
359     fv->FileLog = FALSE;
360 maya 3227 if (! CreateBinBuf())
361     {
362     return FALSE;
363     }
364     }
365     else {
366 zmatsuo 9872 fv->BinLog = FALSE;
367     fv->FileLog = TRUE;
368 maya 3227 if (! CreateLogBuf())
369     {
370     return FALSE;
371     }
372     }
373 zmatsuo 8906 cv_LStart = cv_LogPtr;
374     cv_LCount = 0;
375 maya 3227
376 zmatsuo 8901 OpenLogFile(fv);
377 zmatsuo 9871 if (fv->FileHandle == INVALID_HANDLE_VALUE) {
378 zmatsuo 8901 return FALSE;
379     }
380    
381 maya 3227 /* 2007.05.24 Gentaro */
382 zmatsuo 8901 fv->eLineEnd = Line_LineHead;
383 maya 3227 if (ts.Append > 0)
384     {
385 zmatsuo 9871 SetFilePointer(fv->FileHandle, 0, NULL, FILE_END);
386 zmatsuo 8901 /* 2007.05.24 Gentaro
387     If log file already exists,
388     a newline is inserted before the first timestamp.
389     */
390     fv->eLineEnd = Line_FileHead;
391 maya 3227 }
392 zmatsuo 9869
393     // BOM�o��
394     if (ts.Append == 0 && ts.LogBinary == 0 && fv->bom) {
395     // ���L��������(�V�K) && �o�C�i���������� && BOM ���o����
396 zmatsuo 9873 FLogOutputBOM(fv);
397 zmatsuo 8912 }
398 maya 3227
399 yutakapon 5171 // Log rotate configuration
400 zmatsuo 9871 fv->RotateMode = ts.LogRotate;
401     fv->RotateSize = ts.LogRotateSize;
402     fv->RotateStep = ts.LogRotateStep;
403 yutakapon 5162
404 yutakapon 6365 // Log rotate���L���������A�����t�@�C���T�C�Y�����������B
405     // �������t�@�C�������������T�C�Y�����[�e�[�g�������������C���B
406     // (2016.4.9 yutaka)
407 zmatsuo 9871 if (fv->RotateMode != ROTATE_NONE) {
408     DWORD size = GetFileSize(fv->FileHandle, NULL);
409 zmatsuo 8901 if (size == -1) {
410     return FALSE;
411     }
412 zmatsuo 9871 fv->ByteCount = size;
413 yutakapon 6365 }
414 zmatsuo 8901 else {
415 zmatsuo 9871 fv->ByteCount = 0;
416 zmatsuo 8901 }
417 yutakapon 6365
418 zmatsuo 9871 if (! OpenFTDlg_(fv)) {
419 maya 3227 return FALSE;
420     }
421    
422 zmatsuo 9871 fv->IsPause = FALSE;
423     fv->StartTime = GetTickCount();
424 zmatsuo 8899
425 zmatsuo 8901 if (ts.DeferredLogWriteMode) {
426 zmatsuo 9871 StartThread(fv);
427 yutakapon 6489 }
428 yutakapon 5206
429 zmatsuo 9872 if (fv->FileLog) {
430 zmatsuo 8897 cv.Log1Byte = LogPut1;
431     }
432 zmatsuo 9872 if (fv->BinLog) {
433 zmatsuo 8897 cv.Log1Bin = Log1Bin;
434     cv.LogBinSkip = LogBinSkip;
435     }
436    
437 maya 3227 return TRUE;
438     }
439    
440 zmatsuo 8897 /**
441 zmatsuo 8908 * �����o�b�t�@�������f�[�^�����������O�������o��
442     * (2013.9.29 yutaka)
443     *
444     * TODO
445     * 1�s������
446     */
447     void FLogOutputAllBuffer(void)
448     {
449 zmatsuo 9873 PFileVar fv = LogVar;
450 zmatsuo 8909 DWORD ofs;
451 zmatsuo 8908 int size;
452     wchar_t buf[512];
453     for (ofs = 0 ; ; ofs++ ) {
454     // 1�����s�����������B���������������A�G�X�P�[�v�V�[�P���X�������������B
455     size = BuffGetAnyLineDataW(ofs, buf, _countof(buf));
456     if (size == -1)
457     break;
458    
459     OutputStr(buf);
460     OutputStr(L"\r\n");
461 zmatsuo 9873 LogToFile(fv);
462 zmatsuo 8908 }
463     }
464    
465     /**
466 zmatsuo 8897 * ���O��1byte��������
467     * �o�b�t�@��������������
468     * ���������������� LogToFile() ���s������
469     */
470 maya 3227 void LogPut1(BYTE b)
471     {
472 zmatsuo 9872 PFileVar fv = LogVar;
473    
474 zmatsuo 8906 cv_LogBuf[cv_LogPtr] = b;
475     cv_LogPtr++;
476     if (cv_LogPtr>=InBuffSize)
477     cv_LogPtr = cv_LogPtr-InBuffSize;
478 maya 3227
479 zmatsuo 9872 if (fv->FileLog)
480 maya 3227 {
481 zmatsuo 8906 if (cv_LCount>=InBuffSize)
482 maya 3227 {
483 zmatsuo 8906 cv_LCount = InBuffSize;
484     cv_LStart = cv_LogPtr;
485 maya 3227 }
486     else
487 zmatsuo 8906 cv_LCount++;
488 maya 3227 }
489     else
490 zmatsuo 8906 cv_LCount = 0;
491 maya 3227 }
492    
493     static BOOL Get1(PCHAR Buf, int *Start, int *Count, PBYTE b)
494     {
495     if (*Count<=0) return FALSE;
496     *b = Buf[*Start];
497     (*Start)++;
498     if (*Start>=InBuffSize)
499     *Start = *Start-InBuffSize;
500     (*Count)--;
501     return TRUE;
502     }
503    
504    
505    
506     static CRITICAL_SECTION g_filelog_lock; /* ���b�N�p���� */
507    
508     void logfile_lock_initialize(void)
509     {
510     InitializeCriticalSection(&g_filelog_lock);
511     }
512    
513     static inline void logfile_lock(void)
514     {
515     EnterCriticalSection(&g_filelog_lock);
516     }
517    
518     static inline void logfile_unlock(void)
519     {
520     LeaveCriticalSection(&g_filelog_lock);
521     }
522    
523 yutakapon 5162 // ���O�����[�e�[�g�����B
524     // (2013.3.21 yutaka)
525 zmatsuo 9873 static void LogRotate(PFileVar fv)
526 yutakapon 5162 {
527 yutakapon 5165 int loopmax = 10000; // XXX
528     int i, k;
529 yutakapon 5162
530 zmatsuo 9873 if (fv->RotateMode == ROTATE_NONE)
531 yutakapon 5162 return;
532    
533 zmatsuo 9873 if (fv->RotateMode == ROTATE_SIZE) {
534     if (fv->ByteCount <= fv->RotateSize)
535 yutakapon 5162 return;
536 zmatsuo 9873 //OutputDebugPrintf("%s: mode %d size %ld\n", __FUNCTION__, fv->RotateMode, fv->ByteCount);
537 yutakapon 5162 } else {
538     return;
539     }
540    
541     logfile_lock();
542     // ���O�T�C�Y���������������B
543 zmatsuo 9873 fv->ByteCount = 0;
544 yutakapon 5162
545     // �������������t�@�C�����N���[�Y�����A�������t�@�C�����I�[�v�������B
546 zmatsuo 9873 CloseFileSync(fv);
547 yutakapon 5162
548 yutakapon 5165 // �������[�e�[�V�������X�e�b�v�����w����������
549 zmatsuo 9873 if (fv->RotateStep > 0)
550     loopmax = fv->RotateStep;
551 yutakapon 5165
552     for (i = 1 ; i <= loopmax ; i++) {
553 zmatsuo 8899 wchar_t *filename;
554 zmatsuo 9873 aswprintf(&filename, L"%s.%d", fv->FullName, i);
555 zmatsuo 9324 DWORD attr = GetFileAttributesW(filename);
556 zmatsuo 8899 free(filename);
557 zmatsuo 8901 if (attr == INVALID_FILE_ATTRIBUTES)
558 yutakapon 5162 break;
559     }
560 yutakapon 5165 if (i > loopmax) {
561     // �������������������������A�������t�@�C�������p�������B
562     i = loopmax;
563 yutakapon 5162 }
564    
565     // ���t�@�C�������l�[���B
566 yutakapon 5165 for (k = i-1 ; k >= 0 ; k--) {
567 zmatsuo 8899 wchar_t *oldfile;
568 yutakapon 5165 if (k == 0)
569 zmatsuo 9873 oldfile = _wcsdup(fv->FullName);
570 yutakapon 5165 else
571 zmatsuo 9873 aswprintf(&oldfile, L"%s.%d", fv->FullName, k);
572 zmatsuo 8899 wchar_t *newfile;
573 zmatsuo 9873 aswprintf(&newfile, L"%s.%d", fv->FullName, k+1);
574 zmatsuo 9324 DeleteFileW(newfile);
575     if (MoveFileW(oldfile, newfile) == 0) {
576 yutakapon 5165 OutputDebugPrintf("%s: rename %d\n", __FUNCTION__, errno);
577     }
578 zmatsuo 8899 free(oldfile);
579     free(newfile);
580 yutakapon 5165 }
581 yutakapon 5162
582     // ���I�[�v��
583 zmatsuo 9873 OpenLogFile(fv);
584     if (fv->bom) {
585     FLogOutputBOM(fv);
586 zmatsuo 8912 }
587 zmatsuo 8901 if (ts.DeferredLogWriteMode) {
588 zmatsuo 9873 StartThread(fv);
589 yutakapon 5162 }
590    
591     logfile_unlock();
592     }
593    
594 zmatsuo 9873 static wchar_t *TimeStampStr(PFileVar fv)
595 zmatsuo 8909 {
596     char *strtime = NULL;
597     switch (ts.LogTimestampType) {
598     case TIMESTAMP_LOCAL:
599     default:
600     strtime = mctimelocal(ts.LogTimestampFormat, FALSE);
601     break;
602     case TIMESTAMP_UTC:
603     strtime = mctimelocal(ts.LogTimestampFormat, TRUE);
604     break;
605     case TIMESTAMP_ELAPSED_LOGSTART:
606 zmatsuo 9873 strtime = strelapsed(fv->StartTime);
607 zmatsuo 8909 break;
608     case TIMESTAMP_ELAPSED_CONNECTED:
609     strtime = strelapsed(cv.ConnectedTime);
610     break;
611     }
612    
613     char tmp[128];
614     tmp[0] = 0;
615     strncat_s(tmp, sizeof(tmp), "[", _TRUNCATE);
616     strncat_s(tmp, sizeof(tmp), strtime, _TRUNCATE);
617     strncat_s(tmp, sizeof(tmp), "] ", _TRUNCATE);
618    
619 zmatsuo 8910 return ToWcharA(tmp);
620 zmatsuo 8909 }
621    
622 zmatsuo 8897 /**
623     * �o�b�t�@�������O���t�@�C������������
624     */
625 zmatsuo 9873 static void LogToFile(PFileVar fv)
626 maya 3227 {
627     PCHAR Buf;
628     int Start, Count;
629     BYTE b;
630    
631 zmatsuo 9872 if (fv->FileLog)
632 maya 3227 {
633 zmatsuo 8906 Buf = cv_LogBuf;
634     Start = cv_LStart;
635     Count = cv_LCount;
636 maya 3227 }
637 zmatsuo 9872 else if (fv->BinLog)
638 maya 3227 {
639 zmatsuo 8906 Buf = cv_BinBuf;
640     Start = cv_BStart;
641     Count = cv_BCount;
642 maya 3227 }
643     else
644     return;
645    
646     if (Buf==NULL) return;
647     if (Count==0) return;
648    
649     // ���b�N������(2004.8.6 yutaka)
650     logfile_lock();
651    
652 zmatsuo 8909 // ���������f�[�^����������
653     DWORD WriteBufMax = 8192;
654     DWORD WriteBufLen = 0;
655     PCHAR WriteBuf = (PCHAR)malloc(WriteBufMax);
656     while (Get1(Buf,&Start,&Count,&b)) {
657 zmatsuo 9103 if (FLogIsPause() || ProtoGetProtoFlag()) {
658 zmatsuo 8909 continue;
659     }
660 doda 6947
661 zmatsuo 8909 if (WriteBufLen >= (WriteBufMax*4/5)) {
662     WriteBufMax *= 2;
663     WriteBuf = (PCHAR)realloc(WriteBuf, WriteBufMax);
664     }
665 doda 6947
666 zmatsuo 8909 WriteBuf[WriteBufLen++] = b;
667 yutakapon 5206
668 zmatsuo 9873 (fv->ByteCount)++;
669 zmatsuo 8909 }
670 yutakapon 5206
671 zmatsuo 8909 // ��������
672     if (WriteBufLen > 0) {
673     if (ts.DeferredLogWriteMode) {
674 zmatsuo 9873 PostThreadMessage(fv->LogThreadId, WM_DPC_LOGTHREAD_SEND, (WPARAM)WriteBuf, WriteBufLen);
675 yutakapon 5206 }
676 zmatsuo 8909 else {
677     DWORD wrote;
678 zmatsuo 9873 WriteFile(fv->FileHandle, WriteBuf, WriteBufLen, &wrote, NULL);
679 zmatsuo 8909 free(WriteBuf);
680     }
681 maya 3227 }
682    
683     logfile_unlock();
684    
685 zmatsuo 9872 if (fv->FileLog)
686 maya 3227 {
687 zmatsuo 8906 cv_LStart = Start;
688     cv_LCount = Count;
689 maya 3227 }
690     else {
691 zmatsuo 8906 cv_BStart = Start;
692     cv_BCount = Count;
693 maya 3227 }
694 zmatsuo 9103 if (FLogIsPause() || ProtoGetProtoFlag()) return;
695 zmatsuo 9873 fv->FLogDlg->RefreshNum(fv->StartTime, fv->FileSize, fv->ByteCount);
696 yutakapon 5162
697 zmatsuo 8896
698 yutakapon 5162 // ���O�E���[�e�[�g
699 zmatsuo 9873 LogRotate(fv);
700 maya 3227 }
701    
702 zmatsuo 8897 static BOOL CreateLogBuf(void)
703 maya 3227 {
704 zmatsuo 8906 if (cv_LogBuf==NULL)
705 maya 3227 {
706 zmatsuo 8906 cv_LogBuf = (char *)malloc(InBuffSize);
707     cv_LogPtr = 0;
708     cv_LStart = 0;
709     cv_LCount = 0;
710 maya 3227 }
711 zmatsuo 8906 return (cv_LogBuf!=NULL);
712 maya 3227 }
713    
714 zmatsuo 8897 static void FreeLogBuf(void)
715 maya 3227 {
716 zmatsuo 8906 free(cv_LogBuf);
717     cv_LogBuf = NULL;
718     cv_LogPtr = 0;
719     cv_LStart = 0;
720     cv_LCount = 0;
721 maya 3227 }
722    
723 zmatsuo 8897 static BOOL CreateBinBuf(void)
724 maya 3227 {
725 zmatsuo 8906 if (cv_BinBuf==NULL)
726 maya 3227 {
727 zmatsuo 8906 cv_BinBuf = (PCHAR)malloc(InBuffSize);
728     cv_BinPtr = 0;
729     cv_BStart = 0;
730     cv_BCount = 0;
731 maya 3227 }
732 zmatsuo 8906 return (cv_BinBuf!=NULL);
733 maya 3227 }
734    
735 zmatsuo 8897 static void FreeBinBuf(void)
736 maya 3227 {
737 zmatsuo 8906 free(cv_BinBuf);
738     cv_BinBuf = NULL;
739     cv_BinPtr = 0;
740     cv_BStart = 0;
741     cv_BCount = 0;
742 maya 3227 }
743    
744 zmatsuo 9873 static void FileTransEnd_(PFileVar fv)
745 maya 3227 {
746 zmatsuo 9872 fv->FileLog = FALSE;
747     fv->BinLog = FALSE;
748 zmatsuo 8897 cv.Log1Byte = NULL;
749     cv.Log1Bin = NULL;
750     cv.LogBinSkip = NULL;
751 zmatsuo 9873 PFileTransDlg FLogDlg = fv->FLogDlg;
752 zmatsuo 8901 if (FLogDlg != NULL) {
753 zmatsuo 8897 FLogDlg->DestroyWindow();
754     FLogDlg = NULL;
755 zmatsuo 9873 fv->FLogDlg = NULL;
756 maya 3227 }
757 zmatsuo 9873 CloseFileSync(fv);
758 zmatsuo 8897 FreeLogBuf();
759     FreeBinBuf();
760 zmatsuo 9873 free(fv->FullName);
761     fv->FullName = NULL;
762     free(fv);
763    
764 zmatsuo 8900 LogVar = NULL;
765 maya 3227 }
766    
767 zmatsuo 8857 /**
768     * ���O���|�[�Y����
769     */
770     void FLogPause(BOOL Pause)
771 maya 3227 {
772 zmatsuo 9873 PFileVar fv = LogVar;
773     if (fv == NULL) {
774 zmatsuo 8899 return;
775     }
776 zmatsuo 9873 fv->IsPause = Pause;
777     fv->FLogDlg->ChangeButton(Pause);
778 maya 3227 }
779    
780 zmatsuo 8857 /**
781 zmatsuo 8852 * ���O���[�e�[�g������
782     * ���O���T�C�Y��<size>�o�C�g���������������A���[�e�[�V��������������������
783     */
784 zmatsuo 8858 void FLogRotateSize(size_t size)
785 zmatsuo 8852 {
786 zmatsuo 9873 PFileVar fv = LogVar;
787     if (fv == NULL) {
788 zmatsuo 8852 return;
789     }
790 zmatsuo 9873 fv->RotateMode = ROTATE_SIZE;
791     fv->RotateSize = (LONG)size;
792 zmatsuo 8852 }
793    
794     /**
795     * ���O���[�e�[�g������
796     * ���O�t�@�C������������������
797     */
798 zmatsuo 8858 void FLogRotateRotate(int step)
799 zmatsuo 8852 {
800 zmatsuo 9873 PFileVar fv = LogVar;
801     if (fv == NULL) {
802 zmatsuo 8852 return;
803     }
804 zmatsuo 9873 fv->RotateStep = step;
805 zmatsuo 8852 }
806    
807     /**
808     * ���O���[�e�[�g������
809     * ���[�e�[�V���������~
810     */
811 zmatsuo 8858 void FLogRotateHalt(void)
812 zmatsuo 8852 {
813 zmatsuo 9873 PFileVar fv = LogVar;
814     if (fv == NULL) {
815 zmatsuo 8852 return;
816     }
817 zmatsuo 9873 fv->RotateMode = ROTATE_NONE;
818     fv->RotateSize = 0;
819     fv->RotateStep = 0;
820 zmatsuo 8852 }
821    
822 zmatsuo 9854 static INT_PTR CALLBACK OnCommentDlgProc(HWND hDlgWnd, UINT msg, WPARAM wp, LPARAM)
823 zmatsuo 8852 {
824     static const DlgTextInfo TextInfos[] = {
825     { 0, "DLG_COMMENT_TITLE" },
826     { IDOK, "BTN_OK" }
827     };
828    
829     switch (msg) {
830     case WM_INITDIALOG:
831     // �G�f�B�b�g�R���g���[�����t�H�[�J�X��������
832     SetFocus(GetDlgItem(hDlgWnd, IDC_EDIT_COMMENT));
833 zmatsuo 9350 SetDlgTextsW(hDlgWnd, TextInfos, _countof(TextInfos), ts.UILanguageFileW);
834 zmatsuo 8852 return FALSE;
835    
836     case WM_COMMAND:
837     switch (LOWORD(wp)) {
838 zmatsuo 8901 case IDOK: {
839 zmatsuo 9324 size_t len = SendDlgItemMessageW(hDlgWnd, IDC_EDIT_COMMENT, WM_GETTEXTLENGTH, 0, 0);
840 zmatsuo 8907 len += 1;
841     wchar_t *buf = (wchar_t *)malloc(len * sizeof(wchar_t));
842 zmatsuo 9324 GetDlgItemTextW(hDlgWnd, IDC_EDIT_COMMENT, buf, (int)len);
843 zmatsuo 8905 FLogWriteStr(buf);
844     FLogWriteStr(L"\n"); // TODO ���s�R�[�h
845     free(buf);
846 zmatsuo 8852 TTEndDialog(hDlgWnd, IDOK);
847     break;
848 zmatsuo 8901 }
849 zmatsuo 8852 default:
850     return FALSE;
851     }
852     break;
853 zmatsuo 8907
854 zmatsuo 8852 case WM_CLOSE:
855     TTEndDialog(hDlgWnd, 0);
856     return TRUE;
857    
858     default:
859     return FALSE;
860     }
861     return TRUE;
862     }
863    
864 zmatsuo 8905 /**
865     * ���O�t�@�C�����R�����g���������� (2004.8.6 yutaka)
866     */
867 zmatsuo 8858 void FLogAddCommentDlg(HINSTANCE hInst, HWND hWnd)
868 zmatsuo 8852 {
869 zmatsuo 9873 PFileVar fv = LogVar;
870     if (fv == NULL) {
871 zmatsuo 8905 return;
872     }
873 zmatsuo 8852 TTDialogBox(hInst, MAKEINTRESOURCE(IDD_COMMENT_DIALOG),
874 zmatsuo 9854 hWnd, OnCommentDlgProc);
875 zmatsuo 8852 }
876    
877 zmatsuo 8858 void FLogClose(void)
878 zmatsuo 8852 {
879 zmatsuo 9873 PFileVar fv = LogVar;
880     if (fv == NULL) {
881 zmatsuo 8897 return;
882     }
883    
884 zmatsuo 9873 FileTransEnd_(fv);
885 zmatsuo 8852 }
886    
887 zmatsuo 8897 /**
888     * ���O���I�[�v������
889     * @param[in] fname ���O�t�@�C����, CreateFile()���n������
890     *
891     * ���O�t�@�C������strftime���W�J�������s���������B
892     * FLogGetLogFilename() �� FLogOpenDialog() ��
893     * �t�@�C�����������������B
894     */
895 zmatsuo 8912 BOOL FLogOpen(const wchar_t *fname, LogCode_t code, BOOL bom)
896 zmatsuo 8852 {
897 zmatsuo 8894 if (LogVar != NULL) {
898 zmatsuo 8852 return FALSE;
899     }
900    
901 zmatsuo 8897 //
902 zmatsuo 9873 PFileVar fv = (PFileVar)malloc(sizeof(*fv));
903 zmatsuo 8897 if (fv == NULL) {
904     return FALSE;
905     }
906     LogVar = fv;
907     memset(fv, 0, sizeof(TFileVar));
908 zmatsuo 8901 fv->FileHandle = INVALID_HANDLE_VALUE;
909     fv->LogThread = INVALID_HANDLE_VALUE;
910     fv->eLineEnd = Line_LineHead;
911 zmatsuo 8897
912 zmatsuo 8912 fv->log_code = code;
913     fv->bom = bom;
914 zmatsuo 9873 BOOL ret = LogStart(fv, fname);
915 zmatsuo 8901 if (ret == FALSE) {
916 zmatsuo 9873 FileTransEnd_(fv);
917 zmatsuo 8901 }
918 zmatsuo 8897
919 zmatsuo 8852 return ret;
920     }
921    
922 zmatsuo 8858 BOOL FLogIsOpend(void)
923 zmatsuo 8852 {
924     return LogVar != NULL;
925     }
926    
927 zmatsuo 8904 BOOL FLogIsOpendText(void)
928     {
929 zmatsuo 9872 return LogVar != NULL && LogVar->FileLog;
930 zmatsuo 8904 }
931    
932     BOOL FLogIsOpendBin(void)
933     {
934 zmatsuo 9872 return LogVar != NULL && LogVar->BinLog;
935 zmatsuo 8904 }
936    
937 zmatsuo 8905 void FLogWriteStr(const wchar_t *str)
938 zmatsuo 8852 {
939 zmatsuo 8905 if (LogVar != NULL) {
940 zmatsuo 8907 OutputStr(str);
941 zmatsuo 8852 }
942     }
943    
944 zmatsuo 8858 void FLogInfo(char *param_ptr, size_t param_len)
945 zmatsuo 8852 {
946 zmatsuo 9873 PFileVar fv = LogVar;
947     if (fv) {
948 zmatsuo 8852 param_ptr[0] = '0'
949     + (ts.LogBinary != 0)
950     + ((ts.Append != 0) << 1)
951     + ((ts.LogTypePlainText != 0) << 2)
952     + ((ts.LogTimestamp != 0) << 3)
953     + ((ts.LogHideDialog != 0) << 4);
954 zmatsuo 9873 char *filenameU8 = ToU8W(fv->FullName);
955 zmatsuo 8899 strncpy_s(param_ptr + 1, param_len - 1, filenameU8, _TRUNCATE);
956     free(filenameU8);
957 zmatsuo 8852 }
958     else {
959     param_ptr[0] = '0' - 1;
960     param_ptr[1] = 0;
961     }
962     }
963    
964     /**
965     * ���������O�t�@�C����������
966     */
967 zmatsuo 8899 const wchar_t *FLogGetFilename(void)
968 zmatsuo 8852 {
969     if (LogVar == NULL) {
970     return NULL;
971     }
972     return LogVar->FullName;
973     }
974    
975     /**
976 zmatsuo 10444 * ���O�t�@�C�����p���C�����s��,�t�@�C������������
977     * - strftime() ���������t�W�J
978     * - �������������O�t�@�C���t�H���_������
979     * - �z�X�g��,�|�[�g�����W�J
980     *
981     * @param filename �t�@�C����(�p�X����������)
982     * @return �C�������t�@�C����
983     */
984     wchar_t *FLogGetLogFilenameBase(const wchar_t *filename)
985     {
986     // �t�@�C�������������o
987 zmatsuo 10464 const wchar_t *last_path_sep = wcsrchr(filename, L'\\');
988     wchar_t *format;
989     if (last_path_sep == NULL) {
990 zmatsuo 10468 format = _wcsdup(filename);
991 zmatsuo 10444 }
992 zmatsuo 10464 else {
993 zmatsuo 10468 format = _wcsdup(last_path_sep + 1);
994 zmatsuo 10464 }
995 zmatsuo 10444
996     // strftime ���g�p������������������
997     deleteInvalidStrftimeCharW(format);
998    
999 zmatsuo 10464 // ����������0��������?
1000     if (format[0] == 0) {
1001     free(format);
1002 zmatsuo 10468 return _wcsdup(L"");
1003 zmatsuo 10464 }
1004    
1005 zmatsuo 10444 // ��������������
1006     time_t time_local;
1007     time(&time_local);
1008     struct tm tm_local;
1009     localtime_s(&tm_local, &time_local);
1010    
1011     // strftime()������
1012 zmatsuo 10464 // ���������������g��
1013     size_t len = 32;
1014     wchar_t *formated = NULL;
1015     while (1) {
1016     wchar_t *formated_realloc = (wchar_t *)realloc(formated, sizeof(wchar_t) * len);
1017     if (formated_realloc == NULL) {
1018     free(format);
1019     free(formated);
1020 zmatsuo 10468 return _wcsdup(L"");
1021 zmatsuo 10464 }
1022     formated = formated_realloc;
1023     size_t r = wcsftime(formated, len, format, &tm_local);
1024     if (r != 0) {
1025     // �t�H�[�}�b�g������
1026     break;
1027     }
1028     len *= 2;
1029 zmatsuo 10444 }
1030     free(format);
1031    
1032     // �z�X�g������
1033     wchar_t *host = ConvertLognameW(&cv, formated);
1034     free(formated);
1035    
1036     // �t�@�C�������g�p���������������u��
1037     //wchar_t *replaced = replaceInvalidFileNameCharW(host, 0); // ����
1038     wchar_t *replaced = replaceInvalidFileNameCharW(host, L'_');
1039     free(host);
1040    
1041     return replaced;
1042     }
1043    
1044     /**
1045 zmatsuo 8852 * ���O�t�@�C����������
1046     * ���O�t�@�C�����p���C�����s��
1047     * - strftime() ���������t�W�J
1048     * - �������������O�t�@�C���t�H���_������
1049     * - �z�X�g��,�|�[�g�����W�J
1050     *
1051     * @param[in] log_filename �t�@�C����(����/��������������ok)
1052     * NULL�������f�t�H���g�t�@�C����������
1053     * strftime�`��ok
1054     * @return �t���p�X�t�@�C����
1055     * �s�v���������� free() ��������
1056     */
1057 zmatsuo 8899 wchar_t *FLogGetLogFilename(const wchar_t *log_filename)
1058 zmatsuo 8852 {
1059 zmatsuo 10444 wchar_t *dir;
1060     wchar_t *fname;
1061 zmatsuo 8852 if (log_filename == NULL) {
1062 zmatsuo 10468 dir = _wcsdup(ts.LogDefaultPathW);
1063     fname = _wcsdup(ts.LogDefaultNameW);
1064 zmatsuo 10444 } else if (!IsRelativePathW(log_filename)) {
1065     // �����p�X������������
1066     dir = ExtractDirNameW(log_filename);
1067     fname = ExtractFileNameW(log_filename);
1068 zmatsuo 8852 }
1069     else {
1070 zmatsuo 10468 dir = _wcsdup(ts.LogDefaultPathW);
1071     fname = _wcsdup(log_filename);
1072 zmatsuo 8852 }
1073    
1074 zmatsuo 10444 wchar_t *formated = FLogGetLogFilenameBase(fname);
1075     free(fname);
1076 zmatsuo 8852
1077 zmatsuo 10444 // �A������
1078     wchar_t *logfull = NULL;
1079     awcscats(&logfull, dir, L"\\", formated, NULL);
1080 zmatsuo 10606 free(formated);
1081 zmatsuo 10444 free(dir);
1082    
1083     // ���K��
1084     wchar_t *normal;
1085     hGetFullPathNameW(logfull, &normal, NULL);
1086     free(logfull);
1087    
1088     return normal;
1089 zmatsuo 8852 }
1090 zmatsuo 8857
1091     BOOL FLogIsPause()
1092     {
1093 zmatsuo 8900 if (LogVar == NULL) {
1094     return FALSE;
1095     }
1096     return LogVar->IsPause;
1097 zmatsuo 8857 }
1098    
1099     void FLogWindow(int nCmdShow)
1100     {
1101 zmatsuo 8900 if (LogVar == NULL) {
1102     return;
1103     }
1104 zmatsuo 8857
1105 zmatsuo 8901 HWND HWndLog = LogVar->FLogDlg->m_hWnd;
1106 zmatsuo 8857 ShowWindow(HWndLog, nCmdShow);
1107     if (nCmdShow == SW_RESTORE) {
1108     // �g���X�^�C�� WS_EX_NOACTIVATE ��������������
1109     SetForegroundWindow(HWndLog);
1110     }
1111     }
1112    
1113     void FLogShowDlg(void)
1114     {
1115 zmatsuo 8900 if (LogVar == NULL) {
1116     return;
1117     }
1118 zmatsuo 8901 HWND HWndLog = LogVar->FLogDlg->m_hWnd;
1119     ShowWindow(HWndLog, SW_SHOWNORMAL);
1120     SetForegroundWindow(HWndLog);
1121 zmatsuo 8857 }
1122 zmatsuo 8897
1123     /**
1124     * ���O��1byte��������
1125     * LogPut1() ������?
1126     */
1127     //void Log1Bin(PComVar cv, BYTE b)
1128     static void Log1Bin(BYTE b)
1129     {
1130 zmatsuo 9103 if (LogVar->IsPause || ProtoGetProtoFlag()) {
1131 zmatsuo 8897 return;
1132     }
1133 zmatsuo 8906 if (cv_BinSkip > 0) {
1134     cv_BinSkip--;
1135 zmatsuo 8897 return;
1136     }
1137 zmatsuo 8906 cv_BinBuf[cv_BinPtr] = b;
1138     cv_BinPtr++;
1139     if (cv_BinPtr>=InBuffSize) {
1140     cv_BinPtr = cv_BinPtr-InBuffSize;
1141 zmatsuo 8897 }
1142 zmatsuo 8906 if (cv_BCount>=InBuffSize) {
1143     cv_BCount = InBuffSize;
1144     cv_BStart = cv_BinPtr;
1145 zmatsuo 8897 }
1146     else {
1147 zmatsuo 8906 cv_BCount++;
1148 zmatsuo 8897 }
1149     }
1150    
1151     static void LogBinSkip(int add)
1152     {
1153 zmatsuo 8906 if (cv_BinBuf != NULL) {
1154     cv_BinSkip += add;
1155 zmatsuo 8897 }
1156     }
1157    
1158     /**
1159     * ���O�o�b�t�@���������������f�[�^���o�C�g��������
1160     */
1161     int FLogGetCount(void)
1162     {
1163 zmatsuo 9872 PFileVar fv = LogVar;
1164     if (fv == NULL) {
1165     return 0;
1166     }
1167     if (fv->FileLog) {
1168 zmatsuo 8906 return cv_LCount;
1169 zmatsuo 8897 }
1170 zmatsuo 9872 if (fv->BinLog) {
1171 zmatsuo 8906 return cv_BCount;
1172 zmatsuo 8897 }
1173     return 0;
1174     }
1175    
1176     /**
1177 zmatsuo 8906 * ���O�o�b�t�@�������o�C�g��������
1178     */
1179     int FLogGetFreeCount(void)
1180     {
1181 zmatsuo 9872 PFileVar fv = LogVar;
1182     if (fv == NULL) {
1183     return 0;
1184     }
1185     if (fv->FileLog) {
1186 zmatsuo 8906 return InBuffSize - cv_LCount;
1187     }
1188 zmatsuo 9872 if (fv->BinLog) {
1189 zmatsuo 8906 return InBuffSize - cv_BCount;
1190     }
1191     return 0;
1192     }
1193    
1194     /**
1195 zmatsuo 8897 * �o�b�t�@�������O���t�@�C������������
1196     */
1197     void FLogWriteFile(void)
1198     {
1199 zmatsuo 9872 PFileVar fv = LogVar;
1200     if (fv == NULL) {
1201     return;
1202     }
1203 zmatsuo 8906 if (cv_LogBuf!=NULL)
1204 zmatsuo 8897 {
1205 zmatsuo 9872 if (fv->FileLog) {
1206 zmatsuo 9873 LogToFile(fv);
1207 zmatsuo 8897 }
1208     }
1209    
1210 zmatsuo 8906 if (cv_BinBuf!=NULL)
1211 zmatsuo 8897 {
1212 zmatsuo 9872 if (fv->BinLog) {
1213 zmatsuo 9873 LogToFile(fv);
1214 zmatsuo 8897 }
1215     }
1216     }
1217 zmatsuo 8904
1218     void FLogPutUTF32(unsigned int u32)
1219     {
1220     PFileVar fv = LogVar;
1221 zmatsuo 8906 BOOL log_available = (cv_LogBuf != 0);
1222 zmatsuo 8904
1223     if (!log_available) {
1224 zmatsuo 8905 // ���O�����o��������
1225 zmatsuo 8904 return;
1226     }
1227    
1228 zmatsuo 8912 // �s����?(���s���o����������)
1229 zmatsuo 8910 if (ts.LogTimestamp && fv->eLineEnd) {
1230 zmatsuo 8912 // �^�C���X�^���v���o��
1231 zmatsuo 8910 fv->eLineEnd = Line_Other; /* clear endmark*/
1232 zmatsuo 9873 wchar_t* strtime = TimeStampStr(fv);
1233 zmatsuo 8910 FLogWriteStr(strtime);
1234     free(strtime);
1235     }
1236    
1237 zmatsuo 8904 switch(fv->log_code) {
1238 zmatsuo 8912 case LOG_UTF8: {
1239 zmatsuo 8904 // UTF-8
1240     char u8_buf[4];
1241     size_t u8_len = UTF32ToUTF8(u32, u8_buf, _countof(u8_buf));
1242 zmatsuo 9854 for (size_t i = 0; i < u8_len; i++) {
1243 zmatsuo 8904 BYTE b = u8_buf[i];
1244     LogPut1(b);
1245     }
1246     break;
1247     }
1248 zmatsuo 8912 case LOG_UTF16LE:
1249     case LOG_UTF16BE: {
1250 zmatsuo 8904 // UTF-16
1251     wchar_t u16[2];
1252     size_t u16_len = UTF32ToUTF16(u32, u16, _countof(u16));
1253 zmatsuo 9854 for (size_t i = 0; i < u16_len; i++) {
1254 zmatsuo 8912 if (fv->log_code == LOG_UTF16LE) {
1255 zmatsuo 8904 // UTF-16LE
1256     LogPut1(u16[i] & 0xff);
1257     LogPut1((u16[i] >> 8) & 0xff);
1258     }
1259     else {
1260     // UTF-16BE
1261     LogPut1((u16[i] >> 8) & 0xff);
1262     LogPut1(u16[i] & 0xff);
1263     }
1264     }
1265     }
1266     }
1267 zmatsuo 8910
1268     if (u32 == 0x0a) {
1269     fv->eLineEnd = Line_LineHead; /* set endmark*/
1270     }
1271 zmatsuo 8904 }
1272    
1273 zmatsuo 9873 static void FLogOutputBOM(PFileVar fv)
1274 zmatsuo 8904 {
1275 zmatsuo 8910 DWORD wrote;
1276 zmatsuo 8904
1277     switch(fv->log_code) {
1278 zmatsuo 8910 case 0: {
1279 zmatsuo 8904 // UTF-8
1280 zmatsuo 8910 const char *bom = "\xef\xbb\xbf";
1281 zmatsuo 9871 WriteFile(fv->FileHandle, bom, 3, &wrote, NULL);
1282     fv->ByteCount += 3;
1283 zmatsuo 8904 break;
1284 zmatsuo 8910 }
1285     case 1: {
1286 zmatsuo 8904 // UTF-16LE
1287 zmatsuo 8910 const char *bom = "\xff\xfe";
1288 zmatsuo 9871 WriteFile(fv->FileHandle, bom, 2, &wrote, NULL);
1289     fv->ByteCount += 2;
1290 zmatsuo 8904 break;
1291 zmatsuo 8910 }
1292     case 2: {
1293 zmatsuo 8904 // UTF-16BE
1294 zmatsuo 8910 const char *bom = "\xfe\xff";
1295 zmatsuo 9871 WriteFile(fv->FileHandle, bom, 2, &wrote, NULL);
1296     fv->ByteCount += 2;
1297 zmatsuo 8904 break;
1298 zmatsuo 8910 }
1299 zmatsuo 8904 default:
1300     break;
1301     }
1302     }
1303    
1304 zmatsuo 8907 static void OutputStr(const wchar_t *str)
1305     {
1306     size_t len;
1307    
1308     assert(str != NULL);
1309    
1310     len = wcslen(str);
1311     while(*str != 0) {
1312     unsigned int u32;
1313     size_t u16_len = UTF16ToUTF32(str, len, &u32);
1314     switch (u16_len) {
1315     case 0:
1316     default:
1317     // ������������
1318     str++;
1319     len--;
1320     break;
1321     case 1:
1322     case 2: {
1323     FLogPutUTF32(u32);
1324     str += u16_len;
1325     len -= u16_len;
1326     break;
1327     }
1328     }
1329     }
1330     }

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