Revision: 9052 https://osdn.net/projects/ttssh2/scm/svn/commits/9052 Author: zmatsuo Date: 2020-12-20 21:06:06 +0900 (Sun, 20 Dec 2020) Log Message: ----------- filesys.cpp,h からプロトコル転送に関するソースを filesys_proto.cpp へ分離 Modified Paths: -------------- trunk/teraterm/teraterm/CMakeLists.txt trunk/teraterm/teraterm/filesys.cpp trunk/teraterm/teraterm/filesys.h trunk/teraterm/teraterm/ttermpro.v16.vcxproj trunk/teraterm/teraterm/ttermpro.v8.vcproj Added Paths: ----------- trunk/teraterm/teraterm/filesys_proto.cpp -------------- next part -------------- Modified: trunk/teraterm/teraterm/CMakeLists.txt =================================================================== --- trunk/teraterm/teraterm/CMakeLists.txt 2020-12-20 12:05:50 UTC (rev 9051) +++ trunk/teraterm/teraterm/CMakeLists.txt 2020-12-20 12:06:06 UTC (rev 9052) @@ -32,6 +32,7 @@ filesys_log.cpp filesys_log.rc filesys_log_res.h + filesys_proto.cpp font_pp.cpp font_pp.h font_pp.rc Modified: trunk/teraterm/teraterm/filesys.cpp =================================================================== --- trunk/teraterm/teraterm/filesys.cpp 2020-12-20 12:05:50 UTC (rev 9051) +++ trunk/teraterm/teraterm/filesys.cpp 2020-12-20 12:06:06 UTC (rev 9052) @@ -64,9 +64,9 @@ #define FS_BRACKET_END 2 PFileVar SendVar = NULL; -PFileVar FileVar = NULL; -static PCHAR ProtoVar = NULL; -static int ProtoId; +//PFileVar FileVar = NULL; +//static PCHAR ProtoVar = NULL; +//static int ProtoId; static BOOL FileRetrySend, FileRetryEcho, FileCRSend, FileReadEOF, BinaryMode; static BYTE FileByte; @@ -85,19 +85,19 @@ static char BracketStartStr[] = "\033[200~"; static char BracketEndStr[] = "\033[201~"; -static BOOL FSend = FALSE; +BOOL FSend = FALSE; static HMODULE HTTFILE = NULL; static int TTFILECount = 0; PGetSetupFname GetSetupFname; -static PGetTransFname GetTransFname; +PGetTransFname GetTransFname; PGetMultiFname GetMultiFname; PGetGetFname GetGetFname; PSetFileVar SetFileVar; PGetXFname GetXFname; PProtoInit ProtoInit; -static PProtoParse ProtoParse; +PProtoParse ProtoParse; PProtoTimeOutProc ProtoTimeOutProc; PProtoCancel ProtoCancel; PTTFILESetUILanguageFile TTFILESetUILanguageFile; @@ -232,7 +232,7 @@ } static PFileTransDlg SendDlg = NULL; -static PProtoDlg PtDlg = NULL; +//static PProtoDlg PtDlg = NULL; static BOOL OpenFTDlg(PFileVar fv) { @@ -265,7 +265,7 @@ } } -BOOL NewFileVar(PFileVar *fv) +static BOOL NewFileVar(PFileVar *fv) { if ((*fv)==NULL) { @@ -290,7 +290,7 @@ return ((*fv)!=NULL); } -void FreeFileVar(PFileVar *fv) +static void FreeFileVar(PFileVar *fv) { if ((*fv)!=NULL) { @@ -614,6 +614,7 @@ FileTransEnd(OpSendFile); } +#if 0 static BOOL OpenProtoDlg(PFileVar fv, int IdProto, int Mode, WORD Opt1, WORD Opt2) { int vsize; @@ -1347,6 +1348,7 @@ return TRUE; } +#endif BOOL IsSendVarNULL() { @@ -1353,7 +1355,9 @@ return SendVar == NULL; } +#if 0 BOOL IsFileVarNULL() { return FileVar == NULL; } +#endif Modified: trunk/teraterm/teraterm/filesys.h =================================================================== --- trunk/teraterm/teraterm/filesys.h 2020-12-20 12:05:50 UTC (rev 9051) +++ trunk/teraterm/teraterm/filesys.h 2020-12-20 12:06:06 UTC (rev 9052) @@ -58,13 +58,13 @@ (char *file); extern PGetSetupFname GetSetupFname; -//extern PGetTransFname GetTransFname; +extern PGetTransFname GetTransFname; extern PGetMultiFname GetMultiFname; extern PGetGetFname GetGetFname; extern PSetFileVar SetFileVar; extern PGetXFname GetXFname; extern PProtoInit ProtoInit; -//extern PProtoParse ProtoParse; +extern PProtoParse ProtoParse; extern PProtoTimeOutProc ProtoTimeOutProc; extern PProtoCancel ProtoCancel; extern PTTFILESetUILanguageFile TTFILESetUILanguageFile; Copied: trunk/teraterm/teraterm/filesys_proto.cpp (from rev 9051, trunk/teraterm/teraterm/filesys.cpp) =================================================================== --- trunk/teraterm/teraterm/filesys_proto.cpp (rev 0) +++ trunk/teraterm/teraterm/filesys_proto.cpp 2020-12-20 12:06:06 UTC (rev 9052) @@ -0,0 +1,1374 @@ +/* + * Copyright (C) 1994-1998 T. Teranishi + * (C) 2005-2020 TeraTerm Project + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* TERATERM.EXE, file transfer routines */ +#include <stdio.h> +#include <io.h> +#include <process.h> +#include <windows.h> +#include <htmlhelp.h> +#include <assert.h> + +#include "teraterm.h" +#include "tttypes.h" +#include "ttftypes.h" +#include "ftdlg.h" +#include "protodlg.h" +#include "ttwinman.h" +#include "commlib.h" +#include "ttcommon.h" +#include "ttdde.h" +#include "ttlib.h" +#include "dlglib.h" +#include "vtterm.h" +#include "win16api.h" +#include "ftlib.h" +#include "buffer.h" +#include "helpid.h" +#include "layer_for_unicode.h" +#include "layer_for_unicode_crt.h" +#include "codeconv.h" + +#include "filesys_log_res.h" + +#include "filesys.h" + +#if 0 +#define FS_BRACKET_NONE 0 +#define FS_BRACKET_START 1 +#define FS_BRACKET_END 2 +#endif + +//PFileVar SendVar = NULL; +PFileVar FileVar = NULL; +static PCHAR ProtoVar = NULL; +static int ProtoId; + +#if 0 +static BOOL FileRetrySend, FileRetryEcho, FileCRSend, FileReadEOF, BinaryMode; +static BYTE FileByte; + +#define FILE_SEND_BUF_SIZE 8192 +struct FileSendHandler { + CHAR buf[FILE_SEND_BUF_SIZE]; + int pos; + int end; +}; +static struct FileSendHandler FileSendHandler; +static int FileDlgRefresh; + +static int FileBracketMode = FS_BRACKET_NONE; +static int FileBracketPtr = 0; +static char BracketStartStr[] = "\033[200~"; +static char BracketEndStr[] = "\033[201~"; +#endif + +extern BOOL FSend; + +#if 0 +static HMODULE HTTFILE = NULL; +static int TTFILECount = 0; + +PGetSetupFname GetSetupFname; +PGetTransFname GetTransFname; +PGetMultiFname GetMultiFname; +PGetGetFname GetGetFname; +PSetFileVar SetFileVar; +PGetXFname GetXFname; +PProtoInit ProtoInit; +PProtoParse ProtoParse; +PProtoTimeOutProc ProtoTimeOutProc; +PProtoCancel ProtoCancel; +PTTFILESetUILanguageFile TTFILESetUILanguageFile; +PTTFILESetFileSendFilter TTFILESetFileSendFilter; +#endif + +#define IdGetSetupFname 1 +#define IdGetTransFname 2 +#define IdGetMultiFname 3 +#define IdGetGetFname 4 +#define IdSetFileVar 5 +#define IdGetXFname 6 + +#define IdProtoInit 7 +#define IdProtoParse 8 +#define IdProtoTimeOutProc 9 +#define IdProtoCancel 10 + +#define IdTTFILESetUILanguageFile 11 +#define IdTTFILESetFileSendFilter 12 + +#if 0 +BOOL LoadTTFILE(void) +{ + BOOL Err; + + if (HTTFILE != NULL) + { + TTFILECount++; + return TRUE; + } + else + TTFILECount = 0; + + HTTFILE = LoadHomeDLL("TTPFILE.DLL"); + if (HTTFILE == NULL) + return FALSE; + + Err = FALSE; + + GetSetupFname = (PGetSetupFname)GetProcAddress(HTTFILE, + MAKEINTRESOURCE(IdGetSetupFname)); + if (GetSetupFname==NULL) + Err = TRUE; + + GetTransFname = (PGetTransFname)GetProcAddress(HTTFILE, + MAKEINTRESOURCE(IdGetTransFname)); + if (GetTransFname==NULL) + Err = TRUE; + + GetMultiFname = (PGetMultiFname)GetProcAddress(HTTFILE, + MAKEINTRESOURCE(IdGetMultiFname)); + if (GetMultiFname==NULL) + Err = TRUE; + + GetGetFname = (PGetGetFname)GetProcAddress(HTTFILE, + MAKEINTRESOURCE(IdGetGetFname)); + if (GetGetFname==NULL) + Err = TRUE; + + SetFileVar = (PSetFileVar)GetProcAddress(HTTFILE, + MAKEINTRESOURCE(IdSetFileVar)); + if (SetFileVar==NULL) + Err = TRUE; + + GetXFname = (PGetXFname)GetProcAddress(HTTFILE, + MAKEINTRESOURCE(IdGetXFname)); + if (GetXFname==NULL) + Err = TRUE; + + ProtoInit = (PProtoInit)GetProcAddress(HTTFILE, + MAKEINTRESOURCE(IdProtoInit)); + if (ProtoInit==NULL) + Err = TRUE; + + ProtoParse = (PProtoParse)GetProcAddress(HTTFILE, + MAKEINTRESOURCE(IdProtoParse)); + if (ProtoParse==NULL) + Err = TRUE; + + ProtoTimeOutProc = (PProtoTimeOutProc)GetProcAddress(HTTFILE, + MAKEINTRESOURCE(IdProtoTimeOutProc)); + if (ProtoTimeOutProc==NULL) + Err = TRUE; + + ProtoCancel = (PProtoCancel)GetProcAddress(HTTFILE, + MAKEINTRESOURCE(IdProtoCancel)); + if (ProtoCancel==NULL) + Err = TRUE; + + TTFILESetUILanguageFile = (PTTFILESetUILanguageFile)GetProcAddress(HTTFILE, + MAKEINTRESOURCE(IdTTFILESetUILanguageFile)); + if (TTFILESetUILanguageFile==NULL) { + Err = TRUE; + } + else { + TTFILESetUILanguageFile(ts.UILanguageFile); + } + + TTFILESetFileSendFilter = (PTTFILESetFileSendFilter)GetProcAddress(HTTFILE, + MAKEINTRESOURCE(IdTTFILESetFileSendFilter)); + if (TTFILESetFileSendFilter==NULL) { + Err = TRUE; + } + else { + TTFILESetFileSendFilter(ts.FileSendFilter); + } + + if (Err) + { + FreeLibrary(HTTFILE); + HTTFILE = NULL; + return FALSE; + } + else { + TTFILECount = 1; + return TRUE; + } +} + +BOOL FreeTTFILE(void) +{ + if (TTFILECount==0) + return FALSE; + TTFILECount--; + if (TTFILECount>0) + return TRUE; + if (HTTFILE!=NULL) + { + FreeLibrary(HTTFILE); + HTTFILE = NULL; + } + return TRUE; +} +#endif + +//static PFileTransDlg SendDlg = NULL; +static PProtoDlg PtDlg = NULL; + +#if 0 +static BOOL OpenFTDlg(PFileVar fv) +{ + PFileTransDlg FTDlg; + + FTDlg = new CFileTransDlg(); + + fv->StartTime = 0; + fv->ProgStat = 0; + cv.FilePause &= ~fv->OpId; + + if (FTDlg!=NULL) + { + FTDlg->Create(hInst, HVTWin, fv, &cv, &ts); + FTDlg->RefreshNum(fv); + } + + SendDlg = FTDlg; /* File send */ + + fv->StartTime = GetTickCount(); + + return (FTDlg!=NULL); +} + +static void ShowFTDlg(WORD OpId) +{ + if (SendDlg != NULL) { + SendDlg->ShowWindow(SW_SHOWNORMAL); + SetForegroundWindow(SendDlg->GetSafeHwnd()); + } +} +#endif + +static BOOL NewFileVar_(PFileVar *fv) +{ + if ((*fv)==NULL) + { + *fv = (PFileVar)malloc(sizeof(TFileVar)); + if ((*fv)!=NULL) + { + char FileDirExpanded[MAX_PATH]; + ExpandEnvironmentStrings(ts.FileDir, FileDirExpanded, sizeof(FileDirExpanded)); + memset(*fv, 0, sizeof(TFileVar)); + strncpy_s((*fv)->FullName, sizeof((*fv)->FullName), FileDirExpanded, _TRUNCATE); + AppendSlash((*fv)->FullName,sizeof((*fv)->FullName)); + (*fv)->DirLen = strlen((*fv)->FullName); + (*fv)->FileOpen = FALSE; + (*fv)->OverWrite = ((ts.FTFlag & FT_RENAME) == 0); + (*fv)->HMainWin = HVTWin; + (*fv)->Success = FALSE; + (*fv)->NoMsg = FALSE; + (*fv)->HideDialog = FALSE; + } + } + + return ((*fv)!=NULL); +} + +static void FreeFileVar_(PFileVar *fv) +{ + if ((*fv)!=NULL) + { + if ((*fv)->FileOpen) CloseHandle((*fv)->FileHandle); + if ((*fv)->FnStrMemHandle != 0) + { + GlobalUnlock((*fv)->FnStrMemHandle); + GlobalFree((*fv)->FnStrMemHandle); + } + free(*fv); + *fv = NULL; + } +} + +#if 0 +void FileSendStart(void) +{ + LONG Option = 0; + + if (! cv.Ready || FSend) return; + if (cv.ProtoFlag) + { + FreeFileVar(&SendVar); + return; + } + + if (! LoadTTFILE()) + return; + if (! NewFileVar(&SendVar)) + { + FreeTTFILE(); + return; + } + SendVar->OpId = OpSendFile; + + FSend = TRUE; + + if (strlen(&(SendVar->FullName[SendVar->DirLen])) == 0) { + char FileDirExpanded[MAX_PATH]; + ExpandEnvironmentStrings(ts.FileDir, FileDirExpanded, sizeof(FileDirExpanded)); + if (ts.TransBin) + Option |= LOGDLG_BINARY; + SendVar->FullName[0] = 0; + if (! (*GetTransFname)(SendVar, FileDirExpanded, GTF_SEND, &Option)) { + FileTransEnd(OpSendFile); + return; + } + ts.TransBin = CheckFlag(Option, LOGDLG_BINARY); + } + else + (*SetFileVar)(SendVar); + + SendVar->FileHandle = CreateFile(SendVar->FullName, GENERIC_READ, FILE_SHARE_READ, NULL, + OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL); + SendVar->FileOpen = (SendVar->FileHandle != INVALID_HANDLE_VALUE); + if (! SendVar->FileOpen) + { + FileTransEnd(OpSendFile); + return; + } + SendVar->ByteCount = 0; + SendVar->FileSize = GetFSize(SendVar->FullName); + + TalkStatus = IdTalkFile; + FileRetrySend = FALSE; + FileRetryEcho = FALSE; + FileCRSend = FALSE; + FileReadEOF = FALSE; + FileSendHandler.pos = 0; + FileSendHandler.end = 0; + FileDlgRefresh = 0; + + if (BracketedPasteMode()) { + FileBracketMode = FS_BRACKET_START; + FileBracketPtr = 0; + BinaryMode = TRUE; + } + else { + FileBracketMode = FS_BRACKET_NONE; + BinaryMode = ts.TransBin; + } + + if (! OpenFTDlg(SendVar)) + FileTransEnd(OpSendFile); +} + +BOOL FileSendStart2(const char *filename, int binary) +{ + if (SendVar != NULL) { + return FALSE; + } + if (!NewFileVar(&SendVar)) { + return FALSE; + } + + SendVar->DirLen = 0; + strncpy_s(SendVar->FullName, sizeof(SendVar->FullName), filename, _TRUNCATE); + ts.TransBin = binary; + SendVar->NoMsg = TRUE; + FileSendStart(); + + return TRUE; +} + +void FileTransEnd(WORD OpId) +/* OpId = 0: close Log and FileSend + OpLog: close Log + OpSendFile: close FileSend */ +{ + if ((OpId==0) || (OpId==OpLog)) { + if (FLogIsOpend()) { + FLogClose(); + } + } + + if (((OpId==0) || (OpId==OpSendFile)) && FSend) + { + FSend = FALSE; + TalkStatus = IdTalkKeyb; + if (SendDlg!=NULL) + { + SendDlg->DestroyWindow(); + SendDlg = NULL; + } + FreeFileVar(&SendVar); + FreeTTFILE(); + } + + EndDdeCmnd(0); +} + +void FileTransPause(WORD OpId, BOOL Pause) +{ + if (Pause) { + cv.FilePause |= OpId; + } + else { + cv.FilePause &= ~OpId; + } +} + +int FSOut1(BYTE b) +{ + if (BinaryMode) + return CommBinaryOut(&cv,(PCHAR)&b,1); + else if ((b>=0x20) || (b==0x09) || (b==0x0A) || (b==0x0D)) + return CommTextOut(&cv,(PCHAR)&b,1); + else + return 1; +} + +int FSEcho1(BYTE b) +{ + if (BinaryMode) + return CommBinaryEcho(&cv,(PCHAR)&b,1); + else + return CommTextEcho(&cv,(PCHAR)&b,1); +} + +// \x88ȉ\xBA\x82̎\x9E\x82͂\xB1\x82\xBF\x82\xE7\x82̊\x94\x82\xF0\x8Eg\x82\xA4 +// - BinaryMode == true +// - FileBracketMode == false +// - cv.TelFlag == false +// - ts.LocalEcho == 0 +static void FileSendBinayBoost(void) +{ + WORD c, fc; + LONG BCOld; + DWORD read_bytes; + + if ((SendDlg == NULL) || + ((cv.FilePause & OpSendFile) != 0)) + return; + + BCOld = SendVar->ByteCount; + + if (FileRetrySend) + { + c = CommRawOut(&cv, &(FileSendHandler.buf[FileSendHandler.pos]), + FileSendHandler.end - FileSendHandler.pos); + FileSendHandler.pos += c; + FileRetrySend = (FileSendHandler.end != FileSendHandler.pos); + if (FileRetrySend) + return; + } + + do { + if (FileSendHandler.pos == FileSendHandler.end) { + ReadFile(SendVar->FileHandle, &(FileSendHandler.buf[0]), sizeof(FileSendHandler.buf), &read_bytes, NULL); + fc = LOWORD(read_bytes); + FileSendHandler.pos = 0; + FileSendHandler.end = fc; + } else { + fc = FileSendHandler.end - FileSendHandler.end; + } + + if (fc != 0) + { + c = CommRawOut(&cv, &(FileSendHandler.buf[FileSendHandler.pos]), + FileSendHandler.end - FileSendHandler.pos); + FileSendHandler.pos += c; + FileRetrySend = (FileSendHandler.end != FileSendHandler.pos); + SendVar->ByteCount = SendVar->ByteCount + c; + if (FileRetrySend) + { + if (SendVar->ByteCount != BCOld) + SendDlg->RefreshNum(SendVar); + return; + } + } + FileDlgRefresh = SendVar->ByteCount; + SendDlg->RefreshNum(SendVar); + BCOld = SendVar->ByteCount; + if (fc != 0) + return; + } while (fc != 0); + + FileTransEnd(OpSendFile); +} + +void FileSend(void) +{ + WORD c, fc; + LONG BCOld; + DWORD read_bytes; + + if (cv.PortType == IdSerial && ts.FileSendHighSpeedMode && + BinaryMode && !FileBracketMode && !cv.TelFlag && + (ts.LocalEcho == 0) && (ts.Baud >= 115200)) { + return FileSendBinayBoost(); + } + + if ((SendDlg==NULL) || + ((cv.FilePause & OpSendFile) !=0)) + return; + + BCOld = SendVar->ByteCount; + + if (FileRetrySend) + { + FileRetryEcho = (ts.LocalEcho>0); + c = FSOut1(FileByte); + FileRetrySend = (c==0); + if (FileRetrySend) + return; + } + + if (FileRetryEcho) + { + c = FSEcho1(FileByte); + FileRetryEcho = (c==0); + if (FileRetryEcho) + return; + } + + do { + if (FileBracketMode == FS_BRACKET_START) { + FileByte = BracketStartStr[FileBracketPtr++]; + fc = 1; + + if (FileBracketPtr >= sizeof(BracketStartStr) - 1) { + FileBracketMode = FS_BRACKET_END; + FileBracketPtr = 0; + BinaryMode = ts.TransBin; + } + } + else if (! FileReadEOF) { + ReadFile(SendVar->FileHandle, &FileByte, 1, &read_bytes, NULL); + fc = LOWORD(read_bytes); + SendVar->ByteCount = SendVar->ByteCount + fc; + + if (FileCRSend && (fc==1) && (FileByte==0x0A)) { + ReadFile(SendVar->FileHandle, &FileByte, 1, &read_bytes, NULL); + fc = LOWORD(read_bytes); + SendVar->ByteCount = SendVar->ByteCount + fc; + } + } + else { + fc = 0; + } + + if (fc == 0 && FileBracketMode == FS_BRACKET_END) { + FileReadEOF = TRUE; + FileByte = BracketEndStr[FileBracketPtr++]; + fc = 1; + BinaryMode = TRUE; + + if (FileBracketPtr >= sizeof(BracketEndStr) - 1) { + FileBracketMode = FS_BRACKET_NONE; + FileBracketPtr = 0; + } + } + + + if (fc!=0) + { + c = FSOut1(FileByte); + FileCRSend = (ts.TransBin==0) && (FileByte==0x0D); + FileRetrySend = (c==0); + if (FileRetrySend) + { + if (SendVar->ByteCount != BCOld) + SendDlg->RefreshNum(SendVar); + return; + } + if (ts.LocalEcho>0) + { + c = FSEcho1(FileByte); + FileRetryEcho = (c==0); + if (FileRetryEcho) + return; + } + } + if ((fc==0) || ((SendVar->ByteCount % 100 == 0) && (FileBracketPtr == 0))) { + SendDlg->RefreshNum(SendVar); + BCOld = SendVar->ByteCount; + if (fc!=0) + return; + } + } while (fc!=0); + + FileTransEnd(OpSendFile); +} +#endif + + +static BOOL OpenProtoDlg(PFileVar fv, int IdProto, int Mode, WORD Opt1, WORD Opt2) +{ + int vsize; + PProtoDlg pd; + + ProtoId = IdProto; + + switch (ProtoId) { + case PROTO_KMT: + vsize = sizeof(TKmtVar); + break; + case PROTO_XM: + vsize = sizeof(TXVar); + break; + case PROTO_YM: + vsize = sizeof(TYVar); + break; + case PROTO_ZM: + vsize = sizeof(TZVar); + break; + case PROTO_BP: + vsize = sizeof(TBPVar); + break; + case PROTO_QV: + vsize = sizeof(TQVVar); + break; + default: + vsize = 0; + assert(FALSE); + break; + } + ProtoVar = (PCHAR)malloc(vsize); + if (ProtoVar==NULL) + return FALSE; + + switch (ProtoId) { + case PROTO_KMT: + ((PKmtVar)ProtoVar)->KmtMode = Mode; + break; + case PROTO_XM: + ((PXVar)ProtoVar)->XMode = Mode; + ((PXVar)ProtoVar)->XOpt = Opt1; + ((PXVar)ProtoVar)->TextFlag = 1 - (Opt2 & 1); + break; + case PROTO_YM: + ((PYVar)ProtoVar)->YMode = Mode; + ((PYVar)ProtoVar)->YOpt = Opt1; + break; + case PROTO_ZM: + ((PZVar)ProtoVar)->BinFlag = (Opt1 & 1) != 0; + ((PZVar)ProtoVar)->ZMode = Mode; + break; + case PROTO_BP: + ((PBPVar)ProtoVar)->BPMode = Mode; + break; + case PROTO_QV: + ((PQVVar)ProtoVar)->QVMode = Mode; + break; + } + + pd = new CProtoDlg(); + if (pd==NULL) + { + free(ProtoVar); + ProtoVar = NULL; + return FALSE; + } + CProtoDlgInfo info; + info.UILanguageFile = ts.UILanguageFile; + info.HMainWin = fv->HMainWin; + pd->Create(hInst, HVTWin, &info); + fv->HWin = pd->m_hWnd; + + (*ProtoInit)(ProtoId,FileVar,ProtoVar,&cv,&ts); + + PtDlg = pd; + return TRUE; +} + +static void CloseProtoDlg(void) +{ + if (PtDlg!=NULL) + { + PtDlg->DestroyWindow(); + PtDlg = NULL; + + ::KillTimer(FileVar->HMainWin,IdProtoTimer); + if ((ProtoId==PROTO_QV) && + (((PQVVar)ProtoVar)->QVMode==IdQVSend)) + CommTextOut(&cv,"\015",1); + if (FileVar->LogFlag) + CloseHandle(FileVar->LogFile); + FileVar->LogFile = 0; + if (ProtoVar!=NULL) + { + free(ProtoVar); + ProtoVar = NULL; + } + } +} + +static BOOL ProtoStart(void) +{ + if (cv.ProtoFlag) + return FALSE; + if (FSend) + { + FreeFileVar_(&FileVar); + return FALSE; + } + + if (! LoadTTFILE()) + return FALSE; + NewFileVar_(&FileVar); + + if (FileVar==NULL) + { + FreeTTFILE(); + return FALSE; + } + cv.ProtoFlag = TRUE; + return TRUE; +} + +void ProtoEnd(void) +{ + if (! cv.ProtoFlag) + return; + cv.ProtoFlag = FALSE; + + /* Enable transmit delay (serial port) */ + cv.DelayFlag = TRUE; + TalkStatus = IdTalkKeyb; + + CloseProtoDlg(); + + if ((FileVar!=NULL) && FileVar->Success) + EndDdeCmnd(1); + else + EndDdeCmnd(0); + + FreeTTFILE(); + FreeFileVar_(&FileVar); +} + +/** + * OnIdle()#teraterm.cpp\x82\xA9\x82\xE7\x83R\x81[\x83\x8B\x82\xB3\x82\xEA\x82\xE9 + * cv.ProtoFlag \x82\xAA 0 \x88ȊO\x82̂Ƃ\xAB + * @retval 0 continue + * 1/2 ActiveWin(\x83O\x83\x8D\x81[\x83o\x83\x8B\x95ϐ\x94)\x82̒l(IdVT=1/IdTek=2) + * \x92\x8D \x8D\xA1\x82̂Ƃ\xB1\x82\xEB\x8ÊĂ\xE7\x82\xEA\x82Ă\xA2\x82\xE9 + */ +int ProtoDlgParse(void) +{ + int P; + + P = ActiveWin; + if (PtDlg==NULL) + return P; + + if ((*ProtoParse)(ProtoId,FileVar,ProtoVar,&cv)) + P = 0; /* continue */ + else { + CommSend(&cv); + ProtoEnd(); + } + return P; +} + +void ProtoDlgTimeOut(void) +{ + if (PtDlg!=NULL) + (*ProtoTimeOutProc)(ProtoId,FileVar,ProtoVar,&cv); +} + +void ProtoDlgCancel(void) +{ + if ((PtDlg!=NULL) && + (*ProtoCancel)(ProtoId,FileVar,ProtoVar,&cv)) + ProtoEnd(); +} + +void KermitStart(int mode) +{ + WORD w; + + if (! ProtoStart()) + return; + + switch (mode) { + case IdKmtSend: + FileVar->OpId = OpKmtSend; + if (strlen(&(FileVar->FullName[FileVar->DirLen]))==0) + { + char FileDirExpanded[MAX_PATH]; + ExpandEnvironmentStrings(ts.FileDir, FileDirExpanded, sizeof(FileDirExpanded)); + if (!(*GetMultiFname)(FileVar, FileDirExpanded, GMF_KERMIT, &w) || + (FileVar->NumFname==0)) + { + ProtoEnd(); + return; + } + } + else + (*SetFileVar)(FileVar); + break; + case IdKmtReceive: + FileVar->OpId = OpKmtRcv; + break; + case IdKmtGet: + FileVar->OpId = OpKmtSend; + if (strlen(&(FileVar->FullName[FileVar->DirLen]))==0) + { + if (! (*GetGetFname)(FileVar->HMainWin,FileVar, &ts) || + (strlen(FileVar->FullName)==0)) + { + ProtoEnd(); + return; + } + } + else + (*SetFileVar)(FileVar); + break; + case IdKmtFinish: + FileVar->OpId = OpKmtFin; + break; + default: + ProtoEnd(); + return; + } + TalkStatus = IdTalkQuiet; + + /* disable transmit delay (serial port) */ + cv.DelayFlag = FALSE; + + if (! OpenProtoDlg(FileVar,PROTO_KMT,mode,0,0)) + ProtoEnd(); +} + +BOOL KermitStartSend(const char *filename) +{ + if (FileVar !=NULL) + return FALSE; + if (!NewFileVar_(&FileVar)) + return FALSE; + + FileVar->DirLen = 0; + strncpy_s(FileVar->FullName, sizeof(FileVar->FullName),filename, _TRUNCATE); + FileVar->NumFname = 1; + FileVar->NoMsg = TRUE; + KermitStart(IdKmtSend); + + return TRUE; +} + +BOOL KermitGet(const char *filename) +{ + if (FileVar !=NULL) + return FALSE; + if (!NewFileVar_(&FileVar)) + return FALSE; + + FileVar->DirLen = 0; + strncpy_s(FileVar->FullName, sizeof(FileVar->FullName),filename, _TRUNCATE); + FileVar->NumFname = 1; + FileVar->NoMsg = TRUE; + KermitStart(IdKmtGet); + + return TRUE; +} + +BOOL KermitStartRecive(void) +{ + if (FileVar !=NULL) + return FALSE; + if (!NewFileVar_(&FileVar)) + return FALSE; + + FileVar->NoMsg = TRUE; + KermitStart(IdKmtReceive); + + return TRUE; +} + +BOOL KermitFinish(void) +{ + if (FileVar !=NULL) + return FALSE; + if (!NewFileVar_(&FileVar)) + return FALSE; + + FileVar->NoMsg = TRUE; + KermitStart(IdKmtFinish); + + return TRUE; +} + +void XMODEMStart(int mode) +{ + LONG Option; + int tmp; + + if (! ProtoStart()) + return; + + if (mode==IdXReceive) + FileVar->OpId = OpXRcv; + else + FileVar->OpId = OpXSend; + + if (strlen(&(FileVar->FullName[FileVar->DirLen]))==0) + { + char FileDirExpanded[MAX_PATH]; + ExpandEnvironmentStrings(ts.FileDir, FileDirExpanded, sizeof(FileDirExpanded)); + Option = MAKELONG(ts.XmodemBin,ts.XmodemOpt); + if (! (*GetXFname)(FileVar->HMainWin, + mode==IdXReceive,&Option,FileVar,FileDirExpanded)) + { + ProtoEnd(); + return; + } + tmp = HIWORD(Option); + if (mode == IdXReceive) { + if (IsXoptCRC(tmp)) { + if (IsXopt1k(ts.XmodemOpt)) { + ts.XmodemOpt = Xopt1kCRC; + } + else { + ts.XmodemOpt = XoptCRC; + } + } + else { + if (IsXopt1k(ts.XmodemOpt)) { + ts.XmodemOpt = Xopt1kCksum; + } + else { + ts.XmodemOpt = XoptCheck; + } + } + ts.XmodemBin = LOWORD(Option); + } + else { + if (IsXopt1k(tmp)) { + if (IsXoptCRC(ts.XmodemOpt)) { + ts.XmodemOpt = Xopt1kCRC; + } + else { + ts.XmodemOpt = Xopt1kCksum; + } + } + else { + if (IsXoptCRC(ts.XmodemOpt)) { + ts.XmodemOpt = XoptCRC; + } + else { + ts.XmodemOpt = XoptCheck; + } + } + } + } + else + (*SetFileVar)(FileVar); + + if (mode==IdXReceive) + FileVar->FileHandle = _lcreat(FileVar->FullName,0); + else + FileVar->FileHandle = _lopen(FileVar->FullName,OF_READ); + + FileVar->FileOpen = FileVar->FileHandle != INVALID_HANDLE_VALUE; + if (! FileVar->FileOpen) + { + ProtoEnd(); + return; + } + TalkStatus = IdTalkQuiet; + + /* disable transmit delay (serial port) */ + cv.DelayFlag = FALSE; + + if (! OpenProtoDlg(FileVar,PROTO_XM,mode, + ts.XmodemOpt,ts.XmodemBin)) + ProtoEnd(); +} + +BOOL XMODEMStartReceive(const char *fiename, WORD ParamBinaryFlag, WORD ParamXmodemOpt) +{ + if (FileVar !=NULL) + return FALSE; + if (!NewFileVar_(&FileVar)) + return FALSE; + + FileVar->DirLen = 0; + strncpy_s(FileVar->FullName, sizeof(FileVar->FullName),fiename, _TRUNCATE); + if (IsXopt1k(ts.XmodemOpt)) { + if (IsXoptCRC(ParamXmodemOpt)) { + // CRC + ts.XmodemOpt = Xopt1kCRC; + } + else { // Checksum + ts.XmodemOpt = Xopt1kCksum; + } + } + else { + if (IsXoptCRC(ParamXmodemOpt)) { + ts.XmodemOpt = XoptCRC; + } + else { + ts.XmodemOpt = XoptCheck; + } + } + ts.XmodemBin = ParamBinaryFlag; + FileVar->NoMsg = TRUE; + XMODEMStart(IdXReceive); + + return TRUE; +} + +BOOL XMODEMStartSend(const char *fiename, WORD ParamXmodemOpt) +{ + if (FileVar !=NULL) + return FALSE; + if (!NewFileVar_(&FileVar)) + return FALSE; + + FileVar->DirLen = 0; + strncpy_s(FileVar->FullName, sizeof(FileVar->FullName), fiename, _TRUNCATE); + if (IsXoptCRC(ts.XmodemOpt)) { + if (IsXopt1k(ParamXmodemOpt)) { + ts.XmodemOpt = Xopt1kCRC; + } + else { + ts.XmodemOpt = XoptCRC; + } + } + else { + if (IsXopt1k(ParamXmodemOpt)) { + ts.XmodemOpt = Xopt1kCksum; + } + else { + ts.XmodemOpt = XoptCheck; + } + } + FileVar->NoMsg = TRUE; + XMODEMStart(IdXSend); + + return TRUE; +} + +void YMODEMStart(int mode) +{ + WORD Opt; + + if (! ProtoStart()) + return; + + if (mode==IdYSend) + { + char FileDirExpanded[MAX_PATH]; + ExpandEnvironmentStrings(ts.FileDir, FileDirExpanded, sizeof(FileDirExpanded)); + + // \x83t\x83@\x83C\x83\x8B\x93]\x91\x97\x8E\x9E\x82̃I\x83v\x83V\x83\x87\x83\x93\x82\xCD"Yopt1K"\x82Ɍ\x88\x82ߑł\xBF\x81B + // TODO: "Yopt1K", "YoptG", "YoptSingle"\x82\xF0\x8B\xE6\x95ʂ\xB5\x82\xBD\x82\xA2\x82Ȃ\xE7\x82AIDD_FOPT\x82\xF0\x8Ag\x92\xA3\x82\xB7\x82\xE9\x95K\x97v\x82\xA0\x82\xE8\x81B + Opt = Yopt1K; + FileVar->OpId = OpYSend; + if (strlen(&(FileVar->FullName[FileVar->DirLen]))==0) + { + if (! (*GetMultiFname)(FileVar,FileDirExpanded,GMF_Y,&Opt) || + (FileVar->NumFname==0)) + { + ProtoEnd(); + return; + } + //ts.XmodemBin = Opt; + } + else + (*SetFileVar)(FileVar); + } + else { + FileVar->OpId = OpYRcv; + // \x83t\x83@\x83C\x83\x8B\x93]\x91\x97\x8E\x9E\x82̃I\x83v\x83V\x83\x87\x83\x93\x82\xCD"Yopt1K"\x82Ɍ\x88\x82ߑł\xBF\x81B + Opt = Yopt1K; + (*SetFileVar)(FileVar); + } + + TalkStatus = IdTalkQuiet; + + /* disable transmit delay (serial port) */ + cv.DelayFlag = FALSE; + + if (! OpenProtoDlg(FileVar,PROTO_YM,mode,Opt,0)) + ProtoEnd(); +} + +BOOL YMODEMStartReceive() +{ + if (FileVar != NULL) { + return FALSE; + } + if (!NewFileVar_(&FileVar)) { + return FALSE; + } + FileVar->NoMsg = TRUE; + YMODEMStart(IdYReceive); + return TRUE; +} + +BOOL YMODEMStartSend(const char *fiename) +{ + if (FileVar != NULL) { + return FALSE; + } + if (!NewFileVar_(&FileVar)) { + return FALSE; + } + + FileVar->DirLen = 0; + strncpy_s(FileVar->FullName, sizeof(FileVar->FullName),fiename, _TRUNCATE); + FileVar->NumFname = 1; + FileVar->NoMsg = TRUE; + YMODEMStart(IdYSend); + return TRUE; +} + +void ZMODEMStart(int mode) +{ + WORD Opt; + + if (! ProtoStart()) + return; + + if (mode == IdZSend || mode == IdZAutoS) + { + Opt = ts.XmodemBin; + FileVar->OpId = OpZSend; + if (strlen(&(FileVar->FullName[FileVar->DirLen]))==0) + { + char FileDirExpanded[MAX_PATH]; + ExpandEnvironmentStrings(ts.FileDir, FileDirExpanded, sizeof(FileDirExpanded)); + if (! (*GetMultiFname)(FileVar,FileDirExpanded,GMF_Z,&Opt) || + (FileVar->NumFname==0)) + { + if (mode == IdZAutoS) { + CommRawOut(&cv, "\030\030\030\030\030\030\030\030\b\b\b\b\b\b\b\b\b\b", 18); + } + ProtoEnd(); + return; + } + ts.XmodemBin = Opt; + } + else + (*SetFileVar)(FileVar); + } + else /* IdZReceive or IdZAutoR */ + FileVar->OpId = OpZRcv; + + TalkStatus = IdTalkQuiet; + + /* disable transmit delay (serial port) */ + cv.DelayFlag = FALSE; + + if (! OpenProtoDlg(FileVar,PROTO_ZM,mode,Opt,0)) + ProtoEnd(); +} + +BOOL ZMODEMStartReceive(void) +{ + if (FileVar != NULL) { + return FALSE; + } + if (!NewFileVar_(&FileVar)) { + return FALSE; + } + + FileVar->NoMsg = TRUE; + ZMODEMStart(IdZReceive); + + return TRUE; +} + +BOOL ZMODEMStartSend(const char *fiename, WORD ParamBinaryFlag) +{ + if (FileVar != NULL) { + return FALSE; + } + if (!NewFileVar_(&FileVar)) { + return FALSE; + } + + FileVar->DirLen = 0; + strncpy_s(FileVar->FullName, sizeof(FileVar->FullName),fiename, _TRUNCATE); + FileVar->NumFname = 1; + ts.XmodemBin = ParamBinaryFlag; + FileVar->NoMsg = TRUE; + + ZMODEMStart(IdZSend); + + return TRUE; +} + +void BPStart(int mode) +{ + LONG Option = 0; + + if (! ProtoStart()) + return; + if (mode==IdBPSend) + { + FileVar->OpId = OpBPSend; + if (strlen(&(FileVar->FullName[FileVar->DirLen]))==0) + { + char FileDirExpanded[MAX_PATH]; + ExpandEnvironmentStrings(ts.FileDir, FileDirExpanded, sizeof(FileDirExpanded)); + FileVar->FullName[0] = 0; + if (! (*GetTransFname)(FileVar, FileDirExpanded, GTF_BP, &Option)) + { + ProtoEnd(); + return; + } + } + else + (*SetFileVar)(FileVar); + } + else /* IdBPReceive or IdBPAuto */ + FileVar->OpId = OpBPRcv; + + TalkStatus = IdTalkQuiet; + + /* disable transmit delay (serial port) */ + cv.DelayFlag = FALSE; + + if (! OpenProtoDlg(FileVar,PROTO_BP,mode,0,0)) + ProtoEnd(); +} + +BOOL BPSendStart(const char *filename) +{ + if (FileVar != NULL) { + return FALSE; + } + if (!NewFileVar_(&FileVar)) { + return FALSE; + } + + FileVar->DirLen = 0; + strncpy_s(FileVar->FullName, sizeof(FileVar->FullName), filename, _TRUNCATE); + FileVar->NumFname = 1; + FileVar->NoMsg = TRUE; + BPStart(IdBPSend); + + return TRUE; +} + +BOOL BPStartReceive(void) +{ + if (FileVar != NULL) + return FALSE; + if (!NewFileVar_(&FileVar)) + return FALSE; + + FileVar->NoMsg = TRUE; + BPStart(IdBPReceive); + + return TRUE; +} + +void QVStart(int mode) +{ + WORD W; + + if (! ProtoStart()) + return; + + if (mode==IdQVSend) + { + FileVar->OpId = OpQVSend; + if (strlen(&(FileVar->FullName[FileVar->DirLen]))==0) + { + char FileDirExpanded[MAX_PATH]; + ExpandEnvironmentStrings(ts.FileDir, FileDirExpanded, sizeof(FileDirExpanded)); + if (! (*GetMultiFname)(FileVar,FileDirExpanded,GMF_QV, &W) || + (FileVar->NumFname==0)) + { + ProtoEnd(); + return; + } + } + else + (*SetFileVar)(FileVar); + } + else + FileVar->OpId = OpQVRcv; + + TalkStatus = IdTalkQuiet; + + /* disable transmit delay (serial port) */ + cv.DelayFlag = FALSE; + + if (! OpenProtoDlg(FileVar,PROTO_QV,mode,0,0)) + ProtoEnd(); +} + +BOOL QVStartReceive(void) +{ + if (FileVar != NULL) { + return FALSE; + } + if (!NewFileVar_(&FileVar)) { + return FALSE; + } + + FileVar->NoMsg = TRUE; + QVStart(IdQVReceive); + + return TRUE; +} + +BOOL QVStartSend(const char *filename) +{ + if (FileVar != NULL) { + return FALSE; + } + if (!NewFileVar_(&FileVar)) { + return FALSE; + } + + FileVar->DirLen = 0; + strncpy_s(FileVar->FullName, sizeof(FileVar->FullName),filename, _TRUNCATE); + FileVar->NumFname = 1; + FileVar->NoMsg = TRUE; + QVStart(IdQVSend); + + return TRUE; +} + +#if 0 +BOOL IsSendVarNULL() +{ + return SendVar == NULL; +} +#endif + +BOOL IsFileVarNULL() +{ + return FileVar == NULL; +} Modified: trunk/teraterm/teraterm/ttermpro.v16.vcxproj =================================================================== --- trunk/teraterm/teraterm/ttermpro.v16.vcxproj 2020-12-20 12:05:50 UTC (rev 9051) +++ trunk/teraterm/teraterm/ttermpro.v16.vcxproj 2020-12-20 12:06:06 UTC (rev 9052) @@ -147,6 +147,7 @@ <ClCompile Include="dnddlg.cpp" /> <ClCompile Include="filesys.cpp" /> <ClCompile Include="filesys_log.cpp" /> + <ClCompile Include="filesys_proto.cpp" /> <ClCompile Include="font_pp.cpp" /> <ClCompile Include="ftdlg.cpp" /> <ClCompile Include="keyboard.c" /> Modified: trunk/teraterm/teraterm/ttermpro.v8.vcproj =================================================================== --- trunk/teraterm/teraterm/ttermpro.v8.vcproj 2020-12-20 12:05:50 UTC (rev 9051) +++ trunk/teraterm/teraterm/ttermpro.v8.vcproj 2020-12-20 12:06:06 UTC (rev 9052) @@ -225,6 +225,10 @@ > </File> <File + RelativePath=".\filesys_proto.cpp" + > + </File> + <File RelativePath="..\susie_plugin\libsusieplugin.cpp" > </File>