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 4328 - (show annotations) (download) (as text)
Sun Feb 20 05:38:34 2011 UTC (13 years, 1 month ago) by maya
Original Path: trunk/teraterm/teraterm/filesys.cpp
File MIME type: text/x-c++src
File size: 32302 byte(s)
ログファイルを開いたとき、書き込み中の同名ファイルを開ける問題を修正
  http://sourceforge.jp/ticket/browse.php?group_id=1412&tid=24365

ログファイルを開くのに _lopen と _lcreat を使っていたが、CreateFile を使い dwShareMode で共有モードを渡すようにした。
  書き込み用に開き、読み込みのみ許すようになる。
LogVar->FileHandle が int なのはおそらく Win16 関数を使っているためで、HANDLE にキャストして Win32 API を使っている箇所もある。
  _lopen, _lcreat, _lclose, _llseek, _lread, _lwrite などが使われているが、Win32 API に切り替えるのが望ましい。
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 = (int)CreateFile(LogVar->FullName, GENERIC_WRITE, FILE_SHARE_READ, NULL,
483 OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
484 if (LogVar->FileHandle>0){
485 _llseek(LogVar->FileHandle,0,2);
486 /* 2007.05.24 Gentaro
487 If log file already exists,
488 a newline is inserted before the first timestamp.
489 */
490 eLineEnd = Line_FileHead;
491 }
492 }
493 else {
494 LogVar->FileHandle = (int)CreateFile(LogVar->FullName, GENERIC_WRITE, FILE_SHARE_READ, NULL,
495 CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
496 }
497 LogVar->FileOpen = (LogVar->FileHandle>0);
498 if (! LogVar->FileOpen)
499 {
500 char msg[128];
501
502 // �t�@�C���I�[�v���G���[�������b�Z�[�W�\�������������B(2008.7.9 yutaka)
503 if (LogVar->NoMsg == FALSE) {
504 _snprintf_s(msg, sizeof(msg), _TRUNCATE, "Can not create a `%s' file. (%d)", LogVar->FullName, GetLastError());
505 MessageBox(NULL, msg, "Tera Term: File open error", MB_OK | MB_ICONERROR);
506 }
507
508 FileTransEnd(OpLog);
509 return FALSE;
510 }
511 LogVar->ByteCount = 0;
512
513 if (! OpenFTDlg(LogVar)) {
514 FileTransEnd(OpLog);
515 return FALSE;
516 }
517
518 return TRUE;
519 }
520 }
521
522 void LogPut1(BYTE b)
523 {
524 LogLast = b;
525 cv.LogBuf[cv.LogPtr] = b;
526 cv.LogPtr++;
527 if (cv.LogPtr>=InBuffSize)
528 cv.LogPtr = cv.LogPtr-InBuffSize;
529
530 if (FileLog)
531 {
532 if (cv.LCount>=InBuffSize)
533 {
534 cv.LCount = InBuffSize;
535 cv.LStart = cv.LogPtr;
536 }
537 else
538 cv.LCount++;
539 }
540 else
541 cv.LCount = 0;
542
543 if (DDELog)
544 {
545 if (cv.DCount>=InBuffSize)
546 {
547 cv.DCount = InBuffSize;
548 cv.DStart = cv.LogPtr;
549 }
550 else
551 cv.DCount++;
552 }
553 else {
554 cv.DCount = 0;
555 // ���O���������}�N�����X�g�[���������������C���B
556 // ���O�����������x�}�N�����~�������A�o�b�t�@���C���f�b�N�X�������������������A
557 // ���x�}�N�������������������f�[�^�������������������B
558 // �}�N�������~���������������C���f�b�N�X�����������������������B
559 // (2006.12.26 yutaka)
560 cv.DStart = cv.LogPtr;
561 }
562 }
563
564 void Log1Byte(BYTE b)
565 {
566 if (b==0x0d)
567 {
568 LogLast = b;
569 return;
570 }
571 if ((b==0x0a) && (LogLast==0x0d))
572 LogPut1(0x0d);
573 LogPut1(b);
574 }
575
576 static BOOL Get1(PCHAR Buf, int *Start, int *Count, PBYTE b)
577 {
578 if (*Count<=0) return FALSE;
579 *b = Buf[*Start];
580 (*Start)++;
581 if (*Start>=InBuffSize)
582 *Start = *Start-InBuffSize;
583 (*Count)--;
584 return TRUE;
585 }
586
587
588
589 static CRITICAL_SECTION g_filelog_lock; /* ���b�N�p���� */
590
591 void logfile_lock_initialize(void)
592 {
593 InitializeCriticalSection(&g_filelog_lock);
594 }
595
596 static inline void logfile_lock(void)
597 {
598 EnterCriticalSection(&g_filelog_lock);
599 }
600
601 static inline void logfile_unlock(void)
602 {
603 LeaveCriticalSection(&g_filelog_lock);
604 }
605
606 // �R�����g�����O����������
607 void CommentLogToFile(char *buf, int size)
608 {
609 DWORD wrote;
610
611 if (LogVar == NULL || !LogVar->FileOpen) {
612 char uimsg[MAX_UIMSG];
613 get_lang_msg("MSG_ERROR", uimsg, sizeof(uimsg), "ERROR", ts.UILanguageFile);
614 get_lang_msg("MSG_COMMENT_LOG_OPEN_ERROR", ts.UIMsg, sizeof(ts.UIMsg),
615 "It is not opened by the log file yet.", ts.UILanguageFile);
616 ::MessageBox(NULL, ts.UIMsg, uimsg, MB_OK|MB_ICONEXCLAMATION);
617 return;
618 }
619
620 logfile_lock();
621 WriteFile((HANDLE)LogVar->FileHandle, buf, size, &wrote, NULL);
622 WriteFile((HANDLE)LogVar->FileHandle, "\r\n", 2, &wrote, NULL); // ���s
623 /* Set Line End Flag
624 2007.05.24 Gentaro
625 */
626 eLineEnd = Line_LineHead;
627 logfile_unlock();
628 }
629
630 void LogToFile()
631 {
632 PCHAR Buf;
633 int Start, Count;
634 BYTE b;
635
636 if (! LogVar->FileOpen) return;
637 if (FileLog)
638 {
639 Buf = cv.LogBuf;
640 Start = cv.LStart;
641 Count = cv.LCount;
642 }
643 else if (BinLog)
644 {
645 Buf = cv.BinBuf;
646 Start = cv.BStart;
647 Count = cv.BCount;
648 }
649 else
650 return;
651
652 if (Buf==NULL) return;
653 if (Count==0) return;
654
655 // ���b�N������(2004.8.6 yutaka)
656 logfile_lock();
657
658 while (Get1(Buf,&Start,&Count,&b))
659 {
660 if (((cv.FilePause & OpLog)==0) && (! cv.ProtoFlag))
661 {
662 // �����������o��(2006.7.23 maya)
663 // ���t�t�H�[�}�b�g�����{�����������E�W�������X���� (2006.7.23 yutaka)
664 /* 2007.05.24 Gentaro */
665 if ( ts.LogTimestamp && eLineEnd ) {
666 #if 1
667 #if 0
668 SYSTEMTIME LocalTime;
669 GetLocalTime(&LocalTime);
670 char strtime[27];
671
672 // format time
673 sprintf(strtime, "[%04d/%02d/%02d %02d:%02d:%02d.%03d] ",
674 LocalTime.wYear, LocalTime.wMonth,LocalTime.wDay,
675 LocalTime.wHour, LocalTime.wMinute, LocalTime.wSecond,
676 LocalTime.wMilliseconds);
677 #else
678 // �~���b���\���������������X (2009.5.23 maya)
679 SYSTEMTIME LocalTime;
680 GetLocalTime(&LocalTime);
681 char strtime[29];
682 char week[][4] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
683 char month[][4] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun",
684 "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
685 _snprintf_s(strtime, sizeof(strtime), _TRUNCATE,
686 "%s %s %02d %02d:%02d:%02d.%03d %04d",
687 week[LocalTime.wDayOfWeek],
688 month[LocalTime.wMonth-1],
689 LocalTime.wDay,
690 LocalTime.wHour,
691 LocalTime.wMinute,
692 LocalTime.wSecond,
693 LocalTime.wMilliseconds,
694 LocalTime.wYear);
695 #endif
696 #else
697 time_t tick = time(NULL);
698 char *strtime = ctime(&tick);
699 #endif
700 /* 2007.05.24 Gentaro */
701 if( eLineEnd == Line_FileHead ){
702 _lwrite(LogVar->FileHandle,"\r\n",2);
703 }
704 _lwrite(LogVar->FileHandle,"[",1);
705 _lwrite(LogVar->FileHandle, strtime, strlen(strtime));
706 _lwrite(LogVar->FileHandle,"] ",2);
707 }
708
709 /* 2007.05.24 Gentaro */
710 if( b == 0x0a ){
711 eLineEnd = Line_LineHead; /* set endmark*/
712 }
713 else {
714 eLineEnd = Line_Other; /* clear endmark*/
715 }
716
717 _lwrite(LogVar->FileHandle,(PCHAR)&b,1);
718 (LogVar->ByteCount)++;
719 }
720 }
721
722 logfile_unlock();
723
724 if (FileLog)
725 {
726 cv.LStart = Start;
727 cv.LCount = Count;
728 }
729 else {
730 cv.BStart = Start;
731 cv.BCount = Count;
732 }
733 if (((cv.FilePause & OpLog) !=0) || cv.ProtoFlag) return;
734 if (FLogDlg!=NULL)
735 FLogDlg->RefreshNum();
736 }
737
738 BOOL CreateLogBuf()
739 {
740 if (cv.HLogBuf==NULL)
741 {
742 cv.HLogBuf = GlobalAlloc(GMEM_MOVEABLE,InBuffSize);
743 cv.LogBuf = NULL;
744 cv.LogPtr = 0;
745 cv.LStart = 0;
746 cv.LCount = 0;
747 cv.DStart = 0;
748 cv.DCount = 0;
749 }
750 return (cv.HLogBuf!=NULL);
751 }
752
753 void FreeLogBuf()
754 {
755 if ((cv.HLogBuf==NULL) || FileLog || DDELog)
756 return;
757 if (cv.LogBuf!=NULL)
758 GlobalUnlock(cv.HLogBuf);
759 GlobalFree(cv.HLogBuf);
760 cv.HLogBuf = NULL;
761 cv.LogBuf = NULL;
762 cv.LogPtr = 0;
763 cv.LStart = 0;
764 cv.LCount = 0;
765 cv.DStart = 0;
766 cv.DCount = 0;
767 }
768
769 BOOL CreateBinBuf()
770 {
771 if (cv.HBinBuf==NULL)
772 {
773 cv.HBinBuf = GlobalAlloc(GMEM_MOVEABLE,InBuffSize);
774 cv.BinBuf = NULL;
775 cv.BinPtr = 0;
776 cv.BStart = 0;
777 cv.BCount = 0;
778 }
779 return (cv.HBinBuf!=NULL);
780 }
781
782 void FreeBinBuf()
783 {
784 if ((cv.HBinBuf==NULL) || BinLog)
785 return;
786 if (cv.BinBuf!=NULL)
787 GlobalUnlock(cv.HBinBuf);
788 GlobalFree(cv.HBinBuf);
789 cv.HBinBuf = NULL;
790 cv.BinBuf = NULL;
791 cv.BinPtr = 0;
792 cv.BStart = 0;
793 cv.BCount = 0;
794 }
795
796 extern "C" {
797 void FileSendStart()
798 {
799 LONG Option;
800
801 if (! cv.Ready || FSend) return;
802 if (cv.ProtoFlag)
803 {
804 FreeFileVar(&SendVar);
805 return;
806 }
807
808 if (! LoadTTFILE())
809 return;
810 if (! NewFileVar(&SendVar))
811 {
812 FreeTTFILE();
813 return;
814 }
815 SendVar->OpId = OpSendFile;
816
817 FSend = TRUE;
818
819 if (strlen(&(SendVar->FullName[SendVar->DirLen]))==0)
820 {
821 Option = MAKELONG(ts.TransBin,0);
822 SendVar->FullName[0] = 0;
823 if (! (*GetTransFname)(SendVar, ts.FileDir, GTF_SEND, &Option))
824 {
825 FileTransEnd(OpSendFile);
826 return;
827 }
828 ts.TransBin = LOWORD(Option);
829 }
830 else
831 (*SetFileVar)(SendVar);
832
833 SendVar->FileHandle = _lopen(SendVar->FullName,OF_READ);
834 SendVar->FileOpen = (SendVar->FileHandle>0);
835 if (! SendVar->FileOpen)
836 {
837 FileTransEnd(OpSendFile);
838 return;
839 }
840 SendVar->ByteCount = 0;
841 SendVar->FileSize = GetFSize(SendVar->FullName);
842
843 TalkStatus = IdTalkFile;
844 FileRetrySend = FALSE;
845 FileRetryEcho = FALSE;
846 FileCRSend = FALSE;
847 FileReadEOF = FALSE;
848
849 if (BracketedPasteMode()) {
850 FileBracketMode = FS_BRACKET_START;
851 FileBracketPtr = 0;
852 BinaryMode = TRUE;
853 }
854 else {
855 FileBracketMode = FS_BRACKET_NONE;
856 BinaryMode = ts.TransBin;
857 }
858
859 if (! OpenFTDlg(SendVar))
860 FileTransEnd(OpSendFile);
861 }
862 }
863
864 void FileTransEnd(WORD OpId)
865 /* OpId = 0: close Log and FileSend
866 OpLog: close Log
867 OpSendFile: close FileSend */
868 {
869 if (((OpId==0) || (OpId==OpLog)) && (FileLog || BinLog))
870 {
871 FileLog = FALSE;
872 BinLog = FALSE;
873 if (FLogDlg!=NULL)
874 {
875 FLogDlg->DestroyWindow();
876 FLogDlg = NULL;
877 HWndLog = NULL; // steven add
878 }
879 FreeFileVar(&LogVar);
880 FreeLogBuf();
881 FreeBinBuf();
882 FreeTTFILE();
883 }
884
885 if (((OpId==0) || (OpId==OpSendFile)) && FSend)
886 {
887 FSend = FALSE;
888 TalkStatus = IdTalkKeyb;
889 if (SendDlg!=NULL)
890 {
891 SendDlg->DestroyWindow();
892 SendDlg = NULL;
893 }
894 FreeFileVar(&SendVar);
895 FreeTTFILE();
896 }
897
898 EndDdeCmnd(0);
899 }
900
901 int FSOut1(BYTE b)
902 {
903 if (BinaryMode)
904 return CommBinaryOut(&cv,(PCHAR)&b,1);
905 else if ((b>=0x20) || (b==0x09) || (b==0x0A) || (b==0x0D))
906 return CommTextOut(&cv,(PCHAR)&b,1);
907 else
908 return 1;
909 }
910
911 int FSEcho1(BYTE b)
912 {
913 if (BinaryMode)
914 return CommBinaryEcho(&cv,(PCHAR)&b,1);
915 else
916 return CommTextEcho(&cv,(PCHAR)&b,1);
917 }
918
919 extern "C" {
920 void FileSend()
921 {
922 WORD c, fc;
923 LONG BCOld;
924
925 if ((SendDlg==NULL) ||
926 ((cv.FilePause & OpSendFile) !=0))
927 return;
928
929 BCOld = SendVar->ByteCount;
930
931 if (FileRetrySend)
932 {
933 FileRetryEcho = (ts.LocalEcho>0);
934 c = FSOut1(FileByte);
935 FileRetrySend = (c==0);
936 if (FileRetrySend)
937 return;
938 }
939
940 if (FileRetryEcho)
941 {
942 c = FSEcho1(FileByte);
943 FileRetryEcho = (c==0);
944 if (FileRetryEcho)
945 return;
946 }
947
948 do {
949 if (FileBracketMode == FS_BRACKET_START) {
950 FileByte = BracketStartStr[FileBracketPtr++];
951 fc = 1;
952
953 if (FileBracketPtr >= sizeof(BracketStartStr) - 1) {
954 FileBracketMode = FS_BRACKET_END;
955 FileBracketPtr = 0;
956 BinaryMode = ts.TransBin;
957 }
958 }
959 else if (! FileReadEOF) {
960 fc = _lread(SendVar->FileHandle,&FileByte,1);
961 SendVar->ByteCount = SendVar->ByteCount + fc;
962
963 if (FileCRSend && (fc==1) && (FileByte==0x0A)) {
964 fc = _lread(SendVar->FileHandle,&FileByte,1);
965 SendVar->ByteCount = SendVar->ByteCount + fc;
966 }
967 }
968 else {
969 fc = 0;
970 }
971
972 if (fc == 0 && FileBracketMode == FS_BRACKET_END) {
973 FileReadEOF = TRUE;
974 FileByte = BracketEndStr[FileBracketPtr++];
975 fc = 1;
976 BinaryMode = TRUE;
977
978 if (FileBracketPtr >= sizeof(BracketEndStr) - 1) {
979 FileBracketMode = FS_BRACKET_NONE;
980 FileBracketPtr = 0;
981 }
982 }
983
984
985 if (fc!=0)
986 {
987 c = FSOut1(FileByte);
988 FileCRSend = (ts.TransBin==0) && (FileByte==0x0D);
989 FileRetrySend = (c==0);
990 if (FileRetrySend)
991 {
992 if (SendVar->ByteCount != BCOld)
993 SendDlg->RefreshNum();
994 return;
995 }
996 if (ts.LocalEcho>0)
997 {
998 c = FSEcho1(FileByte);
999 FileRetryEcho = (c==0);
1000 if (FileRetryEcho)
1001 return;
1002 }
1003 }
1004 if ((fc==0) || ((SendVar->ByteCount % 100 == 0) && (FileBracketPtr == 0))) {
1005 SendDlg->RefreshNum();
1006 BCOld = SendVar->ByteCount;
1007 if (fc!=0)
1008 return;
1009 }
1010 } while (fc!=0);
1011
1012 FileTransEnd(OpSendFile);
1013 }
1014 }
1015
1016 extern "C" {
1017 void FLogChangeButton(BOOL Pause)
1018 {
1019 if (FLogDlg!=NULL)
1020 FLogDlg->ChangeButton(Pause);
1021 }
1022 }
1023
1024 extern "C" {
1025 void FLogRefreshNum()
1026 {
1027 if (FLogDlg!=NULL)
1028 FLogDlg->RefreshNum();
1029 }
1030 }
1031
1032 BOOL OpenProtoDlg(PFileVar fv, int IdProto, int Mode, WORD Opt1, WORD Opt2)
1033 {
1034 int vsize;
1035 PProtoDlg pd;
1036 HWND Hpd;
1037 char uimsg[MAX_UIMSG];
1038
1039 ProtoId = IdProto;
1040
1041 switch (ProtoId) {
1042 case PROTO_KMT:
1043 vsize = sizeof(TKmtVar);
1044 break;
1045 case PROTO_XM:
1046 vsize = sizeof(TXVar);
1047 break;
1048 case PROTO_YM:
1049 vsize = sizeof(TYVar);
1050 break;
1051 case PROTO_ZM:
1052 vsize = sizeof(TZVar);
1053 break;
1054 case PROTO_BP:
1055 vsize = sizeof(TBPVar);
1056 break;
1057 case PROTO_QV:
1058 vsize = sizeof(TQVVar);
1059 break;
1060 }
1061 ProtoVar = (PCHAR)malloc(vsize);
1062 if (ProtoVar==NULL)
1063 return FALSE;
1064
1065 switch (ProtoId) {
1066 case PROTO_KMT:
1067 ((PKmtVar)ProtoVar)->KmtMode = Mode;
1068 break;
1069 case PROTO_XM:
1070 ((PXVar)ProtoVar)->XMode = Mode;
1071 ((PXVar)ProtoVar)->XOpt = Opt1;
1072 ((PXVar)ProtoVar)->TextFlag = 1 - (Opt2 & 1);
1073 break;
1074 case PROTO_YM:
1075 ((PYVar)ProtoVar)->YMode = Mode;
1076 ((PYVar)ProtoVar)->YOpt = Opt1;
1077 break;
1078 case PROTO_ZM:
1079 ((PZVar)ProtoVar)->BinFlag = (Opt1 & 1) != 0;
1080 ((PZVar)ProtoVar)->ZMode = Mode;
1081 break;
1082 case PROTO_BP:
1083 ((PBPVar)ProtoVar)->BPMode = Mode;
1084 break;
1085 case PROTO_QV:
1086 ((PQVVar)ProtoVar)->QVMode = Mode;
1087 break;
1088 }
1089
1090 pd = new CProtoDlg();
1091 if (pd==NULL)
1092 {
1093 free(ProtoVar);
1094 ProtoVar = NULL;
1095 return FALSE;
1096 }
1097 pd->Create(fv,&ts);
1098
1099 Hpd=pd->GetSafeHwnd();
1100
1101 GetDlgItemText(Hpd, IDC_PROT_FILENAME, uimsg, sizeof(uimsg));
1102 get_lang_msg("DLG_PROT_FIELNAME", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1103 SetDlgItemText(Hpd, IDC_PROT_FILENAME, ts.UIMsg);
1104 GetDlgItemText(Hpd, IDC_PROT_PROT, uimsg, sizeof(uimsg));
1105 get_lang_msg("DLG_PROT_PROTO", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1106 SetDlgItemText(Hpd, IDC_PROT_PROT, ts.UIMsg);
1107 GetDlgItemText(Hpd, IDC_PROT_PACKET, uimsg, sizeof(uimsg));
1108 get_lang_msg("DLG_PROT_PACKET", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1109 SetDlgItemText(Hpd, IDC_PROT_PACKET, ts.UIMsg);
1110 GetDlgItemText(Hpd, IDC_PROT_TRANS, uimsg, sizeof(uimsg));
1111 get_lang_msg("DLG_PROT_TRANS", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1112 SetDlgItemText(Hpd, IDC_PROT_TRANS, ts.UIMsg);
1113 GetDlgItemText(Hpd, IDCANCEL, uimsg, sizeof(uimsg));
1114 get_lang_msg("BTN_CANCEL", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1115 SetDlgItemText(Hpd, IDCANCEL, ts.UIMsg);
1116
1117 (*ProtoInit)(ProtoId,FileVar,ProtoVar,&cv,&ts);
1118
1119 PtDlg = pd;
1120 return TRUE;
1121 }
1122
1123 extern "C" {
1124 void CloseProtoDlg()
1125 {
1126 if (PtDlg!=NULL)
1127 {
1128 PtDlg->DestroyWindow();
1129 PtDlg = NULL;
1130
1131 ::KillTimer(FileVar->HMainWin,IdProtoTimer);
1132 if ((ProtoId==PROTO_QV) &&
1133 (((PQVVar)ProtoVar)->QVMode==IdQVSend))
1134 CommTextOut(&cv,"\015",1);
1135 if (FileVar->LogFlag)
1136 _lclose(FileVar->LogFile);
1137 FileVar->LogFile = 0;
1138 if (ProtoVar!=NULL)
1139 {
1140 free(ProtoVar);
1141 ProtoVar = NULL;
1142 }
1143 }
1144 }
1145 }
1146
1147 BOOL ProtoStart()
1148 {
1149 if (cv.ProtoFlag)
1150 return FALSE;
1151 if (FSend)
1152 {
1153 FreeFileVar(&FileVar);
1154 return FALSE;
1155 }
1156
1157 if (! LoadTTFILE())
1158 return FALSE;
1159 NewFileVar(&FileVar);
1160
1161 if (FileVar==NULL)
1162 {
1163 FreeTTFILE();
1164 return FALSE;
1165 }
1166 cv.ProtoFlag = TRUE;
1167 return TRUE;
1168 }
1169
1170 void ProtoEnd()
1171 {
1172 if (! cv.ProtoFlag)
1173 return;
1174 cv.ProtoFlag = FALSE;
1175
1176 /* Enable transmit delay (serial port) */
1177 cv.DelayFlag = TRUE;
1178 TalkStatus = IdTalkKeyb;
1179
1180 CloseProtoDlg();
1181
1182 if ((FileVar!=NULL) && FileVar->Success)
1183 EndDdeCmnd(1);
1184 else
1185 EndDdeCmnd(0);
1186
1187 FreeTTFILE();
1188 FreeFileVar(&FileVar);
1189 }
1190
1191 extern "C" {
1192 int ProtoDlgParse()
1193 {
1194 int P;
1195
1196 P = ActiveWin;
1197 if (PtDlg==NULL)
1198 return P;
1199
1200 if ((*ProtoParse)(ProtoId,FileVar,ProtoVar,&cv))
1201 P = 0; /* continue */
1202 else {
1203 CommSend(&cv);
1204 ProtoEnd();
1205 }
1206 return P;
1207 }
1208 }
1209
1210 extern "C" {
1211 void ProtoDlgTimeOut()
1212 {
1213 if (PtDlg!=NULL)
1214 (*ProtoTimeOutProc)(ProtoId,FileVar,ProtoVar,&cv);
1215 }
1216 }
1217
1218 extern "C" {
1219 void ProtoDlgCancel()
1220 {
1221 if ((PtDlg!=NULL) &&
1222 (*ProtoCancel)(ProtoId,FileVar,ProtoVar,&cv))
1223 ProtoEnd();
1224 }
1225 }
1226
1227 extern "C" {
1228 void KermitStart(int mode)
1229 {
1230 WORD w;
1231
1232 if (! ProtoStart())
1233 return;
1234
1235 switch (mode) {
1236 case IdKmtSend:
1237 FileVar->OpId = OpKmtSend;
1238 if (strlen(&(FileVar->FullName[FileVar->DirLen]))==0)
1239 {
1240 if (! (*GetMultiFname)(FileVar,ts.FileDir,GMF_KERMIT,&w) ||
1241 (FileVar->NumFname==0))
1242 {
1243 ProtoEnd();
1244 return;
1245 }
1246 }
1247 else
1248 (*SetFileVar)(FileVar);
1249 break;
1250 case IdKmtReceive:
1251 FileVar->OpId = OpKmtRcv;
1252 break;
1253 case IdKmtGet:
1254 FileVar->OpId = OpKmtSend;
1255 if (strlen(&(FileVar->FullName[FileVar->DirLen]))==0)
1256 {
1257 if (! (*GetGetFname)(FileVar->HMainWin,FileVar) ||
1258 (strlen(FileVar->FullName)==0))
1259 {
1260 ProtoEnd();
1261 return;
1262 }
1263 }
1264 else
1265 (*SetFileVar)(FileVar);
1266 break;
1267 case IdKmtFinish:
1268 FileVar->OpId = OpKmtFin;
1269 break;
1270 default:
1271 ProtoEnd();
1272 return;
1273 }
1274 TalkStatus = IdTalkQuiet;
1275
1276 /* disable transmit delay (serial port) */
1277 cv.DelayFlag = FALSE;
1278
1279 if (! OpenProtoDlg(FileVar,PROTO_KMT,mode,0,0))
1280 ProtoEnd();
1281 }
1282 }
1283
1284 extern "C" {
1285 void XMODEMStart(int mode)
1286 {
1287 LONG Option;
1288
1289 if (! ProtoStart())
1290 return;
1291
1292 if (mode==IdXReceive)
1293 FileVar->OpId = OpXRcv;
1294 else
1295 FileVar->OpId = OpXSend;
1296
1297 if (strlen(&(FileVar->FullName[FileVar->DirLen]))==0)
1298 {
1299 Option = MAKELONG(ts.XmodemBin,ts.XmodemOpt);
1300 if (! (*GetXFname)(FileVar->HMainWin,
1301 mode==IdXReceive,&Option,FileVar,ts.FileDir))
1302 {
1303 ProtoEnd();
1304 return;
1305 }
1306 ts.XmodemOpt = HIWORD(Option);
1307 ts.XmodemBin = LOWORD(Option);
1308 }
1309 else
1310 (*SetFileVar)(FileVar);
1311
1312 if (mode==IdXReceive)
1313 FileVar->FileHandle = _lcreat(FileVar->FullName,0);
1314 else
1315 FileVar->FileHandle = _lopen(FileVar->FullName,OF_READ);
1316
1317 FileVar->FileOpen = FileVar->FileHandle>0;
1318 if (! FileVar->FileOpen)
1319 {
1320 ProtoEnd();
1321 return;
1322 }
1323 TalkStatus = IdTalkQuiet;
1324
1325 /* disable transmit delay (serial port) */
1326 cv.DelayFlag = FALSE;
1327
1328 if (! OpenProtoDlg(FileVar,PROTO_XM,mode,
1329 ts.XmodemOpt,ts.XmodemBin))
1330 ProtoEnd();
1331 }
1332 }
1333
1334 extern "C" {
1335 void YMODEMStart(int mode)
1336 {
1337 WORD Opt;
1338
1339 if (! ProtoStart())
1340 return;
1341
1342 if (mode==IdYSend)
1343 {
1344 // �t�@�C���]�������I�v�V������"Yopt1K"�����������B
1345 // TODO: "Yopt1K", "YoptG", "YoptSingle"�������������������AIDD_FOPT���g�������K�v�����B
1346 Opt = Yopt1K;
1347 FileVar->OpId = OpYSend;
1348 if (strlen(&(FileVar->FullName[FileVar->DirLen]))==0)
1349 {
1350 if (! (*GetMultiFname)(FileVar,ts.FileDir,GMF_Y,&Opt) ||
1351 (FileVar->NumFname==0))
1352 {
1353 ProtoEnd();
1354 return;
1355 }
1356 //ts.XmodemBin = Opt;
1357 }
1358 else
1359 (*SetFileVar)(FileVar);
1360 }
1361 else {/* IdZReceive or IdZAuto */
1362 FileVar->OpId = OpYRcv;
1363 // �t�@�C���]�������I�v�V������"Yopt1K"�����������B
1364 Opt = Yopt1K;
1365 (*SetFileVar)(FileVar);
1366 }
1367
1368 TalkStatus = IdTalkQuiet;
1369
1370 /* disable transmit delay (serial port) */
1371 cv.DelayFlag = FALSE;
1372
1373 if (! OpenProtoDlg(FileVar,PROTO_YM,mode,Opt,0))
1374 ProtoEnd();
1375 }
1376 }
1377
1378 extern "C" {
1379 void ZMODEMStart(int mode)
1380 {
1381 WORD Opt;
1382
1383 if (! ProtoStart())
1384 return;
1385
1386 if (mode==IdZSend)
1387 {
1388 Opt = ts.XmodemBin;
1389 FileVar->OpId = OpZSend;
1390 if (strlen(&(FileVar->FullName[FileVar->DirLen]))==0)
1391 {
1392 if (! (*GetMultiFname)(FileVar,ts.FileDir,GMF_Z,&Opt) ||
1393 (FileVar->NumFname==0))
1394 {
1395 ProtoEnd();
1396 return;
1397 }
1398 ts.XmodemBin = Opt;
1399 }
1400 else
1401 (*SetFileVar)(FileVar);
1402 }
1403 else /* IdZReceive or IdZAuto */
1404 FileVar->OpId = OpZRcv;
1405
1406 TalkStatus = IdTalkQuiet;
1407
1408 /* disable transmit delay (serial port) */
1409 cv.DelayFlag = FALSE;
1410
1411 if (! OpenProtoDlg(FileVar,PROTO_ZM,mode,Opt,0))
1412 ProtoEnd();
1413 }
1414 }
1415
1416 extern "C" {
1417 void BPStart(int mode)
1418 {
1419 LONG Option;
1420
1421 if (! ProtoStart())
1422 return;
1423 if (mode==IdBPSend)
1424 {
1425 FileVar->OpId = OpBPSend;
1426 if (strlen(&(FileVar->FullName[FileVar->DirLen]))==0)
1427 {
1428 FileVar->FullName[0] = 0;
1429 if (! (*GetTransFname)(FileVar, ts.FileDir, GTF_BP, &Option))
1430 {
1431 ProtoEnd();
1432 return;
1433 }
1434 }
1435 else
1436 (*SetFileVar)(FileVar);
1437 }
1438 else /* IdBPReceive or IdBPAuto */
1439 FileVar->OpId = OpBPRcv;
1440
1441 TalkStatus = IdTalkQuiet;
1442
1443 /* disable transmit delay (serial port) */
1444 cv.DelayFlag = FALSE;
1445
1446 if (! OpenProtoDlg(FileVar,PROTO_BP,mode,0,0))
1447 ProtoEnd();
1448 }
1449 }
1450
1451 extern "C" {
1452 void QVStart(int mode)
1453 {
1454 WORD W;
1455
1456 if (! ProtoStart())
1457 return;
1458
1459 if (mode==IdQVSend)
1460 {
1461 FileVar->OpId = OpQVSend;
1462 if (strlen(&(FileVar->FullName[FileVar->DirLen]))==0)
1463 {
1464 if (! (*GetMultiFname)(FileVar,ts.FileDir,GMF_QV, &W) ||
1465 (FileVar->NumFname==0))
1466 {
1467 ProtoEnd();
1468 return;
1469 }
1470 }
1471 else
1472 (*SetFileVar)(FileVar);
1473 }
1474 else
1475 FileVar->OpId = OpQVRcv;
1476
1477 TalkStatus = IdTalkQuiet;
1478
1479 /* disable transmit delay (serial port) */
1480 cv.DelayFlag = FALSE;
1481
1482 if (! OpenProtoDlg(FileVar,PROTO_QV,mode,0,0))
1483 ProtoEnd();
1484 }
1485 }

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