Revision: 9059 https://osdn.net/projects/ttssh2/scm/svn/commits/9059 Author: zmatsuo Date: 2020-12-20 21:07:51 +0900 (Sun, 20 Dec 2020) Log Message: ----------- xmodem.c のみで使用する構造体を移動 - TXVar 構造体を ttftypes.h から xmodem.c 内に移動 - xmodem.c 内の UI, File I/O の操作を filesys_proto.cpp へ移動 - 仮実装、後に再度見直す Modified Paths: -------------- trunk/teraterm/common/ttftypes.h trunk/teraterm/teraterm/filesys_proto.cpp trunk/teraterm/teraterm/filesys_proto.h trunk/teraterm/ttpfile/ttfile_proto.cpp trunk/teraterm/ttpfile/ttfile_proto.h trunk/teraterm/ttpfile/xmodem.c trunk/teraterm/ttpfile/xmodem.h trunk/teraterm/ttpfile/ymodem.c trunk/teraterm/ttpfile/zmodem.c -------------- next part -------------- Modified: trunk/teraterm/common/ttftypes.h =================================================================== --- trunk/teraterm/common/ttftypes.h 2020-12-20 12:07:33 UTC (rev 9058) +++ trunk/teraterm/common/ttftypes.h 2020-12-20 12:07:51 UTC (rev 9059) @@ -89,58 +89,7 @@ #define TitQVRcv "Quick-VAN Receive" #define TitQVSend "Quick-VAN Send" -#if 0 typedef struct { - HWND HMainWin; - HWND HWin; - WORD OpId; - char DlgCaption[40]; - - char FullName[MAX_PATH]; - int DirLen; - - int NumFname, FNCount; - HANDLE FnStrMemHandle; - PCHAR FnStrMem; - int FnPtr; - - BOOL FileOpen; - HANDLE FileHandle; - LONG FileSize, ByteCount; - BOOL OverWrite; - - BOOL LogFlag; - HANDLE LogFile; - WORD LogState; - WORD LogCount; - - BOOL Success; - BOOL NoMsg; - - char LogDefaultPath[MAX_PATH]; - BOOL HideDialog; - - BYTE LogLineBuf[16]; - int FlushLogLineBuf; - - int ProgStat; - - DWORD StartTime; - - int reserve_1; - LONG reserve_2; - int reserve_3; - - HANDLE reserve_4; - DWORD reserve_5; - - DWORD FileMtime; - HANDLE reserve_6; -} TFileVar; -typedef TFileVar far *PFileVar; -#endif - -typedef struct { int MAXL; BYTE TIME,NPAD,PADC,EOL,QCTL,QBIN,CHKT,REPT,CAPAS,WINDO,MAXLX1,MAXLX2; } KermitParam; @@ -193,6 +142,7 @@ #define GetInit 10 #define Finish 11 +#if 0 /* XMODEM */ typedef struct { BYTE PktIn[1030], PktOut[1030]; @@ -222,8 +172,8 @@ #define XnakNAK 1 #define XnakC 2 +#endif - /* YMODEM */ typedef struct { BYTE PktIn[1030], PktOut[1030]; Modified: trunk/teraterm/teraterm/filesys_proto.cpp =================================================================== --- trunk/teraterm/teraterm/filesys_proto.cpp 2020-12-20 12:07:33 UTC (rev 9058) +++ trunk/teraterm/teraterm/filesys_proto.cpp 2020-12-20 12:07:51 UTC (rev 9059) @@ -62,6 +62,8 @@ #include "ttfile_proto.h" #define PFileVar PFileVarProto #endif +#include "tt_res.h" +#include "xmodem.h" #if 0 #define FS_BRACKET_NONE 0 @@ -279,31 +281,134 @@ } #endif -static BOOL NewFileVar_(PFileVar *fv) +static size_t _ReadFile(TFileVarProto *fv, void *buf, size_t bytes) { - if ((*fv)==NULL) - { - *fv = (PFileVar)malloc(sizeof(TFileVarProto)); - if ((*fv)!=NULL) - { - char FileDirExpanded[MAX_PATH]; - ExpandEnvironmentStrings(ts.FileDir, FileDirExpanded, sizeof(FileDirExpanded)); - memset(*fv, 0, sizeof(*fv)); - 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; - } + HANDLE hFile = fv->FileHandle; + DWORD NumberOfBytesRead; + BOOL Result = ReadFile(hFile, buf, (UINT)bytes, &NumberOfBytesRead, NULL); + if (Result == FALSE) { + return 0; } + return NumberOfBytesRead; +} - return ((*fv)!=NULL); +static size_t _WriteFile(TFileVarProto *fv, const void *buf, size_t bytes) +{ + HANDLE hFile = fv->FileHandle; + DWORD NumberOfBytesWritten; + UINT length = (UINT)bytes; + BOOL result = WriteFile(hFile, buf, length, &NumberOfBytesWritten, NULL); + if (result == FALSE) { + return 0; + } + return NumberOfBytesWritten; } +static void _Close(TFileVarProto *fv) +{ + HANDLE hFile = fv->FileHandle; + CloseHandle(hFile); + fv->FileHandle = 0; +} + +/** + * \x83t\x83@\x83C\x83\x8B\x82̃t\x83@\x83C\x83\x8B\x83T\x83C\x83Y\x82\xF0\x8E擾 + * @param[in] filenameU8 \x83t\x83@\x83C\x83\x8B\x96\xBC(UTF-8) + * @retval \x83t\x83@\x83C\x83\x8B\x83T\x83C\x83Y + */ +static size_t _GetFSize(struct FileVarProto *fv, const char *filenameU8) +{ + HANDLE h = _CreateFileW(wc::fromUtf8(filenameU8), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL, NULL); + if (h == INVALID_HANDLE_VALUE) { + return 0; + } + + DWORD file_size_hi; + DWORD file_size_low; + file_size_low = GetFileSize(h, &file_size_hi); + if (file_size_low == INVALID_FILE_SIZE && GetLastError() != NO_ERROR) { + CloseHandle(h); + return 0; + } + CloseHandle(h); + + unsigned long long file_size = ((unsigned long long)file_size_hi << 32) + file_size_low; + return file_size; +} + +static void _SetDlgTime(TFileVarProto *fv, DWORD elapsed, int bytes) +{ + SetDlgTime(fv->HWin, IDC_PROTOELAPSEDTIME, fv->StartTime, fv->ByteCount); +} + +static void _SetDlgPaketNum(struct FileVarProto *fv, LONG Num) +{ + SetDlgNum(fv->HWin, IDC_PROTOPKTNUM, Num); +} + +static void _SetDlgByteCount(struct FileVarProto *fv, LONG Num) +{ + SetDlgNum(fv->HWin, IDC_PROTOBYTECOUNT, Num); +} + +static void _SetDlgPercent(struct FileVarProto *fv, LONG a, LONG b, int *p) +{ + SetDlgPercent(fv->HWin, IDC_PROTOPERCENT, IDC_PROTOPROGRESS, a, b, p); +} + +static void _SetDlgProtoText(struct FileVarProto *fv, const char *text) +{ + SetDlgItemText(fv->HWin, IDC_PROTOPROT, text); +} + +static void _SetDlgProtoFileName(struct FileVarProto *fv, const char *text) +{ + SetDlgItemText(fv->HWin, IDC_PROTOFNAME, text); +} + +static void _InitDlgProgress(struct FileVarProto *fv, int *CurProgStat) +{ + InitDlgProgress(fv->HWin, IDC_PROTOPROGRESS, CurProgStat); +} + +static BOOL NewFileVar_(PFileVar *pfv) +{ + TFileVarProto *fv = (TFileVarProto *)malloc(sizeof(TFileVarProto)); + if (fv == NULL) + return FALSE; + memset(fv, 0, sizeof(*fv)); + + char FileDirExpanded[MAX_PATH]; + ExpandEnvironmentStrings(ts.FileDir, FileDirExpanded, sizeof(FileDirExpanded)); + 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; + + fv->ReadFile = _ReadFile; + fv->WriteFile = _WriteFile; + fv->Close = _Close; + fv->GetFSize = _GetFSize; + + fv->InitDlgProgress = _InitDlgProgress; + fv->SetDlgTime = _SetDlgTime; + fv->SetDlgPaketNum = _SetDlgPaketNum; + fv->SetDlgByteCount = _SetDlgByteCount; + fv->SetDlgPercent = _SetDlgPercent; + fv->SetDlgProtoText = _SetDlgProtoText; + fv->SetDlgProtoFileName = _SetDlgProtoFileName; + + *pfv = fv; + return TRUE; +} + static void FreeFileVar_(PFileVar *fv) { if ((*fv)!=NULL) @@ -643,7 +748,9 @@ vsize = sizeof(TKmtVar); break; case PROTO_XM: - vsize = sizeof(TXVar); +// vsize = sizeof(TXVar); + XCreate(fv); + vsize = 0; break; case PROTO_YM: vsize = sizeof(TYVar); @@ -662,9 +769,14 @@ assert(FALSE); break; } - ProtoVar = (PCHAR)malloc(vsize); - if (ProtoVar==NULL) - return FALSE; + if (vsize == 0) { + ProtoVar = NULL; + } + else { + ProtoVar = (PCHAR)malloc(vsize); + if (ProtoVar==NULL) + return FALSE; + } switch (ProtoId) { case PROTO_KMT: @@ -671,9 +783,14 @@ ((PKmtVar)ProtoVar)->KmtMode = Mode; break; case PROTO_XM: +#if 0 ((PXVar)ProtoVar)->XMode = Mode; ((PXVar)ProtoVar)->XOpt = Opt1; ((PXVar)ProtoVar)->TextFlag = 1 - (Opt2 & 1); +#endif + _ProtoSetOpt(fv, XMODEM_MODE, Mode); + _ProtoSetOpt(fv, XMODEM_OPT, Opt1); + _ProtoSetOpt(fv, XMODEM_TEXT_FLAG, 1 - (Opt2 & 1)); break; case PROTO_YM: ((PYVar)ProtoVar)->YMode = Mode; Modified: trunk/teraterm/teraterm/filesys_proto.h =================================================================== --- trunk/teraterm/teraterm/filesys_proto.h 2020-12-20 12:07:33 UTC (rev 9058) +++ trunk/teraterm/teraterm/filesys_proto.h 2020-12-20 12:07:51 UTC (rev 9059) @@ -29,51 +29,65 @@ #pragma once typedef struct FileVarProto { - HWND HMainWin; - HWND HWin; - WORD OpId; - char DlgCaption[40]; + HWND HMainWin; + HWND HWin; + WORD OpId; + char DlgCaption[40]; - char FullName[MAX_PATH]; - int DirLen; + char FullName[MAX_PATH]; + int DirLen; - int NumFname, FNCount; - HANDLE FnStrMemHandle; - PCHAR FnStrMem; - int FnPtr; + int NumFname, FNCount; + HANDLE FnStrMemHandle; + PCHAR FnStrMem; + int FnPtr; - BOOL FileOpen; - HANDLE FileHandle; - LONG FileSize, ByteCount; - BOOL OverWrite; + BOOL FileOpen; + HANDLE FileHandle; + LONG FileSize, ByteCount; + BOOL OverWrite; - BOOL LogFlag; - HANDLE LogFile; - WORD LogState; - WORD LogCount; + BOOL LogFlag; + HANDLE LogFile; + WORD LogState; + WORD LogCount; - BOOL Success; - BOOL NoMsg; + BOOL Success; + BOOL NoMsg; - char LogDefaultPath[MAX_PATH]; - BOOL HideDialog; + char LogDefaultPath[MAX_PATH]; + BOOL HideDialog; - BYTE LogLineBuf[16]; - int FlushLogLineBuf; + BYTE LogLineBuf[16]; + int FlushLogLineBuf; - int ProgStat; + int ProgStat; - DWORD StartTime; + DWORD StartTime; - int reserve_1; - LONG reserve_2; - int reserve_3; + DWORD FileMtime; - HANDLE reserve_4; - DWORD reserve_5; + // protocol entrys, data + void (*Init)(struct FileVarProto *fv, PComVar cv, PTTSet ts); + BOOL (*Parse)(struct FileVarProto *fv, PComVar cv); + void (*TimeOutProc)(struct FileVarProto *fv, PComVar cv); + void (*Cancel)(struct FileVarProto *fv, PComVar cv); + int (*SetOptV)(struct FileVarProto *fv, int request, va_list ap); + void *data; - DWORD FileMtime; - HANDLE reserve_6; + // file I/O + size_t (*ReadFile)(struct FileVarProto *fv, void *buf, size_t bytes); + size_t (*WriteFile)(struct FileVarProto *fv, const void *buf, size_t bytes); + void (*Close)(struct FileVarProto *fv); + size_t (*GetFSize)(struct FileVarProto *fv, const char *filenameU8); + // UI + void (*InitDlgProgress)(struct FileVarProto *fv, int *CurProgStat); + void (*SetDlgTime)(struct FileVarProto *fv, DWORD elapsed, int bytes); + void (*SetDlgPaketNum)(struct FileVarProto *fv, LONG Num); + void (*SetDlgByteCount)(struct FileVarProto *fv, LONG Num); + void (*SetDlgPercent)(struct FileVarProto *fv, LONG a, LONG b, int *p); + void (*SetDlgProtoText)(struct FileVarProto *fv, const char *text); + void (*SetDlgProtoFileName)(struct FileVarProto *fv, const char *text); } TFileVarProto; typedef TFileVarProto *PFileVarProto; Modified: trunk/teraterm/ttpfile/ttfile_proto.cpp =================================================================== --- trunk/teraterm/ttpfile/ttfile_proto.cpp 2020-12-20 12:07:33 UTC (rev 9058) +++ trunk/teraterm/ttpfile/ttfile_proto.cpp 2020-12-20 12:07:51 UTC (rev 9059) @@ -1,5 +1,6 @@ /* - * (C) 2020 TeraTerm Project + * Copyright (C) 1994-1998 T. Teranishi + * (C) 2005-2019 TeraTerm Project * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -59,7 +60,7 @@ KmtInit(fv,(PKmtVar)pv,cv,ts); break; case PROTO_XM: - XInit(fv,(PXVar)pv,cv,ts); + fv->Init(fv,cv,ts); break; case PROTO_YM: YInit(fv,(PYVar)pv,cv,ts); @@ -86,7 +87,7 @@ Ok = KmtReadPacket(fv,(PKmtVar)pv,cv); break; case PROTO_XM: - Ok = XParse(fv, (PXVar)pv, cv); + Ok = fv->Parse(fv, cv); break; case PROTO_YM: switch (((PYVar)pv)->YMode) { @@ -125,7 +126,7 @@ KmtTimeOutProc(fv,(PKmtVar)pv,cv); break; case PROTO_XM: - XTimeOutProc(fv,(PXVar)pv,cv); + fv->TimeOutProc(fv,cv); break; case PROTO_YM: YTimeOutProc(fv,(PYVar)pv,cv); @@ -149,7 +150,7 @@ KmtCancel(fv,(PKmtVar)pv,cv); break; case PROTO_XM: - XCancel(fv,(PXVar)pv,cv); + fv->Cancel(fv,cv); break; case PROTO_YM: YCancel(fv, (PYVar)pv,cv); @@ -156,7 +157,7 @@ break; case PROTO_ZM: ZCancel((PZVar)pv); - break; + break; case PROTO_BP: if (((PBPVar)pv)->BPState != BP_Failure) { BPCancel((PBPVar)pv); @@ -169,3 +170,12 @@ } return TRUE; } + +int _ProtoSetOpt(PFileVarProto fv, int request, ...) +{ + va_list ap; + va_start(ap, request); + int r = fv->SetOptV(fv, request, ap); + va_end(ap); + return r; +} Modified: trunk/teraterm/ttpfile/ttfile_proto.h =================================================================== --- trunk/teraterm/ttpfile/ttfile_proto.h 2020-12-20 12:07:33 UTC (rev 9058) +++ trunk/teraterm/ttpfile/ttfile_proto.h 2020-12-20 12:07:51 UTC (rev 9059) @@ -36,6 +36,7 @@ BOOL _ProtoParse(int Proto, PFileVarProto fv, PCHAR pv, PComVar cv); void _ProtoTimeOutProc(int Proto, PFileVarProto fv, PCHAR pv, PComVar cv); BOOL _ProtoCancel(int Proto, PFileVarProto fv, PCHAR pv, PComVar cv); +int _ProtoSetOpt(PFileVarProto fv, int request, ...); #ifdef __cplusplus } Modified: trunk/teraterm/ttpfile/xmodem.c =================================================================== --- trunk/teraterm/ttpfile/xmodem.c 2020-12-20 12:07:33 UTC (rev 9058) +++ trunk/teraterm/ttpfile/xmodem.c 2020-12-20 12:07:51 UTC (rev 9059) @@ -30,19 +30,53 @@ /* TTFILE.DLL, XMODEM protocol */ #include "teraterm.h" #include "tttypes.h" -#include "ttftypes.h" #include <stdio.h> -#include "tt_res.h" #include "ttcommon.h" #include "ttlib.h" #include "ftlib.h" -#include "dlglib.h" #include "win16api.h" #include "xmodem.h" -int XRead1Byte(PFileVarProto fv, PXVar xv, PComVar cv, LPBYTE b) +/* XMODEM */ +typedef struct { + BYTE PktIn[1030], PktOut[1030]; + int PktBufCount, PktBufPtr; + BYTE PktNum, PktNumSent; + int PktNumOffset; + int PktReadMode; + WORD XMode, XOpt, TextFlag; + WORD NAKMode; + int NAKCount; + WORD DataLen, CheckLen; + BOOL CRRecv; + int TOutShort; + int TOutLong; + int TOutInit; + int TOutInitCRC; + int TOutVLong; + int CANCount; +} TXVar; +typedef TXVar far *PXVar; + +/* prototypes */ + +/* XMODEM states */ +#define XpktSOH 1 +#define XpktBLK 2 +#define XpktBLK2 3 +#define XpktDATA 4 + +#define XnakNAK 1 +#define XnakC 2 + +BOOL XParse(PFileVarProto fv, PComVar cv); +void XTimeOutProc(PFileVarProto fv, PComVar cv); +void XCancel(PFileVarProto fv, PComVar cv); +static int SetOptV(PFileVarProto fv, int request, va_list ap); + +static int XRead1Byte(PFileVarProto fv, PXVar xv, PComVar cv, LPBYTE b) { if (CommRead1Byte(cv, b) == 0) return 0; @@ -63,7 +97,7 @@ return 1; } -int XWrite(PFileVarProto fv, PXVar xv, PComVar cv, PCHAR B, int C) +static int XWrite(PFileVarProto fv, PXVar xv, PComVar cv, PCHAR B, int C) { int i, j; @@ -85,7 +119,7 @@ return i; } -void XSetOpt(PFileVarProto fv, PXVar xv, WORD Opt) +static void XSetOpt(PFileVarProto fv, PXVar xv, WORD Opt) { char Tmp[21]; @@ -114,10 +148,10 @@ xv->CheckLen = 1; break; } - SetDlgItemText(fv->HWin, IDC_PROTOPROT, Tmp); + fv->SetDlgProtoText(fv, Tmp); } -void XSendNAK(PFileVarProto fv, PXVar xv, PComVar cv) +static void XSendNAK(PFileVarProto fv, PXVar xv, PComVar cv) { BYTE b; int t; @@ -133,7 +167,7 @@ xv->NAKMode = XnakNAK; xv->NAKCount = 9; } else { - XCancel(fv, xv, cv); + XCancel(fv, cv); return; } } @@ -153,7 +187,7 @@ FTSetTimeOut(fv, t); } -WORD XCalcCheck(PXVar xv, PCHAR PktBuf) +static WORD XCalcCheck(PXVar xv, PCHAR PktBuf) { int i; WORD Check; @@ -172,7 +206,7 @@ } } -BOOL XCheckPacket(PXVar xv) +static BOOL XCheckPacket(PXVar xv) { WORD Check; @@ -184,8 +218,9 @@ (LOBYTE(Check) == xv->PktIn[xv->DataLen + 4])); } -void XInit(PFileVarProto fv, PXVar xv, PComVar cv, PTTSet ts) +void XInit(PFileVarProto fv, PComVar cv, PTTSet ts) { + PXVar xv = fv->data; fv->LogFlag = ((ts->LogFlag & LOG_X) != 0); if (fv->LogFlag) fv->LogFile = _lcreat("XMODEM.LOG", 0); @@ -194,8 +229,8 @@ fv->FileSize = 0; if ((xv->XMode == IdXSend) && fv->FileOpen) { - fv->FileSize = GetFSize(fv->FullName); - InitDlgProgress(fv->HWin, IDC_PROTOPROGRESS, &fv->ProgStat); + fv->FileSize = fv->GetFSize(fv, fv->FullName); + fv->InitDlgProgress(fv, &fv->ProgStat); } else { fv->ProgStat = -1; } @@ -202,7 +237,7 @@ fv->StartTime = GetTickCount(); SetWindowText(fv->HWin, fv->DlgCaption); - SetDlgItemText(fv->HWin, IDC_PROTOFNAME, &(fv->FullName[fv->DirLen])); + fv->SetDlgProtoFileName(fv, &(fv->FullName[fv->DirLen])); xv->PktNumOffset = 0; xv->PktNum = 0; @@ -256,8 +291,9 @@ } } -void XCancel(PFileVarProto fv, PXVar xv, PComVar cv) +void XCancel(PFileVarProto fv, PComVar cv) { + PXVar xv = fv->data; // five cancels & five backspaces per spec BYTE cancel[] = { CAN, CAN, CAN, CAN, CAN, BS, BS, BS, BS, BS }; @@ -265,8 +301,9 @@ xv->XMode = 0; // quit } -void XTimeOutProc(PFileVarProto fv, PXVar xv, PComVar cv) +void XTimeOutProc(PFileVarProto fv, PComVar cv) { + PXVar xv = fv->data; switch (xv->XMode) { case IdXSend: xv->XMode = 0; // quit @@ -277,8 +314,9 @@ } } -BOOL XReadPacket(PFileVarProto fv, PXVar xv, PComVar cv) +static BOOL XReadPacket(PFileVarProto fv, PComVar cv) { + PXVar xv = fv->data; BYTE b, d; int i, c; BOOL GetPkt = FALSE; @@ -379,7 +417,7 @@ d = xv->PktIn[1] - xv->PktNum; if (d > 1) { - XCancel(fv, xv, cv); + XCancel(fv, cv); return FALSE; } @@ -404,19 +442,19 @@ for (i = 0; i <= c - 1; i++) { b = xv->PktIn[3 + i]; if ((b == LF) && (!xv->CRRecv)) - _lwrite(fv->FileHandle, "\015", 1); + fv->WriteFile(fv, "\015", 1); if (xv->CRRecv && (b != LF)) - _lwrite(fv->FileHandle, "\012", 1); + fv->WriteFile(fv, "\012", 1); xv->CRRecv = b == CR; - _lwrite(fv->FileHandle, &b, 1); + fv->WriteFile(fv, &b, 1); } else - _lwrite(fv->FileHandle, &(xv->PktIn[3]), c); + fv->WriteFile(fv, &(xv->PktIn[3]), c); fv->ByteCount = fv->ByteCount + c; - SetDlgNum(fv->HWin, IDC_PROTOPKTNUM, xv->PktNumOffset + xv->PktNum); - SetDlgNum(fv->HWin, IDC_PROTOBYTECOUNT, fv->ByteCount); - SetDlgTime(fv->HWin, IDC_PROTOELAPSEDTIME, fv->StartTime, fv->ByteCount); + fv->SetDlgPaketNum(fv, xv->PktNumOffset + xv->PktNum); + fv->SetDlgByteCount(fv, fv->ByteCount); + fv->SetDlgTime(fv, fv->StartTime, fv->ByteCount); FTSetTimeOut(fv, xv->TOutLong); @@ -423,8 +461,9 @@ return TRUE; } -BOOL XSendPacket(PFileVarProto fv, PXVar xv, PComVar cv) +static BOOL XSendPacket(PFileVarProto fv, PComVar cv) { + PXVar xv = fv->data; BYTE b; int i; BOOL SendFlag; @@ -501,7 +540,7 @@ i = 1; while ((i <= xv->DataLen) && fv->FileOpen && - (_lread(fv->FileHandle, &b, 1) == 1)) { + (fv->ReadFile(fv, &b, 1) == 1)) { xv->PktOut[2 + i] = b; i++; fv->ByteCount++; @@ -523,7 +562,7 @@ xv->PktBufCount = 3 + xv->DataLen + xv->CheckLen; } else { /* send EOT */ if (fv->FileOpen) { - _lclose(fv->FileHandle); + fv->Close(fv); fv->FileHandle = 0; fv->FileOpen = FALSE; } @@ -556,28 +595,70 @@ if (xv->PktBufCount == 0) { if (xv->PktNumSent == 0) { - SetDlgNum(fv->HWin, IDC_PROTOPKTNUM, xv->PktNumOffset + 256); + fv->SetDlgPaketNum(fv, xv->PktNumOffset + 256); } else { - SetDlgNum(fv->HWin, IDC_PROTOPKTNUM, xv->PktNumOffset + xv->PktNumSent); + fv->SetDlgPaketNum(fv, xv->PktNumOffset + xv->PktNumSent); } - SetDlgNum(fv->HWin, IDC_PROTOBYTECOUNT, fv->ByteCount); - SetDlgPercent(fv->HWin, IDC_PROTOPERCENT, IDC_PROTOPROGRESS, - fv->ByteCount, fv->FileSize, &fv->ProgStat); - SetDlgTime(fv->HWin, IDC_PROTOELAPSEDTIME, fv->StartTime, fv->ByteCount); + fv->SetDlgByteCount(fv, fv->ByteCount); + fv->SetDlgPercent(fv, fv->ByteCount, fv->FileSize, &fv->ProgStat); + fv->SetDlgTime(fv, fv->StartTime, fv->ByteCount); } return TRUE; } -BOOL XParse(PFileVarProto fv, PXVar xv, PComVar cv) +BOOL XParse(PFileVarProto fv, PComVar cv) { + PXVar xv = fv->data; switch (xv->XMode) { case IdXReceive: - return XReadPacket(fv, xv, cv); + return XReadPacket(fv,cv); case IdXSend: - return XSendPacket(fv, xv, cv); + return XSendPacket(fv,cv); default: return FALSE; } } + +static int SetOptV(PFileVarProto fv, int request, va_list ap) +{ + PXVar xv = fv->data; + switch(request) { + case XMODEM_MODE: { + int Mode = va_arg(ap, int); + xv->XMode = Mode; + return 0; + } + case XMODEM_OPT: { + WORD Opt1 = va_arg(ap, WORD); + xv->XOpt = Opt1; + return 0; + } + case XMODEM_TEXT_FLAG: { + WORD Opt2 = va_arg(ap, WORD); + xv->TextFlag = 1 - (Opt2 & 1); + return 0; + } + } + return -1; +} + +BOOL XCreate(PFileVarProto fv) +{ + PXVar xv; + xv = malloc(sizeof(TXVar)); + if (xv == NULL) { + return FALSE; + } + memset(xv, 0, sizeof(*xv)); + fv->data = xv; + + fv->Init = XInit; + fv->Parse = XParse; + fv->TimeOutProc = XTimeOutProc; + fv->Cancel = XCancel; + fv->SetOptV = SetOptV; + + return TRUE; +} Modified: trunk/teraterm/ttpfile/xmodem.h =================================================================== --- trunk/teraterm/ttpfile/xmodem.h 2020-12-20 12:07:33 UTC (rev 9058) +++ trunk/teraterm/ttpfile/xmodem.h 2020-12-20 12:07:51 UTC (rev 9059) @@ -35,12 +35,20 @@ extern "C" { #endif -/* prototypes */ -void XInit(PFileVarProto fv, PXVar xv, PComVar cv, PTTSet ts); -void XCancel(PFileVarProto fv, PXVar xv, PComVar cv); -void XTimeOutProc(PFileVarProto fv, PXVar xv, PComVar cv); -BOOL XParse(PFileVarProto fv, PXVar xv, PComVar cv); +enum { + XMODEM_MODE, + XMODEM_OPT, + XMODEM_TEXT_FLAG, +}; +BOOL XCreate(PFileVarProto fv); +#if 0 +void XInit(PFileVarProto fv, PComVar cv, PTTSet ts); +void XCancel(PFileVarProto fv, PComVar cv); +void XTimeOutProc(PFileVarProto fv, PComVar cv); +BOOL XParse(PFileVarProto fv, PComVar cv); +#endif + #ifdef __cplusplus } #endif Modified: trunk/teraterm/ttpfile/ymodem.c =================================================================== --- trunk/teraterm/ttpfile/ymodem.c 2020-12-20 12:07:33 UTC (rev 9058) +++ trunk/teraterm/ttpfile/ymodem.c 2020-12-20 12:07:51 UTC (rev 9059) @@ -50,6 +50,15 @@ #define SOH_DATALEN 128 #define STX_DATALEN 1024 + /* XMODEM states */ +#define XpktSOH 1 +#define XpktBLK 2 +#define XpktBLK2 3 +#define XpktDATA 4 + +#define XnakNAK 1 +#define XnakC 2 + int YRead1Byte(PFileVarProto fv, PYVar yv, PComVar cv, LPBYTE b) { if (CommRead1Byte(cv,b) == 0) Modified: trunk/teraterm/ttpfile/zmodem.c =================================================================== --- trunk/teraterm/ttpfile/zmodem.c 2020-12-20 12:07:33 UTC (rev 9058) +++ trunk/teraterm/ttpfile/zmodem.c 2020-12-20 12:07:51 UTC (rev 9059) @@ -121,7 +121,6 @@ static char recvbuf[LOGBUFSIZE]; static char sendbuf[LOGBUFSIZE]; -static const char *UILanguageFile; static void add_recvbuf(char *fmt, ...) { @@ -647,7 +646,7 @@ void ZInit(PFileVarProto fv, PZVar zv, PComVar cv, PTTSet ts) { int Max; char uimsg[MAX_UIMSG]; - UILanguageFile = ts->UILanguageFile; + const char *UILanguageFile = ts->UILanguageFile; zv->CtlEsc = ((ts->FTFlag & FT_ZESCCTL) != 0); zv->MaxDataLen = ts->ZmodemDataLen;