[Ttssh2-commit] [9080] XMODEM の API を XMODEMStartReceive(), XMODEMStartSend() に統一

Back to archive index
scmno****@osdn***** scmno****@osdn*****
2020年 12月 20日 (日) 21:11:41 JST


Revision: 9080
          https://osdn.net/projects/ttssh2/scm/svn/commits/9080
Author:   zmatsuo
Date:     2020-12-20 21:11:41 +0900 (Sun, 20 Dec 2020)
Log Message:
-----------
XMODEM の API を XMODEMStartReceive(), XMODEMStartSend() に統一

- XMODEMStart()の使用をやめた

Modified Paths:
--------------
    trunk/teraterm/teraterm/filesys.h
    trunk/teraterm/teraterm/filesys_proto.cpp
    trunk/teraterm/teraterm/vtwin.cpp
    trunk/teraterm/ttpfile/xmodem.c

-------------- next part --------------
Modified: trunk/teraterm/teraterm/filesys.h
===================================================================
--- trunk/teraterm/teraterm/filesys.h	2020-12-20 12:11:31 UTC (rev 9079)
+++ trunk/teraterm/teraterm/filesys.h	2020-12-20 12:11:41 UTC (rev 9080)
@@ -51,7 +51,6 @@
 BOOL KermitGet(const char *filename);
 BOOL KermitStartRecive(void);
 BOOL KermitFinish(void);
-void XMODEMStart(int mode);
 BOOL XMODEMStartReceive(const char *fiename, WORD ParamBinaryFlag, WORD ParamXmodemOpt);
 BOOL XMODEMStartSend(const char *fiename, WORD ParamXmodemOpt);
 void YMODEMStart(int mode);

Modified: trunk/teraterm/teraterm/filesys_proto.cpp
===================================================================
--- trunk/teraterm/teraterm/filesys_proto.cpp	2020-12-20 12:11:31 UTC (rev 9079)
+++ trunk/teraterm/teraterm/filesys_proto.cpp	2020-12-20 12:11:41 UTC (rev 9080)
@@ -99,7 +99,17 @@
 
 static void _SetDlgProtoFileName(struct FileVarProto *fv, const char *text)
 {
-	SetDlgItemText(fv->HWin, IDC_PROTOFNAME, text);
+	// \x83t\x83@\x83C\x83\x8B\x96\xBC(\x8DŌ\xE3\x82̃p\x83X\x83Z\x83p\x83\x8C\x81[\x83^\x82\xA9\x82\xE7\x8C\xE3\x82\xEB\x82\xF0\x95\\x8E\xA6)
+	const char *s = text;
+	const char *p = strrchr(text, '\\');
+	if (p == NULL) {
+		p = strrchr(text, '/');
+	}
+	if (p != NULL) {
+		s = p + 1;
+	}
+	assert(fv->HWin != NULL);
+	SetDlgItemText(fv->HWin, IDC_PROTOFNAME, s);
 }
 
 static void _InitDlgProgress(struct FileVarProto *fv, int *CurProgStat)
@@ -109,6 +119,9 @@
 
 static BOOL NewFileVar_(PFileVarProto *pfv)
 {
+	if (*pfv != NULL) {
+		return TRUE;
+	}
 	TFileVarProto *fv = (TFileVarProto *)malloc(sizeof(TFileVarProto));
 	if (fv == NULL)
 		return FALSE;
@@ -528,6 +541,15 @@
 	return ptrs;
 }
 
+char **MakeStrArrayFromStr(const char *str)
+{
+	const char *strs[2];
+	strs[0] = str;
+	strs[1] = NULL;
+	char **ret = MakeStrArrayFromArray((char **)strs);
+	return ret;
+}
+
 char **MakeFileArrayMultiSelect(const char *lpstrFile)
 {
 	// \x90\x94\x82𐔂\xA6\x82\xE9
@@ -545,6 +567,11 @@
 		file_count++;
 	}
 
+	if (file_count == 0) {
+		// 1\x82‚\xBE\x82\xAF\x91I\x91\xF0\x82\xB3\x82\xEA\x82Ă\xA2\x82\xBD
+		return MakeStrArrayFromStr(lpstrFile);
+	}
+
 	// \x83p\x83X + \x83t\x83@\x83C\x83\x8B\x96\xBC \x88ꗗ\x8D쐬
 	size_t ptr_len = sizeof(char *) * (file_count + 1);
 	char **filenames = (char **)malloc(ptr_len);
@@ -568,15 +595,6 @@
 	return ret;
 }
 
-char **MakeFileArrayFromStr(char *str)
-{
-	char *strs[2];
-	strs[0] = str;
-	strs[1] = NULL;
-	char **ret = MakeStrArrayFromArray(strs);
-	return ret;
-}
-
 static char **_GetXFname(HWND HWin, BOOL Receive, const char *caption, LPLONG Option)
 {
 	char FileDirExpanded[MAX_PATH];
@@ -644,7 +662,7 @@
 		else
 			*Option = MAKELONG(LOWORD(*Option),HIWORD(opt));
 
-		ret = MakeFileArrayFromStr(FullName);
+		ret = MakeStrArrayFromStr(FullName);
 	}
 
 	return ret;
@@ -826,13 +844,11 @@
 #define GMF_QV 2     /* Quick-VAN Send */
 #define GMF_Y  3     /* YMODEM Send */
 
-#define FnStrMemSize 4096
 
 static char **_GetMultiFname(HWND hWnd, WORD FuncId, const char *caption, LPWORD Option)
 {
-	OPENFILENAME ofn;
+#define FnStrMemSize 4096
 	wchar_t TempDir[MAX_PATH];
-	BOOL Ok;
 	const char *FileSendFilter = ts.FileSendFilter;
 	const char *UILanguageFile = ts.UILanguageFile;
 
@@ -858,7 +874,7 @@
 		free(default_filename);
 	}
 
-	memset(&ofn, 0, sizeof(OPENFILENAME));
+	OPENFILENAME ofn = {};
 	ofn.lStructSize = get_OPENFILENAME_SIZE();
 	ofn.hwndOwner   = hWnd;
 	ofn.lpstrFilter = FNFilter;
@@ -883,72 +899,14 @@
 
 	ofn.hInstance = hInst;
 
-	Ok = GetOpenFileName(&ofn);
+	BOOL Ok = GetOpenFileName(&ofn);
 	free(FNFilter);
 
-	char **ret;
+	char **ret = NULL;
 	if (Ok) {
-		int i, len;
-		int NumFname = 0;
-		/* count number of file names */
-		len = strlen(FnStrMem);
-		i = 0;
-		while (len>0) {
-			i = i + len + 1;
-			NumFname++;
-			len = strlen(&FnStrMem[i]);
-		}
-
-		NumFname--;
-
-		if (NumFname<1) {
-			// single selection
-			ret = MakeFileArrayFromStr(FnStrMem);
-		}
-		else {
-			// multiple selection
-			ret = MakeFileArrayMultiSelect(FnStrMem);
-		}
-#if 0
-		if (fv->NumFname<1) { // single selection
-			fv->NumFname = 1;
-			fv->DirLen = ofn.nFileOffset;
-			strncpy_s(fv->FullName, sizeof(fv->FullName),fv->FnStrMem, _TRUNCATE);
-			fv->FnPtr = 0;
-		}
-		else { // multiple selection
-			strncpy_s(fv->FullName, sizeof(fv->FullName),fv->FnStrMem, _TRUNCATE);
-			AppendSlash(fv->FullName,sizeof(fv->FullName));
-			fv->DirLen = strlen(fv->FullName);
-			fv->FnPtr = strlen(fv->FnStrMem)+1;
-			file_array = MakeFileArrayMultiSelect(fv->FnStrMem);
-
-			{
-				int a = 0;
-			}
-		}
-#endif
-
-//		fv->FNCount = 0;
+		// multiple selection
+		ret = MakeFileArrayMultiSelect(FnStrMem);
 	}
-	else {
-		ret = NULL;
-	}
-
-#if 0
-	GlobalUnlock(fv->FnStrMemHandle);
-	if (! Ok) {
-		GlobalFree(fv->FnStrMemHandle);
-		fv->FnStrMemHandle = NULL;
-	}
-#endif
-
-#if 0
-	if (! Ok) {
-		free(fv->FnStrMem);
-		fv->FnStrMem = NULL;
-	}
-#endif
 	free(FnStrMem);
 
 	/* restore dir */
@@ -1104,86 +1062,11 @@
 	return TRUE;
 }
 
-void XMODEMStart(int mode)
+static void XMODEMStart(int mode)
 {
-	LONG Option;
-	int tmp;
-	const char *UILanguageFile = ts.UILanguageFile;
-	char uimsg[MAX_UIMSG];
-
 	if (! ProtoStart())
 		return;
 
-	TFileVarProto *fv = FileVar;
-
-	if (mode==IdXReceive) {
-		FileVar->OpId = OpXRcv;
-
-		strncpy_s(fv->DlgCaption, sizeof(fv->DlgCaption),"Tera Term: ", _TRUNCATE);
-		get_lang_msg("FILEDLG_TRANS_TITLE_XRCV", uimsg, sizeof(uimsg), TitXRcv, UILanguageFile);
-		strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
-	}
-	else {
-		FileVar->OpId = OpXSend;
-
-		strncpy_s(fv->DlgCaption, sizeof(fv->DlgCaption),"Tera Term: ", _TRUNCATE);
-		get_lang_msg("FILEDLG_TRANS_TITLE_XSEND", uimsg, sizeof(uimsg), TitXSend, UILanguageFile);
-		strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
-	}
-
-	if (strlen(&(FileVar->FullName[FileVar->DirLen]))==0)
-	{
-		Option = MAKELONG(ts.XmodemBin,ts.XmodemOpt);
-		char **filenames = _GetXFname(FileVar->HMainWin,
-									  mode==IdXReceive, fv->DlgCaption, &Option);
-		if (filenames == NULL) {
-			ProtoEnd();
-			return;
-		}
-		fv->FileNames = filenames;
-		GetNextFname(fv);
-		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);
-
 	TalkStatus = IdTalkQuiet;
 
 	/* disable transmit delay (serial port) */
@@ -1194,7 +1077,14 @@
 	}
 }
 
-BOOL XMODEMStartReceive(const char *fiename, WORD ParamBinaryFlag, WORD ParamXmodemOpt)
+/**
+ *	XMODEM\x8E\xF3\x90M
+ *
+ *	@param[in]	filename			\x8E\xF3\x90M\x83t\x83@\x83C\x83\x8B\x96\xBC(NULL\x82̂Ƃ\xAB\x81A\x83_\x83C\x83A\x83\x8D\x83O\x82őI\x91\xF0\x82\xB7\x82\xE9)
+ *	@param[in]	ParamBinaryFlag
+ *	@param[in]	ParamXmodemOpt
+ */
+BOOL XMODEMStartReceive(const char *filename, WORD ParamBinaryFlag, WORD ParamXmodemOpt)
 {
 	if (FileVar !=NULL)
 		return FALSE;
@@ -1201,33 +1091,78 @@
 	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;
+	TFileVarProto *fv = FileVar;
+	FileVar->OpId = OpXRcv;
+
+	const char *UILanguageFile = ts.UILanguageFile;
+	char uimsg[MAX_UIMSG];
+	strncpy_s(fv->DlgCaption, sizeof(fv->DlgCaption),"Tera Term: ", _TRUNCATE);
+	get_lang_msg("FILEDLG_TRANS_TITLE_XRCV", uimsg, sizeof(uimsg), TitXRcv, UILanguageFile);
+	strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
+
+	if (filename == NULL) {
+		LONG Option = MAKELONG(ts.XmodemBin,ts.XmodemOpt);
+		char **filenames = _GetXFname(HVTWin, TRUE, fv->DlgCaption, &Option);
+		if (filenames == NULL) {
+			FreeFileVar_(&FileVar);
+			return FALSE;
 		}
-		else {	// Checksum
-			ts.XmodemOpt = Xopt1kCksum;
+		fv->FileNames = filenames;
+		int tmp = HIWORD(Option);
+		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 (IsXoptCRC(ParamXmodemOpt)) {
-			ts.XmodemOpt = XoptCRC;
+		fv->FileNames = MakeStrArrayFromStr(filename);
+		if (IsXopt1k(ts.XmodemOpt)) {
+			if (IsXoptCRC(ParamXmodemOpt)) {
+				// CRC
+				ts.XmodemOpt = Xopt1kCRC;
+			}
+			else {	// Checksum
+				ts.XmodemOpt = Xopt1kCksum;
+			}
 		}
 		else {
-			ts.XmodemOpt = XoptCheck;
+			if (IsXoptCRC(ParamXmodemOpt)) {
+				ts.XmodemOpt = XoptCRC;
+			}
+			else {
+				ts.XmodemOpt = XoptCheck;
+			}
 		}
+		ts.XmodemBin = ParamBinaryFlag;
+		FileVar->NoMsg = TRUE;
 	}
-	ts.XmodemBin = ParamBinaryFlag;
-	FileVar->NoMsg = TRUE;
+	GetNextFname(fv);
 	XMODEMStart(IdXReceive);
+	fv->SetDlgProtoFileName(fv, fv->FullName);
 
 	return TRUE;
 }
 
-BOOL XMODEMStartSend(const char *fiename, WORD ParamXmodemOpt)
+/**
+ *	XMODEM\x91\x97\x90M
+ *
+ *	@param[in]	filename			\x91\x97\x90M\x83t\x83@\x83C\x83\x8B\x96\xBC(NULL\x82̂Ƃ\xAB\x81A\x83_\x83C\x83A\x83\x8D\x83O\x82őI\x91\xF0\x82\xB7\x82\xE9)
+ *	@param[in]	ParamXmodemOpt
+ */
+BOOL XMODEMStartSend(const char *filename, WORD ParamXmodemOpt)
 {
 	if (FileVar !=NULL)
 		return FALSE;
@@ -1234,26 +1169,64 @@
 	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;
+	TFileVarProto *fv = FileVar;
+	FileVar->OpId = OpXSend;
+
+	const char *UILanguageFile = ts.UILanguageFile;
+	char uimsg[MAX_UIMSG];
+	strncpy_s(fv->DlgCaption, sizeof(fv->DlgCaption),"Tera Term: ", _TRUNCATE);
+	get_lang_msg("FILEDLG_TRANS_TITLE_XSEND", uimsg, sizeof(uimsg), TitXSend, UILanguageFile);
+	strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
+
+	if (filename == NULL) {
+		LONG Option = MAKELONG(ts.XmodemBin,ts.XmodemOpt);
+		char **filenames = _GetXFname(HVTWin, FALSE, fv->DlgCaption, &Option);
+		if (filenames == NULL) {
+			FreeFileVar_(&FileVar);
+			return FALSE;
 		}
+		fv->FileNames = filenames;
+		int tmp = HIWORD(Option);
+		if (IsXopt1k(tmp)) {
+			if (IsXoptCRC(ts.XmodemOpt)) {
+				ts.XmodemOpt = Xopt1kCRC;
+			}
+			else {
+				ts.XmodemOpt = Xopt1kCksum;
+			}
+		}
 		else {
-			ts.XmodemOpt = XoptCRC;
+			if (IsXoptCRC(ts.XmodemOpt)) {
+				ts.XmodemOpt = XoptCRC;
+			}
+			else {
+				ts.XmodemOpt = XoptCheck;
+			}
 		}
 	}
 	else {
-		if (IsXopt1k(ParamXmodemOpt)) {
-			ts.XmodemOpt = Xopt1kCksum;
+		fv->FileNames = MakeStrArrayFromStr(filename);
+		if (IsXoptCRC(ts.XmodemOpt)) {
+			if (IsXopt1k(ParamXmodemOpt)) {
+				ts.XmodemOpt = Xopt1kCRC;
+			}
+			else {
+				ts.XmodemOpt = XoptCRC;
+			}
 		}
 		else {
-			ts.XmodemOpt = XoptCheck;
+			if (IsXopt1k(ParamXmodemOpt)) {
+				ts.XmodemOpt = Xopt1kCksum;
+			}
+			else {
+				ts.XmodemOpt = XoptCheck;
+			}
 		}
+		FileVar->NoMsg = TRUE;
 	}
-	FileVar->NoMsg = TRUE;
+	GetNextFname(fv);
 	XMODEMStart(IdXSend);
+	fv->SetDlgProtoFileName(fv, fv->FullName);
 
 	return TRUE;
 }

Modified: trunk/teraterm/teraterm/vtwin.cpp
===================================================================
--- trunk/teraterm/teraterm/vtwin.cpp	2020-12-20 12:11:31 UTC (rev 9079)
+++ trunk/teraterm/teraterm/vtwin.cpp	2020-12-20 12:11:41 UTC (rev 9080)
@@ -4334,13 +4334,13 @@
 void CVTWindow::OnFileXRcv()
 {
 	HelpId = HlpFileXmodemRecv;
-	XMODEMStart(IdXReceive);
+	XMODEMStartReceive(NULL, 0, 0);
 }
 
 void CVTWindow::OnFileXSend()
 {
 	HelpId = HlpFileXmodemSend;
-	XMODEMStart(IdXSend);
+	XMODEMStartSend(NULL, 0);
 }
 
 void CVTWindow::OnFileYRcv()

Modified: trunk/teraterm/ttpfile/xmodem.c
===================================================================
--- trunk/teraterm/ttpfile/xmodem.c	2020-12-20 12:11:31 UTC (rev 9079)
+++ trunk/teraterm/ttpfile/xmodem.c	2020-12-20 12:11:41 UTC (rev 9080)
@@ -243,9 +243,6 @@
 	}
 	fv->StartTime = GetTickCount();
 
-	SetWindowText(fv->HWin, fv->DlgCaption);
-	fv->SetDlgProtoFileName(fv, &(fv->FullName[fv->DirLen]));
-
 	xv->PktNumOffset = 0;
 	xv->PktNum = 0;
 	xv->PktNumSent = 0;
@@ -284,8 +281,10 @@
 		// \x83t\x83@\x83C\x83\x8B\x91\x97\x90M\x8AJ\x8En\x91O\x82ɁA"rx \x83t\x83@\x83C\x83\x8B\x96\xBC"\x82\xF0\x8E\xA9\x93\xAE\x93I\x82ɌĂяo\x82\xB7\x81B(2007.12.20 yutaka)
 		if (ts->XModemRcvCommand[0] != '\0') {
 			char inistr[MAX_PATH + 10];
+			int i, j;
+			GetFileNamePos(fv->FullName,&i,&j);
 			_snprintf_s(inistr, sizeof(inistr), _TRUNCATE, "%s %s\015",
-						ts->XModemRcvCommand, &(fv->FullName[fv->DirLen]));
+						ts->XModemRcvCommand, &(fv->FullName[j]));
 			FTConvFName(inistr + strlen(ts->XModemRcvCommand) + 1);
 			XWrite(fv, xv, cv, inistr, strlen(inistr));
 		}
@@ -639,13 +638,13 @@
 		return 0;
 	}
 	case XMODEM_OPT: {
-		WORD Opt1 = va_arg(ap, WORD);
+		WORD Opt1 = va_arg(ap, int);
 		xv->XOpt = Opt1;
 		return 0;
 	}
 	case XMODEM_TEXT_FLAG: {
-		WORD Opt2 = va_arg(ap, WORD);
-		xv->TextFlag = 1 - (Opt2 & 1);
+		WORD Opt2 = va_arg(ap, int);
+		xv->TextFlag = Opt2;
 		return 0;
 	}
 	}


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