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 5206 - (show annotations) (download) (as text)
Fri Apr 19 15:31:54 2013 UTC (10 years, 11 months ago) by yutakapon
Original Path: trunk/teraterm/teraterm/filesys.cpp
File MIME type: text/x-c++src
File size: 37795 byte(s)
ログファイルの遅延書き込みをサポートした。
ネットワーク経由でのログ採取時、Tera Term自身がスローダウンする問題への改善。
チケット #25434

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

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