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.4 - (show annotations) (download) (as text)
Sat Jul 22 16:15:54 2006 UTC (17 years, 8 months ago) by maya
Branch: MAIN
Changes since 1.3: +39 -1 lines
File MIME type: text/x-c++src
ログ記録時に時刻も書き込む機能を追加した。

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

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