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 5383 - (show annotations) (download) (as text)
Thu Sep 5 06:17:54 2013 UTC (10 years, 7 months ago) by doda
Original Path: trunk/teraterm/teraterm/filesys.cpp
File MIME type: text/x-c++src
File size: 39171 byte(s)
ログダイアログの非表示化が出来なくなっていたのを修正。

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

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