Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /trunk/teraterm/teraterm/filesys.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 8894 - (hide annotations) (download) (as text)
Tue Aug 18 15:27:29 2020 UTC (3 years, 7 months ago) by zmatsuo
File MIME type: text/x-c++src
File size: 24237 byte(s)
ログ出力部を分離した

- filesys.cpp から filesys_log.cpp を分離
- プロジェクトにファイル追加
  - VS2005, VS2019, cmake
1 doda 6806 /*
2     * Copyright (C) 1994-1998 T. Teranishi
3 zmatsuo 8822 * (C) 2005-2020 TeraTerm Project
4 doda 6806 * All rights reserved.
5     *
6 doda 6841 * Redistribution and use in source and binary forms, with or without
7     * modification, are permitted provided that the following conditions
8     * are met:
9 doda 6806 *
10 doda 6841 * 1. Redistributions of source code must retain the above copyright
11     * notice, this list of conditions and the following disclaimer.
12     * 2. Redistributions in binary form must reproduce the above copyright
13     * notice, this list of conditions and the following disclaimer in the
14     * documentation and/or other materials provided with the distribution.
15     * 3. The name of the author may not be used to endorse or promote products
16     * derived from this software without specific prior written permission.
17 doda 6806 *
18 doda 6841 * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR
19     * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20     * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21     * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT,
22     * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23     * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24     * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25     * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26     * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27     * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 doda 6806 */
29 maya 3227
30     /* TERATERM.EXE, file transfer routines */
31 zmatsuo 7526 #include <stdio.h>
32     #include <io.h>
33     #include <process.h>
34 zmatsuo 8852 #include <windows.h>
35     #include <htmlhelp.h>
36     #include <assert.h>
37 zmatsuo 7526
38 maya 3227 #include "teraterm.h"
39     #include "tttypes.h"
40     #include "ttftypes.h"
41     #include "ftdlg.h"
42     #include "protodlg.h"
43     #include "ttwinman.h"
44     #include "commlib.h"
45     #include "ttcommon.h"
46     #include "ttdde.h"
47     #include "ttlib.h"
48     #include "dlglib.h"
49 doda 3904 #include "vtterm.h"
50 zmatsuo 7290 #include "win16api.h"
51 maya 3227 #include "ftlib.h"
52 yutakapon 5392 #include "buffer.h"
53 zmatsuo 8852 #include "helpid.h"
54     #include "layer_for_unicode.h"
55 zmatsuo 8863 #include "layer_for_unicode_crt.h"
56     #include "codeconv.h"
57 yutakapon 5392
58 zmatsuo 8852 #include "filesys_log_res.h"
59 yutakapon 5162
60 zmatsuo 8866 #include "filesys.h"
61    
62 doda 3904 #define FS_BRACKET_NONE 0
63     #define FS_BRACKET_START 1
64     #define FS_BRACKET_END 2
65    
66 maya 3227 PFileVar SendVar = NULL;
67     PFileVar FileVar = NULL;
68     static PCHAR ProtoVar = NULL;
69     static int ProtoId;
70    
71 doda 3904 static BOOL FileRetrySend, FileRetryEcho, FileCRSend, FileReadEOF, BinaryMode;
72 maya 3227 static BYTE FileByte;
73    
74 maya 6071 #define FILE_SEND_BUF_SIZE 8192
75     struct FileSendHandler {
76     CHAR buf[FILE_SEND_BUF_SIZE];
77     int pos;
78     int end;
79     };
80     static struct FileSendHandler FileSendHandler;
81     static int FileDlgRefresh;
82    
83 doda 3904 static int FileBracketMode = FS_BRACKET_NONE;
84     static int FileBracketPtr = 0;
85     static char BracketStartStr[] = "\033[200~";
86     static char BracketEndStr[] = "\033[201~";
87    
88 maya 3227 static BOOL FSend = FALSE;
89    
90     static HMODULE HTTFILE = NULL;
91     static int TTFILECount = 0;
92    
93     PGetSetupFname GetSetupFname;
94 zmatsuo 8852 static PGetTransFname GetTransFname;
95 maya 3227 PGetMultiFname GetMultiFname;
96     PGetGetFname GetGetFname;
97     PSetFileVar SetFileVar;
98     PGetXFname GetXFname;
99     PProtoInit ProtoInit;
100 zmatsuo 8857 static PProtoParse ProtoParse;
101 maya 3227 PProtoTimeOutProc ProtoTimeOutProc;
102     PProtoCancel ProtoCancel;
103 maya 7182 PTTFILESetUILanguageFile TTFILESetUILanguageFile;
104     PTTFILESetFileSendFilter TTFILESetFileSendFilter;
105 maya 3227
106     #define IdGetSetupFname 1
107     #define IdGetTransFname 2
108     #define IdGetMultiFname 3
109     #define IdGetGetFname 4
110     #define IdSetFileVar 5
111     #define IdGetXFname 6
112    
113     #define IdProtoInit 7
114     #define IdProtoParse 8
115     #define IdProtoTimeOutProc 9
116     #define IdProtoCancel 10
117    
118 maya 7182 #define IdTTFILESetUILanguageFile 11
119     #define IdTTFILESetFileSendFilter 12
120    
121 zmatsuo 8858 BOOL LoadTTFILE(void)
122 maya 3227 {
123     BOOL Err;
124    
125     if (HTTFILE != NULL)
126     {
127     TTFILECount++;
128     return TRUE;
129     }
130     else
131     TTFILECount = 0;
132    
133 doda 6792 HTTFILE = LoadHomeDLL("TTPFILE.DLL");
134 maya 3227 if (HTTFILE == NULL)
135     return FALSE;
136    
137 maya 7182 Err = FALSE;
138 maya 3227
139     GetSetupFname = (PGetSetupFname)GetProcAddress(HTTFILE,
140     MAKEINTRESOURCE(IdGetSetupFname));
141     if (GetSetupFname==NULL)
142     Err = TRUE;
143    
144     GetTransFname = (PGetTransFname)GetProcAddress(HTTFILE,
145     MAKEINTRESOURCE(IdGetTransFname));
146     if (GetTransFname==NULL)
147     Err = TRUE;
148    
149     GetMultiFname = (PGetMultiFname)GetProcAddress(HTTFILE,
150     MAKEINTRESOURCE(IdGetMultiFname));
151     if (GetMultiFname==NULL)
152     Err = TRUE;
153    
154     GetGetFname = (PGetGetFname)GetProcAddress(HTTFILE,
155     MAKEINTRESOURCE(IdGetGetFname));
156     if (GetGetFname==NULL)
157     Err = TRUE;
158    
159     SetFileVar = (PSetFileVar)GetProcAddress(HTTFILE,
160     MAKEINTRESOURCE(IdSetFileVar));
161     if (SetFileVar==NULL)
162     Err = TRUE;
163    
164     GetXFname = (PGetXFname)GetProcAddress(HTTFILE,
165     MAKEINTRESOURCE(IdGetXFname));
166     if (GetXFname==NULL)
167     Err = TRUE;
168    
169     ProtoInit = (PProtoInit)GetProcAddress(HTTFILE,
170     MAKEINTRESOURCE(IdProtoInit));
171     if (ProtoInit==NULL)
172     Err = TRUE;
173    
174     ProtoParse = (PProtoParse)GetProcAddress(HTTFILE,
175     MAKEINTRESOURCE(IdProtoParse));
176     if (ProtoParse==NULL)
177     Err = TRUE;
178    
179     ProtoTimeOutProc = (PProtoTimeOutProc)GetProcAddress(HTTFILE,
180     MAKEINTRESOURCE(IdProtoTimeOutProc));
181     if (ProtoTimeOutProc==NULL)
182     Err = TRUE;
183    
184     ProtoCancel = (PProtoCancel)GetProcAddress(HTTFILE,
185     MAKEINTRESOURCE(IdProtoCancel));
186     if (ProtoCancel==NULL)
187     Err = TRUE;
188    
189 maya 7182 TTFILESetUILanguageFile = (PTTFILESetUILanguageFile)GetProcAddress(HTTFILE,
190     MAKEINTRESOURCE(IdTTFILESetUILanguageFile));
191     if (TTFILESetUILanguageFile==NULL) {
192     Err = TRUE;
193     }
194     else {
195     TTFILESetUILanguageFile(ts.UILanguageFile);
196     }
197    
198     TTFILESetFileSendFilter = (PTTFILESetFileSendFilter)GetProcAddress(HTTFILE,
199     MAKEINTRESOURCE(IdTTFILESetFileSendFilter));
200     if (TTFILESetFileSendFilter==NULL) {
201     Err = TRUE;
202     }
203     else {
204     TTFILESetFileSendFilter(ts.FileSendFilter);
205     }
206    
207 maya 3227 if (Err)
208     {
209     FreeLibrary(HTTFILE);
210     HTTFILE = NULL;
211 doda 6435 return FALSE;
212 maya 3227 }
213     else {
214     TTFILECount = 1;
215     return TRUE;
216     }
217     }
218    
219 zmatsuo 8858 BOOL FreeTTFILE(void)
220 maya 3227 {
221     if (TTFILECount==0)
222     return FALSE;
223     TTFILECount--;
224     if (TTFILECount>0)
225     return TRUE;
226     if (HTTFILE!=NULL)
227     {
228     FreeLibrary(HTTFILE);
229     HTTFILE = NULL;
230     }
231     return TRUE;
232     }
233    
234     static PFileTransDlg SendDlg = NULL;
235     static PProtoDlg PtDlg = NULL;
236    
237 zmatsuo 7526 static BOOL OpenFTDlg(PFileVar fv)
238 maya 3227 {
239     PFileTransDlg FTDlg;
240    
241     FTDlg = new CFileTransDlg();
242    
243 doda 4454 fv->StartTime = 0;
244     fv->ProgStat = 0;
245 zmatsuo 8857 cv.FilePause &= ~fv->OpId;
246 doda 4454
247 maya 3227 if (FTDlg!=NULL)
248     {
249 zmatsuo 7526 FTDlg->Create(hInst, HVTWin, fv, &cv, &ts);
250 maya 3227 FTDlg->RefreshNum();
251     }
252    
253 zmatsuo 8894 SendDlg = FTDlg; /* File send */
254 maya 3227
255 doda 6947 fv->StartTime = GetTickCount();
256 maya 3227
257     return (FTDlg!=NULL);
258     }
259    
260 zmatsuo 8857 static void ShowFTDlg(WORD OpId)
261 maya 3227 {
262 zmatsuo 8894 if (SendDlg != NULL) {
263     SendDlg->ShowWindow(SW_SHOWNORMAL);
264     SetForegroundWindow(SendDlg->GetSafeHwnd());
265 maya 3227 }
266     }
267    
268     BOOL NewFileVar(PFileVar *fv)
269     {
270     if ((*fv)==NULL)
271     {
272     *fv = (PFileVar)malloc(sizeof(TFileVar));
273     if ((*fv)!=NULL)
274     {
275 maya 7951 char FileDirExpanded[MAX_PATH];
276     ExpandEnvironmentStrings(ts.FileDir, FileDirExpanded, sizeof(FileDirExpanded));
277 maya 3227 memset(*fv, 0, sizeof(TFileVar));
278 maya 7951 strncpy_s((*fv)->FullName, sizeof((*fv)->FullName), FileDirExpanded, _TRUNCATE);
279 maya 3227 AppendSlash((*fv)->FullName,sizeof((*fv)->FullName));
280     (*fv)->DirLen = strlen((*fv)->FullName);
281     (*fv)->FileOpen = FALSE;
282     (*fv)->OverWrite = ((ts.FTFlag & FT_RENAME) == 0);
283     (*fv)->HMainWin = HVTWin;
284     (*fv)->Success = FALSE;
285     (*fv)->NoMsg = FALSE;
286     (*fv)->HideDialog = FALSE;
287     }
288     }
289    
290     return ((*fv)!=NULL);
291     }
292    
293     void FreeFileVar(PFileVar *fv)
294     {
295     if ((*fv)!=NULL)
296     {
297 zmatsuo 8894 if ((*fv)->FileOpen) CloseHandle((*fv)->FileHandle);
298 zmatsuo 7541 if ((*fv)->FnStrMemHandle != 0)
299 maya 3227 {
300     GlobalUnlock((*fv)->FnStrMemHandle);
301     GlobalFree((*fv)->FnStrMemHandle);
302     }
303     free(*fv);
304     *fv = NULL;
305     }
306     }
307    
308 zmatsuo 8858 void FileSendStart(void)
309 maya 3227 {
310 doda 6946 LONG Option = 0;
311 maya 3227
312     if (! cv.Ready || FSend) return;
313     if (cv.ProtoFlag)
314     {
315     FreeFileVar(&SendVar);
316     return;
317     }
318    
319 doda 6435 if (! LoadTTFILE())
320 maya 3227 return;
321     if (! NewFileVar(&SendVar))
322     {
323     FreeTTFILE();
324     return;
325     }
326     SendVar->OpId = OpSendFile;
327    
328     FSend = TRUE;
329    
330 maya 7951 if (strlen(&(SendVar->FullName[SendVar->DirLen])) == 0) {
331     char FileDirExpanded[MAX_PATH];
332     ExpandEnvironmentStrings(ts.FileDir, FileDirExpanded, sizeof(FileDirExpanded));
333 doda 6946 if (ts.TransBin)
334     Option |= LOGDLG_BINARY;
335 maya 3227 SendVar->FullName[0] = 0;
336 maya 7951 if (! (*GetTransFname)(SendVar, FileDirExpanded, GTF_SEND, &Option)) {
337 maya 3227 FileTransEnd(OpSendFile);
338     return;
339     }
340 doda 6946 ts.TransBin = CheckFlag(Option, LOGDLG_BINARY);
341 maya 3227 }
342     else
343     (*SetFileVar)(SendVar);
344    
345 zmatsuo 7290 SendVar->FileHandle = CreateFile(SendVar->FullName, GENERIC_READ, FILE_SHARE_READ, NULL,
346     OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);
347     SendVar->FileOpen = (SendVar->FileHandle != INVALID_HANDLE_VALUE);
348 maya 3227 if (! SendVar->FileOpen)
349     {
350     FileTransEnd(OpSendFile);
351     return;
352     }
353     SendVar->ByteCount = 0;
354     SendVar->FileSize = GetFSize(SendVar->FullName);
355    
356     TalkStatus = IdTalkFile;
357     FileRetrySend = FALSE;
358     FileRetryEcho = FALSE;
359     FileCRSend = FALSE;
360 doda 3904 FileReadEOF = FALSE;
361 maya 6071 FileSendHandler.pos = 0;
362     FileSendHandler.end = 0;
363     FileDlgRefresh = 0;
364 maya 3227
365 doda 3904 if (BracketedPasteMode()) {
366     FileBracketMode = FS_BRACKET_START;
367     FileBracketPtr = 0;
368     BinaryMode = TRUE;
369     }
370     else {
371     FileBracketMode = FS_BRACKET_NONE;
372     BinaryMode = ts.TransBin;
373     }
374    
375 maya 3227 if (! OpenFTDlg(SendVar))
376     FileTransEnd(OpSendFile);
377     }
378    
379     void FileTransEnd(WORD OpId)
380     /* OpId = 0: close Log and FileSend
381     OpLog: close Log
382     OpSendFile: close FileSend */
383     {
384     if (((OpId==0) || (OpId==OpLog)) && (FileLog || BinLog))
385     {
386 zmatsuo 8894 FLogClose();
387 maya 3227 }
388    
389     if (((OpId==0) || (OpId==OpSendFile)) && FSend)
390     {
391     FSend = FALSE;
392     TalkStatus = IdTalkKeyb;
393     if (SendDlg!=NULL)
394     {
395     SendDlg->DestroyWindow();
396     SendDlg = NULL;
397     }
398     FreeFileVar(&SendVar);
399     FreeTTFILE();
400     }
401    
402     EndDdeCmnd(0);
403     }
404    
405 zmatsuo 8857 void FileTransPause(WORD OpId, BOOL Pause)
406     {
407     if (Pause) {
408     cv.FilePause |= OpId;
409     }
410     else {
411     cv.FilePause &= ~OpId;
412     }
413     }
414    
415 maya 3227 int FSOut1(BYTE b)
416     {
417 doda 3904 if (BinaryMode)
418 maya 3227 return CommBinaryOut(&cv,(PCHAR)&b,1);
419     else if ((b>=0x20) || (b==0x09) || (b==0x0A) || (b==0x0D))
420     return CommTextOut(&cv,(PCHAR)&b,1);
421     else
422     return 1;
423 doda 3861 }
424 maya 3227
425     int FSEcho1(BYTE b)
426     {
427 doda 3904 if (BinaryMode)
428 maya 3227 return CommBinaryEcho(&cv,(PCHAR)&b,1);
429     else
430     return CommTextEcho(&cv,(PCHAR)&b,1);
431     }
432    
433 maya 6071 // �������������������������g��
434     // - BinaryMode == true
435     // - FileBracketMode == false
436     // - cv.TelFlag == false
437     // - ts.LocalEcho == 0
438 zmatsuo 8894 static void FileSendBinayBoost(void)
439 maya 6071 {
440     WORD c, fc;
441     LONG BCOld;
442     DWORD read_bytes;
443    
444     if ((SendDlg == NULL) ||
445     ((cv.FilePause & OpSendFile) != 0))
446     return;
447    
448     BCOld = SendVar->ByteCount;
449    
450     if (FileRetrySend)
451     {
452     c = CommRawOut(&cv, &(FileSendHandler.buf[FileSendHandler.pos]),
453     FileSendHandler.end - FileSendHandler.pos);
454     FileSendHandler.pos += c;
455     FileRetrySend = (FileSendHandler.end != FileSendHandler.pos);
456     if (FileRetrySend)
457     return;
458     }
459    
460     do {
461     if (FileSendHandler.pos == FileSendHandler.end) {
462 zmatsuo 7930 ReadFile(SendVar->FileHandle, &(FileSendHandler.buf[0]), sizeof(FileSendHandler.buf), &read_bytes, NULL);
463 maya 6071 fc = LOWORD(read_bytes);
464     FileSendHandler.pos = 0;
465     FileSendHandler.end = fc;
466     } else {
467     fc = FileSendHandler.end - FileSendHandler.end;
468     }
469    
470     if (fc != 0)
471     {
472     c = CommRawOut(&cv, &(FileSendHandler.buf[FileSendHandler.pos]),
473     FileSendHandler.end - FileSendHandler.pos);
474     FileSendHandler.pos += c;
475     FileRetrySend = (FileSendHandler.end != FileSendHandler.pos);
476     SendVar->ByteCount = SendVar->ByteCount + c;
477     if (FileRetrySend)
478     {
479     if (SendVar->ByteCount != BCOld)
480     SendDlg->RefreshNum();
481     return;
482     }
483     }
484     FileDlgRefresh = SendVar->ByteCount;
485     SendDlg->RefreshNum();
486     BCOld = SendVar->ByteCount;
487     if (fc != 0)
488     return;
489     } while (fc != 0);
490    
491     FileTransEnd(OpSendFile);
492     }
493    
494 zmatsuo 8858 void FileSend(void)
495 maya 3227 {
496     WORD c, fc;
497     LONG BCOld;
498 maya 5281 DWORD read_bytes;
499 maya 3227
500 maya 6115 if (cv.PortType == IdSerial && ts.FileSendHighSpeedMode &&
501 maya 6110 BinaryMode && !FileBracketMode && !cv.TelFlag &&
502 maya 6079 (ts.LocalEcho == 0) && (ts.Baud >= 115200)) {
503 maya 6071 return FileSendBinayBoost();
504     }
505    
506 maya 3227 if ((SendDlg==NULL) ||
507     ((cv.FilePause & OpSendFile) !=0))
508     return;
509    
510     BCOld = SendVar->ByteCount;
511    
512     if (FileRetrySend)
513     {
514     FileRetryEcho = (ts.LocalEcho>0);
515     c = FSOut1(FileByte);
516     FileRetrySend = (c==0);
517     if (FileRetrySend)
518     return;
519     }
520    
521     if (FileRetryEcho)
522     {
523     c = FSEcho1(FileByte);
524     FileRetryEcho = (c==0);
525     if (FileRetryEcho)
526     return;
527     }
528    
529     do {
530 doda 3904 if (FileBracketMode == FS_BRACKET_START) {
531     FileByte = BracketStartStr[FileBracketPtr++];
532     fc = 1;
533 maya 3227
534 doda 3904 if (FileBracketPtr >= sizeof(BracketStartStr) - 1) {
535     FileBracketMode = FS_BRACKET_END;
536     FileBracketPtr = 0;
537     BinaryMode = ts.TransBin;
538     }
539     }
540     else if (! FileReadEOF) {
541 zmatsuo 7930 ReadFile(SendVar->FileHandle, &FileByte, 1, &read_bytes, NULL);
542 maya 5281 fc = LOWORD(read_bytes);
543 maya 3227 SendVar->ByteCount = SendVar->ByteCount + fc;
544 doda 3904
545     if (FileCRSend && (fc==1) && (FileByte==0x0A)) {
546 zmatsuo 7930 ReadFile(SendVar->FileHandle, &FileByte, 1, &read_bytes, NULL);
547 maya 5281 fc = LOWORD(read_bytes);
548 doda 3904 SendVar->ByteCount = SendVar->ByteCount + fc;
549     }
550 maya 3227 }
551 doda 3904 else {
552     fc = 0;
553     }
554 maya 3227
555 doda 3904 if (fc == 0 && FileBracketMode == FS_BRACKET_END) {
556     FileReadEOF = TRUE;
557     FileByte = BracketEndStr[FileBracketPtr++];
558     fc = 1;
559     BinaryMode = TRUE;
560    
561     if (FileBracketPtr >= sizeof(BracketEndStr) - 1) {
562     FileBracketMode = FS_BRACKET_NONE;
563     FileBracketPtr = 0;
564     }
565     }
566    
567    
568 maya 3227 if (fc!=0)
569     {
570     c = FSOut1(FileByte);
571     FileCRSend = (ts.TransBin==0) && (FileByte==0x0D);
572     FileRetrySend = (c==0);
573     if (FileRetrySend)
574     {
575     if (SendVar->ByteCount != BCOld)
576     SendDlg->RefreshNum();
577     return;
578     }
579     if (ts.LocalEcho>0)
580     {
581     c = FSEcho1(FileByte);
582     FileRetryEcho = (c==0);
583     if (FileRetryEcho)
584     return;
585     }
586     }
587 doda 3904 if ((fc==0) || ((SendVar->ByteCount % 100 == 0) && (FileBracketPtr == 0))) {
588 maya 3227 SendDlg->RefreshNum();
589     BCOld = SendVar->ByteCount;
590     if (fc!=0)
591     return;
592     }
593     } while (fc!=0);
594    
595     FileTransEnd(OpSendFile);
596     }
597    
598 zmatsuo 8857 static BOOL OpenProtoDlg(PFileVar fv, int IdProto, int Mode, WORD Opt1, WORD Opt2)
599 maya 3227 {
600     int vsize;
601     PProtoDlg pd;
602    
603     ProtoId = IdProto;
604    
605     switch (ProtoId) {
606     case PROTO_KMT:
607     vsize = sizeof(TKmtVar);
608     break;
609     case PROTO_XM:
610     vsize = sizeof(TXVar);
611     break;
612     case PROTO_YM:
613     vsize = sizeof(TYVar);
614     break;
615     case PROTO_ZM:
616     vsize = sizeof(TZVar);
617     break;
618     case PROTO_BP:
619     vsize = sizeof(TBPVar);
620     break;
621     case PROTO_QV:
622     vsize = sizeof(TQVVar);
623     break;
624 zmatsuo 8852 default:
625     vsize = 0;
626     assert(FALSE);
627     break;
628 maya 3227 }
629     ProtoVar = (PCHAR)malloc(vsize);
630     if (ProtoVar==NULL)
631     return FALSE;
632    
633     switch (ProtoId) {
634     case PROTO_KMT:
635     ((PKmtVar)ProtoVar)->KmtMode = Mode;
636     break;
637     case PROTO_XM:
638     ((PXVar)ProtoVar)->XMode = Mode;
639     ((PXVar)ProtoVar)->XOpt = Opt1;
640     ((PXVar)ProtoVar)->TextFlag = 1 - (Opt2 & 1);
641     break;
642 doda 6435 case PROTO_YM:
643 maya 3227 ((PYVar)ProtoVar)->YMode = Mode;
644 yutakapon 3819 ((PYVar)ProtoVar)->YOpt = Opt1;
645 maya 3227 break;
646     case PROTO_ZM:
647     ((PZVar)ProtoVar)->BinFlag = (Opt1 & 1) != 0;
648     ((PZVar)ProtoVar)->ZMode = Mode;
649     break;
650     case PROTO_BP:
651     ((PBPVar)ProtoVar)->BPMode = Mode;
652     break;
653     case PROTO_QV:
654     ((PQVVar)ProtoVar)->QVMode = Mode;
655     break;
656     }
657    
658     pd = new CProtoDlg();
659     if (pd==NULL)
660     {
661     free(ProtoVar);
662     ProtoVar = NULL;
663     return FALSE;
664     }
665 zmatsuo 7526 pd->Create(hInst, HVTWin, fv, &ts);
666 maya 3227
667     (*ProtoInit)(ProtoId,FileVar,ProtoVar,&cv,&ts);
668    
669     PtDlg = pd;
670     return TRUE;
671     }
672    
673 zmatsuo 8858 static void CloseProtoDlg(void)
674 maya 3227 {
675     if (PtDlg!=NULL)
676     {
677     PtDlg->DestroyWindow();
678     PtDlg = NULL;
679    
680     ::KillTimer(FileVar->HMainWin,IdProtoTimer);
681     if ((ProtoId==PROTO_QV) &&
682     (((PQVVar)ProtoVar)->QVMode==IdQVSend))
683     CommTextOut(&cv,"\015",1);
684     if (FileVar->LogFlag)
685 zmatsuo 7290 CloseHandle(FileVar->LogFile);
686 maya 3227 FileVar->LogFile = 0;
687     if (ProtoVar!=NULL)
688     {
689     free(ProtoVar);
690     ProtoVar = NULL;
691     }
692     }
693     }
694    
695 zmatsuo 8858 static BOOL ProtoStart(void)
696 maya 3227 {
697     if (cv.ProtoFlag)
698     return FALSE;
699     if (FSend)
700     {
701     FreeFileVar(&FileVar);
702     return FALSE;
703     }
704    
705     if (! LoadTTFILE())
706     return FALSE;
707     NewFileVar(&FileVar);
708    
709     if (FileVar==NULL)
710     {
711     FreeTTFILE();
712     return FALSE;
713     }
714     cv.ProtoFlag = TRUE;
715     return TRUE;
716     }
717    
718 zmatsuo 8858 void ProtoEnd(void)
719 maya 3227 {
720     if (! cv.ProtoFlag)
721     return;
722     cv.ProtoFlag = FALSE;
723    
724     /* Enable transmit delay (serial port) */
725     cv.DelayFlag = TRUE;
726     TalkStatus = IdTalkKeyb;
727    
728     CloseProtoDlg();
729    
730     if ((FileVar!=NULL) && FileVar->Success)
731     EndDdeCmnd(1);
732     else
733     EndDdeCmnd(0);
734    
735     FreeTTFILE();
736     FreeFileVar(&FileVar);
737     }
738    
739 zmatsuo 8857 /**
740     * OnIdle()#teraterm.cpp�����R�[��������
741     * cv.ProtoFlag �� 0 ���O������
742     * @retval 0 continue
743     * 1/2 ActiveWin(�O���[�o������)���l(IdVT=1/IdTek=2)
744     * �� ������������������������
745     */
746 zmatsuo 8858 int ProtoDlgParse(void)
747 maya 3227 {
748     int P;
749    
750     P = ActiveWin;
751     if (PtDlg==NULL)
752     return P;
753    
754     if ((*ProtoParse)(ProtoId,FileVar,ProtoVar,&cv))
755     P = 0; /* continue */
756     else {
757     CommSend(&cv);
758     ProtoEnd();
759     }
760     return P;
761     }
762    
763 zmatsuo 8858 void ProtoDlgTimeOut(void)
764 maya 3227 {
765     if (PtDlg!=NULL)
766     (*ProtoTimeOutProc)(ProtoId,FileVar,ProtoVar,&cv);
767     }
768    
769 zmatsuo 8858 void ProtoDlgCancel(void)
770 maya 3227 {
771     if ((PtDlg!=NULL) &&
772     (*ProtoCancel)(ProtoId,FileVar,ProtoVar,&cv))
773     ProtoEnd();
774     }
775    
776     void KermitStart(int mode)
777     {
778     WORD w;
779    
780     if (! ProtoStart())
781     return;
782    
783     switch (mode) {
784     case IdKmtSend:
785     FileVar->OpId = OpKmtSend;
786     if (strlen(&(FileVar->FullName[FileVar->DirLen]))==0)
787     {
788 maya 7951 char FileDirExpanded[MAX_PATH];
789     ExpandEnvironmentStrings(ts.FileDir, FileDirExpanded, sizeof(FileDirExpanded));
790     if (!(*GetMultiFname)(FileVar, FileDirExpanded, GMF_KERMIT, &w) ||
791 maya 3227 (FileVar->NumFname==0))
792     {
793     ProtoEnd();
794     return;
795     }
796     }
797     else
798     (*SetFileVar)(FileVar);
799     break;
800     case IdKmtReceive:
801     FileVar->OpId = OpKmtRcv;
802     break;
803     case IdKmtGet:
804     FileVar->OpId = OpKmtSend;
805     if (strlen(&(FileVar->FullName[FileVar->DirLen]))==0)
806     {
807 doda 6435 if (! (*GetGetFname)(FileVar->HMainWin,FileVar) ||
808 maya 3227 (strlen(FileVar->FullName)==0))
809     {
810     ProtoEnd();
811     return;
812     }
813     }
814     else
815     (*SetFileVar)(FileVar);
816     break;
817     case IdKmtFinish:
818     FileVar->OpId = OpKmtFin;
819     break;
820     default:
821     ProtoEnd();
822     return;
823     }
824     TalkStatus = IdTalkQuiet;
825    
826     /* disable transmit delay (serial port) */
827     cv.DelayFlag = FALSE;
828    
829     if (! OpenProtoDlg(FileVar,PROTO_KMT,mode,0,0))
830     ProtoEnd();
831     }
832    
833     void XMODEMStart(int mode)
834     {
835     LONG Option;
836 doda 6328 int tmp;
837 maya 3227
838     if (! ProtoStart())
839     return;
840    
841     if (mode==IdXReceive)
842     FileVar->OpId = OpXRcv;
843     else
844     FileVar->OpId = OpXSend;
845    
846     if (strlen(&(FileVar->FullName[FileVar->DirLen]))==0)
847     {
848 maya 7951 char FileDirExpanded[MAX_PATH];
849     ExpandEnvironmentStrings(ts.FileDir, FileDirExpanded, sizeof(FileDirExpanded));
850 maya 3227 Option = MAKELONG(ts.XmodemBin,ts.XmodemOpt);
851     if (! (*GetXFname)(FileVar->HMainWin,
852 maya 7951 mode==IdXReceive,&Option,FileVar,FileDirExpanded))
853 maya 3227 {
854     ProtoEnd();
855     return;
856     }
857 doda 6328 tmp = HIWORD(Option);
858     if (mode == IdXReceive) {
859     if (IsXoptCRC(tmp)) {
860     if (IsXopt1k(ts.XmodemOpt)) {
861     ts.XmodemOpt = Xopt1kCRC;
862     }
863     else {
864     ts.XmodemOpt = XoptCRC;
865     }
866     }
867     else {
868     if (IsXopt1k(ts.XmodemOpt)) {
869     ts.XmodemOpt = Xopt1kCksum;
870     }
871     else {
872     ts.XmodemOpt = XoptCheck;
873     }
874     }
875     ts.XmodemBin = LOWORD(Option);
876     }
877     else {
878     if (IsXopt1k(tmp)) {
879     if (IsXoptCRC(ts.XmodemOpt)) {
880     ts.XmodemOpt = Xopt1kCRC;
881     }
882     else {
883     ts.XmodemOpt = Xopt1kCksum;
884     }
885     }
886     else {
887     if (IsXoptCRC(ts.XmodemOpt)) {
888     ts.XmodemOpt = XoptCRC;
889     }
890     else {
891     ts.XmodemOpt = XoptCheck;
892     }
893     }
894     }
895 maya 3227 }
896     else
897     (*SetFileVar)(FileVar);
898    
899     if (mode==IdXReceive)
900     FileVar->FileHandle = _lcreat(FileVar->FullName,0);
901     else
902     FileVar->FileHandle = _lopen(FileVar->FullName,OF_READ);
903    
904 zmatsuo 7290 FileVar->FileOpen = FileVar->FileHandle != INVALID_HANDLE_VALUE;
905 maya 3227 if (! FileVar->FileOpen)
906     {
907     ProtoEnd();
908     return;
909     }
910     TalkStatus = IdTalkQuiet;
911    
912     /* disable transmit delay (serial port) */
913     cv.DelayFlag = FALSE;
914    
915     if (! OpenProtoDlg(FileVar,PROTO_XM,mode,
916     ts.XmodemOpt,ts.XmodemBin))
917     ProtoEnd();
918     }
919    
920     void YMODEMStart(int mode)
921     {
922     WORD Opt;
923    
924     if (! ProtoStart())
925     return;
926    
927     if (mode==IdYSend)
928     {
929 maya 7951 char FileDirExpanded[MAX_PATH];
930     ExpandEnvironmentStrings(ts.FileDir, FileDirExpanded, sizeof(FileDirExpanded));
931    
932 yutakapon 3819 // �t�@�C���]�������I�v�V������"Yopt1K"�����������B
933     // TODO: "Yopt1K", "YoptG", "YoptSingle"�������������������AIDD_FOPT���g�������K�v�����B
934     Opt = Yopt1K;
935 maya 3227 FileVar->OpId = OpYSend;
936     if (strlen(&(FileVar->FullName[FileVar->DirLen]))==0)
937     {
938 maya 7951 if (! (*GetMultiFname)(FileVar,FileDirExpanded,GMF_Y,&Opt) ||
939 maya 3227 (FileVar->NumFname==0))
940     {
941     ProtoEnd();
942     return;
943     }
944 yutakapon 3819 //ts.XmodemBin = Opt;
945 maya 3227 }
946     else
947     (*SetFileVar)(FileVar);
948     }
949 doda 6363 else {
950 maya 3227 FileVar->OpId = OpYRcv;
951 yutakapon 3820 // �t�@�C���]�������I�v�V������"Yopt1K"�����������B
952     Opt = Yopt1K;
953 yutakapon 3821 (*SetFileVar)(FileVar);
954 yutakapon 3820 }
955 maya 3227
956     TalkStatus = IdTalkQuiet;
957    
958     /* disable transmit delay (serial port) */
959     cv.DelayFlag = FALSE;
960    
961     if (! OpenProtoDlg(FileVar,PROTO_YM,mode,Opt,0))
962     ProtoEnd();
963     }
964    
965     void ZMODEMStart(int mode)
966     {
967     WORD Opt;
968    
969     if (! ProtoStart())
970     return;
971    
972 doda 6361 if (mode == IdZSend || mode == IdZAutoS)
973 maya 3227 {
974     Opt = ts.XmodemBin;
975     FileVar->OpId = OpZSend;
976     if (strlen(&(FileVar->FullName[FileVar->DirLen]))==0)
977     {
978 maya 7951 char FileDirExpanded[MAX_PATH];
979     ExpandEnvironmentStrings(ts.FileDir, FileDirExpanded, sizeof(FileDirExpanded));
980     if (! (*GetMultiFname)(FileVar,FileDirExpanded,GMF_Z,&Opt) ||
981 maya 3227 (FileVar->NumFname==0))
982     {
983 doda 6364 if (mode == IdZAutoS) {
984     CommRawOut(&cv, "\030\030\030\030\030\030\030\030\b\b\b\b\b\b\b\b\b\b", 18);
985     }
986 maya 3227 ProtoEnd();
987     return;
988     }
989     ts.XmodemBin = Opt;
990     }
991     else
992     (*SetFileVar)(FileVar);
993     }
994 doda 6361 else /* IdZReceive or IdZAutoR */
995 maya 3227 FileVar->OpId = OpZRcv;
996    
997     TalkStatus = IdTalkQuiet;
998    
999     /* disable transmit delay (serial port) */
1000     cv.DelayFlag = FALSE;
1001    
1002     if (! OpenProtoDlg(FileVar,PROTO_ZM,mode,Opt,0))
1003     ProtoEnd();
1004     }
1005    
1006     void BPStart(int mode)
1007     {
1008 doda 6946 LONG Option = 0;
1009 maya 3227
1010     if (! ProtoStart())
1011     return;
1012     if (mode==IdBPSend)
1013     {
1014     FileVar->OpId = OpBPSend;
1015     if (strlen(&(FileVar->FullName[FileVar->DirLen]))==0)
1016     {
1017 maya 7951 char FileDirExpanded[MAX_PATH];
1018     ExpandEnvironmentStrings(ts.FileDir, FileDirExpanded, sizeof(FileDirExpanded));
1019 maya 3227 FileVar->FullName[0] = 0;
1020 maya 7951 if (! (*GetTransFname)(FileVar, FileDirExpanded, GTF_BP, &Option))
1021 maya 3227 {
1022     ProtoEnd();
1023     return;
1024     }
1025     }
1026     else
1027     (*SetFileVar)(FileVar);
1028     }
1029     else /* IdBPReceive or IdBPAuto */
1030     FileVar->OpId = OpBPRcv;
1031    
1032     TalkStatus = IdTalkQuiet;
1033    
1034     /* disable transmit delay (serial port) */
1035     cv.DelayFlag = FALSE;
1036    
1037     if (! OpenProtoDlg(FileVar,PROTO_BP,mode,0,0))
1038     ProtoEnd();
1039     }
1040    
1041     void QVStart(int mode)
1042     {
1043     WORD W;
1044    
1045     if (! ProtoStart())
1046     return;
1047    
1048     if (mode==IdQVSend)
1049     {
1050     FileVar->OpId = OpQVSend;
1051     if (strlen(&(FileVar->FullName[FileVar->DirLen]))==0)
1052     {
1053 maya 7951 char FileDirExpanded[MAX_PATH];
1054     ExpandEnvironmentStrings(ts.FileDir, FileDirExpanded, sizeof(FileDirExpanded));
1055     if (! (*GetMultiFname)(FileVar,FileDirExpanded,GMF_QV, &W) ||
1056 maya 3227 (FileVar->NumFname==0))
1057     {
1058     ProtoEnd();
1059     return;
1060     }
1061     }
1062     else
1063     (*SetFileVar)(FileVar);
1064     }
1065     else
1066     FileVar->OpId = OpQVRcv;
1067    
1068     TalkStatus = IdTalkQuiet;
1069    
1070     /* disable transmit delay (serial port) */
1071     cv.DelayFlag = FALSE;
1072    
1073     if (! OpenProtoDlg(FileVar,PROTO_QV,mode,0,0))
1074     ProtoEnd();
1075     }

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