Develop and Download Open Source Software

Browse CVS Repository

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

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


Revision 1.7 - (hide 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 yutakakn 1.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 yutakakn 1.2 LONG Option;
228    
229     if ((FileLog) || (BinLog)) return;
230 yutakakn 1.1
231 yutakakn 1.2 if (! LoadTTFILE()) return;
232     if (! NewFileVar(&LogVar))
233     {
234     FreeTTFILE();
235     return;
236     }
237     LogVar->OpId = OpLog;
238 yutakakn 1.1
239 yutakakn 1.2 if (strlen(&(LogVar->FullName[LogVar->DirLen]))==0)
240     {
241 maya 1.4 // LOWORD
242     // 0x0001 = Binary
243     // HIWORD
244     // 0x0001 = Append
245 yutakakn 1.2 // 0x1000 = plain text (2005.2.20 yutaka)
246 maya 1.4 // 0x2000 = timestamp (2006.7.23 maya)
247 yutakakn 1.3 // teraterm.ini?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?スf?スt?スH?ス?ス?スg?スI?スv?スV?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?スB(2005.5.7 yutaka)
248 maya 1.4 Option = MAKELONG(ts.TransBin,ts.Append |
249     (0x1000 * ts.LogTypePlainText) |
250     (0x2000 * ts.LogTimestamp));
251 maya 1.6
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 yutakakn 1.2 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 maya 1.4
271     if (ts.Append & 0x2000) {
272     ts.LogTimestamp = 1;
273     }
274     else {
275     ts.LogTimestamp = 0;
276     }
277    
278 yutakakn 1.2 ts.Append &= 0x1; // 1bit?ス?ス?ス}?スX?スN?ス?ス?ス?ス
279 yutakakn 1.1
280 yutakakn 1.2 }
281     else
282     (*SetFileVar)(LogVar);
283 yutakakn 1.1
284 yutakakn 1.2 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 yutakakn 1.1
306 yutakakn 1.2 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 yutakakn 1.1
325 yutakakn 1.2 if (! OpenFTDlg(LogVar))
326     FileTransEnd(OpLog);
327 yutakakn 1.1 }
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 yutakapon 1.7 else {
360 yutakakn 1.1 cv.DCount = 0;
361 yutakapon 1.7 // ?ス?ス?ス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 yutakakn 1.1 }
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 maya 1.4 // ?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?スo?ス?ス(2006.7.23 maya)
461 yutakakn 1.5 // ?ス?ス?スt?スt?スH?ス[?ス}?スb?スg?ス?ス?ス?ス?ス{?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?スE?スW?ス?ス?ス?ス?ス?ス?スX?ス?ス?ス?ス (2006.7.23 yutaka)
462 maya 1.4 if (ts.LogTimestamp &&
463     (Start == 1 || Buf[Start-2] == 0x0a)) {
464 yutakakn 1.5 #if 0
465 maya 1.4 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 yutakakn 1.5 #else
475     time_t tick = time(NULL);
476     char *strtime = ctime(&tick);
477     #endif
478 maya 1.4
479     // write to file
480     if (Start == 1 && ts.Append) {
481     _lwrite(LogVar->FileHandle,"\r\n",strlen("\r\n"));
482     }
483 yutakakn 1.5 _lwrite(LogVar->FileHandle,"[",1);
484     // ?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?スI?ス[?ス?ス \n ?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?スB
485     _lwrite(LogVar->FileHandle, strtime, strlen(strtime) - 1);
486     _lwrite(LogVar->FileHandle,"] ",2);
487 maya 1.4 }
488    
489 yutakakn 1.1 _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 maya 1.6 SendVar->FullName[0] = 0;
590 yutakakn 1.1 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 maya 1.6 FileVar->FullName[0] = 0;
1077 yutakakn 1.1 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 yutakakn 1.2
1135     /*
1136 yutakakn 1.3 * $Log: filesys.cpp,v $
1137 yutakapon 1.7 * 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 maya 1.6 * Revision 1.5 2006/07/23 14:12:26 yutakakn
1144     * ?ス?ス?スO?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?スt?スt?スH?ス[?ス}?スb?スg?ス?ス?ス?ス?スE?スW?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?スX?ス?ス?ス?ス?スB
1145     *
1146 yutakakn 1.5 * Revision 1.4 2006/07/22 16:15:54 maya
1147     * ?ス?ス?スO?スL?ス^?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス@?ス\?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?スB
1148     *
1149 maya 1.4 * Revision 1.3 2005/05/07 09:49:24 yutakakn
1150     * teraterm.ini?ス?ス LogTypePlainText ?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?スB
1151     *
1152 yutakakn 1.3 * 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 yutakakn 1.2 */

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