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 8906 - (hide annotations) (download) (as text)
Tue Aug 18 15:31:34 2020 UTC (3 years, 7 months ago) by zmatsuo
File MIME type: text/x-c++src
File size: 39765 byte(s)
ログに関する変数を移動、バッファをヒープから取るよう修正

- ログに関する変数を filesys_log.cpp に移動した
- バッファをヒープから取るようにした
  - GlobalAlloc() で取得するのをやめた
  - GlobalLock(), GlobalUnlock() を行う必要がなくなった
1 doda 6806 /*
2 zmatsuo 8894 * (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 "ttftypes.h"
44     #include "ftdlg.h"
45     #include "ttwinman.h"
46     #include "commlib.h"
47     #include "ttcommon.h"
48     #include "ttlib.h"
49     #include "dlglib.h"
50 doda 3904 #include "vtterm.h"
51 maya 3227 #include "ftlib.h"
52 yutakapon 5392 #include "buffer.h"
53 zmatsuo 8852 #include "helpid.h"
54     #include "layer_for_unicode.h"
55 zmatsuo 8863 #include "layer_for_unicode_crt.h"
56     #include "codeconv.h"
57 zmatsuo 8899 #include "asprintf.h"
58 yutakapon 5392
59 zmatsuo 8852 #include "filesys_log_res.h"
60 zmatsuo 8900 #include "filesys_log.h"
61 zmatsuo 8866
62 zmatsuo 8901 /*
63     Line Head flag for timestamping
64     2007.05.24 Gentaro
65     */
66     enum enumLineEnd {
67     Line_Other = 0,
68     Line_LineHead = 1,
69     Line_FileHead = 2,
70     };
71    
72 zmatsuo 8894 typedef struct {
73 zmatsuo 8901 wchar_t *FullName;
74     wchar_t *FileName;
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     int log_code;
97    
98 zmatsuo 8894 } TFileVar_;
99     typedef TFileVar_ *PFileVar_;
100    
101     #define PFileVar PFileVar_
102     #define TFileVar TFileVar_
103    
104     static PFileVar LogVar = NULL;
105    
106 zmatsuo 8900 static BOOL FileLog = FALSE;
107     static BOOL BinLog = FALSE;
108 zmatsuo 8894
109 zmatsuo 8906 static PCHAR cv_LogBuf;
110     static int cv_LogPtr, cv_LStart, cv_LCount;
111     static PCHAR cv_BinBuf;
112     static int cv_BinPtr, cv_BStart, cv_BCount;
113     static int cv_BinSkip;
114    
115 yutakapon 5206 // �x�����������p�X���b�h�����b�Z�[�W
116     #define WM_DPC_LOGTHREAD_SEND (WM_APP + 1)
117    
118 zmatsuo 8897 static void FileTransEnd_(void);
119     static void Log1Bin(BYTE b);
120     static void LogBinSkip(int add);
121     static BOOL CreateLogBuf(void);
122     static BOOL CreateBinBuf(void);
123 zmatsuo 8905 void LogPut1(BYTE b);
124 yutakapon 5206
125 zmatsuo 8894 static BOOL OpenFTDlg_(PFileVar fv)
126 maya 3227 {
127 zmatsuo 8899 PFileTransDlg FTDlg = new CFileTransDlg();
128     if (FTDlg == NULL) {
129     return FALSE;
130     }
131 maya 3227
132 zmatsuo 8899 wchar_t *DlgCaption;
133     wchar_t uimsg[MAX_UIMSG];
134     #define TitLogW L"Log"
135     get_lang_msgW("FILEDLG_TRANS_TITLE_LOG", uimsg, _countof(uimsg), TitLogW, ts.UILanguageFile);
136     aswprintf(&DlgCaption, L"Tera Term: %s", uimsg);
137 maya 3227
138 zmatsuo 8899 CFileTransDlgInfo info;
139     info.UILanguageFile = ts.UILanguageFile;
140     info.OpId = OpLog;
141     info.DlgCaption = DlgCaption;
142     info.FileName = fv->FileName;
143     info.FullName = fv->FullName;
144     info.HideDialog = ts.LogHideDialog ? TRUE : FALSE;
145     info.HMainWin = HVTWin;
146     FTDlg->Create(hInst, &info);
147     FTDlg->RefreshNum(0, fv->FileSize, fv->ByteCount);
148 doda 4454
149 zmatsuo 8901 fv->FLogDlg = FTDlg;
150 doda 5383
151 zmatsuo 8899 free(DlgCaption);
152     return TRUE;
153 maya 3227 }
154    
155 zmatsuo 8852 /**
156     * �t�@�C�������������u������
157     * &h �z�X�g�����u�� (2007.5.14)
158     * &p TCP�|�[�g�������u�� (2009.6.12)
159     * &u ���O�I���������[�U��
160     */
161     static void ConvertLogname(char *c, int destlen)
162 maya 3227 {
163     char buf[MAXPATHLEN], buf2[MAXPATHLEN], *p = c;
164 yutakapon 5139 char tmphost[1024];
165 maya 6590 char tmpuser[256+1];
166     DWORD len_user = sizeof(tmpuser);
167 maya 3227
168     memset(buf, 0, sizeof(buf));
169    
170     while(*p != '\0') {
171     if (*p == '&' && *(p+1) != '\0') {
172     switch (*(p+1)) {
173 maya 3473 case 'h':
174 maya 3227 if (cv.Open) {
175     if (cv.PortType == IdTCPIP) {
176 yutakapon 5139 // �z�X�g����IPv6�A�h���X�����A�t�@�C�������g�p�����������������������A
177     // �]�v�����������������B
178     // (2013.3.9 yutaka)
179     strncpy_s(tmphost, sizeof(tmphost), ts.HostName, _TRUNCATE);
180     //strncpy_s(tmphost, sizeof(tmphost), "2001:0db8:bd05:01d2:288a:1fc0:0001:10ee", _TRUNCATE);
181 maya 5141 replaceInvalidFileNameChar(tmphost, '_');
182 yutakapon 5139 strncat_s(buf,sizeof(buf), tmphost, _TRUNCATE);
183 maya 3227 }
184     else if (cv.PortType == IdSerial) {
185     strncpy_s(buf2,sizeof(buf2),buf,_TRUNCATE);
186     _snprintf_s(buf, sizeof(buf), _TRUNCATE, "%sCOM%d", buf2, ts.ComPort);
187     }
188     }
189     break;
190 maya 3473 case 'p':
191     if (cv.Open) {
192     if (cv.PortType == IdTCPIP) {
193     char port[6];
194     _snprintf_s(port, sizeof(port), _TRUNCATE, "%d", ts.TCPPort);
195     strncat_s(buf,sizeof(buf),port,_TRUNCATE);
196     }
197     }
198     break;
199 maya 6590 case 'u':
200     if (GetUserName(tmpuser, &len_user) != 0) {
201     strncat_s(buf,sizeof(buf),tmpuser,_TRUNCATE);
202     }
203     break;
204 maya 3473 default:
205 maya 3227 strncpy_s(buf2,sizeof(buf2),p,2);
206     strncat_s(buf,sizeof(buf),buf2,_TRUNCATE);
207     }
208     p++;
209     }
210     else {
211     strncpy_s(buf2,sizeof(buf2),p,1);
212     strncat_s(buf,sizeof(buf),buf2,_TRUNCATE);
213     }
214     p++;
215     }
216     strncpy_s(c, destlen, buf, _TRUNCATE);
217     }
218    
219 zmatsuo 8858 static void FixLogOption(void)
220 maya 3227 {
221 doda 3887 if (ts.LogBinary) {
222 maya 3227 ts.LogTypePlainText = false;
223     ts.LogTimestamp = false;
224     }
225     }
226    
227 yutakapon 5206
228     // �X���b�h���I�����t�@�C�����N���[�Y
229     static void CloseFileSync(PFileVar ptr)
230     {
231 yutakapon 6489 BOOL ret;
232    
233 zmatsuo 8901 if (ptr->FileHandle == INVALID_HANDLE_VALUE) {
234 yutakapon 5206 return;
235 zmatsuo 8901 }
236 yutakapon 5206
237 zmatsuo 7930 if (ptr->LogThread != INVALID_HANDLE_VALUE) {
238 yutakapon 5206 // �X���b�h���I������
239 yutakapon 6489 ret = PostThreadMessage(ptr->LogThreadId, WM_QUIT, 0, 0);
240     if (ret != 0) {
241     // �X���b�h�L���[���G���L���[���������������������������s���B
242     WaitForSingleObject(ptr->LogThread, INFINITE);
243     }
244     else {
245 zmatsuo 8852 //DWORD code = GetLastError();
246 yutakapon 6489 }
247 yutakapon 5206 CloseHandle(ptr->LogThread);
248 zmatsuo 7930 ptr->LogThread = INVALID_HANDLE_VALUE;
249 yutakapon 5206 }
250 zmatsuo 7930 CloseHandle(ptr->FileHandle);
251 zmatsuo 8901 ptr->FileHandle = INVALID_HANDLE_VALUE;
252 yutakapon 5206 }
253    
254     // �x�����������p�X���b�h
255 doda 6435 static unsigned _stdcall DeferredLogWriteThread(void *arg)
256 yutakapon 5206 {
257     MSG msg;
258     PFileVar fv = (PFileVar)arg;
259     PCHAR buf;
260     DWORD buflen;
261 maya 5273 DWORD wrote;
262 yutakapon 5206
263     PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE);
264    
265 yutakapon 6489 // �X���b�h�L���[���������I�������������X���b�h�����������m�����B
266     if (fv->LogThreadEvent != NULL) {
267     SetEvent(fv->LogThreadEvent);
268     }
269    
270 yutakapon 5206 while (GetMessage(&msg, NULL, 0, 0) > 0) {
271     switch (msg.message) {
272     case WM_DPC_LOGTHREAD_SEND:
273     buf = (PCHAR)msg.wParam;
274     buflen = (DWORD)msg.lParam;
275 zmatsuo 7930 WriteFile(LogVar->FileHandle, buf, buflen, &wrote, NULL);
276 yutakapon 5206 free(buf); // ����������������
277     break;
278    
279     case WM_QUIT:
280     goto end;
281     break;
282     }
283     }
284    
285     end:
286     _endthreadex(0);
287     return (0);
288     }
289    
290 zmatsuo 8901 // �x�����������p�X���b�h���N�����B
291     // (2013.4.19 yutaka)
292     // DeferredLogWriteThread �X���b�h���N�������A�X���b�h�L���[�����������������O���A
293     // ���O�t�@�C�����N���[�Y(CloseFileSync)���s���������A�G���L���[�����s���A�f�b�h���b�N
294     // �����������������C�������B
295     // �X���b�h�����������s�������A���O�����C�x���g�I�u�W�F�N�g���g�����A�X���b�h�L���[��
296     // ���������������������������������B���O�t���C�x���g�I�u�W�F�N�g���g���������A
297     // �V�X�e��(Windows OS)�������j�[�N�����O�������K�v�������B
298     // (2016.9.23 yutaka)
299     static void StartThread(PFileVar fv)
300     {
301     unsigned tid;
302     fv->LogThreadEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
303     fv->LogThread = (HANDLE)_beginthreadex(NULL, 0, DeferredLogWriteThread, fv, 0, &tid);
304     fv->LogThreadId = tid;
305     if (fv->LogThreadEvent != NULL) {
306     WaitForSingleObject(fv->LogThreadEvent, INFINITE);
307     CloseHandle(fv->LogThreadEvent);
308     }
309     }
310    
311 zmatsuo 8852 /**
312     * �_�C�A���O�����e�� ts ����������
313     *
314     * TODO
315     * �_�C�A���O�����������l�������I��������
316     * ����������������������������������������������?
317     */
318     static void SetLogFlags(HWND Dialog)
319 maya 3227 {
320 zmatsuo 8852 WORD BinFlag, val;
321 maya 3227
322 zmatsuo 8852 GetRB(Dialog, &BinFlag, IDC_FOPTBIN, IDC_FOPTBIN);
323     ts.LogBinary = BinFlag;
324 maya 3227
325 zmatsuo 8866 GetRB(Dialog, &val, IDC_APPEND, IDC_APPEND);
326 zmatsuo 8852 ts.Append = val;
327    
328     if (!BinFlag) {
329     GetRB(Dialog, &val, IDC_PLAINTEXT, IDC_PLAINTEXT);
330     ts.LogTypePlainText = val;
331    
332     GetRB(Dialog, &val, IDC_TIMESTAMP, IDC_TIMESTAMP);
333     ts.LogTimestamp = val;
334 maya 3227 }
335    
336 zmatsuo 8852 GetRB(Dialog, &val, IDC_HIDEDIALOG, IDC_HIDEDIALOG);
337     ts.LogHideDialog = val;
338    
339     GetRB(Dialog, &val, IDC_ALLBUFF_INFIRST, IDC_ALLBUFF_INFIRST);
340     ts.LogAllBuffIncludedInFirst = val;
341    
342     ts.LogTimestampType = (GetCurSel(Dialog, IDC_TIMESTAMPTYPE) - 1);
343     }
344    
345     /**
346     * ���O�t�@�C���`�F�b�N
347     *
348     * @param[in] filename
349     * @param[out] exist TURE/FALSE
350     * @param[out] bom 0 no BOM (or file not exist)
351     * 1 UTF-8
352     * 2 UTF-16LE
353     * 3 UTF-16BE
354     */
355 zmatsuo 8863 static void CheckLogFile(const wchar_t *filename, BOOL *exist, int *bom)
356 zmatsuo 8852 {
357 zmatsuo 8863 *exist = FALSE;
358     *bom = 0;
359    
360 zmatsuo 8852 // �t�@�C������������?
361 zmatsuo 8863 DWORD logdir = _GetFileAttributesW(filename);
362 zmatsuo 8852 if ((logdir != INVALID_FILE_ATTRIBUTES) && ((logdir & FILE_ATTRIBUTE_DIRECTORY) == 0)) {
363 zmatsuo 8863 // �t�@�C����������
364 zmatsuo 8852 *exist = TRUE;
365    
366     // BOM�L��/�����`�F�b�N
367 zmatsuo 8863 FILE *fp = __wfopen(filename, L"rb");
368     if (fp != NULL) {
369     unsigned char tmp[4];
370     size_t l = fread(tmp, 1, sizeof(tmp), fp);
371     fclose(fp);
372     if (l < 2) {
373     *bom = 0;
374     } else if (l >= 2 && tmp[0] == 0xff && tmp[1] == 0xfe) {
375     // UTF-16LE
376     *bom = 2;
377     } else if (l >= 2 && tmp[0] == 0xfe && tmp[1] == 0xff) {
378     // UTF-16BE
379     *bom = 3;
380     } else if (l >= 3 && tmp[0] == 0xef && tmp[1] == 0xbb && tmp[2] == 0xbf) {
381     // UTF-8
382     *bom = 1;
383     } else {
384     *bom = 0;
385     }
386 zmatsuo 8852 }
387 maya 3227 }
388 zmatsuo 8863 }
389    
390     typedef struct {
391     FLogDlgInfo_t *info;
392     // work
393     BOOL file_exist;
394     int current_bom;
395     TTTSet *pts;
396     } LogDlgWork_t;
397    
398     static void ArrangeControls(HWND Dialog, LogDlgWork_t *work)
399     {
400     if (work->file_exist) {
401     EnableWindow(GetDlgItem(Dialog, IDC_APPEND), TRUE);
402 zmatsuo 8866 if (work->pts->Append > 0) {
403     CheckRadioButton(Dialog, IDC_NEW_OVERWRITE, IDC_APPEND, IDC_APPEND);
404     }
405 zmatsuo 8863 }
406 zmatsuo 8852 else {
407 zmatsuo 8863 // �t�@�C�������� -> �V�K
408     EnableWindow(GetDlgItem(Dialog, IDC_APPEND), FALSE);
409     CheckRadioButton(Dialog, IDC_NEW_OVERWRITE, IDC_APPEND, IDC_NEW_OVERWRITE);
410 maya 3227 }
411 zmatsuo 8852
412 zmatsuo 8863 if (work->file_exist && IsDlgButtonChecked(Dialog, IDC_APPEND) == BST_CHECKED) {
413     // �t�@�C������������ && append
414     int bom = work->current_bom;
415 zmatsuo 8852 if (bom != 0) {
416     // BOM�L��
417     CheckDlgButton(Dialog, IDC_BOM, BST_CHECKED);
418 zmatsuo 8863 int cur =
419     bom == 1 ? 0 :
420     bom == 2 ? 1 :
421     bom == 3 ? 2 : 0;
422     SendDlgItemMessage(Dialog, IDC_TEXTCODING_DROPDOWN, CB_SETCURSEL, cur, 0);
423 zmatsuo 8852 }
424     else {
425     // BOM����
426     CheckDlgButton(Dialog, IDC_BOM, BST_UNCHECKED);
427 zmatsuo 8863 SendDlgItemMessage(Dialog, IDC_TEXTCODING_DROPDOWN, CB_SETCURSEL, 0, 0);
428 zmatsuo 8852 }
429 zmatsuo 8863 if (IsDlgButtonChecked(Dialog, IDC_FOPTTEXT) == BST_CHECKED) {
430     EnableWindow(GetDlgItem(Dialog, IDC_BOM), FALSE);
431     if (bom != 0) {
432     // BOM�L��
433     EnableWindow(GetDlgItem(Dialog, IDC_TEXTCODING_DROPDOWN), FALSE);
434     }
435     else {
436     // BOM����
437     EnableWindow(GetDlgItem(Dialog, IDC_TEXTCODING_DROPDOWN), TRUE);
438     }
439     }
440 zmatsuo 8852 }
441 maya 3227 else {
442 zmatsuo 8866 // �t�@�C�������� ���� append��������(������)
443 zmatsuo 8863 CheckRadioButton(Dialog, IDC_NEW_OVERWRITE, IDC_APPEND, IDC_NEW_OVERWRITE);
444 zmatsuo 8852 CheckDlgButton(Dialog, IDC_BOM, BST_CHECKED);
445 zmatsuo 8863 SendDlgItemMessage(Dialog, IDC_TEXTCODING_DROPDOWN, CB_SETCURSEL, 0, 0);
446     if (IsDlgButtonChecked(Dialog, IDC_FOPTTEXT) == BST_CHECKED) {
447     EnableWindow(GetDlgItem(Dialog, IDC_BOM), TRUE);
448     }
449 maya 3227 }
450 zmatsuo 8852 }
451 maya 3227
452 zmatsuo 8863 static void CheckLogFile(HWND Dialog, const wchar_t *filename, LogDlgWork_t *work)
453     {
454     BOOL exist;
455     int bom;
456     CheckLogFile(filename, &exist, &bom);
457     work->file_exist = exist;
458     work->current_bom = bom;
459     ArrangeControls(Dialog, work);
460     }
461 zmatsuo 8852
462     static INT_PTR CALLBACK LogFnHook(HWND Dialog, UINT Message, WPARAM wParam, LPARAM lParam)
463     {
464     static const DlgTextInfo TextInfos[] = {
465     { 0, "DLG_TABSHEET_TITLE_LOG" },
466     { IDC_FOPTBIN, "DLG_FOPT_BINARY" },
467 zmatsuo 8866 { IDC_APPEND, "DLG_FOPT_APPEND" },
468 zmatsuo 8852 { IDC_PLAINTEXT, "DLG_FOPT_PLAIN" },
469     { IDC_HIDEDIALOG, "DLG_FOPT_HIDEDIALOG" },
470     { IDC_ALLBUFF_INFIRST, "DLG_FOPT_ALLBUFFINFIRST" },
471     { IDC_TIMESTAMP, "DLG_FOPT_TIMESTAMP" },
472     };
473     static const I18nTextInfo timestamp_list[] = {
474     { "DLG_FOPT_TIMESTAMP_LOCAL", L"Local Time" },
475     { "DLG_FOPT_TIMESTAMP_UTC", L"UTC" },
476     { "DLG_FOPT_TIMESTAMP_ELAPSED_LOGGING", L"Elapsed Time (Logging)" },
477     { "DLG_FOPT_TIMESTAMP_ELAPSED_CONNECTION", L"Elapsed Time (Connection)" },
478     };
479 zmatsuo 8863 LogDlgWork_t *work = (LogDlgWork_t *)GetWindowLongPtr(Dialog, DWLP_USER);
480 zmatsuo 8852
481     if (Message == RegisterWindowMessage(HELPMSGSTRING)) {
482     // �R�����_�C�A���O�������w���v���b�Z�[�W���t��������
483     Message = WM_COMMAND;
484     wParam = IDHELP;
485     }
486     switch (Message) {
487     case WM_INITDIALOG: {
488 zmatsuo 8863 work = (LogDlgWork_t *)lParam;
489     TTTSet *pts = work->pts;
490     const char *UILanguageFile = pts->UILanguageFile;
491     SetWindowLongPtr(Dialog, DWLP_USER, (LONG_PTR)work);
492 zmatsuo 8852 ::DragAcceptFiles(Dialog, TRUE);
493    
494     SetDlgTexts(Dialog, TextInfos, _countof(TextInfos), UILanguageFile);
495     SetI18nList("Tera Term", Dialog, IDC_TIMESTAMPTYPE, timestamp_list, _countof(timestamp_list),
496     UILanguageFile, 0);
497    
498     SendDlgItemMessage(Dialog, IDC_TEXTCODING_DROPDOWN, CB_ADDSTRING, 0, (LPARAM)"UTF-8");
499 zmatsuo 8863 SendDlgItemMessage(Dialog, IDC_TEXTCODING_DROPDOWN, CB_ADDSTRING, 0, (LPARAM)"UTF-16LE");
500     SendDlgItemMessage(Dialog, IDC_TEXTCODING_DROPDOWN, CB_ADDSTRING, 0, (LPARAM)"UTF-16BE");
501 zmatsuo 8852 SendDlgItemMessage(Dialog, IDC_TEXTCODING_DROPDOWN, CB_SETCURSEL, 0, 0);
502    
503 zmatsuo 8863 _SetDlgItemTextW(Dialog, IDC_FOPT_FILENAME_EDIT, work->info->filename);
504     work->info->filename = NULL;
505 zmatsuo 8852
506     // Binary/Text �`�F�b�N�{�b�N�X
507 zmatsuo 8863 if (pts->LogBinary) {
508     CheckRadioButton(Dialog, IDC_FOPTBIN, IDC_FOPTTEXT, IDC_FOPTBIN);
509 doda 6946 }
510 zmatsuo 8852 else {
511 zmatsuo 8863 CheckRadioButton(Dialog, IDC_FOPTBIN, IDC_FOPTTEXT, IDC_FOPTTEXT);
512 zmatsuo 8852 }
513    
514     // Plain Text �`�F�b�N�{�b�N�X
515 zmatsuo 8863 if (pts->LogBinary) {
516 zmatsuo 8852 // Binary�t���O���L�����������`�F�b�N��������
517     DisableDlgItem(Dialog, IDC_PLAINTEXT, IDC_PLAINTEXT);
518 doda 6946 }
519 zmatsuo 8863 else if (pts->LogTypePlainText) {
520 zmatsuo 8852 SetRB(Dialog, 1, IDC_PLAINTEXT, IDC_PLAINTEXT);
521 doda 6946 }
522 zmatsuo 8852
523     // Hide dialog�`�F�b�N�{�b�N�X (2008.1.30 maya)
524 zmatsuo 8863 if (pts->LogHideDialog) {
525 zmatsuo 8852 SetRB(Dialog, 1, IDC_HIDEDIALOG, IDC_HIDEDIALOG);
526 doda 6946 }
527 zmatsuo 8852
528     // Include screen buffer�`�F�b�N�{�b�N�X (2013.9.29 yutaka)
529 zmatsuo 8863 if (pts->LogAllBuffIncludedInFirst) {
530 zmatsuo 8852 SetRB(Dialog, 1, IDC_ALLBUFF_INFIRST, IDC_ALLBUFF_INFIRST);
531 doda 6946 }
532 maya 3227
533 zmatsuo 8852 // timestamp�`�F�b�N�{�b�N�X (2006.7.23 maya)
534 zmatsuo 8863 if (pts->LogBinary) {
535 zmatsuo 8852 // Binary�t���O���L�����������`�F�b�N��������
536     DisableDlgItem(Dialog, IDC_TIMESTAMP, IDC_TIMESTAMP);
537     }
538 zmatsuo 8863 else if (pts->LogTimestamp) {
539 zmatsuo 8852 SetRB(Dialog, 1, IDC_TIMESTAMP, IDC_TIMESTAMP);
540     }
541    
542     // timestamp ����
543 zmatsuo 8863 int tstype = pts->LogTimestampType == TIMESTAMP_LOCAL ? 0 :
544     pts->LogTimestampType == TIMESTAMP_UTC ? 1 :
545     pts->LogTimestampType == TIMESTAMP_ELAPSED_LOGSTART ? 2 :
546     pts->LogTimestampType == TIMESTAMP_ELAPSED_CONNECTED ? 3 : 0;
547 zmatsuo 8852 SendDlgItemMessage(Dialog, IDC_TIMESTAMPTYPE, CB_SETCURSEL, tstype, 0);
548 zmatsuo 8863 if (pts->LogBinary || !pts->LogTimestamp) {
549 zmatsuo 8852 DisableDlgItem(Dialog, IDC_TIMESTAMPTYPE, IDC_TIMESTAMPTYPE);
550     }
551    
552     CenterWindow(Dialog, GetParent(Dialog));
553    
554     return TRUE;
555     }
556    
557     case WM_COMMAND:
558     switch (LOWORD(wParam)) {
559     case IDOK: {
560 zmatsuo 8863 wchar_t filename[MAX_PATH];
561     _GetDlgItemTextW(Dialog, IDC_FOPT_FILENAME_EDIT, filename, _countof(filename));
562     work->info->filename = _wcsdup(filename);
563 zmatsuo 8866 work->info->append = IsDlgButtonChecked(Dialog, IDC_APPEND) == BST_CHECKED;
564 zmatsuo 8863 work->info->bom = IsDlgButtonChecked(Dialog, IDC_BOM) == BST_CHECKED;
565     work->info->code = (int)SendDlgItemMessageA(Dialog, IDC_TEXTCODING_DROPDOWN, CB_GETCURSEL, 0, 0);
566 zmatsuo 8852 SetLogFlags(Dialog);
567     EndDialog(Dialog, IDOK);
568 doda 6947 break;
569 zmatsuo 8852 }
570     case IDCANCEL:
571     EndDialog(Dialog, IDCANCEL);
572 doda 6947 break;
573 zmatsuo 8852 case IDHELP:
574 zmatsuo 8863 OpenHelp(HH_HELP_CONTEXT, HlpFileLog, work->pts->UILanguageFile);
575 doda 6947 break;
576 zmatsuo 8852 case IDC_FOPT_FILENAME_BUTTON: {
577     /* save current dir */
578 zmatsuo 8863 const char *UILanguageFile = work->pts->UILanguageFile;
579 zmatsuo 8852 wchar_t curdir[MAXPATHLEN];
580     _GetCurrentDirectoryW(_countof(curdir), curdir);
581 doda 6947
582 zmatsuo 8863 wchar_t fname[MAX_PATH];
583     GetDlgItemTextW(Dialog, IDC_FOPT_FILENAME_EDIT, fname, _countof(fname));
584 maya 3227
585 zmatsuo 8863 wchar_t FNFilter[128*3];
586     get_lang_msgW("FILEDLG_ALL_FILTER", FNFilter, sizeof(FNFilter), L"All(*.*)\\0*.*\\0\\0", UILanguageFile);
587 maya 3227
588 zmatsuo 8863 wchar_t caption[MAX_PATH];
589     wchar_t uimsg[MAX_UIMSG];
590     #define TitLogW L"Log"
591     get_lang_msgW("FILEDLG_TRANS_TITLE_LOG", uimsg, _countof(uimsg), TitLogW, UILanguageFile);
592     wcsncpy_s(caption, _countof(caption), L"Tera Term: ", _TRUNCATE);
593     wcsncat_s(caption, _countof(caption), uimsg, _TRUNCATE);
594 doda 6947
595 zmatsuo 8863 OPENFILENAMEW ofn = {};
596     ofn.lStructSize = get_OPENFILENAME_SIZEW();
597 zmatsuo 8852 //ofn.Flags = OFN_PATHMUSTEXIST | OFN_OVERWRITEPROMPT;
598     ofn.Flags |= OFN_EXPLORER | OFN_ENABLESIZING;
599     ofn.Flags |= OFN_SHOWHELP;
600     ofn.Flags |= OFN_NOCHANGEDIR; // ��������������������������������
601     ofn.hwndOwner = Dialog;
602     ofn.lpstrFilter = FNFilter;
603     ofn.nFilterIndex = 1;
604     ofn.lpstrFile = fname;
605 zmatsuo 8863 ofn.nMaxFile = _countof(fname);
606 zmatsuo 8852 ofn.lpstrTitle = caption;
607 zmatsuo 8863 BOOL Ok = GetSaveFileNameW(&ofn);
608 zmatsuo 8852 if (Ok) {
609 zmatsuo 8863 SetDlgItemTextW(Dialog, IDC_FOPT_FILENAME_EDIT, fname);
610 doda 6947 }
611 zmatsuo 8852
612     /* restore dir */
613     _SetCurrentDirectoryW(curdir);
614    
615     break;
616 doda 6947 }
617 zmatsuo 8852 case IDC_FOPTBIN:
618 zmatsuo 8863 EnableWindow(GetDlgItem(Dialog, IDC_TEXTCODING_DROPDOWN), FALSE);
619     EnableWindow(GetDlgItem(Dialog, IDC_BOM), FALSE);
620 zmatsuo 8852 DisableDlgItem(Dialog, IDC_PLAINTEXT, IDC_TIMESTAMP);
621     DisableDlgItem(Dialog, IDC_TIMESTAMPTYPE, IDC_TIMESTAMPTYPE);
622     break;
623     case IDC_FOPTTEXT:
624 zmatsuo 8863 ArrangeControls(Dialog, work);
625 zmatsuo 8852 EnableDlgItem(Dialog, IDC_PLAINTEXT, IDC_TIMESTAMP);
626     // FALLTHROUGH -- BinFlag �� off ������ Timestamp �������L��/��������������
627     case IDC_TIMESTAMP:
628     if (IsDlgButtonChecked(Dialog, IDC_TIMESTAMP) == BST_CHECKED) {
629     EnableDlgItem(Dialog, IDC_TIMESTAMPTYPE, IDC_TIMESTAMPTYPE);
630 doda 6947 }
631     else {
632 zmatsuo 8852 DisableDlgItem(Dialog, IDC_TIMESTAMPTYPE, IDC_TIMESTAMPTYPE);
633 doda 6947 }
634 zmatsuo 8852 break;
635     case IDC_FOPT_FILENAME_EDIT:
636     if (HIWORD(wParam) == EN_CHANGE){
637 zmatsuo 8863 wchar_t filename[MAX_PATH];
638     GetDlgItemTextW(Dialog, IDC_FOPT_FILENAME_EDIT, filename, _countof(filename));
639     CheckLogFile(Dialog, filename, work);
640 zmatsuo 8852 }
641     break;
642 zmatsuo 8863 case IDC_NEW_OVERWRITE:
643     if (IsDlgButtonChecked(Dialog, IDC_FOPTTEXT) == BST_CHECKED) {
644     EnableWindow(GetDlgItem(Dialog, IDC_BOM), TRUE);
645     EnableWindow(GetDlgItem(Dialog, IDC_TEXTCODING_DROPDOWN), TRUE);
646     CheckDlgButton(Dialog, IDC_BOM, BST_CHECKED);
647     SendDlgItemMessage(Dialog, IDC_TEXTCODING_DROPDOWN, CB_SETCURSEL, 0, 0);
648     }
649     break;
650     case IDC_APPEND:
651     ArrangeControls(Dialog, work);
652     break;
653 doda 6947 }
654 zmatsuo 8852 break;
655     case WM_DROPFILES: {
656     // �����h���b�v��������������1������������
657     HDROP hDrop = (HDROP)wParam;
658     const UINT len = _DragQueryFileW(hDrop, 0, NULL, 0);
659     if (len == 0) {
660     DragFinish(hDrop);
661     return TRUE;
662     }
663     wchar_t *filename = (wchar_t *)malloc(sizeof(wchar_t) * (len + 1));
664     _DragQueryFileW(hDrop, 0, filename, len + 1);
665     filename[len] = '\0';
666 zmatsuo 8863 CheckRadioButton(Dialog, IDC_NEW_OVERWRITE, IDC_APPEND, IDC_APPEND);
667 zmatsuo 8852 _SetDlgItemTextW(Dialog, IDC_FOPT_FILENAME_EDIT, filename);
668     SendDlgItemMessage(Dialog, IDC_FOPT_FILENAME_EDIT, EM_SETSEL, len, len);
669     free(filename);
670     DragFinish(hDrop);
671     return TRUE;
672 maya 3227 }
673 zmatsuo 8852 }
674     return FALSE;
675     }
676 maya 3227
677 zmatsuo 8901 static void OpenLogFile(PFileVar fv)
678     {
679     int dwShareMode = FILE_SHARE_READ;
680     if (!ts.LogLockExclusive) {
681     dwShareMode = FILE_SHARE_READ | FILE_SHARE_WRITE;
682     }
683     LogVar->FileHandle = _CreateFileW(LogVar->FullName, GENERIC_WRITE, dwShareMode, NULL,
684     OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
685     }
686    
687 zmatsuo 8899 static BOOL LogStart(const wchar_t *fname)
688 zmatsuo 8852 {
689 zmatsuo 8901 PFileVar fv = LogVar;
690 maya 3227
691 zmatsuo 8901 fv->FullName = _wcsdup(fname);
692 zmatsuo 8902 fv->FileName = NULL;
693 zmatsuo 8852 FixLogOption();
694    
695 doda 3887 if (ts.LogBinary > 0)
696 maya 3227 {
697     BinLog = TRUE;
698     FileLog = FALSE;
699     if (! CreateBinBuf())
700     {
701     return FALSE;
702     }
703     }
704     else {
705     BinLog = FALSE;
706     FileLog = TRUE;
707     if (! CreateLogBuf())
708     {
709     return FALSE;
710     }
711     }
712 zmatsuo 8906 cv_LStart = cv_LogPtr;
713     cv_LCount = 0;
714 maya 3227
715 zmatsuo 8901 OpenLogFile(fv);
716     if (LogVar->FileHandle == INVALID_HANDLE_VALUE) {
717     return FALSE;
718     }
719    
720 maya 3227 /* 2007.05.24 Gentaro */
721 zmatsuo 8901 fv->eLineEnd = Line_LineHead;
722 maya 3227 if (ts.Append > 0)
723     {
724 zmatsuo 8901 SetFilePointer(LogVar->FileHandle, 0, NULL, FILE_END);
725     /* 2007.05.24 Gentaro
726     If log file already exists,
727     a newline is inserted before the first timestamp.
728     */
729     fv->eLineEnd = Line_FileHead;
730 maya 3227 }
731    
732 yutakapon 5171 // Log rotate configuration
733     LogVar->RotateMode = ts.LogRotate;
734     LogVar->RotateSize = ts.LogRotateSize;
735     LogVar->RotateStep = ts.LogRotateStep;
736 yutakapon 5162
737 yutakapon 6365 // Log rotate���L���������A�����t�@�C���T�C�Y�����������B
738     // �������t�@�C�������������T�C�Y�����[�e�[�g�������������C���B
739     // (2016.4.9 yutaka)
740     if (LogVar->RotateMode != ROTATE_NONE) {
741 zmatsuo 8852 DWORD size = GetFileSize(LogVar->FileHandle, NULL);
742 zmatsuo 8901 if (size == -1) {
743     return FALSE;
744     }
745     LogVar->ByteCount = size;
746 yutakapon 6365 }
747 zmatsuo 8901 else {
748     LogVar->ByteCount = 0;
749     }
750 yutakapon 6365
751 zmatsuo 8894 if (! OpenFTDlg_(LogVar)) {
752 maya 3227 return FALSE;
753     }
754    
755 zmatsuo 8900 LogVar->IsPause = FALSE;
756 zmatsuo 8899 LogVar->StartTime = GetTickCount();
757    
758 zmatsuo 8901 if (ts.DeferredLogWriteMode) {
759     StartThread(LogVar);
760 yutakapon 6489 }
761 yutakapon 5206
762 yutakapon 5392 // �����o�b�t�@�������f�[�^�������������o���������A
763     // ���O�������J�n�����B
764     // (2013.9.29 yutaka)
765     if (ts.LogAllBuffIncludedInFirst) {
766 zmatsuo 8852 DWORD ofs, size, written_size;
767     char buf[512];
768     const char *crlf = "\r\n";
769     DWORD crlf_len = 2;
770 yutakapon 5392 for (ofs = 0 ; ; ofs++ ) {
771 yutakapon 5395 // 1�����s�����������B���������������A�G�X�P�[�v�V�[�P���X�������������B
772 yutakapon 5392 size = BuffGetAnyLineData(ofs, buf, sizeof(buf));
773     if (size == -1)
774     break;
775 yutakapon 5395
776     #if 0
777     if (ts.DeferredLogWriteMode) { // �x����������
778     char *pbuf = (char *)malloc(size + 2);
779     memcpy(pbuf, buf, size);
780     pbuf[size] = '\r';
781     pbuf[size+1] = '\n';
782     Sleep(1); // �X���b�h�L���[�����������������A�R���e�L�X�g�X�C�b�`�������B
783     PostThreadMessage(LogVar->LogThreadId, WM_DPC_LOGTHREAD_SEND, (WPARAM)pbuf, size + 2);
784     } else { // �������B�l�b�g���[�N�o�R�����x���B
785     #endif
786 zmatsuo 7930 WriteFile(LogVar->FileHandle, buf, size, &written_size, NULL);
787     WriteFile(LogVar->FileHandle, crlf, crlf_len, &written_size, NULL);
788 yutakapon 5395 #if 0
789     }
790     #endif
791 yutakapon 5392 }
792     }
793    
794 zmatsuo 8897 if (FileLog) {
795     cv.Log1Byte = LogPut1;
796     }
797     if (BinLog) {
798     cv.Log1Bin = Log1Bin;
799     cv.LogBinSkip = LogBinSkip;
800     }
801    
802 maya 3227 return TRUE;
803     }
804    
805 zmatsuo 8897 /**
806     * ���O��1byte��������
807     * �o�b�t�@��������������
808     * ���������������� LogToFile() ���s������
809     */
810 maya 3227 void LogPut1(BYTE b)
811     {
812 zmatsuo 8906 cv_LogBuf[cv_LogPtr] = b;
813     cv_LogPtr++;
814     if (cv_LogPtr>=InBuffSize)
815     cv_LogPtr = cv_LogPtr-InBuffSize;
816 maya 3227
817     if (FileLog)
818     {
819 zmatsuo 8906 if (cv_LCount>=InBuffSize)
820 maya 3227 {
821 zmatsuo 8906 cv_LCount = InBuffSize;
822     cv_LStart = cv_LogPtr;
823 maya 3227 }
824     else
825 zmatsuo 8906 cv_LCount++;
826 maya 3227 }
827     else
828 zmatsuo 8906 cv_LCount = 0;
829 maya 3227 }
830    
831     static BOOL Get1(PCHAR Buf, int *Start, int *Count, PBYTE b)
832     {
833     if (*Count<=0) return FALSE;
834     *b = Buf[*Start];
835     (*Start)++;
836     if (*Start>=InBuffSize)
837     *Start = *Start-InBuffSize;
838     (*Count)--;
839     return TRUE;
840     }
841    
842    
843    
844     static CRITICAL_SECTION g_filelog_lock; /* ���b�N�p���� */
845    
846     void logfile_lock_initialize(void)
847     {
848     InitializeCriticalSection(&g_filelog_lock);
849     }
850    
851     static inline void logfile_lock(void)
852     {
853     EnterCriticalSection(&g_filelog_lock);
854     }
855    
856     static inline void logfile_unlock(void)
857     {
858     LeaveCriticalSection(&g_filelog_lock);
859     }
860    
861 yutakapon 5162 // ���O�����[�e�[�g�����B
862     // (2013.3.21 yutaka)
863     static void LogRotate(void)
864     {
865 yutakapon 5165 int loopmax = 10000; // XXX
866     int i, k;
867 yutakapon 5162
868     if (LogVar->RotateMode == ROTATE_NONE)
869     return;
870    
871     if (LogVar->RotateMode == ROTATE_SIZE) {
872 doda 6435 if (LogVar->ByteCount <= LogVar->RotateSize)
873 yutakapon 5162 return;
874     //OutputDebugPrintf("%s: mode %d size %ld\n", __FUNCTION__, LogVar->RotateMode, LogVar->ByteCount);
875     } else {
876     return;
877     }
878    
879     logfile_lock();
880     // ���O�T�C�Y���������������B
881     LogVar->ByteCount = 0;
882    
883     // �������������t�@�C�����N���[�Y�����A�������t�@�C�����I�[�v�������B
884 yutakapon 5206 CloseFileSync(LogVar);
885 yutakapon 5162
886 yutakapon 5165 // �������[�e�[�V�������X�e�b�v�����w����������
887     if (LogVar->RotateStep > 0)
888     loopmax = LogVar->RotateStep;
889    
890     for (i = 1 ; i <= loopmax ; i++) {
891 zmatsuo 8899 wchar_t *filename;
892     aswprintf(&filename, L"%s.%d", LogVar->FullName, i);
893     DWORD attr = _GetFileAttributesW(filename);
894     free(filename);
895 zmatsuo 8901 if (attr == INVALID_FILE_ATTRIBUTES)
896 yutakapon 5162 break;
897     }
898 yutakapon 5165 if (i > loopmax) {
899     // �������������������������A�������t�@�C�������p�������B
900     i = loopmax;
901 yutakapon 5162 }
902    
903     // ���t�@�C�������l�[���B
904 yutakapon 5165 for (k = i-1 ; k >= 0 ; k--) {
905 zmatsuo 8899 wchar_t *oldfile;
906 yutakapon 5165 if (k == 0)
907 zmatsuo 8899 oldfile = _wcsdup(LogVar->FullName);
908 yutakapon 5165 else
909 zmatsuo 8899 aswprintf(&oldfile, L"%s.%d", LogVar->FullName, k);
910     wchar_t *newfile;
911     aswprintf(&newfile, L"%s.%d", LogVar->FullName, k+1);
912     _DeleteFileW(newfile);
913     if (_MoveFileW(oldfile, newfile) == 0) {
914 yutakapon 5165 OutputDebugPrintf("%s: rename %d\n", __FUNCTION__, errno);
915     }
916 zmatsuo 8899 free(oldfile);
917     free(newfile);
918 yutakapon 5165 }
919 yutakapon 5162
920     // ���I�[�v��
921 zmatsuo 8901 OpenLogFile(LogVar);
922     if (ts.DeferredLogWriteMode) {
923     StartThread(LogVar);
924 yutakapon 5162 }
925    
926     logfile_unlock();
927     }
928    
929 zmatsuo 8897 /**
930     * �o�b�t�@�������O���t�@�C������������
931     */
932     static void LogToFile(void)
933 maya 3227 {
934     PCHAR Buf;
935     int Start, Count;
936     BYTE b;
937 yutakapon 5206 PCHAR WriteBuf;
938     DWORD WriteBufMax, WriteBufLen;
939     CHAR tmp[128];
940 maya 5273 DWORD wrote;
941 zmatsuo 8901 PFileVar fv = LogVar;
942 maya 3227
943     if (FileLog)
944     {
945 zmatsuo 8906 Buf = cv_LogBuf;
946     Start = cv_LStart;
947     Count = cv_LCount;
948 maya 3227 }
949     else if (BinLog)
950     {
951 zmatsuo 8906 Buf = cv_BinBuf;
952     Start = cv_BStart;
953     Count = cv_BCount;
954 maya 3227 }
955     else
956     return;
957    
958     if (Buf==NULL) return;
959     if (Count==0) return;
960    
961     // ���b�N������(2004.8.6 yutaka)
962     logfile_lock();
963    
964 yutakapon 5206 if (ts.DeferredLogWriteMode) {
965     WriteBufMax = 8192;
966     WriteBufLen = 0;
967     WriteBuf = (PCHAR)malloc(WriteBufMax);
968     while (Get1(Buf,&Start,&Count,&b)) {
969 zmatsuo 8857 if (!FLogIsPause() && (! cv.ProtoFlag))
970 yutakapon 5206 {
971     tmp[0] = 0;
972 zmatsuo 8901 if ( ts.LogTimestamp && fv->eLineEnd ) {
973 doda 6947 char *strtime = NULL;
974    
975     switch (ts.LogTimestampType) {
976     case TIMESTAMP_LOCAL:
977     strtime = mctimelocal(ts.LogTimestampFormat, FALSE);
978     break;
979     case TIMESTAMP_UTC:
980     strtime = mctimelocal(ts.LogTimestampFormat, TRUE);
981     break;
982     case TIMESTAMP_ELAPSED_LOGSTART:
983     strtime = strelapsed(LogVar->StartTime);
984     break;
985     case TIMESTAMP_ELAPSED_CONNECTED:
986     strtime = strelapsed(cv.ConnectedTime);
987     break;
988     }
989    
990 yutakapon 5206 /* 2007.05.24 Gentaro */
991 zmatsuo 8901 if(fv->eLineEnd == Line_FileHead ){
992 yutakapon 5206 strncat_s(tmp, sizeof(tmp), "\r\n", _TRUNCATE);
993     }
994     strncat_s(tmp, sizeof(tmp), "[", _TRUNCATE);
995     strncat_s(tmp, sizeof(tmp), strtime, _TRUNCATE);
996     strncat_s(tmp, sizeof(tmp), "] ", _TRUNCATE);
997     }
998 doda 6435
999 yutakapon 5206 /* 2007.05.24 Gentaro */
1000     if( b == 0x0a ){
1001 zmatsuo 8901 fv->eLineEnd = Line_LineHead; /* set endmark*/
1002 yutakapon 5206 }
1003     else {
1004 zmatsuo 8901 fv->eLineEnd = Line_Other; /* clear endmark*/
1005 yutakapon 5206 }
1006    
1007     if (WriteBufLen >= (WriteBufMax*4/5)) {
1008     WriteBufMax *= 2;
1009     WriteBuf = (PCHAR)realloc(WriteBuf, WriteBufMax);
1010     }
1011     memcpy(&WriteBuf[WriteBufLen], tmp, strlen(tmp));
1012     WriteBufLen += strlen(tmp);
1013     WriteBuf[WriteBufLen++] = b;
1014    
1015     (LogVar->ByteCount)++;
1016     }
1017     }
1018    
1019     PostThreadMessage(LogVar->LogThreadId, WM_DPC_LOGTHREAD_SEND, (WPARAM)WriteBuf, WriteBufLen);
1020    
1021     } else {
1022    
1023     while (Get1(Buf,&Start,&Count,&b))
1024 maya 3227 {
1025 zmatsuo 8857 if (!FLogIsPause() && (! cv.ProtoFlag))
1026 yutakapon 5206 {
1027 zmatsuo 8901 if ( ts.LogTimestamp && fv->eLineEnd ) {
1028 doda 6947 char *strtime = NULL;
1029    
1030     switch (ts.LogTimestampType) {
1031     case TIMESTAMP_LOCAL:
1032     strtime = mctimelocal(ts.LogTimestampFormat, FALSE);
1033     break;
1034     case TIMESTAMP_UTC:
1035     strtime = mctimelocal(ts.LogTimestampFormat, TRUE);
1036     break;
1037     case TIMESTAMP_ELAPSED_LOGSTART:
1038     strtime = strelapsed(LogVar->StartTime);
1039     break;
1040     case TIMESTAMP_ELAPSED_CONNECTED:
1041     strtime = strelapsed(cv.ConnectedTime);
1042     break;
1043     }
1044 zmatsuo 7930 WriteFile(LogVar->FileHandle, "[", 1, &wrote, NULL);
1045     WriteFile(LogVar->FileHandle, strtime, strlen(strtime), &wrote, NULL);
1046     WriteFile(LogVar->FileHandle, "] ", 2, &wrote, NULL);
1047 yutakapon 5206 }
1048 doda 6435
1049 maya 3227 /* 2007.05.24 Gentaro */
1050 yutakapon 5206 if( b == 0x0a ){
1051 zmatsuo 8901 fv->eLineEnd = Line_LineHead; /* set endmark*/
1052 maya 3227 }
1053 yutakapon 5206 else {
1054 zmatsuo 8901 fv->eLineEnd = Line_Other; /* clear endmark*/
1055 yutakapon 5206 }
1056    
1057 zmatsuo 7930 WriteFile(LogVar->FileHandle, (PCHAR)&b, 1, &wrote, NULL);
1058 yutakapon 5206 (LogVar->ByteCount)++;
1059 maya 3227 }
1060 yutakapon 5206 }
1061 maya 3227
1062     }
1063    
1064     logfile_unlock();
1065    
1066     if (FileLog)
1067     {
1068 zmatsuo 8906 cv_LStart = Start;
1069     cv_LCount = Count;
1070 maya 3227 }
1071     else {
1072 zmatsuo 8906 cv_BStart = Start;
1073     cv_BCount = Count;
1074 maya 3227 }
1075 zmatsuo 8857 if (FLogIsPause() || cv.ProtoFlag) return;
1076 zmatsuo 8901 LogVar->FLogDlg->RefreshNum(LogVar->StartTime, LogVar->FileSize, LogVar->ByteCount);
1077 yutakapon 5162
1078 zmatsuo 8896
1079 yutakapon 5162 // ���O�E���[�e�[�g
1080     LogRotate();
1081 maya 3227 }
1082    
1083 zmatsuo 8897 static BOOL CreateLogBuf(void)
1084 maya 3227 {
1085 zmatsuo 8906 if (cv_LogBuf==NULL)
1086 maya 3227 {
1087 zmatsuo 8906 cv_LogBuf = (char *)malloc(InBuffSize);
1088     cv_LogPtr = 0;
1089     cv_LStart = 0;
1090     cv_LCount = 0;
1091 maya 3227 }
1092 zmatsuo 8906 return (cv_LogBuf!=NULL);
1093 maya 3227 }
1094    
1095 zmatsuo 8897 static void FreeLogBuf(void)
1096 maya 3227 {
1097 zmatsuo 8906 free(cv_LogBuf);
1098     cv_LogBuf = NULL;
1099     cv_LogPtr = 0;
1100     cv_LStart = 0;
1101     cv_LCount = 0;
1102 maya 3227 }
1103    
1104 zmatsuo 8897 static BOOL CreateBinBuf(void)
1105 maya 3227 {
1106 zmatsuo 8906 if (cv_BinBuf==NULL)
1107 maya 3227 {
1108 zmatsuo 8906 cv_BinBuf = (PCHAR)malloc(InBuffSize);
1109     cv_BinPtr = 0;
1110     cv_BStart = 0;
1111     cv_BCount = 0;
1112 maya 3227 }
1113 zmatsuo 8906 return (cv_BinBuf!=NULL);
1114 maya 3227 }
1115    
1116 zmatsuo 8897 static void FreeBinBuf(void)
1117 maya 3227 {
1118 zmatsuo 8906 free(cv_BinBuf);
1119     cv_BinBuf = NULL;
1120     cv_BinPtr = 0;
1121     cv_BStart = 0;
1122     cv_BCount = 0;
1123 maya 3227 }
1124    
1125 zmatsuo 8897 static void FileTransEnd_(void)
1126 maya 3227 {
1127 zmatsuo 8900 if (LogVar == NULL) {
1128     return;
1129     }
1130 zmatsuo 8897 FileLog = FALSE;
1131     BinLog = FALSE;
1132     cv.Log1Byte = NULL;
1133     cv.Log1Bin = NULL;
1134     cv.LogBinSkip = NULL;
1135 zmatsuo 8901 PFileTransDlg FLogDlg = LogVar->FLogDlg;
1136     if (FLogDlg != NULL) {
1137 zmatsuo 8897 FLogDlg->DestroyWindow();
1138     FLogDlg = NULL;
1139 maya 3227 }
1140 zmatsuo 8900 CloseFileSync(LogVar);
1141 zmatsuo 8897 FreeLogBuf();
1142     FreeBinBuf();
1143 zmatsuo 8900 free(LogVar);
1144     LogVar = NULL;
1145 maya 3227 }
1146    
1147 zmatsuo 8857 /**
1148     * ���O���|�[�Y����
1149     */
1150     void FLogPause(BOOL Pause)
1151 maya 3227 {
1152 zmatsuo 8899 if (LogVar == NULL) {
1153     return;
1154     }
1155 zmatsuo 8900 LogVar->IsPause = Pause;
1156 zmatsuo 8901 LogVar->FLogDlg->ChangeButton(Pause);
1157 maya 3227 }
1158    
1159 zmatsuo 8857 /**
1160 zmatsuo 8852 * ���O���[�e�[�g������
1161     * ���O���T�C�Y��<size>�o�C�g���������������A���[�e�[�V��������������������
1162     */
1163 zmatsuo 8858 void FLogRotateSize(size_t size)
1164 zmatsuo 8852 {
1165     if (LogVar == NULL) {
1166     return;
1167     }
1168     LogVar->RotateMode = ROTATE_SIZE;
1169     LogVar->RotateSize = size;
1170     }
1171    
1172     /**
1173     * ���O���[�e�[�g������
1174     * ���O�t�@�C������������������
1175     */
1176 zmatsuo 8858 void FLogRotateRotate(int step)
1177 zmatsuo 8852 {
1178     if (LogVar == NULL) {
1179     return;
1180     }
1181     LogVar->RotateStep = step;
1182     }
1183    
1184     /**
1185     * ���O���[�e�[�g������
1186     * ���[�e�[�V���������~
1187     */
1188 zmatsuo 8858 void FLogRotateHalt(void)
1189 zmatsuo 8852 {
1190     if (LogVar == NULL) {
1191     return;
1192     }
1193     LogVar->RotateMode = ROTATE_NONE;
1194     LogVar->RotateSize = 0;
1195     LogVar->RotateStep = 0;
1196     }
1197    
1198     static INT_PTR CALLBACK OnCommentDlgProc(HWND hDlgWnd, UINT msg, WPARAM wp, LPARAM lp)
1199     {
1200     static const DlgTextInfo TextInfos[] = {
1201     { 0, "DLG_COMMENT_TITLE" },
1202     { IDOK, "BTN_OK" }
1203     };
1204     UINT ret;
1205    
1206     switch (msg) {
1207     case WM_INITDIALOG:
1208     //SetDlgItemText(hDlgWnd, IDC_EDIT_COMMENT, "�T���v��");
1209     // �G�f�B�b�g�R���g���[�����t�H�[�J�X��������
1210     SetFocus(GetDlgItem(hDlgWnd, IDC_EDIT_COMMENT));
1211     SetDlgTexts(hDlgWnd, TextInfos, _countof(TextInfos), ts.UILanguageFile);
1212     return FALSE;
1213    
1214     case WM_COMMAND:
1215     switch (LOWORD(wp)) {
1216 zmatsuo 8901 case IDOK: {
1217 zmatsuo 8905 size_t len = _SendDlgItemMessageW(hDlgWnd, IDC_EDIT_COMMENT, WM_GETTEXTLENGTH, 0, 0);
1218     wchar_t *buf = (wchar_t *)malloc((len + 1) * sizeof(wchar_t));
1219     _GetDlgItemTextW(hDlgWnd, IDC_EDIT_COMMENT, buf, len);
1220     buf[len] = '\0'; // null-terminate
1221     FLogWriteStr(buf);
1222     FLogWriteStr(L"\n"); // TODO ���s�R�[�h
1223     free(buf);
1224 zmatsuo 8852 TTEndDialog(hDlgWnd, IDOK);
1225     break;
1226 zmatsuo 8901 }
1227 zmatsuo 8852 default:
1228     return FALSE;
1229     }
1230     break;
1231     case WM_CLOSE:
1232     TTEndDialog(hDlgWnd, 0);
1233     return TRUE;
1234    
1235     default:
1236     return FALSE;
1237     }
1238     return TRUE;
1239     }
1240    
1241 zmatsuo 8905 /**
1242     * ���O�t�@�C�����R�����g���������� (2004.8.6 yutaka)
1243     */
1244 zmatsuo 8858 void FLogAddCommentDlg(HINSTANCE hInst, HWND hWnd)
1245 zmatsuo 8852 {
1246 zmatsuo 8905 if (LogVar == NULL) {
1247     return;
1248     }
1249 zmatsuo 8852 TTDialogBox(hInst, MAKEINTRESOURCE(IDD_COMMENT_DIALOG),
1250     HVTWin, OnCommentDlgProc);
1251     }
1252    
1253 zmatsuo 8858 void FLogClose(void)
1254 zmatsuo 8852 {
1255 zmatsuo 8897 if (LogVar == NULL) {
1256     return;
1257     }
1258    
1259     FileTransEnd_();
1260 zmatsuo 8852 }
1261    
1262 zmatsuo 8897 /**
1263     * ���O���I�[�v������
1264     * @param[in] fname ���O�t�@�C����, CreateFile()���n������
1265     *
1266     * ���O�t�@�C������strftime���W�J�������s���������B
1267     * FLogGetLogFilename() �� FLogOpenDialog() ��
1268     * �t�@�C�����������������B
1269     */
1270 zmatsuo 8899 BOOL FLogOpen(const wchar_t *fname)
1271 zmatsuo 8852 {
1272     BOOL ret;
1273    
1274 zmatsuo 8894 if (LogVar != NULL) {
1275 zmatsuo 8852 return FALSE;
1276     }
1277 zmatsuo 8897 if ((FileLog) || (BinLog)) return FALSE;
1278 zmatsuo 8852
1279 zmatsuo 8897 //
1280     PFileVar fv = (PFileVar)malloc(sizeof(TFileVar));
1281     if (fv == NULL) {
1282     return FALSE;
1283     }
1284     LogVar = fv;
1285     memset(fv, 0, sizeof(TFileVar));
1286 zmatsuo 8901 fv->FileHandle = INVALID_HANDLE_VALUE;
1287     fv->LogThread = INVALID_HANDLE_VALUE;
1288     fv->eLineEnd = Line_LineHead;
1289 zmatsuo 8904 fv->log_code = 0; // UTF-8
1290 zmatsuo 8897
1291 zmatsuo 8901 ret = LogStart(fname);
1292     if (ret == FALSE) {
1293     FileTransEnd_();
1294     }
1295 zmatsuo 8897
1296 zmatsuo 8852 return ret;
1297     }
1298    
1299 zmatsuo 8858 BOOL FLogIsOpend(void)
1300 zmatsuo 8852 {
1301     return LogVar != NULL;
1302     }
1303    
1304 zmatsuo 8904 BOOL FLogIsOpendText(void)
1305     {
1306     return LogVar != NULL && FileLog;
1307     }
1308    
1309     BOOL FLogIsOpendBin(void)
1310     {
1311     return LogVar != NULL && BinLog;
1312     }
1313    
1314 zmatsuo 8905 void FLogWriteStr(const wchar_t *str)
1315 zmatsuo 8852 {
1316 zmatsuo 8905 if (LogVar != NULL) {
1317 zmatsuo 8852 DWORD wrote;
1318 zmatsuo 8905 size_t len = wcslen(str) * sizeof(wchar_t);
1319     logfile_lock();
1320 zmatsuo 8852 WriteFile(LogVar->FileHandle, str, len, &wrote, NULL);
1321 zmatsuo 8905 LogVar->eLineEnd = Line_LineHead;
1322     logfile_unlock();
1323 zmatsuo 8852 LogVar->ByteCount =
1324     LogVar->ByteCount + len;
1325 zmatsuo 8901 LogVar->FLogDlg->RefreshNum(LogVar->StartTime, LogVar->FileSize, LogVar->ByteCount);
1326 zmatsuo 8852 }
1327     }
1328    
1329 zmatsuo 8858 void FLogInfo(char *param_ptr, size_t param_len)
1330 zmatsuo 8852 {
1331     if (LogVar) {
1332     param_ptr[0] = '0'
1333     + (ts.LogBinary != 0)
1334     + ((ts.Append != 0) << 1)
1335     + ((ts.LogTypePlainText != 0) << 2)
1336     + ((ts.LogTimestamp != 0) << 3)
1337     + ((ts.LogHideDialog != 0) << 4);
1338 zmatsuo 8899 char *filenameU8 = ToU8W(LogVar->FullName);
1339     strncpy_s(param_ptr + 1, param_len - 1, filenameU8, _TRUNCATE);
1340     free(filenameU8);
1341 zmatsuo 8852 }
1342     else {
1343     param_ptr[0] = '0' - 1;
1344     param_ptr[1] = 0;
1345     }
1346     }
1347    
1348     /**
1349     * ���������O�t�@�C����������
1350     */
1351 zmatsuo 8899 const wchar_t *FLogGetFilename(void)
1352 zmatsuo 8852 {
1353     if (LogVar == NULL) {
1354     return NULL;
1355     }
1356     return LogVar->FullName;
1357     }
1358    
1359     /**
1360     * ���O�_�C�A���O���J��
1361 zmatsuo 8863 * @param[in,out] info.filename �t�@�C���������l
1362     * OK���A�t�@�C�����A�s�v����������free()��������
1363 zmatsuo 8852 * @retval TRUE [ok] ����������
1364     * @retval FALSE �L�����Z��������
1365     */
1366 zmatsuo 8863 BOOL FLogOpenDialog(HINSTANCE hInst, HWND hWnd, FLogDlgInfo_t *info)
1367 zmatsuo 8852 {
1368 zmatsuo 8863 LogDlgWork_t *work = (LogDlgWork_t *)calloc(sizeof(LogDlgWork_t), 1);
1369 zmatsuo 8899 wchar_t *srcfnameW = FLogGetLogFilename(info->filename);
1370 zmatsuo 8863 work->info = info;
1371     work->info->filename = srcfnameW;
1372     work->pts = &ts;
1373 zmatsuo 8852 INT_PTR ret = TTDialogBoxParam(
1374     hInst, MAKEINTRESOURCE(IDD_LOGDLG),
1375 zmatsuo 8863 hWnd, LogFnHook, (LPARAM)work);
1376     free(srcfnameW);
1377     free(work);
1378 zmatsuo 8852 return ret == IDOK ? TRUE : FALSE;
1379     }
1380    
1381     /**
1382     * ���O�t�@�C����������
1383     * ���O�t�@�C�����p���C�����s��
1384     * - strftime() ���������t�W�J
1385     * - �������������O�t�@�C���t�H���_������
1386     * - �z�X�g��,�|�[�g�����W�J
1387     *
1388     * @param[in] log_filename �t�@�C����(����/��������������ok)
1389     * NULL�������f�t�H���g�t�@�C����������
1390     * strftime�`��ok
1391     * @return �t���p�X�t�@�C����
1392     * �s�v���������� free() ��������
1393     */
1394 zmatsuo 8899 wchar_t *FLogGetLogFilename(const wchar_t *log_filename)
1395 zmatsuo 8852 {
1396     // �t�H���_
1397     char FileDirExpanded[MAX_PATH];
1398 zmatsuo 8899 const char *logdir;
1399 zmatsuo 8852 if (strlen(ts.LogDefaultPath) > 0) {
1400     logdir = ts.LogDefaultPath;
1401     }
1402     else if (strlen(ts.FileDir) > 0) {
1403     ExpandEnvironmentStrings(ts.FileDir, FileDirExpanded, sizeof(FileDirExpanded));
1404     logdir = FileDirExpanded;
1405     }
1406     else {
1407     logdir = ts.HomeDir;
1408     }
1409    
1410     // ���������t�@�C����
1411     char base_name[MAX_PATH];
1412     if (log_filename == NULL) {
1413     strncpy_s(base_name, _countof(base_name), ts.LogDefaultName, _TRUNCATE);
1414     }
1415     else {
1416 zmatsuo 8899 char *filenameA = ToCharW(log_filename);
1417     strncpy_s(base_name, _countof(base_name), filenameA, _TRUNCATE);
1418     free(filenameA);
1419 zmatsuo 8852 }
1420    
1421     // �t���p�X��
1422     char full_path[MAX_PATH];
1423     ConvFName(logdir, base_name, sizeof(base_name), "", full_path, sizeof(full_path));
1424     ParseStrftimeFileName(full_path, sizeof(full_path));
1425     ConvertLogname(full_path, sizeof(full_path));
1426    
1427 zmatsuo 8899 return ToWcharA(full_path);
1428 zmatsuo 8852 }
1429 zmatsuo 8857
1430     BOOL FLogIsPause()
1431     {
1432 zmatsuo 8900 if (LogVar == NULL) {
1433     return FALSE;
1434     }
1435     return LogVar->IsPause;
1436 zmatsuo 8857 }
1437    
1438     void FLogWindow(int nCmdShow)
1439     {
1440 zmatsuo 8900 if (LogVar == NULL) {
1441     return;
1442     }
1443 zmatsuo 8857
1444 zmatsuo 8901 HWND HWndLog = LogVar->FLogDlg->m_hWnd;
1445 zmatsuo 8857 ShowWindow(HWndLog, nCmdShow);
1446     if (nCmdShow == SW_RESTORE) {
1447     // �g���X�^�C�� WS_EX_NOACTIVATE ��������������
1448     SetForegroundWindow(HWndLog);
1449     }
1450     }
1451    
1452     void FLogShowDlg(void)
1453     {
1454 zmatsuo 8900 if (LogVar == NULL) {
1455     return;
1456     }
1457 zmatsuo 8901 HWND HWndLog = LogVar->FLogDlg->m_hWnd;
1458     ShowWindow(HWndLog, SW_SHOWNORMAL);
1459     SetForegroundWindow(HWndLog);
1460 zmatsuo 8857 }
1461 zmatsuo 8897
1462     /**
1463     * ���O��1byte��������
1464     * LogPut1() ������?
1465     */
1466     //void Log1Bin(PComVar cv, BYTE b)
1467     static void Log1Bin(BYTE b)
1468     {
1469 zmatsuo 8900 if (LogVar->IsPause || cv.ProtoFlag) {
1470 zmatsuo 8897 return;
1471     }
1472 zmatsuo 8906 if (cv_BinSkip > 0) {
1473     cv_BinSkip--;
1474 zmatsuo 8897 return;
1475     }
1476 zmatsuo 8906 cv_BinBuf[cv_BinPtr] = b;
1477     cv_BinPtr++;
1478     if (cv_BinPtr>=InBuffSize) {
1479     cv_BinPtr = cv_BinPtr-InBuffSize;
1480 zmatsuo 8897 }
1481 zmatsuo 8906 if (cv_BCount>=InBuffSize) {
1482     cv_BCount = InBuffSize;
1483     cv_BStart = cv_BinPtr;
1484 zmatsuo 8897 }
1485     else {
1486 zmatsuo 8906 cv_BCount++;
1487 zmatsuo 8897 }
1488     }
1489    
1490     static void LogBinSkip(int add)
1491     {
1492 zmatsuo 8906 if (cv_BinBuf != NULL) {
1493     cv_BinSkip += add;
1494 zmatsuo 8897 }
1495     }
1496    
1497     /**
1498     * ���O�o�b�t�@���������������f�[�^���o�C�g��������
1499     */
1500     int FLogGetCount(void)
1501     {
1502     if (FileLog) {
1503 zmatsuo 8906 return cv_LCount;
1504 zmatsuo 8897 }
1505     if (BinLog) {
1506 zmatsuo 8906 return cv_BCount;
1507 zmatsuo 8897 }
1508     return 0;
1509     }
1510    
1511     /**
1512 zmatsuo 8906 * ���O�o�b�t�@�������o�C�g��������
1513     */
1514     int FLogGetFreeCount(void)
1515     {
1516     if (FileLog) {
1517     return InBuffSize - cv_LCount;
1518     }
1519     if (BinLog) {
1520     return InBuffSize - cv_BCount;
1521     }
1522     return 0;
1523     }
1524    
1525     /**
1526 zmatsuo 8897 * �o�b�t�@�������O���t�@�C������������
1527     */
1528     void FLogWriteFile(void)
1529     {
1530 zmatsuo 8906 if (cv_LogBuf!=NULL)
1531 zmatsuo 8897 {
1532     if (FileLog) {
1533     LogToFile();
1534     }
1535     }
1536    
1537 zmatsuo 8906 if (cv_BinBuf!=NULL)
1538 zmatsuo 8897 {
1539     if (BinLog) {
1540     LogToFile();
1541     }
1542 zmatsuo 8906 // GlobalUnlock(cv_HBinBuf);
1543     // cv_BinBuf = NULL;
1544 zmatsuo 8897 }
1545     }
1546 zmatsuo 8904
1547     void FLogPutUTF32(unsigned int u32)
1548     {
1549     PFileVar fv = LogVar;
1550     size_t i;
1551 zmatsuo 8906 BOOL log_available = (cv_LogBuf != 0);
1552 zmatsuo 8904
1553     if (!log_available) {
1554 zmatsuo 8905 // ���O�����o��������
1555 zmatsuo 8904 return;
1556     }
1557    
1558     switch(fv->log_code) {
1559     case 0: {
1560     // UTF-8
1561     char u8_buf[4];
1562     size_t u8_len = UTF32ToUTF8(u32, u8_buf, _countof(u8_buf));
1563     for (i = 0; i < u8_len; i++) {
1564     BYTE b = u8_buf[i];
1565     LogPut1(b);
1566     }
1567     break;
1568     }
1569     case 1:
1570     case 2: {
1571     // UTF-16
1572     wchar_t u16[2];
1573     size_t u16_len = UTF32ToUTF16(u32, u16, _countof(u16));
1574     size_t i;
1575     for (i = 0; i < u16_len; i++) {
1576     if (fv->log_code == 1) {
1577     // UTF-16LE
1578     LogPut1(u16[i] & 0xff);
1579     LogPut1((u16[i] >> 8) & 0xff);
1580     }
1581     else {
1582     // UTF-16BE
1583     LogPut1((u16[i] >> 8) & 0xff);
1584     LogPut1(u16[i] & 0xff);
1585     }
1586     }
1587     }
1588     }
1589     }
1590    
1591     void FLogOutputBOM(void)
1592     {
1593     PFileVar fv = LogVar;
1594    
1595     switch(fv->log_code) {
1596     case 0:
1597     // UTF-8
1598     LogPut1(0xef);
1599     LogPut1(0xbb);
1600     LogPut1(0xbf);
1601     break;
1602     case 1:
1603     // UTF-16LE
1604     LogPut1(0xfe);
1605     LogPut1(0xff);
1606     break;
1607     case 2:
1608     // UTF-16BE
1609     LogPut1(0xff);
1610     LogPut1(0xfe);
1611     break;
1612     default:
1613     break;
1614     }
1615     }
1616    
1617     void FLogSetCode(int code)
1618     {
1619     PFileVar fv = LogVar;
1620     fv->log_code = code;
1621     }

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