Develop and Download Open Source Software

Browse Subversion Repository

Contents of /trunk/teraterm/teraterm/filesys_log.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 6493 - (show annotations) (download) (as text)
Mon Sep 26 12:41:17 2016 UTC (7 years, 6 months ago) by yutakapon
Original Path: trunk/teraterm/teraterm/filesys.cpp
File MIME type: text/x-c++src
File size: 45372 byte(s)
チケット #36655 ログファイルオープンエラー

LogRotate 処理へのイベントオブジェクト追加漏れを修正した。



1 /* Tera Term
2 Copyright(C) 1994-1998 T. Teranishi
3 All rights reserved. */
4
5 /* TERATERM.EXE, file transfer routines */
6 #include "stdafx.h"
7 #include "teraterm.h"
8 #include "tttypes.h"
9 #include "ttftypes.h"
10 #include "tt_res.h"
11 #include "ftdlg.h"
12 #include "protodlg.h"
13 #include "ttwinman.h"
14 #include "commlib.h"
15 #include "ttcommon.h"
16 #include "ttdde.h"
17 #include "ttlib.h"
18 #include "helpid.h"
19 #include "dlglib.h"
20 #include "vtterm.h"
21
22 #include "filesys.h"
23 #include "ftlib.h"
24
25 #include "buffer.h"
26
27 #include <io.h>
28 #include <process.h>
29
30 #define FS_BRACKET_NONE 0
31 #define FS_BRACKET_START 1
32 #define FS_BRACKET_END 2
33
34 PFileVar LogVar = NULL;
35 PFileVar SendVar = NULL;
36 PFileVar FileVar = NULL;
37 static PCHAR ProtoVar = NULL;
38 static int ProtoId;
39
40 static BYTE LogLast = 0;
41 BOOL FileLog = FALSE;
42 BOOL BinLog = FALSE;
43 BOOL DDELog = FALSE;
44 static BOOL FileRetrySend, FileRetryEcho, FileCRSend, FileReadEOF, BinaryMode;
45 static BYTE FileByte;
46
47 #define FILE_SEND_BUF_SIZE 8192
48 struct FileSendHandler {
49 CHAR buf[FILE_SEND_BUF_SIZE];
50 int pos;
51 int end;
52 };
53 static struct FileSendHandler FileSendHandler;
54 static int FileDlgRefresh;
55
56 static int FileBracketMode = FS_BRACKET_NONE;
57 static int FileBracketPtr = 0;
58 static char BracketStartStr[] = "\033[200~";
59 static char BracketEndStr[] = "\033[201~";
60
61 static BOOL FSend = FALSE;
62
63 HWND HWndLog = NULL; //steven add
64
65 static HMODULE HTTFILE = NULL;
66 static int TTFILECount = 0;
67
68 PGetSetupFname GetSetupFname;
69 PGetTransFname GetTransFname;
70 PGetMultiFname GetMultiFname;
71 PGetGetFname GetGetFname;
72 PSetFileVar SetFileVar;
73 PGetXFname GetXFname;
74 PProtoInit ProtoInit;
75 PProtoParse ProtoParse;
76 PProtoTimeOutProc ProtoTimeOutProc;
77 PProtoCancel ProtoCancel;
78
79 #define IdGetSetupFname 1
80 #define IdGetTransFname 2
81 #define IdGetMultiFname 3
82 #define IdGetGetFname 4
83 #define IdSetFileVar 5
84 #define IdGetXFname 6
85
86 #define IdProtoInit 7
87 #define IdProtoParse 8
88 #define IdProtoTimeOutProc 9
89 #define IdProtoCancel 10
90
91 /*
92 Line Head flag for timestamping
93 2007.05.24 Gentaro
94 */
95 enum enumLineEnd {
96 Line_Other = 0,
97 Line_LineHead = 1,
98 Line_FileHead = 2,
99 };
100
101 enum enumLineEnd eLineEnd = Line_LineHead;
102
103
104 // �x�����������p�X���b�h�����b�Z�[�W
105 #define WM_DPC_LOGTHREAD_SEND (WM_APP + 1)
106
107 static void CloseFileSync(PFileVar ptr);
108
109
110 BOOL LoadTTFILE()
111 {
112 BOOL Err;
113
114 if (HTTFILE != NULL)
115 {
116 TTFILECount++;
117 return TRUE;
118 }
119 else
120 TTFILECount = 0;
121
122 HTTFILE = LoadLibrary("TTPFILE.DLL");
123 if (HTTFILE == NULL)
124 return FALSE;
125
126 TTFILESetUILanguageFile(ts.UILanguageFile);
127 TTFILESetFileSendFilter(ts.FileSendFilter);
128
129 Err = FALSE;
130 GetSetupFname = (PGetSetupFname)GetProcAddress(HTTFILE,
131 MAKEINTRESOURCE(IdGetSetupFname));
132 if (GetSetupFname==NULL)
133 Err = TRUE;
134
135 GetTransFname = (PGetTransFname)GetProcAddress(HTTFILE,
136 MAKEINTRESOURCE(IdGetTransFname));
137 if (GetTransFname==NULL)
138 Err = TRUE;
139
140 GetMultiFname = (PGetMultiFname)GetProcAddress(HTTFILE,
141 MAKEINTRESOURCE(IdGetMultiFname));
142 if (GetMultiFname==NULL)
143 Err = TRUE;
144
145 GetGetFname = (PGetGetFname)GetProcAddress(HTTFILE,
146 MAKEINTRESOURCE(IdGetGetFname));
147 if (GetGetFname==NULL)
148 Err = TRUE;
149
150 SetFileVar = (PSetFileVar)GetProcAddress(HTTFILE,
151 MAKEINTRESOURCE(IdSetFileVar));
152 if (SetFileVar==NULL)
153 Err = TRUE;
154
155 GetXFname = (PGetXFname)GetProcAddress(HTTFILE,
156 MAKEINTRESOURCE(IdGetXFname));
157 if (GetXFname==NULL)
158 Err = TRUE;
159
160 ProtoInit = (PProtoInit)GetProcAddress(HTTFILE,
161 MAKEINTRESOURCE(IdProtoInit));
162 if (ProtoInit==NULL)
163 Err = TRUE;
164
165 ProtoParse = (PProtoParse)GetProcAddress(HTTFILE,
166 MAKEINTRESOURCE(IdProtoParse));
167 if (ProtoParse==NULL)
168 Err = TRUE;
169
170 ProtoTimeOutProc = (PProtoTimeOutProc)GetProcAddress(HTTFILE,
171 MAKEINTRESOURCE(IdProtoTimeOutProc));
172 if (ProtoTimeOutProc==NULL)
173 Err = TRUE;
174
175 ProtoCancel = (PProtoCancel)GetProcAddress(HTTFILE,
176 MAKEINTRESOURCE(IdProtoCancel));
177 if (ProtoCancel==NULL)
178 Err = TRUE;
179
180 if (Err)
181 {
182 FreeLibrary(HTTFILE);
183 HTTFILE = NULL;
184 return FALSE;
185 }
186 else {
187 TTFILECount = 1;
188 return TRUE;
189 }
190 }
191
192 BOOL FreeTTFILE()
193 {
194 if (TTFILECount==0)
195 return FALSE;
196 TTFILECount--;
197 if (TTFILECount>0)
198 return TRUE;
199 if (HTTFILE!=NULL)
200 {
201 FreeLibrary(HTTFILE);
202 HTTFILE = NULL;
203 }
204 return TRUE;
205 }
206
207 static PFileTransDlg FLogDlg = NULL;
208 static PFileTransDlg SendDlg = NULL;
209 static PProtoDlg PtDlg = NULL;
210
211 BOOL OpenFTDlg(PFileVar fv)
212 {
213 PFileTransDlg FTDlg;
214 HWND HFTDlg;
215 char uimsg[MAX_UIMSG];
216
217 FTDlg = new CFileTransDlg();
218
219 fv->StartTime = 0;
220 fv->ProgStat = 0;
221
222 if (fv->OpId != OpLog) {
223 fv->HideDialog = ts.FTHideDialog;
224 }
225
226 if (FTDlg!=NULL)
227 {
228 FTDlg->Create(fv, &cv, &ts);
229 FTDlg->RefreshNum();
230 if (fv->OpId == OpLog) {
231 HWndLog = FTDlg->m_hWnd; // steven add
232 }
233 }
234
235 if (fv->OpId==OpLog)
236 FLogDlg = FTDlg; /* Log */
237 else
238 SendDlg = FTDlg; /* File send */
239
240 HFTDlg=FTDlg->GetSafeHwnd();
241
242 GetDlgItemText(HFTDlg, IDC_TRANS_FILENAME, uimsg, sizeof(uimsg));
243 get_lang_msg("DLG_FILETRANS_FILENAME", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
244 SetDlgItemText(HFTDlg, IDC_TRANS_FILENAME, ts.UIMsg);
245 GetDlgItemText(HFTDlg, IDC_FULLPATH_LABEL, uimsg, sizeof(uimsg));
246 get_lang_msg("DLG_FILETRANS_FULLPATH", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
247 SetDlgItemText(HFTDlg, IDC_FULLPATH_LABEL, ts.UIMsg);
248 GetDlgItemText(HFTDlg, IDC_TRANS_TRANS, uimsg, sizeof(uimsg));
249 get_lang_msg("DLG_FILETRANS_TRNAS", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
250 SetDlgItemText(HFTDlg, IDC_TRANS_TRANS, ts.UIMsg);
251 GetDlgItemText(HFTDlg, IDC_TRANS_ELAPSED, uimsg, sizeof(uimsg));
252 get_lang_msg("DLG_FILETRANS_ELAPSED", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
253 SetDlgItemText(HFTDlg, IDC_TRANS_ELAPSED, ts.UIMsg);
254 GetDlgItemText(HFTDlg, IDCANCEL, uimsg, sizeof(uimsg));
255 get_lang_msg("DLG_FILETRANS_CLOSE", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
256 SetDlgItemText(HFTDlg, IDCANCEL, ts.UIMsg);
257 GetDlgItemText(HFTDlg, IDC_TRANSPAUSESTART, uimsg, sizeof(uimsg));
258 get_lang_msg("DLG_FILETRANS_PAUSE", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
259 SetDlgItemText(HFTDlg, IDC_TRANSPAUSESTART, ts.UIMsg);
260 GetDlgItemText(HFTDlg, IDC_TRANSHELP, uimsg, sizeof(uimsg));
261 get_lang_msg("BTN_HELP", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
262 SetDlgItemText(HFTDlg, IDC_TRANSHELP, ts.UIMsg);
263
264 if (fv->OpId == OpSendFile) {
265 fv->StartTime = GetTickCount();
266 InitDlgProgress(HFTDlg, IDC_TRANSPROGRESS, &fv->ProgStat);
267 ShowWindow(GetDlgItem(HFTDlg, IDC_TRANS_ELAPSED), SW_SHOW);
268 }
269
270 return (FTDlg!=NULL);
271 }
272
273 void ShowFTDlg(WORD OpId)
274 {
275 if (OpId == OpLog) {
276 if (FLogDlg != NULL) {
277 FLogDlg->ShowWindow(SW_SHOWNORMAL);
278 SetForegroundWindow(FLogDlg->GetSafeHwnd());
279 }
280 }
281 else {
282 if (SendDlg != NULL) {
283 SendDlg->ShowWindow(SW_SHOWNORMAL);
284 SetForegroundWindow(SendDlg->GetSafeHwnd());
285 }
286 }
287 }
288
289 BOOL NewFileVar(PFileVar *fv)
290 {
291 if ((*fv)==NULL)
292 {
293 *fv = (PFileVar)malloc(sizeof(TFileVar));
294 if ((*fv)!=NULL)
295 {
296 memset(*fv, 0, sizeof(TFileVar));
297 strncpy_s((*fv)->FullName, sizeof((*fv)->FullName),ts.FileDir, _TRUNCATE);
298 AppendSlash((*fv)->FullName,sizeof((*fv)->FullName));
299 (*fv)->DirLen = strlen((*fv)->FullName);
300 (*fv)->FileOpen = FALSE;
301 (*fv)->OverWrite = ((ts.FTFlag & FT_RENAME) == 0);
302 (*fv)->HMainWin = HVTWin;
303 (*fv)->Success = FALSE;
304 (*fv)->NoMsg = FALSE;
305 (*fv)->HideDialog = FALSE;
306 }
307 }
308
309 return ((*fv)!=NULL);
310 }
311
312 void FreeFileVar(PFileVar *fv)
313 {
314 if ((*fv)!=NULL)
315 {
316 CloseFileSync(*fv);
317 //if ((*fv)->FileOpen) _lclose((*fv)->FileHandle);
318 if ((*fv)->FnStrMemHandle>0)
319 {
320 GlobalUnlock((*fv)->FnStrMemHandle);
321 GlobalFree((*fv)->FnStrMemHandle);
322 }
323 free(*fv);
324 *fv = NULL;
325 }
326 }
327
328 // &h ���z�X�g�����u�� (2007.5.14)
329 // &p ��TCP�|�[�g�������u�� (2009.6.12)
330 void ConvertLogname(char *c, int destlen)
331 {
332 char buf[MAXPATHLEN], buf2[MAXPATHLEN], *p = c;
333 char tmphost[1024];
334
335 memset(buf, 0, sizeof(buf));
336
337 while(*p != '\0') {
338 if (*p == '&' && *(p+1) != '\0') {
339 switch (*(p+1)) {
340 case 'h':
341 if (cv.Open) {
342 if (cv.PortType == IdTCPIP) {
343 // �z�X�g����IPv6�A�h���X�����A�t�@�C�������g�p�����������������������A
344 // �]�v�����������������B
345 // (2013.3.9 yutaka)
346 strncpy_s(tmphost, sizeof(tmphost), ts.HostName, _TRUNCATE);
347 //strncpy_s(tmphost, sizeof(tmphost), "2001:0db8:bd05:01d2:288a:1fc0:0001:10ee", _TRUNCATE);
348 replaceInvalidFileNameChar(tmphost, '_');
349 strncat_s(buf,sizeof(buf), tmphost, _TRUNCATE);
350 }
351 else if (cv.PortType == IdSerial) {
352 strncpy_s(buf2,sizeof(buf2),buf,_TRUNCATE);
353 _snprintf_s(buf, sizeof(buf), _TRUNCATE, "%sCOM%d", buf2, ts.ComPort);
354 }
355 }
356 break;
357 case 'p':
358 if (cv.Open) {
359 if (cv.PortType == IdTCPIP) {
360 char port[6];
361 _snprintf_s(port, sizeof(port), _TRUNCATE, "%d", ts.TCPPort);
362 strncat_s(buf,sizeof(buf),port,_TRUNCATE);
363 }
364 }
365 break;
366 default:
367 strncpy_s(buf2,sizeof(buf2),p,2);
368 strncat_s(buf,sizeof(buf),buf2,_TRUNCATE);
369 }
370 p++;
371 }
372 else {
373 strncpy_s(buf2,sizeof(buf2),p,1);
374 strncat_s(buf,sizeof(buf),buf2,_TRUNCATE);
375 }
376 p++;
377 }
378 strncpy_s(c, destlen, buf, _TRUNCATE);
379 }
380
381 void FixLogOption()
382 {
383 if (ts.LogBinary) {
384 ts.LogTypePlainText = false;
385 ts.LogTimestamp = false;
386 }
387 }
388
389
390 // �X���b�h���I�����t�@�C�����N���[�Y
391 static void CloseFileSync(PFileVar ptr)
392 {
393 BOOL ret;
394 DWORD code;
395
396 if (!ptr->FileOpen)
397 return;
398
399 if (ptr->LogThread != (HANDLE)-1) {
400 // �X���b�h���I������
401 ret = PostThreadMessage(ptr->LogThreadId, WM_QUIT, 0, 0);
402 if (ret != 0) {
403 // �X���b�h�L���[���G���L���[���������������������������s���B
404 WaitForSingleObject(ptr->LogThread, INFINITE);
405 }
406 else {
407 code = GetLastError();
408 }
409 CloseHandle(ptr->LogThread);
410 ptr->LogThread = (HANDLE)-1;
411 }
412 #ifdef FileVarWin16
413 _lclose(ptr->FileHandle);
414 #else
415 CloseHandle((HANDLE)ptr->FileHandle);
416 #endif
417 }
418
419 // �x�����������p�X���b�h
420 static unsigned _stdcall DeferredLogWriteThread(void *arg)
421 {
422 MSG msg;
423 PFileVar fv = (PFileVar)arg;
424 PCHAR buf;
425 DWORD buflen;
426 DWORD wrote;
427
428 PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE);
429
430 // �X���b�h�L���[���������I�������������X���b�h�����������m�����B
431 if (fv->LogThreadEvent != NULL) {
432 SetEvent(fv->LogThreadEvent);
433 }
434
435 while (GetMessage(&msg, NULL, 0, 0) > 0) {
436 switch (msg.message) {
437 case WM_DPC_LOGTHREAD_SEND:
438 buf = (PCHAR)msg.wParam;
439 buflen = (DWORD)msg.lParam;
440 #ifdef FileVarWin16
441 _lwrite(fv->FileHandle, buf, buflen );
442 #else
443 WriteFile((HANDLE)LogVar->FileHandle, buf, buflen, &wrote, NULL);
444 #endif
445 free(buf); // ����������������
446 break;
447
448 case WM_QUIT:
449 goto end;
450 break;
451 }
452 }
453
454 end:
455 _endthreadex(0);
456 return (0);
457 }
458
459
460 extern "C" {
461 BOOL LogStart()
462 {
463 LONG Option;
464 char *logdir;
465 unsigned tid;
466 DWORD ofs, size, written_size;
467 char buf[512];
468 const char *crlf = "\r\n";
469 DWORD crlf_len = 2;
470
471 if ((FileLog) || (BinLog)) return FALSE;
472
473 if (! LoadTTFILE()) return FALSE;
474 if (! NewFileVar(&LogVar))
475 {
476 FreeTTFILE();
477 return FALSE;
478 }
479 LogVar->OpId = OpLog;
480
481 if (strlen(ts.LogDefaultPath) > 0) {
482 logdir = ts.LogDefaultPath;
483 }
484 else if (strlen(ts.FileDir) > 0) {
485 logdir = ts.FileDir;
486 }
487 else {
488 logdir = ts.HomeDir;
489 }
490
491 if (strlen(&(LogVar->FullName[LogVar->DirLen]))==0)
492 {
493 // LOWORD
494 // 0x0001 = Binary
495 // HIWORD
496 // 0x0001 = Append
497 // 0x1000 = plain text (2005.2.20 yutaka)
498 // 0x2000 = timestamp (2006.7.23 maya)
499 // 0x4000 = hide file transfer dialog (2008.1.30 maya)
500 // 0x8000 = Include screen buffer (2013.9.29 yutaka)
501 // teraterm.ini�����������������f�t�H���g�I�v�V�������������B(2005.5.7 yutaka)
502 Option = MAKELONG(ts.LogBinary,
503 ts.Append |
504 (0x1000 * ts.LogTypePlainText) |
505 (0x2000 * ts.LogTimestamp) |
506 (0x4000 * ts.LogHideDialog) |
507 (0x8000 * ts.LogAllBuffIncludedInFirst)
508 );
509
510 // ���O���f�t�H���g�t�@�C���������� (2006.8.28 maya)
511 strncat_s(LogVar->FullName, sizeof(LogVar->FullName), ts.LogDefaultName, _TRUNCATE);
512
513 ParseStrftimeFileName(LogVar->FullName, sizeof(LogVar->FullName));
514
515 // &h ���z�X�g�����u�� (2007.5.14)
516 ConvertLogname(LogVar->FullName, sizeof(LogVar->FullName));
517
518 strncpy_s(LogVar->LogDefaultPath, sizeof(LogVar->LogDefaultPath), ts.LogDefaultPath, _TRUNCATE);
519 if (! (*GetTransFname)(LogVar, logdir, GTF_LOG, &Option))
520 {
521 FreeFileVar(&LogVar);
522 FreeTTFILE();
523 return FALSE;
524 }
525 ts.LogBinary = LOWORD(Option);
526 ts.Append = HIWORD(Option);
527
528 if (ts.Append & 0x1000) {
529 ts.LogTypePlainText = 1;
530 } else {
531 ts.LogTypePlainText = 0;
532 }
533
534 if (ts.Append & 0x2000) {
535 ts.LogTimestamp = 1;
536 }
537 else {
538 ts.LogTimestamp = 0;
539 }
540
541 if (ts.Append & 0x4000) {
542 ts.LogHideDialog = 1;
543 }
544 else {
545 ts.LogHideDialog = 0;
546 }
547
548 if (ts.Append & 0x8000) {
549 ts.LogAllBuffIncludedInFirst = 1;
550 }
551 else {
552 ts.LogAllBuffIncludedInFirst = 0;
553 }
554
555 ts.Append &= 0x1; // 1bit���}�X�N����
556
557 }
558 else {
559 // LogVar->DirLen = 0 ��������������
560 // �t���p�X�E�����p�X������ LogVar->FullName �������������K�v������
561 char FileName[MAX_PATH];
562
563 // �t���p�X��
564 strncpy_s(FileName, sizeof(FileName), LogVar->FullName, _TRUNCATE);
565 ConvFName(logdir,FileName,sizeof(FileName),"",LogVar->FullName,sizeof(LogVar->FullName));
566
567 ParseStrftimeFileName(LogVar->FullName, sizeof(LogVar->FullName));
568
569 // &h ���z�X�g�����u�� (2007.5.14)
570 ConvertLogname(LogVar->FullName, sizeof(LogVar->FullName));
571 (*SetFileVar)(LogVar);
572
573 FixLogOption();
574 }
575
576 if (ts.LogBinary > 0)
577 {
578 BinLog = TRUE;
579 FileLog = FALSE;
580 if (! CreateBinBuf())
581 {
582 FileTransEnd(OpLog);
583 return FALSE;
584 }
585 }
586 else {
587 BinLog = FALSE;
588 FileLog = TRUE;
589 if (! CreateLogBuf())
590 {
591 FileTransEnd(OpLog);
592 return FALSE;
593 }
594 }
595 cv.LStart = cv.LogPtr;
596 cv.LCount = 0;
597 if (ts.LogHideDialog)
598 LogVar->HideDialog = 1;
599
600 HelpId = HlpFileLog;
601 /* 2007.05.24 Gentaro */
602 eLineEnd = Line_LineHead;
603
604 if (ts.Append > 0)
605 {
606 int dwShareMode = FILE_SHARE_READ;
607 if (!ts.LogLockExclusive) {
608 dwShareMode = FILE_SHARE_READ | FILE_SHARE_WRITE;
609 }
610 LogVar->FileHandle = (int)CreateFile(LogVar->FullName, GENERIC_WRITE, dwShareMode, NULL,
611 OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
612 if (LogVar->FileHandle>0){
613 #ifdef FileVarWin16
614 _llseek(LogVar->FileHandle,0,2);
615 #else
616 SetFilePointer((HANDLE)LogVar->FileHandle, 0, NULL, FILE_END);
617 #endif
618 /* 2007.05.24 Gentaro
619 If log file already exists,
620 a newline is inserted before the first timestamp.
621 */
622 eLineEnd = Line_FileHead;
623 }
624 }
625 else {
626 int dwShareMode = FILE_SHARE_READ;
627 if (!ts.LogLockExclusive) {
628 dwShareMode = FILE_SHARE_READ | FILE_SHARE_WRITE;
629 }
630 LogVar->FileHandle = (int)CreateFile(LogVar->FullName, GENERIC_WRITE, dwShareMode, NULL,
631 CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
632 }
633 LogVar->FileOpen = (LogVar->FileHandle>0);
634 if (! LogVar->FileOpen)
635 {
636 char msg[128];
637
638 // �t�@�C���I�[�v���G���[�������b�Z�[�W�\�������������B(2008.7.9 yutaka)
639 if (LogVar->NoMsg == FALSE) {
640 _snprintf_s(msg, sizeof(msg), _TRUNCATE, "Can not create a `%s' file. (%d)", LogVar->FullName, GetLastError());
641 MessageBox(NULL, msg, "Tera Term: File open error", MB_OK | MB_ICONERROR);
642 }
643
644 FileTransEnd(OpLog);
645 return FALSE;
646 }
647 LogVar->ByteCount = 0;
648
649 // Log rotate configuration
650 LogVar->RotateMode = ts.LogRotate;
651 LogVar->RotateSize = ts.LogRotateSize;
652 LogVar->RotateStep = ts.LogRotateStep;
653
654 // Log rotate���L���������A�����t�@�C���T�C�Y�����������B
655 // �������t�@�C�������������T�C�Y�����[�e�[�g�������������C���B
656 // (2016.4.9 yutaka)
657 if (LogVar->RotateMode != ROTATE_NONE) {
658 size = GetFileSize((HANDLE)LogVar->FileHandle, NULL);
659 if (size != -1)
660 LogVar->ByteCount = size;
661 }
662
663 if (! OpenFTDlg(LogVar)) {
664 FileTransEnd(OpLog);
665 return FALSE;
666 }
667
668 // �x�����������p�X���b�h���N�����B
669 // (2013.4.19 yutaka)
670 // DeferredLogWriteThread �X���b�h���N�������A�X���b�h�L���[�����������������O���A
671 // ���O�t�@�C�����N���[�Y(CloseFileSync)���s���������A�G���L���[�����s���A�f�b�h���b�N
672 // �����������������C�������B
673 // �X���b�h�����������s�������A���O�����C�x���g�I�u�W�F�N�g���g�����A�X���b�h�L���[��
674 // ���������������������������������B���O�t���C�x���g�I�u�W�F�N�g���g���������A
675 // �V�X�e��(Windows OS)�������j�[�N�����O�������K�v�������B
676 // (2016.9.23 yutaka)
677 LogVar->LogThreadEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
678 LogVar->LogThread = (HANDLE)_beginthreadex(NULL, 0, DeferredLogWriteThread, LogVar, 0, &tid);
679 LogVar->LogThreadId = tid;
680 if (LogVar->LogThreadEvent != NULL) {
681 WaitForSingleObject(LogVar->LogThreadEvent, INFINITE);
682 CloseHandle(LogVar->LogThreadEvent);
683 }
684
685 // �����o�b�t�@�������f�[�^�������������o���������A
686 // ���O�������J�n�����B
687 // (2013.9.29 yutaka)
688 if (ts.LogAllBuffIncludedInFirst) {
689 for (ofs = 0 ; ; ofs++ ) {
690 // 1�����s�����������B���������������A�G�X�P�[�v�V�[�P���X�������������B
691 size = BuffGetAnyLineData(ofs, buf, sizeof(buf));
692 if (size == -1)
693 break;
694
695 #if 0
696 if (ts.DeferredLogWriteMode) { // �x����������
697 char *pbuf = (char *)malloc(size + 2);
698 memcpy(pbuf, buf, size);
699 pbuf[size] = '\r';
700 pbuf[size+1] = '\n';
701 Sleep(1); // �X���b�h�L���[�����������������A�R���e�L�X�g�X�C�b�`�������B
702 PostThreadMessage(LogVar->LogThreadId, WM_DPC_LOGTHREAD_SEND, (WPARAM)pbuf, size + 2);
703 } else { // �������B�l�b�g���[�N�o�R�����x���B
704 #endif
705 WriteFile((HANDLE)LogVar->FileHandle, buf, size, &written_size, NULL);
706 WriteFile((HANDLE)LogVar->FileHandle, crlf, crlf_len, &written_size, NULL);
707 #if 0
708 }
709 #endif
710 }
711 }
712
713 return TRUE;
714 }
715 }
716
717 void LogPut1(BYTE b)
718 {
719 LogLast = b;
720 cv.LogBuf[cv.LogPtr] = b;
721 cv.LogPtr++;
722 if (cv.LogPtr>=InBuffSize)
723 cv.LogPtr = cv.LogPtr-InBuffSize;
724
725 if (FileLog)
726 {
727 if (cv.LCount>=InBuffSize)
728 {
729 cv.LCount = InBuffSize;
730 cv.LStart = cv.LogPtr;
731 }
732 else
733 cv.LCount++;
734 }
735 else
736 cv.LCount = 0;
737
738 if (DDELog)
739 {
740 if (cv.DCount>=InBuffSize)
741 {
742 cv.DCount = InBuffSize;
743 cv.DStart = cv.LogPtr;
744 }
745 else
746 cv.DCount++;
747 }
748 else {
749 cv.DCount = 0;
750 // ���O���������}�N�����X�g�[���������������C���B
751 // ���O�����������x�}�N�����~�������A�o�b�t�@���C���f�b�N�X�������������������A
752 // ���x�}�N�������������������f�[�^�������������������B
753 // �}�N�������~���������������C���f�b�N�X�����������������������B
754 // (2006.12.26 yutaka)
755 cv.DStart = cv.LogPtr;
756 }
757 }
758
759 void Log1Byte(BYTE b)
760 {
761 if (b==0x0d)
762 {
763 LogLast = b;
764 return;
765 }
766 if ((b==0x0a) && (LogLast==0x0d))
767 LogPut1(0x0d);
768 LogPut1(b);
769 }
770
771 static BOOL Get1(PCHAR Buf, int *Start, int *Count, PBYTE b)
772 {
773 if (*Count<=0) return FALSE;
774 *b = Buf[*Start];
775 (*Start)++;
776 if (*Start>=InBuffSize)
777 *Start = *Start-InBuffSize;
778 (*Count)--;
779 return TRUE;
780 }
781
782
783
784 static CRITICAL_SECTION g_filelog_lock; /* ���b�N�p���� */
785
786 void logfile_lock_initialize(void)
787 {
788 InitializeCriticalSection(&g_filelog_lock);
789 }
790
791 static inline void logfile_lock(void)
792 {
793 EnterCriticalSection(&g_filelog_lock);
794 }
795
796 static inline void logfile_unlock(void)
797 {
798 LeaveCriticalSection(&g_filelog_lock);
799 }
800
801 // �R�����g�����O����������
802 void CommentLogToFile(char *buf, int size)
803 {
804 DWORD wrote;
805
806 if (LogVar == NULL || !LogVar->FileOpen) {
807 char uimsg[MAX_UIMSG];
808 get_lang_msg("MSG_ERROR", uimsg, sizeof(uimsg), "ERROR", ts.UILanguageFile);
809 get_lang_msg("MSG_COMMENT_LOG_OPEN_ERROR", ts.UIMsg, sizeof(ts.UIMsg),
810 "It is not opened by the log file yet.", ts.UILanguageFile);
811 ::MessageBox(NULL, ts.UIMsg, uimsg, MB_OK|MB_ICONEXCLAMATION);
812 return;
813 }
814
815 logfile_lock();
816 WriteFile((HANDLE)LogVar->FileHandle, buf, size, &wrote, NULL);
817 WriteFile((HANDLE)LogVar->FileHandle, "\r\n", 2, &wrote, NULL); // ���s
818 /* Set Line End Flag
819 2007.05.24 Gentaro
820 */
821 eLineEnd = Line_LineHead;
822 logfile_unlock();
823 }
824
825 // ���O�����[�e�[�g�����B
826 // (2013.3.21 yutaka)
827 static void LogRotate(void)
828 {
829 int loopmax = 10000; // XXX
830 char filename[1024];
831 char newfile[1024], oldfile[1024];
832 int i, k;
833 int dwShareMode = FILE_SHARE_READ;
834 unsigned tid;
835
836 if (! LogVar->FileOpen) return;
837
838 if (LogVar->RotateMode == ROTATE_NONE)
839 return;
840
841 if (LogVar->RotateMode == ROTATE_SIZE) {
842 if (LogVar->ByteCount <= LogVar->RotateSize)
843 return;
844 //OutputDebugPrintf("%s: mode %d size %ld\n", __FUNCTION__, LogVar->RotateMode, LogVar->ByteCount);
845 } else {
846 return;
847 }
848
849 logfile_lock();
850 // ���O�T�C�Y���������������B
851 LogVar->ByteCount = 0;
852
853 // �������������t�@�C�����N���[�Y�����A�������t�@�C�����I�[�v�������B
854 CloseFileSync(LogVar);
855 //_lclose(LogVar->FileHandle);
856
857 // �������[�e�[�V�������X�e�b�v�����w����������
858 if (LogVar->RotateStep > 0)
859 loopmax = LogVar->RotateStep;
860
861 for (i = 1 ; i <= loopmax ; i++) {
862 _snprintf_s(filename, sizeof(filename), _TRUNCATE, "%s.%d", LogVar->FullName, i);
863 if (_access_s(filename, 0) != 0)
864 break;
865 }
866 if (i > loopmax) {
867 // �������������������������A�������t�@�C�������p�������B
868 i = loopmax;
869 }
870
871 // ���t�@�C�������l�[���B
872 for (k = i-1 ; k >= 0 ; k--) {
873 if (k == 0)
874 strncpy_s(oldfile, sizeof(oldfile), LogVar->FullName, _TRUNCATE);
875 else
876 _snprintf_s(oldfile, sizeof(oldfile), _TRUNCATE, "%s.%d", LogVar->FullName, k);
877 _snprintf_s(newfile, sizeof(newfile), _TRUNCATE, "%s.%d", LogVar->FullName, k+1);
878 remove(newfile);
879 if (rename(oldfile, newfile) != 0) {
880 OutputDebugPrintf("%s: rename %d\n", __FUNCTION__, errno);
881 }
882 }
883
884 // ���I�[�v��
885 if (!ts.LogLockExclusive) {
886 dwShareMode = FILE_SHARE_READ | FILE_SHARE_WRITE;
887 }
888 LogVar->FileHandle = (int)CreateFile(LogVar->FullName, GENERIC_WRITE, dwShareMode, NULL,
889 CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
890
891 // �x�����������p�X���b�h���N�����B
892 // (2013.4.19 yutaka)
893 // DeferredLogWriteThread �X���b�h���N�������A�X���b�h�L���[�����������������O���A
894 // ���O�t�@�C�����N���[�Y(CloseFileSync)���s���������A�G���L���[�����s���A�f�b�h���b�N
895 // �����������������C�������B
896 // �X���b�h�����������s�������A���O�����C�x���g�I�u�W�F�N�g���g�����A�X���b�h�L���[��
897 // ���������������������������������B���O�t���C�x���g�I�u�W�F�N�g���g���������A
898 // �V�X�e��(Windows OS)�������j�[�N�����O�������K�v�������B
899 // (2016.9.26 yutaka)
900 LogVar->LogThreadEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
901 LogVar->LogThread = (HANDLE)_beginthreadex(NULL, 0, DeferredLogWriteThread, LogVar, 0, &tid);
902 LogVar->LogThreadId = tid;
903 if (LogVar->LogThreadEvent != NULL) {
904 WaitForSingleObject(LogVar->LogThreadEvent, INFINITE);
905 CloseHandle(LogVar->LogThreadEvent);
906 }
907
908 logfile_unlock();
909
910 }
911
912 void LogToFile()
913 {
914 PCHAR Buf;
915 int Start, Count;
916 BYTE b;
917 PCHAR WriteBuf;
918 DWORD WriteBufMax, WriteBufLen;
919 CHAR tmp[128];
920 DWORD wrote;
921
922 if (! LogVar->FileOpen) return;
923 if (FileLog)
924 {
925 Buf = cv.LogBuf;
926 Start = cv.LStart;
927 Count = cv.LCount;
928 }
929 else if (BinLog)
930 {
931 Buf = cv.BinBuf;
932 Start = cv.BStart;
933 Count = cv.BCount;
934 }
935 else
936 return;
937
938 if (Buf==NULL) return;
939 if (Count==0) return;
940
941 // ���b�N������(2004.8.6 yutaka)
942 logfile_lock();
943
944 if (ts.DeferredLogWriteMode) {
945 WriteBufMax = 8192;
946 WriteBufLen = 0;
947 WriteBuf = (PCHAR)malloc(WriteBufMax);
948 while (Get1(Buf,&Start,&Count,&b)) {
949 if (((cv.FilePause & OpLog)==0) && (! cv.ProtoFlag))
950 {
951 tmp[0] = 0;
952 if ( ts.LogTimestamp && eLineEnd ) {
953 char *strtime = mctimelocal();
954 /* 2007.05.24 Gentaro */
955 if( eLineEnd == Line_FileHead ){
956 strncat_s(tmp, sizeof(tmp), "\r\n", _TRUNCATE);
957 }
958 strncat_s(tmp, sizeof(tmp), "[", _TRUNCATE);
959 strncat_s(tmp, sizeof(tmp), strtime, _TRUNCATE);
960 strncat_s(tmp, sizeof(tmp), "] ", _TRUNCATE);
961 }
962
963 /* 2007.05.24 Gentaro */
964 if( b == 0x0a ){
965 eLineEnd = Line_LineHead; /* set endmark*/
966 }
967 else {
968 eLineEnd = Line_Other; /* clear endmark*/
969 }
970
971 if (WriteBufLen >= (WriteBufMax*4/5)) {
972 WriteBufMax *= 2;
973 WriteBuf = (PCHAR)realloc(WriteBuf, WriteBufMax);
974 }
975 memcpy(&WriteBuf[WriteBufLen], tmp, strlen(tmp));
976 WriteBufLen += strlen(tmp);
977 WriteBuf[WriteBufLen++] = b;
978
979 (LogVar->ByteCount)++;
980 }
981 }
982
983 PostThreadMessage(LogVar->LogThreadId, WM_DPC_LOGTHREAD_SEND, (WPARAM)WriteBuf, WriteBufLen);
984
985 } else {
986
987 while (Get1(Buf,&Start,&Count,&b))
988 {
989 if (((cv.FilePause & OpLog)==0) && (! cv.ProtoFlag))
990 {
991 // �����������o��(2006.7.23 maya)
992 // ���t�t�H�[�}�b�g�����{�����������E�W�������X���� (2006.7.23 yutaka)
993 /* 2007.05.24 Gentaro */
994 // �~���b���\���������������X (2009.5.23 maya)
995 if ( ts.LogTimestamp && eLineEnd ) {
996 #if 1
997 #if 0
998 SYSTEMTIME LocalTime;
999 GetLocalTime(&LocalTime);
1000 char strtime[27];
1001
1002 // format time
1003 sprintf(strtime, "[%04d/%02d/%02d %02d:%02d:%02d.%03d] ",
1004 LocalTime.wYear, LocalTime.wMonth,LocalTime.wDay,
1005 LocalTime.wHour, LocalTime.wMinute, LocalTime.wSecond,
1006 LocalTime.wMilliseconds);
1007 #else
1008 char *strtime = mctimelocal();
1009 #endif
1010 #else
1011 time_t tick = time(NULL);
1012 char *strtime = ctime(&tick);
1013 #endif
1014 /* 2007.05.24 Gentaro */
1015 if( eLineEnd == Line_FileHead ){
1016 #ifdef FileVarWin16
1017 _lwrite(LogVar->FileHandle,"\r\n",2);
1018 #else
1019 WriteFile((HANDLE)LogVar->FileHandle, "\r\n", 2, &wrote, NULL);
1020 #endif
1021 }
1022 #ifdef FileVarWin16
1023 _lwrite(LogVar->FileHandle,"[",1);
1024 _lwrite(LogVar->FileHandle, strtime, strlen(strtime));
1025 _lwrite(LogVar->FileHandle,"] ",2);
1026 #else
1027 WriteFile((HANDLE)LogVar->FileHandle, "[", 1, &wrote, NULL);
1028 WriteFile((HANDLE)LogVar->FileHandle, strtime, strlen(strtime), &wrote, NULL);
1029 WriteFile((HANDLE)LogVar->FileHandle, "] ", 2, &wrote, NULL);
1030 #endif
1031 }
1032
1033 /* 2007.05.24 Gentaro */
1034 if( b == 0x0a ){
1035 eLineEnd = Line_LineHead; /* set endmark*/
1036 }
1037 else {
1038 eLineEnd = Line_Other; /* clear endmark*/
1039 }
1040
1041 #ifdef FileVarWin16
1042 _lwrite(LogVar->FileHandle,(PCHAR)&b,1);
1043 #else
1044 WriteFile((HANDLE)LogVar->FileHandle, (PCHAR)&b, 1, &wrote, NULL);
1045 #endif
1046 (LogVar->ByteCount)++;
1047 }
1048 }
1049
1050 }
1051
1052 logfile_unlock();
1053
1054 if (FileLog)
1055 {
1056 cv.LStart = Start;
1057 cv.LCount = Count;
1058 }
1059 else {
1060 cv.BStart = Start;
1061 cv.BCount = Count;
1062 }
1063 if (((cv.FilePause & OpLog) !=0) || cv.ProtoFlag) return;
1064 if (FLogDlg!=NULL)
1065 FLogDlg->RefreshNum();
1066
1067 // ���O�E���[�e�[�g
1068 LogRotate();
1069
1070 }
1071
1072 BOOL CreateLogBuf()
1073 {
1074 if (cv.HLogBuf==NULL)
1075 {
1076 cv.HLogBuf = GlobalAlloc(GMEM_MOVEABLE,InBuffSize);
1077 cv.LogBuf = NULL;
1078 cv.LogPtr = 0;
1079 cv.LStart = 0;
1080 cv.LCount = 0;
1081 cv.DStart = 0;
1082 cv.DCount = 0;
1083 }
1084 return (cv.HLogBuf!=NULL);
1085 }
1086
1087 void FreeLogBuf()
1088 {
1089 if ((cv.HLogBuf==NULL) || FileLog || DDELog)
1090 return;
1091 if (cv.LogBuf!=NULL)
1092 GlobalUnlock(cv.HLogBuf);
1093 GlobalFree(cv.HLogBuf);
1094 cv.HLogBuf = NULL;
1095 cv.LogBuf = NULL;
1096 cv.LogPtr = 0;
1097 cv.LStart = 0;
1098 cv.LCount = 0;
1099 cv.DStart = 0;
1100 cv.DCount = 0;
1101 }
1102
1103 BOOL CreateBinBuf()
1104 {
1105 if (cv.HBinBuf==NULL)
1106 {
1107 cv.HBinBuf = GlobalAlloc(GMEM_MOVEABLE,InBuffSize);
1108 cv.BinBuf = NULL;
1109 cv.BinPtr = 0;
1110 cv.BStart = 0;
1111 cv.BCount = 0;
1112 }
1113 return (cv.HBinBuf!=NULL);
1114 }
1115
1116 void FreeBinBuf()
1117 {
1118 if ((cv.HBinBuf==NULL) || BinLog)
1119 return;
1120 if (cv.BinBuf!=NULL)
1121 GlobalUnlock(cv.HBinBuf);
1122 GlobalFree(cv.HBinBuf);
1123 cv.HBinBuf = NULL;
1124 cv.BinBuf = NULL;
1125 cv.BinPtr = 0;
1126 cv.BStart = 0;
1127 cv.BCount = 0;
1128 }
1129
1130 extern "C" {
1131 void FileSendStart()
1132 {
1133 LONG Option;
1134
1135 if (! cv.Ready || FSend) return;
1136 if (cv.ProtoFlag)
1137 {
1138 FreeFileVar(&SendVar);
1139 return;
1140 }
1141
1142 if (! LoadTTFILE())
1143 return;
1144 if (! NewFileVar(&SendVar))
1145 {
1146 FreeTTFILE();
1147 return;
1148 }
1149 SendVar->OpId = OpSendFile;
1150
1151 FSend = TRUE;
1152
1153 if (strlen(&(SendVar->FullName[SendVar->DirLen]))==0)
1154 {
1155 Option = MAKELONG(ts.TransBin,0);
1156 SendVar->FullName[0] = 0;
1157 if (! (*GetTransFname)(SendVar, ts.FileDir, GTF_SEND, &Option))
1158 {
1159 FileTransEnd(OpSendFile);
1160 return;
1161 }
1162 ts.TransBin = LOWORD(Option);
1163 }
1164 else
1165 (*SetFileVar)(SendVar);
1166
1167 #ifdef FileVarWin16
1168 SendVar->FileHandle = _lopen(SendVar->FullName,OF_READ);
1169 #else
1170 SendVar->FileHandle = (int)CreateFile(SendVar->FullName, GENERIC_READ, FILE_SHARE_READ, NULL,
1171 OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);
1172 #endif
1173 SendVar->FileOpen = (SendVar->FileHandle>0);
1174 if (! SendVar->FileOpen)
1175 {
1176 FileTransEnd(OpSendFile);
1177 return;
1178 }
1179 SendVar->ByteCount = 0;
1180 SendVar->FileSize = GetFSize(SendVar->FullName);
1181
1182 TalkStatus = IdTalkFile;
1183 FileRetrySend = FALSE;
1184 FileRetryEcho = FALSE;
1185 FileCRSend = FALSE;
1186 FileReadEOF = FALSE;
1187 FileSendHandler.pos = 0;
1188 FileSendHandler.end = 0;
1189 FileDlgRefresh = 0;
1190
1191 if (BracketedPasteMode()) {
1192 FileBracketMode = FS_BRACKET_START;
1193 FileBracketPtr = 0;
1194 BinaryMode = TRUE;
1195 }
1196 else {
1197 FileBracketMode = FS_BRACKET_NONE;
1198 BinaryMode = ts.TransBin;
1199 }
1200
1201 if (! OpenFTDlg(SendVar))
1202 FileTransEnd(OpSendFile);
1203 }
1204 }
1205
1206 void FileTransEnd(WORD OpId)
1207 /* OpId = 0: close Log and FileSend
1208 OpLog: close Log
1209 OpSendFile: close FileSend */
1210 {
1211 if (((OpId==0) || (OpId==OpLog)) && (FileLog || BinLog))
1212 {
1213 FileLog = FALSE;
1214 BinLog = FALSE;
1215 if (FLogDlg!=NULL)
1216 {
1217 FLogDlg->DestroyWindow();
1218 FLogDlg = NULL;
1219 HWndLog = NULL; // steven add
1220 }
1221 FreeFileVar(&LogVar);
1222 FreeLogBuf();
1223 FreeBinBuf();
1224 FreeTTFILE();
1225 }
1226
1227 if (((OpId==0) || (OpId==OpSendFile)) && FSend)
1228 {
1229 FSend = FALSE;
1230 TalkStatus = IdTalkKeyb;
1231 if (SendDlg!=NULL)
1232 {
1233 SendDlg->DestroyWindow();
1234 SendDlg = NULL;
1235 }
1236 FreeFileVar(&SendVar);
1237 FreeTTFILE();
1238 }
1239
1240 EndDdeCmnd(0);
1241 }
1242
1243 int FSOut1(BYTE b)
1244 {
1245 if (BinaryMode)
1246 return CommBinaryOut(&cv,(PCHAR)&b,1);
1247 else if ((b>=0x20) || (b==0x09) || (b==0x0A) || (b==0x0D))
1248 return CommTextOut(&cv,(PCHAR)&b,1);
1249 else
1250 return 1;
1251 }
1252
1253 int FSEcho1(BYTE b)
1254 {
1255 if (BinaryMode)
1256 return CommBinaryEcho(&cv,(PCHAR)&b,1);
1257 else
1258 return CommTextEcho(&cv,(PCHAR)&b,1);
1259 }
1260
1261 extern "C" {
1262 // �������������������������g��
1263 // - BinaryMode == true
1264 // - FileBracketMode == false
1265 // - cv.TelFlag == false
1266 // - ts.LocalEcho == 0
1267 void FileSendBinayBoost()
1268 {
1269 WORD c, fc;
1270 LONG BCOld;
1271 DWORD read_bytes;
1272
1273 if ((SendDlg == NULL) ||
1274 ((cv.FilePause & OpSendFile) != 0))
1275 return;
1276
1277 BCOld = SendVar->ByteCount;
1278
1279 if (FileRetrySend)
1280 {
1281 c = CommRawOut(&cv, &(FileSendHandler.buf[FileSendHandler.pos]),
1282 FileSendHandler.end - FileSendHandler.pos);
1283 FileSendHandler.pos += c;
1284 FileRetrySend = (FileSendHandler.end != FileSendHandler.pos);
1285 if (FileRetrySend)
1286 return;
1287 }
1288
1289 do {
1290 if (FileSendHandler.pos == FileSendHandler.end) {
1291 #ifdef FileVarWin16
1292 fc = _lread(SendVar->FileHandle, &(FileSendHandler.buf[0]), sizeof(FileSendHandler.buf));
1293 #else
1294 ReadFile((HANDLE)SendVar->FileHandle, &(FileSendHandler.buf[0]), sizeof(FileSendHandler.buf), &read_bytes, NULL);
1295 fc = LOWORD(read_bytes);
1296 #endif
1297 FileSendHandler.pos = 0;
1298 FileSendHandler.end = fc;
1299 } else {
1300 fc = FileSendHandler.end - FileSendHandler.end;
1301 }
1302
1303 if (fc != 0)
1304 {
1305 c = CommRawOut(&cv, &(FileSendHandler.buf[FileSendHandler.pos]),
1306 FileSendHandler.end - FileSendHandler.pos);
1307 FileSendHandler.pos += c;
1308 FileRetrySend = (FileSendHandler.end != FileSendHandler.pos);
1309 SendVar->ByteCount = SendVar->ByteCount + c;
1310 if (FileRetrySend)
1311 {
1312 if (SendVar->ByteCount != BCOld)
1313 SendDlg->RefreshNum();
1314 return;
1315 }
1316 }
1317 FileDlgRefresh = SendVar->ByteCount;
1318 SendDlg->RefreshNum();
1319 BCOld = SendVar->ByteCount;
1320 if (fc != 0)
1321 return;
1322 } while (fc != 0);
1323
1324 FileTransEnd(OpSendFile);
1325 }
1326 }
1327
1328 extern "C" {
1329 void FileSend()
1330 {
1331 WORD c, fc;
1332 LONG BCOld;
1333 DWORD read_bytes;
1334
1335 if (cv.PortType == IdSerial && ts.FileSendHighSpeedMode &&
1336 BinaryMode && !FileBracketMode && !cv.TelFlag &&
1337 (ts.LocalEcho == 0) && (ts.Baud >= 115200)) {
1338 return FileSendBinayBoost();
1339 }
1340
1341 if ((SendDlg==NULL) ||
1342 ((cv.FilePause & OpSendFile) !=0))
1343 return;
1344
1345 BCOld = SendVar->ByteCount;
1346
1347 if (FileRetrySend)
1348 {
1349 FileRetryEcho = (ts.LocalEcho>0);
1350 c = FSOut1(FileByte);
1351 FileRetrySend = (c==0);
1352 if (FileRetrySend)
1353 return;
1354 }
1355
1356 if (FileRetryEcho)
1357 {
1358 c = FSEcho1(FileByte);
1359 FileRetryEcho = (c==0);
1360 if (FileRetryEcho)
1361 return;
1362 }
1363
1364 do {
1365 if (FileBracketMode == FS_BRACKET_START) {
1366 FileByte = BracketStartStr[FileBracketPtr++];
1367 fc = 1;
1368
1369 if (FileBracketPtr >= sizeof(BracketStartStr) - 1) {
1370 FileBracketMode = FS_BRACKET_END;
1371 FileBracketPtr = 0;
1372 BinaryMode = ts.TransBin;
1373 }
1374 }
1375 else if (! FileReadEOF) {
1376 #ifdef FileVarWin16
1377 fc = _lread(SendVar->FileHandle,&FileByte,1);
1378 #else
1379 ReadFile((HANDLE)SendVar->FileHandle, &FileByte, 1, &read_bytes, NULL);
1380 fc = LOWORD(read_bytes);
1381 #endif
1382 SendVar->ByteCount = SendVar->ByteCount + fc;
1383
1384 if (FileCRSend && (fc==1) && (FileByte==0x0A)) {
1385 #ifdef FileVarWin16
1386 fc = _lread(SendVar->FileHandle,&FileByte,1);
1387 #else
1388 ReadFile((HANDLE)SendVar->FileHandle, &FileByte, 1, &read_bytes, NULL);
1389 fc = LOWORD(read_bytes);
1390 #endif
1391 SendVar->ByteCount = SendVar->ByteCount + fc;
1392 }
1393 }
1394 else {
1395 fc = 0;
1396 }
1397
1398 if (fc == 0 && FileBracketMode == FS_BRACKET_END) {
1399 FileReadEOF = TRUE;
1400 FileByte = BracketEndStr[FileBracketPtr++];
1401 fc = 1;
1402 BinaryMode = TRUE;
1403
1404 if (FileBracketPtr >= sizeof(BracketEndStr) - 1) {
1405 FileBracketMode = FS_BRACKET_NONE;
1406 FileBracketPtr = 0;
1407 }
1408 }
1409
1410
1411 if (fc!=0)
1412 {
1413 c = FSOut1(FileByte);
1414 FileCRSend = (ts.TransBin==0) && (FileByte==0x0D);
1415 FileRetrySend = (c==0);
1416 if (FileRetrySend)
1417 {
1418 if (SendVar->ByteCount != BCOld)
1419 SendDlg->RefreshNum();
1420 return;
1421 }
1422 if (ts.LocalEcho>0)
1423 {
1424 c = FSEcho1(FileByte);
1425 FileRetryEcho = (c==0);
1426 if (FileRetryEcho)
1427 return;
1428 }
1429 }
1430 if ((fc==0) || ((SendVar->ByteCount % 100 == 0) && (FileBracketPtr == 0))) {
1431 SendDlg->RefreshNum();
1432 BCOld = SendVar->ByteCount;
1433 if (fc!=0)
1434 return;
1435 }
1436 } while (fc!=0);
1437
1438 FileTransEnd(OpSendFile);
1439 }
1440 }
1441
1442 extern "C" {
1443 void FLogChangeButton(BOOL Pause)
1444 {
1445 if (FLogDlg!=NULL)
1446 FLogDlg->ChangeButton(Pause);
1447 }
1448 }
1449
1450 extern "C" {
1451 void FLogRefreshNum()
1452 {
1453 if (FLogDlg!=NULL)
1454 FLogDlg->RefreshNum();
1455 }
1456 }
1457
1458 BOOL OpenProtoDlg(PFileVar fv, int IdProto, int Mode, WORD Opt1, WORD Opt2)
1459 {
1460 int vsize;
1461 PProtoDlg pd;
1462 HWND Hpd;
1463 char uimsg[MAX_UIMSG];
1464
1465 ProtoId = IdProto;
1466
1467 switch (ProtoId) {
1468 case PROTO_KMT:
1469 vsize = sizeof(TKmtVar);
1470 break;
1471 case PROTO_XM:
1472 vsize = sizeof(TXVar);
1473 break;
1474 case PROTO_YM:
1475 vsize = sizeof(TYVar);
1476 break;
1477 case PROTO_ZM:
1478 vsize = sizeof(TZVar);
1479 break;
1480 case PROTO_BP:
1481 vsize = sizeof(TBPVar);
1482 break;
1483 case PROTO_QV:
1484 vsize = sizeof(TQVVar);
1485 break;
1486 }
1487 ProtoVar = (PCHAR)malloc(vsize);
1488 if (ProtoVar==NULL)
1489 return FALSE;
1490
1491 switch (ProtoId) {
1492 case PROTO_KMT:
1493 ((PKmtVar)ProtoVar)->KmtMode = Mode;
1494 break;
1495 case PROTO_XM:
1496 ((PXVar)ProtoVar)->XMode = Mode;
1497 ((PXVar)ProtoVar)->XOpt = Opt1;
1498 ((PXVar)ProtoVar)->TextFlag = 1 - (Opt2 & 1);
1499 break;
1500 case PROTO_YM:
1501 ((PYVar)ProtoVar)->YMode = Mode;
1502 ((PYVar)ProtoVar)->YOpt = Opt1;
1503 break;
1504 case PROTO_ZM:
1505 ((PZVar)ProtoVar)->BinFlag = (Opt1 & 1) != 0;
1506 ((PZVar)ProtoVar)->ZMode = Mode;
1507 break;
1508 case PROTO_BP:
1509 ((PBPVar)ProtoVar)->BPMode = Mode;
1510 break;
1511 case PROTO_QV:
1512 ((PQVVar)ProtoVar)->QVMode = Mode;
1513 break;
1514 }
1515
1516 pd = new CProtoDlg();
1517 if (pd==NULL)
1518 {
1519 free(ProtoVar);
1520 ProtoVar = NULL;
1521 return FALSE;
1522 }
1523 pd->Create(fv,&ts);
1524
1525 Hpd=pd->GetSafeHwnd();
1526
1527 GetDlgItemText(Hpd, IDC_PROT_FILENAME, uimsg, sizeof(uimsg));
1528 get_lang_msg("DLG_PROT_FIELNAME", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1529 SetDlgItemText(Hpd, IDC_PROT_FILENAME, ts.UIMsg);
1530 GetDlgItemText(Hpd, IDC_PROT_PROT, uimsg, sizeof(uimsg));
1531 get_lang_msg("DLG_PROT_PROTO", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1532 SetDlgItemText(Hpd, IDC_PROT_PROT, ts.UIMsg);
1533 GetDlgItemText(Hpd, IDC_PROT_PACKET, uimsg, sizeof(uimsg));
1534 get_lang_msg("DLG_PROT_PACKET", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1535 SetDlgItemText(Hpd, IDC_PROT_PACKET, ts.UIMsg);
1536 GetDlgItemText(Hpd, IDC_PROT_TRANS, uimsg, sizeof(uimsg));
1537 get_lang_msg("DLG_PROT_TRANS", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1538 SetDlgItemText(Hpd, IDC_PROT_TRANS, ts.UIMsg);
1539 GetDlgItemText(Hpd, IDC_PROT_ELAPSED, uimsg, sizeof(uimsg));
1540 get_lang_msg("DLG_PROT_ELAPSED", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1541 SetDlgItemText(Hpd, IDC_PROT_ELAPSED, ts.UIMsg);
1542 GetDlgItemText(Hpd, IDCANCEL, uimsg, sizeof(uimsg));
1543 get_lang_msg("BTN_CANCEL", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1544 SetDlgItemText(Hpd, IDCANCEL, ts.UIMsg);
1545
1546 (*ProtoInit)(ProtoId,FileVar,ProtoVar,&cv,&ts);
1547
1548 PtDlg = pd;
1549 return TRUE;
1550 }
1551
1552 extern "C" {
1553 void CloseProtoDlg()
1554 {
1555 if (PtDlg!=NULL)
1556 {
1557 PtDlg->DestroyWindow();
1558 PtDlg = NULL;
1559
1560 ::KillTimer(FileVar->HMainWin,IdProtoTimer);
1561 if ((ProtoId==PROTO_QV) &&
1562 (((PQVVar)ProtoVar)->QVMode==IdQVSend))
1563 CommTextOut(&cv,"\015",1);
1564 if (FileVar->LogFlag)
1565 _lclose(FileVar->LogFile);
1566 FileVar->LogFile = 0;
1567 if (ProtoVar!=NULL)
1568 {
1569 free(ProtoVar);
1570 ProtoVar = NULL;
1571 }
1572 }
1573 }
1574 }
1575
1576 BOOL ProtoStart()
1577 {
1578 if (cv.ProtoFlag)
1579 return FALSE;
1580 if (FSend)
1581 {
1582 FreeFileVar(&FileVar);
1583 return FALSE;
1584 }
1585
1586 if (! LoadTTFILE())
1587 return FALSE;
1588 NewFileVar(&FileVar);
1589
1590 if (FileVar==NULL)
1591 {
1592 FreeTTFILE();
1593 return FALSE;
1594 }
1595 cv.ProtoFlag = TRUE;
1596 return TRUE;
1597 }
1598
1599 void ProtoEnd()
1600 {
1601 if (! cv.ProtoFlag)
1602 return;
1603 cv.ProtoFlag = FALSE;
1604
1605 /* Enable transmit delay (serial port) */
1606 cv.DelayFlag = TRUE;
1607 TalkStatus = IdTalkKeyb;
1608
1609 CloseProtoDlg();
1610
1611 if ((FileVar!=NULL) && FileVar->Success)
1612 EndDdeCmnd(1);
1613 else
1614 EndDdeCmnd(0);
1615
1616 FreeTTFILE();
1617 FreeFileVar(&FileVar);
1618 }
1619
1620 extern "C" {
1621 int ProtoDlgParse()
1622 {
1623 int P;
1624
1625 P = ActiveWin;
1626 if (PtDlg==NULL)
1627 return P;
1628
1629 if ((*ProtoParse)(ProtoId,FileVar,ProtoVar,&cv))
1630 P = 0; /* continue */
1631 else {
1632 CommSend(&cv);
1633 ProtoEnd();
1634 }
1635 return P;
1636 }
1637 }
1638
1639 extern "C" {
1640 void ProtoDlgTimeOut()
1641 {
1642 if (PtDlg!=NULL)
1643 (*ProtoTimeOutProc)(ProtoId,FileVar,ProtoVar,&cv);
1644 }
1645 }
1646
1647 extern "C" {
1648 void ProtoDlgCancel()
1649 {
1650 if ((PtDlg!=NULL) &&
1651 (*ProtoCancel)(ProtoId,FileVar,ProtoVar,&cv))
1652 ProtoEnd();
1653 }
1654 }
1655
1656 extern "C" {
1657 void KermitStart(int mode)
1658 {
1659 WORD w;
1660
1661 if (! ProtoStart())
1662 return;
1663
1664 switch (mode) {
1665 case IdKmtSend:
1666 FileVar->OpId = OpKmtSend;
1667 if (strlen(&(FileVar->FullName[FileVar->DirLen]))==0)
1668 {
1669 if (! (*GetMultiFname)(FileVar,ts.FileDir,GMF_KERMIT,&w) ||
1670 (FileVar->NumFname==0))
1671 {
1672 ProtoEnd();
1673 return;
1674 }
1675 }
1676 else
1677 (*SetFileVar)(FileVar);
1678 break;
1679 case IdKmtReceive:
1680 FileVar->OpId = OpKmtRcv;
1681 break;
1682 case IdKmtGet:
1683 FileVar->OpId = OpKmtSend;
1684 if (strlen(&(FileVar->FullName[FileVar->DirLen]))==0)
1685 {
1686 if (! (*GetGetFname)(FileVar->HMainWin,FileVar) ||
1687 (strlen(FileVar->FullName)==0))
1688 {
1689 ProtoEnd();
1690 return;
1691 }
1692 }
1693 else
1694 (*SetFileVar)(FileVar);
1695 break;
1696 case IdKmtFinish:
1697 FileVar->OpId = OpKmtFin;
1698 break;
1699 default:
1700 ProtoEnd();
1701 return;
1702 }
1703 TalkStatus = IdTalkQuiet;
1704
1705 /* disable transmit delay (serial port) */
1706 cv.DelayFlag = FALSE;
1707
1708 if (! OpenProtoDlg(FileVar,PROTO_KMT,mode,0,0))
1709 ProtoEnd();
1710 }
1711 }
1712
1713 extern "C" {
1714 void XMODEMStart(int mode)
1715 {
1716 LONG Option;
1717 int tmp;
1718
1719 if (! ProtoStart())
1720 return;
1721
1722 if (mode==IdXReceive)
1723 FileVar->OpId = OpXRcv;
1724 else
1725 FileVar->OpId = OpXSend;
1726
1727 if (strlen(&(FileVar->FullName[FileVar->DirLen]))==0)
1728 {
1729 Option = MAKELONG(ts.XmodemBin,ts.XmodemOpt);
1730 if (! (*GetXFname)(FileVar->HMainWin,
1731 mode==IdXReceive,&Option,FileVar,ts.FileDir))
1732 {
1733 ProtoEnd();
1734 return;
1735 }
1736 tmp = HIWORD(Option);
1737 if (mode == IdXReceive) {
1738 if (IsXoptCRC(tmp)) {
1739 if (IsXopt1k(ts.XmodemOpt)) {
1740 ts.XmodemOpt = Xopt1kCRC;
1741 }
1742 else {
1743 ts.XmodemOpt = XoptCRC;
1744 }
1745 }
1746 else {
1747 if (IsXopt1k(ts.XmodemOpt)) {
1748 ts.XmodemOpt = Xopt1kCksum;
1749 }
1750 else {
1751 ts.XmodemOpt = XoptCheck;
1752 }
1753 }
1754 ts.XmodemBin = LOWORD(Option);
1755 }
1756 else {
1757 if (IsXopt1k(tmp)) {
1758 if (IsXoptCRC(ts.XmodemOpt)) {
1759 ts.XmodemOpt = Xopt1kCRC;
1760 }
1761 else {
1762 ts.XmodemOpt = Xopt1kCksum;
1763 }
1764 }
1765 else {
1766 if (IsXoptCRC(ts.XmodemOpt)) {
1767 ts.XmodemOpt = XoptCRC;
1768 }
1769 else {
1770 ts.XmodemOpt = XoptCheck;
1771 }
1772 }
1773 }
1774 }
1775 else
1776 (*SetFileVar)(FileVar);
1777
1778 if (mode==IdXReceive)
1779 FileVar->FileHandle = _lcreat(FileVar->FullName,0);
1780 else
1781 FileVar->FileHandle = _lopen(FileVar->FullName,OF_READ);
1782
1783 FileVar->FileOpen = FileVar->FileHandle>0;
1784 if (! FileVar->FileOpen)
1785 {
1786 ProtoEnd();
1787 return;
1788 }
1789 TalkStatus = IdTalkQuiet;
1790
1791 /* disable transmit delay (serial port) */
1792 cv.DelayFlag = FALSE;
1793
1794 if (! OpenProtoDlg(FileVar,PROTO_XM,mode,
1795 ts.XmodemOpt,ts.XmodemBin))
1796 ProtoEnd();
1797 }
1798 }
1799
1800 extern "C" {
1801 void YMODEMStart(int mode)
1802 {
1803 WORD Opt;
1804
1805 if (! ProtoStart())
1806 return;
1807
1808 if (mode==IdYSend)
1809 {
1810 // �t�@�C���]�������I�v�V������"Yopt1K"�����������B
1811 // TODO: "Yopt1K", "YoptG", "YoptSingle"�������������������AIDD_FOPT���g�������K�v�����B
1812 Opt = Yopt1K;
1813 FileVar->OpId = OpYSend;
1814 if (strlen(&(FileVar->FullName[FileVar->DirLen]))==0)
1815 {
1816 if (! (*GetMultiFname)(FileVar,ts.FileDir,GMF_Y,&Opt) ||
1817 (FileVar->NumFname==0))
1818 {
1819 ProtoEnd();
1820 return;
1821 }
1822 //ts.XmodemBin = Opt;
1823 }
1824 else
1825 (*SetFileVar)(FileVar);
1826 }
1827 else {
1828 FileVar->OpId = OpYRcv;
1829 // �t�@�C���]�������I�v�V������"Yopt1K"�����������B
1830 Opt = Yopt1K;
1831 (*SetFileVar)(FileVar);
1832 }
1833
1834 TalkStatus = IdTalkQuiet;
1835
1836 /* disable transmit delay (serial port) */
1837 cv.DelayFlag = FALSE;
1838
1839 if (! OpenProtoDlg(FileVar,PROTO_YM,mode,Opt,0))
1840 ProtoEnd();
1841 }
1842 }
1843
1844 extern "C" {
1845 void ZMODEMStart(int mode)
1846 {
1847 WORD Opt;
1848
1849 if (! ProtoStart())
1850 return;
1851
1852 if (mode == IdZSend || mode == IdZAutoS)
1853 {
1854 Opt = ts.XmodemBin;
1855 FileVar->OpId = OpZSend;
1856 if (strlen(&(FileVar->FullName[FileVar->DirLen]))==0)
1857 {
1858 if (! (*GetMultiFname)(FileVar,ts.FileDir,GMF_Z,&Opt) ||
1859 (FileVar->NumFname==0))
1860 {
1861 if (mode == IdZAutoS) {
1862 CommRawOut(&cv, "\030\030\030\030\030\030\030\030\b\b\b\b\b\b\b\b\b\b", 18);
1863 }
1864 ProtoEnd();
1865 return;
1866 }
1867 ts.XmodemBin = Opt;
1868 }
1869 else
1870 (*SetFileVar)(FileVar);
1871 }
1872 else /* IdZReceive or IdZAutoR */
1873 FileVar->OpId = OpZRcv;
1874
1875 TalkStatus = IdTalkQuiet;
1876
1877 /* disable transmit delay (serial port) */
1878 cv.DelayFlag = FALSE;
1879
1880 if (! OpenProtoDlg(FileVar,PROTO_ZM,mode,Opt,0))
1881 ProtoEnd();
1882 }
1883 }
1884
1885 extern "C" {
1886 void BPStart(int mode)
1887 {
1888 LONG Option;
1889
1890 if (! ProtoStart())
1891 return;
1892 if (mode==IdBPSend)
1893 {
1894 FileVar->OpId = OpBPSend;
1895 if (strlen(&(FileVar->FullName[FileVar->DirLen]))==0)
1896 {
1897 FileVar->FullName[0] = 0;
1898 if (! (*GetTransFname)(FileVar, ts.FileDir, GTF_BP, &Option))
1899 {
1900 ProtoEnd();
1901 return;
1902 }
1903 }
1904 else
1905 (*SetFileVar)(FileVar);
1906 }
1907 else /* IdBPReceive or IdBPAuto */
1908 FileVar->OpId = OpBPRcv;
1909
1910 TalkStatus = IdTalkQuiet;
1911
1912 /* disable transmit delay (serial port) */
1913 cv.DelayFlag = FALSE;
1914
1915 if (! OpenProtoDlg(FileVar,PROTO_BP,mode,0,0))
1916 ProtoEnd();
1917 }
1918 }
1919
1920 extern "C" {
1921 void QVStart(int mode)
1922 {
1923 WORD W;
1924
1925 if (! ProtoStart())
1926 return;
1927
1928 if (mode==IdQVSend)
1929 {
1930 FileVar->OpId = OpQVSend;
1931 if (strlen(&(FileVar->FullName[FileVar->DirLen]))==0)
1932 {
1933 if (! (*GetMultiFname)(FileVar,ts.FileDir,GMF_QV, &W) ||
1934 (FileVar->NumFname==0))
1935 {
1936 ProtoEnd();
1937 return;
1938 }
1939 }
1940 else
1941 (*SetFileVar)(FileVar);
1942 }
1943 else
1944 FileVar->OpId = OpQVRcv;
1945
1946 TalkStatus = IdTalkQuiet;
1947
1948 /* disable transmit delay (serial port) */
1949 cv.DelayFlag = FALSE;
1950
1951 if (! OpenProtoDlg(FileVar,PROTO_QV,mode,0,0))
1952 ProtoEnd();
1953 }
1954 }

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