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 5392 - (show annotations) (download) (as text)
Sun Sep 29 15:30:39 2013 UTC (10 years, 6 months ago) by yutakapon
Original Path: trunk/teraterm/teraterm/filesys.cpp
File MIME type: text/x-c++src
File size: 39934 byte(s)
チケット #32144
ログ採取開始時の現在バッファをあらかじめ含める

ログ採取オプションに"ALl Buff In First"を追加した。

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

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