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

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