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 3904 - (show annotations) (download) (as text)
Sat May 22 06:57:02 2010 UTC (13 years, 10 months ago) by doda
Original Path: trunk/teraterm/teraterm/filesys.cpp
File MIME type: text/x-c++src
File size: 32110 byte(s)
ファイル送信も Bracketed Paste Mode の適用対象に。

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

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