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.1 - (show annotations) (download) (as text)
Mon Nov 15 14:43:41 2004 UTC (19 years, 4 months ago) by yutakakn
Branch: MAIN
Branch point for: avendor
File MIME type: text/x-c++src
Initial revision

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 Option = MAKELONG(ts.TransBin,ts.Append);
242 if (! (*GetTransFname)(LogVar, ts.FileDir, GTF_LOG, &Option))
243 {
244 FreeFileVar(&LogVar);
245 FreeTTFILE();
246 return;
247 }
248 ts.TransBin = LOWORD(Option);
249 ts.Append = HIWORD(Option);
250 }
251 else
252 (*SetFileVar)(LogVar);
253
254 if (ts.TransBin > 0)
255 {
256 BinLog = TRUE;
257 FileLog = FALSE;
258 if (! CreateBinBuf())
259 {
260 FileTransEnd(OpLog);
261 return;
262 }
263 }
264 else {
265 BinLog = FALSE;
266 FileLog = TRUE;
267 if (! CreateLogBuf())
268 {
269 FileTransEnd(OpLog);
270 return;
271 }
272 }
273 cv.LStart = cv.LogPtr;
274 cv.LCount = 0;
275
276 HelpId = HlpFileLog;
277 if (ts.Append > 0)
278 {
279 LogVar->FileHandle = _lopen(LogVar->FullName,OF_WRITE);
280 if (LogVar->FileHandle>0)
281 _llseek(LogVar->FileHandle,0,2);
282 else
283 LogVar->FileHandle = _lcreat(LogVar->FullName,0);
284 }
285 else
286 LogVar->FileHandle = _lcreat(LogVar->FullName,0);
287 LogVar->FileOpen = (LogVar->FileHandle>0);
288 if (! LogVar->FileOpen)
289 {
290 FileTransEnd(OpLog);
291 return;
292 }
293 LogVar->ByteCount = 0;
294
295 if (! OpenFTDlg(LogVar))
296 FileTransEnd(OpLog);
297 }
298 }
299
300 void LogPut1(BYTE b)
301 {
302 LogLast = b;
303 cv.LogBuf[cv.LogPtr] = b;
304 cv.LogPtr++;
305 if (cv.LogPtr>=InBuffSize)
306 cv.LogPtr = cv.LogPtr-InBuffSize;
307
308 if (FileLog)
309 {
310 if (cv.LCount>=InBuffSize)
311 {
312 cv.LCount = InBuffSize;
313 cv.LStart = cv.LogPtr;
314 }
315 else cv.LCount++;
316 }
317 else
318 cv.LCount = 0;
319
320 if (DDELog)
321 {
322 if (cv.DCount>=InBuffSize)
323 {
324 cv.DCount = InBuffSize;
325 cv.DStart = cv.LogPtr;
326 }
327 else cv.DCount++;
328 }
329 else
330 cv.DCount = 0;
331 }
332
333 void Log1Byte(BYTE b)
334 {
335 if (b==0x0d)
336 {
337 LogLast = b;
338 return;
339 }
340 if ((b==0x0a) && (LogLast==0x0d))
341 LogPut1(0x0d);
342 LogPut1(b);
343 }
344
345 static BOOL Get1(PCHAR Buf, int *Start, int *Count, PBYTE b)
346 {
347 if (*Count<=0) return FALSE;
348 *b = Buf[*Start];
349 (*Start)++;
350 if (*Start>=InBuffSize)
351 *Start = *Start-InBuffSize;
352 (*Count)--;
353 return TRUE;
354 }
355
356
357
358 static CRITICAL_SECTION g_filelog_lock; /* ���b�N�p���� */
359
360 void logfile_lock_initialize(void)
361 {
362 InitializeCriticalSection(&g_filelog_lock);
363 }
364
365 static inline void logfile_lock(void)
366 {
367 EnterCriticalSection(&g_filelog_lock);
368 }
369
370 static inline void logfile_unlock(void)
371 {
372 LeaveCriticalSection(&g_filelog_lock);
373 }
374
375 // �R�����g�����O����������
376 void CommentLogToFile(char *buf, int size)
377 {
378 DWORD wrote;
379
380 if (LogVar == NULL || !LogVar->FileOpen) {
381 ::MessageBox(NULL, "It is not opened by the log file yet.", "ERROR", MB_OK|MB_ICONEXCLAMATION);
382 return;
383 }
384
385 logfile_lock();
386 WriteFile((HANDLE)LogVar->FileHandle, buf, size, &wrote, NULL);
387 WriteFile((HANDLE)LogVar->FileHandle, "\r\n", 2, &wrote, NULL); // ���s
388 logfile_unlock();
389 }
390
391 void LogToFile()
392 {
393 PCHAR Buf;
394 int Start, Count;
395 BYTE b;
396
397 if (! LogVar->FileOpen) return;
398 if (FileLog)
399 {
400 Buf = cv.LogBuf;
401 Start = cv.LStart;
402 Count = cv.LCount;
403 }
404 else if (BinLog)
405 {
406 Buf = cv.BinBuf;
407 Start = cv.BStart;
408 Count = cv.BCount;
409 }
410 else
411 return;
412
413 if (Buf==NULL) return;
414 if (Count==0) return;
415
416 // ���b�N������(2004.8.6 yutaka)
417 logfile_lock();
418
419 while (Get1(Buf,&Start,&Count,&b))
420 {
421 if (((cv.FilePause & OpLog)==0) && (! cv.ProtoFlag))
422 {
423 _lwrite(LogVar->FileHandle,(PCHAR)&b,1);
424 (LogVar->ByteCount)++;
425 }
426 }
427
428 logfile_unlock();
429
430 if (FileLog)
431 {
432 cv.LStart = Start;
433 cv.LCount = Count;
434 }
435 else {
436 cv.BStart = Start;
437 cv.BCount = Count;
438 }
439 if (((cv.FilePause & OpLog) !=0) || cv.ProtoFlag) return;
440 if (FLogDlg!=NULL)
441 FLogDlg->RefreshNum();
442 }
443
444 BOOL CreateLogBuf()
445 {
446 if (cv.HLogBuf==NULL)
447 {
448 cv.HLogBuf = GlobalAlloc(GMEM_MOVEABLE,InBuffSize);
449 cv.LogBuf = NULL;
450 cv.LogPtr = 0;
451 cv.LStart = 0;
452 cv.LCount = 0;
453 cv.DStart = 0;
454 cv.DCount = 0;
455 }
456 return (cv.HLogBuf!=NULL);
457 }
458
459 void FreeLogBuf()
460 {
461 if ((cv.HLogBuf==NULL) || FileLog || DDELog) return;
462 if (cv.LogBuf!=NULL) GlobalUnlock(cv.HLogBuf);
463 GlobalFree(cv.HLogBuf);
464 cv.HLogBuf = NULL;
465 cv.LogBuf = NULL;
466 cv.LogPtr = 0;
467 cv.LStart = 0;
468 cv.LCount = 0;
469 cv.DStart = 0;
470 cv.DCount = 0;
471 }
472
473 BOOL CreateBinBuf()
474 {
475 if (cv.HBinBuf==NULL)
476 {
477 cv.HBinBuf = GlobalAlloc(GMEM_MOVEABLE,InBuffSize);
478 cv.BinBuf = NULL;
479 cv.BinPtr = 0;
480 cv.BStart = 0;
481 cv.BCount = 0;
482 }
483 return (cv.HBinBuf!=NULL);
484 }
485
486 void FreeBinBuf()
487 {
488 if ((cv.HBinBuf==NULL) || BinLog) return;
489 if (cv.BinBuf!=NULL) GlobalUnlock(cv.HBinBuf);
490 GlobalFree(cv.HBinBuf);
491 cv.HBinBuf = NULL;
492 cv.BinBuf = NULL;
493 cv.BinPtr = 0;
494 cv.BStart = 0;
495 cv.BCount = 0;
496 }
497
498 extern "C" {
499 void FileSendStart()
500 {
501 LONG Option;
502
503 if (! cv.Ready || FSend) return;
504 if (cv.ProtoFlag)
505 {
506 FreeFileVar(&SendVar);
507 return;
508 }
509
510 if (! LoadTTFILE()) return;
511 if (! NewFileVar(&SendVar))
512 {
513 FreeTTFILE();
514 return;
515 }
516 SendVar->OpId = OpSendFile;
517
518 FSend = TRUE;
519
520 if (strlen(&(SendVar->FullName[SendVar->DirLen]))==0)
521 {
522 Option = MAKELONG(ts.TransBin,0);
523 if (! (*GetTransFname)(SendVar, ts.FileDir, GTF_SEND, &Option))
524 {
525 FileTransEnd(OpSendFile);
526 return;
527 }
528 ts.TransBin = LOWORD(Option);
529 }
530 else
531 (*SetFileVar)(SendVar);
532
533 SendVar->FileHandle = _lopen(SendVar->FullName,OF_READ);
534 SendVar->FileOpen = (SendVar->FileHandle>0);
535 if (! SendVar->FileOpen)
536 {
537 FileTransEnd(OpSendFile);
538 return;
539 }
540 SendVar->ByteCount = 0;
541
542 TalkStatus = IdTalkFile;
543 FileRetrySend = FALSE;
544 FileRetryEcho = FALSE;
545 FileCRSend = FALSE;
546
547 if (! OpenFTDlg(SendVar))
548 FileTransEnd(OpSendFile);
549 }
550 }
551
552 void FileTransEnd(WORD OpId)
553 /* OpId = 0: close Log and FileSend
554 OpLog: close Log
555 OpSendFile: close FileSend */
556 {
557 if (((OpId==0) || (OpId==OpLog)) &&
558 (FileLog || BinLog))
559 {
560 FileLog = FALSE;
561 BinLog = FALSE;
562 if (FLogDlg!=NULL)
563 {
564 FLogDlg->DestroyWindow();
565 FLogDlg = NULL;
566 }
567 FreeFileVar(&LogVar);
568 FreeLogBuf();
569 FreeBinBuf();
570 FreeTTFILE();
571 }
572
573 if (((OpId==0) || (OpId==OpSendFile)) &&
574 FSend)
575 {
576 FSend = FALSE;
577 TalkStatus = IdTalkKeyb;
578 if (SendDlg!=NULL)
579 {
580 SendDlg->DestroyWindow();
581 SendDlg = NULL;
582 }
583 FreeFileVar(&SendVar);
584 FreeTTFILE();
585 }
586
587 EndDdeCmnd(0);
588 }
589
590 // vtwin.cpp �����R�[�������������Aextern "C"���t�����B(2004.11.3 yutaka)
591 extern "C" {
592 int FSOut1(BYTE b)
593 {
594 if (ts.TransBin > 0)
595 return CommBinaryOut(&cv,(PCHAR)&b,1);
596 else if ((b>=0x20) || (b==0x09) || (b==0x0A) || (b==0x0D))
597 return CommTextOut(&cv,(PCHAR)&b,1);
598 else
599 return 1;
600 }
601
602 int FSEcho1(BYTE b)
603 {
604 if (ts.TransBin > 0)
605 return CommBinaryEcho(&cv,(PCHAR)&b,1);
606 else
607 return CommTextEcho(&cv,(PCHAR)&b,1);
608 }
609 }
610
611 extern "C" {
612 void FileSend()
613 {
614 WORD c, fc;
615 LONG BCOld;
616
617 if ((SendDlg==NULL) ||
618 ((cv.FilePause & OpSendFile) !=0)) return;
619
620 BCOld = SendVar->ByteCount;
621
622 if (FileRetrySend)
623 {
624 FileRetryEcho = (ts.LocalEcho>0);
625 c = FSOut1(FileByte);
626 FileRetrySend = (c==0);
627 if (FileRetrySend) return;
628 }
629
630 if (FileRetryEcho)
631 {
632 c = FSEcho1(FileByte);
633 FileRetryEcho = (c==0);
634 if (FileRetryEcho) return;
635 }
636
637 do {
638 fc = _lread(SendVar->FileHandle,&FileByte,1);
639 SendVar->ByteCount = SendVar->ByteCount + fc;
640
641 if (FileCRSend && (fc==1) && (FileByte==0x0A))
642 {
643 fc = _lread(SendVar->FileHandle,&FileByte,1);
644 SendVar->ByteCount = SendVar->ByteCount + fc;
645 }
646
647 if (fc!=0)
648 {
649 c = FSOut1(FileByte);
650 FileCRSend = (ts.TransBin==0) && (FileByte==0x0D);
651 FileRetrySend = (c==0);
652 if (FileRetrySend)
653 {
654 if (SendVar->ByteCount != BCOld)
655 SendDlg->RefreshNum();
656 return;
657 }
658 if (ts.LocalEcho>0)
659 {
660 c = FSEcho1(FileByte);
661 FileRetryEcho = (c==0);
662 if (FileRetryEcho) return;
663 }
664 }
665 if ((fc==0) || (SendVar->ByteCount % 100 == 0))
666 {
667 SendDlg->RefreshNum();
668 BCOld = SendVar->ByteCount;
669 if (fc!=0) return;
670 }
671 } while (fc!=0);
672
673 FileTransEnd(OpSendFile);
674 }
675 }
676
677 extern "C" {
678 void FLogChangeButton(BOOL Pause)
679 {
680 if (FLogDlg!=NULL)
681 FLogDlg->ChangeButton(Pause);
682 }
683 }
684
685 extern "C" {
686 void FLogRefreshNum()
687 {
688 if (FLogDlg!=NULL)
689 FLogDlg->RefreshNum();
690 }
691 }
692
693 BOOL OpenProtoDlg(PFileVar fv, int IdProto, int Mode, WORD Opt1, WORD Opt2)
694 {
695 int vsize;
696 PProtoDlg pd;
697
698 ProtoId = IdProto;
699
700 switch (ProtoId) {
701 case PROTO_KMT:
702 vsize = sizeof(TKmtVar);
703 break;
704 case PROTO_XM:
705 vsize = sizeof(TXVar);
706 break;
707 case PROTO_ZM:
708 vsize = sizeof(TZVar);
709 break;
710 case PROTO_BP:
711 vsize = sizeof(TBPVar);
712 break;
713 case PROTO_QV:
714 vsize = sizeof(TQVVar);
715 break;
716 }
717 ProtoVar = (PCHAR)malloc(vsize);
718 if (ProtoVar==NULL) return FALSE;
719
720 switch (ProtoId) {
721 case PROTO_KMT:
722 ((PKmtVar)ProtoVar)->KmtMode = Mode;
723 break;
724 case PROTO_XM:
725 ((PXVar)ProtoVar)->XMode = Mode;
726 ((PXVar)ProtoVar)->XOpt = Opt1;
727 ((PXVar)ProtoVar)->TextFlag = 1 - (Opt2 & 1);
728 break;
729 case PROTO_ZM:
730 ((PZVar)ProtoVar)->BinFlag = (Opt1 & 1) != 0;
731 ((PZVar)ProtoVar)->ZMode = Mode;
732 break;
733 case PROTO_BP:
734 ((PBPVar)ProtoVar)->BPMode = Mode;
735 break;
736 case PROTO_QV:
737 ((PQVVar)ProtoVar)->QVMode = Mode;
738 break;
739 }
740
741 pd = new CProtoDlg();
742 if (pd==NULL)
743 {
744 free(ProtoVar);
745 ProtoVar = NULL;
746 return FALSE;
747 }
748 pd->Create(fv);
749
750 (*ProtoInit)(ProtoId,FileVar,ProtoVar,&cv,&ts);
751
752 PtDlg = pd;
753 return TRUE;
754 }
755
756 extern "C" {
757 void CloseProtoDlg()
758 {
759 if (PtDlg!=NULL)
760 {
761 PtDlg->DestroyWindow();
762 PtDlg = NULL;
763
764 ::KillTimer(FileVar->HMainWin,IdProtoTimer);
765 if ((ProtoId==PROTO_QV) &&
766 (((PQVVar)ProtoVar)->QVMode==IdQVSend))
767 CommTextOut(&cv,"\015",1);
768 if (FileVar->LogFlag)
769 _lclose(FileVar->LogFile);
770 FileVar->LogFile = 0;
771 if (ProtoVar!=NULL)
772 {
773 free(ProtoVar);
774 ProtoVar = NULL;
775 }
776 }
777 }
778 }
779
780 BOOL ProtoStart()
781 {
782 if (cv.ProtoFlag) return FALSE;
783 if (FSend)
784 {
785 FreeFileVar(&FileVar);
786 return FALSE;
787 }
788
789 if (! LoadTTFILE()) return FALSE;
790 NewFileVar(&FileVar);
791
792 if (FileVar==NULL)
793 {
794 FreeTTFILE();
795 return FALSE;
796 }
797 cv.ProtoFlag = TRUE;
798 return TRUE;
799 }
800
801 void ProtoEnd()
802 {
803 if (! cv.ProtoFlag) return;
804 cv.ProtoFlag = FALSE;
805
806 /* Enable transmit delay (serial port) */
807 cv.DelayFlag = TRUE;
808 TalkStatus = IdTalkKeyb;
809
810 CloseProtoDlg();
811
812 if ((FileVar!=NULL) && FileVar->Success)
813 EndDdeCmnd(1);
814 else
815 EndDdeCmnd(0);
816
817 FreeTTFILE();
818 FreeFileVar(&FileVar);
819 }
820
821 extern "C" {
822 int ProtoDlgParse()
823 {
824 int P;
825
826 P = ActiveWin;
827 if (PtDlg==NULL) return P;
828
829 if ((*ProtoParse)(ProtoId,FileVar,ProtoVar,&cv))
830 P = 0; /* continue */
831 else {
832 CommSend(&cv);
833 ProtoEnd();
834 }
835 return P;
836 }
837 }
838
839 extern "C" {
840 void ProtoDlgTimeOut()
841 {
842 if (PtDlg!=NULL)
843 (*ProtoTimeOutProc)(ProtoId,FileVar,ProtoVar,&cv);
844 }
845 }
846
847 extern "C" {
848 void ProtoDlgCancel()
849 {
850 if ((PtDlg!=NULL) &&
851 (*ProtoCancel)(ProtoId,FileVar,ProtoVar,&cv))
852 ProtoEnd();
853 }
854 }
855
856 extern "C" {
857 void KermitStart(int mode)
858 {
859 WORD w;
860
861 if (! ProtoStart()) return;
862
863 switch (mode) {
864 case IdKmtSend:
865 FileVar->OpId = OpKmtSend;
866 if (strlen(&(FileVar->FullName[FileVar->DirLen]))==0)
867 {
868 if (! (*GetMultiFname)(FileVar,ts.FileDir,GMF_KERMIT,&w) ||
869 (FileVar->NumFname==0))
870 {
871 ProtoEnd();
872 return;
873 }
874 }
875 else
876 (*SetFileVar)(FileVar);
877 break;
878 case IdKmtReceive:
879 FileVar->OpId = OpKmtRcv;
880 break;
881 case IdKmtGet:
882 FileVar->OpId = OpKmtSend;
883 if (strlen(&(FileVar->FullName[FileVar->DirLen]))==0)
884 {
885 if (! (*GetGetFname)(FileVar->HMainWin,FileVar) ||
886 (strlen(FileVar->FullName)==0))
887 {
888 ProtoEnd();
889 return;
890 }
891 }
892 else
893 (*SetFileVar)(FileVar);
894 break;
895 case IdKmtFinish:
896 FileVar->OpId = OpKmtFin;
897 break;
898 default:
899 ProtoEnd();
900 return;
901 }
902 TalkStatus = IdTalkQuiet;
903
904 /* disable transmit delay (serial port) */
905 cv.DelayFlag = FALSE;
906
907 if (! OpenProtoDlg(FileVar,PROTO_KMT,mode,0,0))
908 ProtoEnd();
909 }
910 }
911
912 extern "C" {
913 void XMODEMStart(int mode)
914 {
915 LONG Option;
916
917 if (! ProtoStart()) return;
918
919 if (mode==IdXReceive)
920 FileVar->OpId = OpXRcv;
921 else
922 FileVar->OpId = OpXSend;
923
924 if (strlen(&(FileVar->FullName[FileVar->DirLen]))==0)
925 {
926 Option = MAKELONG(ts.XmodemBin,ts.XmodemOpt);
927 if (! (*GetXFname)(FileVar->HMainWin,
928 mode==IdXReceive,&Option,FileVar,ts.FileDir))
929 {
930 ProtoEnd();
931 return;
932 }
933 ts.XmodemOpt = HIWORD(Option);
934 ts.XmodemBin = LOWORD(Option);
935 }
936 else
937 (*SetFileVar)(FileVar);
938
939 if (mode==IdXReceive)
940 FileVar->FileHandle = _lcreat(FileVar->FullName,0);
941 else
942 FileVar->FileHandle = _lopen(FileVar->FullName,OF_READ);
943
944 FileVar->FileOpen = FileVar->FileHandle>0;
945 if (! FileVar->FileOpen)
946 {
947 ProtoEnd();
948 return;
949 }
950 TalkStatus = IdTalkQuiet;
951
952 /* disable transmit delay (serial port) */
953 cv.DelayFlag = FALSE;
954
955 if (! OpenProtoDlg(FileVar,PROTO_XM,mode,
956 ts.XmodemOpt,ts.XmodemBin))
957 ProtoEnd();
958 }
959 }
960
961 extern "C" {
962 void ZMODEMStart(int mode)
963 {
964 WORD Opt;
965
966 if (! ProtoStart()) return;
967
968 if (mode==IdZSend)
969 {
970 Opt = ts.XmodemBin;
971 FileVar->OpId = OpZSend;
972 if (strlen(&(FileVar->FullName[FileVar->DirLen]))==0)
973 {
974 if (! (*GetMultiFname)(FileVar,ts.FileDir,GMF_Z,&Opt) ||
975 (FileVar->NumFname==0))
976 {
977 ProtoEnd();
978 return;
979 }
980 ts.XmodemBin = Opt;
981 }
982 else
983 (*SetFileVar)(FileVar);
984 }
985 else /* IdZReceive or IdZAuto */
986 FileVar->OpId = OpZRcv;
987
988 TalkStatus = IdTalkQuiet;
989
990 /* disable transmit delay (serial port) */
991 cv.DelayFlag = FALSE;
992
993 if (! OpenProtoDlg(FileVar,PROTO_ZM,mode,Opt,0))
994 ProtoEnd();
995 }
996 }
997
998 extern "C" {
999 void BPStart(int mode)
1000 {
1001 LONG Option;
1002
1003 if (! ProtoStart()) return;
1004 if (mode==IdBPSend)
1005 {
1006 FileVar->OpId = OpBPSend;
1007 if (strlen(&(FileVar->FullName[FileVar->DirLen]))==0)
1008 {
1009 if (! (*GetTransFname)(FileVar, ts.FileDir, GTF_BP, &Option))
1010 {
1011 ProtoEnd();
1012 return;
1013 }
1014 }
1015 else
1016 (*SetFileVar)(FileVar);
1017
1018 }
1019 else /* IdBPReceive or IdBPAuto */
1020 FileVar->OpId = OpBPRcv;
1021
1022 TalkStatus = IdTalkQuiet;
1023
1024 /* disable transmit delay (serial port) */
1025 cv.DelayFlag = FALSE;
1026
1027 if (! OpenProtoDlg(FileVar,PROTO_BP,mode,0,0))
1028 ProtoEnd();
1029 }
1030 }
1031
1032 extern "C" {
1033 void QVStart(int mode)
1034 {
1035 WORD W;
1036
1037 if (! ProtoStart()) return;
1038
1039 if (mode==IdQVSend)
1040 {
1041 FileVar->OpId = OpQVSend;
1042 if (strlen(&(FileVar->FullName[FileVar->DirLen]))==0)
1043 {
1044 if (! (*GetMultiFname)(FileVar,ts.FileDir,GMF_QV, &W) ||
1045 (FileVar->NumFname==0))
1046 {
1047 ProtoEnd();
1048 return;
1049 }
1050 }
1051 else
1052 (*SetFileVar)(FileVar);
1053 }
1054 else
1055 FileVar->OpId = OpQVRcv;
1056
1057 TalkStatus = IdTalkQuiet;
1058
1059 /* disable transmit delay (serial port) */
1060 cv.DelayFlag = FALSE;
1061
1062 if (! OpenProtoDlg(FileVar,PROTO_QV,mode,0,0))
1063 ProtoEnd();
1064 }
1065 }

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