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

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