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

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