Develop and Download Open Source Software

Browse CVS Repository

Contents of /ttssh2/teraterm/source/teraterm/filesys.cpp

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.2 - (show annotations) (download) (as text)
Sun Feb 20 14:51:29 2005 UTC (19 years, 1 month ago) by yutakakn
Branch: MAIN
CVS Tags: R412_RTM, R413_RTM, R415_RTM, R414_RTM, R411_RTM
Changes since 1.1: +77 -64 lines
File MIME type: text/x-c++src
ログファイルの種別に"plain text"を追加。このオプションが有効の場合は、ログファイルに
ASCII非表示文字の採取をしない。

現在、無視するキャラクタは以下のとおり。
 ・BS
 ・ASCII(0x00-0x1f)のうち非表示なもの

ただし、例外として以下のものはログ採取対象。
 ・HT
 ・CR
 ・LF

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 #ifdef TERATERM32
11 #include "tt_res.h"
12 #else
13 #include "tt_res16.h"
14 #endif
15 #include "ftdlg.h"
16 #include "protodlg.h"
17 #include "ttwinman.h"
18 #include "commlib.h"
19 #include "ttcommon.h"
20 #include "ttdde.h"
21 #include "ttlib.h"
22 #include "helpid.h"
23
24 #include "filesys.h"
25
26 PFileVar LogVar = NULL;
27 PFileVar SendVar = NULL;
28 PFileVar FileVar = NULL;
29 static PCHAR ProtoVar = NULL;
30 static int ProtoId;
31
32 static BYTE LogLast = 0;
33 BOOL FileLog = FALSE;
34 BOOL BinLog = FALSE;
35 BOOL DDELog = FALSE;
36 static BOOL FileRetrySend, FileRetryEcho, FileCRSend;
37 static BYTE FileByte;
38
39 static BOOL FSend = FALSE;
40
41 static HMODULE HTTFILE = NULL;
42 static int TTFILECount = 0;
43
44 PGetSetupFname GetSetupFname;
45 PGetTransFname GetTransFname;
46 PGetMultiFname GetMultiFname;
47 PGetGetFname GetGetFname;
48 PSetFileVar SetFileVar;
49 PGetXFname GetXFname;
50 PProtoInit ProtoInit;
51 PProtoParse ProtoParse;
52 PProtoTimeOutProc ProtoTimeOutProc;
53 PProtoCancel ProtoCancel;
54
55 #define IdGetSetupFname 1
56 #define IdGetTransFname 2
57 #define IdGetMultiFname 3
58 #define IdGetGetFname 4
59 #define IdSetFileVar 5
60 #define IdGetXFname 6
61
62 #define IdProtoInit 7
63 #define IdProtoParse 8
64 #define IdProtoTimeOutProc 9
65 #define IdProtoCancel 10
66
67 BOOL LoadTTFILE()
68 {
69 BOOL Err;
70
71 #ifdef TERATERM32
72 if (HTTFILE != NULL)
73 #else
74 if (HTTFILE >= HINSTANCE_ERROR)
75 #endif
76 {
77 TTFILECount++;
78 return TRUE;
79 }
80 else
81 TTFILECount = 0;
82
83 #ifdef TERATERM32
84 HTTFILE = LoadLibrary("TTPFILE.DLL");
85 if (HTTFILE == NULL) return FALSE;
86 #else
87 HTTFILE = LoadLibrary("TTFILE.DLL");
88 if (HTTFILE < HINSTANCE_ERROR) return FALSE;
89 #endif
90
91 Err = FALSE;
92 GetSetupFname = (PGetSetupFname)GetProcAddress(HTTFILE,
93 MAKEINTRESOURCE(IdGetSetupFname));
94 if (GetSetupFname==NULL) Err = TRUE;
95
96 GetTransFname = (PGetTransFname)GetProcAddress(HTTFILE,
97 MAKEINTRESOURCE(IdGetTransFname));
98 if (GetTransFname==NULL) Err = TRUE;
99
100 GetMultiFname = (PGetMultiFname)GetProcAddress(HTTFILE,
101 MAKEINTRESOURCE(IdGetMultiFname));
102 if (GetMultiFname==NULL) Err = TRUE;
103
104 GetGetFname = (PGetGetFname)GetProcAddress(HTTFILE,
105 MAKEINTRESOURCE(IdGetGetFname));
106 if (GetGetFname==NULL) Err = TRUE;
107
108 SetFileVar = (PSetFileVar)GetProcAddress(HTTFILE,
109 MAKEINTRESOURCE(IdSetFileVar));
110 if (SetFileVar==NULL) Err = TRUE;
111
112 GetXFname = (PGetXFname)GetProcAddress(HTTFILE,
113 MAKEINTRESOURCE(IdGetXFname));
114 if (GetXFname==NULL) Err = TRUE;
115
116 ProtoInit = (PProtoInit)GetProcAddress(HTTFILE,
117 MAKEINTRESOURCE(IdProtoInit));
118 if (ProtoInit==NULL) Err = TRUE;
119
120 ProtoParse = (PProtoParse)GetProcAddress(HTTFILE,
121 MAKEINTRESOURCE(IdProtoParse));
122 if (ProtoParse==NULL) Err = TRUE;
123
124 ProtoTimeOutProc = (PProtoTimeOutProc)GetProcAddress(HTTFILE,
125 MAKEINTRESOURCE(IdProtoTimeOutProc));
126 if (ProtoTimeOutProc==NULL) Err = TRUE;
127
128 ProtoCancel = (PProtoCancel)GetProcAddress(HTTFILE,
129 MAKEINTRESOURCE(IdProtoCancel));
130 if (ProtoCancel==NULL) Err = TRUE;
131
132 if (Err)
133 {
134 FreeLibrary(HTTFILE);
135 HTTFILE = NULL;
136 return FALSE;
137 }
138 else {
139 TTFILECount = 1;
140 return TRUE;
141 }
142 }
143
144 BOOL FreeTTFILE()
145 {
146 if (TTFILECount==0) return FALSE;
147 TTFILECount--;
148 if (TTFILECount>0) return TRUE;
149 #ifdef TERATERM32
150 if (HTTFILE!=NULL)
151 #else
152 if (HTTFILE>=HINSTANCE_ERROR)
153 #endif
154 {
155 FreeLibrary(HTTFILE);
156 HTTFILE = NULL;
157 }
158 return TRUE;
159 }
160
161 static PFileTransDlg FLogDlg = NULL;
162 static PFileTransDlg SendDlg = NULL;
163 static PProtoDlg PtDlg = NULL;
164
165 BOOL OpenFTDlg(PFileVar fv)
166 {
167 PFileTransDlg FTDlg;
168
169 FTDlg = new CFileTransDlg();
170
171 if (FTDlg!=NULL)
172 {
173 FTDlg->Create(fv, &cv);
174 FTDlg->RefreshNum();
175 if (fv->OpId == OpLog)
176 FTDlg->ShowWindow(SW_MINIMIZE);
177 }
178
179 if (fv->OpId==OpLog)
180 FLogDlg = FTDlg; /* Log */
181 else
182 SendDlg = FTDlg; /* File send */
183
184 return (FTDlg!=NULL);
185 }
186
187 BOOL NewFileVar(PFileVar *fv)
188 {
189 if ((*fv)==NULL)
190 {
191 *fv = (PFileVar)malloc(sizeof(TFileVar));
192 if ((*fv)!=NULL)
193 {
194 memset(*fv, 0, sizeof(TFileVar));
195 strcpy((*fv)->FullName,ts.FileDir);
196 AppendSlash((*fv)->FullName);
197 (*fv)->DirLen = strlen((*fv)->FullName);
198 (*fv)->FileOpen = FALSE;
199 (*fv)->OverWrite = ((ts.FTFlag & FT_RENAME) == 0);
200 (*fv)->HMainWin = HVTWin;
201 (*fv)->Success = FALSE;
202 (*fv)->NoMsg = FALSE;
203 }
204 }
205
206 return ((*fv)!=NULL);
207 }
208
209 void FreeFileVar(PFileVar *fv)
210 {
211 if ((*fv)!=NULL)
212 {
213 if ((*fv)->FileOpen) _lclose((*fv)->FileHandle);
214 if ((*fv)->FnStrMemHandle>0)
215 {
216 GlobalUnlock((*fv)->FnStrMemHandle);
217 GlobalFree((*fv)->FnStrMemHandle);
218 }
219 free(*fv);
220 *fv = NULL;
221 }
222 }
223
224 extern "C" {
225 void LogStart()
226 {
227 LONG Option;
228
229 if ((FileLog) || (BinLog)) return;
230
231 if (! LoadTTFILE()) return;
232 if (! NewFileVar(&LogVar))
233 {
234 FreeTTFILE();
235 return;
236 }
237 LogVar->OpId = OpLog;
238
239 if (strlen(&(LogVar->FullName[LogVar->DirLen]))==0)
240 {
241 // 0x1000 = plain text (2005.2.20 yutaka)
242 Option = MAKELONG(ts.TransBin,ts.Append | 0x1000);
243 if (! (*GetTransFname)(LogVar, ts.FileDir, GTF_LOG, &Option))
244 {
245 FreeFileVar(&LogVar);
246 FreeTTFILE();
247 return;
248 }
249 ts.TransBin = LOWORD(Option);
250 ts.Append = HIWORD(Option);
251
252 if (ts.Append & 0x1000) {
253 ts.LogTypePlainText = 1;
254 } else {
255 ts.LogTypePlainText = 0;
256 }
257 ts.Append &= 0x1; // 1bit?ス?ス?ス}?スX?スN?ス?ス?ス?ス
258
259 }
260 else
261 (*SetFileVar)(LogVar);
262
263 if (ts.TransBin > 0)
264 {
265 BinLog = TRUE;
266 FileLog = FALSE;
267 if (! CreateBinBuf())
268 {
269 FileTransEnd(OpLog);
270 return;
271 }
272 }
273 else {
274 BinLog = FALSE;
275 FileLog = TRUE;
276 if (! CreateLogBuf())
277 {
278 FileTransEnd(OpLog);
279 return;
280 }
281 }
282 cv.LStart = cv.LogPtr;
283 cv.LCount = 0;
284
285 HelpId = HlpFileLog;
286 if (ts.Append > 0)
287 {
288 LogVar->FileHandle = _lopen(LogVar->FullName,OF_WRITE);
289 if (LogVar->FileHandle>0)
290 _llseek(LogVar->FileHandle,0,2);
291 else
292 LogVar->FileHandle = _lcreat(LogVar->FullName,0);
293 }
294 else
295 LogVar->FileHandle = _lcreat(LogVar->FullName,0);
296 LogVar->FileOpen = (LogVar->FileHandle>0);
297 if (! LogVar->FileOpen)
298 {
299 FileTransEnd(OpLog);
300 return;
301 }
302 LogVar->ByteCount = 0;
303
304 if (! OpenFTDlg(LogVar))
305 FileTransEnd(OpLog);
306 }
307 }
308
309 void LogPut1(BYTE b)
310 {
311 LogLast = b;
312 cv.LogBuf[cv.LogPtr] = b;
313 cv.LogPtr++;
314 if (cv.LogPtr>=InBuffSize)
315 cv.LogPtr = cv.LogPtr-InBuffSize;
316
317 if (FileLog)
318 {
319 if (cv.LCount>=InBuffSize)
320 {
321 cv.LCount = InBuffSize;
322 cv.LStart = cv.LogPtr;
323 }
324 else cv.LCount++;
325 }
326 else
327 cv.LCount = 0;
328
329 if (DDELog)
330 {
331 if (cv.DCount>=InBuffSize)
332 {
333 cv.DCount = InBuffSize;
334 cv.DStart = cv.LogPtr;
335 }
336 else cv.DCount++;
337 }
338 else
339 cv.DCount = 0;
340 }
341
342 void Log1Byte(BYTE b)
343 {
344 if (b==0x0d)
345 {
346 LogLast = b;
347 return;
348 }
349 if ((b==0x0a) && (LogLast==0x0d))
350 LogPut1(0x0d);
351 LogPut1(b);
352 }
353
354 static BOOL Get1(PCHAR Buf, int *Start, int *Count, PBYTE b)
355 {
356 if (*Count<=0) return FALSE;
357 *b = Buf[*Start];
358 (*Start)++;
359 if (*Start>=InBuffSize)
360 *Start = *Start-InBuffSize;
361 (*Count)--;
362 return TRUE;
363 }
364
365
366
367 static CRITICAL_SECTION g_filelog_lock; /* ?ス?ス?スb?スN?スp?ス?ス?ス?ス */
368
369 void logfile_lock_initialize(void)
370 {
371 InitializeCriticalSection(&g_filelog_lock);
372 }
373
374 static inline void logfile_lock(void)
375 {
376 EnterCriticalSection(&g_filelog_lock);
377 }
378
379 static inline void logfile_unlock(void)
380 {
381 LeaveCriticalSection(&g_filelog_lock);
382 }
383
384 // ?スR?ス?ス?ス?ス?スg?ス?ス?ス?ス?スO?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス
385 void CommentLogToFile(char *buf, int size)
386 {
387 DWORD wrote;
388
389 if (LogVar == NULL || !LogVar->FileOpen) {
390 ::MessageBox(NULL, "It is not opened by the log file yet.", "ERROR", MB_OK|MB_ICONEXCLAMATION);
391 return;
392 }
393
394 logfile_lock();
395 WriteFile((HANDLE)LogVar->FileHandle, buf, size, &wrote, NULL);
396 WriteFile((HANDLE)LogVar->FileHandle, "\r\n", 2, &wrote, NULL); // ?ス?ス?スs
397 logfile_unlock();
398 }
399
400 void LogToFile()
401 {
402 PCHAR Buf;
403 int Start, Count;
404 BYTE b;
405
406 if (! LogVar->FileOpen) return;
407 if (FileLog)
408 {
409 Buf = cv.LogBuf;
410 Start = cv.LStart;
411 Count = cv.LCount;
412 }
413 else if (BinLog)
414 {
415 Buf = cv.BinBuf;
416 Start = cv.BStart;
417 Count = cv.BCount;
418 }
419 else
420 return;
421
422 if (Buf==NULL) return;
423 if (Count==0) return;
424
425 // ?ス?ス?スb?スN?ス?ス?ス?ス?ス?ス(2004.8.6 yutaka)
426 logfile_lock();
427
428 while (Get1(Buf,&Start,&Count,&b))
429 {
430 if (((cv.FilePause & OpLog)==0) && (! cv.ProtoFlag))
431 {
432 _lwrite(LogVar->FileHandle,(PCHAR)&b,1);
433 (LogVar->ByteCount)++;
434 }
435 }
436
437 logfile_unlock();
438
439 if (FileLog)
440 {
441 cv.LStart = Start;
442 cv.LCount = Count;
443 }
444 else {
445 cv.BStart = Start;
446 cv.BCount = Count;
447 }
448 if (((cv.FilePause & OpLog) !=0) || cv.ProtoFlag) return;
449 if (FLogDlg!=NULL)
450 FLogDlg->RefreshNum();
451 }
452
453 BOOL CreateLogBuf()
454 {
455 if (cv.HLogBuf==NULL)
456 {
457 cv.HLogBuf = GlobalAlloc(GMEM_MOVEABLE,InBuffSize);
458 cv.LogBuf = NULL;
459 cv.LogPtr = 0;
460 cv.LStart = 0;
461 cv.LCount = 0;
462 cv.DStart = 0;
463 cv.DCount = 0;
464 }
465 return (cv.HLogBuf!=NULL);
466 }
467
468 void FreeLogBuf()
469 {
470 if ((cv.HLogBuf==NULL) || FileLog || DDELog) return;
471 if (cv.LogBuf!=NULL) GlobalUnlock(cv.HLogBuf);
472 GlobalFree(cv.HLogBuf);
473 cv.HLogBuf = NULL;
474 cv.LogBuf = NULL;
475 cv.LogPtr = 0;
476 cv.LStart = 0;
477 cv.LCount = 0;
478 cv.DStart = 0;
479 cv.DCount = 0;
480 }
481
482 BOOL CreateBinBuf()
483 {
484 if (cv.HBinBuf==NULL)
485 {
486 cv.HBinBuf = GlobalAlloc(GMEM_MOVEABLE,InBuffSize);
487 cv.BinBuf = NULL;
488 cv.BinPtr = 0;
489 cv.BStart = 0;
490 cv.BCount = 0;
491 }
492 return (cv.HBinBuf!=NULL);
493 }
494
495 void FreeBinBuf()
496 {
497 if ((cv.HBinBuf==NULL) || BinLog) return;
498 if (cv.BinBuf!=NULL) GlobalUnlock(cv.HBinBuf);
499 GlobalFree(cv.HBinBuf);
500 cv.HBinBuf = NULL;
501 cv.BinBuf = NULL;
502 cv.BinPtr = 0;
503 cv.BStart = 0;
504 cv.BCount = 0;
505 }
506
507 extern "C" {
508 void FileSendStart()
509 {
510 LONG Option;
511
512 if (! cv.Ready || FSend) return;
513 if (cv.ProtoFlag)
514 {
515 FreeFileVar(&SendVar);
516 return;
517 }
518
519 if (! LoadTTFILE()) return;
520 if (! NewFileVar(&SendVar))
521 {
522 FreeTTFILE();
523 return;
524 }
525 SendVar->OpId = OpSendFile;
526
527 FSend = TRUE;
528
529 if (strlen(&(SendVar->FullName[SendVar->DirLen]))==0)
530 {
531 Option = MAKELONG(ts.TransBin,0);
532 if (! (*GetTransFname)(SendVar, ts.FileDir, GTF_SEND, &Option))
533 {
534 FileTransEnd(OpSendFile);
535 return;
536 }
537 ts.TransBin = LOWORD(Option);
538 }
539 else
540 (*SetFileVar)(SendVar);
541
542 SendVar->FileHandle = _lopen(SendVar->FullName,OF_READ);
543 SendVar->FileOpen = (SendVar->FileHandle>0);
544 if (! SendVar->FileOpen)
545 {
546 FileTransEnd(OpSendFile);
547 return;
548 }
549 SendVar->ByteCount = 0;
550
551 TalkStatus = IdTalkFile;
552 FileRetrySend = FALSE;
553 FileRetryEcho = FALSE;
554 FileCRSend = FALSE;
555
556 if (! OpenFTDlg(SendVar))
557 FileTransEnd(OpSendFile);
558 }
559 }
560
561 void FileTransEnd(WORD OpId)
562 /* OpId = 0: close Log and FileSend
563 OpLog: close Log
564 OpSendFile: close FileSend */
565 {
566 if (((OpId==0) || (OpId==OpLog)) &&
567 (FileLog || BinLog))
568 {
569 FileLog = FALSE;
570 BinLog = FALSE;
571 if (FLogDlg!=NULL)
572 {
573 FLogDlg->DestroyWindow();
574 FLogDlg = NULL;
575 }
576 FreeFileVar(&LogVar);
577 FreeLogBuf();
578 FreeBinBuf();
579 FreeTTFILE();
580 }
581
582 if (((OpId==0) || (OpId==OpSendFile)) &&
583 FSend)
584 {
585 FSend = FALSE;
586 TalkStatus = IdTalkKeyb;
587 if (SendDlg!=NULL)
588 {
589 SendDlg->DestroyWindow();
590 SendDlg = NULL;
591 }
592 FreeFileVar(&SendVar);
593 FreeTTFILE();
594 }
595
596 EndDdeCmnd(0);
597 }
598
599 // vtwin.cpp ?ス?ス?ス?ス?スR?ス[?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?スAextern "C"?ス?ス?スt?ス?ス?ス?ス?スB(2004.11.3 yutaka)
600 extern "C" {
601 int FSOut1(BYTE b)
602 {
603 if (ts.TransBin > 0)
604 return CommBinaryOut(&cv,(PCHAR)&b,1);
605 else if ((b>=0x20) || (b==0x09) || (b==0x0A) || (b==0x0D))
606 return CommTextOut(&cv,(PCHAR)&b,1);
607 else
608 return 1;
609 }
610
611 int FSEcho1(BYTE b)
612 {
613 if (ts.TransBin > 0)
614 return CommBinaryEcho(&cv,(PCHAR)&b,1);
615 else
616 return CommTextEcho(&cv,(PCHAR)&b,1);
617 }
618 }
619
620 extern "C" {
621 void FileSend()
622 {
623 WORD c, fc;
624 LONG BCOld;
625
626 if ((SendDlg==NULL) ||
627 ((cv.FilePause & OpSendFile) !=0)) return;
628
629 BCOld = SendVar->ByteCount;
630
631 if (FileRetrySend)
632 {
633 FileRetryEcho = (ts.LocalEcho>0);
634 c = FSOut1(FileByte);
635 FileRetrySend = (c==0);
636 if (FileRetrySend) return;
637 }
638
639 if (FileRetryEcho)
640 {
641 c = FSEcho1(FileByte);
642 FileRetryEcho = (c==0);
643 if (FileRetryEcho) return;
644 }
645
646 do {
647 fc = _lread(SendVar->FileHandle,&FileByte,1);
648 SendVar->ByteCount = SendVar->ByteCount + fc;
649
650 if (FileCRSend && (fc==1) && (FileByte==0x0A))
651 {
652 fc = _lread(SendVar->FileHandle,&FileByte,1);
653 SendVar->ByteCount = SendVar->ByteCount + fc;
654 }
655
656 if (fc!=0)
657 {
658 c = FSOut1(FileByte);
659 FileCRSend = (ts.TransBin==0) && (FileByte==0x0D);
660 FileRetrySend = (c==0);
661 if (FileRetrySend)
662 {
663 if (SendVar->ByteCount != BCOld)
664 SendDlg->RefreshNum();
665 return;
666 }
667 if (ts.LocalEcho>0)
668 {
669 c = FSEcho1(FileByte);
670 FileRetryEcho = (c==0);
671 if (FileRetryEcho) return;
672 }
673 }
674 if ((fc==0) || (SendVar->ByteCount % 100 == 0))
675 {
676 SendDlg->RefreshNum();
677 BCOld = SendVar->ByteCount;
678 if (fc!=0) return;
679 }
680 } while (fc!=0);
681
682 FileTransEnd(OpSendFile);
683 }
684 }
685
686 extern "C" {
687 void FLogChangeButton(BOOL Pause)
688 {
689 if (FLogDlg!=NULL)
690 FLogDlg->ChangeButton(Pause);
691 }
692 }
693
694 extern "C" {
695 void FLogRefreshNum()
696 {
697 if (FLogDlg!=NULL)
698 FLogDlg->RefreshNum();
699 }
700 }
701
702 BOOL OpenProtoDlg(PFileVar fv, int IdProto, int Mode, WORD Opt1, WORD Opt2)
703 {
704 int vsize;
705 PProtoDlg pd;
706
707 ProtoId = IdProto;
708
709 switch (ProtoId) {
710 case PROTO_KMT:
711 vsize = sizeof(TKmtVar);
712 break;
713 case PROTO_XM:
714 vsize = sizeof(TXVar);
715 break;
716 case PROTO_ZM:
717 vsize = sizeof(TZVar);
718 break;
719 case PROTO_BP:
720 vsize = sizeof(TBPVar);
721 break;
722 case PROTO_QV:
723 vsize = sizeof(TQVVar);
724 break;
725 }
726 ProtoVar = (PCHAR)malloc(vsize);
727 if (ProtoVar==NULL) return FALSE;
728
729 switch (ProtoId) {
730 case PROTO_KMT:
731 ((PKmtVar)ProtoVar)->KmtMode = Mode;
732 break;
733 case PROTO_XM:
734 ((PXVar)ProtoVar)->XMode = Mode;
735 ((PXVar)ProtoVar)->XOpt = Opt1;
736 ((PXVar)ProtoVar)->TextFlag = 1 - (Opt2 & 1);
737 break;
738 case PROTO_ZM:
739 ((PZVar)ProtoVar)->BinFlag = (Opt1 & 1) != 0;
740 ((PZVar)ProtoVar)->ZMode = Mode;
741 break;
742 case PROTO_BP:
743 ((PBPVar)ProtoVar)->BPMode = Mode;
744 break;
745 case PROTO_QV:
746 ((PQVVar)ProtoVar)->QVMode = Mode;
747 break;
748 }
749
750 pd = new CProtoDlg();
751 if (pd==NULL)
752 {
753 free(ProtoVar);
754 ProtoVar = NULL;
755 return FALSE;
756 }
757 pd->Create(fv);
758
759 (*ProtoInit)(ProtoId,FileVar,ProtoVar,&cv,&ts);
760
761 PtDlg = pd;
762 return TRUE;
763 }
764
765 extern "C" {
766 void CloseProtoDlg()
767 {
768 if (PtDlg!=NULL)
769 {
770 PtDlg->DestroyWindow();
771 PtDlg = NULL;
772
773 ::KillTimer(FileVar->HMainWin,IdProtoTimer);
774 if ((ProtoId==PROTO_QV) &&
775 (((PQVVar)ProtoVar)->QVMode==IdQVSend))
776 CommTextOut(&cv,"\015",1);
777 if (FileVar->LogFlag)
778 _lclose(FileVar->LogFile);
779 FileVar->LogFile = 0;
780 if (ProtoVar!=NULL)
781 {
782 free(ProtoVar);
783 ProtoVar = NULL;
784 }
785 }
786 }
787 }
788
789 BOOL ProtoStart()
790 {
791 if (cv.ProtoFlag) return FALSE;
792 if (FSend)
793 {
794 FreeFileVar(&FileVar);
795 return FALSE;
796 }
797
798 if (! LoadTTFILE()) return FALSE;
799 NewFileVar(&FileVar);
800
801 if (FileVar==NULL)
802 {
803 FreeTTFILE();
804 return FALSE;
805 }
806 cv.ProtoFlag = TRUE;
807 return TRUE;
808 }
809
810 void ProtoEnd()
811 {
812 if (! cv.ProtoFlag) return;
813 cv.ProtoFlag = FALSE;
814
815 /* Enable transmit delay (serial port) */
816 cv.DelayFlag = TRUE;
817 TalkStatus = IdTalkKeyb;
818
819 CloseProtoDlg();
820
821 if ((FileVar!=NULL) && FileVar->Success)
822 EndDdeCmnd(1);
823 else
824 EndDdeCmnd(0);
825
826 FreeTTFILE();
827 FreeFileVar(&FileVar);
828 }
829
830 extern "C" {
831 int ProtoDlgParse()
832 {
833 int P;
834
835 P = ActiveWin;
836 if (PtDlg==NULL) return P;
837
838 if ((*ProtoParse)(ProtoId,FileVar,ProtoVar,&cv))
839 P = 0; /* continue */
840 else {
841 CommSend(&cv);
842 ProtoEnd();
843 }
844 return P;
845 }
846 }
847
848 extern "C" {
849 void ProtoDlgTimeOut()
850 {
851 if (PtDlg!=NULL)
852 (*ProtoTimeOutProc)(ProtoId,FileVar,ProtoVar,&cv);
853 }
854 }
855
856 extern "C" {
857 void ProtoDlgCancel()
858 {
859 if ((PtDlg!=NULL) &&
860 (*ProtoCancel)(ProtoId,FileVar,ProtoVar,&cv))
861 ProtoEnd();
862 }
863 }
864
865 extern "C" {
866 void KermitStart(int mode)
867 {
868 WORD w;
869
870 if (! ProtoStart()) return;
871
872 switch (mode) {
873 case IdKmtSend:
874 FileVar->OpId = OpKmtSend;
875 if (strlen(&(FileVar->FullName[FileVar->DirLen]))==0)
876 {
877 if (! (*GetMultiFname)(FileVar,ts.FileDir,GMF_KERMIT,&w) ||
878 (FileVar->NumFname==0))
879 {
880 ProtoEnd();
881 return;
882 }
883 }
884 else
885 (*SetFileVar)(FileVar);
886 break;
887 case IdKmtReceive:
888 FileVar->OpId = OpKmtRcv;
889 break;
890 case IdKmtGet:
891 FileVar->OpId = OpKmtSend;
892 if (strlen(&(FileVar->FullName[FileVar->DirLen]))==0)
893 {
894 if (! (*GetGetFname)(FileVar->HMainWin,FileVar) ||
895 (strlen(FileVar->FullName)==0))
896 {
897 ProtoEnd();
898 return;
899 }
900 }
901 else
902 (*SetFileVar)(FileVar);
903 break;
904 case IdKmtFinish:
905 FileVar->OpId = OpKmtFin;
906 break;
907 default:
908 ProtoEnd();
909 return;
910 }
911 TalkStatus = IdTalkQuiet;
912
913 /* disable transmit delay (serial port) */
914 cv.DelayFlag = FALSE;
915
916 if (! OpenProtoDlg(FileVar,PROTO_KMT,mode,0,0))
917 ProtoEnd();
918 }
919 }
920
921 extern "C" {
922 void XMODEMStart(int mode)
923 {
924 LONG Option;
925
926 if (! ProtoStart()) return;
927
928 if (mode==IdXReceive)
929 FileVar->OpId = OpXRcv;
930 else
931 FileVar->OpId = OpXSend;
932
933 if (strlen(&(FileVar->FullName[FileVar->DirLen]))==0)
934 {
935 Option = MAKELONG(ts.XmodemBin,ts.XmodemOpt);
936 if (! (*GetXFname)(FileVar->HMainWin,
937 mode==IdXReceive,&Option,FileVar,ts.FileDir))
938 {
939 ProtoEnd();
940 return;
941 }
942 ts.XmodemOpt = HIWORD(Option);
943 ts.XmodemBin = LOWORD(Option);
944 }
945 else
946 (*SetFileVar)(FileVar);
947
948 if (mode==IdXReceive)
949 FileVar->FileHandle = _lcreat(FileVar->FullName,0);
950 else
951 FileVar->FileHandle = _lopen(FileVar->FullName,OF_READ);
952
953 FileVar->FileOpen = FileVar->FileHandle>0;
954 if (! FileVar->FileOpen)
955 {
956 ProtoEnd();
957 return;
958 }
959 TalkStatus = IdTalkQuiet;
960
961 /* disable transmit delay (serial port) */
962 cv.DelayFlag = FALSE;
963
964 if (! OpenProtoDlg(FileVar,PROTO_XM,mode,
965 ts.XmodemOpt,ts.XmodemBin))
966 ProtoEnd();
967 }
968 }
969
970 extern "C" {
971 void ZMODEMStart(int mode)
972 {
973 WORD Opt;
974
975 if (! ProtoStart()) return;
976
977 if (mode==IdZSend)
978 {
979 Opt = ts.XmodemBin;
980 FileVar->OpId = OpZSend;
981 if (strlen(&(FileVar->FullName[FileVar->DirLen]))==0)
982 {
983 if (! (*GetMultiFname)(FileVar,ts.FileDir,GMF_Z,&Opt) ||
984 (FileVar->NumFname==0))
985 {
986 ProtoEnd();
987 return;
988 }
989 ts.XmodemBin = Opt;
990 }
991 else
992 (*SetFileVar)(FileVar);
993 }
994 else /* IdZReceive or IdZAuto */
995 FileVar->OpId = OpZRcv;
996
997 TalkStatus = IdTalkQuiet;
998
999 /* disable transmit delay (serial port) */
1000 cv.DelayFlag = FALSE;
1001
1002 if (! OpenProtoDlg(FileVar,PROTO_ZM,mode,Opt,0))
1003 ProtoEnd();
1004 }
1005 }
1006
1007 extern "C" {
1008 void BPStart(int mode)
1009 {
1010 LONG Option;
1011
1012 if (! ProtoStart()) return;
1013 if (mode==IdBPSend)
1014 {
1015 FileVar->OpId = OpBPSend;
1016 if (strlen(&(FileVar->FullName[FileVar->DirLen]))==0)
1017 {
1018 if (! (*GetTransFname)(FileVar, ts.FileDir, GTF_BP, &Option))
1019 {
1020 ProtoEnd();
1021 return;
1022 }
1023 }
1024 else
1025 (*SetFileVar)(FileVar);
1026
1027 }
1028 else /* IdBPReceive or IdBPAuto */
1029 FileVar->OpId = OpBPRcv;
1030
1031 TalkStatus = IdTalkQuiet;
1032
1033 /* disable transmit delay (serial port) */
1034 cv.DelayFlag = FALSE;
1035
1036 if (! OpenProtoDlg(FileVar,PROTO_BP,mode,0,0))
1037 ProtoEnd();
1038 }
1039 }
1040
1041 extern "C" {
1042 void QVStart(int mode)
1043 {
1044 WORD W;
1045
1046 if (! ProtoStart()) return;
1047
1048 if (mode==IdQVSend)
1049 {
1050 FileVar->OpId = OpQVSend;
1051 if (strlen(&(FileVar->FullName[FileVar->DirLen]))==0)
1052 {
1053 if (! (*GetMultiFname)(FileVar,ts.FileDir,GMF_QV, &W) ||
1054 (FileVar->NumFname==0))
1055 {
1056 ProtoEnd();
1057 return;
1058 }
1059 }
1060 else
1061 (*SetFileVar)(FileVar);
1062 }
1063 else
1064 FileVar->OpId = OpQVRcv;
1065
1066 TalkStatus = IdTalkQuiet;
1067
1068 /* disable transmit delay (serial port) */
1069 cv.DelayFlag = FALSE;
1070
1071 if (! OpenProtoDlg(FileVar,PROTO_QV,mode,0,0))
1072 ProtoEnd();
1073 }
1074 }
1075
1076 /*
1077 * $Log$
1078 */

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