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.6 - (show annotations) (download) (as text)
Mon Aug 28 12:27:16 2006 UTC (17 years, 7 months ago) by maya
Branch: MAIN
CVS Tags: R446_RTM, R448_RTM, R445_RTM, R449_RTM, R447_RTM
Changes since 1.5: +10 -0 lines
File MIME type: text/x-c++src
デフォルトのログファイル名を指定できるようにした。
  エディットコントロールを "Additional settings" ダイアログに追加した。
  teraterm.ini ファイルに LogDefaultName エントリを追加した。
  ファイル名に strftime のフォーマットを使えるようにした。

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

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