[Ttssh2-commit] [8974] xmodem.c のみで使用する構造体を移動

Back to archive index
scmno****@osdn***** scmno****@osdn*****
2020年 11月 2日 (月) 00:29:23 JST


Revision: 8974
          https://osdn.net/projects/ttssh2/scm/svn/commits/8974
Author:   zmatsuo
Date:     2020-11-02 00:29:23 +0900 (Mon, 02 Nov 2020)
Log Message:
-----------
xmodem.c のみで使用する構造体を移動

- TXVar 構造体を ttftypes.h から xmodem.c 内に移動
- xmodem.c 内の UI, File I/O の操作を filesys_proto.cpp へ移動
  - 仮実装、後に再度見直す

Modified Paths:
--------------
    branches/proto_unicode/teraterm/common/ttftypes.h
    branches/proto_unicode/teraterm/teraterm/filesys_proto.cpp
    branches/proto_unicode/teraterm/teraterm/filesys_proto.h
    branches/proto_unicode/teraterm/ttpfile/ttfile_proto.cpp
    branches/proto_unicode/teraterm/ttpfile/ttfile_proto.h
    branches/proto_unicode/teraterm/ttpfile/xmodem.c
    branches/proto_unicode/teraterm/ttpfile/xmodem.h
    branches/proto_unicode/teraterm/ttpfile/ymodem.c
    branches/proto_unicode/teraterm/ttpfile/zmodem.c

-------------- next part --------------
Modified: branches/proto_unicode/teraterm/common/ttftypes.h
===================================================================
--- branches/proto_unicode/teraterm/common/ttftypes.h	2020-11-01 15:29:05 UTC (rev 8973)
+++ branches/proto_unicode/teraterm/common/ttftypes.h	2020-11-01 15:29:23 UTC (rev 8974)
@@ -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: branches/proto_unicode/teraterm/teraterm/filesys_proto.cpp
===================================================================
--- branches/proto_unicode/teraterm/teraterm/filesys_proto.cpp	2020-11-01 15:29:05 UTC (rev 8973)
+++ branches/proto_unicode/teraterm/teraterm/filesys_proto.cpp	2020-11-01 15:29:23 UTC (rev 8974)
@@ -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: branches/proto_unicode/teraterm/teraterm/filesys_proto.h
===================================================================
--- branches/proto_unicode/teraterm/teraterm/filesys_proto.h	2020-11-01 15:29:05 UTC (rev 8973)
+++ branches/proto_unicode/teraterm/teraterm/filesys_proto.h	2020-11-01 15:29:23 UTC (rev 8974)
@@ -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: branches/proto_unicode/teraterm/ttpfile/ttfile_proto.cpp
===================================================================
--- branches/proto_unicode/teraterm/ttpfile/ttfile_proto.cpp	2020-11-01 15:29:05 UTC (rev 8973)
+++ branches/proto_unicode/teraterm/ttpfile/ttfile_proto.cpp	2020-11-01 15:29:23 UTC (rev 8974)
@@ -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: branches/proto_unicode/teraterm/ttpfile/ttfile_proto.h
===================================================================
--- branches/proto_unicode/teraterm/ttpfile/ttfile_proto.h	2020-11-01 15:29:05 UTC (rev 8973)
+++ branches/proto_unicode/teraterm/ttpfile/ttfile_proto.h	2020-11-01 15:29:23 UTC (rev 8974)
@@ -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: branches/proto_unicode/teraterm/ttpfile/xmodem.c
===================================================================
--- branches/proto_unicode/teraterm/ttpfile/xmodem.c	2020-11-01 15:29:05 UTC (rev 8973)
+++ branches/proto_unicode/teraterm/ttpfile/xmodem.c	2020-11-01 15:29:23 UTC (rev 8974)
@@ -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: branches/proto_unicode/teraterm/ttpfile/xmodem.h
===================================================================
--- branches/proto_unicode/teraterm/ttpfile/xmodem.h	2020-11-01 15:29:05 UTC (rev 8973)
+++ branches/proto_unicode/teraterm/ttpfile/xmodem.h	2020-11-01 15:29:23 UTC (rev 8974)
@@ -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: branches/proto_unicode/teraterm/ttpfile/ymodem.c
===================================================================
--- branches/proto_unicode/teraterm/ttpfile/ymodem.c	2020-11-01 15:29:05 UTC (rev 8973)
+++ branches/proto_unicode/teraterm/ttpfile/ymodem.c	2020-11-01 15:29:23 UTC (rev 8974)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008-2017 TeraTerm Project
+ * Copyright (C) 2008-2020 TeraTerm Project
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -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: branches/proto_unicode/teraterm/ttpfile/zmodem.c
===================================================================
--- branches/proto_unicode/teraterm/ttpfile/zmodem.c	2020-11-01 15:29:05 UTC (rev 8973)
+++ branches/proto_unicode/teraterm/ttpfile/zmodem.c	2020-11-01 15:29:23 UTC (rev 8974)
@@ -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;


Ttssh2-commit メーリングリストの案内
Back to archive index