[ttssh2-commit] [11021] SCP送受信ダイアログのファイル名に漢字等が含まれていると送受信できない問題を修正

Back to archive index
scmno****@osdn***** scmno****@osdn*****
2023年 10月 22日 (日) 13:13:04 JST


Revision: 11021
          https://osdn.net/projects/ttssh2/scm/svn/commits/11021
Author:   zmatsuo
Date:     2023-10-22 13:13:04 +0900 (Sun, 22 Oct 2023)
Log Message:
-----------
SCP送受信ダイアログのファイル名に漢字等が含まれていると送受信できない問題を修正

- [ファイル] - [SSH SCP...] SCPダイアログからの送受信
- ダイアログ、ファイル名の扱いをUnicode化
  - エラーメッセージなども正しく表示されなかったので修正
- ANSI版ダウンロードディレクトリ TTTSet.FileDir を廃止
  - TTTSet.reserve_FileDir へリネーム
  - TTTSet.FileDirW のみ使用

Modified Paths:
--------------
    trunk/installer/release/lang_utf8/English.lng
    trunk/installer/release/lang_utf8/French.lng
    trunk/installer/release/lang_utf8/German.lng
    trunk/installer/release/lang_utf8/Japanese.lng
    trunk/installer/release/lang_utf8/Korean.lng
    trunk/installer/release/lang_utf8/Russian.lng
    trunk/installer/release/lang_utf8/Spanish.lng
    trunk/installer/release/lang_utf8/Traditional Chinese.lng
    trunk/teraterm/common/ttlib.c
    trunk/teraterm/common/ttlib.h
    trunk/teraterm/common/tttypes.h
    trunk/teraterm/teraterm/ttdde.c
    trunk/teraterm/ttpdlg/ttdlg.c
    trunk/teraterm/ttpset/ttset.c
    trunk/ttssh2/ttxssh/ssh.c
    trunk/ttssh2/ttxssh/ssh.h
    trunk/ttssh2/ttxssh/ttxssh.c

-------------- next part --------------
Modified: trunk/installer/release/lang_utf8/English.lng
===================================================================
--- trunk/installer/release/lang_utf8/English.lng	2023-10-21 15:16:14 UTC (rev 11020)
+++ trunk/installer/release/lang_utf8/English.lng	2023-10-22 04:13:04 UTC (rev 11021)
@@ -1,4 +1,4 @@
-; Updated by TeraTerm Project (2023-09-09)
+; Updated by TeraTerm Project (2023-10-22)
 
 [Tera Term]
 DLG_SYSTEM_FONT=System,14,0
@@ -984,10 +984,10 @@
 MSG_SSH_AGENTERROR_TITLE=Bad agent request
 MSG_SSH_AGENTERROR_TOOLARGE=Agent request size is too large, ignore it.
 MSG_SSH_SCP_FILEOPEN_ERROR_TITLE=TTSSH: file open error
-MSG_SSH_SCP_FILEOPEN_READ_ERROR=Can't open file for reading:
+MSG_SSH_SCP_FILEOPEN_READ_ERROR=Can't open file for reading: %s %s
 MSG_SSH_SCP_FILEOPEN_READONLY_ERROR=`%s' file is read only.
 MSG_SSH_SCP_FILEOPEN_OVERWRITE_CONFIRM=`%s' file exists.\noverwrite it?
-MSG_SSH_SCP_FILEOPEN_WRITE_ERROR=Can't open file for writing:
+MSG_SSH_SCP_FILEOPEN_WRITE_ERROR=Can't open file for writing: %s %s
 MSG_SSH_SCP_CONFIRM_TITLE=TTSSH: confirm
 MSG_SSH_SCP_ERROR_TITLE=TTSSH: SCP error
 MSG_SSH_SCP_ERROR_INIT_TITLE=TTSSH: SCP error (SCP_INIT)

Modified: trunk/installer/release/lang_utf8/French.lng
===================================================================
--- trunk/installer/release/lang_utf8/French.lng	2023-10-21 15:16:14 UTC (rev 11020)
+++ trunk/installer/release/lang_utf8/French.lng	2023-10-22 04:13:04 UTC (rev 11021)
@@ -1,4 +1,4 @@
-; Updated by TeraTerm Project (2023-09-09)
+; Updated by TeraTerm Project (2023-10-22)
 ; Last translated (French language) by Francois MOCQ (2010-07-21)
 
 [Tera Term]
@@ -988,10 +988,10 @@
 MSG_SSH_AGENTERROR_TITLE=Bad agent request
 MSG_SSH_AGENTERROR_TOOLARGE=Agent request size is too large, ignore it.
 MSG_SSH_SCP_FILEOPEN_ERROR_TITLE=TTSSH: file open error
-MSG_SSH_SCP_FILEOPEN_READ_ERROR=Can't open file for reading:
+MSG_SSH_SCP_FILEOPEN_READ_ERROR=Can't open file for reading: %s %s
 MSG_SSH_SCP_FILEOPEN_READONLY_ERROR=`%s' file is read only.
 MSG_SSH_SCP_FILEOPEN_OVERWRITE_CONFIRM=`%s' file exists.\noverwrite it?
-MSG_SSH_SCP_FILEOPEN_WRITE_ERROR=Can't open file for writing:
+MSG_SSH_SCP_FILEOPEN_WRITE_ERROR=Can't open file for writing: %s %s
 MSG_SSH_SCP_CONFIRM_TITLE=TTSSH: confirm
 MSG_SSH_SCP_ERROR_TITLE=TTSSH: SCP error
 MSG_SSH_SCP_ERROR_INIT_TITLE=TTSSH: SCP error (SCP_INIT)

Modified: trunk/installer/release/lang_utf8/German.lng
===================================================================
--- trunk/installer/release/lang_utf8/German.lng	2023-10-21 15:16:14 UTC (rev 11020)
+++ trunk/installer/release/lang_utf8/German.lng	2023-10-22 04:13:04 UTC (rev 11021)
@@ -1,4 +1,4 @@
-; Updated by TeraTerm Project (2023-09-09)
+; Updated by TeraTerm Project (2023-10-22)
 ; Last translated (German language) by Frederik Schwarzer (2010-05-17)
 
 [Tera Term]
@@ -980,10 +980,10 @@
 MSG_SSH_AGENTERROR_TITLE=Bad agent request
 MSG_SSH_AGENTERROR_TOOLARGE=Agent request size is too large, ignore it.
 MSG_SSH_SCP_FILEOPEN_ERROR_TITLE=TTSSH: file open error
-MSG_SSH_SCP_FILEOPEN_READ_ERROR=Can't open file for reading:
+MSG_SSH_SCP_FILEOPEN_READ_ERROR=Can't open file for reading: %s %s
 MSG_SSH_SCP_FILEOPEN_READONLY_ERROR=`%s' file is read only.
 MSG_SSH_SCP_FILEOPEN_OVERWRITE_CONFIRM=`%s' file exists.\noverwrite it?
-MSG_SSH_SCP_FILEOPEN_WRITE_ERROR=Can't open file for writing:
+MSG_SSH_SCP_FILEOPEN_WRITE_ERROR=Can't open file for writing: %s %s
 MSG_SSH_SCP_CONFIRM_TITLE=TTSSH: confirm
 MSG_SSH_SCP_ERROR_TITLE=TTSSH: SCP error
 MSG_SSH_SCP_ERROR_INIT_TITLE=TTSSH: SCP error (SCP_INIT)

Modified: trunk/installer/release/lang_utf8/Japanese.lng
===================================================================
--- trunk/installer/release/lang_utf8/Japanese.lng	2023-10-21 15:16:14 UTC (rev 11020)
+++ trunk/installer/release/lang_utf8/Japanese.lng	2023-10-22 04:13:04 UTC (rev 11021)
@@ -1,4 +1,4 @@
-; Updated by TeraTerm Project (2023-09-09)
+; Updated by TeraTerm Project (2023-10-22)
 
 [Tera Term]
 DLG_SYSTEM_FONT=MS Pゴシック,12,128
@@ -985,10 +985,10 @@
 MSG_SSH_AGENTERROR_TITLE=不正なエージェント要求
 MSG_SSH_AGENTERROR_TOOLARGE=エージェント要求のメッセージが大きすぎるので無視します.
 MSG_SSH_SCP_FILEOPEN_ERROR_TITLE=TTSSH: ファイルオープンエラー
-MSG_SSH_SCP_FILEOPEN_READ_ERROR=読み取り用にファイルを開けません:
+MSG_SSH_SCP_FILEOPEN_READ_ERROR=読み取り用にファイルを開けません: %s %s
 MSG_SSH_SCP_FILEOPEN_READONLY_ERROR=ファイル `%s' は読み取り専用です.
 MSG_SSH_SCP_FILEOPEN_OVERWRITE_CONFIRM=ファイル `%s' が存在します.\n上書きしますか?
-MSG_SSH_SCP_FILEOPEN_WRITE_ERROR=書き込み用にファイルを開けません:
+MSG_SSH_SCP_FILEOPEN_WRITE_ERROR=書き込み用にファイルを開けません: %s %s
 MSG_SSH_SCP_CONFIRM_TITLE=TTSSH: 確認
 MSG_SSH_SCP_ERROR_TITLE=TTSSH: SCP エラー
 MSG_SSH_SCP_ERROR_INIT_TITLE=TTSSH: SCP エラー (SCP_INIT)

Modified: trunk/installer/release/lang_utf8/Korean.lng
===================================================================
--- trunk/installer/release/lang_utf8/Korean.lng	2023-10-21 15:16:14 UTC (rev 11020)
+++ trunk/installer/release/lang_utf8/Korean.lng	2023-10-22 04:13:04 UTC (rev 11021)
@@ -1,4 +1,4 @@
-; Updated by TeraTerm Project (2023-09-09)
+; Updated by TeraTerm Project (2023-10-22)
 ; Last translated (Korean language) by Daehong Kim (2013-07-25)
 
 [Tera Term]
@@ -988,10 +988,10 @@
 MSG_SSH_AGENTERROR_TITLE=Bad agent request
 MSG_SSH_AGENTERROR_TOOLARGE=Agent request size is too large, ignore it.
 MSG_SSH_SCP_FILEOPEN_ERROR_TITLE=TTSSH: file open error
-MSG_SSH_SCP_FILEOPEN_READ_ERROR=Can't open file for reading:
+MSG_SSH_SCP_FILEOPEN_READ_ERROR=Can't open file for reading: %s %s
 MSG_SSH_SCP_FILEOPEN_READONLY_ERROR=`%s' file is read only.
 MSG_SSH_SCP_FILEOPEN_OVERWRITE_CONFIRM=`%s' file exists.\noverwrite it?
-MSG_SSH_SCP_FILEOPEN_WRITE_ERROR=Can't open file for writing:
+MSG_SSH_SCP_FILEOPEN_WRITE_ERROR=Can't open file for writing: %s %s
 MSG_SSH_SCP_CONFIRM_TITLE=TTSSH: confirm
 MSG_SSH_SCP_ERROR_TITLE=TTSSH: SCP error
 MSG_SSH_SCP_ERROR_INIT_TITLE=TTSSH: SCP error (SCP_INIT)

Modified: trunk/installer/release/lang_utf8/Russian.lng
===================================================================
--- trunk/installer/release/lang_utf8/Russian.lng	2023-10-21 15:16:14 UTC (rev 11020)
+++ trunk/installer/release/lang_utf8/Russian.lng	2023-10-22 04:13:04 UTC (rev 11021)
@@ -1,4 +1,4 @@
-; Updated by TeraTerm Project (2023-09-09)
+; Updated by TeraTerm Project (2023-10-22)
 ; Last translated (Russian language) by Ryumik Sergey (2017-07-19)
 
 [Tera Term]
@@ -988,10 +988,10 @@
 MSG_SSH_AGENTERROR_TITLE=Неверный запрос агента
 MSG_SSH_AGENTERROR_TOOLARGE=Запрос агента слишком велик, игнорируйте его.
 MSG_SSH_SCP_FILEOPEN_ERROR_TITLE=TTSSH: file open error
-MSG_SSH_SCP_FILEOPEN_READ_ERROR=Can't open file for reading:
+MSG_SSH_SCP_FILEOPEN_READ_ERROR=Can't open file for reading: %s %s
 MSG_SSH_SCP_FILEOPEN_READONLY_ERROR=`%s' file is read only.
 MSG_SSH_SCP_FILEOPEN_OVERWRITE_CONFIRM=`%s' file exists.\noverwrite it?
-MSG_SSH_SCP_FILEOPEN_WRITE_ERROR=Can't open file for writing:
+MSG_SSH_SCP_FILEOPEN_WRITE_ERROR=Can't open file for writing: %s %s
 MSG_SSH_SCP_CONFIRM_TITLE=TTSSH: confirm
 MSG_SSH_SCP_ERROR_TITLE=TTSSH: SCP error
 MSG_SSH_SCP_ERROR_INIT_TITLE=TTSSH: SCP error (SCP_INIT)

Modified: trunk/installer/release/lang_utf8/Spanish.lng
===================================================================
--- trunk/installer/release/lang_utf8/Spanish.lng	2023-10-21 15:16:14 UTC (rev 11020)
+++ trunk/installer/release/lang_utf8/Spanish.lng	2023-10-22 04:13:04 UTC (rev 11021)
@@ -1,4 +1,4 @@
-; Updated by TeraTerm Project (2023-09-09)
+; Updated by TeraTerm Project (2023-10-22)
 ; Traducido por Filiberto Olguin Ascona.
 
 [Tera Term]
@@ -883,10 +883,10 @@
 MSG_SSH_CHANNEL_OPEN_ERROR=SSH2_MSG_CHANNEL_OPEN_FAILURE was received.\nchannel [%d]: reason: %s(%d) message: %s
 MSG_SSH_NO_FREE_CHANNEL=Could not open new channel. TTSSH is already opening too many channels.
 MSG_SSH_SCP_FILEOPEN_ERROR_TITLE=TTSSH: file open error
-MSG_SSH_SCP_FILEOPEN_READ_ERROR=Can't open file for reading:
+MSG_SSH_SCP_FILEOPEN_READ_ERROR=Can't open file for reading: %s %s
 MSG_SSH_SCP_FILEOPEN_READONLY_ERROR=`%s' file is read only.
 MSG_SSH_SCP_FILEOPEN_OVERWRITE_CONFIRM=`%s' file exists.\noverwrite it?
-MSG_SSH_SCP_FILEOPEN_WRITE_ERROR=Can't open file for writing:
+MSG_SSH_SCP_FILEOPEN_WRITE_ERROR=Can't open file for writing: %s %s
 MSG_SSH_SCP_CONFIRM_TITLE=TTSSH: confirm
 MSG_SSH_SCP_ERROR_TITLE=TTSSH: SCP error
 MSG_SSH_SCP_ERROR_INIT_TITLE=TTSSH: SCP error (SCP_INIT)

Modified: trunk/installer/release/lang_utf8/Traditional Chinese.lng
===================================================================
--- trunk/installer/release/lang_utf8/Traditional Chinese.lng	2023-10-21 15:16:14 UTC (rev 11020)
+++ trunk/installer/release/lang_utf8/Traditional Chinese.lng	2023-10-22 04:13:04 UTC (rev 11021)
@@ -1,4 +1,4 @@
-; Updated by TeraTerm Project (2023-09-09)
+; Updated by TeraTerm Project (2023-10-22)
 ; Last translated (Traditional Chinese language) by kikiqqp (2014-09-20)
 
 [Tera Term]
@@ -985,10 +985,10 @@
 MSG_SSH_AGENTERROR_TITLE=Bad agent request
 MSG_SSH_AGENTERROR_TOOLARGE=Agent request size is too large, ignore it.
 MSG_SSH_SCP_FILEOPEN_ERROR_TITLE=TTSSH: file open error
-MSG_SSH_SCP_FILEOPEN_READ_ERROR=Can't open file for reading:
+MSG_SSH_SCP_FILEOPEN_READ_ERROR=Can't open file for reading: %s %s
 MSG_SSH_SCP_FILEOPEN_READONLY_ERROR=`%s' file is read only.
 MSG_SSH_SCP_FILEOPEN_OVERWRITE_CONFIRM=`%s' file exists.\noverwrite it?
-MSG_SSH_SCP_FILEOPEN_WRITE_ERROR=Can't open file for writing:
+MSG_SSH_SCP_FILEOPEN_WRITE_ERROR=Can't open file for writing: %s %s
 MSG_SSH_SCP_CONFIRM_TITLE=TTSSH: confirm
 MSG_SSH_SCP_ERROR_TITLE=TTSSH: SCP error
 MSG_SSH_SCP_ERROR_INIT_TITLE=TTSSH: SCP error (SCP_INIT)

Modified: trunk/teraterm/common/ttlib.c
===================================================================
--- trunk/teraterm/common/ttlib.c	2023-10-21 15:16:14 UTC (rev 11020)
+++ trunk/teraterm/common/ttlib.c	2023-10-22 04:13:04 UTC (rev 11021)
@@ -237,7 +237,7 @@
 	return TRUE;
 }
 
-BOOL ExtractFileName(PCHAR PathName, PCHAR FileName, int destlen)
+BOOL ExtractFileName(const char *PathName, PCHAR FileName, int destlen)
 {
 	int i, j;
 
@@ -249,7 +249,7 @@
 	return (strlen(FileName)>0);
 }
 
-BOOL ExtractDirName(PCHAR PathName, PCHAR DirName)
+BOOL ExtractDirName(const char *PathName, PCHAR DirName)
 {
 	int i, j;
 

Modified: trunk/teraterm/common/ttlib.h
===================================================================
--- trunk/teraterm/common/ttlib.h	2023-10-21 15:16:14 UTC (rev 11020)
+++ trunk/teraterm/common/ttlib.h	2023-10-22 04:13:04 UTC (rev 11021)
@@ -52,8 +52,8 @@
 BOOL GetFileNamePos(const char *PathName, int *DirLen, int *FNPos);
 BOOL GetFileNamePosU8(const char *PathName, int *DirLen, int *FNPos);
 BOOL GetFileNamePosW(const wchar_t *PathName, size_t *DirLen, size_t *FNPos);
-DllExport BOOL ExtractFileName(PCHAR PathName, PCHAR FileName, int destlen);
-DllExport BOOL ExtractDirName(PCHAR PathName, PCHAR DirName);
+DllExport BOOL ExtractFileName(const char *PathName, PCHAR FileName, int destlen);
+DllExport BOOL ExtractDirName(const char *PathName, PCHAR DirName);
 wchar_t *ExtractDirNameW(const wchar_t *PathName);
 wchar_t *ExtractFileNameW(const wchar_t *PathName);
 void FitFileName(PCHAR FileName, int destlen, const char *DefExt);

Modified: trunk/teraterm/common/tttypes.h
===================================================================
--- trunk/teraterm/common/tttypes.h	2023-10-21 15:16:14 UTC (rev 11020)
+++ trunk/teraterm/common/tttypes.h	2023-10-22 04:13:04 UTC (rev 11021)
@@ -347,7 +347,7 @@
 	WORD XmodemOpt, XmodemBin;
 	int ZmodemDataLen, ZmodemWinSize;
 	int QVWinSize;
-	char FileDir[MAXPATHLEN];		// switch FileDirW
+	char reserve_FileDir[256];		// switch FileDirW
 	char FileSendFilter[128];
 	WORD Language;
 	char DelimList[52];
@@ -541,7 +541,7 @@
 	WORD LogLockExclusive;
 	WORD KermitOpt;
 	WORD FontQuality;
-	char ScpSendDir[MAXPATHLEN];
+	char ScpSendDir[MAXPATHLEN];				// SCP \x91\x97\x90M\x90\xE6(\x83z\x83X\x83g\x82̃f\x83B\x83\x8C\x83N\x83g\x83\x8A)
 	char reserver_BGImageFilePath[MAX_PATH];
 	int LogRotate;		//	enum rotate_mode LogRotate;
 	DWORD LogRotateSize;

Modified: trunk/teraterm/teraterm/ttdde.c
===================================================================
--- trunk/teraterm/teraterm/ttdde.c	2023-10-21 15:16:14 UTC (rev 11020)
+++ trunk/teraterm/teraterm/ttdde.c	2023-10-22 04:13:04 UTC (rev 11021)
@@ -450,7 +450,8 @@
 		break;
 	}
 	case CmdChangeDir:
-		strncpy_s(ts.FileDir, sizeof(ts.FileDir),ParamFileName, _TRUNCATE);
+		free(ts.FileDirW);
+		ts.FileDirW = ToWcharU8(ParamFileName);
 		break;
 	case CmdClearScreen:
 		switch (ParamFileName[0]) {

Modified: trunk/teraterm/ttpdlg/ttdlg.c
===================================================================
--- trunk/teraterm/ttpdlg/ttdlg.c	2023-10-21 15:16:14 UTC (rev 11020)
+++ trunk/teraterm/ttpdlg/ttdlg.c	2023-10-22 04:13:04 UTC (rev 11021)
@@ -1891,7 +1891,6 @@
 						if (DoesFolderExistW(FileDirExpanded)) {
 							free(ts->FileDirW);
 							ts->FileDirW = new_dir;
-							WideCharToACP_t(ts->FileDirW, ts->FileDir, sizeof(ts->FileDir));
 							OK = TRUE;
 						}
 						else {

Modified: trunk/teraterm/ttpset/ttset.c
===================================================================
--- trunk/teraterm/ttpset/ttset.c	2023-10-21 15:16:14 UTC (rev 11020)
+++ trunk/teraterm/ttpset/ttset.c	2023-10-22 04:13:04 UTC (rev 11021)
@@ -1175,7 +1175,6 @@
 		free(ts->FileDirW);
 		ts->FileDirW = GetDownloadFolderW();
 	}
-	WideCharToACP_t(ts->FileDirW, ts->FileDir, sizeof(ts->FileDir));
 
 	/* filter on file send (2007.6.5 maya) */
 	GetPrivateProfileString(Section, "FileSendFilter", "",
@@ -3770,7 +3769,9 @@
 			if (dir != NULL && wcslen(dir) > 0 && DoesFolderExistW(dir)) {
 				free(ts->FileDirW);
 				ts->FileDirW = _wcsdup(dir);
+#if 0
 				WideCharToACP_t(ts->FileDirW, ts->FileDir, sizeof(ts->FileDir));
+#endif
 			}
 			free(dir);
 		}

Modified: trunk/ttssh2/ttxssh/ssh.c
===================================================================
--- trunk/ttssh2/ttxssh/ssh.c	2023-10-21 15:16:14 UTC (rev 11020)
+++ trunk/ttssh2/ttxssh/ssh.c	2023-10-22 04:13:04 UTC (rev 11021)
@@ -43,21 +43,18 @@
 #include <openssl/rsa.h>
 #include <openssl/dsa.h>
 #include <openssl/md5.h>
+
 #include <limits.h>
 #include <malloc.h>
 #include <string.h>
+#if !defined(_CRTDBG_MAP_ALLOC)
+#define _CRTDBG_MAP_ALLOC
+#endif
 #include <stdlib.h>
+#include <crtdbg.h>
 #include <process.h>
 #include <time.h>
 #include <commctrl.h>
-#include "buffer.h"
-#include "ssh.h"
-#include "crypt.h"
-#include "fwd.h"
-#include "sftp.h"
-#include "kex.h"
-#include "dlglib.h"
-
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <sys/utime.h>
@@ -69,6 +66,16 @@
 #include <fcntl.h>
 #endif
 
+
+#include "buffer.h"
+#include "ssh.h"
+#include "crypt.h"
+#include "fwd.h"
+#include "sftp.h"
+#include "kex.h"
+#include "dlglib.h"
+#include "win32helper.h"
+
 #ifndef MAX
 # define MAX(a,b) (((a)>(b))?(a):(b))
 # define MIN(a,b) (((a)<(b))?(a):(b))
@@ -4196,22 +4203,55 @@
 	}
 }
 
+static int accessU8(const char *pathU8, int mode)
+{
+	wchar_t *pathW = ToWcharU8(pathU8);
+	int r = _waccess(pathW, mode);
+	free(pathW);
+	return r;
+}
+
+DWORD hFormatMessageW(DWORD error, wchar_t **message)
+{
+	LPWSTR lpMsgBuf;
+	DWORD r =
+		FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_MAX_WIDTH_MASK,
+		NULL,
+		error,
+		MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
+		(LPWSTR)&lpMsgBuf,
+		0,
+		NULL);
+	if (r == 0) {
+		*message = NULL;
+		return GetLastError();
+	}
+	*message = _wcsdup(lpMsgBuf);
+	LocalFree(lpMsgBuf);
+	return NO_ERROR;
+}
+
 /**
  *	SCP support
  *
- *	@param sendfile		UTF-8
- *	@param dstfile		UTF-8
- *	@param direction
+ *	@param sendfile		\x83t\x83@\x83C\x83\x8B\x96\xBC,UTF-8
+ *	@param dstfile		\x83t\x83@\x83C\x83\x8B\x96\xBC,UTF-8
+ *						TOREMOTE \x82̂Ƃ\xAB\x81A
+ *							NULL \x82̂Ƃ\xAB\x81A\x83z\x81[\x83\x80\x83t\x83H\x83\x8B\x83_
+ *							\x91\x8A\x91΃p\x83X\x81A\x83z\x81[\x83\x80\x83t\x83H\x83\x8B\x83_\x82\xA9\x82\xE7\x82̑\x8A\x91\xCE?
+ *							\x90\xE2\x91΃p\x83X
+ *						TOLOCAL \x82̂Ƃ\xAB
+ *							NULL \x82̂Ƃ\xAB\x81A\x83_\x83E\x83\x93\x83\x8D\x81[\x83h\x83t\x83H\x83\x8B\x83_
+ *							\x91\x8A\x91΃p\x83X\x81A\x83J\x83\x8C\x83\x93\x83g\x83t\x83H\x83\x8B\x83_\x82\xA9\x82\xE7\x82̑\x8A\x91\xCE?
+ *							\x90\xE2\x91΃p\x83X
+ *	@param direction	TOREMOTE	copy local to remote
+ *						FROMREMOTE	copy remote to local
+ *
  */
-int SSH_scp_transaction(PTInstVar pvar, char *sendfile, char *dstfile, enum scp_dir direction)
+int SSH_scp_transaction(PTInstVar pvar, const char *sendfile, const char *dstfile, enum scp_dir direction)
 {
-	buffer_t *msg;
-	char *s;
-	unsigned char *outmsg;
-	int len;
 	Channel_t *c = NULL;
 	FILE *fp = NULL;
-	struct __stat64 st;
 
 	// \x83\\x83P\x83b\x83g\x82\xAA\x83N\x83\x8D\x81[\x83Y\x82\xB3\x82\xEA\x82Ă\xA2\x82\xE9\x8Fꍇ\x82͉\xBD\x82\xE0\x82\xB5\x82Ȃ\xA2\x81B
 	if (pvar->socket == INVALID_SOCKET)
@@ -4235,25 +4275,22 @@
 	}
 
 	if (direction == TOREMOTE) {  // copy local to remote
+		struct __stat64 st;
 		fp = fopenU8(sendfile, "rb");
 		if (fp == NULL) {
-			char buf[1024];
-			int len;
-			UTIL_get_lang_msg("MSG_SSH_SCP_FILEOPEN_READ_ERROR", pvar,
-			                  "Can't open file for reading:");
-			_snprintf_s(buf, sizeof(buf), _TRUNCATE, "%s ", pvar->UIMsg);
-			len = strlen(buf);
-			FormatMessage(
-			    FORMAT_MESSAGE_FROM_SYSTEM,
-			    NULL,
-			    GetLastError(),
-			    0,
-			    buf+len,
-			    sizeof(buf)-len,
-			    NULL);
-			UTIL_get_lang_msg("MSG_SSH_SCP_FILEOPEN_ERROR_TITLE", pvar,
-			                  "TTSSH: file open error");
-			MessageBox(NULL, buf, pvar->UIMsg, MB_OK | MB_ICONERROR);
+			static const TTMessageBoxInfoW info = {
+				"TTSSH",
+				"MSG_SSH_SCP_FILEOPEN_ERROR_TITLE", L"TTSSH: file open error",
+				"MSG_SSH_SCP_FILEOPEN_READ_ERROR", L"Can't open file for reading: %s %s",
+				MB_OK | MB_ICONERROR
+			};
+			DWORD error = GetLastError();
+			wchar_t *err_str;
+			hFormatMessageW(error, &err_str);
+			wchar_t *fname = ToWcharU8(sendfile);
+			TTMessageBoxW(NULL, &info, pvar->ts->UILanguageFileW, err_str, fname);
+			free(fname);
+			free(err_str);
 			goto error;
 		}
 
@@ -4276,14 +4313,18 @@
 
 		if (dstfile == NULL || dstfile[0] == '\0') { // local file path is empty.
 			char *fn;
-			char FileDirExpanded[MAX_PATH];
+			wchar_t *FileDirExpanded;
+			char *FileDirExpandedU8;
 
 			fn = strrchr(sendfile, '/');
 			if (fn && fn[1] == '\0')
 				goto error;
 
-			ExpandEnvironmentStrings(pvar->ts->FileDir, FileDirExpanded, sizeof(FileDirExpanded));
-			_snprintf_s(c->scp.localfilefull, sizeof(c->scp.localfilefull), _TRUNCATE, "%s\\%s", FileDirExpanded, fn ? fn : sendfile);
+			hExpandEnvironmentStringsW(pvar->ts->FileDirW, &FileDirExpanded);
+			FileDirExpandedU8 = ToU8W(FileDirExpanded);
+			_snprintf_s(c->scp.localfilefull, sizeof(c->scp.localfilefull), _TRUNCATE, "%s\\%s", FileDirExpandedU8, fn ? fn : sendfile);
+			free(FileDirExpanded);
+			free(FileDirExpandedU8);
 			ExtractFileName(c->scp.localfilefull, c->scp.localfile, sizeof(c->scp.localfile));   // file name only
 		} else {
 			_snprintf_s(c->scp.localfilefull, sizeof(c->scp.localfilefull), _TRUNCATE, "%s", dstfile);
@@ -4290,48 +4331,49 @@
 			ExtractFileName(dstfile, c->scp.localfile, sizeof(c->scp.localfile));   // file name only
 		}
 
-		if (_access(c->scp.localfilefull, 0x00) == 0) {
-			char buf[512];
+		if (accessU8(c->scp.localfilefull, 0x00) == 0) {
 			int dlgresult;
-			if (_access(c->scp.localfilefull, 0x02) == -1) { // 0x02 == writable
-				UTIL_get_lang_msg("MSG_SSH_SCP_FILEOPEN_READONLY_ERROR", pvar,
-				                  "`%s' file is read only.");
-				_snprintf_s(buf, sizeof(buf), _TRUNCATE, pvar->UIMsg, c->scp.localfilefull);
-				UTIL_get_lang_msg("MSG_SSH_SCP_FILEOPEN_ERROR_TITLE", pvar,
-				                  "TTSSH: file open error");
-				MessageBox(NULL, buf, pvar->UIMsg, MB_OK | MB_ICONERROR);
+			if (accessU8(c->scp.localfilefull, 0x02) == -1) { // 0x02 == writable
+				static const TTMessageBoxInfoW info = {
+					"TTSSH",
+					"MSG_SSH_SCP_FILEOPEN_ERROR_TITLE", L"TTSSH: file open error",
+					"MSG_SSH_SCP_FILEOPEN_READONLY_ERROR", L"`%s' file is read only.",
+					MB_OK | MB_ICONERROR
+				};
+				wchar_t *fname = ToWcharU8(c->scp.localfilefull);
+				TTMessageBoxW(NULL, &info, pvar->ts->UILanguageFileW, fname);
+				free(fname);
 				goto error;
 			}
-			UTIL_get_lang_msg("MSG_SSH_SCP_FILEOPEN_OVERWRITE_CONFIRM", pvar,
-			                  "`%s' file exists.\noverwrite it?");
-			_snprintf_s(buf, sizeof(buf), _TRUNCATE, pvar->UIMsg, c->scp.localfilefull);
-			UTIL_get_lang_msg("MSG_SSH_SCP_CONFIRM_TITLE", pvar,
-			                  "TTSSH: confirm");
-			dlgresult = MessageBox(NULL, buf, pvar->UIMsg, MB_YESNO | MB_ICONQUESTION);
+			static const TTMessageBoxInfoW info = {
+				"TTSSH",
+				"MSG_SSH_SCP_CONFIRM_TITLE", L"TTSSH: confirm",
+				"MSG_SSH_SCP_FILEOPEN_OVERWRITE_CONFIRM", L"`%s' file exists.\noverwrite it?",
+				MB_YESNO | MB_ICONQUESTION
+			};
+			wchar_t *fname = ToWcharU8(c->scp.localfilefull);
+			dlgresult = TTMessageBoxW(NULL, &info, pvar->ts->UILanguageFileW, fname);
+			free(fname);
 			if (dlgresult == IDNO) {
 				goto error;
 			}
 		}
 
-		fp = fopen(c->scp.localfilefull, "wb");
+		fp = fopenU8(c->scp.localfilefull, "wb");
 		if (fp == NULL) {
-			char buf[1024];
-			int len;
-			UTIL_get_lang_msg("MSG_SSH_SCP_FILEOPEN_WRITE_ERROR", pvar,
-			                  "Can't open file for writing:");
-			_snprintf_s(buf, sizeof(buf), _TRUNCATE, "%s ", pvar->UIMsg);
-			len = strlen(buf);
-			FormatMessage(
-			    FORMAT_MESSAGE_FROM_SYSTEM,
-			    NULL,
-			    GetLastError(),
-			    0,
-			    buf+len,
-			    sizeof(buf)-len,
-			    NULL);
-			UTIL_get_lang_msg("MSG_SSH_SCP_FILEOPEN_ERROR_TITLE", pvar,
-			                  "TTSSH: file open error");
-			MessageBox(NULL, buf, pvar->UIMsg, MB_OK | MB_ICONERROR);
+			static const TTMessageBoxInfoW info = {
+				"TTSSH",
+				"MSG_SSH_SCP_FILEOPEN_ERROR_TITLE", L"TTSSH: file open error",
+				"MSG_SSH_SCP_FILEOPEN_WRITE_ERROR", L"Can't open file for writing: %s %s",
+				MB_OK | MB_ICONERROR
+			};
+			DWORD error = GetLastError();
+			wchar_t *err_str;
+			hFormatMessageW(error, &err_str);
+			wchar_t *fname = ToWcharU8(c->scp.localfilefull);
+			TTMessageBoxW(NULL, &info, pvar->ts->UILanguageFileW, err_str, fname);
+			free(fname);
+			free(err_str);
 			goto error;
 		}
 
@@ -4342,21 +4384,28 @@
 	c->scp.dir = direction;
 	c->scp.state = SCP_INIT;
 
-	// session open
-	msg = buffer_init();
-	if (msg == NULL) {
-		goto error;
+	{
+		buffer_t *msg;
+		char *s;
+		unsigned char *outmsg;
+		int len;
+
+		// session open
+		msg = buffer_init();
+		if (msg == NULL) {
+			goto error;
+		}
+		s = "session";
+		buffer_put_string(msg, s, strlen(s));  // ctype
+		buffer_put_int(msg, c->self_id);  // self(channel number)
+		buffer_put_int(msg, c->local_window);  // local_window
+		buffer_put_int(msg, c->local_maxpacket);  // local_maxpacket
+		len = buffer_len(msg);
+		outmsg = begin_send_packet(pvar, SSH2_MSG_CHANNEL_OPEN, len);
+		memcpy(outmsg, buffer_ptr (msg), len);
+		finish_send_packet(pvar);
+		buffer_free(msg);
 	}
-	s = "session";
-	buffer_put_string(msg, s, strlen(s));  // ctype
-	buffer_put_int(msg, c->self_id);  // self(channel number)
-	buffer_put_int(msg, c->local_window);  // local_window
-	buffer_put_int(msg, c->local_maxpacket);  // local_maxpacket
-	len = buffer_len(msg);
-	outmsg = begin_send_packet(pvar, SSH2_MSG_CHANNEL_OPEN, len);
-	memcpy(outmsg, buffer_ptr (msg), len);
-	finish_send_packet(pvar);
-	buffer_free(msg);
 
 	g_scp_sending = TRUE;
 
@@ -7426,7 +7475,8 @@
 
 BOOL handle_SSH2_userauth_passwd_changereq(PTInstVar pvar)
 {
-	int len, ret;
+	int len;
+	INT_PTR ret;
 	char *data;
 	buffer_t *msg = NULL;
 	char *s, *username;
@@ -8094,7 +8144,7 @@
 	size_t buflen;
 } scp_dlg_parm_t;
 
-static LRESULT CALLBACK ssh_scp_dlg_proc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
+static INT_PTR CALLBACK ssh_scp_dlg_proc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
 {
 	static int closed = 0;
 
@@ -8181,21 +8231,13 @@
 		return 0;
 }
 
-/* dlglib \x82ɑS\x82\xAD\x93\xAF\x82\xB6\x82\xE0\x82̂\xAA\x82\xA0\x82\xE9\x82̂ł\xBB\x82\xBF\x82\xE7\x82𗘗p\x82\xB7\x82\xE9 */
-#if 0
-void InitDlgProgress(HWND HDlg, int id_Progress, int *CurProgStat) {
-	HWND HProg;
-	HProg = GetDlgItem(HDlg, id_Progress);
-
-	*CurProgStat = 0;
-
-	SendMessage(HProg, PBM_SETRANGE, (WPARAM)0, MAKELPARAM(0, 100));
-	SendMessage(HProg, PBM_SETSTEP, (WPARAM)1, 0);
-	SendMessage(HProg, PBM_SETPOS, (WPARAM)0, 0);
-
-	return;
+static BOOL SetDlgItemTextU8(HWND hDlg, int nIDDlgItem, const char *strU8)
+{
+	wchar_t *strW = ToWcharU8(strU8);
+	BOOL retval = SetDlgItemTextW(hDlg, nIDDlgItem, strW);
+	free(strW);
+	return retval;
 }
-#endif
 
 static unsigned __stdcall ssh_scp_thread(void *p)
 {
@@ -8215,8 +8257,7 @@
 	buflen = min(c->remote_window, 8192*4); // max 32KB
 	buf = malloc(buflen);
 
-	//SendMessage(GetDlgItem(hWnd, IDC_FILENAME), WM_SETTEXT, 0, (LPARAM)c->scp.localfile);
-	SendMessage(GetDlgItem(hWnd, IDC_FILENAME), WM_SETTEXT, 0, (LPARAM)c->scp.localfilefull);
+	SetDlgItemTextU8(hWnd, IDC_FILENAME, c->scp.localfilefull);
 
 	InitDlgProgress(hWnd, IDC_PROGBAR, &ProgStat);
 
@@ -8351,8 +8392,8 @@
 		HANDLE thread;
 		unsigned int tid;
 
-		hDlgWnd = CreateDialog(hInst, MAKEINTRESOURCE(IDD_SSHSCP_PROGRESS),
-		                       pvar->cv->HWin, (DLGPROC)ssh_scp_dlg_proc);
+		hDlgWnd = TTCreateDialog(hInst, MAKEINTRESOURCE(IDD_SSHSCP_PROGRESS),
+								 pvar->cv->HWin, ssh_scp_dlg_proc);
 		if (hDlgWnd != NULL) {
 			static const DlgTextInfo text_info[] = {
 				{ 0, "DLG_SCP_PROGRESS_TITLE_SENDFILE" },
@@ -8697,8 +8738,8 @@
 
 			// \x90i\x92\xBB\x83E\x83B\x83\x93\x83h\x83E
 			c->scp.pvar = pvar;
-			hDlgWnd = CreateDialog(hInst, MAKEINTRESOURCE(IDD_SSHSCP_PROGRESS),
-			                       pvar->cv->HWin, (DLGPROC)ssh_scp_dlg_proc);
+			hDlgWnd = TTCreateDialog(hInst, MAKEINTRESOURCE(IDD_SSHSCP_PROGRESS),
+									 pvar->cv->HWin, ssh_scp_dlg_proc);
 			if (hDlgWnd != NULL) {
 				static const DlgTextInfo text_info[] = {
 					{ 0, "DLG_SCP_PROGRESS_TITLE_RECEIVEFILE" },
@@ -8709,7 +8750,7 @@
 				SetI18nDlgStrsW(hDlgWnd, "TTSSH", text_info, _countof(text_info), pvar->ts->UILanguageFileW);
 
 				c->scp.progress_window = hDlgWnd;
-				SendMessage(GetDlgItem(hDlgWnd, IDC_FILENAME), WM_SETTEXT, 0, (LPARAM)c->scp.localfilefull);
+				SetDlgItemTextU8(hDlgWnd, IDC_FILENAME, c->scp.localfilefull);
 				ShowWindow(hDlgWnd, SW_SHOW);
 			}
 
@@ -8830,7 +8871,7 @@
 error:
 	{  // error
 		char msg[2048];
-		unsigned int i, max;
+		unsigned int max;
 		int offset, resp;
 
 		resp = data[0];
@@ -8843,14 +8884,12 @@
 			offset = 0;
 		}
 
-		if (buflen > sizeof(msg))
-			max = sizeof(msg);
+		if (buflen > sizeof(msg) - 1)
+			max = sizeof(msg) - 1;
 		else
 			max = buflen - offset;
-		for (i = 0 ; i < max ; i++) {
-			msg[i] = data[i + offset];
-		}
-		msg[i] = '\0';
+		memcpy(msg, &data[offset], max);
+		msg[max] = '\0';
 
 		// \x82悭\x95\xAA\x82\xA9\x82\xE7\x82Ȃ\xA2\x83G\x83\x89\x81[\x82̏ꍇ\x82́A\x8E\xA9\x90g\x82Ń`\x83\x83\x83l\x83\x8B\x82\xF0\x83N\x83\x8D\x81[\x83Y\x82\xB7\x82\xE9\x81B
 		// .bashrc \x82\xC9"stty stop undef"\x82\xAA\x92\xE8\x8B`\x82\xB3\x82\xEA\x82Ă\xA2\x82\xE9\x82ƁATTSSH\x82\xAA\x97\x8E\x82\xBF\x82\xE9\x96\xE2\x91\xE8\x82ւ̎b\x92菈\x92u\x81B
@@ -8863,9 +8902,12 @@
 			//ssh2_channel_send_close(pvar, c);
 		}
 
-		UTIL_get_lang_msg("MSG_SSH_SCP_ERROR_TITLE", pvar,
-		                  "TTSSH: SCP error");
-		MessageBox(NULL, msg, pvar->UIMsg, MB_OK | MB_ICONEXCLAMATION);
+		wchar_t uimsgW[MAX_UIMSG];
+		UTIL_get_lang_msgW("MSG_SSH_SCP_ERROR_TITLE", pvar,
+						   L"TTSSH: SCP error", uimsgW);
+		wchar_t *msgW = ToWcharU8(msg);
+		MessageBoxW(pvar->cv->HWin, msgW, uimsgW, MB_OK | MB_ICONEXCLAMATION);
+		free(msgW);
 	}
 }
 

Modified: trunk/ttssh2/ttxssh/ssh.h
===================================================================
--- trunk/ttssh2/ttxssh/ssh.h	2023-10-21 15:16:14 UTC (rev 11020)
+++ trunk/ttssh2/ttxssh/ssh.h	2023-10-22 04:13:04 UTC (rev 11021)
@@ -480,7 +480,7 @@
 int SSH_start_scp(PTInstVar pvar, char *sendfile, char *dstfile);
 int SSH_scp_sending_status(void);
 int SSH_start_scp_receive(PTInstVar pvar, char *filename);
-int SSH_scp_transaction(PTInstVar pvar, char *sendfile, char *dstfile, enum scp_dir direction);
+int SSH_scp_transaction(PTInstVar pvar, const char *sendfile, const char *dstfile, enum scp_dir direction);
 int SSH_sftp_transaction(PTInstVar pvar);
 
 /* auxiliary SSH2 interfaces for pkt.c */

Modified: trunk/ttssh2/ttxssh/ttxssh.c
===================================================================
--- trunk/ttssh2/ttxssh/ttxssh.c	2023-10-21 15:16:14 UTC (rev 11020)
+++ trunk/ttssh2/ttxssh/ttxssh.c	2023-10-22 04:13:04 UTC (rev 11021)
@@ -104,6 +104,7 @@
 #include "win32helper.h"
 #include "comportinfo.h"
 #include "asprintf.h"
+#include "ttcommdlg.h"
 
 #include "libputty.h"
 
@@ -3283,6 +3284,28 @@
 	return (datalength); // success
 }
 
+/**
+ *	SCP\x82̃p\x83X\x82\xF0\x95ۑ\xB6\x82\xB7\x82\xE9
+ *
+ *	TODO
+ *	- ts\x82ɏ\x91\x82\xAB\x96߂\xB5\x82Ă\xB5\x82܂\xC1\x82Ă悢?
+ *	- Unicode\x89\xBB\x82\xB7\x82\xE9
+ */
+static void SavePaths(HWND dlg, TTTSet *pts)
+{
+	// \x91\x97\x90M\x83p\x83X\x82\xF0 ts->ScpSendDir \x82ɕۑ\xB6
+	char sendfiledir[MAX_PATH];
+	GetDlgItemTextA(dlg, IDC_SENDFILE_TO, sendfiledir, _countof(sendfiledir));
+	strncpy_s(pts->ScpSendDir, sizeof(pts->ScpSendDir), sendfiledir, _TRUNCATE);
+
+#if 0
+	// \x8E\xF3\x90M\x83p\x83X\x82\xF0 ts->FileDir \x82ɕۑ\xB6
+	char recvdir[MAX_PATH];
+	GetDlgItemTextA(dlg, IDC_RECVFILE_TO, recvdir, _countof(recvdir));
+	strncpy_s(pvar->ts->FileDir, sizeof(pvar->ts->FileDir), recvdir, _TRUNCATE);
+#endif
+}
+
 //
 // SCP dialog
 //
@@ -3289,45 +3312,28 @@
 static INT_PTR CALLBACK TTXScpDialog(HWND dlg, UINT msg, WPARAM wParam,
                                      LPARAM lParam)
 {
-	static char sendfile[MAX_PATH] = "";
-	static char sendfiledir[MAX_PATH] = "";
-	static char recvdir[MAX_PATH] = "";
-	HWND hWnd;
-	HDROP hDrop;
-	UINT uFileNo;
-	char szFileName[256];
-	int i;
-
 	switch (msg) {
-	case WM_INITDIALOG:
-		{
-			static const DlgTextInfo text_info[] = {
-				{ 0, "DLG_SCP_TITLE" },
-				{ IDC_SENDFILE_FROM_LABEL, "DLG_SCP_SENDFILE_FROM" },
-				{ IDC_SENDFILE_TO_LABEL, "DLG_SCP_SENDFILE_TO" },
-				{ IDC_SENDFILE_NOTE, "DLG_SCP_SENDFILE_DRAG" },
-				{ IDOK, "DLG_SCP_SENDFILE_SEND" },
-				{ IDCANCEL, "DLG_SCP_SENDFILE_CANCEL" },
-				{ IDC_RECEIVEFILE_FROM_LABEL, "DLG_SCP_RECEIVEFILE_FROM" },
-				{ IDC_RECVFILE_TO_LABEL, "DLG_SCP_RECEIVEFILE_TO" },
-				{ IDC_RECV, "DLG_SCP_RECEIVEFILE_RECEIVE" },
-			};
-			SetI18nDlgStrsW(dlg, "TTSSH", text_info, _countof(text_info), pvar->ts->UILanguageFileW);
-		}
+	case WM_INITDIALOG: {
+		static const DlgTextInfo text_info[] = {
+			{ 0, "DLG_SCP_TITLE" },
+			{ IDC_SENDFILE_FROM_LABEL, "DLG_SCP_SENDFILE_FROM" },
+			{ IDC_SENDFILE_TO_LABEL, "DLG_SCP_SENDFILE_TO" },
+			{ IDC_SENDFILE_NOTE, "DLG_SCP_SENDFILE_DRAG" },
+			{ IDOK, "DLG_SCP_SENDFILE_SEND" },
+			{ IDCANCEL, "DLG_SCP_SENDFILE_CANCEL" },
+			{ IDC_RECEIVEFILE_FROM_LABEL, "DLG_SCP_RECEIVEFILE_FROM" },
+			{ IDC_RECVFILE_TO_LABEL, "DLG_SCP_RECEIVEFILE_TO" },
+			{ IDC_RECV, "DLG_SCP_RECEIVEFILE_RECEIVE" },
+		};
+		SetI18nDlgStrsW(dlg, "TTSSH", text_info, _countof(text_info), pvar->ts->UILanguageFileW);
 
 		DragAcceptFiles(dlg, TRUE);
 
 		// SCP\x83t\x83@\x83C\x83\x8B\x91\x97\x90M\x90\xE6\x82\xF0\x95\\x8E\xA6\x82\xB7\x82\xE9
-		if (sendfiledir[0] == '\0') {
-			_snprintf_s(sendfiledir, sizeof(sendfiledir), _TRUNCATE, pvar->ts->ScpSendDir); // home directory
-		}
-		SendMessage(GetDlgItem(dlg, IDC_SENDFILE_TO), WM_SETTEXT, 0, (LPARAM)sendfiledir);
+		SetDlgItemTextA(dlg, IDC_SENDFILE_TO, pvar->ts->ScpSendDir);
 
 		// SCP\x83t\x83@\x83C\x83\x8B\x8E\xF3\x90M\x90\xE6\x82\xF0\x95\\x8E\xA6\x82\xB7\x82\xE9
-		if (recvdir[0] == '\0') {
-			_snprintf_s(recvdir, sizeof(recvdir), _TRUNCATE, "%s", pvar->ts->FileDir);
-		}
-		SendMessage(GetDlgItem(dlg, IDC_RECVFILE_TO), WM_SETTEXT, 0, (LPARAM)recvdir);
+		SetDlgItemTextW(dlg, IDC_RECVFILE_TO, pvar->ts->FileDirW);
 
 #ifdef SFTP_DEBUG
 		ShowWindow(GetDlgItem(dlg, IDC_SFTP_TEST), SW_SHOW);
@@ -3335,126 +3341,109 @@
 		CenterWindow(dlg, GetParent(dlg));
 
 		return TRUE;
+	}
 
-	case WM_DROPFILES:
-		{
-		hDrop = (HDROP)wParam;
-		uFileNo = DragQueryFile((HDROP)wParam, 0xFFFFFFFF, NULL, 0);
-		for(i = 0; i < (int)uFileNo; i++) {
-			DragQueryFile(hDrop, i, szFileName, sizeof(szFileName));
-
+	case WM_DROPFILES: {
+		HDROP hDrop = (HDROP)wParam;
+		UINT uFileNo = DragQueryFile((HDROP)wParam, 0xFFFFFFFF, NULL, 0);
+		if (uFileNo > 0) {
+			const UINT len = DragQueryFileW(hDrop, 0, NULL, 0);
+			if (len == 0) {
+				DragFinish(hDrop);
+				return TRUE;
+			}
+			wchar_t *filename = (wchar_t *)malloc(sizeof(wchar_t) * (len + 1));
+			DragQueryFileW(hDrop, 0, filename, len + 1);
+			filename[len] = '\0';
 			// update edit box
-			hWnd = GetDlgItem(dlg, IDC_SENDFILE_EDIT);
-			SendMessage(hWnd, WM_SETTEXT , 0, (LPARAM)szFileName);
+			SetDlgItemTextW(dlg, IDC_SENDFILE_EDIT, filename);
+			free(filename);
 		}
 		DragFinish(hDrop);
-		}
 		return TRUE;
+	}
 
 	case WM_COMMAND:
 		switch (wParam) {
-		case IDC_SENDFILE_SELECT | (BN_CLICKED << 16):
-			{
-			OPENFILENAME ofn;
+		case IDC_SENDFILE_SELECT | (BN_CLICKED << 16): {
+			TTOPENFILENAMEW ofn = {0};
 
-			ZeroMemory(&ofn, sizeof(ofn));
-			ofn.lStructSize = get_OPENFILENAME_SIZE();
 			ofn.hwndOwner = dlg;
 #if 0
 			get_lang_msg("FILEDLG_SELECT_LOGVIEW_APP_FILTER", ts.UIMsg, sizeof(ts.UIMsg),
 			             "exe(*.exe)\\0*.exe\\0all(*.*)\\0*.*\\0\\0", ts.UILanguageFile);
 #endif
-			ofn.lpstrFilter = "all(*.*)\0*.*\0\0";
-			ofn.lpstrFile = sendfile;
-			ofn.nMaxFile = sizeof(sendfile);
-#if 0
-			get_lang_msg("FILEDLG_SELECT_LOGVIEW_APP_TITLE", uimsg, sizeof(uimsg),
-			             "Choose a executing file with launching logging file", ts.UILanguageFile);
-#endif
+			ofn.lpstrFilter = L"all(*.*)\0*.*\0\0";
 			UTIL_get_lang_msg("DLG_SCP_SELECT_FILE_TITLE", pvar,
 			                  "Choose a sending file with SCP");
-			ofn.lpstrTitle = pvar->UIMsg;
-
+			wchar_t *UIMsgW;
+			GetI18nStrWW("TTSSH", "DLG_SCP_SELECT_FILE_TITLE", L"Choose a sending file with SCP", pvar->ts->UILanguageFileW, &UIMsgW);
+			ofn.lpstrTitle = UIMsgW;
 			ofn.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
 			ofn.Flags |= OFN_FORCESHOWHIDDEN;
-			if (GetOpenFileName(&ofn) != 0) {
-				hWnd = GetDlgItem(dlg, IDC_SENDFILE_EDIT);
-				SendMessage(hWnd, WM_SETTEXT , 0, (LPARAM)sendfile);
+			wchar_t *filename;
+			if (TTGetOpenFileNameW(&ofn, &filename)) {
+				SetDlgItemTextW(dlg, IDC_SENDFILE_EDIT, filename);
+				free(filename);
 			}
-			}
+			free(UIMsgW);
+
 			return TRUE;
-		case IDC_RECVDIR_SELECT | (BN_CLICKED << 16):
-			{
-			wchar_t *buf, *buf2, uimsg[MAX_UIMSG];
-			hGetDlgItemTextW(dlg, IDC_RECVFILE_TO, &buf);
+		}
+		case IDC_RECVDIR_SELECT | (BN_CLICKED << 16): {
+			wchar_t *cur_dir, *new_dir, uimsg[MAX_UIMSG];
+			hGetDlgItemTextW(dlg, IDC_RECVFILE_TO, &cur_dir);
 			UTIL_get_lang_msgW("DLG_SCP_SELECT_DEST_TITLE", pvar,
 			                   L"Choose destination directory", uimsg);
-			if (doSelectFolderW(dlg, buf, uimsg, &buf2)) {
-				WideCharToACP_t(buf2, recvdir, sizeof(recvdir));
-				SetDlgItemTextA(dlg, IDC_RECVFILE_TO, recvdir);
-				free(buf2);
+			if (doSelectFolderW(dlg, cur_dir, uimsg, &new_dir)) {
+				SetDlgItemTextW(dlg, IDC_RECVFILE_TO, new_dir);
+				free(new_dir);
 			}
-			free(buf);
+			free(cur_dir);
 			}
 			return TRUE;
 		}
 
 		switch (LOWORD(wParam)) {
-		case IDOK:  // \x83t\x83@\x83C\x83\x8B\x91\x97\x90M
-			hWnd = GetDlgItem(dlg, IDC_SENDFILE_EDIT);
-			SendMessage(hWnd, WM_GETTEXT , sizeof(sendfile), (LPARAM)sendfile);
-			if (sendfile[0] != '\0') {
-				// \x91\x97\x90M\x83p\x83X\x82\xF0\x8E\xE6\x82\xE8\x8Fo\x82\xB5\x81Ats->ScpSendDir \x82\xE0\x8D\x87\x82킹\x82čX\x90V\x82\xB7\x82\xE9\x81B
-				hWnd = GetDlgItem(dlg, IDC_SENDFILE_TO);
-				SendMessage(hWnd, WM_GETTEXT , sizeof(sendfiledir), (LPARAM)sendfiledir);
-				strncpy_s(pvar->ts->ScpSendDir, sizeof(pvar->ts->ScpSendDir), sendfiledir, _TRUNCATE);
+		case IDOK: {  // \x83t\x83@\x83C\x83\x8B\x91\x97\x90M
+			wchar_t *filenameW;
+			hGetDlgItemTextW(dlg, IDC_SENDFILE_EDIT, &filenameW);
+			if (filenameW != NULL) {
+				// \x91\x97\x90M\x83p\x83X
+				wchar_t *sendfiledirW;
+				hGetDlgItemTextW(dlg, IDC_SENDFILE_TO, &sendfiledirW);
 
-				// \x8E\xF3\x90M\x83p\x83X\x82\xF0\x8E\xE6\x82\xE8\x8Fo\x82\xB5\x81Ats->FileDir \x82\xE0\x8D\x87\x82킹\x82čX\x90V\x82\xB7\x82\xE9\x81B
-				hWnd = GetDlgItem(dlg, IDC_RECVFILE_TO);
-				SendMessage(hWnd, WM_GETTEXT , sizeof(recvdir), (LPARAM)recvdir);
-				strncpy_s(pvar->ts->FileDir, sizeof(pvar->ts->FileDir), recvdir, _TRUNCATE);
+				char *sendfiledirU8 = ToU8W(sendfiledirW);
+				char *filenameU8 = ToU8W(filenameW);
+				SSH_start_scp(pvar, filenameU8, sendfiledirU8);
+				//SSH_scp_transaction(pvar, "bigfile30.bin", "", FROMREMOTE);
+				free(filenameU8);
+				free(sendfiledirU8);
+				free(sendfiledirW);
+				free(filenameW);
 
-				SSH_start_scp(pvar, sendfile, sendfiledir);
-				//SSH_scp_transaction(pvar, "bigfile30.bin", "", FROMREMOTE);
+				SavePaths(dlg, pvar->ts);
+
 				EndDialog(dlg, 1); // dialog close
 				return TRUE;
 			}
 			return FALSE;
+		}
 
-		case IDCANCEL:
-			// \x91\x97\x90M\x83p\x83X\x82\xF0\x8E\xE6\x82\xE8\x8Fo\x82\xB5\x81Ats->ScpSendDir \x82\xE0\x8D\x87\x82킹\x82čX\x90V\x82\xB7\x82\xE9\x81B
-			hWnd = GetDlgItem(dlg, IDC_SENDFILE_TO);
-			SendMessage(hWnd, WM_GETTEXT , sizeof(sendfiledir), (LPARAM)sendfiledir);
-			strncpy_s(pvar->ts->ScpSendDir, sizeof(pvar->ts->ScpSendDir), sendfiledir, _TRUNCATE);
+		case IDCANCEL: {
+			SavePaths(dlg, pvar->ts);
 
-			// \x8E\xF3\x90M\x83p\x83X\x82\xF0\x8E\xE6\x82\xE8\x8Fo\x82\xB5\x81Ats->FileDir \x82\xE0\x8D\x87\x82킹\x82čX\x90V\x82\xB7\x82\xE9\x81B
-			hWnd = GetDlgItem(dlg, IDC_RECVFILE_TO);
-			SendMessage(hWnd, WM_GETTEXT , sizeof(recvdir), (LPARAM)recvdir);
-			strncpy_s(pvar->ts->FileDir, sizeof(pvar->ts->FileDir), recvdir, _TRUNCATE);
-
 			EndDialog(dlg, 0); // dialog close
 			return TRUE;
+		}
 
-		case IDC_RECV:  // \x83t\x83@\x83C\x83\x8B\x8E\xF3\x90M
-			hWnd = GetDlgItem(dlg, IDC_RECVFILE);
-			SendMessage(hWnd, WM_GETTEXT , sizeof(szFileName), (LPARAM)szFileName);
-			if (szFileName[0] != '\0') {
-				char recvpath[MAX_PATH] = "";
-				char* fn = strrchr(szFileName, '/');
-				char recvfn[sizeof(szFileName)];
-				char recvdir_expanded[MAX_PATH];
-
-				// \x91\x97\x90M\x83p\x83X\x82\xF0\x8E\xE6\x82\xE8\x8Fo\x82\xB5\x81Ats->ScpSendDir \x82\xE0\x8D\x87\x82킹\x82čX\x90V\x82\xB7\x82\xE9\x81B
-				hWnd = GetDlgItem(dlg, IDC_SENDFILE_TO);
-				SendMessage(hWnd, WM_GETTEXT , sizeof(sendfiledir), (LPARAM)sendfiledir);
-				strncpy_s(pvar->ts->ScpSendDir, sizeof(pvar->ts->ScpSendDir), sendfiledir, _TRUNCATE);
-
-				// \x8E\xF3\x90M\x83p\x83X\x82\xF0\x8E\xE6\x82\xE8\x8Fo\x82\xB5\x81Ats->FileDir \x82\xE0\x8D\x87\x82킹\x82čX\x90V\x82\xB7\x82\xE9\x81B
-				hWnd = GetDlgItem(dlg, IDC_RECVFILE_TO);
-				SendMessage(hWnd, WM_GETTEXT , sizeof(recvdir), (LPARAM)recvdir);
-				ExpandEnvironmentStrings(recvdir, recvdir_expanded, sizeof(recvdir_expanded));
-				strncpy_s(pvar->ts->FileDir, sizeof(pvar->ts->FileDir), recvdir, _TRUNCATE);
-
+		case IDC_RECV: {
+			// \x83t\x83@\x83C\x83\x8B\x8E\xF3\x90M
+			wchar_t *FileNameW;
+			hGetDlgItemTextW(dlg, IDC_RECVFILE, &FileNameW);
+			if (FileNameW != NULL) {
+				// \x8E\xF3\x90M\x83t\x83@\x83C\x83\x8B\x82\xA9\x82\xE7\x83p\x83X\x82\xF0\x8E\xE6\x82菜\x82\xAD
+				wchar_t *fn = wcsrchr(FileNameW, L'/');
 				if (fn) {
 					fn++;
 					if (*fn == '\0') {
@@ -3462,16 +3451,40 @@
 					}
 				}
 				else {
-					fn = szFileName;
+					fn = FileNameW;
 				}
-				strncpy_s(recvfn, sizeof(recvfn), fn, _TRUNCATE);
-				replaceInvalidFileNameChar(recvfn, '_');
-				_snprintf_s(recvpath, sizeof(recvpath), _TRUNCATE, "%s\\%s", recvdir_expanded, recvfn);
-				SSH_scp_transaction(pvar, szFileName, recvpath, FROMREMOTE);
+				wchar_t *recvfn = replaceInvalidFileNameCharW(fn, '_');
+
+				// \x8E\xF3\x90M\x83p\x83X
+				wchar_t *recvdirW;
+				hGetDlgItemTextW(dlg, IDC_RECVFILE_TO, &recvdirW);
+				wchar_t *recvdir_expanded;
+				hExpandEnvironmentStringsW(recvdirW, &recvdir_expanded);
+
+				wchar_t *recvpathW;
+				if (recvdir_expanded[0] != 0) {
+					aswprintf(&recvpathW, L"%s\\%s", recvdir_expanded, recvfn);
+				} else {
+					recvpathW = _wcsdup(recvfn);
+				}
+				char *recvpathU8 = ToU8W(recvpathW);
+				char *FileNameU8 = ToU8W(FileNameW);
+				SSH_scp_transaction(pvar, FileNameU8, recvpathU8, FROMREMOTE);
+				free(FileNameW);
+				free(recvfn);
+				free(recvdirW);
+				free(recvdir_expanded);
+				free(recvpathW);
+				free(recvpathU8);
+				free(FileNameU8);
+
+				SavePaths(dlg, pvar->ts);
+
 				EndDialog(dlg, 1); // dialog close
 				return TRUE;
 			}
 			return FALSE;
+		}
 
 		case IDC_SFTP_TEST:
 			SSH_sftp_transaction(pvar);


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