From svnnotify @ sourceforge.jp Thu Apr 1 22:07:20 2010
From: svnnotify @ sourceforge.jp (svnnotify @ sourceforge.jp)
Date: Thu, 01 Apr 2010 22:07:20 +0900
Subject: [Ttssh2-commit] =?utf-8?b?WzM4MzVdIFZUUG9zLyBURUtQb3Mg44Gu6Kqs?=
=?utf-8?b?5piO44KS6L+95Yqg44CC?=
Message-ID: <1270127240.214495.4348.nullmailer@users.sourceforge.jp>
Revision: 3835
http://sourceforge.jp/projects/ttssh2/svn/view?view=rev&revision=3835
Author: doda
Date: 2010-04-01 22:07:20 +0900 (Thu, 01 Apr 2010)
Log Message:
-----------
VTPos/TEKPos ??????菴遵???# 罔????┃絎?????荐?????絖??????????????
Modified Paths:
--------------
trunk/doc/en/html/setup/teraterm-win.html
trunk/doc/en/html/setup/teraterm.html
trunk/doc/ja/html/setup/teraterm-win.html
trunk/doc/ja/html/setup/teraterm.html
-------------- next part --------------
Modified: trunk/doc/en/html/setup/teraterm-win.html
===================================================================
--- trunk/doc/en/html/setup/teraterm-win.html 2010-03-31 13:59:33 UTC (rev 3834)
+++ trunk/doc/en/html/setup/teraterm-win.html 2010-04-01 13:07:20 UTC (rev 3835)
@@ -485,6 +485,36 @@
+
+
+
+
+VTPos=200,100
+
+
+
+
+
+Default:
+VTPos=-2147483648,-2147483648
+TEKPos=-2147483648,-2147483648
+
+
+
Tera Term does not save the window position when "Save setup" was called.
Modified: trunk/doc/en/html/setup/teraterm.html
===================================================================
--- trunk/doc/en/html/setup/teraterm.html 2010-03-31 13:59:33 UTC (rev 3834)
+++ trunk/doc/en/html/setup/teraterm.html 2010-04-01 13:07:20 UTC (rev 3835)
@@ -63,6 +63,7 @@
Eterm lookfeel window
How to scroll the screen when the window size is maximized
Display the cursor even if the window comes out of focus
+ Fix the initial window position
Save the window position
Change the window icon
Modified: trunk/doc/ja/html/setup/teraterm-win.html
===================================================================
--- trunk/doc/ja/html/setup/teraterm-win.html 2010-03-31 13:59:33 UTC (rev 3834)
+++ trunk/doc/ja/html/setup/teraterm-win.html 2010-04-01 13:07:20 UTC (rev 3835)
@@ -502,6 +502,36 @@
+
+
+?????????u??????????????? [Tera Term] ?????? VTPos ?(VT?????) ??? TEKPos ?(TEK?????) ?????????
+????VT?????????u???????? 200 ??????[?? 100 ?????????????A????????????
+
+
+
+VTPos=200,100
+
+
+
+???????????????u???????Windows ???????????????
+
+
+
+VTPos=-2147483648,-2147483648
+TEKPos=-2147483648,-2147483648
+
+
+
+?: ??/a>?????SaveVTPosWinPos ? on ????????"Save setup" ?タ????? VT ??????????? VTPos ??????????????????????B
+
+
+
+???
+VTPos=-2147483648,-2147483648
+TEKPos=-2147483648,-2147483648
+
+
+
Tera Term ??"Save setup" ?タ???????????????????????
Modified: trunk/doc/ja/html/setup/teraterm.html
===================================================================
--- trunk/doc/ja/html/setup/teraterm.html 2010-03-31 13:59:33 UTC (rev 3834)
+++ trunk/doc/ja/html/setup/teraterm.html 2010-04-01 13:07:20 UTC (rev 3835)
@@ -65,6 +65,7 @@
Eterm?????????
?????????????????
??????????????????ヲ??
+ ?????????u?????
????????????
??????????????
From svnnotify @ sourceforge.jp Fri Apr 2 00:27:55 2010
From: svnnotify @ sourceforge.jp (svnnotify @ sourceforge.jp)
Date: Fri, 02 Apr 2010 00:27:55 +0900
Subject: [Ttssh2-commit] =?utf-8?b?WzM4MzZdICDjg57jgq/jg63lrp/ooYzkuK0=?=
=?utf-8?b?44Gr44GK44GE44Gm44KC44CBQ29udHJvbCAtIE1hY3Jv44Oh44OL44Ol44O8?=
=?utf-8?b?44KS6YG45oqe44Gn44GN44KL44KI44GG44Gr44GX44CB6Kmy5b2T44GZ44KL?=
=?utf-8?b?44Oe44Kv44Ot44Km44Kj44Oz44OJ44Km44KS44Ki44Kv44OG44Kj44OW5YyW?=
=?utf-8?b?44Gn44GN44KL44KI44GG44Gr44GX44Gf44CC?=
Message-ID: <1270135675.592535.20385.nullmailer@users.sourceforge.jp>
Revision: 3836
http://sourceforge.jp/projects/ttssh2/svn/view?view=rev&revision=3836
Author: yutakapon
Date: 2010-04-02 00:27:55 +0900 (Fri, 02 Apr 2010)
Log Message:
-----------
??????茵?賢?????????Control - Macro?<??ャ???????????????????綵????????????潟?????≪????????с????????????
???????≪????????с???????????丞???????????潟????????с????????????儀??????
statusbox???????≪??????????????????????綽?????障????????若?????潟???localize ??????綽??
Modified Paths:
--------------
trunk/doc/en/html/about/history.html
trunk/doc/ja/html/about/history.html
trunk/teraterm/teraterm/ttdde.c
trunk/teraterm/teraterm/vtwin.cpp
-------------- next part --------------
Modified: trunk/doc/en/html/about/history.html
===================================================================
--- trunk/doc/en/html/about/history.html 2010-04-01 13:07:20 UTC (rev 3835)
+++ trunk/doc/en/html/about/history.html 2010-04-01 15:27:55 UTC (rev 3836)
@@ -30,7 +30,7 @@
-
+
Changes
- added support of VPB and HPB control sequence.
+ added support for the VPB and HPB control sequence.
+ A user can select the Macro of the Control menu while a macro is running, and the macro window is activated when the user selects the menu.
Modified: trunk/doc/ja/html/about/history.html
===================================================================
--- trunk/doc/ja/html/about/history.html 2010-04-01 13:07:20 UTC (rev 3835)
+++ trunk/doc/ja/html/about/history.html 2010-04-01 15:27:55 UTC (rev 3836)
@@ -30,7 +30,7 @@
-
+
??
VPB, HPB ?????????????
+ ???タ????????Control - Macro ???????????????????????????????????????????
Modified: trunk/teraterm/teraterm/ttdde.c
===================================================================
--- trunk/teraterm/teraterm/ttdde.c 2010-04-01 13:07:20 UTC (rev 3835)
+++ trunk/teraterm/teraterm/ttdde.c 2010-04-01 15:27:55 UTC (rev 3836)
@@ -1096,7 +1096,9 @@
// Control menu???????????A????????????A
// ????"ttpmacro"?????????
- if (FName == NULL && Startup == FALSE && ConvH != 0) {
+ // (2010.4.2 yutaka)
+ if ((FName == NULL && Startup == FALSE) && ConvH != 0) {
+#if 0
HWND hwnd;
DWORD pid;
@@ -1104,12 +1106,17 @@
while (hwnd) {
GetWindowThreadProcessId(hwnd, &pid);
if (pid == pi.dwProcessId) {
- BringWindowToTop(hwnd);
- SetForegroundWindow(hwnd);
+ // TODO:
break;
}
hwnd = GetNextWindow(hwnd, GW_HWNDNEXT);
}
+#else
+ ShowWindow(HWndDdeCli, SW_NORMAL);
+ SetForegroundWindow(HWndDdeCli);
+ BringWindowToTop(HWndDdeCli);
+ FlashWindow(HWndDdeCli, TRUE);
+#endif
return;
}
Modified: trunk/teraterm/teraterm/vtwin.cpp
===================================================================
--- trunk/teraterm/teraterm/vtwin.cpp 2010-04-01 13:07:20 UTC (rev 3835)
+++ trunk/teraterm/teraterm/vtwin.cpp 2010-04-01 15:27:55 UTC (rev 3836)
@@ -1367,15 +1367,18 @@
}
if ((ConvH!=0) || (FileVar!=NULL)) {
- // Control - Macro ?????????o?????????#if 1 ????
-#if 0
- EnableMenuItem(ControlMenu,ID_CONTROL_MACRO,MF_BYCOMMAND | MF_ENABLED);
+ // Control - Macro ?????????o???????
+#if 1
+ ModifyMenu(ControlMenu,ID_CONTROL_MACRO,MF_BYCOMMAND, ID_CONTROL_MACRO, "&Macro Running");
+ DrawMenuBar();
#else
EnableMenuItem(ControlMenu,ID_CONTROL_MACRO,MF_BYCOMMAND | MF_GRAYED);
#endif
}
else {
- EnableMenuItem(ControlMenu,ID_CONTROL_MACRO,MF_BYCOMMAND | MF_ENABLED);
+ //EnableMenuItem(ControlMenu,ID_CONTROL_MACRO,MF_BYCOMMAND | MF_ENABLED);
+ ModifyMenu(ControlMenu,ID_CONTROL_MACRO,MF_BYCOMMAND, ID_CONTROL_MACRO, "&Macro");
+ DrawMenuBar();
}
}
From svnnotify @ sourceforge.jp Sun Apr 4 00:39:43 2010
From: svnnotify @ sourceforge.jp (svnnotify @ sourceforge.jp)
Date: Sun, 04 Apr 2010 00:39:43 +0900
Subject: [Ttssh2-commit] =?utf-8?b?WzM4MzddICDjgZnjgafjgavlrp/ooYzkuK0=?=
=?utf-8?b?44Gu44Oe44Kv44Ot44Km44Kj44Oz44OJ44Km44KS44CB5YiG44GL44KK44KE?=
=?utf-8?b?44GZ44GP44OV44Op44OD44K344Ol44GZ44KL44Gf44KB44Gr44CB5paw6KaP?=
=?utf-8?q?=E3=81=AB_Control_-_Show_Macro_Window?=
Message-ID: <1270309183.271143.32596.nullmailer@users.sourceforge.jp>
Revision: 3837
http://sourceforge.jp/projects/ttssh2/svn/view?view=rev&revision=3837
Author: yutakapon
Date: 2010-04-04 00:39:39 +0900 (Sun, 04 Apr 2010)
Log Message:
-----------
??????茵?賢??????????潟?????????????????????ャ??????????荀??Control - Show Macro Window
?<??ャ???申??????
?障??????????莎桁??????statusbox ??????腆冴?????????????????ャ????????????
Modified Paths:
--------------
trunk/teraterm/common/tt_res.h
trunk/teraterm/teraterm/ttdde.c
trunk/teraterm/teraterm/ttermpro.rc
trunk/teraterm/teraterm/vtwin.cpp
trunk/teraterm/teraterm/vtwin.h
-------------- next part --------------
Modified: trunk/teraterm/common/tt_res.h
===================================================================
--- trunk/teraterm/common/tt_res.h 2010-04-01 15:27:55 UTC (rev 3836)
+++ trunk/teraterm/common/tt_res.h 2010-04-03 15:39:39 UTC (rev 3837)
@@ -228,6 +228,7 @@
#define ID_TEKHELP_ABOUT 51990
#define ID_EDIT_EXTERNALSETUP 52005
#define ID_FILE_TERATERMMENU 52006
+#define ID_SHOW_MACRO 52030
// Next default values for new objects
//
@@ -235,7 +236,7 @@
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NO_MFC 1
#define _APS_NEXT_RESOURCE_VALUE 122
-#define _APS_NEXT_COMMAND_VALUE 52030
+#define _APS_NEXT_COMMAND_VALUE 52031
#define _APS_NEXT_CONTROL_VALUE 2524
#define _APS_NEXT_SYMED_VALUE 101
#endif
Modified: trunk/teraterm/teraterm/ttdde.c
===================================================================
--- trunk/teraterm/teraterm/ttdde.c 2010-04-01 15:27:55 UTC (rev 3836)
+++ trunk/teraterm/teraterm/ttdde.c 2010-04-03 15:39:39 UTC (rev 3837)
@@ -1088,7 +1088,7 @@
// In this case, the connection to the host will
// made after the link to TT(P)MACRO is established.
{
- static PROCESS_INFORMATION pi;
+ PROCESS_INFORMATION pi;
int i;
char Cmnd[MAXPATHLEN+40];
STARTUPINFO si;
@@ -1096,18 +1096,18 @@
// Control menu???????????A????????????A
// ????"ttpmacro"?????????
- // (2010.4.2 yutaka)
+ // (2010.4.2 yutaka, maya)
if ((FName == NULL && Startup == FALSE) && ConvH != 0) {
-#if 0
+#if 1
HWND hwnd;
- DWORD pid;
+ DWORD pid_macro, pid;
+ GetWindowThreadProcessId(HWndDdeCli, &pid_macro);
hwnd = GetTopWindow(NULL);
while (hwnd) {
GetWindowThreadProcessId(hwnd, &pid);
- if (pid == pi.dwProcessId) {
- // TODO:
- break;
+ if (pid == pid_macro) {
+ FlashWindow(hwnd, TRUE);
}
hwnd = GetNextWindow(hwnd, GW_HWNDNEXT);
}
Modified: trunk/teraterm/teraterm/ttermpro.rc
===================================================================
--- trunk/teraterm/teraterm/ttermpro.rc 2010-04-01 15:27:55 UTC (rev 3836)
+++ trunk/teraterm/teraterm/ttermpro.rc 2010-04-03 15:39:39 UTC (rev 3837)
@@ -520,6 +520,7 @@
MENUITEM "&Open TEK", ID_CONTROL_OPENTEK
MENUITEM "&Close TEK", ID_CONTROL_CLOSETEK
MENUITEM SEPARATOR
+ MENUITEM "Show Macro &Window", 52030, GRAYED
MENUITEM "&Macro", ID_CONTROL_MACRO
END
POPUP "&Help"
Modified: trunk/teraterm/teraterm/vtwin.cpp
===================================================================
--- trunk/teraterm/teraterm/vtwin.cpp 2010-04-01 15:27:55 UTC (rev 3836)
+++ trunk/teraterm/teraterm/vtwin.cpp 2010-04-03 15:39:39 UTC (rev 3837)
@@ -203,6 +203,7 @@
ON_COMMAND(ID_CONTROL_OPENTEK, OnControlOpenTEK)
ON_COMMAND(ID_CONTROL_CLOSETEK, OnControlCloseTEK)
ON_COMMAND(ID_CONTROL_MACRO, OnControlMacro)
+ ON_COMMAND(ID_SHOW_MACRO, OnShowMacroWindow)
ON_COMMAND(ID_WINDOW_WINDOW, OnWindowWindow)
ON_COMMAND(ID_HELP_INDEX2, OnHelpIndex)
ON_COMMAND(ID_HELP_ABOUT, OnHelpAbout)
@@ -1367,18 +1368,12 @@
}
if ((ConvH!=0) || (FileVar!=NULL)) {
- // Control - Macro ?????????o???????
-#if 1
- ModifyMenu(ControlMenu,ID_CONTROL_MACRO,MF_BYCOMMAND, ID_CONTROL_MACRO, "&Macro Running");
- DrawMenuBar();
-#else
EnableMenuItem(ControlMenu,ID_CONTROL_MACRO,MF_BYCOMMAND | MF_GRAYED);
-#endif
+ EnableMenuItem(ControlMenu,ID_SHOW_MACRO,MF_BYCOMMAND | MF_ENABLED);
}
else {
- //EnableMenuItem(ControlMenu,ID_CONTROL_MACRO,MF_BYCOMMAND | MF_ENABLED);
- ModifyMenu(ControlMenu,ID_CONTROL_MACRO,MF_BYCOMMAND, ID_CONTROL_MACRO, "&Macro");
- DrawMenuBar();
+ EnableMenuItem(ControlMenu,ID_CONTROL_MACRO,MF_BYCOMMAND | MF_ENABLED);
+ EnableMenuItem(ControlMenu,ID_SHOW_MACRO,MF_BYCOMMAND | MF_GRAYED);
}
}
@@ -5068,6 +5063,11 @@
RunMacro(NULL,FALSE);
}
+void CVTWindow::OnShowMacroWindow()
+{
+ RunMacro(NULL,FALSE);
+}
+
void CVTWindow::OnWindowWindow()
{
BOOL Close;
Modified: trunk/teraterm/teraterm/vtwin.h
===================================================================
--- trunk/teraterm/teraterm/vtwin.h 2010-04-01 15:27:55 UTC (rev 3836)
+++ trunk/teraterm/teraterm/vtwin.h 2010-04-03 15:39:39 UTC (rev 3837)
@@ -169,6 +169,7 @@
afx_msg void OnControlOpenTEK();
afx_msg void OnControlCloseTEK();
afx_msg void OnControlMacro();
+ afx_msg void OnShowMacroWindow();
afx_msg void OnWindowWindow();
afx_msg void OnHelpIndex();
afx_msg void OnHelpUsing();
From svnnotify @ sourceforge.jp Sun Apr 4 00:43:50 2010
From: svnnotify @ sourceforge.jp (svnnotify @ sourceforge.jp)
Date: Sun, 04 Apr 2010 00:43:50 +0900
Subject: [Ttssh2-commit] =?utf-8?b?WzM4MzhdICDjgZnjgafjgavlrp/ooYzkuK0=?=
=?utf-8?b?44Gu44Oe44Kv44Ot44Km44Kj44Oz44OJ44Km44KS44CB5YiG44GL44KK44KE?=
=?utf-8?b?44GZ44GP44OV44Op44OD44K344Ol44GZ44KL44Gf44KB44Gr44CB5paw6KaP?=
=?utf-8?q?=E3=81=AB_Control_-_Show_Macro_Window?=
Message-ID: <1270309430.810082.6867.nullmailer@users.sourceforge.jp>
Revision: 3838
http://sourceforge.jp/projects/ttssh2/svn/view?view=rev&revision=3838
Author: yutakapon
Date: 2010-04-04 00:43:50 +0900 (Sun, 04 Apr 2010)
Log Message:
-----------
??????茵?賢??????????潟?????????????????????ャ??????????荀??Control - Show Macro Window
?<??ャ???申??????
?障??????????莎桁??????statusbox ??????腆冴?????????????????ャ????????????
Modified Paths:
--------------
trunk/doc/en/html/about/history.html
trunk/doc/ja/html/about/history.html
-------------- next part --------------
Modified: trunk/doc/en/html/about/history.html
===================================================================
--- trunk/doc/en/html/about/history.html 2010-04-03 15:39:39 UTC (rev 3837)
+++ trunk/doc/en/html/about/history.html 2010-04-03 15:43:50 UTC (rev 3838)
@@ -42,7 +42,7 @@
added the "ymodemsend " macro command.
added support for the VPB and HPB control sequence.
- A user can select the Macro of the Control menu while a macro is running, and the macro window is activated when the user selects the menu.
+ added the Show Macro Window of the Control menu to flash the running macro window.
Modified: trunk/doc/ja/html/about/history.html
===================================================================
--- trunk/doc/ja/html/about/history.html 2010-04-03 15:39:39 UTC (rev 3837)
+++ trunk/doc/ja/html/about/history.html 2010-04-03 15:43:50 UTC (rev 3838)
@@ -42,7 +42,7 @@
??????? "ymodemsend " ??????
VPB, HPB ?????????????
- ???タ????????Control - Macro ???????????????????????????????????????????
+ タ?????????????????????????? Control - Show Macro Window ??????????
From svnnotify @ sourceforge.jp Sun Apr 4 23:05:13 2010
From: svnnotify @ sourceforge.jp (svnnotify @ sourceforge.jp)
Date: Sun, 04 Apr 2010 23:05:13 +0900
Subject: [Ttssh2-commit] [3840] Show Macro Window
Message-ID: <1270389913.496446.19885.nullmailer@users.sourceforge.jp>
Revision: 3840
http://sourceforge.jp/projects/ttssh2/svn/view?view=rev&revision=3840
Author: yutakapon
Date: 2010-04-04 23:05:13 +0900 (Sun, 04 Apr 2010)
Log Message:
-----------
Show Macro Window
Modified Paths:
--------------
trunk/doc/en/html/menu/control.html
trunk/doc/ja/html/menu/control.html
-------------- next part --------------
Modified: trunk/doc/en/html/menu/control.html
===================================================================
--- trunk/doc/en/html/menu/control.html 2010-04-04 09:28:00 UTC (rev 3839)
+++ trunk/doc/en/html/menu/control.html 2010-04-04 14:05:13 UTC (rev 3840)
@@ -49,6 +49,11 @@
Closes the TEK window.
+ Show Macro Window
+
+ Shows the running macro window.
+
+
Macro
Runs a macro file.
Modified: trunk/doc/ja/html/menu/control.html
===================================================================
--- trunk/doc/ja/html/menu/control.html 2010-04-04 09:28:00 UTC (rev 3839)
+++ trunk/doc/ja/html/menu/control.html 2010-04-04 14:05:13 UTC (rev 3840)
@@ -49,6 +49,11 @@
TEK window ??????
+ Show Macro Window
+
+ タ?????????????ヲ????
+
+
Macro
????タ?????
From svnnotify @ sourceforge.jp Sun Apr 4 18:28:01 2010
From: svnnotify @ sourceforge.jp (svnnotify @ sourceforge.jp)
Date: Sun, 04 Apr 2010 18:28:01 +0900
Subject: [Ttssh2-commit] =?utf-8?q?=5B3839=5D__Show_Macro_Window=E3=81=AB?=
=?utf-8?b?44GK44GE44Gm44CB44Oe44Kv44Ot44Km44Kj44Oz44OJ44Km44GvZm9yZWdy?=
=?utf-8?b?b3VuZOOBuOaMgeOBo+OBpuOBk+OCieOCjOOCi+OCiOOBhuOBq+OBl+OBnw==?=
=?utf-8?b?44CC?=
Message-ID: <1270373281.019779.1817.nullmailer@users.sourceforge.jp>
Revision: 3839
http://sourceforge.jp/projects/ttssh2/svn/view?view=rev&revision=3839
Author: yutakapon
Date: 2010-04-04 18:28:00 +0900 (Sun, 04 Apr 2010)
Log Message:
-----------
Show Macro Window????????????????潟????foreground?御??c????????????????
Show Macro Window?<??ャ?????若?????阪?????c???
Modified Paths:
--------------
trunk/installer/release/lang/English.lng
trunk/installer/release/lang/German.lng
trunk/installer/release/lang/Japanese.lng
trunk/teraterm/teraterm/ttdde.c
trunk/teraterm/teraterm/vtwin.cpp
-------------- next part --------------
Modified: trunk/installer/release/lang/English.lng
===================================================================
--- trunk/installer/release/lang/English.lng 2010-04-03 15:43:50 UTC (rev 3838)
+++ trunk/installer/release/lang/English.lng 2010-04-04 09:28:00 UTC (rev 3839)
@@ -66,6 +66,7 @@
MENU_CONTROL_OPENTEK=&Open TEK
MENU_CONTROL_CLOSETEK=&Close TEK
MENU_CONTROL_MACRO=&Macro
+MENU_SHOW_MACRO_WINDOW=Show Macro &Window
MENU_WINDOW=&Window
MENU_WINDOW_WINDOW=&Window
Modified: trunk/installer/release/lang/German.lng
===================================================================
--- trunk/installer/release/lang/German.lng 2010-04-03 15:43:50 UTC (rev 3838)
+++ trunk/installer/release/lang/German.lng 2010-04-04 09:28:00 UTC (rev 3839)
@@ -66,6 +66,7 @@
MENU_CONTROL_OPENTEK=&?fne TEK
MENU_CONTROL_CLOSETEK=&Schliesse TEK
MENU_CONTROL_MACRO=&Macro
+MENU_SHOW_MACRO_WINDOW=Show Macro &Window
MENU_WINDOW=&Fenster
MENU_WINDOW_WINDOW=&Fenster
Modified: trunk/installer/release/lang/Japanese.lng
===================================================================
--- trunk/installer/release/lang/Japanese.lng 2010-04-03 15:43:50 UTC (rev 3838)
+++ trunk/installer/release/lang/Japanese.lng 2010-04-04 09:28:00 UTC (rev 3839)
@@ -66,6 +66,7 @@
MENU_CONTROL_OPENTEK=TEK????????(&O)
MENU_CONTROL_CLOSETEK=TEK?????????(&C)
MENU_CONTROL_MACRO=???(&M)
+MENU_SHOW_MACRO_WINDOW=??????????ヲ(&W)
MENU_WINDOW=?????(&W)
MENU_WINDOW_WINDOW=?????(&W)
Modified: trunk/teraterm/teraterm/ttdde.c
===================================================================
--- trunk/teraterm/teraterm/ttdde.c 2010-04-03 15:43:50 UTC (rev 3838)
+++ trunk/teraterm/teraterm/ttdde.c 2010-04-04 09:28:00 UTC (rev 3839)
@@ -1098,7 +1098,6 @@
// ????"ttpmacro"?????????
// (2010.4.2 yutaka, maya)
if ((FName == NULL && Startup == FALSE) && ConvH != 0) {
-#if 1
HWND hwnd;
DWORD pid_macro, pid;
@@ -1111,12 +1110,10 @@
}
hwnd = GetNextWindow(hwnd, GW_HWNDNEXT);
}
-#else
+
ShowWindow(HWndDdeCli, SW_NORMAL);
SetForegroundWindow(HWndDdeCli);
BringWindowToTop(HWndDdeCli);
- FlashWindow(HWndDdeCli, TRUE);
-#endif
return;
}
Modified: trunk/teraterm/teraterm/vtwin.cpp
===================================================================
--- trunk/teraterm/teraterm/vtwin.cpp 2010-04-03 15:43:50 UTC (rev 3838)
+++ trunk/teraterm/teraterm/vtwin.cpp 2010-04-04 09:28:00 UTC (rev 3839)
@@ -1206,9 +1206,13 @@
GetMenuString(ControlMenu, ID_CONTROL_CLOSETEK, uimsg, sizeof(uimsg), MF_BYCOMMAND);
get_lang_msg("MENU_CONTROL_CLOSETEK", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
ModifyMenu(ControlMenu, ID_CONTROL_CLOSETEK, MF_BYCOMMAND, ID_CONTROL_CLOSETEK, ts.UIMsg);
+
GetMenuString(ControlMenu, ID_CONTROL_MACRO, uimsg, sizeof(uimsg), MF_BYCOMMAND);
get_lang_msg("MENU_CONTROL_MACRO", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
ModifyMenu(ControlMenu, ID_CONTROL_MACRO, MF_BYCOMMAND, ID_CONTROL_MACRO, ts.UIMsg);
+ GetMenuString(ControlMenu, ID_SHOW_MACRO, uimsg, sizeof(uimsg), MF_BYCOMMAND);
+ get_lang_msg("MENU_SHOW_MACRO_WINDOW", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
+ ModifyMenu(ControlMenu, ID_SHOW_MACRO, MF_BYCOMMAND, ID_SHOW_MACRO, ts.UIMsg);
GetMenuString(*Menu, ID_HELPMENU, uimsg, sizeof(uimsg), MF_BYPOSITION);
get_lang_msg("MENU_HELP", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
From svnnotify @ sourceforge.jp Sun Apr 4 23:45:45 2010
From: svnnotify @ sourceforge.jp (svnnotify @ sourceforge.jp)
Date: Sun, 04 Apr 2010 23:45:45 +0900
Subject: [Ttssh2-commit] =?utf-8?q?=5B3841=5D__ShowShow_Macro_Window?=
=?utf-8?b?44Gr44GK44GE44Gm44CBc3RhdHVzYm94IOOCkuODleOCqeOCouOCsOODqQ==?=
=?utf-8?b?44Km44Oz44OJ5YyW44Gn44GN44KL44KI44GG44Gr44GX44Gf44CC?=
Message-ID: <1270392345.530644.17713.nullmailer@users.sourceforge.jp>
Revision: 3841
http://sourceforge.jp/projects/ttssh2/svn/view?view=rev&revision=3841
Author: yutakapon
Date: 2010-04-04 23:45:45 +0900 (Sun, 04 Apr 2010)
Log Message:
-----------
ShowShow Macro Window????????tatusbox ???????違????????с????????????cf.
http://d.hatena.ne.jp/gsf_zero1/20071211/p1
Modified Paths:
--------------
trunk/teraterm/common/tttypes.h
trunk/teraterm/teraterm/ttdde.c
trunk/teraterm/ttpmacro/statdlg.cpp
trunk/teraterm/ttpmacro/statdlg.h
-------------- next part --------------
Modified: trunk/teraterm/common/tttypes.h
===================================================================
--- trunk/teraterm/common/tttypes.h 2010-04-04 14:05:13 UTC (rev 3840)
+++ trunk/teraterm/common/tttypes.h 2010-04-04 14:45:45 UTC (rev 3841)
@@ -129,6 +129,8 @@
#define WM_USER_DDECOMREADY WM_USER+23
#define WM_USER_DDEEND WM_USER+24
+#define MY_FORCE_FOREGROUND_MESSAGE WM_USER+31
+
/* port type ID */
#define IdTCPIP 1
#define IdSerial 2
Modified: trunk/teraterm/teraterm/ttdde.c
===================================================================
--- trunk/teraterm/teraterm/ttdde.c 2010-04-04 14:05:13 UTC (rev 3840)
+++ trunk/teraterm/teraterm/ttdde.c 2010-04-04 14:45:45 UTC (rev 3841)
@@ -1100,17 +1100,24 @@
if ((FName == NULL && Startup == FALSE) && ConvH != 0) {
HWND hwnd;
DWORD pid_macro, pid;
+ DWORD targetid;
+ DWORD currentActiveThreadId;
+ currentActiveThreadId = GetWindowThreadProcessId(GetForegroundWindow(), &pid);
+
GetWindowThreadProcessId(HWndDdeCli, &pid_macro);
hwnd = GetTopWindow(NULL);
while (hwnd) {
- GetWindowThreadProcessId(hwnd, &pid);
+ targetid = GetWindowThreadProcessId(hwnd, &pid);
if (pid == pid_macro) {
FlashWindow(hwnd, TRUE);
+
+ SendMessage(hwnd, MY_FORCE_FOREGROUND_MESSAGE, (WPARAM)hwnd, 0);
}
hwnd = GetNextWindow(hwnd, GW_HWNDNEXT);
}
+ // ??????????
ShowWindow(HWndDdeCli, SW_NORMAL);
SetForegroundWindow(HWndDdeCli);
BringWindowToTop(HWndDdeCli);
Modified: trunk/teraterm/ttpmacro/statdlg.cpp
===================================================================
--- trunk/teraterm/ttpmacro/statdlg.cpp 2010-04-04 14:05:13 UTC (rev 3840)
+++ trunk/teraterm/ttpmacro/statdlg.cpp 2010-04-04 14:45:45 UTC (rev 3841)
@@ -11,6 +11,7 @@
#include "ttmlib.h"
#include "statdlg.h"
+#include "tttypes.h"
#ifdef _DEBUG
#define new DEBUG_NEW
@@ -23,6 +24,7 @@
BEGIN_MESSAGE_MAP(CStatDlg, CDialog)
//{{AFX_MSG_MAP(CStatDlg)
ON_MESSAGE(WM_EXITSIZEMOVE, OnExitSizeMove)
+ ON_MESSAGE(MY_FORCE_FOREGROUND_MESSAGE, OnSetForceForegroundWindow)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
@@ -140,6 +142,28 @@
return CDialog::DefWindowProc(WM_EXITSIZEMOVE,wParam,lParam);
}
+LONG CStatDlg::OnSetForceForegroundWindow(UINT wParam, LONG lParam)
+{
+ DWORD pid;
+ DWORD targetid;
+ DWORD currentActiveThreadId;
+ HWND hwnd = (HWND)wParam;
+
+ targetid = GetWindowThreadProcessId(hwnd, &pid);
+ currentActiveThreadId = GetWindowThreadProcessId(::GetForegroundWindow(), &pid);
+
+ SetForegroundWindow();
+ if (targetid == currentActiveThreadId) {
+ BringWindowToTop();
+ } else {
+ AttachThreadInput(targetid, currentActiveThreadId, TRUE);
+ BringWindowToTop();
+ AttachThreadInput(targetid, currentActiveThreadId, FALSE);
+ }
+
+ return TRUE;
+}
+
void CStatDlg::Relocation(BOOL is_init, int new_WW)
{
RECT R;
Modified: trunk/teraterm/ttpmacro/statdlg.h
===================================================================
--- trunk/teraterm/ttpmacro/statdlg.h 2010-04-04 14:05:13 UTC (rev 3840)
+++ trunk/teraterm/ttpmacro/statdlg.h 2010-04-04 14:45:45 UTC (rev 3841)
@@ -31,6 +31,7 @@
//{{AFX_MSG(CStatDlg)
virtual BOOL OnInitDialog();
afx_msg LONG OnExitSizeMove(UINT wParam, LONG lParam);
+ afx_msg LONG OnSetForceForegroundWindow(UINT wParam, LONG lParam);
//}}AFX_MSG
void Relocation(BOOL is_init, int WW);
DECLARE_MESSAGE_MAP()
From svnnotify @ sourceforge.jp Mon Apr 5 12:37:18 2010
From: svnnotify @ sourceforge.jp (svnnotify @ sourceforge.jp)
Date: Mon, 05 Apr 2010 12:37:18 +0900
Subject: [Ttssh2-commit] =?utf-8?q?=5B3842=5D_=22Show_Macro_Window=22__?=
=?utf-8?b?44Oh44OL44Ol44O844GuIElEIOOBiuOCiOOBs+Wumue+qeOCkuS/ruatow==?=
Message-ID: <1270438638.265878.380.nullmailer@users.sourceforge.jp>
Revision: 3842
http://sourceforge.jp/projects/ttssh2/svn/view?view=rev&revision=3842
Author: maya
Date: 2010-04-05 12:37:18 +0900 (Mon, 05 Apr 2010)
Log Message:
-----------
"Show Macro Window" ?<??ャ???ID ????喝?臂??篆??
"Show Macro Window" ?<??ャ???"Macro" ?????Щ?????
Modified Paths:
--------------
trunk/doc/en/html/reference/keycode.txt
trunk/doc/ja/html/reference/keycode.txt
trunk/installer/release/lang/English.lng
trunk/installer/release/lang/German.lng
trunk/installer/release/lang/Japanese.lng
trunk/teraterm/common/tt_res.h
trunk/teraterm/teraterm/ttermpro.rc
trunk/teraterm/teraterm/vtwin.cpp
-------------- next part --------------
Modified: trunk/doc/en/html/reference/keycode.txt
===================================================================
--- trunk/doc/en/html/reference/keycode.txt 2010-04-04 14:45:45 UTC (rev 3841)
+++ trunk/doc/en/html/reference/keycode.txt 2010-04-05 03:37:18 UTC (rev 3842)
@@ -424,6 +424,7 @@
[Control] Open TEK 50450
[Control] Close TEK 50460
[Control] Macro 50470
+[Control] Show Macro Window 50480
[Window] Window 50810
[Help] Index 50910
[Help] About Tera Term 50990
Modified: trunk/doc/ja/html/reference/keycode.txt
===================================================================
--- trunk/doc/ja/html/reference/keycode.txt 2010-04-04 14:45:45 UTC (rev 3841)
+++ trunk/doc/ja/html/reference/keycode.txt 2010-04-05 03:37:18 UTC (rev 3842)
@@ -434,6 +434,7 @@
[Control] Open TEK 50450
[Control] Close TEK 50460
[Control] Macro 50470
+[Control] Show Macro Window 50480
[Window] Window 50810
[Help] Index 50910
[Help] About Tera Term 50990
Modified: trunk/installer/release/lang/English.lng
===================================================================
--- trunk/installer/release/lang/English.lng 2010-04-04 14:45:45 UTC (rev 3841)
+++ trunk/installer/release/lang/English.lng 2010-04-05 03:37:18 UTC (rev 3842)
@@ -66,7 +66,7 @@
MENU_CONTROL_OPENTEK=&Open TEK
MENU_CONTROL_CLOSETEK=&Close TEK
MENU_CONTROL_MACRO=&Macro
-MENU_SHOW_MACRO_WINDOW=Show Macro &Window
+MENU_CONTROL_SHOW_MACRO=Show Macro &Window
MENU_WINDOW=&Window
MENU_WINDOW_WINDOW=&Window
Modified: trunk/installer/release/lang/German.lng
===================================================================
--- trunk/installer/release/lang/German.lng 2010-04-04 14:45:45 UTC (rev 3841)
+++ trunk/installer/release/lang/German.lng 2010-04-05 03:37:18 UTC (rev 3842)
@@ -66,7 +66,7 @@
MENU_CONTROL_OPENTEK=&?fne TEK
MENU_CONTROL_CLOSETEK=&Schliesse TEK
MENU_CONTROL_MACRO=&Macro
-MENU_SHOW_MACRO_WINDOW=Show Macro &Window
+MENU_CONTROL_SHOW_MACRO=Show Macro &Window
MENU_WINDOW=&Fenster
MENU_WINDOW_WINDOW=&Fenster
Modified: trunk/installer/release/lang/Japanese.lng
===================================================================
--- trunk/installer/release/lang/Japanese.lng 2010-04-04 14:45:45 UTC (rev 3841)
+++ trunk/installer/release/lang/Japanese.lng 2010-04-05 03:37:18 UTC (rev 3842)
@@ -66,7 +66,7 @@
MENU_CONTROL_OPENTEK=TEK????????(&O)
MENU_CONTROL_CLOSETEK=TEK?????????(&C)
MENU_CONTROL_MACRO=???(&M)
-MENU_SHOW_MACRO_WINDOW=??????????ヲ(&W)
+MENU_CONTROL_SHOW_MACRO=??????????ヲ(&W)
MENU_WINDOW=?????(&W)
MENU_WINDOW_WINDOW=?????(&W)
Modified: trunk/teraterm/common/tt_res.h
===================================================================
--- trunk/teraterm/common/tt_res.h 2010-04-04 14:45:45 UTC (rev 3841)
+++ trunk/teraterm/common/tt_res.h 2010-04-05 03:37:18 UTC (rev 3842)
@@ -210,6 +210,7 @@
#define ID_CONTROL_OPENTEK 50450
#define ID_CONTROL_CLOSETEK 50460
#define ID_CONTROL_MACRO 50470
+#define ID_CONTROL_SHOW_MACRO 50480
#define ID_HELP_INDEX2 50910
#define ID_HELP_USING2 50920
#define ID_HELP_ABOUT 50990
@@ -228,7 +229,6 @@
#define ID_TEKHELP_ABOUT 51990
#define ID_EDIT_EXTERNALSETUP 52005
#define ID_FILE_TERATERMMENU 52006
-#define ID_SHOW_MACRO 52030
// Next default values for new objects
//
Modified: trunk/teraterm/teraterm/ttermpro.rc
===================================================================
--- trunk/teraterm/teraterm/ttermpro.rc 2010-04-04 14:45:45 UTC (rev 3841)
+++ trunk/teraterm/teraterm/ttermpro.rc 2010-04-05 03:37:18 UTC (rev 3842)
@@ -520,8 +520,8 @@
MENUITEM "&Open TEK", ID_CONTROL_OPENTEK
MENUITEM "&Close TEK", ID_CONTROL_CLOSETEK
MENUITEM SEPARATOR
- MENUITEM "Show Macro &Window", 52030, GRAYED
MENUITEM "&Macro", ID_CONTROL_MACRO
+ MENUITEM "Show Macro &Window", ID_CONTROL_SHOW_MACRO
END
POPUP "&Help"
BEGIN
Modified: trunk/teraterm/teraterm/vtwin.cpp
===================================================================
--- trunk/teraterm/teraterm/vtwin.cpp 2010-04-04 14:45:45 UTC (rev 3841)
+++ trunk/teraterm/teraterm/vtwin.cpp 2010-04-05 03:37:18 UTC (rev 3842)
@@ -203,7 +203,7 @@
ON_COMMAND(ID_CONTROL_OPENTEK, OnControlOpenTEK)
ON_COMMAND(ID_CONTROL_CLOSETEK, OnControlCloseTEK)
ON_COMMAND(ID_CONTROL_MACRO, OnControlMacro)
- ON_COMMAND(ID_SHOW_MACRO, OnShowMacroWindow)
+ ON_COMMAND(ID_CONTROL_SHOW_MACRO, OnShowMacroWindow)
ON_COMMAND(ID_WINDOW_WINDOW, OnWindowWindow)
ON_COMMAND(ID_HELP_INDEX2, OnHelpIndex)
ON_COMMAND(ID_HELP_ABOUT, OnHelpAbout)
@@ -1210,9 +1210,9 @@
GetMenuString(ControlMenu, ID_CONTROL_MACRO, uimsg, sizeof(uimsg), MF_BYCOMMAND);
get_lang_msg("MENU_CONTROL_MACRO", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
ModifyMenu(ControlMenu, ID_CONTROL_MACRO, MF_BYCOMMAND, ID_CONTROL_MACRO, ts.UIMsg);
- GetMenuString(ControlMenu, ID_SHOW_MACRO, uimsg, sizeof(uimsg), MF_BYCOMMAND);
- get_lang_msg("MENU_SHOW_MACRO_WINDOW", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
- ModifyMenu(ControlMenu, ID_SHOW_MACRO, MF_BYCOMMAND, ID_SHOW_MACRO, ts.UIMsg);
+ GetMenuString(ControlMenu, ID_CONTROL_SHOW_MACRO, uimsg, sizeof(uimsg), MF_BYCOMMAND);
+ get_lang_msg("MENU_CONTROL_SHOW_MACRO", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
+ ModifyMenu(ControlMenu, ID_CONTROL_SHOW_MACRO, MF_BYCOMMAND, ID_CONTROL_SHOW_MACRO, ts.UIMsg);
GetMenuString(*Menu, ID_HELPMENU, uimsg, sizeof(uimsg), MF_BYPOSITION);
get_lang_msg("MENU_HELP", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
@@ -1373,11 +1373,11 @@
if ((ConvH!=0) || (FileVar!=NULL)) {
EnableMenuItem(ControlMenu,ID_CONTROL_MACRO,MF_BYCOMMAND | MF_GRAYED);
- EnableMenuItem(ControlMenu,ID_SHOW_MACRO,MF_BYCOMMAND | MF_ENABLED);
+ EnableMenuItem(ControlMenu,ID_CONTROL_SHOW_MACRO,MF_BYCOMMAND | MF_ENABLED);
}
else {
EnableMenuItem(ControlMenu,ID_CONTROL_MACRO,MF_BYCOMMAND | MF_ENABLED);
- EnableMenuItem(ControlMenu,ID_SHOW_MACRO,MF_BYCOMMAND | MF_GRAYED);
+ EnableMenuItem(ControlMenu,ID_CONTROL_SHOW_MACRO,MF_BYCOMMAND | MF_GRAYED);
}
}
From svnnotify @ sourceforge.jp Mon Apr 5 15:34:24 2010
From: svnnotify @ sourceforge.jp (svnnotify @ sourceforge.jp)
Date: Mon, 05 Apr 2010 15:34:24 +0900
Subject: [Ttssh2-commit] =?utf-8?b?WzM4NDNdIHpsaWIgMS4yLiA0IOOBpyBEZWJ1?=
=?utf-8?b?ZyDjg5Pjg6vjg4njgavlpLHmlZfjgZnjgovjga7jgpLkv67mraPjgII=?=
Message-ID: <1270449264.651526.21027.nullmailer@users.sourceforge.jp>
Revision: 3843
http://sourceforge.jp/projects/ttssh2/svn/view?view=rev&revision=3843
Author: doda
Date: 2010-04-05 15:34:24 +0900 (Mon, 05 Apr 2010)
Log Message:
-----------
zlib 1.2.4 で Debug ビルドに失敗するのを修正。
Modified Paths:
--------------
trunk/libs/buildzlib.bat
-------------- next part --------------
Modified: trunk/libs/buildzlib.bat
===================================================================
--- trunk/libs/buildzlib.bat 2010-04-05 03:37:18 UTC (rev 3842)
+++ trunk/libs/buildzlib.bat 2010-04-05 06:34:24 UTC (rev 3843)
@@ -11,7 +11,7 @@
:mkmf
perl -e "open(IN,'win32\Makefile.msc');while(){s/ -MD/ -MT/;print $_;}close(IN);" > win32\Makefile.msc.release
-perl -e "open(IN,'win32\Makefile.msc');while(){s/ -MD -O2/ -MTd -Od/;s/ -release/ -debug/;s/ zlib.lib/ zlibd.lib/;s/ zlib.lib/ zlibd.lib/;print $_;}close(IN);" > win32\Makefile.msc.debug
+perl -e "open(IN,'win32\Makefile.msc');while(){s/ -MD/ -MTd/;s/ -O2/ -Od/;s/ -release/ -debug/;s/ zlib.lib/ zlibd.lib/;s/ zlib.lib/ zlibd.lib/;print $_;}close(IN);" > win32\Makefile.msc.debug
:build
if exist zlibd.lib goto build_release
From svnnotify @ sourceforge.jp Wed Apr 7 00:54:45 2010
From: svnnotify @ sourceforge.jp (svnnotify @ sourceforge.jp)
Date: Wed, 07 Apr 2010 00:54:45 +0900
Subject: [Ttssh2-commit] =?utf-8?b?WzM4NDRdICBjcmMzMmZpbGXjg57jgq/jg60=?=
=?utf-8?b?44Kz44Oe44Oz44OJ44Gr44GK44GE44Gm44CB44OV44Kh44Kk44Or44Kq44O8?=
=?utf-8?b?44OX44Oz44Ko44Op44O844GM5q2j44GX44GP5Yik5a6a44Gn44GN44Gm44GE?=
=?utf-8?b?44Gq44GL44Gj44Gf5ZWP6aGM44KS5L+u5q2j44GX44Gf44CC?=
Message-ID: <1270569285.472490.26689.nullmailer@users.sourceforge.jp>
Revision: 3844
http://sourceforge.jp/projects/ttssh2/svn/view?view=rev&revision=3844
Author: yutakapon
Date: 2010-04-07 00:54:45 +0900 (Wed, 07 Apr 2010)
Log Message:
-----------
crc32file??????????????????????ゃ???????????若?罩c???ゅ??с????????c??馹??篆????????障?????粋昭?水?????<????絲障????????????????????????cf.
http://logmett.com/forum/viewtopic.php?f=8&t=1356
Modified Paths:
--------------
trunk/doc/en/html/about/history.html
trunk/doc/ja/html/about/history.html
trunk/teraterm/ttpmacro/ttl.c
-------------- next part --------------
Modified: trunk/doc/en/html/about/history.html
===================================================================
--- trunk/doc/en/html/about/history.html 2010-04-05 06:34:24 UTC (rev 3843)
+++ trunk/doc/en/html/about/history.html 2010-04-06 15:54:45 UTC (rev 3844)
@@ -30,7 +30,7 @@
-
+
Changes
@@ -54,6 +54,7 @@
If ClearOnResize setting is on, DECCOLM (Change Column Mode) control sequence does not clear screen.
VPR control sequence does not work correctly.
+ The crc32file macro command does not work correctly for handling the file opening error. And also, the command supports the read-only file.
Modified: trunk/doc/ja/html/about/history.html
===================================================================
--- trunk/doc/ja/html/about/history.html 2010-04-05 06:34:24 UTC (rev 3843)
+++ trunk/doc/ja/html/about/history.html 2010-04-06 15:54:45 UTC (rev 3844)
@@ -30,7 +30,7 @@
-
+
??
@@ -53,6 +53,7 @@
ClearOnResize ? on ???DECCOLM(???????)????????????????????????B
???????????? Alt+?? ????????????????????????????C????
VPR ??????????????????????B
+ crc32file ????????????????????????????????????????????B???????????????????????????????
Modified: trunk/teraterm/ttpmacro/ttl.c
===================================================================
--- trunk/teraterm/ttpmacro/ttl.c 2010-04-05 06:34:24 UTC (rev 3843)
+++ trunk/teraterm/ttpmacro/ttl.c 2010-04-06 15:54:45 UTC (rev 3844)
@@ -588,7 +588,8 @@
WORD TTLCrc32File()
{
TStrVal Str;
- WORD Err, CRC, result=0;
+ int result = 0;
+ WORD Err, CRC;
HANDLE fh = INVALID_HANDLE_VALUE, hMap = NULL;
LPBYTE lpBuf = NULL;
DWORD fsize;
@@ -601,21 +602,21 @@
if (Err!=0) return Err;
if (Str[0]==0) return Err;
- fh = CreateFile(Str,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,
+ fh = CreateFile(Str,GENERIC_READ,0,NULL,OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,NULL); /* ???????? */
if (fh == INVALID_HANDLE_VALUE) {
result = -1;
goto error;
}
/* ????????????????? */
- hMap = CreateFileMapping(fh,NULL,PAGE_READWRITE,0,0,NULL);
+ hMap = CreateFileMapping(fh,NULL,PAGE_READONLY,0,0,NULL);
if (hMap == NULL) {
result = -1;
goto error;
}
/* ?????????????????lpBuf??? */
- lpBuf = (LPBYTE)MapViewOfFile(hMap,FILE_MAP_WRITE,0,0,0);
+ lpBuf = (LPBYTE)MapViewOfFile(hMap,FILE_MAP_READ,0,0,0);
if (lpBuf == NULL) {
result = -1;
goto error;
From svnnotify @ sourceforge.jp Wed Apr 7 20:59:19 2010
From: svnnotify @ sourceforge.jp (svnnotify @ sourceforge.jp)
Date: Wed, 07 Apr 2010 20:59:19 +0900
Subject: [Ttssh2-commit] =?utf-8?b?WzM4NDVdICDjgqjjg6njg7zjgavplqLjgZc=?=
=?utf-8?b?44Gm6L+96KiY44GX44Gf44CC?=
Message-ID: <1270641559.878628.17843.nullmailer@users.sourceforge.jp>
Revision: 3845
http://sourceforge.jp/projects/ttssh2/svn/view?view=rev&revision=3845
Author: yutakapon
Date: 2010-04-07 20:59:19 +0900 (Wed, 07 Apr 2010)
Log Message:
-----------
エラーに関して追記した。
Modified Paths:
--------------
trunk/doc/en/html/macro/command/crc32.html
-------------- next part --------------
Modified: trunk/doc/en/html/macro/command/crc32.html
===================================================================
--- trunk/doc/en/html/macro/command/crc32.html 2010-04-06 15:54:45 UTC (rev 3844)
+++ trunk/doc/en/html/macro/command/crc32.html 2010-04-07 11:59:19 UTC (rev 3845)
@@ -32,6 +32,7 @@
The calculated value stores the variable "intvar" as mathematical value.
+If the <filename> file can not open by using crc32file, the system variable "result" is set to -1.
The CRC algorithm implementation by C language is as follows:
From svnnotify @ sourceforge.jp Wed Apr 7 21:09:19 2010
From: svnnotify @ sourceforge.jp (svnnotify @ sourceforge.jp)
Date: Wed, 07 Apr 2010 21:09:19 +0900
Subject: [Ttssh2-commit] =?utf-8?b?WzM4NDZdICDjg57jgq/jg63jgrPjg57jg7M=?=
=?utf-8?b?44OJIGZpbGVzdGF0IOOCkui/veWKoOOBl+OBn+OAgg==?=
Message-ID: <1270642159.630499.31911.nullmailer@users.sourceforge.jp>
Revision: 3846
http://sourceforge.jp/projects/ttssh2/svn/view?view=rev&revision=3846
Author: yutakapon
Date: 2010-04-07 21:09:19 +0900 (Wed, 07 Apr 2010)
Log Message:
-----------
???????????filestat ??申??????
cf.
http://logmett.com/forum/viewtopic.php?f=6&t=1357
Modified Paths:
--------------
trunk/doc/en/html/macro/command/index.html
trunk/doc/en/teraterm.hhc
trunk/doc/en/teraterm.hhp
trunk/doc/ja/html/macro/command/index.html
trunk/doc/ja/teraterm.hhc
trunk/doc/ja/teraterm.hhp
trunk/teraterm/common/helpid.h
trunk/teraterm/ttpmacro/ttl.c
trunk/teraterm/ttpmacro/ttmparse.c
trunk/teraterm/ttpmacro/ttmparse.h
Added Paths:
-----------
trunk/doc/en/html/macro/command/filestat.html
trunk/doc/ja/html/macro/command/filestat.html
-------------- next part --------------
Added: trunk/doc/en/html/macro/command/filestat.html
===================================================================
--- trunk/doc/en/html/macro/command/filestat.html (rev 0)
+++ trunk/doc/en/html/macro/command/filestat.html 2010-04-07 12:09:19 UTC (rev 3846)
@@ -0,0 +1,49 @@
+
+
+
+
+ filestat
+
+
+
+
+
+
+
+filestat
+
+
+Gets status information on a file.
+
+
+
+filestat <filename> <size> [<mtime>] [<drive>]
+
+
+Remarks
+
+
+Obtains information about the file or directory specified by <filename>.
+<size> is set to the size of the file in bytes.
+<mtime> is set to the time of last modification of file.
+<drive> is set to the drive number of the disk containing the file.
+
+The system variable "result" value of -1 indicates an error.
+
+
+Example
+
+
+filestat 'test.exe' size time drive
+
+if result = -1 then
+ messagebox 'file open error' 'filestat'
+else
+ sprintf2 str 'File size=%d Time modified=%d Drive=%d' size time drive
+ messagebox str 'filestat'
+endif
+
+
+
+
Modified: trunk/doc/en/html/macro/command/index.html
===================================================================
--- trunk/doc/en/html/macro/command/index.html 2010-04-07 11:59:19 UTC (rev 3845)
+++ trunk/doc/en/html/macro/command/index.html 2010-04-07 12:09:19 UTC (rev 3846)
@@ -137,6 +137,7 @@
filesearch
fileseek
fileseekback
+ filestat (version 4.66 or later)
filestrseek
filestrseek2
filewrite
Modified: trunk/doc/en/teraterm.hhc
===================================================================
--- trunk/doc/en/teraterm.hhc 2010-04-07 11:59:19 UTC (rev 3845)
+++ trunk/doc/en/teraterm.hhc 2010-04-07 12:09:19 UTC (rev 3846)
@@ -1117,6 +1117,11 @@
+
+
+
+
+
Modified: trunk/doc/en/teraterm.hhp
===================================================================
--- trunk/doc/en/teraterm.hhp 2010-04-07 11:59:19 UTC (rev 3845)
+++ trunk/doc/en/teraterm.hhp 2010-04-07 12:09:19 UTC (rev 3846)
@@ -190,6 +190,7 @@
HlpMacroCommandFilesearch=html\macro\command\filesearch.html
HlpMacroCommandFileseek=html\macro\command\fileseek.html
HlpMacroCommandFileseekback=html\macro\command\fileseekback.html
+HlpMacroCommandFilestat=html\macro\command\filestat.html
HlpMacroCommandFilestrseek=html\macro\command\filestrseek.html
HlpMacroCommandFilestrseek2=html\macro\command\filestrseek2.html
HlpMacroCommandFilewrite=html\macro\command\filewrite.html
Added: trunk/doc/ja/html/macro/command/filestat.html
===================================================================
--- trunk/doc/ja/html/macro/command/filestat.html (rev 0)
+++ trunk/doc/ja/html/macro/command/filestat.html 2010-04-07 12:09:19 UTC (rev 3846)
@@ -0,0 +1,46 @@
+
+
+
+
+ filestat
+
+
+
+
+
+
+
+filestat
+
+
+??????????????B
+
+
+
+filestat <filename> <size> [<mtime>] [<drive>]
+
+
+??
+
+
+???? <filename> ??????????B
+???????? <size> ????X??? <mtime> ???????? <drive> ??????
+???ク??????Aresult ??? -1 ???????
+
+
+?
+
+
+filestat 'test.exe' size time drive
+
+if result = -1 then
+ messagebox 'file open error' 'filestat'
+else
+ sprintf2 str 'File size=%d Time modified=%d Drive=%d' size time drive
+ messagebox str 'filestat'
+endif
+
+
+
+
Modified: trunk/doc/ja/html/macro/command/index.html
===================================================================
--- trunk/doc/ja/html/macro/command/index.html 2010-04-07 11:59:19 UTC (rev 3845)
+++ trunk/doc/ja/html/macro/command/index.html 2010-04-07 12:09:19 UTC (rev 3846)
@@ -137,6 +137,7 @@
filesearch
fileseek
fileseekback
+ filestat (?????4.66??)
filestrseek
filestrseek2
filewrite
Modified: trunk/doc/ja/teraterm.hhc
===================================================================
--- trunk/doc/ja/teraterm.hhc 2010-04-07 11:59:19 UTC (rev 3845)
+++ trunk/doc/ja/teraterm.hhc 2010-04-07 12:09:19 UTC (rev 3846)
@@ -1127,6 +1127,10 @@
+
+
+
+
Modified: trunk/doc/ja/teraterm.hhp
===================================================================
--- trunk/doc/ja/teraterm.hhp 2010-04-07 11:59:19 UTC (rev 3845)
+++ trunk/doc/ja/teraterm.hhp 2010-04-07 12:09:19 UTC (rev 3846)
@@ -200,6 +200,7 @@
HlpMacroCommandFilesearch=html\macro\command\filesearch.html
HlpMacroCommandFileseek=html\macro\command\fileseek.html
HlpMacroCommandFileseekback=html\macro\command\fileseekback.html
+HlpMacroCommandFilestat=html\macro\command\filestat.html
HlpMacroCommandFilestrseek=html\macro\command\filestrseek.html
HlpMacroCommandFilestrseek2=html\macro\command\filestrseek2.html
HlpMacroCommandFilewrite=html\macro\command\filewrite.html
Modified: trunk/teraterm/common/helpid.h
===================================================================
--- trunk/teraterm/common/helpid.h 2010-04-07 11:59:19 UTC (rev 3845)
+++ trunk/teraterm/common/helpid.h 2010-04-07 12:09:19 UTC (rev 3846)
@@ -199,6 +199,7 @@
#define HlpMacroCommandFilesearch 92031
#define HlpMacroCommandFileseek 92032
#define HlpMacroCommandFileseekback 92033
+#define HlpMacroCommandFilestat 92178
#define HlpMacroCommandFilestrseek 92034
#define HlpMacroCommandFilestrseek2 92035
#define HlpMacroCommandFilewrite 92036
Modified: trunk/teraterm/ttpmacro/ttl.c
===================================================================
--- trunk/teraterm/ttpmacro/ttl.c 2010-04-07 11:59:19 UTC (rev 3845)
+++ trunk/teraterm/ttpmacro/ttl.c 2010-04-07 12:09:19 UTC (rev 3846)
@@ -20,6 +20,7 @@
#include "ttmenc.h"
#include "tttypes.h"
#include
+#include
// Oniguruma: Regular expression library
#define ONIG_EXTERN extern
@@ -1359,6 +1360,56 @@
return Err;
}
+WORD TTLFileStat()
+{
+ WORD Err, SizeVarId, TimeVarId, DrvVarId;
+ TStrVal FName;
+ struct _stat st;
+ int ret;
+ int result = -1;
+
+ Err = 0;
+ GetStrVal(FName,&Err);
+ if ((Err==0) &&
+ (strlen(FName)==0))
+ Err = ErrSyntax;
+ if (Err!=0) return Err;
+
+ if (!GetAbsPath(FName,sizeof(FName))) {
+ goto end;
+ }
+
+ ret = _stat(FName, &st);
+ if (ret != 0) {
+ goto end;
+ }
+
+ if (CheckParameterGiven()) {
+ GetIntVar(&SizeVarId,&Err);
+ if (Err!=0) return Err;
+ SetIntVal(SizeVarId, st.st_size);
+ }
+
+ if (CheckParameterGiven()) {
+ GetIntVar(&TimeVarId,&Err);
+ if (Err!=0) return Err;
+ SetIntVal(TimeVarId, (int)st.st_mtime);
+ }
+
+ if (CheckParameterGiven()) {
+ GetIntVar(&DrvVarId,&Err);
+ if (Err!=0) return Err;
+ SetIntVal(DrvVarId, st.st_dev);
+ }
+
+ result = 0;
+
+end:
+ SetResult(result);
+
+ return Err;
+}
+
WORD TTLFileStrSeek()
{
WORD Err;
@@ -3897,6 +3948,8 @@
Err = TTLFileSeek(); break;
case RsvFileSeekBack:
Err = TTLFileSeekBack(); break;
+ case RsvFileStat:
+ Err = TTLFileStat(); break;
case RsvFileStrSeek:
Err = TTLFileStrSeek(); break;
case RsvFileStrSeek2:
Modified: trunk/teraterm/ttpmacro/ttmparse.c
===================================================================
--- trunk/teraterm/ttpmacro/ttmparse.c 2010-04-07 11:59:19 UTC (rev 3845)
+++ trunk/teraterm/ttpmacro/ttmparse.c 2010-04-07 12:09:19 UTC (rev 3846)
@@ -178,6 +178,7 @@
else if (_stricmp(Str,"filesearch")==0) *WordId = RsvFileSearch;
else if (_stricmp(Str,"fileseek")==0) *WordId = RsvFileSeek;
else if (_stricmp(Str,"fileseekback")==0) *WordId = RsvFileSeekBack;
+ else if (_stricmp(Str,"filestat")==0) *WordId = RsvFileStat;
else if (_stricmp(Str,"filestrseek")==0) *WordId = RsvFileStrSeek;
else if (_stricmp(Str,"filestrseek2")==0) *WordId = RsvFileStrSeek2;
else if (_stricmp(Str,"filewrite")==0) *WordId = RsvFileWrite;
Modified: trunk/teraterm/ttpmacro/ttmparse.h
===================================================================
--- trunk/teraterm/ttpmacro/ttmparse.h 2010-04-07 11:59:19 UTC (rev 3845)
+++ trunk/teraterm/ttpmacro/ttmparse.h 2010-04-07 12:09:19 UTC (rev 3846)
@@ -220,6 +220,7 @@
#define RsvYmodemRecv 176
#define RsvYmodemSend 177
+#define RsvFileStat 178
// integer type for buffer pointer
typedef DWORD BINT;
From svnnotify @ sourceforge.jp Wed Apr 7 21:12:09 2010
From: svnnotify @ sourceforge.jp (svnnotify @ sourceforge.jp)
Date: Wed, 07 Apr 2010 21:12:09 +0900
Subject: [Ttssh2-commit] =?utf-8?b?WzM4NDddICDjg57jgq/jg63jgrPjg57jg7M=?=
=?utf-8?b?44OJIGZpbGVzdGF0IOOCkui/veWKoOOBl+OBn+OAgg==?=
Message-ID: <1270642329.255084.4805.nullmailer@users.sourceforge.jp>
Revision: 3847
http://sourceforge.jp/projects/ttssh2/svn/view?view=rev&revision=3847
Author: yutakapon
Date: 2010-04-07 21:12:09 +0900 (Wed, 07 Apr 2010)
Log Message:
-----------
???????????filestat ??申??????
cf.
http://logmett.com/forum/viewtopic.php?f=6&t=1357
Modified Paths:
--------------
trunk/doc/en/html/about/history.html
trunk/doc/ja/html/about/history.html
-------------- next part --------------
Modified: trunk/doc/en/html/about/history.html
===================================================================
--- trunk/doc/en/html/about/history.html 2010-04-07 12:09:19 UTC (rev 3846)
+++ trunk/doc/en/html/about/history.html 2010-04-07 12:12:09 UTC (rev 3847)
@@ -43,6 +43,7 @@
added support for the VPB and HPB control sequence.
added the Show Macro Window of the Control menu to flash the running macro window.
+ added the "filestat " macro command.
Modified: trunk/doc/ja/html/about/history.html
===================================================================
--- trunk/doc/ja/html/about/history.html 2010-04-07 12:09:19 UTC (rev 3846)
+++ trunk/doc/ja/html/about/history.html 2010-04-07 12:12:09 UTC (rev 3847)
@@ -43,6 +43,7 @@
VPB, HPB ?????????????
タ?????????????????????????? Control - Show Macro Window ??????????
+ ??????? "filestat " ??????
From svnnotify @ sourceforge.jp Mon Apr 12 00:41:07 2010
From: svnnotify @ sourceforge.jp (svnnotify @ sourceforge.jp)
Date: Mon, 12 Apr 2010 00:41:07 +0900
Subject: [Ttssh2-commit] =?utf-8?b?WzM4NDhdICBmaWxlc3RhdCDjg57jgq/jg60=?=
=?utf-8?b?44Kz44Oe44Oz44OJ44Gu56ysMuW8leaVsOOBqOesrDPlvJXmlbDjgpLjgIE=?=
=?utf-8?b?5paH5a2X5YiX44Gn6L+U44GZ44KI44GG44Gr44GX44Gf44CC?=
Message-ID: <1271000467.254807.5665.nullmailer@users.sourceforge.jp>
Revision: 3848
http://sourceforge.jp/projects/ttssh2/svn/view?view=rev&revision=3848
Author: yutakapon
Date: 2010-04-12 00:41:06 +0900 (Mon, 12 Apr 2010)
Log Message:
-----------
filestat マクロコマンドの第2引数と第3引数を、文字列で返すようにした。
Modified Paths:
--------------
trunk/doc/en/html/macro/command/filestat.html
trunk/doc/ja/html/macro/command/filestat.html
trunk/teraterm/ttpmacro/ttl.c
-------------- next part --------------
Modified: trunk/doc/en/html/macro/command/filestat.html
===================================================================
--- trunk/doc/en/html/macro/command/filestat.html 2010-04-07 12:12:09 UTC (rev 3847)
+++ trunk/doc/en/html/macro/command/filestat.html 2010-04-11 15:41:06 UTC (rev 3848)
@@ -40,7 +40,7 @@
if result = -1 then
messagebox 'file open error' 'filestat'
else
- sprintf2 str 'File size=%d Time modified=%d Drive=%d' size time drive
+ sprintf2 str 'File size=%d Time modified=%s Drive=%s' size time drive
messagebox str 'filestat'
endif
Modified: trunk/doc/ja/html/macro/command/filestat.html
===================================================================
--- trunk/doc/ja/html/macro/command/filestat.html 2010-04-07 12:12:09 UTC (rev 3847)
+++ trunk/doc/ja/html/macro/command/filestat.html 2010-04-11 15:41:06 UTC (rev 3848)
@@ -37,7 +37,7 @@
if result = -1 then
messagebox 'file open error' 'filestat'
else
- sprintf2 str 'File size=%d Time modified=%d Drive=%d' size time drive
+ sprintf2 str 'File size=%d Time modified=%s Drive=%s' size time drive
messagebox str 'filestat'
endif
Modified: trunk/teraterm/ttpmacro/ttl.c
===================================================================
--- trunk/teraterm/ttpmacro/ttl.c 2010-04-07 12:12:09 UTC (rev 3847)
+++ trunk/teraterm/ttpmacro/ttl.c 2010-04-11 15:41:06 UTC (rev 3848)
@@ -1363,7 +1363,7 @@
WORD TTLFileStat()
{
WORD Err, SizeVarId, TimeVarId, DrvVarId;
- TStrVal FName;
+ TStrVal FName, TimeStr, DrvStr;
struct _stat st;
int ret;
int result = -1;
@@ -1391,15 +1391,17 @@
}
if (CheckParameterGiven()) {
- GetIntVar(&TimeVarId,&Err);
+ GetStrVar(&TimeVarId,&Err);
if (Err!=0) return Err;
- SetIntVal(TimeVarId, (int)st.st_mtime);
+ ctime_s(TimeStr, sizeof(TimeStr), &st.st_mtime);
+ SetStrVal(TimeVarId, TimeStr);
}
if (CheckParameterGiven()) {
- GetIntVar(&DrvVarId,&Err);
+ GetStrVar(&DrvVarId,&Err);
if (Err!=0) return Err;
- SetIntVal(DrvVarId, st.st_dev);
+ _snprintf_s(DrvStr, sizeof(DrvStr), _TRUNCATE, "%c", st.st_dev + 'A');
+ SetStrVal(DrvVarId, DrvStr);
}
result = 0;
From svnnotify @ sourceforge.jp Mon Apr 12 13:17:47 2010
From: svnnotify @ sourceforge.jp (svnnotify @ sourceforge.jp)
Date: Mon, 12 Apr 2010 13:17:47 +0900
Subject: [Ttssh2-commit] =?utf-8?b?WzM4NDldICBJbm5vIFNldHVwIOOCkuODkA==?=
=?utf-8?b?44O844K444On44Oz44Ki44OD44OX?=
Message-ID: <1271045867.600043.8417.nullmailer@users.sourceforge.jp>
Revision: 3849
http://sourceforge.jp/projects/ttssh2/svn/view?view=rev&revision=3849
Author: maya
Date: 2010-04-12 13:17:47 +0900 (Mon, 12 Apr 2010)
Log Message:
-----------
Inno Setup ????若??с??≪???Inno Setup ?ユ?茯???<???????????????????????ф????篆??
Inno Setup ?ユ?茯???<????篆??????莨若????????????????
Modified Paths:
--------------
trunk/doc/en/html/reference/develop.txt
trunk/doc/ja/html/reference/develop.txt
Removed Paths:
-------------
trunk/libs/Japanese.isl.patch
-------------- next part --------------
Modified: trunk/doc/en/html/reference/develop.txt
===================================================================
--- trunk/doc/en/html/reference/develop.txt 2010-04-11 15:41:06 UTC (rev 3848)
+++ trunk/doc/en/html/reference/develop.txt 2010-04-12 04:17:47 UTC (rev 3849)
@@ -5,10 +5,9 @@
Visual Studio 2005 SP1 Standard Edition (or higher edition)
Note: the executable program which was compiled by Visual Studio 2008 does not work on Windows NT 4.0, 95, 98 and Me.
- Installer
- Inno Setup 5.3.7 ANSI (http://www.jrsoftware.org/isinfo.php)
- Inno Setup Preprocessor 5.3.6 (from ispack-5.3.7)
- ISTool 5.3.0.1 (from ispack-5.3.7)
- Japanese-5-5.1.11.isl (http://www.jrsoftware.org/files/istrans/)
+ Inno Setup 5.3.9 ANSI (http://www.jrsoftware.org/isinfo.php)
+ Inno Setup Preprocessor 5.3.9 (from ispack-5.3.9)
+ ISTool 5.3.0.1 (from ispack-5.3.9)
- others
Cygwin 1.5.x (1.7.x doesn't support Windows 9x)
ActivePerl 5.8 later version
@@ -203,7 +202,6 @@
http://www.microsoft.com/japan/msdn/vstudio/downloads/default.aspx
Inno Setup
http://www.jrsoftware.org/isdl.php
- http://www.jrsoftware.org/files/istrans/
Oniguruma
http://www.geocities.jp/kosako3/oniguruma/
OpenSSL
Modified: trunk/doc/ja/html/reference/develop.txt
===================================================================
--- trunk/doc/ja/html/reference/develop.txt 2010-04-11 15:41:06 UTC (rev 3848)
+++ trunk/doc/ja/html/reference/develop.txt 2010-04-12 04:17:47 UTC (rev 3849)
@@ -8,10 +8,9 @@
?: Visual Studio 2005 Standard Edition???OpenSSL 0.9.8i?????ク?????Windows Server 2003 R2 Platform SDK ?????????"Crypt32.Lib"??????????????????????
?2: SDK ??????????????????????????INCLUDE ??? LIB ???????????
- ??????
- Inno Setup 5.3.7 ANSI (http://www.jrsoftware.org/isinfo.php)
- Inno Setup Preprocessor 5.3.6 (ispack-5.3.7 ??)
- ISTool 5.3.0.1 (ispack-5.3.7 ??)
- Japanese-5-5.1.11.isl (http://www.jrsoftware.org/files/istrans/)
+ Inno Setup 5.3.9 ANSI (http://www.jrsoftware.org/isinfo.php)
+ Inno Setup Preprocessor 5.3.9 (ispack-5.3.9 ??)
+ ISTool 5.3.0.1 (ispack-5.3.9 ??)
- ???
Cygwin 1.5.x (1.7.x ? Windows 9x ??????????????)
ActivePerl 5.8 ??@@ -211,7 +210,6 @@
http://www.microsoft.com/japan/msdn/vstudio/downloads/default.aspx
Inno Setup
http://www.jrsoftware.org/isdl.php
- http://www.jrsoftware.org/files/istrans/
Oniguruma
http://www.geocities.jp/kosako3/oniguruma/
OpenSSL
Deleted: trunk/libs/Japanese.isl.patch
===================================================================
--- trunk/libs/Japanese.isl.patch 2010-04-11 15:41:06 UTC (rev 3848)
+++ trunk/libs/Japanese.isl.patch 2010-04-12 04:17:47 UTC (rev 3849)
@@ -1,11 +0,0 @@
---- Japanese-5-5.1.11.isl 2007-04-26 22:41:07.646000000 +0900
-+++ Japanese.isl 2009-04-11 18:40:52.530000000 +0900
-@@ -84,7 +84,7 @@
-
- ; *** "Select Language" dialog messages
- SelectLanguageTitle=??????????????????????
--SelectLanguageLabel=???????????????????:
-+SelectLanguageLabel=???????????????????:
-
- ; *** Common wizard text
- ClickNext=????????????????????????u??????????????????
From svnnotify @ sourceforge.jp Mon Apr 12 17:29:53 2010
From: svnnotify @ sourceforge.jp (svnnotify @ sourceforge.jp)
Date: Mon, 12 Apr 2010 17:29:53 +0900
Subject: [Ttssh2-commit] =?utf-8?q?=5B3850=5D_3DES-CTR=2C_BLOWFISH-CTR=2C_?=
=?utf-8?b?IENBU1QxMjgtQ1RSIOWFsemAmumNteaal+WPt+aWueW8j+OCkuOCteODnQ==?=
=?utf-8?b?44O844OI44CC?=
Message-ID: <1271060993.250293.4785.nullmailer@users.sourceforge.jp>
Revision: 3850
http://sourceforge.jp/projects/ttssh2/svn/view?view=rev&revision=3850
Author: doda
Date: 2010-04-12 17:29:53 +0900 (Mon, 12 Apr 2010)
Log Message:
-----------
3DES-CTR, BLOWFISH-CTR, CAST128-CTR ?演??究??傑?綣?????????
Modified Paths:
--------------
trunk/installer/release/TERATERM.INI
trunk/ttssh2/ttxssh/cipher-ctr.c
trunk/ttssh2/ttxssh/crypt.c
trunk/ttssh2/ttxssh/ssh.c
trunk/ttssh2/ttxssh/ssh.h
trunk/ttssh2/ttxssh/ttxssh.c
-------------- next part --------------
Modified: trunk/installer/release/TERATERM.INI
===================================================================
--- trunk/installer/release/TERATERM.INI 2010-04-12 04:17:47 UTC (rev 3849)
+++ trunk/installer/release/TERATERM.INI 2010-04-12 08:29:53 UTC (rev 3850)
@@ -592,11 +592,12 @@
DefaultForwarding=
; Cipher algorithm order
-; (2...DES(SSH1), 3...3DES(SSH1), 6...Blowfish(SSH1), 7...3DES-CBC,
-; 8...AES128-CBC, 9...AES192-CBC, :...AES256-CBC, ;...Blowfish,
-; <...AES128-CTR, =...AES192-CTR, >...AES256-CTR, ?...Arcfour,
-; @...Arcfour128, A...Arcfour256, B...CAST128-CBC etc)
-CipherOrder=>:=9<87;A@?B3026
+; (2...DES(SSH1), 3...3DES(SSH1), 6...Blowfish(SSH1), 7...3DES-CBC,
+; 8...AES128-CBC, 9...AES192-CBC, :...AES256-CBC, ;...Blowfish-CBC,
+; <...AES128-CTR, =...AES192-CTR, >...AES256-CTR, ?...Arcfour,
+; @...Arcfour128, A...Arcfour256, B...CAST128-CBC, C...3DES-CTR,
+; D...BLOWFISH-CTR, E...CAST128-CTR, etc)
+CipherOrder=>:=9<8C7D;A@?EB3062
KnownHostsFiles=ssh_known_hosts
DefaultRhostsLocalUserName=
DefaultRhostsHostPrivateKeyFile=
Modified: trunk/ttssh2/ttxssh/cipher-ctr.c
===================================================================
--- trunk/ttssh2/ttxssh/cipher-ctr.c 2010-04-12 04:17:47 UTC (rev 3849)
+++ trunk/ttssh2/ttxssh/cipher-ctr.c 2010-04-12 08:29:53 UTC (rev 3850)
@@ -23,15 +23,37 @@
#include
#include
+#include
+#include
+#include
extern const EVP_CIPHER *evp_aes_128_ctr(void);
struct ssh_aes_ctr_ctx
{
AES_KEY aes_ctx;
- unsigned char aes_counter[AES_BLOCK_SIZE];
+ unsigned char aes_counter[AES_BLOCK_SIZE];
};
+#define DES_BLOCK_SIZE sizeof(DES_cblock)
+struct ssh_des3_ctr_ctx
+{
+ DES_key_schedule des3_ctx[3];
+ unsigned char des3_counter[DES_BLOCK_SIZE];
+};
+
+struct ssh_blowfish_ctr_ctx
+{
+ BF_KEY blowfish_ctx;
+ unsigned char blowfish_counter[BF_BLOCK];
+};
+
+struct ssh_cast5_ctr_ctx
+{
+ CAST_KEY cast5_ctx;
+ unsigned char cast5_counter[CAST_BLOCK];
+};
+
static void
ssh_ctr_inc(unsigned char *ctr, unsigned int len)
{
@@ -42,6 +64,9 @@
return;
}
+//============================================================================
+// AES
+//============================================================================
static int
ssh_aes_ctr(EVP_CIPHER_CTX *ctx, unsigned char *dest, const unsigned char *src, unsigned int len)
{
@@ -124,3 +149,270 @@
#endif
return (&aes_ctr);
}
+
+//============================================================================
+// Triple-DES
+//============================================================================
+static int
+ssh_des3_ctr(EVP_CIPHER_CTX *ctx, unsigned char *dest, const unsigned char *src, unsigned int len)
+{
+ struct ssh_des3_ctr_ctx *c;
+ unsigned int n = 0;
+ unsigned char buf[DES_BLOCK_SIZE];
+
+ if (len == 0)
+ return (1);
+ if ((c = EVP_CIPHER_CTX_get_app_data(ctx)) == NULL)
+ return (0);
+
+ while ((len--) > 0) {
+ if (n == 0) {
+ memcpy(buf, (unsigned char *)(c->des3_counter), DES_BLOCK_SIZE);
+ DES_encrypt3((DES_LONG *)buf, &c->des3_ctx[0], &c->des3_ctx[1], &c->des3_ctx[2]);
+ ssh_ctr_inc(c->des3_counter, DES_BLOCK_SIZE);
+ }
+ *(dest++) = *(src++) ^ buf[n];
+ n = (n + 1) % DES_BLOCK_SIZE;
+ }
+ return (1);
+}
+
+static int
+ssh_des3_ctr_init(EVP_CIPHER_CTX *ctx, const unsigned char *key, const unsigned char *iv, int enc)
+{
+ struct ssh_des3_ctr_ctx *c;
+
+ if ((c = EVP_CIPHER_CTX_get_app_data(ctx)) == NULL) {
+ c = malloc(sizeof(*c));
+ EVP_CIPHER_CTX_set_app_data(ctx, c);
+ }
+ if (key != NULL) {
+ DES_set_key((const_DES_cblock *)key, &c->des3_ctx[0]);
+ DES_set_key((const_DES_cblock *)(key + 8), &c->des3_ctx[1]);
+ DES_set_key((const_DES_cblock *)(key + 16), &c->des3_ctx[2]);
+ }
+
+ if (iv != NULL)
+ memcpy(c->des3_counter, iv, DES_BLOCK_SIZE);
+ return (1);
+}
+
+static int
+ssh_des3_ctr_cleanup(EVP_CIPHER_CTX *ctx)
+{
+ struct ssh_des3_ctr_ctx *c;
+
+ if((c = EVP_CIPHER_CTX_get_app_data(ctx)) != NULL) {
+ memset(c, 0, sizeof(*c));
+ free(c);
+ EVP_CIPHER_CTX_set_app_data(ctx, NULL);
+ }
+ return (1);
+}
+
+const EVP_CIPHER *
+evp_des3_ctr(void)
+{
+ static EVP_CIPHER des3_ctr;
+
+ memset(&des3_ctr, 0, sizeof(EVP_CIPHER));
+ des3_ctr.nid = NID_undef;
+ des3_ctr.block_size = DES_BLOCK_SIZE;
+ des3_ctr.iv_len = DES_BLOCK_SIZE;
+ des3_ctr.key_len = 24;
+ des3_ctr.init = ssh_des3_ctr_init;
+ des3_ctr.cleanup = ssh_des3_ctr_cleanup;
+ des3_ctr.do_cipher = ssh_des3_ctr;
+#ifndef SSH_OLD_EVP
+ des3_ctr.flags = EVP_CIPH_CBC_MODE | EVP_CIPH_VARIABLE_LENGTH | EVP_CIPH_ALWAYS_CALL_INIT | EVP_CIPH_CUSTOM_IV;
+#endif
+ return (&des3_ctr);
+}
+
+//============================================================================
+// Blowfish
+//============================================================================
+static int
+ssh_bf_ctr(EVP_CIPHER_CTX *ctx, unsigned char *dest, const unsigned char *src, unsigned int len)
+{
+ struct ssh_blowfish_ctr_ctx *c;
+ unsigned int n = 0;
+ unsigned char buf[BF_BLOCK];
+ int i, j;
+ BF_LONG tmp[(BF_BLOCK + 3) / 4];
+ unsigned char *p;
+
+ if (len == 0)
+ return (1);
+ if ((c = EVP_CIPHER_CTX_get_app_data(ctx)) == NULL)
+ return (0);
+
+ while ((len--) > 0) {
+ if (n == 0) {
+ for (i = j = 0, p = c->blowfish_counter; i < BF_BLOCK; i += 4, j++) {
+ tmp[j] = ((BF_LONG)*p++) << 24;
+ tmp[j] |= ((BF_LONG)*p++) << 16;
+ tmp[j] |= ((BF_LONG)*p++) << 8;
+ tmp[j] |= ((BF_LONG)*p++);
+ }
+
+ BF_encrypt(tmp, &c->blowfish_ctx);
+
+ for (i = j = 0, p = buf; i < BF_BLOCK; i += 4, j++) {
+ *p++ = (unsigned char)(tmp[j] >> 24);
+ *p++ = (unsigned char)(tmp[j] >> 16);
+ *p++ = (unsigned char)(tmp[j] >> 8);
+ *p++ = (unsigned char)tmp[j];
+ }
+
+ ssh_ctr_inc(c->blowfish_counter, BF_BLOCK);
+ }
+ *(dest++) = *(src++) ^ buf[n];
+ n = (n + 1) % BF_BLOCK;
+ }
+ return (1);
+}
+
+static int
+ssh_bf_ctr_init(EVP_CIPHER_CTX *ctx, const unsigned char *key, const unsigned char *iv, int enc)
+{
+ struct ssh_blowfish_ctr_ctx *c;
+
+ if ((c = EVP_CIPHER_CTX_get_app_data(ctx)) == NULL) {
+ c = malloc(sizeof(*c));
+ EVP_CIPHER_CTX_set_app_data(ctx, c);
+ }
+ if (key != NULL) {
+ BF_set_key(&c->blowfish_ctx, EVP_CIPHER_CTX_key_length(ctx), key);
+ }
+
+ if (iv != NULL)
+ memcpy(c->blowfish_counter, iv, BF_BLOCK);
+ return (1);
+}
+
+static int
+ssh_bf_ctr_cleanup(EVP_CIPHER_CTX *ctx)
+{
+ struct ssh_blowfish_ctr_ctx *c;
+
+ if((c = EVP_CIPHER_CTX_get_app_data(ctx)) != NULL) {
+ memset(c, 0, sizeof(*c));
+ free(c);
+ EVP_CIPHER_CTX_set_app_data(ctx, NULL);
+ }
+ return (1);
+}
+
+const EVP_CIPHER *
+evp_bf_ctr(void)
+{
+ static EVP_CIPHER blowfish_ctr;
+
+ memset(&blowfish_ctr, 0, sizeof(EVP_CIPHER));
+ blowfish_ctr.nid = NID_undef;
+ blowfish_ctr.block_size = BF_BLOCK;
+ blowfish_ctr.iv_len = BF_BLOCK;
+ blowfish_ctr.key_len = 16;
+ blowfish_ctr.init = ssh_bf_ctr_init;
+ blowfish_ctr.cleanup = ssh_bf_ctr_cleanup;
+ blowfish_ctr.do_cipher = ssh_bf_ctr;
+#ifndef SSH_OLD_EVP
+ blowfish_ctr.flags = EVP_CIPH_CBC_MODE | EVP_CIPH_VARIABLE_LENGTH | EVP_CIPH_ALWAYS_CALL_INIT | EVP_CIPH_CUSTOM_IV;
+#endif
+ return (&blowfish_ctr);
+}
+
+//============================================================================
+// CAST-128
+//============================================================================
+static int
+ssh_cast5_ctr(EVP_CIPHER_CTX *ctx, unsigned char *dest, const unsigned char *src, unsigned int len)
+{
+ struct ssh_cast5_ctr_ctx *c;
+ unsigned int n = 0;
+ unsigned char buf[CAST_BLOCK];
+ int i, j;
+ CAST_LONG tmp[(CAST_BLOCK + 3) / 4];
+ unsigned char *p;
+
+ if (len == 0)
+ return (1);
+ if ((c = EVP_CIPHER_CTX_get_app_data(ctx)) == NULL)
+ return (0);
+
+ while ((len--) > 0) {
+ if (n == 0) {
+ for (i = j = 0, p = c->cast5_counter; i < CAST_BLOCK; i += 4, j++) {
+ tmp[j] = ((CAST_LONG)*p++) << 24;
+ tmp[j] |= ((CAST_LONG)*p++) << 16;
+ tmp[j] |= ((CAST_LONG)*p++) << 8;
+ tmp[j] |= ((CAST_LONG)*p++);
+ }
+
+ CAST_encrypt(tmp, &c->cast5_ctx);
+
+ for (i = j = 0, p = buf; i < CAST_BLOCK; i += 4, j++) {
+ *p++ = (unsigned char)(tmp[j] >> 24);
+ *p++ = (unsigned char)(tmp[j] >> 16);
+ *p++ = (unsigned char)(tmp[j] >> 8);
+ *p++ = (unsigned char)tmp[j];
+ }
+
+ ssh_ctr_inc(c->cast5_counter, CAST_BLOCK);
+ }
+ *(dest++) = *(src++) ^ buf[n];
+ n = (n + 1) % CAST_BLOCK;
+ }
+ return (1);
+}
+
+static int
+ssh_cast5_ctr_init(EVP_CIPHER_CTX *ctx, const unsigned char *key, const unsigned char *iv, int enc)
+{
+ struct ssh_cast5_ctr_ctx *c;
+
+ if ((c = EVP_CIPHER_CTX_get_app_data(ctx)) == NULL) {
+ c = malloc(sizeof(*c));
+ EVP_CIPHER_CTX_set_app_data(ctx, c);
+ }
+ if (key != NULL) {
+ CAST_set_key(&c->cast5_ctx, EVP_CIPHER_CTX_key_length(ctx), key);
+ }
+
+ if (iv != NULL)
+ memcpy(c->cast5_counter, iv, CAST_BLOCK);
+ return (1);
+}
+
+static int
+ssh_cast5_ctr_cleanup(EVP_CIPHER_CTX *ctx)
+{
+ struct ssh_cast5_ctr_ctx *c;
+
+ if((c = EVP_CIPHER_CTX_get_app_data(ctx)) != NULL) {
+ memset(c, 0, sizeof(*c));
+ free(c);
+ EVP_CIPHER_CTX_set_app_data(ctx, NULL);
+ }
+ return (1);
+}
+
+const EVP_CIPHER *
+evp_cast5_ctr(void)
+{
+ static EVP_CIPHER cast5_ctr;
+
+ memset(&cast5_ctr, 0, sizeof(EVP_CIPHER));
+ cast5_ctr.nid = NID_undef;
+ cast5_ctr.block_size = CAST_BLOCK;
+ cast5_ctr.iv_len = CAST_BLOCK;
+ cast5_ctr.key_len = 16;
+ cast5_ctr.init = ssh_cast5_ctr_init;
+ cast5_ctr.cleanup = ssh_cast5_ctr_cleanup;
+ cast5_ctr.do_cipher = ssh_cast5_ctr;
+#ifndef SSH_OLD_EVP
+ cast5_ctr.flags = EVP_CIPH_CBC_MODE | EVP_CIPH_VARIABLE_LENGTH | EVP_CIPH_ALWAYS_CALL_INIT | EVP_CIPH_CUSTOM_IV;
+#endif
+ return (&cast5_ctr);
+}
Modified: trunk/ttssh2/ttxssh/crypt.c
===================================================================
--- trunk/ttssh2/ttxssh/crypt.c 2010-04-12 04:17:47 UTC (rev 3849)
+++ trunk/ttssh2/ttxssh/crypt.c 2010-04-12 08:29:53 UTC (rev 3850)
@@ -312,7 +312,7 @@
// for SSH2(yutaka)
-static void c3DES_CBC_encrypt(PTInstVar pvar, unsigned char FAR * buf,
+static void c3DES_encrypt2(PTInstVar pvar, unsigned char FAR * buf,
int bytes)
{
unsigned char *newbuf = malloc(bytes);
@@ -359,7 +359,7 @@
free(newbuf);
}
-static void c3DES_CBC_decrypt(PTInstVar pvar, unsigned char FAR * buf,
+static void c3DES_decrypt2(PTInstVar pvar, unsigned char FAR * buf,
int bytes)
{
unsigned char *newbuf = malloc(bytes);
@@ -864,7 +864,10 @@
| (1 << SSH2_CIPHER_ARCFOUR)
| (1 << SSH2_CIPHER_ARCFOUR128)
| (1 << SSH2_CIPHER_ARCFOUR256)
- | (1 << SSH2_CIPHER_CAST128_CBC);
+ | (1 << SSH2_CIPHER_CAST128_CBC)
+ | (1 << SSH2_CIPHER_3DES_CTR)
+ | (1 << SSH2_CIPHER_BLOWFISH_CTR)
+ | (1 << SSH2_CIPHER_CAST128_CTR);
}
sender_ciphers &= cipher_mask;
@@ -1329,6 +1332,7 @@
switch (pvar->crypt_state.sender_cipher) {
// for SSH2(yutaka)
case SSH2_CIPHER_3DES_CBC:
+ case SSH2_CIPHER_3DES_CTR:
{
struct Enc *enc;
@@ -1344,7 +1348,7 @@
//debug_print(10, enc->key, get_cipher_key_len(pvar->crypt_state.sender_cipher));
//debug_print(11, enc->iv, get_cipher_block_size(pvar->crypt_state.sender_cipher));
- pvar->crypt_state.encrypt = c3DES_CBC_encrypt;
+ pvar->crypt_state.encrypt = c3DES_encrypt2;
break;
}
@@ -1375,6 +1379,7 @@
}
case SSH2_CIPHER_BLOWFISH_CBC:
+ case SSH2_CIPHER_BLOWFISH_CTR:
{
struct Enc *enc;
@@ -1416,6 +1421,7 @@
}
case SSH2_CIPHER_CAST128_CBC:
+ case SSH2_CIPHER_CAST128_CTR:
{
struct Enc *enc;
@@ -1471,6 +1477,7 @@
switch (pvar->crypt_state.receiver_cipher) {
// for SSH2(yutaka)
case SSH2_CIPHER_3DES_CBC:
+ case SSH2_CIPHER_3DES_CTR:
{
struct Enc *enc;
@@ -1486,7 +1493,7 @@
//debug_print(12, enc->key, get_cipher_key_len(pvar->crypt_state.receiver_cipher));
//debug_print(13, enc->iv, get_cipher_block_size(pvar->crypt_state.receiver_cipher));
- pvar->crypt_state.decrypt = c3DES_CBC_decrypt;
+ pvar->crypt_state.decrypt = c3DES_decrypt2;
break;
}
@@ -1517,6 +1524,7 @@
}
case SSH2_CIPHER_BLOWFISH_CBC:
+ case SSH2_CIPHER_BLOWFISH_CTR:
{
struct Enc *enc;
@@ -1559,6 +1567,7 @@
}
case SSH2_CIPHER_CAST128_CBC:
+ case SSH2_CIPHER_CAST128_CTR:
{
struct Enc *enc;
@@ -1677,6 +1686,12 @@
return "Arcfour256";
case SSH2_CIPHER_CAST128_CBC:
return "CAST-128-CBC";
+ case SSH2_CIPHER_3DES_CTR:
+ return "3DES-CTR";
+ case SSH2_CIPHER_BLOWFISH_CTR:
+ return "Blowfish-CTR";
+ case SSH2_CIPHER_CAST128_CTR:
+ return "CAST-128-CTR";
default:
return "Unknown";
Modified: trunk/ttssh2/ttxssh/ssh.c
===================================================================
--- trunk/ttssh2/ttxssh/ssh.c 2010-04-12 04:17:47 UTC (rev 3849)
+++ trunk/ttssh2/ttxssh/ssh.c 2010-04-12 08:29:53 UTC (rev 3850)
@@ -4040,6 +4040,7 @@
static char buf[192]; // TODO: malloc()????
int cipher;
int len, i;
+ char *c_str;
// ????????????????????(2006.6.26 maya)
if (pvar->socket != INVALID_SOCKET) {
@@ -4052,42 +4053,56 @@
cipher = pvar->settings.CipherOrder[i] - '0';
if (cipher == 0) // disabled line
break;
- if (cipher == SSH2_CIPHER_AES128_CBC) {
- strncat_s(buf, sizeof(buf), "aes128-cbc,", _TRUNCATE);
+ switch (cipher) {
+ case SSH2_CIPHER_3DES_CBC:
+ c_str = "3des-cbc,";
+ break;
+ case SSH2_CIPHER_3DES_CTR:
+ c_str = "3des-ctr,";
+ break;
+ case SSH2_CIPHER_BLOWFISH_CBC:
+ c_str = "blowfish-cbc,";
+ break;
+ case SSH2_CIPHER_BLOWFISH_CTR:
+ c_str = "blowfish-ctr,";
+ break;
+ case SSH2_CIPHER_AES128_CBC:
+ c_str = "aes128-cbc";
+ break;
+ case SSH2_CIPHER_AES192_CBC:
+ c_str = "aes192-cbc,";
+ break;
+ case SSH2_CIPHER_AES256_CBC:
+ c_str = "aes256-cbc,";
+ break;
+ case SSH2_CIPHER_AES128_CTR:
+ c_str = "aes128-ctr,";
+ break;
+ case SSH2_CIPHER_AES192_CTR:
+ c_str = "aes192-ctr,";
+ break;
+ case SSH2_CIPHER_AES256_CTR:
+ c_str = "aes256-ctr,";
+ break;
+ case SSH2_CIPHER_ARCFOUR:
+ c_str = "arcfour,";
+ break;
+ case SSH2_CIPHER_ARCFOUR128:
+ c_str = "arcfour128,";
+ break;
+ case SSH2_CIPHER_ARCFOUR256:
+ c_str = "arcfour256,";
+ break;
+ case SSH2_CIPHER_CAST128_CBC:
+ c_str = "cast128-cbc,";
+ break;
+ case SSH2_CIPHER_CAST128_CTR:
+ c_str = "cast128-ctr,";
+ break;
+ default:
+ continue;
}
- else if (cipher == SSH2_CIPHER_3DES_CBC) {
- strncat_s(buf, sizeof(buf), "3des-cbc,", _TRUNCATE);
- }
- else if (cipher == SSH2_CIPHER_AES192_CBC) {
- strncat_s(buf, sizeof(buf), "aes192-cbc,", _TRUNCATE);
- }
- else if (cipher == SSH2_CIPHER_AES256_CBC) {
- strncat_s(buf, sizeof(buf), "aes256-cbc,", _TRUNCATE);
- }
- else if (cipher == SSH2_CIPHER_BLOWFISH_CBC) {
- strncat_s(buf, sizeof(buf), "blowfish-cbc,", _TRUNCATE);
- }
- else if (cipher == SSH2_CIPHER_AES128_CTR) {
- strncat_s(buf, sizeof(buf), "aes128-ctr,", _TRUNCATE);
- }
- else if (cipher == SSH2_CIPHER_AES192_CTR) {
- strncat_s(buf, sizeof(buf), "aes192-ctr,", _TRUNCATE);
- }
- else if (cipher == SSH2_CIPHER_AES256_CTR) {
- strncat_s(buf, sizeof(buf), "aes256-ctr,", _TRUNCATE);
- }
- else if (cipher == SSH2_CIPHER_ARCFOUR) {
- strncat_s(buf, sizeof(buf), "arcfour,", _TRUNCATE);
- }
- else if (cipher == SSH2_CIPHER_ARCFOUR128) {
- strncat_s(buf, sizeof(buf), "arcfour128,", _TRUNCATE);
- }
- else if (cipher == SSH2_CIPHER_ARCFOUR256) {
- strncat_s(buf, sizeof(buf), "arcfour256,", _TRUNCATE);
- }
- else if (cipher == SSH2_CIPHER_CAST128_CBC) {
- strncat_s(buf, sizeof(buf), "cast128-cbc,", _TRUNCATE);
- }
+ strncat_s(buf, sizeof(buf), c_str, _TRUNCATE);
}
len = strlen(buf);
buf[len - 1] = '\0'; // get rid of comma
@@ -4229,6 +4244,12 @@
cipher = SSH2_CIPHER_ARCFOUR;
} else if (strcmp(str_cipher, "cast128-cbc") == 0) {
cipher = SSH2_CIPHER_CAST128_CBC;
+ } else if (strcmp(str_cipher, "3des-ctr") == 0) {
+ cipher = SSH2_CIPHER_3DES_CTR;
+ } else if (strcmp(str_cipher, "blowfish-ctr") == 0) {
+ cipher = SSH2_CIPHER_BLOWFISH_CTR;
+ } else if (strcmp(str_cipher, "cast128-ctr") == 0) {
+ cipher = SSH2_CIPHER_CAST128_CTR;
}
return (cipher);
@@ -6539,6 +6560,9 @@
| 1 << SSH2_CIPHER_ARCFOUR128
| 1 << SSH2_CIPHER_ARCFOUR256
| 1 << SSH2_CIPHER_CAST128_CBC
+ | 1 << SSH2_CIPHER_3DES_CTR
+ | 1 << SSH2_CIPHER_BLOWFISH_CTR
+ | 1 << SSH2_CIPHER_CAST128_CTR
);
int type = (1 << SSH_AUTH_PASSWORD) | (1 << SSH_AUTH_RSA) |
(1 << SSH_AUTH_TIS) | (1 << SSH_AUTH_PAGEANT);
Modified: trunk/ttssh2/ttxssh/ssh.h
===================================================================
--- trunk/ttssh2/ttxssh/ssh.h 2010-04-12 04:17:47 UTC (rev 3849)
+++ trunk/ttssh2/ttxssh/ssh.h 2010-04-12 08:29:53 UTC (rev 3850)
@@ -47,6 +47,9 @@
// from OpenSSH
extern const EVP_CIPHER *evp_aes_128_ctr(void);
+extern const EVP_CIPHER *evp_des3_ctr(void);
+extern const EVP_CIPHER *evp_bf_ctr(void);
+extern const EVP_CIPHER *evp_cast5_ctr(void);
// yutaka
#define SSH2_USE
@@ -87,9 +90,10 @@
SSH2_CIPHER_AES192_CTR, SSH2_CIPHER_AES256_CTR,
SSH2_CIPHER_ARCFOUR, SSH2_CIPHER_ARCFOUR128, SSH2_CIPHER_ARCFOUR256,
SSH2_CIPHER_CAST128_CBC,
+ SSH2_CIPHER_3DES_CTR, SSH2_CIPHER_BLOWFISH_CTR, SSH2_CIPHER_CAST128_CTR,
} SSHCipher;
-#define SSH_CIPHER_MAX SSH2_CIPHER_CAST128_CBC
+#define SSH_CIPHER_MAX SSH2_CIPHER_CAST128_CTR
typedef enum {
SSH_AUTH_NONE, SSH_AUTH_RHOSTS, SSH_AUTH_RSA, SSH_AUTH_PASSWORD,
@@ -315,6 +319,9 @@
{SSH2_CIPHER_ARCFOUR128, "arcfour128", 8, 16, 1536, EVP_rc4},
{SSH2_CIPHER_ARCFOUR256, "arcfour256", 8, 32, 1536, EVP_rc4},
{SSH2_CIPHER_CAST128_CBC, "cast128-cbc", 8, 16, 0, EVP_cast5_cbc},
+ {SSH2_CIPHER_3DES_CTR, "3des-ctr", 8, 24, 0, evp_des3_ctr},
+ {SSH2_CIPHER_BLOWFISH_CTR, "blowfish-ctr", 8, 16, 0, evp_bf_ctr},
+ {SSH2_CIPHER_CAST128_CTR, "cast128-ctr", 8, 16, 0, evp_cast5_ctr},
{SSH_CIPHER_NONE, NULL, 0, 0, 0, NULL},
};
Modified: trunk/ttssh2/ttxssh/ttxssh.c
===================================================================
--- trunk/ttssh2/ttxssh/ttxssh.c 2010-04-12 04:17:47 UTC (rev 3849)
+++ trunk/ttssh2/ttxssh/ttxssh.c 2010-04-12 08:29:53 UTC (rev 3850)
@@ -204,11 +204,14 @@
SSH2_CIPHER_AES192_CBC,
SSH2_CIPHER_AES128_CTR,
SSH2_CIPHER_AES128_CBC,
+ SSH2_CIPHER_3DES_CTR,
SSH2_CIPHER_3DES_CBC,
+ SSH2_CIPHER_BLOWFISH_CTR,
SSH2_CIPHER_BLOWFISH_CBC,
SSH2_CIPHER_ARCFOUR256,
SSH2_CIPHER_ARCFOUR128,
SSH2_CIPHER_ARCFOUR,
+ SSH2_CIPHER_CAST128_CTR,
SSH2_CIPHER_CAST128_CBC,
SSH_CIPHER_3DES,
SSH_CIPHER_NONE,
@@ -2369,6 +2372,12 @@
return "Arcfour256(SSH2)";
case SSH2_CIPHER_CAST128_CBC:
return "CAST128-CBC(SSH2)";
+ case SSH2_CIPHER_3DES_CTR:
+ return "3DES-CTR(SSH2)";
+ case SSH2_CIPHER_BLOWFISH_CTR:
+ return "Blowfish-CTR(SSH2)";
+ case SSH2_CIPHER_CAST128_CTR:
+ return "CAST128-CTR(SSH2)";
default:
return NULL;
From svnnotify @ sourceforge.jp Mon Apr 12 19:18:11 2010
From: svnnotify @ sourceforge.jp (svnnotify @ sourceforge.jp)
Date: Mon, 12 Apr 2010 19:18:11 +0900
Subject: [Ttssh2-commit] [3851] Capitalize.
Message-ID: <1271067491.039657.1667.nullmailer@users.sourceforge.jp>
Revision: 3851
http://sourceforge.jp/projects/ttssh2/svn/view?view=rev&revision=3851
Author: doda
Date: 2010-04-12 19:18:10 +0900 (Mon, 12 Apr 2010)
Log Message:
-----------
Capitalize.
Modified Paths:
--------------
trunk/installer/release/TERATERM.INI
-------------- next part --------------
Modified: trunk/installer/release/TERATERM.INI
===================================================================
--- trunk/installer/release/TERATERM.INI 2010-04-12 08:29:53 UTC (rev 3850)
+++ trunk/installer/release/TERATERM.INI 2010-04-12 10:18:10 UTC (rev 3851)
@@ -596,7 +596,7 @@
; 8...AES128-CBC, 9...AES192-CBC, :...AES256-CBC, ;...Blowfish-CBC,
; <...AES128-CTR, =...AES192-CTR, >...AES256-CTR, ?...Arcfour,
; @...Arcfour128, A...Arcfour256, B...CAST128-CBC, C...3DES-CTR,
-; D...BLOWFISH-CTR, E...CAST128-CTR, etc)
+; D...Blowfish-CTR, E...CAST128-CTR, etc)
CipherOrder=>:=9<8C7D;A@?EB3062
KnownHostsFiles=ssh_known_hosts
DefaultRhostsLocalUserName=
From svnnotify @ sourceforge.jp Mon Apr 12 21:20:19 2010
From: svnnotify @ sourceforge.jp (svnnotify @ sourceforge.jp)
Date: Mon, 12 Apr 2010 21:20:19 +0900
Subject: [Ttssh2-commit] =?utf-8?b?WzM4NTJdICDkvb/nlKjjgZfjgabjgYTjgao=?=
=?utf-8?b?44GE6Zai5pWw44KS5YmK6Zmk44CC?=
Message-ID: <1271074819.291278.15716.nullmailer@users.sourceforge.jp>
Revision: 3852
http://sourceforge.jp/projects/ttssh2/svn/view?view=rev&revision=3852
Author: doda
Date: 2010-04-12 21:20:19 +0900 (Mon, 12 Apr 2010)
Log Message:
-----------
使用していない関数を削除。
Modified Paths:
--------------
trunk/ttssh2/ttxssh/cipher-ctr.c
-------------- next part --------------
Modified: trunk/ttssh2/ttxssh/cipher-ctr.c
===================================================================
--- trunk/ttssh2/ttxssh/cipher-ctr.c 2010-04-12 10:18:10 UTC (rev 3851)
+++ trunk/ttssh2/ttxssh/cipher-ctr.c 2010-04-12 12:20:19 UTC (rev 3852)
@@ -119,18 +119,6 @@
return (1);
}
-void
-ssh_aes_ctr_iv(EVP_CIPHER_CTX *evp, int doset, unsigned char * iv, unsigned int len)
-{
- struct ssh_aes_ctr_ctx *c;
-
- if ((c = EVP_CIPHER_CTX_get_app_data(evp)) != NULL)
- if(doset)
- memcpy(c->aes_counter, iv, len);
- else
- memcpy(iv, c->aes_counter, len);
-}
-
const EVP_CIPHER *
evp_aes_128_ctr(void)
{
From svnnotify @ sourceforge.jp Mon Apr 12 21:24:01 2010
From: svnnotify @ sourceforge.jp (svnnotify @ sourceforge.jp)
Date: Mon, 12 Apr 2010 21:24:01 +0900
Subject: [Ttssh2-commit] =?utf-8?b?WzM4NTNdICBEZWJ1ZyDjg5Pjg6vjg4njga4g?=
=?utf-8?b?emxpYiAuIHBkYiDjgpLpgIDpgb/jgZnjgovjgojjgYbjgavjgZfjgZ/jgII=?=
Message-ID: <1271075041.763353.20717.nullmailer@users.sourceforge.jp>
Revision: 3853
http://sourceforge.jp/projects/ttssh2/svn/view?view=rev&revision=3853
Author: doda
Date: 2010-04-12 21:24:01 +0900 (Mon, 12 Apr 2010)
Log Message:
-----------
Debug ビルドの zlib.pdb を退避するようにした。
# 問題が起きたらすみません。
Modified Paths:
--------------
trunk/libs/buildzlib.bat
-------------- next part --------------
Modified: trunk/libs/buildzlib.bat
===================================================================
--- trunk/libs/buildzlib.bat 2010-04-12 12:20:19 UTC (rev 3852)
+++ trunk/libs/buildzlib.bat 2010-04-12 12:24:01 UTC (rev 3853)
@@ -18,8 +18,10 @@
nmake -f win32\Makefile.msc.debug clean
nmake -f win32\Makefile.msc.debug
move zlibd.lib examples\
+move zlib.pdb examples\
nmake -f win32\Makefile.msc.release clean
move examples\zlibd.lib .\
+move examples\zlib.pdb .\
:build_release
nmake -f win32\Makefile.msc.release
From svnnotify @ sourceforge.jp Mon Apr 12 21:51:24 2010
From: svnnotify @ sourceforge.jp (svnnotify @ sourceforge.jp)
Date: Mon, 12 Apr 2010 21:51:24 +0900
Subject: [Ttssh2-commit] =?utf-8?b?WzM4NTRdICDlpInmm7TlsaXmrbTmm7TmlrA=?=
=?utf-8?b?44CCICgzREVTLUNUUiBldGMuKQ==?=
Message-ID: <1271076684.978200.28794.nullmailer@users.sourceforge.jp>
Revision: 3854
http://sourceforge.jp/projects/ttssh2/svn/view?view=rev&revision=3854
Author: doda
Date: 2010-04-12 21:51:24 +0900 (Mon, 12 Apr 2010)
Log Message:
-----------
紊??絮ユ??贋???3DES-CTR etc.)
Modified Paths:
--------------
trunk/doc/en/html/about/history.html
trunk/doc/ja/html/about/history.html
-------------- next part --------------
Modified: trunk/doc/en/html/about/history.html
===================================================================
--- trunk/doc/en/html/about/history.html 2010-04-12 12:24:01 UTC (rev 3853)
+++ trunk/doc/en/html/about/history.html 2010-04-12 12:51:24 UTC (rev 3854)
@@ -1470,12 +1470,16 @@
Changes
+ added 3DES-CTR, Blowfish-CTR and CAST128-CTR symmetric key cipher algorithm for SSH2 protocol.
+
+ added "C", "D" and "E" to CipherOrder entry in teraterm.ini file.
+
Modified: trunk/doc/ja/html/about/history.html
===================================================================
--- trunk/doc/ja/html/about/history.html 2010-04-12 12:24:01 UTC (rev 3853)
+++ trunk/doc/ja/html/about/history.html 2010-04-12 12:51:24 UTC (rev 3854)
@@ -1477,6 +1477,10 @@
???????????? ??????
??????? ??????
+ SSH2 ???????ョ? 3DES-CTR, Blowfish-CTR, CAST128-CTR ??????
+
+ teraterm.ini ? CipherOrder ????? "C", "D", "E" ??????
+
From svnnotify @ sourceforge.jp Mon Apr 12 22:43:07 2010
From: svnnotify @ sourceforge.jp (svnnotify @ sourceforge.jp)
Date: Mon, 12 Apr 2010 22:43:07 +0900
Subject: [Ttssh2-commit] [3855] Z.
Message-ID: <1271079787.427685.8623.nullmailer@users.sourceforge.jp>
Revision: 3855
http://sourceforge.jp/projects/ttssh2/svn/view?view=rev&revision=3855
Author: yutakapon
Date: 2010-04-12 22:43:07 +0900 (Mon, 12 Apr 2010)
Log Message:
-----------
Z. Vickery 羂???????????????
Modified Paths:
--------------
trunk/teraterm/teraterm/commlib.c
trunk/teraterm/ttpfile/ttfile.c
trunk/teraterm/ttpfile/xmodem.c
trunk/teraterm/ttpfile/ymodem.c
-------------- next part --------------
Modified: trunk/teraterm/teraterm/commlib.c
===================================================================
--- trunk/teraterm/teraterm/commlib.c 2010-04-12 12:51:24 UTC (rev 3854)
+++ trunk/teraterm/teraterm/commlib.c 2010-04-12 13:43:07 UTC (rev 3855)
@@ -1,1148 +1,1149 @@
-/* Tera Term
- Copyright(C) 1994-1998 T. Teranishi
- All rights reserved. */
-/* IPv6 modification is Copyright (C) 2000, 2001 Jun-ya KATO */
-
-/* TERATERM.EXE, Communication routines */
-#include "teraterm.h"
-#include "tttypes.h"
-#include "tt_res.h"
-#include
-
-#include "ttcommon.h"
-#include "ttwsk.h"
-#include "ttlib.h"
-#include "ttfileio.h"
-#include "ttplug.h" /* TTPLUG */
-
-#include "commlib.h"
-#ifndef NO_INET6
-#include
-#include
-#include /* for _snprintf() */
-#include "WSAAsyncGetAddrInfo.h"
-#endif /* NO_INET6 */
-#include
-
-static SOCKET OpenSocket(PComVar);
-static void AsyncConnect(PComVar);
-static int CloseSocket(SOCKET);
-
-/* create socket */
-static SOCKET OpenSocket(PComVar cv)
-{
- cv->s = cv->res->ai_family;
- cv->s = Psocket(cv->res->ai_family, cv->res->ai_socktype, cv->res->ai_protocol);
- return cv->s;
-}
-
-/* connect with asynchronous mode */
-static void AsyncConnect(PComVar cv)
-{
- int Err;
- BOOL BBuf;
- BBuf = TRUE;
- /* set synchronous mode */
- PWSAAsyncSelect(cv->s,cv->HWin,0,0);
- Psetsockopt(cv->s,(int)SOL_SOCKET,SO_OOBINLINE,(char FAR *)&BBuf,sizeof(BBuf));
- /* set asynchronous mode */
- PWSAAsyncSelect(cv->s,cv->HWin,WM_USER_COMMOPEN, FD_CONNECT);
-
- // ?????????????????????????????????
- // ?????L??????????0?????????B
- // (2007.1.11 yutaka)
- if (*cv->ConnetingTimeout > 0) {
- SetTimer(cv->HWin, IdCancelConnectTimer, *cv->ConnetingTimeout * 1000, NULL);
- }
-
- /* WM_USER_COMMOPEN occurs, CommOpen is called, then CommStart is called */
- Err = Pconnect(cv->s, cv->res->ai_addr, cv->res->ai_addrlen);
- if (Err != 0) {
- Err = PWSAGetLastError();
- if (Err == WSAEWOULDBLOCK) {
- /* Do nothing */
- } else if (Err!=0 ) {
- PostMessage(cv->HWin, WM_USER_COMMOPEN,0,
- MAKELONG(FD_CONNECT,Err));
- }
- }
-}
-
-/* close socket */
-static int CloseSocket(SOCKET s)
-{
- return Pclosesocket(s);
-}
-
-#define CommInQueSize 8192
-#define CommOutQueSize 2048
-#define CommXonLim 2048
-#define CommXoffLim 2048
-
-#define READENDNAME "ReadEnd"
-#define WRITENAME "Write"
-#define READNAME "Read"
-#define PRNWRITENAME "PrnWrite"
-
-static HANDLE ReadEnd;
-static OVERLAPPED wol, rol;
-
-// Winsock async operation handle
-static HANDLE HAsync=0;
-
-BOOL TCPIPClosed = TRUE;
-
-/* Printer port handle for
- direct pass-thru printing */
-static HANDLE PrnID = INVALID_HANDLE_VALUE;
-static BOOL LPTFlag;
-
-// Initialize ComVar.
-// This routine is called only once
-// by the initialization procedure of Tera Term.
-void CommInit(PComVar cv)
-{
- cv->Open = FALSE;
- cv->Ready = FALSE;
-
-// log-buffer variables
- cv->HLogBuf = 0;
- cv->HBinBuf = 0;
- cv->LogBuf = NULL;
- cv->BinBuf = NULL;
- cv->LogPtr = 0;
- cv->LStart = 0;
- cv->LCount = 0;
- cv->BinPtr = 0;
- cv->BStart = 0;
- cv->BCount = 0;
- cv->DStart = 0;
- cv->DCount = 0;
- cv->BinSkip = 0;
- cv->FilePause = 0;
- cv->ProtoFlag = FALSE;
-/* message flag */
- cv->NoMsg = 0;
-}
-
-/* reset a serial port which is already open */
-void CommResetSerial(PTTSet ts, PComVar cv, BOOL ClearBuff)
-{
- DCB dcb;
- DWORD DErr;
- COMMTIMEOUTS ctmo;
-
- if (! cv->Open ||
- (cv->PortType != IdSerial)) {
- return;
- }
-
- ClearCommError(cv->ComID,&DErr,NULL);
- SetupComm(cv->ComID,CommInQueSize,CommOutQueSize);
- /* flush input and output buffers */
- if (ClearBuff) {
- PurgeComm(cv->ComID, PURGE_TXABORT | PURGE_RXABORT |
- PURGE_TXCLEAR | PURGE_RXCLEAR);
- }
-
- memset(&ctmo,0,sizeof(ctmo));
- ctmo.ReadIntervalTimeout = MAXDWORD;
- ctmo.WriteTotalTimeoutConstant = 500;
- SetCommTimeouts(cv->ComID,&ctmo);
- cv->InBuffCount = 0;
- cv->InPtr = 0;
- cv->OutBuffCount = 0;
- cv->OutPtr = 0;
-
- cv->DelayPerChar = ts->DelayPerChar;
- cv->DelayPerLine = ts->DelayPerLine;
-
- memset(&dcb,0,sizeof(DCB));
- dcb.DCBlength = sizeof(DCB);
- dcb.BaudRate = GetCommSerialBaudRate(ts->Baud);
- dcb.fBinary = TRUE;
- switch (ts->Parity) {
- case IdParityEven:
- dcb.fParity = TRUE;
- dcb.Parity = EVENPARITY;
- break;
- case IdParityOdd:
- dcb.fParity = TRUE;
- dcb.Parity = ODDPARITY;
- break;
- case IdParityNone:
- dcb.Parity = NOPARITY;
- break;
- }
-
- dcb.fDtrControl = DTR_CONTROL_ENABLE;
- dcb.fRtsControl = RTS_CONTROL_ENABLE;
- switch (ts->Flow) {
- case IdFlowX:
- dcb.fOutX = TRUE;
- dcb.fInX = TRUE;
- dcb.XonLim = CommXonLim;
- dcb.XoffLim = CommXoffLim;
- dcb.XonChar = XON;
- dcb.XoffChar = XOFF;
- break;
- case IdFlowHard:
- dcb.fOutxCtsFlow = TRUE;
- dcb.fRtsControl = RTS_CONTROL_HANDSHAKE;
- break;
- }
-
- switch (ts->DataBit) {
- case IdDataBit7:
- dcb.ByteSize = 7;
- break;
- case IdDataBit8:
- dcb.ByteSize = 8;
- break;
- }
- switch (ts->StopBit) {
- case IdStopBit1:
- dcb.StopBits = ONESTOPBIT;
- break;
- case IdStopBit2:
- dcb.StopBits = TWOSTOPBITS;
- break;
- }
-
- SetCommState(cv->ComID, &dcb);
-
- /* enable receive request */
- SetCommMask(cv->ComID,0);
- SetCommMask(cv->ComID,EV_RXCHAR);
-}
-
-void CommOpen(HWND HW, PTTSet ts, PComVar cv)
-{
-#ifdef NO_INET6
- int Err;
-#endif /* NO_INET6 */
- char ErrMsg[21];
- char P[50];
-
- MSG Msg;
-#ifndef NO_INET6
- ADDRINFO hints;
- char pname[NI_MAXSERV];
-#else
- char HEntBuff[MAXGETHOSTSTRUCT];
- u_long addr;
- SOCKADDR_IN saddr;
-#endif /* NO_INET6 */
-
- BOOL InvalidHost;
-#ifdef NO_INET6
- BOOL BBuf;
-#endif /* NO_INET6 */
-
- char uimsg[MAX_UIMSG];
-
- /* initialize ComVar */
- cv->InBuffCount = 0;
- cv->InPtr = 0;
- cv->OutBuffCount = 0;
- cv->OutPtr = 0;
- cv->HWin = HW;
- cv->Ready = FALSE;
- cv->Open = FALSE;
- cv->PortType = ts->PortType;
- cv->ComPort = 0;
- cv->RetryCount = 0;
-#ifndef NO_INET6
- cv->RetryWithOtherProtocol = TRUE;
-#endif /* NO_INET6 */
- cv->s = INVALID_SOCKET;
- cv->ComID = INVALID_HANDLE_VALUE;
- cv->CanSend = TRUE;
- cv->RRQ = FALSE;
- cv->SendKanjiFlag = FALSE;
- cv->SendCode = IdASCII;
- cv->EchoKanjiFlag = FALSE;
- cv->EchoCode = IdASCII;
- cv->Language = ts->Language;
- cv->CRSend = ts->CRSend;
- cv->KanjiCodeEcho = ts->KanjiCode;
- cv->JIS7KatakanaEcho = ts->JIS7Katakana;
- cv->KanjiCodeSend = ts->KanjiCodeSend;
- cv->JIS7KatakanaSend = ts->JIS7KatakanaSend;
- cv->KanjiIn = ts->KanjiIn;
- cv->KanjiOut = ts->KanjiOut;
- cv->RussHost = ts->RussHost;
- cv->RussClient = ts->RussClient;
- cv->DelayFlag = TRUE;
- cv->DelayPerChar = ts->DelayPerChar;
- cv->DelayPerLine = ts->DelayPerLine;
- cv->TelBinRecv = FALSE;
- cv->TelBinSend = FALSE;
- cv->TelFlag = FALSE;
- cv->TelMode = FALSE;
- cv->IACFlag = FALSE;
- cv->TelCRFlag = FALSE;
- cv->TelCRSend = FALSE;
- cv->TelCRSendEcho = FALSE;
- cv->TelAutoDetect = ts->TelAutoDetect; /* TTPLUG */
- cv->Locale = ts->Locale;
- cv->CodePage = &ts->CodePage;
- cv->ConnetingTimeout = &ts->ConnectingTimeout;
- cv->LastSendTime = time(NULL);
- cv->LineModeBuffCount = 0;
- cv->Flush = FALSE;
- cv->FlushLen = 0;
- cv->TelLineMode = FALSE;
-
- if ((ts->PortType!=IdSerial) && (strlen(ts->HostName)==0))
- {
- PostMessage(cv->HWin, WM_USER_COMMNOTIFY, 0, FD_CLOSE);
- return;
- }
-
- switch (ts->PortType) {
- case IdTCPIP:
- cv->TelFlag = (ts->Telnet > 0);
- if (ts->EnableLineMode) {
- cv->TelLineMode = TRUE;
- }
- if (! LoadWinsock()) {
- if (cv->NoMsg==0) {
- get_lang_msg("MSG_TT_ERROR", uimsg, sizeof(uimsg), "Tera Term: Error", ts->UILanguageFile);
- get_lang_msg("MSG_WINSOCK_ERROR", ts->UIMsg, sizeof(ts->UIMsg), "Cannot use winsock", ts->UILanguageFile);
- MessageBox(cv->HWin,ts->UIMsg,uimsg,MB_TASKMODAL | MB_ICONEXCLAMATION);
- }
- InvalidHost = TRUE;
- }
- else {
- TTXOpenTCP(); /* TTPLUG */
- cv->Open = TRUE;
-#ifndef NO_INET6
- /* resolving address */
- memset(&hints, 0, sizeof(hints));
- hints.ai_family = ts->ProtocolFamily;
- hints.ai_socktype = SOCK_STREAM;
- hints.ai_protocol = IPPROTO_TCP;
- _snprintf_s(pname, sizeof(pname), _TRUNCATE, "%d", ts->TCPPort);
-
- HAsync = WSAAsyncGetAddrInfo(HW, WM_USER_GETHOST,
- ts->HostName, pname, &hints, &cv->res0);
- if (HAsync == 0)
- InvalidHost = TRUE;
- else {
- cv->ComPort = 1; // set "getting host" flag
- // (see CVTWindow::OnSysCommand())
- do {
- if (GetMessage(&Msg,0,0,0)) {
- if ((Msg.hwnd==HW) &&
- ((Msg.message == WM_SYSCOMMAND) &&
- ((Msg.wParam & 0xfff0) == SC_CLOSE) ||
- (Msg.message == WM_COMMAND) &&
- (LOWORD(Msg.wParam) == ID_FILE_EXIT) ||
- (Msg.message == WM_CLOSE))) { /* Exit when the user closes Tera Term */
- PWSACancelAsyncRequest(HAsync);
- CloseHandle(HAsync);
- HAsync = 0;
- cv->ComPort = 0; // clear "getting host" flag
- PostMessage(HW,Msg.message,Msg.wParam,Msg.lParam);
- return;
- }
- if (Msg.message != WM_USER_GETHOST) { /* Prosess messages */
- TranslateMessage(&Msg);
- DispatchMessage(&Msg);
- }
- }
- else {
- return;
- }
- } while (Msg.message!=WM_USER_GETHOST);
- cv->ComPort = 0; // clear "getting host" flag
- CloseHandle(HAsync);
- HAsync = 0;
- InvalidHost = WSAGETASYNCERROR(Msg.lParam) != 0;
- }
- } /* if (!LoadWinsock()) */
-
- if (InvalidHost) {
- if (cv->NoMsg==0) {
- get_lang_msg("MSG_TT_ERROR", uimsg, sizeof(uimsg), "Tera Term: Error", ts->UILanguageFile);
- get_lang_msg("MSG_INVALID_HOST_ERROR", ts->UIMsg, sizeof(ts->UIMsg), "Invalid host", ts->UILanguageFile);
- MessageBox(cv->HWin,ts->UIMsg,uimsg,MB_TASKMODAL | MB_ICONEXCLAMATION);
- }
- goto BreakSC;
- }
- for (cv->res = cv->res0; cv->res; cv->res = cv->res->ai_next) {
- cv->s = OpenSocket(cv);
- if (cv->s == INVALID_SOCKET) {
- CloseSocket(cv->s);
- continue;
- }
- /* start asynchronous connect */
- AsyncConnect(cv);
- break; /* break for-loop immediately */
- }
- break;
-#else
- if ((ts->HostName[0] >= 0x30) && (ts->HostName[0] <= 0x39))
- {
- addr = Pinet_addr(ts->HostName);
- InvalidHost = (addr == 0xffffffff);
- }
- else {
- HAsync = PWSAAsyncGetHostByName(HW,WM_USER_GETHOST,
- ts->HostName,HEntBuff,sizeof(HEntBuff));
- if (HAsync == 0)
- InvalidHost = TRUE;
- else {
- cv->ComPort = 1; // set "getting host" flag
- // (see CVTWindow::OnSysCommand())
- do {
- if (GetMessage(&Msg,0,0,0))
- {
- if ((Msg.hwnd==HW) &&
- ((Msg.message == WM_SYSCOMMAND) &&
- ((Msg.wParam & 0xfff0) == SC_CLOSE) ||
- (Msg.message == WM_COMMAND) &&
- (LOWORD(Msg.wParam) == ID_FILE_EXIT) ||
- (Msg.message == WM_CLOSE)))
- { /* Exit when the user closes Tera Term */
- PWSACancelAsyncRequest(HAsync);
- HAsync = 0;
- cv->ComPort = 0; // clear "getting host" flag
- PostMessage(HW,Msg.message,Msg.wParam,Msg.lParam);
- return;
- }
- if (Msg.message != WM_USER_GETHOST)
- { /* Prosess messages */
- TranslateMessage(&Msg);
- DispatchMessage(&Msg);
- }
- }
- else {
- return;
- }
- } while (Msg.message!=WM_USER_GETHOST);
- cv->ComPort = 0; // clear "getting host" flag
- HAsync = 0;
- InvalidHost = WSAGETASYNCERROR(Msg.lParam) != 0;
- if (! InvalidHost)
- {
- if (((PHOSTENT)HEntBuff)->h_addr_list != NULL)
- memcpy(&addr,
- ((PHOSTENT)HEntBuff)->h_addr_list[0],sizeof(addr));
- else
- InvalidHost = TRUE;
- }
- }
-
- }
-
- if (InvalidHost)
- {
- if (cv->NoMsg==0)
- MessageBox(cv->HWin,"Invalid host",ErrorCaption,
- MB_TASKMODAL | MB_ICONEXCLAMATION);
- }
- else {
- cv->s= Psocket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
- if (cv->s==INVALID_SOCKET)
- {
- InvalidHost = TRUE;
- if (cv->NoMsg==0)
- MessageBox(cv->HWin,ErrorCantConn,ErrorCaption,
- MB_TASKMODAL | MB_ICONEXCLAMATION);
- }
- else {
- BBuf = TRUE;
- Psetsockopt(cv->s,(int)SOL_SOCKET,SO_OOBINLINE,(char FAR *)&BBuf,sizeof(BBuf));
-
- PWSAAsyncSelect(cv->s,cv->HWin,WM_USER_COMMOPEN, FD_CONNECT);
- saddr.sin_family = AF_INET;
- saddr.sin_port = Phtons(ts->TCPPort);
- saddr.sin_addr.s_addr = addr;
- memset(saddr.sin_zero,0,8);
-
- Err = Pconnect(cv->s,(LPSOCKADDR)&saddr,sizeof(saddr));
- if (Err!=0 ) Err = PWSAGetLastError();
- if (Err==WSAEWOULDBLOCK )
- {
- /* Do nothing */
- }
- else if (Err!=0 )
- PostMessage(cv->HWin, WM_USER_COMMOPEN,0,
- MAKELONG(FD_CONNECT,Err));
- }
- }
- }
- break;
-#endif /* NO_INET6 */
-
- case IdSerial:
- InitFileIO(IdSerial); /* TTPLUG */
- TTXOpenFile(); /* TTPLUG */
- _snprintf_s(P, sizeof(P), _TRUNCATE, "COM%d", ts->ComPort);
- strncpy_s(ErrMsg, sizeof(ErrMsg),P, _TRUNCATE);
- strncpy_s(P, sizeof(P),"\\\\.\\", _TRUNCATE);
- strncat_s(P, sizeof(P),ErrMsg, _TRUNCATE);
- cv->ComID =
- PCreateFile(P,GENERIC_READ | GENERIC_WRITE,
- 0,NULL,OPEN_EXISTING,
- FILE_FLAG_OVERLAPPED,NULL);
- if (cv->ComID == INVALID_HANDLE_VALUE ) {
- get_lang_msg("MSG_CANTOEPN_ERROR", ts->UIMsg, sizeof(ts->UIMsg), "Cannot open %s", ts->UILanguageFile);
- _snprintf_s(ErrMsg, sizeof(ErrMsg), _TRUNCATE, ts->UIMsg, &P[4]);
-
- if (cv->NoMsg==0) {
- get_lang_msg("MSG_TT_ERROR", uimsg, sizeof(uimsg), "Tera Term: Error", ts->UILanguageFile);
- MessageBox(cv->HWin,ErrMsg,uimsg,MB_TASKMODAL | MB_ICONEXCLAMATION);
- }
- InvalidHost = TRUE;
- }
- else {
- cv->Open = TRUE;
- cv->ComPort = ts->ComPort;
- CommResetSerial(ts, cv, ts->ClearComBuffOnOpen);
- if (!ts->ClearComBuffOnOpen) {
- cv->RRQ = TRUE;
- }
-
- /* notify to VT window that Comm Port is open */
- PostMessage(cv->HWin, WM_USER_COMMOPEN, 0, 0);
- InvalidHost = FALSE;
-
- SetCOMFlag(ts->ComPort);
- }
- break; /* end of "case IdSerial:" */
-
- case IdFile:
- InitFileIO(IdFile); /* TTPLUG */
- TTXOpenFile(); /* TTPLUG */
- cv->ComID = PCreateFile(ts->HostName,GENERIC_READ,0,NULL,
- OPEN_EXISTING,0,NULL);
- InvalidHost = (cv->ComID == INVALID_HANDLE_VALUE);
- if (InvalidHost) {
- if (cv->NoMsg==0) {
- get_lang_msg("MSG_TT_ERROR", uimsg, sizeof(uimsg), "Tera Term: Error", ts->UILanguageFile);
- get_lang_msg("MSG_CANTOEPN_FILE_ERROR", ts->UIMsg, sizeof(ts->UIMsg), "Cannot open file", ts->UILanguageFile);
- MessageBox(cv->HWin,ts->UIMsg,uimsg,MB_TASKMODAL | MB_ICONEXCLAMATION);
- }
- }
- else {
- cv->Open = TRUE;
- PostMessage(cv->HWin, WM_USER_COMMOPEN, 0, 0);
- }
- break;
- } /* end of "switch" */
-
-#ifndef NO_INET6
-BreakSC:
-#endif /* NO_INET6 */
- if (InvalidHost) {
- PostMessage(cv->HWin, WM_USER_COMMNOTIFY, 0, FD_CLOSE);
- if ( (ts->PortType==IdTCPIP) && cv->Open ) {
- if ( cv->s!=INVALID_SOCKET ) {
- Pclosesocket(cv->s);
- }
- FreeWinsock();
- }
- return;
- }
-}
-
-void CommThread(void *arg)
-{
- DWORD Evt;
- PComVar cv = (PComVar)arg;
- DWORD DErr;
- HANDLE REnd;
- char Temp[20];
-
- _snprintf_s(Temp, sizeof(Temp), _TRUNCATE, "%s%d", READENDNAME, cv->ComPort);
- REnd = OpenEvent(EVENT_ALL_ACCESS,FALSE, Temp);
- while (TRUE) {
- if (WaitCommEvent(cv->ComID,&Evt,NULL)) {
- if (! cv->Ready) {
- _endthread();
- }
- if (! cv->RRQ) {
- PostMessage(cv->HWin, WM_USER_COMMNOTIFY, 0, FD_READ);
- }
- WaitForSingleObject(REnd,INFINITE);
- }
- else {
- if (! cv->Ready) {
- _endthread();
- }
- ClearCommError(cv->ComID,&DErr,NULL);
- }
- }
-}
-
-void CommStart(PComVar cv, LONG lParam, PTTSet ts)
-{
- char ErrMsg[31];
- char Temp[20];
- char uimsg[MAX_UIMSG];
-
- if (! cv->Open ) {
- return;
- }
- if ( cv->Ready ) {
- return;
- }
-
- // ????????????????B????????? WM_TIMER ??????????????
- if (*cv->ConnetingTimeout > 0) {
- KillTimer(cv->HWin, IdCancelConnectTimer);
- }
-
- switch (cv->PortType) {
- case IdTCPIP:
- ErrMsg[0] = 0;
- switch (HIWORD(lParam)) {
- case WSAECONNREFUSED:
- get_lang_msg("MSG_COMM_REFUSE_ERROR", ts->UIMsg, sizeof(ts->UIMsg), "Connection refused", ts->UILanguageFile);
- _snprintf_s(ErrMsg, sizeof(ErrMsg), _TRUNCATE, "%s", ts->UIMsg);
- break;
- case WSAENETUNREACH:
- get_lang_msg("MSG_COMM_REACH_ERROR", ts->UIMsg, sizeof(ts->UIMsg), "Network cannot be reached", ts->UILanguageFile);
- _snprintf_s(ErrMsg, sizeof(ErrMsg), _TRUNCATE, "%s", ts->UIMsg);
- break;
- case WSAETIMEDOUT:
- get_lang_msg("MSG_COMM_CONNECT_ERROR", ts->UIMsg, sizeof(ts->UIMsg), "Connection timed out", ts->UILanguageFile);
- _snprintf_s(ErrMsg, sizeof(ErrMsg), _TRUNCATE, "%s", ts->UIMsg);
- break;
- default:
- get_lang_msg("MSG_COMM_TIMEOUT_ERROR", ts->UIMsg, sizeof(ts->UIMsg), "Cannot connect the host", ts->UILanguageFile);
- _snprintf_s(ErrMsg, sizeof(ErrMsg), _TRUNCATE, "%s", ts->UIMsg);
- }
- if (HIWORD(lParam)>0) {
-#ifndef NO_INET6
- /* connect() failed */
- if (cv->res->ai_next != NULL) {
- /* try to connect with other protocol */
- CloseSocket(cv->s);
- for (cv->res = cv->res->ai_next; cv->res; cv->res = cv->res->ai_next) {
- cv->s = OpenSocket(cv);
- if (cv->s == INVALID_SOCKET) {
- CloseSocket(cv->s);
- continue;
- }
- AsyncConnect(cv);
- cv->Ready = FALSE;
- cv->RetryWithOtherProtocol = TRUE; /* retry with other procotol */
- return;
- }
- } else {
- /* trying with all protocol family are failed */
- if (cv->NoMsg==0)
- {
- get_lang_msg("MSG_TT_ERROR", uimsg, sizeof(uimsg), "Tera Term: Error", ts->UILanguageFile);
- MessageBox(cv->HWin,ErrMsg,uimsg,MB_TASKMODAL | MB_ICONEXCLAMATION);
- }
- PostMessage(cv->HWin, WM_USER_COMMNOTIFY, 0, FD_CLOSE);
- cv->RetryWithOtherProtocol = FALSE;
- return;
- }
-#else
- if (cv->NoMsg==0)
- MessageBox(cv->HWin,ErrMsg,ErrorCaption,
- MB_TASKMODAL | MB_ICONEXCLAMATION);
- PostMessage(cv->HWin, WM_USER_COMMNOTIFY, 0, FD_CLOSE);
- return;
-#endif /* NO_INET6 */
- }
-
-#ifndef NO_INET6
- /* here is connection established */
- cv->RetryWithOtherProtocol = FALSE;
-#endif /* NO_INET6 */
- PWSAAsyncSelect(cv->s,cv->HWin,WM_USER_COMMNOTIFY, FD_READ | FD_OOB | FD_CLOSE);
- TCPIPClosed = FALSE;
- break;
-
- case IdSerial:
- _snprintf_s(Temp, sizeof(Temp), _TRUNCATE, "%s%d", READENDNAME, cv->ComPort);
- ReadEnd = CreateEvent(NULL,FALSE,FALSE,Temp);
- _snprintf_s(Temp, sizeof(Temp), _TRUNCATE, "%s%d", WRITENAME, cv->ComPort);
- memset(&wol,0,sizeof(OVERLAPPED));
- wol.hEvent = CreateEvent(NULL,TRUE,TRUE,Temp);
- _snprintf_s(Temp, sizeof(Temp), _TRUNCATE, "%s%d", READNAME, cv->ComPort);
- memset(&rol,0,sizeof(OVERLAPPED));
- rol.hEvent = CreateEvent(NULL,TRUE,FALSE,Temp);
-
- /* create the receiver thread */
- if (_beginthread(CommThread,0,cv) == -1) {
- get_lang_msg("MSG_TT_ERROR", uimsg, sizeof(uimsg), "Tera Term: Error", ts->UILanguageFile);
- get_lang_msg("MSG_TT_ERROR", ts->UIMsg, sizeof(ts->UIMsg), "Can't create thread", ts->UILanguageFile);
- MessageBox(cv->HWin,ts->UIMsg,uimsg,MB_TASKMODAL | MB_ICONEXCLAMATION);
- }
- break;
-
- case IdFile:
- cv->RRQ = TRUE;
- break;
- }
- cv->Ready = TRUE;
-}
-
-BOOL CommCanClose(PComVar cv)
-{ // check if data remains in buffer
- if (! cv->Open) {
- return TRUE;
- }
- if (cv->InBuffCount>0) {
- return FALSE;
- }
- if ((cv->HLogBuf!=NULL) &&
- ((cv->LCount>0) ||
- (cv->DCount>0))) {
- return FALSE;
- }
- if ((cv->HBinBuf!=NULL) &&
- (cv->BCount>0)) {
- return FALSE;
- }
- return TRUE;
-}
-
-void CommClose(PComVar cv)
-{
- if ( ! cv->Open ) {
- return;
- }
- cv->Open = FALSE;
-
- /* disable event message posting & flush buffer */
- cv->RRQ = FALSE;
- cv->Ready = FALSE;
- cv->InPtr = 0;
- cv->InBuffCount = 0;
- cv->OutPtr = 0;
- cv->OutBuffCount = 0;
- cv->LineModeBuffCount = 0;
- cv->FlushLen = 0;
- cv->Flush = FALSE;
-
- /* close port & release resources */
- switch (cv->PortType) {
- case IdTCPIP:
- if (HAsync!=0) {
- PWSACancelAsyncRequest(HAsync);
- }
- HAsync = 0;
-#ifndef NO_INET6
- freeaddrinfo(cv->res0);
-#endif /* NO_INET6 */
- if ( cv->s!=INVALID_SOCKET ) {
- Pclosesocket(cv->s);
- }
- cv->s = INVALID_SOCKET;
- TTXCloseTCP(); /* TTPLUG */
- FreeWinsock();
- break;
- case IdSerial:
- if ( cv->ComID != INVALID_HANDLE_VALUE ) {
- CloseHandle(ReadEnd);
- CloseHandle(wol.hEvent);
- CloseHandle(rol.hEvent);
- PurgeComm(cv->ComID, PURGE_TXABORT | PURGE_RXABORT |
- PURGE_TXCLEAR | PURGE_RXCLEAR);
- EscapeCommFunction(cv->ComID,CLRDTR);
- SetCommMask(cv->ComID,0);
- PCloseFile(cv->ComID);
- ClearCOMFlag(cv->ComPort);
- }
- TTXCloseFile(); /* TTPLUG */
- break;
- case IdFile:
- if (cv->ComID != INVALID_HANDLE_VALUE) {
- PCloseFile(cv->ComID);
- }
- TTXCloseFile(); /* TTPLUG */
- break;
- }
- cv->ComID = INVALID_HANDLE_VALUE;
- cv->PortType = 0;
-}
-
-void CommProcRRQ(PComVar cv)
-{
- if ( ! cv->Ready ) {
- return;
- }
- /* disable receive request */
- switch (cv->PortType) {
- case IdTCPIP:
- if (! TCPIPClosed) {
- PWSAAsyncSelect(cv->s,cv->HWin,WM_USER_COMMNOTIFY, FD_OOB | FD_CLOSE);
- }
- break;
- case IdSerial:
- break;
- }
- cv->RRQ = TRUE;
- CommReceive(cv);
-}
-
-void CommReceive(PComVar cv)
-{
- DWORD C;
- DWORD DErr;
-
- if (! cv->Ready || ! cv->RRQ ||
- (cv->InBuffCount>=InBuffSize)) {
- return;
- }
-
- /* Compact buffer */
- if ((cv->InBuffCount>0) && (cv->InPtr>0)) {
- memmove(cv->InBuff,&(cv->InBuff[cv->InPtr]),cv->InBuffCount);
- cv->InPtr = 0;
- }
-
- if (cv->InBuffCountPortType) {
- case IdTCPIP:
- C = Precv(cv->s, &(cv->InBuff[cv->InBuffCount]),
- InBuffSize-cv->InBuffCount, 0);
- if (C == SOCKET_ERROR) {
- C = 0;
- PWSAGetLastError();
- }
- cv->InBuffCount = cv->InBuffCount + C;
- break;
- case IdSerial:
- do {
- ClearCommError(cv->ComID,&DErr,NULL);
- if (! PReadFile(cv->ComID,&(cv->InBuff[cv->InBuffCount]),
- InBuffSize-cv->InBuffCount,&C,&rol)) {
- if (GetLastError() == ERROR_IO_PENDING) {
- if (WaitForSingleObject(rol.hEvent, 1000) != WAIT_OBJECT_0) {
- C = 0;
- }
- else {
- GetOverlappedResult(cv->ComID,&rol,&C,FALSE);
- }
- }
- else {
- C = 0;
- }
- }
- cv->InBuffCount = cv->InBuffCount + C;
- } while ((C!=0) && (cv->InBuffCountComID,&DErr,NULL);
- break;
- case IdFile:
- if (PReadFile(cv->ComID,&(cv->InBuff[cv->InBuffCount]),
- InBuffSize-cv->InBuffCount,&C,NULL)) {
- if (C == 0) {
- DErr = ERROR_HANDLE_EOF;
- }
- else {
- cv->InBuffCount = cv->InBuffCount + C;
- }
- }
- else {
- DErr = GetLastError();
- }
- break;
- }
- }
-
- if (cv->InBuffCount==0) {
- switch (cv->PortType) {
- case IdTCPIP:
- if (! TCPIPClosed) {
- PWSAAsyncSelect(cv->s,cv->HWin, WM_USER_COMMNOTIFY,
- FD_READ | FD_OOB | FD_CLOSE);
- }
- break;
- case IdSerial:
- cv->RRQ = FALSE;
- SetEvent(ReadEnd);
- return;
- case IdFile:
- if (DErr != ERROR_IO_PENDING) {
- PostMessage(cv->HWin, WM_USER_COMMNOTIFY, 0, FD_CLOSE);
- cv->RRQ = FALSE;
- }
- else {
- cv->RRQ = TRUE;
- }
- return;
- }
- cv->RRQ = FALSE;
- }
-}
-
-void CommSend(PComVar cv)
-{
- int delay;
- COMSTAT Stat;
- BYTE LineEnd;
- int C, D, Max;
- DWORD DErr;
-
- if ((! cv->Open) || (! cv->Ready)) {
- cv->OutBuffCount = 0;
- return;
- }
-
- if ((cv->OutBuffCount == 0) || (! cv->CanSend)) {
- return;
- }
-
- /* Max num of bytes to be written */
- switch (cv->PortType) {
- case IdTCPIP:
- if (TCPIPClosed) {
- cv->OutBuffCount = 0;
- }
- Max = cv->OutBuffCount;
- break;
- case IdSerial:
- ClearCommError(cv->ComID,&DErr,&Stat);
- Max = OutBuffSize - Stat.cbOutQue;
- break;
- case IdFile:
- Max = cv->OutBuffCount;
- break;
- }
-
- if ( Max<=0 ) {
- return;
- }
- if ( Max > cv->OutBuffCount ) {
- Max = cv->OutBuffCount;
- }
-
- if (cv->PortType == IdTCPIP && cv->TelFlag) {
- cv->LastSendTime = time(NULL);
- }
-
- C = Max;
- delay = 0;
-
- if ( cv->DelayFlag && (cv->PortType==IdSerial) ) {
- if ( cv->DelayPerLine > 0 ) {
- if ( cv->CRSend==IdCR ) {
- LineEnd = 0x0d;
- }
- else {
- LineEnd = 0x0a;
- }
- C = 1;
- if ( cv->DelayPerChar==0 ) {
- while ((COutBuff[cv->OutPtr+C-1]!=LineEnd)) {
- C++;
- }
- }
- if ( cv->OutBuff[cv->OutPtr+C-1]==LineEnd ) {
- delay = cv->DelayPerLine;
- }
- else {
- delay = cv->DelayPerChar;
- }
- }
- else if ( cv->DelayPerChar > 0 ) {
- C = 1;
- delay = cv->DelayPerChar;
- }
- }
-
- /* Write to comm driver/Winsock */
- switch (cv->PortType) {
- case IdTCPIP:
- D = Psend(cv->s, &(cv->OutBuff[cv->OutPtr]), C, 0);
- if ( D==SOCKET_ERROR ) { /* if error occurs */
- PWSAGetLastError(); /* Clear error */
- D = 0;
- }
- break;
-
- case IdSerial:
- if (! PWriteFile(cv->ComID,&(cv->OutBuff[cv->OutPtr]),C,(LPDWORD)&D,&wol)) {
- if (GetLastError() == ERROR_IO_PENDING) {
- if (WaitForSingleObject(wol.hEvent,1000) != WAIT_OBJECT_0) {
- D = C; /* Time out, ignore data */
- }
- else {
- GetOverlappedResult(cv->ComID,&wol,(LPDWORD)&D,FALSE);
- }
- }
- else { /* I/O error */
- D = C; /* ignore error */
- }
- }
- ClearCommError(cv->ComID,&DErr,&Stat);
- break;
-
- case IdFile:
- if (! PWriteFile(cv->ComID, &(cv->OutBuff[cv->OutPtr]), C, (LPDWORD)&D, NULL)) {
- if (! GetLastError() == ERROR_IO_PENDING) {
- D = C; /* ignore data */
- }
- }
- break;
- }
-
- cv->OutBuffCount = cv->OutBuffCount - D;
- if ( cv->OutBuffCount==0 ) {
- cv->OutPtr = 0;
- }
- else {
- cv->OutPtr = cv->OutPtr + D;
- }
-
- if ( (C==D) && (delay>0) ) {
- cv->CanSend = FALSE;
- SetTimer(cv->HWin, IdDelayTimer, delay, NULL);
- }
-}
-
-void CommSendBreak(PComVar cv)
-/* for only serial ports */
-{
- MSG DummyMsg;
-
- if ( ! cv->Ready ) {
- return;
- }
-
- switch (cv->PortType) {
- case IdSerial:
- /* Set com port into a break state */
- SetCommBreak(cv->ComID);
-
- /* pause for 1 sec */
- if (SetTimer(cv->HWin, IdBreakTimer, 1000, NULL) != 0) {
- GetMessage(&DummyMsg,cv->HWin,WM_TIMER,WM_TIMER);
- }
-
- /* Set com port into the nonbreak state */
- ClearCommBreak(cv->ComID);
- break;
- }
-}
-
-void CommLock(PTTSet ts, PComVar cv, BOOL Lock)
-{
- BYTE b;
- DWORD Func;
-
- if (! cv->Ready) {
- return;
- }
- if ((cv->PortType==IdTCPIP) ||
- (cv->PortType==IdSerial) &&
- (ts->Flow!=IdFlowHard)) {
- if (Lock) {
- b = XOFF;
- }
- else {
- b = XON;
- }
- CommBinaryOut(cv,&b,1);
- }
- else if ((cv->PortType==IdSerial) &&
- (ts->Flow==IdFlowHard)) {
- if (Lock) {
- Func = CLRRTS;
- }
- else {
- Func = SETRTS;
- }
- EscapeCommFunction(cv->ComID,Func);
- }
-}
-
-int GetCommSerialBaudRate(int id)
-{
- char *ch;
- int val;
-
- // id-1?????index????
- ch = BaudList[id - 1];
- val = atoi(ch);
- return (val);
-}
-
-BOOL PrnOpen(PCHAR DevName)
-{
- char Temp[MAXPATHLEN];
- DCB dcb;
- DWORD DErr;
- COMMTIMEOUTS ctmo;
-
- strncpy_s(Temp, sizeof(Temp),DevName, _TRUNCATE);
- Temp[4] = 0; // COMn or LPTn
- LPTFlag = (Temp[0]=='L') ||
- (Temp[0]=='l');
- PrnID = CreateFile(Temp,GENERIC_WRITE,
- 0,NULL,OPEN_EXISTING,
- 0,NULL);
- if (PrnID == INVALID_HANDLE_VALUE) {
- return FALSE;
- }
-
- if (GetCommState(PrnID,&dcb)) {
- BuildCommDCB(DevName,&dcb);
- SetCommState(PrnID,&dcb);
- }
- ClearCommError(PrnID,&DErr,NULL);
- if (! LPTFlag) {
- SetupComm(PrnID,0,CommOutQueSize);
- }
- /* flush output buffer */
- PurgeComm(PrnID, PURGE_TXABORT | PURGE_TXCLEAR);
- memset(&ctmo,0,sizeof(ctmo));
- ctmo.WriteTotalTimeoutConstant = 1000;
- SetCommTimeouts(PrnID,&ctmo);
- if (! LPTFlag) {
- EscapeCommFunction(PrnID,SETDTR);
- }
- return TRUE;
-}
-
-int PrnWrite(PCHAR b, int c)
-{
- int d;
- DWORD DErr;
- COMSTAT Stat;
-
- if (PrnID == INVALID_HANDLE_VALUE ) {
- return c;
- }
-
- ClearCommError(PrnID,&DErr,&Stat);
- if (! LPTFlag &&
- (OutBuffSize - (int)Stat.cbOutQue < c)) {
- c = OutBuffSize - Stat.cbOutQue;
- }
- if (c<=0) {
- return 0;
- }
- if (! WriteFile(PrnID,b,c,(LPDWORD)&d,NULL)) {
- d = 0;
- }
- ClearCommError(PrnID,&DErr,NULL);
- return d;
-}
-
-void PrnCancel()
-{
- PurgeComm(PrnID, PURGE_TXABORT | PURGE_TXCLEAR);
- PrnClose();
-}
-
-void PrnClose()
-{
- if (PrnID != INVALID_HANDLE_VALUE) {
- if (!LPTFlag) {
- EscapeCommFunction(PrnID,CLRDTR);
- }
- CloseHandle(PrnID);
- }
- PrnID = INVALID_HANDLE_VALUE;
-}
+/* Tera Term
+ Copyright(C) 1994-1998 T. Teranishi
+ All rights reserved. */
+/* IPv6 modification is Copyright (C) 2000, 2001 Jun-ya KATO */
+
+/* TERATERM.EXE, Communication routines */
+#include "teraterm.h"
+#include "tttypes.h"
+#include "tt_res.h"
+#include
+
+#include "ttcommon.h"
+#include "ttwsk.h"
+#include "ttlib.h"
+#include "ttfileio.h"
+#include "ttplug.h" /* TTPLUG */
+
+#include "commlib.h"
+#ifndef NO_INET6
+#include
+#include
+#include /* for _snprintf() */
+#include "WSAAsyncGetAddrInfo.h"
+#endif /* NO_INET6 */
+#include
+
+static SOCKET OpenSocket(PComVar);
+static void AsyncConnect(PComVar);
+static int CloseSocket(SOCKET);
+
+/* create socket */
+static SOCKET OpenSocket(PComVar cv)
+{
+ cv->s = cv->res->ai_family;
+ cv->s = Psocket(cv->res->ai_family, cv->res->ai_socktype, cv->res->ai_protocol);
+ return cv->s;
+}
+
+/* connect with asynchronous mode */
+static void AsyncConnect(PComVar cv)
+{
+ int Err;
+ BOOL BBuf;
+ BBuf = TRUE;
+ /* set synchronous mode */
+ PWSAAsyncSelect(cv->s,cv->HWin,0,0);
+ Psetsockopt(cv->s,(int)SOL_SOCKET,SO_OOBINLINE,(char FAR *)&BBuf,sizeof(BBuf));
+ /* set asynchronous mode */
+ PWSAAsyncSelect(cv->s,cv->HWin,WM_USER_COMMOPEN, FD_CONNECT);
+
+ // ?????????????????????????????????
+ // ?????L??????????0?????????B
+ // (2007.1.11 yutaka)
+ if (*cv->ConnetingTimeout > 0) {
+ SetTimer(cv->HWin, IdCancelConnectTimer, *cv->ConnetingTimeout * 1000, NULL);
+ }
+
+ /* WM_USER_COMMOPEN occurs, CommOpen is called, then CommStart is called */
+ Err = Pconnect(cv->s, cv->res->ai_addr, cv->res->ai_addrlen);
+ if (Err != 0) {
+ Err = PWSAGetLastError();
+ if (Err == WSAEWOULDBLOCK) {
+ /* Do nothing */
+ } else if (Err!=0 ) {
+ PostMessage(cv->HWin, WM_USER_COMMOPEN,0,
+ MAKELONG(FD_CONNECT,Err));
+ }
+ }
+}
+
+/* close socket */
+static int CloseSocket(SOCKET s)
+{
+ return Pclosesocket(s);
+}
+
+#define CommInQueSize 8192
+#define CommOutQueSize 2048
+#define CommXonLim 2048
+#define CommXoffLim 2048
+
+#define READENDNAME "ReadEnd"
+#define WRITENAME "Write"
+#define READNAME "Read"
+#define PRNWRITENAME "PrnWrite"
+
+static HANDLE ReadEnd;
+static OVERLAPPED wol, rol;
+
+// Winsock async operation handle
+static HANDLE HAsync=0;
+
+BOOL TCPIPClosed = TRUE;
+
+/* Printer port handle for
+ direct pass-thru printing */
+static HANDLE PrnID = INVALID_HANDLE_VALUE;
+static BOOL LPTFlag;
+
+// Initialize ComVar.
+// This routine is called only once
+// by the initialization procedure of Tera Term.
+void CommInit(PComVar cv)
+{
+ cv->Open = FALSE;
+ cv->Ready = FALSE;
+
+// log-buffer variables
+ cv->HLogBuf = 0;
+ cv->HBinBuf = 0;
+ cv->LogBuf = NULL;
+ cv->BinBuf = NULL;
+ cv->LogPtr = 0;
+ cv->LStart = 0;
+ cv->LCount = 0;
+ cv->BinPtr = 0;
+ cv->BStart = 0;
+ cv->BCount = 0;
+ cv->DStart = 0;
+ cv->DCount = 0;
+ cv->BinSkip = 0;
+ cv->FilePause = 0;
+ cv->ProtoFlag = FALSE;
+/* message flag */
+ cv->NoMsg = 0;
+}
+
+/* reset a serial port which is already open */
+void CommResetSerial(PTTSet ts, PComVar cv, BOOL ClearBuff)
+{
+ DCB dcb;
+ DWORD DErr;
+ COMMTIMEOUTS ctmo;
+
+ if (! cv->Open ||
+ (cv->PortType != IdSerial)) {
+ return;
+ }
+
+ ClearCommError(cv->ComID,&DErr,NULL);
+ SetupComm(cv->ComID,CommInQueSize,CommOutQueSize);
+ /* flush input and output buffers */
+ if (ClearBuff) {
+ PurgeComm(cv->ComID, PURGE_TXABORT | PURGE_RXABORT |
+ PURGE_TXCLEAR | PURGE_RXCLEAR);
+ }
+
+ memset(&ctmo,0,sizeof(ctmo));
+ ctmo.ReadIntervalTimeout = MAXDWORD;
+ ctmo.WriteTotalTimeoutConstant = 500;
+ SetCommTimeouts(cv->ComID,&ctmo);
+ cv->InBuffCount = 0;
+ cv->InPtr = 0;
+ cv->OutBuffCount = 0;
+ cv->OutPtr = 0;
+
+ cv->DelayPerChar = ts->DelayPerChar;
+ cv->DelayPerLine = ts->DelayPerLine;
+
+ memset(&dcb,0,sizeof(DCB));
+ dcb.DCBlength = sizeof(DCB);
+ dcb.BaudRate = GetCommSerialBaudRate(ts->Baud);
+ dcb.fBinary = TRUE;
+ switch (ts->Parity) {
+ case IdParityEven:
+ dcb.fParity = TRUE;
+ dcb.Parity = EVENPARITY;
+ break;
+ case IdParityOdd:
+ dcb.fParity = TRUE;
+ dcb.Parity = ODDPARITY;
+ break;
+ case IdParityNone:
+ dcb.Parity = NOPARITY;
+ break;
+ }
+
+ dcb.fDtrControl = DTR_CONTROL_ENABLE;
+ dcb.fRtsControl = RTS_CONTROL_ENABLE;
+ switch (ts->Flow) {
+ case IdFlowX:
+ dcb.fOutX = TRUE;
+ dcb.fInX = TRUE;
+ dcb.XonLim = CommXonLim;
+ dcb.XoffLim = CommXoffLim;
+ dcb.XonChar = XON;
+ dcb.XoffChar = XOFF;
+ break;
+ case IdFlowHard:
+ dcb.fOutxCtsFlow = TRUE;
+ dcb.fRtsControl = RTS_CONTROL_HANDSHAKE;
+ break;
+ }
+
+ switch (ts->DataBit) {
+ case IdDataBit7:
+ dcb.ByteSize = 7;
+ break;
+ case IdDataBit8:
+ dcb.ByteSize = 8;
+ break;
+ }
+ switch (ts->StopBit) {
+ case IdStopBit1:
+ dcb.StopBits = ONESTOPBIT;
+ break;
+ case IdStopBit2:
+ dcb.StopBits = TWOSTOPBITS;
+ break;
+ }
+
+ SetCommState(cv->ComID, &dcb);
+
+ /* enable receive request */
+ SetCommMask(cv->ComID,0);
+ SetCommMask(cv->ComID,EV_RXCHAR);
+}
+
+void CommOpen(HWND HW, PTTSet ts, PComVar cv)
+{
+#ifdef NO_INET6
+ int Err;
+#endif /* NO_INET6 */
+ char ErrMsg[21];
+ char P[50];
+
+ MSG Msg;
+#ifndef NO_INET6
+ ADDRINFO hints;
+ char pname[NI_MAXSERV];
+#else
+ char HEntBuff[MAXGETHOSTSTRUCT];
+ u_long addr;
+ SOCKADDR_IN saddr;
+#endif /* NO_INET6 */
+
+ BOOL InvalidHost;
+#ifdef NO_INET6
+ BOOL BBuf;
+#endif /* NO_INET6 */
+
+ char uimsg[MAX_UIMSG];
+
+ /* initialize ComVar */
+ cv->InBuffCount = 0;
+ cv->InPtr = 0;
+ cv->OutBuffCount = 0;
+ cv->OutPtr = 0;
+ cv->HWin = HW;
+ cv->Ready = FALSE;
+ cv->Open = FALSE;
+ cv->PortType = ts->PortType;
+ cv->ComPort = 0;
+ cv->RetryCount = 0;
+#ifndef NO_INET6
+ cv->RetryWithOtherProtocol = TRUE;
+#endif /* NO_INET6 */
+ cv->s = INVALID_SOCKET;
+ cv->ComID = INVALID_HANDLE_VALUE;
+ cv->CanSend = TRUE;
+ cv->RRQ = FALSE;
+ cv->SendKanjiFlag = FALSE;
+ cv->SendCode = IdASCII;
+ cv->EchoKanjiFlag = FALSE;
+ cv->EchoCode = IdASCII;
+ cv->Language = ts->Language;
+ cv->CRSend = ts->CRSend;
+ cv->KanjiCodeEcho = ts->KanjiCode;
+ cv->JIS7KatakanaEcho = ts->JIS7Katakana;
+ cv->KanjiCodeSend = ts->KanjiCodeSend;
+ cv->JIS7KatakanaSend = ts->JIS7KatakanaSend;
+ cv->KanjiIn = ts->KanjiIn;
+ cv->KanjiOut = ts->KanjiOut;
+ cv->RussHost = ts->RussHost;
+ cv->RussClient = ts->RussClient;
+ cv->DelayFlag = TRUE;
+ cv->DelayPerChar = ts->DelayPerChar;
+ cv->DelayPerLine = ts->DelayPerLine;
+ cv->TelBinRecv = FALSE;
+ cv->TelBinSend = FALSE;
+ cv->TelFlag = FALSE;
+ cv->TelMode = FALSE;
+ cv->IACFlag = FALSE;
+ cv->TelCRFlag = FALSE;
+ cv->TelCRSend = FALSE;
+ cv->TelCRSendEcho = FALSE;
+ cv->TelAutoDetect = ts->TelAutoDetect; /* TTPLUG */
+ cv->Locale = ts->Locale;
+ cv->CodePage = &ts->CodePage;
+ cv->ConnetingTimeout = &ts->ConnectingTimeout;
+ cv->LastSendTime = time(NULL);
+ cv->LineModeBuffCount = 0;
+ cv->Flush = FALSE;
+ cv->FlushLen = 0;
+ cv->TelLineMode = FALSE;
+
+ if ((ts->PortType!=IdSerial) && (strlen(ts->HostName)==0))
+ {
+ PostMessage(cv->HWin, WM_USER_COMMNOTIFY, 0, FD_CLOSE);
+ return;
+ }
+
+ switch (ts->PortType) {
+ case IdTCPIP:
+ cv->TelFlag = (ts->Telnet > 0);
+ if (ts->EnableLineMode) {
+ cv->TelLineMode = TRUE;
+ }
+ if (! LoadWinsock()) {
+ if (cv->NoMsg==0) {
+ get_lang_msg("MSG_TT_ERROR", uimsg, sizeof(uimsg), "Tera Term: Error", ts->UILanguageFile);
+ get_lang_msg("MSG_WINSOCK_ERROR", ts->UIMsg, sizeof(ts->UIMsg), "Cannot use winsock", ts->UILanguageFile);
+ MessageBox(cv->HWin,ts->UIMsg,uimsg,MB_TASKMODAL | MB_ICONEXCLAMATION);
+ }
+ InvalidHost = TRUE;
+ }
+ else {
+ TTXOpenTCP(); /* TTPLUG */
+ cv->Open = TRUE;
+#ifndef NO_INET6
+ /* resolving address */
+ memset(&hints, 0, sizeof(hints));
+ hints.ai_family = ts->ProtocolFamily;
+ hints.ai_socktype = SOCK_STREAM;
+ hints.ai_protocol = IPPROTO_TCP;
+ _snprintf_s(pname, sizeof(pname), _TRUNCATE, "%d", ts->TCPPort);
+
+ HAsync = WSAAsyncGetAddrInfo(HW, WM_USER_GETHOST,
+ ts->HostName, pname, &hints, &cv->res0);
+ if (HAsync == 0)
+ InvalidHost = TRUE;
+ else {
+ cv->ComPort = 1; // set "getting host" flag
+ // (see CVTWindow::OnSysCommand())
+ do {
+ if (GetMessage(&Msg,0,0,0)) {
+ if ((Msg.hwnd==HW) &&
+ ((Msg.message == WM_SYSCOMMAND) &&
+ ((Msg.wParam & 0xfff0) == SC_CLOSE) ||
+ (Msg.message == WM_COMMAND) &&
+ (LOWORD(Msg.wParam) == ID_FILE_EXIT) ||
+ (Msg.message == WM_CLOSE))) { /* Exit when the user closes Tera Term */
+ PWSACancelAsyncRequest(HAsync);
+ CloseHandle(HAsync);
+ HAsync = 0;
+ cv->ComPort = 0; // clear "getting host" flag
+ PostMessage(HW,Msg.message,Msg.wParam,Msg.lParam);
+ return;
+ }
+ if (Msg.message != WM_USER_GETHOST) { /* Prosess messages */
+ TranslateMessage(&Msg);
+ DispatchMessage(&Msg);
+ }
+ }
+ else {
+ return;
+ }
+ } while (Msg.message!=WM_USER_GETHOST);
+ cv->ComPort = 0; // clear "getting host" flag
+ CloseHandle(HAsync);
+ HAsync = 0;
+ InvalidHost = WSAGETASYNCERROR(Msg.lParam) != 0;
+ }
+ } /* if (!LoadWinsock()) */
+
+ if (InvalidHost) {
+ if (cv->NoMsg==0) {
+ get_lang_msg("MSG_TT_ERROR", uimsg, sizeof(uimsg), "Tera Term: Error", ts->UILanguageFile);
+ get_lang_msg("MSG_INVALID_HOST_ERROR", ts->UIMsg, sizeof(ts->UIMsg), "Invalid host", ts->UILanguageFile);
+ MessageBox(cv->HWin,ts->UIMsg,uimsg,MB_TASKMODAL | MB_ICONEXCLAMATION);
+ }
+ goto BreakSC;
+ }
+ for (cv->res = cv->res0; cv->res; cv->res = cv->res->ai_next) {
+ cv->s = OpenSocket(cv);
+ if (cv->s == INVALID_SOCKET) {
+ CloseSocket(cv->s);
+ continue;
+ }
+ /* start asynchronous connect */
+ AsyncConnect(cv);
+ break; /* break for-loop immediately */
+ }
+ break;
+#else
+ if ((ts->HostName[0] >= 0x30) && (ts->HostName[0] <= 0x39))
+ {
+ addr = Pinet_addr(ts->HostName);
+ InvalidHost = (addr == 0xffffffff);
+ }
+ else {
+ HAsync = PWSAAsyncGetHostByName(HW,WM_USER_GETHOST,
+ ts->HostName,HEntBuff,sizeof(HEntBuff));
+ if (HAsync == 0)
+ InvalidHost = TRUE;
+ else {
+ cv->ComPort = 1; // set "getting host" flag
+ // (see CVTWindow::OnSysCommand())
+ do {
+ if (GetMessage(&Msg,0,0,0))
+ {
+ if ((Msg.hwnd==HW) &&
+ ((Msg.message == WM_SYSCOMMAND) &&
+ ((Msg.wParam & 0xfff0) == SC_CLOSE) ||
+ (Msg.message == WM_COMMAND) &&
+ (LOWORD(Msg.wParam) == ID_FILE_EXIT) ||
+ (Msg.message == WM_CLOSE)))
+ { /* Exit when the user closes Tera Term */
+ PWSACancelAsyncRequest(HAsync);
+ HAsync = 0;
+ cv->ComPort = 0; // clear "getting host" flag
+ PostMessage(HW,Msg.message,Msg.wParam,Msg.lParam);
+ return;
+ }
+ if (Msg.message != WM_USER_GETHOST)
+ { /* Prosess messages */
+ TranslateMessage(&Msg);
+ DispatchMessage(&Msg);
+ }
+ }
+ else {
+ return;
+ }
+ } while (Msg.message!=WM_USER_GETHOST);
+ cv->ComPort = 0; // clear "getting host" flag
+ HAsync = 0;
+ InvalidHost = WSAGETASYNCERROR(Msg.lParam) != 0;
+ if (! InvalidHost)
+ {
+ if (((PHOSTENT)HEntBuff)->h_addr_list != NULL)
+ memcpy(&addr,
+ ((PHOSTENT)HEntBuff)->h_addr_list[0],sizeof(addr));
+ else
+ InvalidHost = TRUE;
+ }
+ }
+
+ }
+
+ if (InvalidHost)
+ {
+ if (cv->NoMsg==0)
+ MessageBox(cv->HWin,"Invalid host",ErrorCaption,
+ MB_TASKMODAL | MB_ICONEXCLAMATION);
+ }
+ else {
+ cv->s= Psocket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
+ if (cv->s==INVALID_SOCKET)
+ {
+ InvalidHost = TRUE;
+ if (cv->NoMsg==0)
+ MessageBox(cv->HWin,ErrorCantConn,ErrorCaption,
+ MB_TASKMODAL | MB_ICONEXCLAMATION);
+ }
+ else {
+ BBuf = TRUE;
+ Psetsockopt(cv->s,(int)SOL_SOCKET,SO_OOBINLINE,(char FAR *)&BBuf,sizeof(BBuf));
+
+ PWSAAsyncSelect(cv->s,cv->HWin,WM_USER_COMMOPEN, FD_CONNECT);
+ saddr.sin_family = AF_INET;
+ saddr.sin_port = Phtons(ts->TCPPort);
+ saddr.sin_addr.s_addr = addr;
+ memset(saddr.sin_zero,0,8);
+
+ Err = Pconnect(cv->s,(LPSOCKADDR)&saddr,sizeof(saddr));
+ if (Err!=0 ) Err = PWSAGetLastError();
+ if (Err==WSAEWOULDBLOCK )
+ {
+ /* Do nothing */
+ }
+ else if (Err!=0 )
+ PostMessage(cv->HWin, WM_USER_COMMOPEN,0,
+ MAKELONG(FD_CONNECT,Err));
+ }
+ }
+ }
+ break;
+#endif /* NO_INET6 */
+
+ case IdSerial:
+ InitFileIO(IdSerial); /* TTPLUG */
+ TTXOpenFile(); /* TTPLUG */
+ _snprintf_s(P, sizeof(P), _TRUNCATE, "COM%d", ts->ComPort);
+ strncpy_s(ErrMsg, sizeof(ErrMsg),P, _TRUNCATE);
+ strncpy_s(P, sizeof(P),"\\\\.\\", _TRUNCATE);
+ strncat_s(P, sizeof(P),ErrMsg, _TRUNCATE);
+ cv->ComID =
+ PCreateFile(P,GENERIC_READ | GENERIC_WRITE,
+ 0,NULL,OPEN_EXISTING,
+ FILE_FLAG_OVERLAPPED,NULL);
+ if (cv->ComID == INVALID_HANDLE_VALUE ) {
+ get_lang_msg("MSG_CANTOEPN_ERROR", ts->UIMsg, sizeof(ts->UIMsg), "Cannot open %s", ts->UILanguageFile);
+ _snprintf_s(ErrMsg, sizeof(ErrMsg), _TRUNCATE, ts->UIMsg, &P[4]);
+
+ if (cv->NoMsg==0) {
+ get_lang_msg("MSG_TT_ERROR", uimsg, sizeof(uimsg), "Tera Term: Error", ts->UILanguageFile);
+ MessageBox(cv->HWin,ErrMsg,uimsg,MB_TASKMODAL | MB_ICONEXCLAMATION);
+ }
+ InvalidHost = TRUE;
+ }
+ else {
+ cv->Open = TRUE;
+ cv->ComPort = ts->ComPort;
+ CommResetSerial(ts, cv, ts->ClearComBuffOnOpen);
+ if (!ts->ClearComBuffOnOpen) {
+ cv->RRQ = TRUE;
+ }
+
+ /* notify to VT window that Comm Port is open */
+ PostMessage(cv->HWin, WM_USER_COMMOPEN, 0, 0);
+ InvalidHost = FALSE;
+
+ SetCOMFlag(ts->ComPort);
+ }
+ break; /* end of "case IdSerial:" */
+
+ case IdFile:
+ InitFileIO(IdFile); /* TTPLUG */
+ TTXOpenFile(); /* TTPLUG */
+ cv->ComID = PCreateFile(ts->HostName,GENERIC_READ,0,NULL,
+ OPEN_EXISTING,0,NULL);
+ InvalidHost = (cv->ComID == INVALID_HANDLE_VALUE);
+ if (InvalidHost) {
+ if (cv->NoMsg==0) {
+ get_lang_msg("MSG_TT_ERROR", uimsg, sizeof(uimsg), "Tera Term: Error", ts->UILanguageFile);
+ get_lang_msg("MSG_CANTOEPN_FILE_ERROR", ts->UIMsg, sizeof(ts->UIMsg), "Cannot open file", ts->UILanguageFile);
+ MessageBox(cv->HWin,ts->UIMsg,uimsg,MB_TASKMODAL | MB_ICONEXCLAMATION);
+ }
+ }
+ else {
+ cv->Open = TRUE;
+ PostMessage(cv->HWin, WM_USER_COMMOPEN, 0, 0);
+ }
+ break;
+ } /* end of "switch" */
+
+#ifndef NO_INET6
+BreakSC:
+#endif /* NO_INET6 */
+ if (InvalidHost) {
+ PostMessage(cv->HWin, WM_USER_COMMNOTIFY, 0, FD_CLOSE);
+ if ( (ts->PortType==IdTCPIP) && cv->Open ) {
+ if ( cv->s!=INVALID_SOCKET ) {
+ Pclosesocket(cv->s);
+ }
+ FreeWinsock();
+ }
+ return;
+ }
+}
+
+void CommThread(void *arg)
+{
+ DWORD Evt;
+ PComVar cv = (PComVar)arg;
+ DWORD DErr;
+ HANDLE REnd;
+ char Temp[20];
+
+ _snprintf_s(Temp, sizeof(Temp), _TRUNCATE, "%s%d", READENDNAME, cv->ComPort);
+ REnd = OpenEvent(EVENT_ALL_ACCESS,FALSE, Temp);
+ while (TRUE) {
+ if (WaitCommEvent(cv->ComID,&Evt,NULL)) {
+ if (! cv->Ready) {
+ _endthread();
+ }
+ if (! cv->RRQ) {
+ PostMessage(cv->HWin, WM_USER_COMMNOTIFY, 0, FD_READ);
+ }
+ WaitForSingleObject(REnd,INFINITE);
+ }
+ else {
+ DErr = GetLastError(); // this returns 995 (operation aborted) if a USB com port is removed
+ if (! cv->Ready || ERROR_OPERATION_ABORTED == DErr) {
+ _endthread();
+ }
+ ClearCommError(cv->ComID,&DErr,NULL);
+ }
+ }
+}
+
+void CommStart(PComVar cv, LONG lParam, PTTSet ts)
+{
+ char ErrMsg[31];
+ char Temp[20];
+ char uimsg[MAX_UIMSG];
+
+ if (! cv->Open ) {
+ return;
+ }
+ if ( cv->Ready ) {
+ return;
+ }
+
+ // ????????????????B????????? WM_TIMER ??????????????
+ if (*cv->ConnetingTimeout > 0) {
+ KillTimer(cv->HWin, IdCancelConnectTimer);
+ }
+
+ switch (cv->PortType) {
+ case IdTCPIP:
+ ErrMsg[0] = 0;
+ switch (HIWORD(lParam)) {
+ case WSAECONNREFUSED:
+ get_lang_msg("MSG_COMM_REFUSE_ERROR", ts->UIMsg, sizeof(ts->UIMsg), "Connection refused", ts->UILanguageFile);
+ _snprintf_s(ErrMsg, sizeof(ErrMsg), _TRUNCATE, "%s", ts->UIMsg);
+ break;
+ case WSAENETUNREACH:
+ get_lang_msg("MSG_COMM_REACH_ERROR", ts->UIMsg, sizeof(ts->UIMsg), "Network cannot be reached", ts->UILanguageFile);
+ _snprintf_s(ErrMsg, sizeof(ErrMsg), _TRUNCATE, "%s", ts->UIMsg);
+ break;
+ case WSAETIMEDOUT:
+ get_lang_msg("MSG_COMM_CONNECT_ERROR", ts->UIMsg, sizeof(ts->UIMsg), "Connection timed out", ts->UILanguageFile);
+ _snprintf_s(ErrMsg, sizeof(ErrMsg), _TRUNCATE, "%s", ts->UIMsg);
+ break;
+ default:
+ get_lang_msg("MSG_COMM_TIMEOUT_ERROR", ts->UIMsg, sizeof(ts->UIMsg), "Cannot connect the host", ts->UILanguageFile);
+ _snprintf_s(ErrMsg, sizeof(ErrMsg), _TRUNCATE, "%s", ts->UIMsg);
+ }
+ if (HIWORD(lParam)>0) {
+#ifndef NO_INET6
+ /* connect() failed */
+ if (cv->res->ai_next != NULL) {
+ /* try to connect with other protocol */
+ CloseSocket(cv->s);
+ for (cv->res = cv->res->ai_next; cv->res; cv->res = cv->res->ai_next) {
+ cv->s = OpenSocket(cv);
+ if (cv->s == INVALID_SOCKET) {
+ CloseSocket(cv->s);
+ continue;
+ }
+ AsyncConnect(cv);
+ cv->Ready = FALSE;
+ cv->RetryWithOtherProtocol = TRUE; /* retry with other procotol */
+ return;
+ }
+ } else {
+ /* trying with all protocol family are failed */
+ if (cv->NoMsg==0)
+ {
+ get_lang_msg("MSG_TT_ERROR", uimsg, sizeof(uimsg), "Tera Term: Error", ts->UILanguageFile);
+ MessageBox(cv->HWin,ErrMsg,uimsg,MB_TASKMODAL | MB_ICONEXCLAMATION);
+ }
+ PostMessage(cv->HWin, WM_USER_COMMNOTIFY, 0, FD_CLOSE);
+ cv->RetryWithOtherProtocol = FALSE;
+ return;
+ }
+#else
+ if (cv->NoMsg==0)
+ MessageBox(cv->HWin,ErrMsg,ErrorCaption,
+ MB_TASKMODAL | MB_ICONEXCLAMATION);
+ PostMessage(cv->HWin, WM_USER_COMMNOTIFY, 0, FD_CLOSE);
+ return;
+#endif /* NO_INET6 */
+ }
+
+#ifndef NO_INET6
+ /* here is connection established */
+ cv->RetryWithOtherProtocol = FALSE;
+#endif /* NO_INET6 */
+ PWSAAsyncSelect(cv->s,cv->HWin,WM_USER_COMMNOTIFY, FD_READ | FD_OOB | FD_CLOSE);
+ TCPIPClosed = FALSE;
+ break;
+
+ case IdSerial:
+ _snprintf_s(Temp, sizeof(Temp), _TRUNCATE, "%s%d", READENDNAME, cv->ComPort);
+ ReadEnd = CreateEvent(NULL,FALSE,FALSE,Temp);
+ _snprintf_s(Temp, sizeof(Temp), _TRUNCATE, "%s%d", WRITENAME, cv->ComPort);
+ memset(&wol,0,sizeof(OVERLAPPED));
+ wol.hEvent = CreateEvent(NULL,TRUE,TRUE,Temp);
+ _snprintf_s(Temp, sizeof(Temp), _TRUNCATE, "%s%d", READNAME, cv->ComPort);
+ memset(&rol,0,sizeof(OVERLAPPED));
+ rol.hEvent = CreateEvent(NULL,TRUE,FALSE,Temp);
+
+ /* create the receiver thread */
+ if (_beginthread(CommThread,0,cv) == -1) {
+ get_lang_msg("MSG_TT_ERROR", uimsg, sizeof(uimsg), "Tera Term: Error", ts->UILanguageFile);
+ get_lang_msg("MSG_TT_ERROR", ts->UIMsg, sizeof(ts->UIMsg), "Can't create thread", ts->UILanguageFile);
+ MessageBox(cv->HWin,ts->UIMsg,uimsg,MB_TASKMODAL | MB_ICONEXCLAMATION);
+ }
+ break;
+
+ case IdFile:
+ cv->RRQ = TRUE;
+ break;
+ }
+ cv->Ready = TRUE;
+}
+
+BOOL CommCanClose(PComVar cv)
+{ // check if data remains in buffer
+ if (! cv->Open) {
+ return TRUE;
+ }
+ if (cv->InBuffCount>0) {
+ return FALSE;
+ }
+ if ((cv->HLogBuf!=NULL) &&
+ ((cv->LCount>0) ||
+ (cv->DCount>0))) {
+ return FALSE;
+ }
+ if ((cv->HBinBuf!=NULL) &&
+ (cv->BCount>0)) {
+ return FALSE;
+ }
+ return TRUE;
+}
+
+void CommClose(PComVar cv)
+{
+ if ( ! cv->Open ) {
+ return;
+ }
+ cv->Open = FALSE;
+
+ /* disable event message posting & flush buffer */
+ cv->RRQ = FALSE;
+ cv->Ready = FALSE;
+ cv->InPtr = 0;
+ cv->InBuffCount = 0;
+ cv->OutPtr = 0;
+ cv->OutBuffCount = 0;
+ cv->LineModeBuffCount = 0;
+ cv->FlushLen = 0;
+ cv->Flush = FALSE;
+
+ /* close port & release resources */
+ switch (cv->PortType) {
+ case IdTCPIP:
+ if (HAsync!=0) {
+ PWSACancelAsyncRequest(HAsync);
+ }
+ HAsync = 0;
+#ifndef NO_INET6
+ freeaddrinfo(cv->res0);
+#endif /* NO_INET6 */
+ if ( cv->s!=INVALID_SOCKET ) {
+ Pclosesocket(cv->s);
+ }
+ cv->s = INVALID_SOCKET;
+ TTXCloseTCP(); /* TTPLUG */
+ FreeWinsock();
+ break;
+ case IdSerial:
+ if ( cv->ComID != INVALID_HANDLE_VALUE ) {
+ CloseHandle(ReadEnd);
+ CloseHandle(wol.hEvent);
+ CloseHandle(rol.hEvent);
+ PurgeComm(cv->ComID, PURGE_TXABORT | PURGE_RXABORT |
+ PURGE_TXCLEAR | PURGE_RXCLEAR);
+ EscapeCommFunction(cv->ComID,CLRDTR);
+ SetCommMask(cv->ComID,0);
+ PCloseFile(cv->ComID);
+ ClearCOMFlag(cv->ComPort);
+ }
+ TTXCloseFile(); /* TTPLUG */
+ break;
+ case IdFile:
+ if (cv->ComID != INVALID_HANDLE_VALUE) {
+ PCloseFile(cv->ComID);
+ }
+ TTXCloseFile(); /* TTPLUG */
+ break;
+ }
+ cv->ComID = INVALID_HANDLE_VALUE;
+ cv->PortType = 0;
+}
+
+void CommProcRRQ(PComVar cv)
+{
+ if ( ! cv->Ready ) {
+ return;
+ }
+ /* disable receive request */
+ switch (cv->PortType) {
+ case IdTCPIP:
+ if (! TCPIPClosed) {
+ PWSAAsyncSelect(cv->s,cv->HWin,WM_USER_COMMNOTIFY, FD_OOB | FD_CLOSE);
+ }
+ break;
+ case IdSerial:
+ break;
+ }
+ cv->RRQ = TRUE;
+ CommReceive(cv);
+}
+
+void CommReceive(PComVar cv)
+{
+ DWORD C;
+ DWORD DErr;
+
+ if (! cv->Ready || ! cv->RRQ ||
+ (cv->InBuffCount>=InBuffSize)) {
+ return;
+ }
+
+ /* Compact buffer */
+ if ((cv->InBuffCount>0) && (cv->InPtr>0)) {
+ memmove(cv->InBuff,&(cv->InBuff[cv->InPtr]),cv->InBuffCount);
+ cv->InPtr = 0;
+ }
+
+ if (cv->InBuffCountPortType) {
+ case IdTCPIP:
+ C = Precv(cv->s, &(cv->InBuff[cv->InBuffCount]),
+ InBuffSize-cv->InBuffCount, 0);
+ if (C == SOCKET_ERROR) {
+ C = 0;
+ PWSAGetLastError();
+ }
+ cv->InBuffCount = cv->InBuffCount + C;
+ break;
+ case IdSerial:
+ do {
+ ClearCommError(cv->ComID,&DErr,NULL);
+ if (! PReadFile(cv->ComID,&(cv->InBuff[cv->InBuffCount]),
+ InBuffSize-cv->InBuffCount,&C,&rol)) {
+ if (GetLastError() == ERROR_IO_PENDING) {
+ if (WaitForSingleObject(rol.hEvent, 1000) != WAIT_OBJECT_0) {
+ C = 0;
+ }
+ else {
+ GetOverlappedResult(cv->ComID,&rol,&C,FALSE);
+ }
+ }
+ else {
+ C = 0;
+ }
+ }
+ cv->InBuffCount = cv->InBuffCount + C;
+ } while ((C!=0) && (cv->InBuffCountComID,&DErr,NULL);
+ break;
+ case IdFile:
+ if (PReadFile(cv->ComID,&(cv->InBuff[cv->InBuffCount]),
+ InBuffSize-cv->InBuffCount,&C,NULL)) {
+ if (C == 0) {
+ DErr = ERROR_HANDLE_EOF;
+ }
+ else {
+ cv->InBuffCount = cv->InBuffCount + C;
+ }
+ }
+ else {
+ DErr = GetLastError();
+ }
+ break;
+ }
+ }
+
+ if (cv->InBuffCount==0) {
+ switch (cv->PortType) {
+ case IdTCPIP:
+ if (! TCPIPClosed) {
+ PWSAAsyncSelect(cv->s,cv->HWin, WM_USER_COMMNOTIFY,
+ FD_READ | FD_OOB | FD_CLOSE);
+ }
+ break;
+ case IdSerial:
+ cv->RRQ = FALSE;
+ SetEvent(ReadEnd);
+ return;
+ case IdFile:
+ if (DErr != ERROR_IO_PENDING) {
+ PostMessage(cv->HWin, WM_USER_COMMNOTIFY, 0, FD_CLOSE);
+ cv->RRQ = FALSE;
+ }
+ else {
+ cv->RRQ = TRUE;
+ }
+ return;
+ }
+ cv->RRQ = FALSE;
+ }
+}
+
+void CommSend(PComVar cv)
+{
+ int delay;
+ COMSTAT Stat;
+ BYTE LineEnd;
+ int C, D, Max;
+ DWORD DErr;
+
+ if ((! cv->Open) || (! cv->Ready)) {
+ cv->OutBuffCount = 0;
+ return;
+ }
+
+ if ((cv->OutBuffCount == 0) || (! cv->CanSend)) {
+ return;
+ }
+
+ /* Max num of bytes to be written */
+ switch (cv->PortType) {
+ case IdTCPIP:
+ if (TCPIPClosed) {
+ cv->OutBuffCount = 0;
+ }
+ Max = cv->OutBuffCount;
+ break;
+ case IdSerial:
+ ClearCommError(cv->ComID,&DErr,&Stat);
+ Max = OutBuffSize - Stat.cbOutQue;
+ break;
+ case IdFile:
+ Max = cv->OutBuffCount;
+ break;
+ }
+
+ if ( Max<=0 ) {
+ return;
+ }
+ if ( Max > cv->OutBuffCount ) {
+ Max = cv->OutBuffCount;
+ }
+
+ if (cv->PortType == IdTCPIP && cv->TelFlag) {
+ cv->LastSendTime = time(NULL);
+ }
+
+ C = Max;
+ delay = 0;
+
+ if ( cv->DelayFlag && (cv->PortType==IdSerial) ) {
+ if ( cv->DelayPerLine > 0 ) {
+ if ( cv->CRSend==IdCR ) {
+ LineEnd = 0x0d;
+ }
+ else {
+ LineEnd = 0x0a;
+ }
+ C = 1;
+ if ( cv->DelayPerChar==0 ) {
+ while ((COutBuff[cv->OutPtr+C-1]!=LineEnd)) {
+ C++;
+ }
+ }
+ if ( cv->OutBuff[cv->OutPtr+C-1]==LineEnd ) {
+ delay = cv->DelayPerLine;
+ }
+ else {
+ delay = cv->DelayPerChar;
+ }
+ }
+ else if ( cv->DelayPerChar > 0 ) {
+ C = 1;
+ delay = cv->DelayPerChar;
+ }
+ }
+
+ /* Write to comm driver/Winsock */
+ switch (cv->PortType) {
+ case IdTCPIP:
+ D = Psend(cv->s, &(cv->OutBuff[cv->OutPtr]), C, 0);
+ if ( D==SOCKET_ERROR ) { /* if error occurs */
+ PWSAGetLastError(); /* Clear error */
+ D = 0;
+ }
+ break;
+
+ case IdSerial:
+ if (! PWriteFile(cv->ComID,&(cv->OutBuff[cv->OutPtr]),C,(LPDWORD)&D,&wol)) {
+ if (GetLastError() == ERROR_IO_PENDING) {
+ if (WaitForSingleObject(wol.hEvent,1000) != WAIT_OBJECT_0) {
+ D = C; /* Time out, ignore data */
+ }
+ else {
+ GetOverlappedResult(cv->ComID,&wol,(LPDWORD)&D,FALSE);
+ }
+ }
+ else { /* I/O error */
+ D = C; /* ignore error */
+ }
+ }
+ ClearCommError(cv->ComID,&DErr,&Stat);
+ break;
+
+ case IdFile:
+ if (! PWriteFile(cv->ComID, &(cv->OutBuff[cv->OutPtr]), C, (LPDWORD)&D, NULL)) {
+ if (! GetLastError() == ERROR_IO_PENDING) {
+ D = C; /* ignore data */
+ }
+ }
+ break;
+ }
+
+ cv->OutBuffCount = cv->OutBuffCount - D;
+ if ( cv->OutBuffCount==0 ) {
+ cv->OutPtr = 0;
+ }
+ else {
+ cv->OutPtr = cv->OutPtr + D;
+ }
+
+ if ( (C==D) && (delay>0) ) {
+ cv->CanSend = FALSE;
+ SetTimer(cv->HWin, IdDelayTimer, delay, NULL);
+ }
+}
+
+void CommSendBreak(PComVar cv)
+/* for only serial ports */
+{
+ MSG DummyMsg;
+
+ if ( ! cv->Ready ) {
+ return;
+ }
+
+ switch (cv->PortType) {
+ case IdSerial:
+ /* Set com port into a break state */
+ SetCommBreak(cv->ComID);
+
+ /* pause for 1 sec */
+ if (SetTimer(cv->HWin, IdBreakTimer, 1000, NULL) != 0) {
+ GetMessage(&DummyMsg,cv->HWin,WM_TIMER,WM_TIMER);
+ }
+
+ /* Set com port into the nonbreak state */
+ ClearCommBreak(cv->ComID);
+ break;
+ }
+}
+
+void CommLock(PTTSet ts, PComVar cv, BOOL Lock)
+{
+ BYTE b;
+ DWORD Func;
+
+ if (! cv->Ready) {
+ return;
+ }
+ if ((cv->PortType==IdTCPIP) ||
+ (cv->PortType==IdSerial) &&
+ (ts->Flow!=IdFlowHard)) {
+ if (Lock) {
+ b = XOFF;
+ }
+ else {
+ b = XON;
+ }
+ CommBinaryOut(cv,&b,1);
+ }
+ else if ((cv->PortType==IdSerial) &&
+ (ts->Flow==IdFlowHard)) {
+ if (Lock) {
+ Func = CLRRTS;
+ }
+ else {
+ Func = SETRTS;
+ }
+ EscapeCommFunction(cv->ComID,Func);
+ }
+}
+
+int GetCommSerialBaudRate(int id)
+{
+ char *ch;
+ int val;
+
+ // id-1?????index????
+ ch = BaudList[id - 1];
+ val = atoi(ch);
+ return (val);
+}
+
+BOOL PrnOpen(PCHAR DevName)
+{
+ char Temp[MAXPATHLEN];
+ DCB dcb;
+ DWORD DErr;
+ COMMTIMEOUTS ctmo;
+
+ strncpy_s(Temp, sizeof(Temp),DevName, _TRUNCATE);
+ Temp[4] = 0; // COMn or LPTn
+ LPTFlag = (Temp[0]=='L') ||
+ (Temp[0]=='l');
+ PrnID = CreateFile(Temp,GENERIC_WRITE,
+ 0,NULL,OPEN_EXISTING,
+ 0,NULL);
+ if (PrnID == INVALID_HANDLE_VALUE) {
+ return FALSE;
+ }
+
+ if (GetCommState(PrnID,&dcb)) {
+ BuildCommDCB(DevName,&dcb);
+ SetCommState(PrnID,&dcb);
+ }
+ ClearCommError(PrnID,&DErr,NULL);
+ if (! LPTFlag) {
+ SetupComm(PrnID,0,CommOutQueSize);
+ }
+ /* flush output buffer */
+ PurgeComm(PrnID, PURGE_TXABORT | PURGE_TXCLEAR);
+ memset(&ctmo,0,sizeof(ctmo));
+ ctmo.WriteTotalTimeoutConstant = 1000;
+ SetCommTimeouts(PrnID,&ctmo);
+ if (! LPTFlag) {
+ EscapeCommFunction(PrnID,SETDTR);
+ }
+ return TRUE;
+}
+
+int PrnWrite(PCHAR b, int c)
+{
+ int d;
+ DWORD DErr;
+ COMSTAT Stat;
+
+ if (PrnID == INVALID_HANDLE_VALUE ) {
+ return c;
+ }
+
+ ClearCommError(PrnID,&DErr,&Stat);
+ if (! LPTFlag &&
+ (OutBuffSize - (int)Stat.cbOutQue < c)) {
+ c = OutBuffSize - Stat.cbOutQue;
+ }
+ if (c<=0) {
+ return 0;
+ }
+ if (! WriteFile(PrnID,b,c,(LPDWORD)&d,NULL)) {
+ d = 0;
+ }
+ ClearCommError(PrnID,&DErr,NULL);
+ return d;
+}
+
+void PrnCancel()
+{
+ PurgeComm(PrnID, PURGE_TXABORT | PURGE_TXCLEAR);
+ PrnClose();
+}
+
+void PrnClose()
+{
+ if (PrnID != INVALID_HANDLE_VALUE) {
+ if (!LPTFlag) {
+ EscapeCommFunction(PrnID,CLRDTR);
+ }
+ CloseHandle(PrnID);
+ }
+ PrnID = INVALID_HANDLE_VALUE;
+}
Modified: trunk/teraterm/ttpfile/ttfile.c
===================================================================
--- trunk/teraterm/ttpfile/ttfile.c 2010-04-12 12:51:24 UTC (rev 3854)
+++ trunk/teraterm/ttpfile/ttfile.c 2010-04-12 13:43:07 UTC (rev 3855)
@@ -1,1193 +1,1195 @@
-/* Tera Term
- Copyright(C) 1994-1998 T. Teranishi
- All rights reserved. */
-
-/* TTFILE.DLL, file transfer, VT window printing */
-#include "teraterm.h"
-#include "tttypes.h"
-#include "ttftypes.h"
-#include
-#include
-#include
-
-#include "ttlib.h"
-#include "ftlib.h"
-#include "dlglib.h"
-#include "kermit.h"
-#include "xmodem.h"
-#include "ymodem.h"
-#include "zmodem.h"
-#include "bplus.h"
-#include "quickvan.h"
-// resource IDs
-#include "file_res.h"
-
-#include
-#include
-#include
-
-#include "compat_w95.h"
-
-static HANDLE hInst;
-
-static HFONT DlgFoptFont;
-static HFONT DlgXoptFont;
-static HFONT DlgGetfnFont;
-
-char UILanguageFile[MAX_PATH];
-char FileSendFilter[128];
-
-BOOL FAR PASCAL GetSetupFname(HWND HWin, WORD FuncId, PTTSet ts)
-{
- int i, j;
- OPENFILENAME ofn;
- char uimsg[MAX_UIMSG];
-
- // char FNameFilter[HostNameMaxLength + 1]; // 81(yutaka)
- char FNameFilter[81]; // 81(yutaka)
- char TempDir[MAXPATHLEN];
- char Dir[MAXPATHLEN];
- char Name[MAXPATHLEN];
- BOOL Ok;
-
- /* save current dir */
- _getcwd(TempDir,sizeof(TempDir));
-
- /* File name filter */
- memset(FNameFilter, 0, sizeof(FNameFilter));
- if (FuncId==GSF_LOADKEY)
- {
- get_lang_msg("FILEDLG_KEYBOARD_FILTER", uimsg, sizeof(uimsg), "keyboard setup files (*.cnf)\\0*.cnf\\0\\0", UILanguageFile);
- memcpy(FNameFilter, uimsg, sizeof(FNameFilter));
- }
- else {
- get_lang_msg("FILEDLG_SETUP_FILTER", uimsg, sizeof(uimsg), "setup files (*.ini)\\0*.ini\\0\\0", UILanguageFile);
- memcpy(FNameFilter, uimsg, sizeof(FNameFilter));
- }
-
- /* OPENFILENAME record */
- memset(&ofn, 0, sizeof(OPENFILENAME));
-
- ofn.lStructSize = sizeof(OPENFILENAME);
- ofn.hwndOwner = HWin;
- ofn.lpstrFile = Name;
- ofn.nMaxFile = sizeof(Name);
- ofn.lpstrFilter = FNameFilter;
- ofn.nFilterIndex = 1;
- ofn.hInstance = hInst;
-
- if (FuncId==GSF_LOADKEY)
- {
- ofn.lpstrDefExt = "cnf";
- GetFileNamePos(ts->KeyCnfFN,&i,&j);
- strncpy_s(Name, sizeof(Name),&(ts->KeyCnfFN[j]), _TRUNCATE);
- memcpy(Dir,ts->KeyCnfFN,i);
- Dir[i] = 0;
-
- if ((strlen(Name)==0) || (_stricmp(Name,"KEYBOARD.CNF")==0))
- strncpy_s(Name, sizeof(Name),"KEYBOARD.CNF", _TRUNCATE);
- }
- else {
- ofn.lpstrDefExt = "ini";
- GetFileNamePos(ts->SetupFName,&i,&j);
- strncpy_s(Name, sizeof(Name),&(ts->SetupFName[j]), _TRUNCATE);
- memcpy(Dir,ts->SetupFName,i);
- Dir[i] = 0;
-
- if ((strlen(Name)==0) || (_stricmp(Name,"TERATERM.INI")==0))
- strncpy_s(Name, sizeof(Name),"TERATERM.INI", _TRUNCATE);
- }
-
- if (strlen(Dir)==0)
- strncpy_s(Dir, sizeof(Dir),ts->HomeDir, _TRUNCATE);
-
- _chdir(Dir);
-
- ofn.Flags = OFN_SHOWHELP | OFN_HIDEREADONLY;
- switch (FuncId) {
- case GSF_SAVE:
- // ??t???????????????????????????(2005.1.6 yutaka)
- // ??????teraterm.ini???????????????
- // ??????/F= ????????????????????(2005.1.26 yutaka)
- // Windows Vista ?????????????? NULL ??????????????
- // ?????????????????????????????(2006.9.16 maya)
-// ofn.lpstrInitialDir = __argv[0];
-// ofn.lpstrInitialDir = ts->SetupFName;
- ofn.lpstrInitialDir = Dir;
- get_lang_msg("FILEDLG_SAVE_SETUP_TITLE", uimsg, sizeof(uimsg), "Tera Term: Save setup", UILanguageFile);
- ofn.lpstrTitle = uimsg;
- Ok = GetSaveFileName(&ofn);
- if (Ok)
- strncpy_s(ts->SetupFName, sizeof(ts->SetupFName),Name, _TRUNCATE);
- break;
- case GSF_RESTORE:
- ofn.Flags = ofn.Flags | OFN_FILEMUSTEXIST;
- get_lang_msg("FILEDLG_RESTORE_SETUP_TITLE", uimsg, sizeof(uimsg), "Tera Term: Restore setup", UILanguageFile);
- ofn.lpstrTitle = uimsg;
- Ok = GetOpenFileName(&ofn);
- if (Ok)
- strncpy_s(ts->SetupFName, sizeof(ts->SetupFName),Name, _TRUNCATE);
- break;
- case GSF_LOADKEY:
- ofn.Flags = ofn.Flags | OFN_FILEMUSTEXIST;
- get_lang_msg("FILEDLG_LOAD_KEYMAP_TITLE", uimsg, sizeof(uimsg), "Tera Term: Load key map", UILanguageFile);
- ofn.lpstrTitle = uimsg;
- Ok = GetOpenFileName(&ofn);
- if (Ok)
- strncpy_s(ts->KeyCnfFN, sizeof(ts->KeyCnfFN),Name, _TRUNCATE);
- break;
- }
-
- /* restore dir */
- _chdir(TempDir);
-
- return Ok;
-}
-
-/* Hook function for file name dialog box */
-BOOL CALLBACK TFnHook(HWND Dialog, UINT Message, WPARAM wParam, LPARAM lParam)
-{
- LPOPENFILENAME ofn;
- WORD Lo, Hi;
- LPLONG pl;
- LPOFNOTIFY notify;
- char uimsg[MAX_UIMSG], uimsg2[MAX_UIMSG];
- LOGFONT logfont;
- HFONT font;
-
- switch (Message) {
- case WM_INITDIALOG:
- ofn = (LPOPENFILENAME)lParam;
- pl = (LPLONG)(ofn->lCustData);
- SetWindowLong(Dialog, DWL_USER, (LONG)pl);
-
- font = (HFONT)SendMessage(Dialog, WM_GETFONT, 0, 0);
- GetObject(font, sizeof(LOGFONT), &logfont);
- if (get_lang_font("DLG_TAHOMA_FONT", Dialog, &logfont, &DlgFoptFont, UILanguageFile)) {
- SendDlgItemMessage(Dialog, IDC_FOPT, WM_SETFONT, (WPARAM)DlgFoptFont, MAKELPARAM(TRUE,0));
- SendDlgItemMessage(Dialog, IDC_FOPTBIN, WM_SETFONT, (WPARAM)DlgFoptFont, MAKELPARAM(TRUE,0));
- SendDlgItemMessage(Dialog, IDC_FOPTAPPEND, WM_SETFONT, (WPARAM)DlgFoptFont, MAKELPARAM(TRUE,0));
- SendDlgItemMessage(Dialog, IDC_PLAINTEXT, WM_SETFONT, (WPARAM)DlgFoptFont, MAKELPARAM(TRUE,0));
- SendDlgItemMessage(Dialog, IDC_TIMESTAMP, WM_SETFONT, (WPARAM)DlgFoptFont, MAKELPARAM(TRUE,0));
- SendDlgItemMessage(Dialog, IDC_HIDEDIALOG, WM_SETFONT, (WPARAM)DlgFoptFont, MAKELPARAM(TRUE,0));
- }
- else {
- DlgFoptFont = NULL;
- }
-
- GetDlgItemText(Dialog, IDC_FOPT, uimsg2, sizeof(uimsg2));
- get_lang_msg("DLG_FOPT", uimsg, sizeof(uimsg), uimsg2, UILanguageFile);
- SetDlgItemText(Dialog, IDC_FOPT, uimsg);
- GetDlgItemText(Dialog, IDC_FOPTBIN, uimsg2, sizeof(uimsg2));
- get_lang_msg("DLG_FOPT_BINARY", uimsg, sizeof(uimsg), uimsg2, UILanguageFile);
- SetDlgItemText(Dialog, IDC_FOPTBIN, uimsg);
- GetDlgItemText(Dialog, IDC_FOPTAPPEND, uimsg2, sizeof(uimsg2));
- get_lang_msg("DLG_FOPT_APPEND", uimsg, sizeof(uimsg), uimsg2, UILanguageFile);
- SetDlgItemText(Dialog, IDC_FOPTAPPEND, uimsg);
- GetDlgItemText(Dialog, IDC_PLAINTEXT, uimsg2, sizeof(uimsg2));
- get_lang_msg("DLG_FOPT_PLAIN", uimsg, sizeof(uimsg), uimsg2, UILanguageFile);
- SetDlgItemText(Dialog, IDC_PLAINTEXT, uimsg);
- GetDlgItemText(Dialog, IDC_TIMESTAMP, uimsg2, sizeof(uimsg2));
- get_lang_msg("DLG_FOPT_TIMESTAMP", uimsg, sizeof(uimsg), uimsg2, UILanguageFile);
- SetDlgItemText(Dialog, IDC_TIMESTAMP, uimsg);
- GetDlgItemText(Dialog, IDC_HIDEDIALOG, uimsg2, sizeof(uimsg2));
- get_lang_msg("DLG_FOPT_HIDEDIALOG", uimsg, sizeof(uimsg), uimsg2, UILanguageFile);
- SetDlgItemText(Dialog, IDC_HIDEDIALOG, uimsg);
-
- Lo = LOWORD(*pl) & 1;
- Hi = HIWORD(*pl);
- SetRB(Dialog,Lo,IDC_FOPTBIN,IDC_FOPTBIN);
- if (Hi!=0xFFFF)
- {
- ShowDlgItem(Dialog,IDC_FOPTAPPEND,IDC_FOPTAPPEND);
- SetRB(Dialog,Hi & 1,IDC_FOPTAPPEND,IDC_FOPTAPPEND);
-
- // plain text???????????????ON (2005.2.20 yutaka)
- ShowDlgItem(Dialog,IDC_PLAINTEXT,IDC_PLAINTEXT);
- if (Lo) {
- // Binary??????????????????
- DisableDlgItem(Dialog,IDC_PLAINTEXT,IDC_PLAINTEXT);
- }
- else if (Hi & 0x1000) {
- SetRB(Dialog,1,IDC_PLAINTEXT,IDC_PLAINTEXT);
- }
-
- // timestamp???????? (2006.7.23 maya)
- ShowDlgItem(Dialog,IDC_TIMESTAMP,IDC_TIMESTAMP);
- if (Lo) {
- // Binary??????????????????
- DisableDlgItem(Dialog,IDC_TIMESTAMP,IDC_TIMESTAMP);
- }
- else if (Hi & 0x2000) {
- SetRB(Dialog,1,IDC_TIMESTAMP,IDC_TIMESTAMP);
- }
-
- // Hide dialog???????? (2008.1.30 maya)
- ShowDlgItem(Dialog,IDC_HIDEDIALOG,IDC_HIDEDIALOG);
- if (Hi & 0x4000) {
- SetRB(Dialog,1,IDC_HIDEDIALOG,IDC_HIDEDIALOG);
- }
- }
- return TRUE;
-
- case WM_COMMAND: // for old style dialog
- switch (LOWORD(wParam)) {
- case IDOK:
- pl = (LPLONG)GetWindowLong(Dialog,DWL_USER);
- if (pl!=NULL)
- {
- GetRB(Dialog,&Lo,IDC_FOPTBIN,IDC_FOPTBIN);
- Hi = HIWORD(*pl);
- if (Hi!=0xFFFF)
- GetRB(Dialog,&Hi,IDC_FOPTAPPEND,IDC_FOPTAPPEND);
- *pl = MAKELONG(Lo,Hi);
- }
- break;
- case IDCANCEL:
- break;
- case IDC_FOPTBIN:
- GetRB(Dialog,&Lo,IDC_FOPTBIN,IDC_FOPTBIN);
- if (Lo) {
- DisableDlgItem(Dialog,IDC_PLAINTEXT,IDC_TIMESTAMP);
- }
- else {
- EnableDlgItem(Dialog,IDC_PLAINTEXT,IDC_TIMESTAMP);
- }
- break;
- }
- break;
- case WM_NOTIFY: // for Explorer-style dialog
- notify = (LPOFNOTIFY)lParam;
- switch (notify->hdr.code) {
- case CDN_FILEOK:
- pl = (LPLONG)GetWindowLong(Dialog,DWL_USER);
- if (pl!=NULL)
- {
- WORD val = 0;
-
- GetRB(Dialog,&Lo,IDC_FOPTBIN,IDC_FOPTBIN);
- Hi = HIWORD(*pl);
- if (Hi!=0xFFFF)
- GetRB(Dialog,&Hi,IDC_FOPTAPPEND,IDC_FOPTAPPEND);
-
- if (!Lo) {
- // plain text check-box
- GetRB(Dialog,&val,IDC_PLAINTEXT,IDC_PLAINTEXT);
- if (val > 0) { // checked
- Hi |= 0x1000;
- }
-
- // timestamp???????? (2006.7.23 maya)
- GetRB(Dialog,&val,IDC_TIMESTAMP,IDC_TIMESTAMP);
- if (val > 0) {
- Hi |= 0x2000;
- }
- }
-
- // Hide dialog???????? (2008.1.30 maya)
- GetRB(Dialog,&val,IDC_HIDEDIALOG,IDC_HIDEDIALOG);
- if (val > 0) {
- Hi |= 0x4000;
- }
-
- *pl = MAKELONG(Lo,Hi);
- }
- if (DlgFoptFont != NULL) {
- DeleteObject(DlgFoptFont);
- }
- break;
- }
- break;
- }
- return FALSE;
-}
-
-BOOL FAR PASCAL GetTransFname
- (PFileVar fv, PCHAR CurDir, WORD FuncId, LPLONG Option)
-{
- char uimsg[MAX_UIMSG];
- char FNFilter[sizeof(FileSendFilter)*3], *pf;
- OPENFILENAME ofn;
- LONG opt;
- char TempDir[MAXPATHLEN];
- BOOL Ok;
- char FileName[MAX_PATH];
-
- /* save current dir */
- _getcwd(TempDir,sizeof(TempDir));
-
- memset(FNFilter, 0, sizeof(FNFilter)); /* Set up for double null at end */
- memset(&ofn, 0, sizeof(OPENFILENAME));
-
- strncpy_s(fv->DlgCaption, sizeof(fv->DlgCaption),"Tera Term: ", _TRUNCATE);
- pf = FNFilter;
- switch (FuncId) {
- case GTF_SEND:
- get_lang_msg("FILEDLG_TRANS_TITLE_SENDFILE", uimsg, sizeof(uimsg), TitSendFile, UILanguageFile);
- strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
- if (strlen(FileSendFilter) > 0) {
- get_lang_msg("FILEDLG_USER_FILTER_NAME", uimsg, sizeof(uimsg), "User define", UILanguageFile);
- _snprintf_s(FNFilter, sizeof(FNFilter), _TRUNCATE, "%s(%s)", uimsg, FileSendFilter);
- pf = pf + strlen(FNFilter) + 1;
- strncpy_s(pf, sizeof(FNFilter)-(pf - FNFilter) ,FileSendFilter, _TRUNCATE);
- pf = pf + strlen(pf) + 1;
- }
- break;
- case GTF_LOG:
- get_lang_msg("FILEDLG_TRANS_TITLE_LOG", uimsg, sizeof(uimsg), TitLog, UILanguageFile);
- strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
- break;
- case GTF_BP:
- get_lang_msg("FILEDLG_TRANS_TITLE_BPSEND", uimsg, sizeof(uimsg), TitBPSend, UILanguageFile);
- strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
- if (strlen(FileSendFilter) > 0) {
- get_lang_msg("FILEDLG_USER_FILTER_NAME", uimsg, sizeof(uimsg), "User define", UILanguageFile);
- _snprintf_s(FNFilter, sizeof(FNFilter), _TRUNCATE, "%s(%s)", uimsg, FileSendFilter);
- pf = pf + strlen(FNFilter) + 1;
- strncpy_s(pf, sizeof(FNFilter)-(pf - FNFilter) ,FileSendFilter, _TRUNCATE);
- pf = pf + strlen(pf) + 1;
- }
- break;
- default: return FALSE;
- }
-
- get_lang_msg("FILEDLG_ALL_FILTER", uimsg, sizeof(uimsg), "All(*.*)\\0*.*\\0\\0", UILanguageFile);
- // \0\0 ????K?????? 2 ???
- memcpy(pf, uimsg, sizeof(FNFilter) - (pf - FNFilter + 2));
-
- ExtractFileName(fv->FullName, FileName ,sizeof(FileName));
- strncpy_s(fv->FullName, sizeof(fv->FullName), FileName, _TRUNCATE);
- ofn.lStructSize = sizeof(OPENFILENAME);
- ofn.hwndOwner = fv->HMainWin;
- ofn.lpstrFilter = FNFilter;
- ofn.nFilterIndex = 1;
- ofn.lpstrFile = fv->FullName;
- ofn.nMaxFile = sizeof(fv->FullName);
- if (FuncId == GTF_LOG) {
- DWORD logdir = GetFileAttributes(fv->LogDefaultPath);
- // ??????????t?????????????????(2007.8.24 yutaka)
- if (logdir != -1 && logdir & FILE_ATTRIBUTE_DIRECTORY) {
- // LogDefaultPath?????????????t???????(2007.11.30 maya)
- ofn.lpstrInitialDir = fv->LogDefaultPath;
- }
- else {
- ofn.lpstrInitialDir = NULL;
- }
- } else {
- ofn.lpstrInitialDir = CurDir;
- }
- ofn.Flags = OFN_SHOWHELP | OFN_HIDEREADONLY;
- if (FuncId!=GTF_BP)
- {
- ofn.Flags = ofn.Flags | OFN_ENABLETEMPLATE | OFN_ENABLEHOOK;
- ofn.Flags = ofn.Flags | OFN_EXPLORER;
- ofn.lpTemplateName = MAKEINTRESOURCE(IDD_FOPT);
- ofn.lpfnHook = (LPOFNHOOKPROC)(&TFnHook);
- }
- opt = *Option;
- if (FuncId!=GTF_LOG)
- {
- ofn.Flags = ofn.Flags | OFN_FILEMUSTEXIST;
- opt = MAKELONG(LOWORD(*Option),0xFFFF);
-
- // ??????????????????????????????- // ?????????????????????? (2008.5.18 maya)
- if (strlen(FileSendFilter) > 0 &&
- !isInvalidFileNameChar(FileSendFilter)) {
- char file[MAX_PATH];
- strncpy_s(file, sizeof(file), CurDir, _TRUNCATE);
- AppendSlash(file, sizeof(file));
- strncat_s(file, sizeof(file), FileSendFilter, _TRUNCATE);
- if (_access(file, 0) == 0) {
- strncpy_s(fv->FullName, sizeof(fv->FullName), FileSendFilter, _TRUNCATE);
- }
- }
- }
- ofn.lCustData = (DWORD)&opt;
- ofn.lpstrTitle = fv->DlgCaption;
-
- ofn.hInstance = hInst;
-
- // logging???A????????????????????? (2005.1.6 yutaka)
- if (FuncId == GTF_LOG) {
- // ?????????(log_YYYYMMDD_HHMMSS.txt)????? (2005.1.21 yutaka)
- // ??????????? teraterm.log ??? (2005.2.22 yutaka)
- // ??????????????????o????? (2006.8.28 maya)
- Ok = GetSaveFileName(&ofn);
- } else {
- Ok = GetOpenFileName(&ofn);
- }
-
- if (Ok)
- {
- if (FuncId==GTF_LOG)
- *Option = opt;
- else
- *Option = MAKELONG(LOWORD(opt),HIWORD(*Option));
-
- fv->DirLen = ofn.nFileOffset;
-
- if (CurDir!=NULL)
- {
- memcpy(CurDir,fv->FullName,fv->DirLen-1);
- CurDir[fv->DirLen-1] = 0;
- }
- }
- /* restore dir */
- _chdir(TempDir);
- return Ok;
-}
-
-BOOL CALLBACK TFn2Hook(HWND Dialog, UINT Message, WPARAM wParam, LPARAM lParam)
-{
- LPOPENFILENAME ofn;
- LPWORD pw;
- LPOFNOTIFY notify;
- char uimsg[MAX_UIMSG], uimsg2[MAX_UIMSG];
- LOGFONT logfont;
- HFONT font;
-
- switch (Message) {
- case WM_INITDIALOG:
- ofn = (LPOPENFILENAME)lParam;
- pw = (LPWORD)ofn->lCustData;
- SetWindowLong(Dialog, DWL_USER, (LONG)pw);
-
- font = (HFONT)SendMessage(Dialog, WM_GETFONT, 0, 0);
- GetObject(font, sizeof(LOGFONT), &logfont);
- if (get_lang_font("DLG_TAHOMA_FONT", Dialog, &logfont, &DlgFoptFont, UILanguageFile)) {
- SendDlgItemMessage(Dialog, IDC_FOPT, WM_SETFONT, (WPARAM)DlgFoptFont, MAKELPARAM(TRUE,0));
- SendDlgItemMessage(Dialog, IDC_FOPTBIN, WM_SETFONT, (WPARAM)DlgFoptFont, MAKELPARAM(TRUE,0));
- SendDlgItemMessage(Dialog, IDC_FOPTAPPEND, WM_SETFONT, (WPARAM)DlgFoptFont, MAKELPARAM(TRUE,0));
- SendDlgItemMessage(Dialog, IDC_PLAINTEXT, WM_SETFONT, (WPARAM)DlgFoptFont, MAKELPARAM(TRUE,0));
- SendDlgItemMessage(Dialog, IDC_TIMESTAMP, WM_SETFONT, (WPARAM)DlgFoptFont, MAKELPARAM(TRUE,0));
- }
- else {
- DlgFoptFont = NULL;
- }
-
- GetDlgItemText(Dialog, IDC_FOPT, uimsg2, sizeof(uimsg2));
- get_lang_msg("DLG_FOPT", uimsg, sizeof(uimsg), uimsg2, UILanguageFile);
- SetDlgItemText(Dialog, IDC_FOPT, uimsg);
- GetDlgItemText(Dialog, IDC_FOPTBIN, uimsg2, sizeof(uimsg2));
- get_lang_msg("DLG_FOPT_BINARY", uimsg, sizeof(uimsg), uimsg2, UILanguageFile);
- SetDlgItemText(Dialog, IDC_FOPTBIN, uimsg);
-
- SetRB(Dialog,*pw & 1,IDC_FOPTBIN,IDC_FOPTBIN);
- return TRUE;
- case WM_COMMAND: // for old style dialog
- switch (LOWORD(wParam)) {
- case IDOK:
- pw = (LPWORD)GetWindowLong(Dialog,DWL_USER);
- if (pw!=NULL)
- GetRB(Dialog,pw,IDC_FOPTBIN,IDC_FOPTBIN);
- break;
- case IDCANCEL:
- break;
- }
- break;
- case WM_NOTIFY: // for Explorer-style dialog
- notify = (LPOFNOTIFY)lParam;
- switch (notify->hdr.code) {
- case CDN_FILEOK:
- pw = (LPWORD)GetWindowLong(Dialog,DWL_USER);
- if (pw!=NULL)
- GetRB(Dialog,pw,IDC_FOPTBIN,IDC_FOPTBIN);
- if (DlgFoptFont != NULL) {
- DeleteObject(DlgFoptFont);
- }
- break;
- }
- break;
- }
- return FALSE;
-}
-
-BOOL FAR PASCAL GetMultiFname
- (PFileVar fv, PCHAR CurDir, WORD FuncId, LPWORD Option)
-{
- int i, len;
- char uimsg[MAX_UIMSG];
- char FNFilter[sizeof(FileSendFilter)*2+128], *pf;
- OPENFILENAME ofn;
- char TempDir[MAXPATHLEN];
- BOOL Ok;
- char defaultFName[MAX_PATH];
-
- memset(FNFilter, 0, sizeof(FNFilter)); /* Set up for double null at end */
-
- /* save current dir */
- _getcwd(TempDir,sizeof(TempDir));
-
- fv->NumFname = 0;
-
- strncpy_s(fv->DlgCaption, sizeof(fv->DlgCaption),"Tera Term: ", _TRUNCATE);
- pf = FNFilter;
- switch (FuncId) {
- case GMF_KERMIT:
- get_lang_msg("FILEDLG_TRANS_TITLE_KMTSEND", uimsg, sizeof(uimsg), TitKmtSend, UILanguageFile);
- strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
- break;
- case GMF_Z:
- get_lang_msg("FILEDLG_TRANS_TITLE_ZSEND", uimsg, sizeof(uimsg), TitZSend, UILanguageFile);
- strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
- break;
- case GMF_QV:
- get_lang_msg("FILEDLG_TRANS_TITLE_QVSEND", uimsg, sizeof(uimsg), TitQVSend, UILanguageFile);
- strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
- break;
- case GMF_Y:
- get_lang_msg("FILEDLG_TRANS_TITLE_YSEND", uimsg, sizeof(uimsg), TitYSend, UILanguageFile);
- strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
- break;
- default:
- return FALSE;
- }
- if (strlen(FileSendFilter) > 0) {
- get_lang_msg("FILEDLG_USER_FILTER_NAME", uimsg, sizeof(uimsg), "User define", UILanguageFile);
- _snprintf_s(FNFilter, sizeof(FNFilter), _TRUNCATE, "%s(%s)", uimsg, FileSendFilter);
- pf = pf + strlen(FNFilter) + 1;
- strncpy_s(pf, sizeof(FNFilter)-(pf - FNFilter) ,FileSendFilter, _TRUNCATE);
- pf = pf + strlen(pf) + 1;
- }
-
- /* moemory should be zero-initialized */
- fv->FnStrMemHandle = GlobalAlloc(GHND, FnStrMemSize);
- if (fv->FnStrMemHandle == NULL)
- {
- MessageBeep(0);
- return FALSE;
- }
- else {
- fv->FnStrMem = GlobalLock(fv->FnStrMemHandle);
- if (fv->FnStrMem == NULL)
- {
- GlobalFree(fv->FnStrMemHandle);
- fv->FnStrMemHandle = 0;
- MessageBeep(0);
- return FALSE;
- }
- }
-
- get_lang_msg("FILEDLG_ALL_FILTER", uimsg, sizeof(uimsg), "All(*.*)\\0*.*\\0\\0", UILanguageFile);
- // \0\0 ????K?????? 2 ???
- memcpy(pf, uimsg, sizeof(FNFilter) - (pf - FNFilter + 2));
-
- memset(&ofn, 0, sizeof(OPENFILENAME));
- ofn.lStructSize = sizeof(OPENFILENAME);
- ofn.hwndOwner = fv->HMainWin;
- ofn.lpstrFilter = FNFilter;
- ofn.nFilterIndex = 1;
- ofn.lpstrFile = fv->FnStrMem;
- ofn.nMaxFile = FnStrMemSize;
- ofn.lpstrTitle= fv->DlgCaption;
- ofn.lpstrInitialDir = CurDir;
- ofn.Flags = OFN_SHOWHELP | OFN_ALLOWMULTISELECT |
- OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
- ofn.Flags = ofn.Flags | OFN_EXPLORER;
- ofn.lCustData = 0;
- if (FuncId==GMF_Z)
- {
- ofn.Flags = ofn.Flags | OFN_ENABLETEMPLATE | OFN_ENABLEHOOK;
- ofn.lCustData = (DWORD)Option;
- ofn.lpfnHook = (LPOFNHOOKPROC)(&TFn2Hook);
- ofn.lpTemplateName = MAKEINTRESOURCE(IDD_FOPT);
- } else if (FuncId==GMF_Y) {
- // TODO: YMODEM
-
- }
-
- ofn.hInstance = hInst;
-
- // ??????????????????????????????- // ?????????????????????? (2008.5.18 maya)
- if (strlen(FileSendFilter) > 0 &&
- !isInvalidFileNameChar(FileSendFilter)) {
- char file[MAX_PATH];
- strncpy_s(file, sizeof(file), CurDir, _TRUNCATE);
- AppendSlash(file, sizeof(file));
- strncat_s(file, sizeof(file), FileSendFilter, _TRUNCATE);
- if (_access(file, 0) == 0) {
- strncpy_s(defaultFName, sizeof(defaultFName), FileSendFilter, _TRUNCATE);
- ofn.lpstrFile = defaultFName;
- }
- }
-
- Ok = GetOpenFileName(&ofn);
- if (Ok)
- {
- /* count number of file names */
- len = strlen(fv->FnStrMem);
- i = 0;
- while (len>0)
- {
- i = i + len + 1;
- fv->NumFname++;
- len = strlen(&fv->FnStrMem[i]);
- }
-
- fv->NumFname--;
-
- 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;
- }
-
- memcpy(CurDir,fv->FullName,fv->DirLen);
- CurDir[fv->DirLen] = 0;
- if ((fv->DirLen>3) &&
- (CurDir[fv->DirLen-1]=='\\'))
- CurDir[fv->DirLen-1] = 0;
-
- fv->FNCount = 0;
- }
-
- GlobalUnlock(fv->FnStrMemHandle);
- if (! Ok)
- {
- GlobalFree(fv->FnStrMemHandle);
- fv->FnStrMemHandle = NULL;
- }
-
- /* restore dir */
- _chdir(TempDir);
-
- return Ok;
-}
-
-BOOL CALLBACK GetFnDlg
- (HWND Dialog, UINT Message, WPARAM wParam, LPARAM lParam)
-{
- PFileVar fv;
- char TempFull[MAXPATHLEN];
- int i, j;
- char uimsg[MAX_UIMSG], uimsg2[MAX_UIMSG];
- LOGFONT logfont;
- HFONT font;
-
- switch (Message) {
- case WM_INITDIALOG:
- fv = (PFileVar)lParam;
- SetWindowLong(Dialog, DWL_USER, lParam);
- SendDlgItemMessage(Dialog, IDC_GETFN, EM_LIMITTEXT, sizeof(TempFull)-1,0);
-
- font = (HFONT)SendMessage(Dialog, WM_GETFONT, 0, 0);
- GetObject(font, sizeof(LOGFONT), &logfont);
- if (get_lang_font("DLG_SYSTEM_FONT", Dialog, &logfont, &DlgGetfnFont, UILanguageFile)) {
- SendDlgItemMessage(Dialog, IDC_FILENAME, WM_SETFONT, (WPARAM)DlgGetfnFont, MAKELPARAM(TRUE,0));
- SendDlgItemMessage(Dialog, IDC_GETFN, WM_SETFONT, (WPARAM)DlgGetfnFont, MAKELPARAM(TRUE,0));
- SendDlgItemMessage(Dialog, IDOK, WM_SETFONT, (WPARAM)DlgGetfnFont, MAKELPARAM(TRUE,0));
- SendDlgItemMessage(Dialog, IDCANCEL, WM_SETFONT, (WPARAM)DlgGetfnFont, MAKELPARAM(TRUE,0));
- SendDlgItemMessage(Dialog, IDC_GETFNHELP, WM_SETFONT, (WPARAM)DlgGetfnFont, MAKELPARAM(TRUE,0));
- }
- else {
- DlgGetfnFont = NULL;
- }
-
- GetWindowText(Dialog, uimsg2, sizeof(uimsg2));
- get_lang_msg("DLG_GETFN_TITLE", uimsg, sizeof(uimsg), uimsg2, UILanguageFile);
- SetWindowText(Dialog, uimsg);
- GetDlgItemText(Dialog, IDC_FILENAME, uimsg2, sizeof(uimsg2));
- get_lang_msg("DLG_GETFN_FILENAME", uimsg, sizeof(uimsg), uimsg2, UILanguageFile);
- SetDlgItemText(Dialog, IDC_FILENAME, uimsg);
- GetDlgItemText(Dialog, IDOK, uimsg2, sizeof(uimsg2));
- get_lang_msg("BTN_OK", uimsg, sizeof(uimsg), uimsg2, UILanguageFile);
- SetDlgItemText(Dialog, IDOK, uimsg);
- GetDlgItemText(Dialog, IDCANCEL, uimsg2, sizeof(uimsg2));
- get_lang_msg("BTN_CANCEL", uimsg, sizeof(uimsg), uimsg2, UILanguageFile);
- SetDlgItemText(Dialog, IDCANCEL, uimsg);
- GetDlgItemText(Dialog, IDC_GETFNHELP, uimsg2, sizeof(uimsg2));
- get_lang_msg("BTN_HELP", uimsg, sizeof(uimsg), uimsg2, UILanguageFile);
- SetDlgItemText(Dialog, IDC_GETFNHELP, uimsg);
-
- return TRUE;
-
- case WM_COMMAND:
- fv = (PFileVar)GetWindowLong(Dialog,DWL_USER);
- switch (LOWORD(wParam)) {
- case IDOK:
- if (fv!=NULL)
- {
- GetDlgItemText(Dialog, IDC_GETFN, TempFull, sizeof(TempFull));
- if (strlen(TempFull)==0) return TRUE;
- GetFileNamePos(TempFull,&i,&j);
- FitFileName(&(TempFull[j]),sizeof(TempFull) - j, NULL);
- strncat_s(fv->FullName,sizeof(fv->FullName),&(TempFull[j]),_TRUNCATE);
- }
- EndDialog(Dialog, 1);
- if (DlgGetfnFont != NULL) {
- DeleteObject(DlgGetfnFont);
- }
- return TRUE;
- case IDCANCEL:
- EndDialog(Dialog, 0);
- if (DlgGetfnFont != NULL) {
- DeleteObject(DlgGetfnFont);
- }
- return TRUE;
- case IDC_GETFNHELP:
- if (fv!=NULL)
- PostMessage(fv->HMainWin,WM_USER_DLGHELP2,0,0);
- break;
- }
- }
- return FALSE;
-}
-
-BOOL FAR PASCAL GetGetFname(HWND HWin, PFileVar fv)
-{
- return (BOOL)DialogBoxParam(hInst,
- MAKEINTRESOURCE(IDD_GETFNDLG),
- HWin, GetFnDlg, (LONG)fv);
-}
-
-void FAR PASCAL SetFileVar(PFileVar fv)
-{
- int i;
- char uimsg[MAX_UIMSG];
-
- GetFileNamePos(fv->FullName,&(fv->DirLen),&i);
- if (fv->FullName[fv->DirLen]=='\\') fv->DirLen++;
- strncpy_s(fv->DlgCaption, sizeof(fv->DlgCaption),"Tera Term: ", _TRUNCATE);
- switch (fv->OpId) {
- case OpLog:
- get_lang_msg("FILEDLG_TRANS_TITLE_LOG", uimsg, sizeof(uimsg), TitLog, UILanguageFile);
- strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
- break;
- case OpSendFile:
- get_lang_msg("FILEDLG_TRANS_TITLE_SENDFILE", uimsg, sizeof(uimsg), TitSendFile, UILanguageFile);
- strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
- break;
- case OpKmtRcv:
- get_lang_msg("FILEDLG_TRANS_TITLE_KMTRCV", uimsg, sizeof(uimsg), TitKmtRcv, UILanguageFile);
- strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
- break;
- case OpKmtGet:
- get_lang_msg("FILEDLG_TRANS_TITLE_KMTGET", uimsg, sizeof(uimsg), TitKmtGet, UILanguageFile);
- strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
- break;
- case OpKmtSend:
- get_lang_msg("FILEDLG_TRANS_TITLE_KMTSEND", uimsg, sizeof(uimsg), TitKmtSend, UILanguageFile);
- strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
- break;
- case OpKmtFin:
- get_lang_msg("FILEDLG_TRANS_TITLE_KMTFIN", uimsg, sizeof(uimsg), TitKmtFin, UILanguageFile);
- strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
- break;
- case OpXRcv:
- get_lang_msg("FILEDLG_TRANS_TITLE_XRCV", uimsg, sizeof(uimsg), TitXRcv, UILanguageFile);
- strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
- break;
- case OpXSend:
- get_lang_msg("FILEDLG_TRANS_TITLE_XSEND", uimsg, sizeof(uimsg), TitXSend, UILanguageFile);
- strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
- break;
- case OpYRcv:
- get_lang_msg("FILEDLG_TRANS_TITLE_YRCV", uimsg, sizeof(uimsg), TitYRcv, UILanguageFile);
- strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
- break;
- case OpYSend:
- get_lang_msg("FILEDLG_TRANS_TITLE_YSEND", uimsg, sizeof(uimsg), TitYSend, UILanguageFile);
- strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
- break;
- case OpZRcv:
- get_lang_msg("FILEDLG_TRANS_TITLE_ZRCV", uimsg, sizeof(uimsg), TitZRcv, UILanguageFile);
- strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
- break;
- case OpZSend:
- get_lang_msg("FILEDLG_TRANS_TITLE_ZSEND", uimsg, sizeof(uimsg), TitZSend, UILanguageFile);
- strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
- break;
- case OpBPRcv:
- get_lang_msg("FILEDLG_TRANS_TITLE_BPRCV", uimsg, sizeof(uimsg), TitBPRcv, UILanguageFile);
- strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
- break;
- case OpBPSend:
- get_lang_msg("FILEDLG_TRANS_TITLE_BPSEND", uimsg, sizeof(uimsg), TitBPSend, UILanguageFile);
- strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
- break;
- case OpQVRcv:
- get_lang_msg("FILEDLG_TRANS_TITLE_QVRCV", uimsg, sizeof(uimsg), TitQVRcv, UILanguageFile);
- strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
- break;
- case OpQVSend:
- get_lang_msg("FILEDLG_TRANS_TITLE_QVSEND", uimsg, sizeof(uimsg), TitQVSend, UILanguageFile);
- strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
- break;
- }
-}
-
-/* Hook function for XMODEM file name dialog box */
-BOOL CALLBACK XFnHook(HWND Dialog, UINT Message, WPARAM wParam, LPARAM lParam)
-{
- LPOPENFILENAME ofn;
- WORD Hi, Lo;
- LPLONG pl;
- LPOFNOTIFY notify;
- char uimsg[MAX_UIMSG], uimsg2[MAX_UIMSG];
- LOGFONT logfont;
- HFONT font;
-
- switch (Message) {
- case WM_INITDIALOG:
- ofn = (LPOPENFILENAME)lParam;
- pl = (LPLONG)ofn->lCustData;
- SetWindowLong(Dialog, DWL_USER, (LONG)pl);
-
- font = (HFONT)SendMessage(Dialog, WM_GETFONT, 0, 0);
- GetObject(font, sizeof(LOGFONT), &logfont);
- if (get_lang_font("DLG_TAHOMA_FONT", Dialog, &logfont, &DlgFoptFont, UILanguageFile)) {
- SendDlgItemMessage(Dialog, IDC_XOPT, WM_SETFONT, (WPARAM)DlgFoptFont, MAKELPARAM(TRUE,0));
- SendDlgItemMessage(Dialog, IDC_XOPTCHECK, WM_SETFONT, (WPARAM)DlgFoptFont, MAKELPARAM(TRUE,0));
- SendDlgItemMessage(Dialog, IDC_XOPTCRC, WM_SETFONT, (WPARAM)DlgFoptFont, MAKELPARAM(TRUE,0));
- SendDlgItemMessage(Dialog, IDC_XOPT1K, WM_SETFONT, (WPARAM)DlgFoptFont, MAKELPARAM(TRUE,0));
- SendDlgItemMessage(Dialog, IDC_XOPTBIN, WM_SETFONT, (WPARAM)DlgFoptFont, MAKELPARAM(TRUE,0));
- }
- else {
- DlgFoptFont = NULL;
- }
-
- GetDlgItemText(Dialog, IDC_XOPT, uimsg2, sizeof(uimsg2));
- get_lang_msg("DLG_XOPT", uimsg, sizeof(uimsg), uimsg2, UILanguageFile);
- SetDlgItemText(Dialog, IDC_XOPT, uimsg);
- GetDlgItemText(Dialog, IDC_XOPTCHECK, uimsg2, sizeof(uimsg2));
- get_lang_msg("DLG_XOPT_CHECKSUM", uimsg, sizeof(uimsg), uimsg2, UILanguageFile);
- SetDlgItemText(Dialog, IDC_XOPTCHECK, uimsg);
- GetDlgItemText(Dialog, IDC_XOPTCRC, uimsg2, sizeof(uimsg2));
- get_lang_msg("DLG_XOPT_CRC", uimsg, sizeof(uimsg), uimsg2, UILanguageFile);
- SetDlgItemText(Dialog, IDC_XOPTCRC, uimsg);
- GetDlgItemText(Dialog, IDC_XOPT1K, uimsg2, sizeof(uimsg2));
- get_lang_msg("DLG_XOPT_1K", uimsg, sizeof(uimsg), uimsg2, UILanguageFile);
- SetDlgItemText(Dialog, IDC_XOPT1K, uimsg);
- GetDlgItemText(Dialog, IDC_XOPTBIN, uimsg2, sizeof(uimsg2));
- get_lang_msg("DLG_XOPT_BINARY", uimsg, sizeof(uimsg), uimsg2, UILanguageFile);
- SetDlgItemText(Dialog, IDC_XOPTBIN, uimsg);
-
- SetRB(Dialog,HIWORD(*pl),IDC_XOPTCHECK,IDC_XOPT1K);
- if (LOWORD(*pl)!=0xFFFF)
- {
- ShowDlgItem(Dialog,IDC_XOPTBIN,IDC_XOPTBIN);
- SetRB(Dialog,LOWORD(*pl),IDC_XOPTBIN,IDC_XOPTBIN);
- }
- return TRUE;
- case WM_COMMAND: // for old style dialog
- switch (LOWORD(wParam)) {
- case IDOK:
- pl = (LPLONG)GetWindowLong(Dialog,DWL_USER);
- if (pl!=NULL)
- {
- GetRB(Dialog,&Hi,IDC_XOPTCHECK,IDC_XOPT1K);
- if (LOWORD(*pl)==0xFFFF)
- Lo = 0xFFFF;
- else
- GetRB(Dialog,&Lo,IDC_XOPTBIN,IDC_XOPTBIN);
- *pl = MAKELONG(Lo,Hi);
- }
- break;
- case IDCANCEL:
- break;
- }
- break;
- case WM_NOTIFY: // for Explorer-style dialog
- notify = (LPOFNOTIFY)lParam;
- switch (notify->hdr.code) {
- case CDN_FILEOK:
- pl = (LPLONG)GetWindowLong(Dialog,DWL_USER);
- if (pl!=NULL)
- {
- GetRB(Dialog,&Hi,IDC_XOPTCHECK,IDC_XOPT1K);
- if (LOWORD(*pl)==0xFFFF)
- Lo = 0xFFFF;
- else
- GetRB(Dialog,&Lo,IDC_XOPTBIN,IDC_XOPTBIN);
- *pl = MAKELONG(Lo,Hi);
- }
- if (DlgXoptFont != NULL) {
- DeleteObject(DlgXoptFont);
- }
- break;
- }
- break;
- }
- return FALSE;
-}
-
-BOOL FAR PASCAL GetXFname
- (HWND HWin, BOOL Receive, LPLONG Option, PFileVar fv, PCHAR CurDir)
-{
- char uimsg[MAX_UIMSG];
- char FNFilter[sizeof(FileSendFilter)*2+128], *pf;
- OPENFILENAME ofn;
- LONG opt;
- char TempDir[MAXPATHLEN];
- BOOL Ok;
-
- memset(FNFilter, 0, sizeof(FNFilter)); /* Set up for double null at end */
-
- /* save current dir */
- _getcwd(TempDir,sizeof(TempDir));
-
- fv->FullName[0] = 0;
- memset(FNFilter, 0, sizeof(FNFilter)); /* Set up for double null at end */
- memset(&ofn, 0, sizeof(OPENFILENAME));
-
- strncpy_s(fv->DlgCaption, sizeof(fv->DlgCaption),"Tera Term: ", _TRUNCATE);
- pf = FNFilter;
- if (Receive)
- {
- get_lang_msg("FILEDLG_TRANS_TITLE_XRCV", uimsg, sizeof(uimsg), TitXRcv, UILanguageFile);
- strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
- }
- else
- {
- get_lang_msg("FILEDLG_TRANS_TITLE_XSEND", uimsg, sizeof(uimsg), TitXSend, UILanguageFile);
- strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
- if (strlen(FileSendFilter) > 0) {
- get_lang_msg("FILEDLG_USER_FILTER_NAME", uimsg, sizeof(uimsg), "User define", UILanguageFile);
- _snprintf_s(FNFilter, sizeof(FNFilter), _TRUNCATE, "%s(%s)", uimsg, FileSendFilter);
- pf = pf + strlen(FNFilter) + 1;
- strncpy_s(pf, sizeof(FNFilter)-(pf - FNFilter) ,FileSendFilter, _TRUNCATE);
- pf = pf + strlen(pf) + 1;
-
- // ??????????????????????????????- // ?????????????????????? (2008.5.18 maya)
- if (!isInvalidFileNameChar(FileSendFilter)) {
- char file[MAX_PATH];
- strncpy_s(file, sizeof(file), CurDir, _TRUNCATE);
- AppendSlash(file, sizeof(file));
- strncat_s(file, sizeof(file), FileSendFilter, _TRUNCATE);
- if (_access(file, 0) == 0) {
- strncpy_s(fv->FullName, sizeof(fv->FullName), FileSendFilter, _TRUNCATE);
- }
- }
- }
- }
-
- get_lang_msg("FILEDLG_ALL_FILTER", uimsg, sizeof(uimsg), "All(*.*)\\0*.*\\0\\0", UILanguageFile);
- // \0\0 ????K?????? 2 ???
- memcpy(pf, uimsg, sizeof(FNFilter) - (pf - FNFilter + 2));
-
- ofn.lStructSize = sizeof(OPENFILENAME);
- ofn.hwndOwner = HWin;
- ofn.lpstrFilter = FNFilter;
- ofn.nFilterIndex = 1;
- ofn.lpstrFile = fv->FullName;
- ofn.nMaxFile = sizeof(fv->FullName);
- ofn.lpstrInitialDir = CurDir;
- ofn.Flags = OFN_SHOWHELP | OFN_HIDEREADONLY |
- OFN_ENABLETEMPLATE | OFN_ENABLEHOOK;
- opt = *Option;
- if (! Receive)
- {
- ofn.Flags = ofn.Flags | OFN_FILEMUSTEXIST;
- opt = opt | 0xFFFF;
- }
- ofn.lCustData = (DWORD)&opt;
-
- ofn.lpstrTitle = fv->DlgCaption;
- ofn.lpfnHook = (LPOFNHOOKPROC)(&XFnHook);
- ofn.Flags = ofn.Flags | OFN_EXPLORER;
- ofn.lpTemplateName = MAKEINTRESOURCE(IDD_XOPT);
- ofn.hInstance = hInst;
-
- Ok = GetOpenFileName(&ofn);
-
- if (Ok)
- {
- fv->DirLen = ofn.nFileOffset;
- fv->FnPtr = ofn.nFileOffset;
- memcpy(CurDir,fv->FullName,fv->DirLen-1);
- CurDir[fv->DirLen-1] = 0;
-
- if (Receive)
- *Option = opt;
- else
- *Option = MAKELONG(LOWORD(*Option),HIWORD(opt));
- }
-
- /* restore dir */
- _chdir(TempDir);
-
- return Ok;
-}
-
-void FAR PASCAL ProtoInit(int Proto, PFileVar fv, PCHAR pv, PComVar cv, PTTSet ts)
-{
- switch (Proto) {
- case PROTO_KMT:
- KmtInit(fv,(PKmtVar)pv,cv,ts);
- break;
- case PROTO_XM:
- XInit(fv,(PXVar)pv,cv,ts);
- break;
- case PROTO_YM:
- YInit(fv,(PYVar)pv,cv,ts);
- break;
- case PROTO_ZM:
- ZInit(fv,(PZVar)pv,cv,ts);
- break;
- case PROTO_BP:
- BPInit(fv,(PBPVar)pv,cv,ts);
- break;
- case PROTO_QV:
- QVInit(fv,(PQVVar)pv,cv,ts);
- break;
- }
-}
-
-BOOL FAR PASCAL ProtoParse
- (int Proto, PFileVar fv, PCHAR pv, PComVar cv)
-{
- BOOL Ok;
-
- Ok = FALSE;
- switch (Proto) {
- case PROTO_KMT:
- Ok = KmtReadPacket(fv,(PKmtVar)pv,cv);
- break;
- case PROTO_XM:
- switch (((PXVar)pv)->XMode) {
- case IdXReceive:
- Ok = XReadPacket(fv,(PXVar)pv,cv);
- break;
- case IdXSend:
- Ok = XSendPacket(fv,(PXVar)pv,cv);
- break;
- }
- break;
- case PROTO_YM:
- switch (((PYVar)pv)->YMode) {
- case IdYReceive:
- Ok = YReadPacket(fv,(PYVar)pv,cv);
- break;
- case IdYSend:
- Ok = YSendPacket(fv,(PYVar)pv,cv);
- break;
- }
- break;
- case PROTO_ZM:
- Ok = ZParse(fv,(PZVar)pv,cv);
- break;
- case PROTO_BP:
- Ok = BPParse(fv,(PBPVar)pv,cv);
- break;
- case PROTO_QV:
- switch (((PQVVar)pv)->QVMode) {
- case IdQVReceive:
- Ok = QVReadPacket(fv,(PQVVar)pv,cv);
- break;
- case IdQVSend:
- Ok = QVSendPacket(fv,(PQVVar)pv,cv);
- break;
- }
- break;
- }
- return Ok;
-}
-
-void FAR PASCAL ProtoTimeOutProc
- (int Proto, PFileVar fv, PCHAR pv, PComVar cv)
-{
- switch (Proto) {
- case PROTO_KMT:
- KmtTimeOutProc(fv,(PKmtVar)pv,cv);
- break;
- case PROTO_XM:
- XTimeOutProc(fv,(PXVar)pv,cv);
- break;
- case PROTO_YM:
- YTimeOutProc(fv,(PYVar)pv,cv);
- break;
- case PROTO_ZM:
- ZTimeOutProc(fv,(PZVar)pv,cv);
- break;
- case PROTO_BP:
- BPTimeOutProc(fv,(PBPVar)pv,cv);
- break;
- case PROTO_QV:
- QVTimeOutProc(fv,(PQVVar)pv,cv);
- break;
- }
-}
-
-BOOL FAR PASCAL ProtoCancel
- (int Proto, PFileVar fv, PCHAR pv, PComVar cv)
-{
- switch (Proto) {
- case PROTO_KMT:
- KmtCancel(fv,(PKmtVar)pv,cv);
- break;
- case PROTO_XM:
- if (((PXVar)pv)->XMode==IdXReceive)
- XCancel(fv,(PXVar)pv,cv);
- break;
- case PROTO_ZM:
- ZCancel((PZVar)pv);
- break;
- case PROTO_BP:
- if (((PBPVar)pv)->BPState != BP_Failure)
- {
- BPCancel((PBPVar)pv);
- return FALSE;
- }
- break;
- case PROTO_QV:
- QVCancel(fv,(PQVVar)pv,cv);
- break;
- }
- return TRUE;
-}
-
-void FAR PASCAL TTFILESetUILanguageFile(char *file)
-{
- strncpy_s(UILanguageFile, sizeof(UILanguageFile), file, _TRUNCATE);
-}
-
-void FAR PASCAL TTFILESetFileSendFilter(char *file)
-{
- strncpy_s(FileSendFilter, sizeof(FileSendFilter), file, _TRUNCATE);
-}
-
-BOOL WINAPI DllMain(HANDLE hInstance,
- ULONG ul_reason_for_call,
- LPVOID lpReserved)
-{
-// PMap pm;
-// HANDLE HMap = NULL;
-
- hInst = hInstance;
- switch( ul_reason_for_call ) {
- case DLL_THREAD_ATTACH:
- /* do thread initialization */
- break;
- case DLL_THREAD_DETACH:
- /* do thread cleanup */
- break;
- case DLL_PROCESS_ATTACH:
- /* do process initialization */
-// HMap = CreateFileMapping((HANDLE) 0xFFFFFFFF, NULL, PAGE_READONLY,
-// 0, sizeof(TMap), TT_FILEMAPNAME);
-// if (HMap != NULL) {
-// pm = (PMap)MapViewOfFile(HMap,FILE_MAP_READ,0,0,0);
-// if (pm != NULL) {
-// strncpy_s(UILanguageFile, sizeof(UILanguageFile), pm->ts.UILanguageFile, _TRUNCATE);
-// strncpy_s(FileSendFilter, sizeof(FileSendFilter), pm->ts.FileSendFilter, _TRUNCATE);
-// }
-// }
- DoCover_IsDebuggerPresent();
- break;
- case DLL_PROCESS_DETACH:
- /* do process cleanup */
- break;
- }
- return TRUE;
-}
+/* Tera Term
+ Copyright(C) 1994-1998 T. Teranishi
+ All rights reserved. */
+
+/* TTFILE.DLL, file transfer, VT window printing */
+#include "teraterm.h"
+#include "tttypes.h"
+#include "ttftypes.h"
+#include
+#include
+#include
+
+#include "ttlib.h"
+#include "ftlib.h"
+#include "dlglib.h"
+#include "kermit.h"
+#include "xmodem.h"
+#include "ymodem.h"
+#include "zmodem.h"
+#include "bplus.h"
+#include "quickvan.h"
+// resource IDs
+#include "file_res.h"
+
+#include
+#include
+#include
+
+#include "compat_w95.h"
+
+static HANDLE hInst;
+
+static HFONT DlgFoptFont;
+static HFONT DlgXoptFont;
+static HFONT DlgGetfnFont;
+
+char UILanguageFile[MAX_PATH];
+char FileSendFilter[128];
+
+BOOL FAR PASCAL GetSetupFname(HWND HWin, WORD FuncId, PTTSet ts)
+{
+ int i, j;
+ OPENFILENAME ofn;
+ char uimsg[MAX_UIMSG];
+
+ // char FNameFilter[HostNameMaxLength + 1]; // 81(yutaka)
+ char FNameFilter[81]; // 81(yutaka)
+ char TempDir[MAXPATHLEN];
+ char Dir[MAXPATHLEN];
+ char Name[MAXPATHLEN];
+ BOOL Ok;
+
+ /* save current dir */
+ _getcwd(TempDir,sizeof(TempDir));
+
+ /* File name filter */
+ memset(FNameFilter, 0, sizeof(FNameFilter));
+ if (FuncId==GSF_LOADKEY)
+ {
+ get_lang_msg("FILEDLG_KEYBOARD_FILTER", uimsg, sizeof(uimsg), "keyboard setup files (*.cnf)\\0*.cnf\\0\\0", UILanguageFile);
+ memcpy(FNameFilter, uimsg, sizeof(FNameFilter));
+ }
+ else {
+ get_lang_msg("FILEDLG_SETUP_FILTER", uimsg, sizeof(uimsg), "setup files (*.ini)\\0*.ini\\0\\0", UILanguageFile);
+ memcpy(FNameFilter, uimsg, sizeof(FNameFilter));
+ }
+
+ /* OPENFILENAME record */
+ memset(&ofn, 0, sizeof(OPENFILENAME));
+
+ ofn.lStructSize = sizeof(OPENFILENAME);
+ ofn.hwndOwner = HWin;
+ ofn.lpstrFile = Name;
+ ofn.nMaxFile = sizeof(Name);
+ ofn.lpstrFilter = FNameFilter;
+ ofn.nFilterIndex = 1;
+ ofn.hInstance = hInst;
+
+ if (FuncId==GSF_LOADKEY)
+ {
+ ofn.lpstrDefExt = "cnf";
+ GetFileNamePos(ts->KeyCnfFN,&i,&j);
+ strncpy_s(Name, sizeof(Name),&(ts->KeyCnfFN[j]), _TRUNCATE);
+ memcpy(Dir,ts->KeyCnfFN,i);
+ Dir[i] = 0;
+
+ if ((strlen(Name)==0) || (_stricmp(Name,"KEYBOARD.CNF")==0))
+ strncpy_s(Name, sizeof(Name),"KEYBOARD.CNF", _TRUNCATE);
+ }
+ else {
+ ofn.lpstrDefExt = "ini";
+ GetFileNamePos(ts->SetupFName,&i,&j);
+ strncpy_s(Name, sizeof(Name),&(ts->SetupFName[j]), _TRUNCATE);
+ memcpy(Dir,ts->SetupFName,i);
+ Dir[i] = 0;
+
+ if ((strlen(Name)==0) || (_stricmp(Name,"TERATERM.INI")==0))
+ strncpy_s(Name, sizeof(Name),"TERATERM.INI", _TRUNCATE);
+ }
+
+ if (strlen(Dir)==0)
+ strncpy_s(Dir, sizeof(Dir),ts->HomeDir, _TRUNCATE);
+
+ _chdir(Dir);
+
+ ofn.Flags = OFN_SHOWHELP | OFN_HIDEREADONLY;
+ switch (FuncId) {
+ case GSF_SAVE:
+ // ??t???????????????????????????(2005.1.6 yutaka)
+ // ??????teraterm.ini???????????????
+ // ??????/F= ????????????????????(2005.1.26 yutaka)
+ // Windows Vista ?????????????? NULL ??????????????
+ // ?????????????????????????????(2006.9.16 maya)
+// ofn.lpstrInitialDir = __argv[0];
+// ofn.lpstrInitialDir = ts->SetupFName;
+ ofn.lpstrInitialDir = Dir;
+ get_lang_msg("FILEDLG_SAVE_SETUP_TITLE", uimsg, sizeof(uimsg), "Tera Term: Save setup", UILanguageFile);
+ ofn.lpstrTitle = uimsg;
+ Ok = GetSaveFileName(&ofn);
+ if (Ok)
+ strncpy_s(ts->SetupFName, sizeof(ts->SetupFName),Name, _TRUNCATE);
+ break;
+ case GSF_RESTORE:
+ ofn.Flags = ofn.Flags | OFN_FILEMUSTEXIST;
+ get_lang_msg("FILEDLG_RESTORE_SETUP_TITLE", uimsg, sizeof(uimsg), "Tera Term: Restore setup", UILanguageFile);
+ ofn.lpstrTitle = uimsg;
+ Ok = GetOpenFileName(&ofn);
+ if (Ok)
+ strncpy_s(ts->SetupFName, sizeof(ts->SetupFName),Name, _TRUNCATE);
+ break;
+ case GSF_LOADKEY:
+ ofn.Flags = ofn.Flags | OFN_FILEMUSTEXIST;
+ get_lang_msg("FILEDLG_LOAD_KEYMAP_TITLE", uimsg, sizeof(uimsg), "Tera Term: Load key map", UILanguageFile);
+ ofn.lpstrTitle = uimsg;
+ Ok = GetOpenFileName(&ofn);
+ if (Ok)
+ strncpy_s(ts->KeyCnfFN, sizeof(ts->KeyCnfFN),Name, _TRUNCATE);
+ break;
+ }
+
+ /* restore dir */
+ _chdir(TempDir);
+
+ return Ok;
+}
+
+/* Hook function for file name dialog box */
+BOOL CALLBACK TFnHook(HWND Dialog, UINT Message, WPARAM wParam, LPARAM lParam)
+{
+ LPOPENFILENAME ofn;
+ WORD Lo, Hi;
+ LPLONG pl;
+ LPOFNOTIFY notify;
+ char uimsg[MAX_UIMSG], uimsg2[MAX_UIMSG];
+ LOGFONT logfont;
+ HFONT font;
+
+ switch (Message) {
+ case WM_INITDIALOG:
+ ofn = (LPOPENFILENAME)lParam;
+ pl = (LPLONG)(ofn->lCustData);
+ SetWindowLong(Dialog, DWL_USER, (LONG)pl);
+
+ font = (HFONT)SendMessage(Dialog, WM_GETFONT, 0, 0);
+ GetObject(font, sizeof(LOGFONT), &logfont);
+ if (get_lang_font("DLG_TAHOMA_FONT", Dialog, &logfont, &DlgFoptFont, UILanguageFile)) {
+ SendDlgItemMessage(Dialog, IDC_FOPT, WM_SETFONT, (WPARAM)DlgFoptFont, MAKELPARAM(TRUE,0));
+ SendDlgItemMessage(Dialog, IDC_FOPTBIN, WM_SETFONT, (WPARAM)DlgFoptFont, MAKELPARAM(TRUE,0));
+ SendDlgItemMessage(Dialog, IDC_FOPTAPPEND, WM_SETFONT, (WPARAM)DlgFoptFont, MAKELPARAM(TRUE,0));
+ SendDlgItemMessage(Dialog, IDC_PLAINTEXT, WM_SETFONT, (WPARAM)DlgFoptFont, MAKELPARAM(TRUE,0));
+ SendDlgItemMessage(Dialog, IDC_TIMESTAMP, WM_SETFONT, (WPARAM)DlgFoptFont, MAKELPARAM(TRUE,0));
+ SendDlgItemMessage(Dialog, IDC_HIDEDIALOG, WM_SETFONT, (WPARAM)DlgFoptFont, MAKELPARAM(TRUE,0));
+ }
+ else {
+ DlgFoptFont = NULL;
+ }
+
+ GetDlgItemText(Dialog, IDC_FOPT, uimsg2, sizeof(uimsg2));
+ get_lang_msg("DLG_FOPT", uimsg, sizeof(uimsg), uimsg2, UILanguageFile);
+ SetDlgItemText(Dialog, IDC_FOPT, uimsg);
+ GetDlgItemText(Dialog, IDC_FOPTBIN, uimsg2, sizeof(uimsg2));
+ get_lang_msg("DLG_FOPT_BINARY", uimsg, sizeof(uimsg), uimsg2, UILanguageFile);
+ SetDlgItemText(Dialog, IDC_FOPTBIN, uimsg);
+ GetDlgItemText(Dialog, IDC_FOPTAPPEND, uimsg2, sizeof(uimsg2));
+ get_lang_msg("DLG_FOPT_APPEND", uimsg, sizeof(uimsg), uimsg2, UILanguageFile);
+ SetDlgItemText(Dialog, IDC_FOPTAPPEND, uimsg);
+ GetDlgItemText(Dialog, IDC_PLAINTEXT, uimsg2, sizeof(uimsg2));
+ get_lang_msg("DLG_FOPT_PLAIN", uimsg, sizeof(uimsg), uimsg2, UILanguageFile);
+ SetDlgItemText(Dialog, IDC_PLAINTEXT, uimsg);
+ GetDlgItemText(Dialog, IDC_TIMESTAMP, uimsg2, sizeof(uimsg2));
+ get_lang_msg("DLG_FOPT_TIMESTAMP", uimsg, sizeof(uimsg), uimsg2, UILanguageFile);
+ SetDlgItemText(Dialog, IDC_TIMESTAMP, uimsg);
+ GetDlgItemText(Dialog, IDC_HIDEDIALOG, uimsg2, sizeof(uimsg2));
+ get_lang_msg("DLG_FOPT_HIDEDIALOG", uimsg, sizeof(uimsg), uimsg2, UILanguageFile);
+ SetDlgItemText(Dialog, IDC_HIDEDIALOG, uimsg);
+
+ Lo = LOWORD(*pl) & 1;
+ Hi = HIWORD(*pl);
+ SetRB(Dialog,Lo,IDC_FOPTBIN,IDC_FOPTBIN);
+ if (Hi!=0xFFFF)
+ {
+ ShowDlgItem(Dialog,IDC_FOPTAPPEND,IDC_FOPTAPPEND);
+ SetRB(Dialog,Hi & 1,IDC_FOPTAPPEND,IDC_FOPTAPPEND);
+
+ // plain text???????????????ON (2005.2.20 yutaka)
+ ShowDlgItem(Dialog,IDC_PLAINTEXT,IDC_PLAINTEXT);
+ if (Lo) {
+ // Binary??????????????????
+ DisableDlgItem(Dialog,IDC_PLAINTEXT,IDC_PLAINTEXT);
+ }
+ else if (Hi & 0x1000) {
+ SetRB(Dialog,1,IDC_PLAINTEXT,IDC_PLAINTEXT);
+ }
+
+ // timestamp???????? (2006.7.23 maya)
+ ShowDlgItem(Dialog,IDC_TIMESTAMP,IDC_TIMESTAMP);
+ if (Lo) {
+ // Binary??????????????????
+ DisableDlgItem(Dialog,IDC_TIMESTAMP,IDC_TIMESTAMP);
+ }
+ else if (Hi & 0x2000) {
+ SetRB(Dialog,1,IDC_TIMESTAMP,IDC_TIMESTAMP);
+ }
+
+ // Hide dialog???????? (2008.1.30 maya)
+ ShowDlgItem(Dialog,IDC_HIDEDIALOG,IDC_HIDEDIALOG);
+ if (Hi & 0x4000) {
+ SetRB(Dialog,1,IDC_HIDEDIALOG,IDC_HIDEDIALOG);
+ }
+ }
+ return TRUE;
+
+ case WM_COMMAND: // for old style dialog
+ switch (LOWORD(wParam)) {
+ case IDOK:
+ pl = (LPLONG)GetWindowLong(Dialog,DWL_USER);
+ if (pl!=NULL)
+ {
+ GetRB(Dialog,&Lo,IDC_FOPTBIN,IDC_FOPTBIN);
+ Hi = HIWORD(*pl);
+ if (Hi!=0xFFFF)
+ GetRB(Dialog,&Hi,IDC_FOPTAPPEND,IDC_FOPTAPPEND);
+ *pl = MAKELONG(Lo,Hi);
+ }
+ break;
+ case IDCANCEL:
+ break;
+ case IDC_FOPTBIN:
+ GetRB(Dialog,&Lo,IDC_FOPTBIN,IDC_FOPTBIN);
+ if (Lo) {
+ DisableDlgItem(Dialog,IDC_PLAINTEXT,IDC_TIMESTAMP);
+ }
+ else {
+ EnableDlgItem(Dialog,IDC_PLAINTEXT,IDC_TIMESTAMP);
+ }
+ break;
+ }
+ break;
+ case WM_NOTIFY: // for Explorer-style dialog
+ notify = (LPOFNOTIFY)lParam;
+ switch (notify->hdr.code) {
+ case CDN_FILEOK:
+ pl = (LPLONG)GetWindowLong(Dialog,DWL_USER);
+ if (pl!=NULL)
+ {
+ WORD val = 0;
+
+ GetRB(Dialog,&Lo,IDC_FOPTBIN,IDC_FOPTBIN);
+ Hi = HIWORD(*pl);
+ if (Hi!=0xFFFF)
+ GetRB(Dialog,&Hi,IDC_FOPTAPPEND,IDC_FOPTAPPEND);
+
+ if (!Lo) {
+ // plain text check-box
+ GetRB(Dialog,&val,IDC_PLAINTEXT,IDC_PLAINTEXT);
+ if (val > 0) { // checked
+ Hi |= 0x1000;
+ }
+
+ // timestamp???????? (2006.7.23 maya)
+ GetRB(Dialog,&val,IDC_TIMESTAMP,IDC_TIMESTAMP);
+ if (val > 0) {
+ Hi |= 0x2000;
+ }
+ }
+
+ // Hide dialog???????? (2008.1.30 maya)
+ GetRB(Dialog,&val,IDC_HIDEDIALOG,IDC_HIDEDIALOG);
+ if (val > 0) {
+ Hi |= 0x4000;
+ }
+
+ *pl = MAKELONG(Lo,Hi);
+ }
+ if (DlgFoptFont != NULL) {
+ DeleteObject(DlgFoptFont);
+ }
+ break;
+ }
+ break;
+ }
+ return FALSE;
+}
+
+BOOL FAR PASCAL GetTransFname
+ (PFileVar fv, PCHAR CurDir, WORD FuncId, LPLONG Option)
+{
+ char uimsg[MAX_UIMSG];
+ char FNFilter[sizeof(FileSendFilter)*3], *pf;
+ OPENFILENAME ofn;
+ LONG opt;
+ char TempDir[MAXPATHLEN];
+ BOOL Ok;
+ char FileName[MAX_PATH];
+
+ /* save current dir */
+ _getcwd(TempDir,sizeof(TempDir));
+
+ memset(FNFilter, 0, sizeof(FNFilter)); /* Set up for double null at end */
+ memset(&ofn, 0, sizeof(OPENFILENAME));
+
+ strncpy_s(fv->DlgCaption, sizeof(fv->DlgCaption),"Tera Term: ", _TRUNCATE);
+ pf = FNFilter;
+ switch (FuncId) {
+ case GTF_SEND:
+ get_lang_msg("FILEDLG_TRANS_TITLE_SENDFILE", uimsg, sizeof(uimsg), TitSendFile, UILanguageFile);
+ strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
+ if (strlen(FileSendFilter) > 0) {
+ get_lang_msg("FILEDLG_USER_FILTER_NAME", uimsg, sizeof(uimsg), "User define", UILanguageFile);
+ _snprintf_s(FNFilter, sizeof(FNFilter), _TRUNCATE, "%s(%s)", uimsg, FileSendFilter);
+ pf = pf + strlen(FNFilter) + 1;
+ strncpy_s(pf, sizeof(FNFilter)-(pf - FNFilter) ,FileSendFilter, _TRUNCATE);
+ pf = pf + strlen(pf) + 1;
+ }
+ break;
+ case GTF_LOG:
+ get_lang_msg("FILEDLG_TRANS_TITLE_LOG", uimsg, sizeof(uimsg), TitLog, UILanguageFile);
+ strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
+ break;
+ case GTF_BP:
+ get_lang_msg("FILEDLG_TRANS_TITLE_BPSEND", uimsg, sizeof(uimsg), TitBPSend, UILanguageFile);
+ strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
+ if (strlen(FileSendFilter) > 0) {
+ get_lang_msg("FILEDLG_USER_FILTER_NAME", uimsg, sizeof(uimsg), "User define", UILanguageFile);
+ _snprintf_s(FNFilter, sizeof(FNFilter), _TRUNCATE, "%s(%s)", uimsg, FileSendFilter);
+ pf = pf + strlen(FNFilter) + 1;
+ strncpy_s(pf, sizeof(FNFilter)-(pf - FNFilter) ,FileSendFilter, _TRUNCATE);
+ pf = pf + strlen(pf) + 1;
+ }
+ break;
+ default: return FALSE;
+ }
+
+ get_lang_msg("FILEDLG_ALL_FILTER", uimsg, sizeof(uimsg), "All(*.*)\\0*.*\\0\\0", UILanguageFile);
+ // \0\0 ????K?????? 2 ???
+ memcpy(pf, uimsg, sizeof(FNFilter) - (pf - FNFilter + 2));
+
+ ExtractFileName(fv->FullName, FileName ,sizeof(FileName));
+ strncpy_s(fv->FullName, sizeof(fv->FullName), FileName, _TRUNCATE);
+ ofn.lStructSize = sizeof(OPENFILENAME);
+ ofn.hwndOwner = fv->HMainWin;
+ ofn.lpstrFilter = FNFilter;
+ ofn.nFilterIndex = 1;
+ ofn.lpstrFile = fv->FullName;
+ ofn.nMaxFile = sizeof(fv->FullName);
+ if (FuncId == GTF_LOG) {
+ DWORD logdir = GetFileAttributes(fv->LogDefaultPath);
+ // ??????????t?????????????????(2007.8.24 yutaka)
+ if (logdir != -1 && logdir & FILE_ATTRIBUTE_DIRECTORY) {
+ // LogDefaultPath?????????????t???????(2007.11.30 maya)
+ ofn.lpstrInitialDir = fv->LogDefaultPath;
+ }
+ else {
+ ofn.lpstrInitialDir = NULL;
+ }
+ } else {
+ ofn.lpstrInitialDir = CurDir;
+ }
+ ofn.Flags = OFN_SHOWHELP | OFN_HIDEREADONLY;
+ if (FuncId!=GTF_BP)
+ {
+ ofn.Flags = ofn.Flags | OFN_ENABLETEMPLATE | OFN_ENABLEHOOK;
+ ofn.Flags = ofn.Flags | OFN_EXPLORER;
+ ofn.lpTemplateName = MAKEINTRESOURCE(IDD_FOPT);
+ ofn.lpfnHook = (LPOFNHOOKPROC)(&TFnHook);
+ }
+ opt = *Option;
+ if (FuncId!=GTF_LOG)
+ {
+ ofn.Flags = ofn.Flags | OFN_FILEMUSTEXIST;
+ opt = MAKELONG(LOWORD(*Option),0xFFFF);
+
+ // ??????????????????????????????+ // ?????????????????????? (2008.5.18 maya)
+ if (strlen(FileSendFilter) > 0 &&
+ !isInvalidFileNameChar(FileSendFilter)) {
+ char file[MAX_PATH];
+ strncpy_s(file, sizeof(file), CurDir, _TRUNCATE);
+ AppendSlash(file, sizeof(file));
+ strncat_s(file, sizeof(file), FileSendFilter, _TRUNCATE);
+ if (_access(file, 0) == 0) {
+ strncpy_s(fv->FullName, sizeof(fv->FullName), FileSendFilter, _TRUNCATE);
+ }
+ }
+ }
+ ofn.lCustData = (DWORD)&opt;
+ ofn.lpstrTitle = fv->DlgCaption;
+
+ ofn.hInstance = hInst;
+
+ // logging???A????????????????????? (2005.1.6 yutaka)
+ if (FuncId == GTF_LOG) {
+ // ?????????(log_YYYYMMDD_HHMMSS.txt)????? (2005.1.21 yutaka)
+ // ??????????? teraterm.log ??? (2005.2.22 yutaka)
+ // ??????????????????o????? (2006.8.28 maya)
+ Ok = GetSaveFileName(&ofn);
+ } else {
+ Ok = GetOpenFileName(&ofn);
+ }
+
+ if (Ok)
+ {
+ if (FuncId==GTF_LOG)
+ *Option = opt;
+ else
+ *Option = MAKELONG(LOWORD(opt),HIWORD(*Option));
+
+ fv->DirLen = ofn.nFileOffset;
+
+ if (CurDir!=NULL)
+ {
+ memcpy(CurDir,fv->FullName,fv->DirLen-1);
+ CurDir[fv->DirLen-1] = 0;
+ }
+ }
+ /* restore dir */
+ _chdir(TempDir);
+ return Ok;
+}
+
+BOOL CALLBACK TFn2Hook(HWND Dialog, UINT Message, WPARAM wParam, LPARAM lParam)
+{
+ LPOPENFILENAME ofn;
+ LPWORD pw;
+ LPOFNOTIFY notify;
+ char uimsg[MAX_UIMSG], uimsg2[MAX_UIMSG];
+ LOGFONT logfont;
+ HFONT font;
+
+ switch (Message) {
+ case WM_INITDIALOG:
+ ofn = (LPOPENFILENAME)lParam;
+ pw = (LPWORD)ofn->lCustData;
+ SetWindowLong(Dialog, DWL_USER, (LONG)pw);
+
+ font = (HFONT)SendMessage(Dialog, WM_GETFONT, 0, 0);
+ GetObject(font, sizeof(LOGFONT), &logfont);
+ if (get_lang_font("DLG_TAHOMA_FONT", Dialog, &logfont, &DlgFoptFont, UILanguageFile)) {
+ SendDlgItemMessage(Dialog, IDC_FOPT, WM_SETFONT, (WPARAM)DlgFoptFont, MAKELPARAM(TRUE,0));
+ SendDlgItemMessage(Dialog, IDC_FOPTBIN, WM_SETFONT, (WPARAM)DlgFoptFont, MAKELPARAM(TRUE,0));
+ SendDlgItemMessage(Dialog, IDC_FOPTAPPEND, WM_SETFONT, (WPARAM)DlgFoptFont, MAKELPARAM(TRUE,0));
+ SendDlgItemMessage(Dialog, IDC_PLAINTEXT, WM_SETFONT, (WPARAM)DlgFoptFont, MAKELPARAM(TRUE,0));
+ SendDlgItemMessage(Dialog, IDC_TIMESTAMP, WM_SETFONT, (WPARAM)DlgFoptFont, MAKELPARAM(TRUE,0));
+ }
+ else {
+ DlgFoptFont = NULL;
+ }
+
+ GetDlgItemText(Dialog, IDC_FOPT, uimsg2, sizeof(uimsg2));
+ get_lang_msg("DLG_FOPT", uimsg, sizeof(uimsg), uimsg2, UILanguageFile);
+ SetDlgItemText(Dialog, IDC_FOPT, uimsg);
+ GetDlgItemText(Dialog, IDC_FOPTBIN, uimsg2, sizeof(uimsg2));
+ get_lang_msg("DLG_FOPT_BINARY", uimsg, sizeof(uimsg), uimsg2, UILanguageFile);
+ SetDlgItemText(Dialog, IDC_FOPTBIN, uimsg);
+
+ SetRB(Dialog,*pw & 1,IDC_FOPTBIN,IDC_FOPTBIN);
+ return TRUE;
+ case WM_COMMAND: // for old style dialog
+ switch (LOWORD(wParam)) {
+ case IDOK:
+ pw = (LPWORD)GetWindowLong(Dialog,DWL_USER);
+ if (pw!=NULL)
+ GetRB(Dialog,pw,IDC_FOPTBIN,IDC_FOPTBIN);
+ break;
+ case IDCANCEL:
+ break;
+ }
+ break;
+ case WM_NOTIFY: // for Explorer-style dialog
+ notify = (LPOFNOTIFY)lParam;
+ switch (notify->hdr.code) {
+ case CDN_FILEOK:
+ pw = (LPWORD)GetWindowLong(Dialog,DWL_USER);
+ if (pw!=NULL)
+ GetRB(Dialog,pw,IDC_FOPTBIN,IDC_FOPTBIN);
+ if (DlgFoptFont != NULL) {
+ DeleteObject(DlgFoptFont);
+ }
+ break;
+ }
+ break;
+ }
+ return FALSE;
+}
+
+BOOL FAR PASCAL GetMultiFname
+ (PFileVar fv, PCHAR CurDir, WORD FuncId, LPWORD Option)
+{
+ int i, len;
+ char uimsg[MAX_UIMSG];
+ char FNFilter[sizeof(FileSendFilter)*2+128], *pf;
+ OPENFILENAME ofn;
+ char TempDir[MAXPATHLEN];
+ BOOL Ok;
+ char defaultFName[MAX_PATH];
+
+ memset(FNFilter, 0, sizeof(FNFilter)); /* Set up for double null at end */
+
+ /* save current dir */
+ _getcwd(TempDir,sizeof(TempDir));
+
+ fv->NumFname = 0;
+
+ strncpy_s(fv->DlgCaption, sizeof(fv->DlgCaption),"Tera Term: ", _TRUNCATE);
+ pf = FNFilter;
+ switch (FuncId) {
+ case GMF_KERMIT:
+ get_lang_msg("FILEDLG_TRANS_TITLE_KMTSEND", uimsg, sizeof(uimsg), TitKmtSend, UILanguageFile);
+ strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
+ break;
+ case GMF_Z:
+ get_lang_msg("FILEDLG_TRANS_TITLE_ZSEND", uimsg, sizeof(uimsg), TitZSend, UILanguageFile);
+ strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
+ break;
+ case GMF_QV:
+ get_lang_msg("FILEDLG_TRANS_TITLE_QVSEND", uimsg, sizeof(uimsg), TitQVSend, UILanguageFile);
+ strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
+ break;
+ case GMF_Y:
+ get_lang_msg("FILEDLG_TRANS_TITLE_YSEND", uimsg, sizeof(uimsg), TitYSend, UILanguageFile);
+ strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
+ break;
+ default:
+ return FALSE;
+ }
+ if (strlen(FileSendFilter) > 0) {
+ get_lang_msg("FILEDLG_USER_FILTER_NAME", uimsg, sizeof(uimsg), "User define", UILanguageFile);
+ _snprintf_s(FNFilter, sizeof(FNFilter), _TRUNCATE, "%s(%s)", uimsg, FileSendFilter);
+ pf = pf + strlen(FNFilter) + 1;
+ strncpy_s(pf, sizeof(FNFilter)-(pf - FNFilter) ,FileSendFilter, _TRUNCATE);
+ pf = pf + strlen(pf) + 1;
+ }
+
+ /* moemory should be zero-initialized */
+ fv->FnStrMemHandle = GlobalAlloc(GHND, FnStrMemSize);
+ if (fv->FnStrMemHandle == NULL)
+ {
+ MessageBeep(0);
+ return FALSE;
+ }
+ else {
+ fv->FnStrMem = GlobalLock(fv->FnStrMemHandle);
+ if (fv->FnStrMem == NULL)
+ {
+ GlobalFree(fv->FnStrMemHandle);
+ fv->FnStrMemHandle = 0;
+ MessageBeep(0);
+ return FALSE;
+ }
+ }
+
+ get_lang_msg("FILEDLG_ALL_FILTER", uimsg, sizeof(uimsg), "All(*.*)\\0*.*\\0\\0", UILanguageFile);
+ // \0\0 ????K?????? 2 ???
+ memcpy(pf, uimsg, sizeof(FNFilter) - (pf - FNFilter + 2));
+
+ memset(&ofn, 0, sizeof(OPENFILENAME));
+ ofn.lStructSize = sizeof(OPENFILENAME);
+ ofn.hwndOwner = fv->HMainWin;
+ ofn.lpstrFilter = FNFilter;
+ ofn.nFilterIndex = 1;
+ ofn.lpstrFile = fv->FnStrMem;
+ ofn.nMaxFile = FnStrMemSize;
+ ofn.lpstrTitle= fv->DlgCaption;
+ ofn.lpstrInitialDir = CurDir;
+ ofn.Flags = OFN_SHOWHELP | OFN_ALLOWMULTISELECT |
+ OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
+ ofn.Flags = ofn.Flags | OFN_EXPLORER;
+ ofn.lCustData = 0;
+ if (FuncId==GMF_Z)
+ {
+ ofn.Flags = ofn.Flags | OFN_ENABLETEMPLATE | OFN_ENABLEHOOK;
+ ofn.lCustData = (DWORD)Option;
+ ofn.lpfnHook = (LPOFNHOOKPROC)(&TFn2Hook);
+ ofn.lpTemplateName = MAKEINTRESOURCE(IDD_FOPT);
+ } else if (FuncId==GMF_Y) {
+ // TODO: YMODEM
+
+ }
+
+ ofn.hInstance = hInst;
+
+ // ??????????????????????????????+ // ?????????????????????? (2008.5.18 maya)
+ if (strlen(FileSendFilter) > 0 &&
+ !isInvalidFileNameChar(FileSendFilter)) {
+ char file[MAX_PATH];
+ strncpy_s(file, sizeof(file), CurDir, _TRUNCATE);
+ AppendSlash(file, sizeof(file));
+ strncat_s(file, sizeof(file), FileSendFilter, _TRUNCATE);
+ if (_access(file, 0) == 0) {
+ strncpy_s(defaultFName, sizeof(defaultFName), FileSendFilter, _TRUNCATE);
+ ofn.lpstrFile = defaultFName;
+ }
+ }
+
+ Ok = GetOpenFileName(&ofn);
+ if (Ok)
+ {
+ /* count number of file names */
+ len = strlen(fv->FnStrMem);
+ i = 0;
+ while (len>0)
+ {
+ i = i + len + 1;
+ fv->NumFname++;
+ len = strlen(&fv->FnStrMem[i]);
+ }
+
+ fv->NumFname--;
+
+ 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;
+ }
+
+ memcpy(CurDir,fv->FullName,fv->DirLen);
+ CurDir[fv->DirLen] = 0;
+ if ((fv->DirLen>3) &&
+ (CurDir[fv->DirLen-1]=='\\'))
+ CurDir[fv->DirLen-1] = 0;
+
+ fv->FNCount = 0;
+ }
+
+ GlobalUnlock(fv->FnStrMemHandle);
+ if (! Ok)
+ {
+ GlobalFree(fv->FnStrMemHandle);
+ fv->FnStrMemHandle = NULL;
+ }
+
+ /* restore dir */
+ _chdir(TempDir);
+
+ return Ok;
+}
+
+BOOL CALLBACK GetFnDlg
+ (HWND Dialog, UINT Message, WPARAM wParam, LPARAM lParam)
+{
+ PFileVar fv;
+ char TempFull[MAXPATHLEN];
+ int i, j;
+ char uimsg[MAX_UIMSG], uimsg2[MAX_UIMSG];
+ LOGFONT logfont;
+ HFONT font;
+
+ switch (Message) {
+ case WM_INITDIALOG:
+ fv = (PFileVar)lParam;
+ SetWindowLong(Dialog, DWL_USER, lParam);
+ SendDlgItemMessage(Dialog, IDC_GETFN, EM_LIMITTEXT, sizeof(TempFull)-1,0);
+
+ font = (HFONT)SendMessage(Dialog, WM_GETFONT, 0, 0);
+ GetObject(font, sizeof(LOGFONT), &logfont);
+ if (get_lang_font("DLG_SYSTEM_FONT", Dialog, &logfont, &DlgGetfnFont, UILanguageFile)) {
+ SendDlgItemMessage(Dialog, IDC_FILENAME, WM_SETFONT, (WPARAM)DlgGetfnFont, MAKELPARAM(TRUE,0));
+ SendDlgItemMessage(Dialog, IDC_GETFN, WM_SETFONT, (WPARAM)DlgGetfnFont, MAKELPARAM(TRUE,0));
+ SendDlgItemMessage(Dialog, IDOK, WM_SETFONT, (WPARAM)DlgGetfnFont, MAKELPARAM(TRUE,0));
+ SendDlgItemMessage(Dialog, IDCANCEL, WM_SETFONT, (WPARAM)DlgGetfnFont, MAKELPARAM(TRUE,0));
+ SendDlgItemMessage(Dialog, IDC_GETFNHELP, WM_SETFONT, (WPARAM)DlgGetfnFont, MAKELPARAM(TRUE,0));
+ }
+ else {
+ DlgGetfnFont = NULL;
+ }
+
+ GetWindowText(Dialog, uimsg2, sizeof(uimsg2));
+ get_lang_msg("DLG_GETFN_TITLE", uimsg, sizeof(uimsg), uimsg2, UILanguageFile);
+ SetWindowText(Dialog, uimsg);
+ GetDlgItemText(Dialog, IDC_FILENAME, uimsg2, sizeof(uimsg2));
+ get_lang_msg("DLG_GETFN_FILENAME", uimsg, sizeof(uimsg), uimsg2, UILanguageFile);
+ SetDlgItemText(Dialog, IDC_FILENAME, uimsg);
+ GetDlgItemText(Dialog, IDOK, uimsg2, sizeof(uimsg2));
+ get_lang_msg("BTN_OK", uimsg, sizeof(uimsg), uimsg2, UILanguageFile);
+ SetDlgItemText(Dialog, IDOK, uimsg);
+ GetDlgItemText(Dialog, IDCANCEL, uimsg2, sizeof(uimsg2));
+ get_lang_msg("BTN_CANCEL", uimsg, sizeof(uimsg), uimsg2, UILanguageFile);
+ SetDlgItemText(Dialog, IDCANCEL, uimsg);
+ GetDlgItemText(Dialog, IDC_GETFNHELP, uimsg2, sizeof(uimsg2));
+ get_lang_msg("BTN_HELP", uimsg, sizeof(uimsg), uimsg2, UILanguageFile);
+ SetDlgItemText(Dialog, IDC_GETFNHELP, uimsg);
+
+ return TRUE;
+
+ case WM_COMMAND:
+ fv = (PFileVar)GetWindowLong(Dialog,DWL_USER);
+ switch (LOWORD(wParam)) {
+ case IDOK:
+ if (fv!=NULL)
+ {
+ GetDlgItemText(Dialog, IDC_GETFN, TempFull, sizeof(TempFull));
+ if (strlen(TempFull)==0) return TRUE;
+ GetFileNamePos(TempFull,&i,&j);
+ FitFileName(&(TempFull[j]),sizeof(TempFull) - j, NULL);
+ strncat_s(fv->FullName,sizeof(fv->FullName),&(TempFull[j]),_TRUNCATE);
+ }
+ EndDialog(Dialog, 1);
+ if (DlgGetfnFont != NULL) {
+ DeleteObject(DlgGetfnFont);
+ }
+ return TRUE;
+ case IDCANCEL:
+ EndDialog(Dialog, 0);
+ if (DlgGetfnFont != NULL) {
+ DeleteObject(DlgGetfnFont);
+ }
+ return TRUE;
+ case IDC_GETFNHELP:
+ if (fv!=NULL)
+ PostMessage(fv->HMainWin,WM_USER_DLGHELP2,0,0);
+ break;
+ }
+ }
+ return FALSE;
+}
+
+BOOL FAR PASCAL GetGetFname(HWND HWin, PFileVar fv)
+{
+ return (BOOL)DialogBoxParam(hInst,
+ MAKEINTRESOURCE(IDD_GETFNDLG),
+ HWin, GetFnDlg, (LONG)fv);
+}
+
+void FAR PASCAL SetFileVar(PFileVar fv)
+{
+ int i;
+ char uimsg[MAX_UIMSG];
+
+ GetFileNamePos(fv->FullName,&(fv->DirLen),&i);
+ if (fv->FullName[fv->DirLen]=='\\') fv->DirLen++;
+ strncpy_s(fv->DlgCaption, sizeof(fv->DlgCaption),"Tera Term: ", _TRUNCATE);
+ switch (fv->OpId) {
+ case OpLog:
+ get_lang_msg("FILEDLG_TRANS_TITLE_LOG", uimsg, sizeof(uimsg), TitLog, UILanguageFile);
+ strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
+ break;
+ case OpSendFile:
+ get_lang_msg("FILEDLG_TRANS_TITLE_SENDFILE", uimsg, sizeof(uimsg), TitSendFile, UILanguageFile);
+ strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
+ break;
+ case OpKmtRcv:
+ get_lang_msg("FILEDLG_TRANS_TITLE_KMTRCV", uimsg, sizeof(uimsg), TitKmtRcv, UILanguageFile);
+ strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
+ break;
+ case OpKmtGet:
+ get_lang_msg("FILEDLG_TRANS_TITLE_KMTGET", uimsg, sizeof(uimsg), TitKmtGet, UILanguageFile);
+ strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
+ break;
+ case OpKmtSend:
+ get_lang_msg("FILEDLG_TRANS_TITLE_KMTSEND", uimsg, sizeof(uimsg), TitKmtSend, UILanguageFile);
+ strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
+ break;
+ case OpKmtFin:
+ get_lang_msg("FILEDLG_TRANS_TITLE_KMTFIN", uimsg, sizeof(uimsg), TitKmtFin, UILanguageFile);
+ strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
+ break;
+ case OpXRcv:
+ get_lang_msg("FILEDLG_TRANS_TITLE_XRCV", uimsg, sizeof(uimsg), TitXRcv, UILanguageFile);
+ strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
+ break;
+ case OpXSend:
+ get_lang_msg("FILEDLG_TRANS_TITLE_XSEND", uimsg, sizeof(uimsg), TitXSend, UILanguageFile);
+ strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
+ break;
+ case OpYRcv:
+ get_lang_msg("FILEDLG_TRANS_TITLE_YRCV", uimsg, sizeof(uimsg), TitYRcv, UILanguageFile);
+ strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
+ break;
+ case OpYSend:
+ get_lang_msg("FILEDLG_TRANS_TITLE_YSEND", uimsg, sizeof(uimsg), TitYSend, UILanguageFile);
+ strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
+ break;
+ case OpZRcv:
+ get_lang_msg("FILEDLG_TRANS_TITLE_ZRCV", uimsg, sizeof(uimsg), TitZRcv, UILanguageFile);
+ strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
+ break;
+ case OpZSend:
+ get_lang_msg("FILEDLG_TRANS_TITLE_ZSEND", uimsg, sizeof(uimsg), TitZSend, UILanguageFile);
+ strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
+ break;
+ case OpBPRcv:
+ get_lang_msg("FILEDLG_TRANS_TITLE_BPRCV", uimsg, sizeof(uimsg), TitBPRcv, UILanguageFile);
+ strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
+ break;
+ case OpBPSend:
+ get_lang_msg("FILEDLG_TRANS_TITLE_BPSEND", uimsg, sizeof(uimsg), TitBPSend, UILanguageFile);
+ strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
+ break;
+ case OpQVRcv:
+ get_lang_msg("FILEDLG_TRANS_TITLE_QVRCV", uimsg, sizeof(uimsg), TitQVRcv, UILanguageFile);
+ strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
+ break;
+ case OpQVSend:
+ get_lang_msg("FILEDLG_TRANS_TITLE_QVSEND", uimsg, sizeof(uimsg), TitQVSend, UILanguageFile);
+ strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
+ break;
+ }
+}
+
+/* Hook function for XMODEM file name dialog box */
+BOOL CALLBACK XFnHook(HWND Dialog, UINT Message, WPARAM wParam, LPARAM lParam)
+{
+ LPOPENFILENAME ofn;
+ WORD Hi, Lo;
+ LPLONG pl;
+ LPOFNOTIFY notify;
+ char uimsg[MAX_UIMSG], uimsg2[MAX_UIMSG];
+ LOGFONT logfont;
+ HFONT font;
+
+ switch (Message) {
+ case WM_INITDIALOG:
+ ofn = (LPOPENFILENAME)lParam;
+ pl = (LPLONG)ofn->lCustData;
+ SetWindowLong(Dialog, DWL_USER, (LONG)pl);
+
+ font = (HFONT)SendMessage(Dialog, WM_GETFONT, 0, 0);
+ GetObject(font, sizeof(LOGFONT), &logfont);
+ if (get_lang_font("DLG_TAHOMA_FONT", Dialog, &logfont, &DlgFoptFont, UILanguageFile)) {
+ SendDlgItemMessage(Dialog, IDC_XOPT, WM_SETFONT, (WPARAM)DlgFoptFont, MAKELPARAM(TRUE,0));
+ SendDlgItemMessage(Dialog, IDC_XOPTCHECK, WM_SETFONT, (WPARAM)DlgFoptFont, MAKELPARAM(TRUE,0));
+ SendDlgItemMessage(Dialog, IDC_XOPTCRC, WM_SETFONT, (WPARAM)DlgFoptFont, MAKELPARAM(TRUE,0));
+ SendDlgItemMessage(Dialog, IDC_XOPT1K, WM_SETFONT, (WPARAM)DlgFoptFont, MAKELPARAM(TRUE,0));
+ SendDlgItemMessage(Dialog, IDC_XOPTBIN, WM_SETFONT, (WPARAM)DlgFoptFont, MAKELPARAM(TRUE,0));
+ }
+ else {
+ DlgFoptFont = NULL;
+ }
+
+ GetDlgItemText(Dialog, IDC_XOPT, uimsg2, sizeof(uimsg2));
+ get_lang_msg("DLG_XOPT", uimsg, sizeof(uimsg), uimsg2, UILanguageFile);
+ SetDlgItemText(Dialog, IDC_XOPT, uimsg);
+ GetDlgItemText(Dialog, IDC_XOPTCHECK, uimsg2, sizeof(uimsg2));
+ get_lang_msg("DLG_XOPT_CHECKSUM", uimsg, sizeof(uimsg), uimsg2, UILanguageFile);
+ SetDlgItemText(Dialog, IDC_XOPTCHECK, uimsg);
+ GetDlgItemText(Dialog, IDC_XOPTCRC, uimsg2, sizeof(uimsg2));
+ get_lang_msg("DLG_XOPT_CRC", uimsg, sizeof(uimsg), uimsg2, UILanguageFile);
+ SetDlgItemText(Dialog, IDC_XOPTCRC, uimsg);
+ GetDlgItemText(Dialog, IDC_XOPT1K, uimsg2, sizeof(uimsg2));
+ get_lang_msg("DLG_XOPT_1K", uimsg, sizeof(uimsg), uimsg2, UILanguageFile);
+ SetDlgItemText(Dialog, IDC_XOPT1K, uimsg);
+ GetDlgItemText(Dialog, IDC_XOPTBIN, uimsg2, sizeof(uimsg2));
+ get_lang_msg("DLG_XOPT_BINARY", uimsg, sizeof(uimsg), uimsg2, UILanguageFile);
+ SetDlgItemText(Dialog, IDC_XOPTBIN, uimsg);
+
+ SetRB(Dialog,HIWORD(*pl),IDC_XOPTCHECK,IDC_XOPT1K);
+ if (LOWORD(*pl)!=0xFFFF)
+ {
+ ShowDlgItem(Dialog,IDC_XOPTBIN,IDC_XOPTBIN);
+ SetRB(Dialog,LOWORD(*pl),IDC_XOPTBIN,IDC_XOPTBIN);
+ }
+ return TRUE;
+ case WM_COMMAND: // for old style dialog
+ switch (LOWORD(wParam)) {
+ case IDOK:
+ pl = (LPLONG)GetWindowLong(Dialog,DWL_USER);
+ if (pl!=NULL)
+ {
+ GetRB(Dialog,&Hi,IDC_XOPTCHECK,IDC_XOPT1K);
+ if (LOWORD(*pl)==0xFFFF)
+ Lo = 0xFFFF;
+ else
+ GetRB(Dialog,&Lo,IDC_XOPTBIN,IDC_XOPTBIN);
+ *pl = MAKELONG(Lo,Hi);
+ }
+ break;
+ case IDCANCEL:
+ break;
+ }
+ break;
+ case WM_NOTIFY: // for Explorer-style dialog
+ notify = (LPOFNOTIFY)lParam;
+ switch (notify->hdr.code) {
+ case CDN_FILEOK:
+ pl = (LPLONG)GetWindowLong(Dialog,DWL_USER);
+ if (pl!=NULL)
+ {
+ GetRB(Dialog,&Hi,IDC_XOPTCHECK,IDC_XOPT1K);
+ if (LOWORD(*pl)==0xFFFF)
+ Lo = 0xFFFF;
+ else
+ GetRB(Dialog,&Lo,IDC_XOPTBIN,IDC_XOPTBIN);
+ *pl = MAKELONG(Lo,Hi);
+ }
+ if (DlgXoptFont != NULL) {
+ DeleteObject(DlgXoptFont);
+ }
+ break;
+ }
+ break;
+ }
+ return FALSE;
+}
+
+BOOL FAR PASCAL GetXFname
+ (HWND HWin, BOOL Receive, LPLONG Option, PFileVar fv, PCHAR CurDir)
+{
+ char uimsg[MAX_UIMSG];
+ char FNFilter[sizeof(FileSendFilter)*2+128], *pf;
+ OPENFILENAME ofn;
+ LONG opt;
+ char TempDir[MAXPATHLEN];
+ BOOL Ok;
+
+ memset(FNFilter, 0, sizeof(FNFilter)); /* Set up for double null at end */
+
+ /* save current dir */
+ _getcwd(TempDir,sizeof(TempDir));
+
+ fv->FullName[0] = 0;
+ memset(FNFilter, 0, sizeof(FNFilter)); /* Set up for double null at end */
+ memset(&ofn, 0, sizeof(OPENFILENAME));
+
+ strncpy_s(fv->DlgCaption, sizeof(fv->DlgCaption),"Tera Term: ", _TRUNCATE);
+ pf = FNFilter;
+ if (Receive)
+ {
+ get_lang_msg("FILEDLG_TRANS_TITLE_XRCV", uimsg, sizeof(uimsg), TitXRcv, UILanguageFile);
+ strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
+ }
+ else
+ {
+ get_lang_msg("FILEDLG_TRANS_TITLE_XSEND", uimsg, sizeof(uimsg), TitXSend, UILanguageFile);
+ strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
+ if (strlen(FileSendFilter) > 0) {
+ get_lang_msg("FILEDLG_USER_FILTER_NAME", uimsg, sizeof(uimsg), "User define", UILanguageFile);
+ _snprintf_s(FNFilter, sizeof(FNFilter), _TRUNCATE, "%s(%s)", uimsg, FileSendFilter);
+ pf = pf + strlen(FNFilter) + 1;
+ strncpy_s(pf, sizeof(FNFilter)-(pf - FNFilter) ,FileSendFilter, _TRUNCATE);
+ pf = pf + strlen(pf) + 1;
+
+ // ??????????????????????????????+ // ?????????????????????? (2008.5.18 maya)
+ if (!isInvalidFileNameChar(FileSendFilter)) {
+ char file[MAX_PATH];
+ strncpy_s(file, sizeof(file), CurDir, _TRUNCATE);
+ AppendSlash(file, sizeof(file));
+ strncat_s(file, sizeof(file), FileSendFilter, _TRUNCATE);
+ if (_access(file, 0) == 0) {
+ strncpy_s(fv->FullName, sizeof(fv->FullName), FileSendFilter, _TRUNCATE);
+ }
+ }
+ }
+ }
+
+ get_lang_msg("FILEDLG_ALL_FILTER", uimsg, sizeof(uimsg), "All(*.*)\\0*.*\\0\\0", UILanguageFile);
+ // \0\0 ????K?????? 2 ???
+ memcpy(pf, uimsg, sizeof(FNFilter) - (pf - FNFilter + 2));
+
+ ofn.lStructSize = sizeof(OPENFILENAME);
+ ofn.hwndOwner = HWin;
+ ofn.lpstrFilter = FNFilter;
+ ofn.nFilterIndex = 1;
+ ofn.lpstrFile = fv->FullName;
+ ofn.nMaxFile = sizeof(fv->FullName);
+ ofn.lpstrInitialDir = CurDir;
+ ofn.Flags = OFN_SHOWHELP | OFN_HIDEREADONLY |
+ OFN_ENABLETEMPLATE | OFN_ENABLEHOOK;
+ opt = *Option;
+ if (! Receive)
+ {
+ ofn.Flags = ofn.Flags | OFN_FILEMUSTEXIST;
+ opt = opt | 0xFFFF;
+ }
+ ofn.lCustData = (DWORD)&opt;
+
+ ofn.lpstrTitle = fv->DlgCaption;
+ ofn.lpfnHook = (LPOFNHOOKPROC)(&XFnHook);
+ ofn.Flags = ofn.Flags | OFN_EXPLORER;
+ ofn.lpTemplateName = MAKEINTRESOURCE(IDD_XOPT);
+ ofn.hInstance = hInst;
+
+ Ok = GetOpenFileName(&ofn);
+
+ if (Ok)
+ {
+ fv->DirLen = ofn.nFileOffset;
+ fv->FnPtr = ofn.nFileOffset;
+ memcpy(CurDir,fv->FullName,fv->DirLen-1);
+ CurDir[fv->DirLen-1] = 0;
+
+ if (Receive)
+ *Option = opt;
+ else
+ *Option = MAKELONG(LOWORD(*Option),HIWORD(opt));
+ }
+
+ /* restore dir */
+ _chdir(TempDir);
+
+ return Ok;
+}
+
+void FAR PASCAL ProtoInit(int Proto, PFileVar fv, PCHAR pv, PComVar cv, PTTSet ts)
+{
+ switch (Proto) {
+ case PROTO_KMT:
+ KmtInit(fv,(PKmtVar)pv,cv,ts);
+ break;
+ case PROTO_XM:
+ XInit(fv,(PXVar)pv,cv,ts);
+ break;
+ case PROTO_YM:
+ YInit(fv,(PYVar)pv,cv,ts);
+ break;
+ case PROTO_ZM:
+ ZInit(fv,(PZVar)pv,cv,ts);
+ break;
+ case PROTO_BP:
+ BPInit(fv,(PBPVar)pv,cv,ts);
+ break;
+ case PROTO_QV:
+ QVInit(fv,(PQVVar)pv,cv,ts);
+ break;
+ }
+}
+
+BOOL FAR PASCAL ProtoParse
+ (int Proto, PFileVar fv, PCHAR pv, PComVar cv)
+{
+ BOOL Ok;
+
+ Ok = FALSE;
+ switch (Proto) {
+ case PROTO_KMT:
+ Ok = KmtReadPacket(fv,(PKmtVar)pv,cv);
+ break;
+ case PROTO_XM:
+ switch (((PXVar)pv)->XMode) {
+ case IdXReceive:
+ Ok = XReadPacket(fv,(PXVar)pv,cv);
+ break;
+ case IdXSend:
+ Ok = XSendPacket(fv,(PXVar)pv,cv);
+ break;
+ }
+ break;
+ case PROTO_YM:
+ switch (((PYVar)pv)->YMode) {
+ case IdYReceive:
+ Ok = YReadPacket(fv,(PYVar)pv,cv);
+ break;
+ case IdYSend:
+ Ok = YSendPacket(fv,(PYVar)pv,cv);
+ break;
+ }
+ break;
+ case PROTO_ZM:
+ Ok = ZParse(fv,(PZVar)pv,cv);
+ break;
+ case PROTO_BP:
+ Ok = BPParse(fv,(PBPVar)pv,cv);
+ break;
+ case PROTO_QV:
+ switch (((PQVVar)pv)->QVMode) {
+ case IdQVReceive:
+ Ok = QVReadPacket(fv,(PQVVar)pv,cv);
+ break;
+ case IdQVSend:
+ Ok = QVSendPacket(fv,(PQVVar)pv,cv);
+ break;
+ }
+ break;
+ }
+ return Ok;
+}
+
+void FAR PASCAL ProtoTimeOutProc
+ (int Proto, PFileVar fv, PCHAR pv, PComVar cv)
+{
+ switch (Proto) {
+ case PROTO_KMT:
+ KmtTimeOutProc(fv,(PKmtVar)pv,cv);
+ break;
+ case PROTO_XM:
+ XTimeOutProc(fv,(PXVar)pv,cv);
+ break;
+ case PROTO_YM:
+ YTimeOutProc(fv,(PYVar)pv,cv);
+ break;
+ case PROTO_ZM:
+ ZTimeOutProc(fv,(PZVar)pv,cv);
+ break;
+ case PROTO_BP:
+ BPTimeOutProc(fv,(PBPVar)pv,cv);
+ break;
+ case PROTO_QV:
+ QVTimeOutProc(fv,(PQVVar)pv,cv);
+ break;
+ }
+}
+
+BOOL FAR PASCAL ProtoCancel
+ (int Proto, PFileVar fv, PCHAR pv, PComVar cv)
+{
+ switch (Proto) {
+ case PROTO_KMT:
+ KmtCancel(fv,(PKmtVar)pv,cv);
+ break;
+ case PROTO_XM:
+ XCancel(fv,(PXVar)pv,cv);
+ break;
+ case PROTO_YM:
+ YCancel(fv, (PYVar)pv,cv);
+ break;
+ case PROTO_ZM:
+ ZCancel((PZVar)pv);
+ break;
+ case PROTO_BP:
+ if (((PBPVar)pv)->BPState != BP_Failure)
+ {
+ BPCancel((PBPVar)pv);
+ return FALSE;
+ }
+ break;
+ case PROTO_QV:
+ QVCancel(fv,(PQVVar)pv,cv);
+ break;
+ }
+ return TRUE;
+}
+
+void FAR PASCAL TTFILESetUILanguageFile(char *file)
+{
+ strncpy_s(UILanguageFile, sizeof(UILanguageFile), file, _TRUNCATE);
+}
+
+void FAR PASCAL TTFILESetFileSendFilter(char *file)
+{
+ strncpy_s(FileSendFilter, sizeof(FileSendFilter), file, _TRUNCATE);
+}
+
+BOOL WINAPI DllMain(HANDLE hInstance,
+ ULONG ul_reason_for_call,
+ LPVOID lpReserved)
+{
+// PMap pm;
+// HANDLE HMap = NULL;
+
+ hInst = hInstance;
+ switch( ul_reason_for_call ) {
+ case DLL_THREAD_ATTACH:
+ /* do thread initialization */
+ break;
+ case DLL_THREAD_DETACH:
+ /* do thread cleanup */
+ break;
+ case DLL_PROCESS_ATTACH:
+ /* do process initialization */
+// HMap = CreateFileMapping((HANDLE) 0xFFFFFFFF, NULL, PAGE_READONLY,
+// 0, sizeof(TMap), TT_FILEMAPNAME);
+// if (HMap != NULL) {
+// pm = (PMap)MapViewOfFile(HMap,FILE_MAP_READ,0,0,0);
+// if (pm != NULL) {
+// strncpy_s(UILanguageFile, sizeof(UILanguageFile), pm->ts.UILanguageFile, _TRUNCATE);
+// strncpy_s(FileSendFilter, sizeof(FileSendFilter), pm->ts.FileSendFilter, _TRUNCATE);
+// }
+// }
+ DoCover_IsDebuggerPresent();
+ break;
+ case DLL_PROCESS_DETACH:
+ /* do process cleanup */
+ break;
+ }
+ return TRUE;
+}
Modified: trunk/teraterm/ttpfile/xmodem.c
===================================================================
--- trunk/teraterm/ttpfile/xmodem.c 2010-04-12 12:51:24 UTC (rev 3854)
+++ trunk/teraterm/ttpfile/xmodem.c 2010-04-12 13:43:07 UTC (rev 3855)
@@ -1,505 +1,505 @@
-/* Tera Term
- Copyright(C) 1994-1998 T. Teranishi
- All rights reserved. */
-
-/* TTFILE.DLL, XMODEM protocol */
-#include "teraterm.h"
-#include "tttypes.h"
-#include "ttftypes.h"
-#include
-
-#include "tt_res.h"
-#include "ttcommon.h"
-#include "ttlib.h"
-#include "ftlib.h"
-#include "dlglib.h"
-
-#include "xmodem.h"
-
-#define TimeOutInit 10
-#define TimeOutC 3
-#define TimeOutShort 10
-#define TimeOutLong 20
-#define TimeOutVeryLong 60
-
-int XRead1Byte(PFileVar fv, PXVar xv, PComVar cv, LPBYTE b)
-{
- if (CommRead1Byte(cv, b) == 0)
- return 0;
-
- if (fv->LogFlag) {
- if (fv->LogState == 0) {
- // ???ASCII?ヲ???
- fv->FlushLogLineBuf = 1;
- FTLog1Byte(fv, 0);
- fv->FlushLogLineBuf = 0;
-
- fv->LogState = 1;
- fv->LogCount = 0;
- _lwrite(fv->LogFile, "\015\012<<<\015\012", 7);
- }
- FTLog1Byte(fv, *b);
- }
- return 1;
-}
-
-int XWrite(PFileVar fv, PXVar xv, PComVar cv, PCHAR B, int C)
-{
- int i, j;
-
- i = CommBinaryOut(cv, B, C);
- if (fv->LogFlag && (i > 0)) {
- if (fv->LogState != 0) {
- // ???ASCII?ヲ???
- fv->FlushLogLineBuf = 1;
- FTLog1Byte(fv, 0);
- fv->FlushLogLineBuf = 0;
-
- fv->LogState = 0;
- fv->LogCount = 0;
- _lwrite(fv->LogFile, "\015\012>>>\015\012", 7);
- }
- for (j = 0; j <= i - 1; j++)
- FTLog1Byte(fv, B[j]);
- }
- return i;
-}
-
-void XSetOpt(PFileVar fv, PXVar xv, WORD Opt)
-{
- char Tmp[21];
-
- xv->XOpt = Opt;
-
- strncpy_s(Tmp, sizeof(Tmp), "XMODEM (", _TRUNCATE);
- switch (xv->XOpt) {
- case XoptCheck: /* Checksum */
- strncat_s(Tmp, sizeof(Tmp), "checksum)", _TRUNCATE);
- xv->DataLen = 128;
- xv->CheckLen = 1;
- break;
- case XoptCRC: /* CRC */
- strncat_s(Tmp, sizeof(Tmp), "CRC)", _TRUNCATE);
- xv->DataLen = 128;
- xv->CheckLen = 2;
- break;
- case Xopt1K: /* 1K */
- strncat_s(Tmp, sizeof(Tmp), "1K)", _TRUNCATE);
- xv->DataLen = 1024;
- xv->CheckLen = 2;
- break;
- }
- SetDlgItemText(fv->HWin, IDC_PROTOPROT, Tmp);
-}
-
-void XSendNAK(PFileVar fv, PXVar xv, PComVar cv)
-{
- BYTE b;
- int t;
-
- /* flush comm buffer */
- cv->InBuffCount = 0;
- cv->InPtr = 0;
-
- xv->NAKCount--;
- if (xv->NAKCount < 0) {
- if (xv->NAKMode == XnakC) {
- XSetOpt(fv, xv, XoptCheck);
- xv->NAKMode = XnakNAK;
- xv->NAKCount = 9;
- } else {
- XCancel(fv, xv, cv);
- return;
- }
- }
-
- if (xv->NAKMode == XnakNAK) {
- b = NAK;
- if ((xv->PktNum == 0) && (xv->PktNumOffset == 0))
- t = TimeOutInit;
- else
- t = xv->TOutLong;
- } else {
- b = 'C';
- t = TimeOutC;
- }
- XWrite(fv, xv, cv, &b, 1);
- xv->PktReadMode = XpktSOH;
- FTSetTimeOut(fv, t);
-}
-
-WORD XCalcCheck(PXVar xv, PCHAR PktBuf)
-{
- int i;
- WORD Check;
-
- if (xv->CheckLen == 1) { /* CheckSum */
- /* Calc sum */
- Check = 0;
- for (i = 0; i <= xv->DataLen - 1; i++)
- Check = Check + (BYTE) (PktBuf[3 + i]);
- return (Check & 0xff);
- } else { /* CRC */
- Check = 0;
- for (i = 0; i <= xv->DataLen - 1; i++)
- Check = UpdateCRC(PktBuf[3 + i], Check);
- return (Check);
- }
-}
-
-BOOL XCheckPacket(PXVar xv)
-{
- WORD Check;
-
- Check = XCalcCheck(xv, xv->PktIn);
- if (xv->CheckLen == 1) /* Checksum */
- return ((BYTE) Check == xv->PktIn[xv->DataLen + 3]);
- else
- return ((HIBYTE(Check) == xv->PktIn[xv->DataLen + 3]) &&
- (LOBYTE(Check) == xv->PktIn[xv->DataLen + 4]));
-}
-
-void XInit(PFileVar fv, PXVar xv, PComVar cv, PTTSet ts) {
- char inistr[MAXPATHLEN + 10];
-
- fv->LogFlag = ((ts->LogFlag & LOG_X) != 0);
- if (fv->LogFlag)
- fv->LogFile = _lcreat("XMODEM.LOG", 0);
- fv->LogState = 0;
- fv->LogCount = 0;
-
- fv->FileSize = 0;
- if ((xv->XMode == IdXSend) && fv->FileOpen) {
- fv->FileSize = GetFSize(fv->FullName);
- InitDlgProgress(fv->HWin, IDC_PROTOPROGRESS, &fv->ProgStat);
- } else {
- fv->ProgStat = -1;
- }
-
- SetWindowText(fv->HWin, fv->DlgCaption);
- SetDlgItemText(fv->HWin, IDC_PROTOFNAME, &(fv->FullName[fv->DirLen]));
-
- xv->PktNumOffset = 0;
- xv->PktNum = 0;
- xv->PktNumSent = 0;
- xv->PktBufCount = 0;
- xv->CRRecv = FALSE;
-
- fv->ByteCount = 0;
-
- if (cv->PortType == IdTCPIP) {
- xv->TOutShort = TimeOutVeryLong;
- xv->TOutLong = TimeOutVeryLong;
- } else {
- xv->TOutShort = TimeOutShort;
- xv->TOutLong = TimeOutLong;
- }
-
- XSetOpt(fv, xv, xv->XOpt);
-
- if (xv->XOpt == XoptCheck) {
- xv->NAKMode = XnakNAK;
- xv->NAKCount = 10;
- } else {
- xv->NAKMode = XnakC;
- xv->NAKCount = 3;
- }
-
- switch (xv->XMode) {
- case IdXSend:
- xv->TextFlag = 0;
-
- // ???????????"rx ?????"?ゥ???????B(2007.12.20 yutaka)
- if (ts->XModemRcvCommand[0] != '\0') {
- _snprintf_s(inistr, sizeof(inistr), _TRUNCATE, "%s %s\015",
- ts->XModemRcvCommand, &(fv->FullName[fv->DirLen]));
- FTConvFName(inistr + strlen(ts->XModemRcvCommand) + 1);
- XWrite(fv, xv, cv, inistr, strlen(inistr));
- }
-
- FTSetTimeOut(fv, TimeOutVeryLong);
- break;
- case IdXReceive:
- XSendNAK(fv, xv, cv);
- break;
- }
-}
-
-void XCancel(PFileVar fv, PXVar xv, PComVar cv)
-{
- BYTE b;
-
- b = CAN;
- XWrite(fv, xv, cv, &b, 1);
- xv->XMode = 0; // quit
-}
-
-void XTimeOutProc(PFileVar fv, PXVar xv, PComVar cv)
-{
- switch (xv->XMode) {
- case IdXSend:
- xv->XMode = 0; // quit
- break;
- case IdXReceive:
- XSendNAK(fv, xv, cv);
- break;
- }
-}
-
-BOOL XReadPacket(PFileVar fv, PXVar xv, PComVar cv)
-{
- BYTE b, d;
- int i, c;
- BOOL GetPkt;
-
- c = XRead1Byte(fv, xv, cv, &b);
-
- GetPkt = FALSE;
-
- while ((c > 0) && (!GetPkt)) {
- switch (xv->PktReadMode) {
- case XpktSOH:
- if (b == SOH) {
- xv->PktIn[0] = b;
- xv->PktReadMode = XpktBLK;
- if (xv->XOpt == Xopt1K)
- XSetOpt(fv, xv, XoptCRC);
- FTSetTimeOut(fv, xv->TOutShort);
- } else if (b == STX) {
- xv->PktIn[0] = b;
- xv->PktReadMode = XpktBLK;
- XSetOpt(fv, xv, Xopt1K);
- FTSetTimeOut(fv, xv->TOutShort);
- } else if (b == EOT) {
- b = ACK;
- fv->Success = TRUE;
- XWrite(fv, xv, cv, &b, 1);
- return FALSE;
- } else {
- /* flush comm buffer */
- cv->InBuffCount = 0;
- cv->InPtr = 0;
- return TRUE;
- }
- break;
- case XpktBLK:
- xv->PktIn[1] = b;
- xv->PktReadMode = XpktBLK2;
- FTSetTimeOut(fv, xv->TOutShort);
- break;
- case XpktBLK2:
- xv->PktIn[2] = b;
- if ((b ^ xv->PktIn[1]) == 0xff) {
- xv->PktBufPtr = 3;
- xv->PktBufCount = xv->DataLen + xv->CheckLen;
- xv->PktReadMode = XpktDATA;
- FTSetTimeOut(fv, xv->TOutShort);
- } else
- XSendNAK(fv, xv, cv);
- break;
- case XpktDATA:
- xv->PktIn[xv->PktBufPtr] = b;
- xv->PktBufPtr++;
- xv->PktBufCount--;
- GetPkt = xv->PktBufCount == 0;
- if (GetPkt) {
- FTSetTimeOut(fv, xv->TOutLong);
- xv->PktReadMode = XpktSOH;
- } else
- FTSetTimeOut(fv, xv->TOutShort);
- break;
- }
-
- if (!GetPkt)
- c = XRead1Byte(fv, xv, cv, &b);
- }
-
- if (!GetPkt)
- return TRUE;
-
- if ((xv->PktIn[1] == 0) && (xv->PktNum == 0) &&
- (xv->PktNumOffset == 0)) {
- if (xv->NAKMode == XnakNAK)
- xv->NAKCount = 10;
- else
- xv->NAKCount = 3;
- XSendNAK(fv, xv, cv);
- return TRUE;
- }
-
- GetPkt = XCheckPacket(xv);
- if (!GetPkt) {
- XSendNAK(fv, xv, cv);
- return TRUE;
- }
-
- d = xv->PktIn[1] - xv->PktNum;
- if (d > 1) {
- XCancel(fv, xv, cv);
- return FALSE;
- }
-
- /* send ACK */
- b = ACK;
- XWrite(fv, xv, cv, &b, 1);
- xv->NAKMode = XnakNAK;
- xv->NAKCount = 10;
-
- if (d == 0)
- return TRUE;
- xv->PktNum = xv->PktIn[1];
- if (xv->PktNum == 0)
- xv->PktNumOffset = xv->PktNumOffset + 256;
-
- c = xv->DataLen;
- if (xv->TextFlag > 0)
- while ((c > 0) && (xv->PktIn[2 + c] == 0x1A))
- c--;
-
- if (xv->TextFlag > 0)
- for (i = 0; i <= c - 1; i++) {
- b = xv->PktIn[3 + i];
- if ((b == LF) && (!xv->CRRecv))
- _lwrite(fv->FileHandle, "\015", 1);
- if (xv->CRRecv && (b != LF))
- _lwrite(fv->FileHandle, "\012", 1);
- xv->CRRecv = b == CR;
- _lwrite(fv->FileHandle, &b, 1);
- } else
- _lwrite(fv->FileHandle, &(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);
-
- FTSetTimeOut(fv, xv->TOutLong);
-
- return TRUE;
-}
-
-BOOL XSendPacket(PFileVar fv, PXVar xv, PComVar cv)
-{
- BYTE b;
- int i;
- BOOL SendFlag;
- WORD Check;
-
- SendFlag = FALSE;
- if (xv->PktBufCount == 0) {
- i = XRead1Byte(fv, xv, cv, &b);
- do {
- if (i == 0)
- return TRUE;
- switch (b) {
- case ACK:
- if (!fv->FileOpen) {
- fv->Success = TRUE;
- return FALSE;
- } else if (xv->PktNumSent == (BYTE) (xv->PktNum + 1)) {
- xv->PktNum = xv->PktNumSent;
- if (xv->PktNum == 0)
- xv->PktNumOffset = xv->PktNumOffset + 256;
- SendFlag = TRUE;
- }
- break;
- case NAK:
- if (xv->PktNum == 0 && xv->XOpt == Xopt1K) {
- /* we wanted 1k with CRC, but the other end specified checksum */
- /* keep the 1k block, but move back to checksum mode. */
- xv->XOpt = XoptCheck;
- xv->CheckLen = 1;
- }
- SendFlag = TRUE;
- break;
- case CAN:
- break;
- case 0x43:
- if ((xv->PktNum == 0) && (xv->PktNumOffset == 0)) {
- if ((xv->XOpt == XoptCheck) && (xv->PktNumSent == 0))
- XSetOpt(fv, xv, XoptCRC);
- if (xv->XOpt != XoptCheck)
- SendFlag = TRUE;
- }
- break;
- }
- if (!SendFlag)
- i = XRead1Byte(fv, xv, cv, &b);
- } while (!SendFlag);
- // reset timeout timer
- FTSetTimeOut(fv, TimeOutVeryLong);
-
- do {
- i = XRead1Byte(fv, xv, cv, &b);
- } while (i != 0);
-
- if (xv->PktNumSent == xv->PktNum) { /* make a new packet */
- xv->PktNumSent++;
- if (xv->DataLen == 128)
- xv->PktOut[0] = SOH;
- else
- xv->PktOut[0] = STX;
- xv->PktOut[1] = xv->PktNumSent;
- xv->PktOut[2] = ~xv->PktNumSent;
-
- i = 1;
- while ((i <= xv->DataLen) && fv->FileOpen &&
- (_lread(fv->FileHandle, &b, 1) == 1)) {
- xv->PktOut[2 + i] = b;
- i++;
- fv->ByteCount++;
- }
-
- if (i > 1) {
- while (i <= xv->DataLen) {
- xv->PktOut[2 + i] = 0x1A;
- i++;
- }
-
- Check = XCalcCheck(xv, xv->PktOut);
- if (xv->CheckLen == 1) /* Checksum */
- xv->PktOut[xv->DataLen + 3] = (BYTE) Check;
- else {
- xv->PktOut[xv->DataLen + 3] = HIBYTE(Check);
- xv->PktOut[xv->DataLen + 4] = LOBYTE(Check);
- }
- xv->PktBufCount = 3 + xv->DataLen + xv->CheckLen;
- } else { /* send EOT */
- if (fv->FileOpen) {
- _lclose(fv->FileHandle);
- fv->FileHandle = 0;
- fv->FileOpen = FALSE;
- }
- xv->PktOut[0] = EOT;
- xv->PktBufCount = 1;
- }
- } else { /* resend packet */
- xv->PktBufCount = 3 + xv->DataLen + xv->CheckLen;
- }
- xv->PktBufPtr = 0;
- }
- /* a NAK or C could have arrived while we were buffering. Consume it. */
- do {
- i = XRead1Byte(fv, xv, cv, &b);
- } while (i != 0);
-
- i = 1;
- while ((xv->PktBufCount > 0) && (i > 0)) {
- b = xv->PktOut[xv->PktBufPtr];
- i = XWrite(fv, xv, cv, &b, 1);
- if (i > 0) {
- xv->PktBufCount--;
- xv->PktBufPtr++;
- }
- }
-
- if (xv->PktBufCount == 0) {
- SetDlgNum(fv->HWin, IDC_PROTOPKTNUM,
- xv->PktNumOffset + xv->PktNumSent);
- SetDlgNum(fv->HWin, IDC_PROTOBYTECOUNT, fv->ByteCount);
- SetDlgPercent(fv->HWin, IDC_PROTOPERCENT, IDC_PROTOPROGRESS,
- fv->ByteCount, fv->FileSize, &fv->ProgStat);
- }
-
- return TRUE;
-}
+/* Tera Term
+ Copyright(C) 1994-1998 T. Teranishi
+ All rights reserved. */
+
+/* TTFILE.DLL, XMODEM protocol */
+#include "teraterm.h"
+#include "tttypes.h"
+#include "ttftypes.h"
+#include
+
+#include "tt_res.h"
+#include "ttcommon.h"
+#include "ttlib.h"
+#include "ftlib.h"
+#include "dlglib.h"
+
+#include "xmodem.h"
+
+#define TimeOutInit 10
+#define TimeOutC 3
+#define TimeOutShort 10
+#define TimeOutLong 20
+#define TimeOutVeryLong 60
+
+int XRead1Byte(PFileVar fv, PXVar xv, PComVar cv, LPBYTE b)
+{
+ if (CommRead1Byte(cv, b) == 0)
+ return 0;
+
+ if (fv->LogFlag) {
+ if (fv->LogState == 0) {
+ // ???ASCII?ヲ???
+ fv->FlushLogLineBuf = 1;
+ FTLog1Byte(fv, 0);
+ fv->FlushLogLineBuf = 0;
+
+ fv->LogState = 1;
+ fv->LogCount = 0;
+ _lwrite(fv->LogFile, "\015\012<<<\015\012", 7);
+ }
+ FTLog1Byte(fv, *b);
+ }
+ return 1;
+}
+
+int XWrite(PFileVar fv, PXVar xv, PComVar cv, PCHAR B, int C)
+{
+ int i, j;
+
+ i = CommBinaryOut(cv, B, C);
+ if (fv->LogFlag && (i > 0)) {
+ if (fv->LogState != 0) {
+ // ???ASCII?ヲ???
+ fv->FlushLogLineBuf = 1;
+ FTLog1Byte(fv, 0);
+ fv->FlushLogLineBuf = 0;
+
+ fv->LogState = 0;
+ fv->LogCount = 0;
+ _lwrite(fv->LogFile, "\015\012>>>\015\012", 7);
+ }
+ for (j = 0; j <= i - 1; j++)
+ FTLog1Byte(fv, B[j]);
+ }
+ return i;
+}
+
+void XSetOpt(PFileVar fv, PXVar xv, WORD Opt)
+{
+ char Tmp[21];
+
+ xv->XOpt = Opt;
+
+ strncpy_s(Tmp, sizeof(Tmp), "XMODEM (", _TRUNCATE);
+ switch (xv->XOpt) {
+ case XoptCheck: /* Checksum */
+ strncat_s(Tmp, sizeof(Tmp), "checksum)", _TRUNCATE);
+ xv->DataLen = 128;
+ xv->CheckLen = 1;
+ break;
+ case XoptCRC: /* CRC */
+ strncat_s(Tmp, sizeof(Tmp), "CRC)", _TRUNCATE);
+ xv->DataLen = 128;
+ xv->CheckLen = 2;
+ break;
+ case Xopt1K: /* 1K */
+ strncat_s(Tmp, sizeof(Tmp), "1K)", _TRUNCATE);
+ xv->DataLen = 1024;
+ xv->CheckLen = 2;
+ break;
+ }
+ SetDlgItemText(fv->HWin, IDC_PROTOPROT, Tmp);
+}
+
+void XSendNAK(PFileVar fv, PXVar xv, PComVar cv)
+{
+ BYTE b;
+ int t;
+
+ /* flush comm buffer */
+ cv->InBuffCount = 0;
+ cv->InPtr = 0;
+
+ xv->NAKCount--;
+ if (xv->NAKCount < 0) {
+ if (xv->NAKMode == XnakC) {
+ XSetOpt(fv, xv, XoptCheck);
+ xv->NAKMode = XnakNAK;
+ xv->NAKCount = 9;
+ } else {
+ XCancel(fv, xv, cv);
+ return;
+ }
+ }
+
+ if (xv->NAKMode == XnakNAK) {
+ b = NAK;
+ if ((xv->PktNum == 0) && (xv->PktNumOffset == 0))
+ t = TimeOutInit;
+ else
+ t = xv->TOutLong;
+ } else {
+ b = 'C';
+ t = TimeOutC;
+ }
+ XWrite(fv, xv, cv, &b, 1);
+ xv->PktReadMode = XpktSOH;
+ FTSetTimeOut(fv, t);
+}
+
+WORD XCalcCheck(PXVar xv, PCHAR PktBuf)
+{
+ int i;
+ WORD Check;
+
+ if (xv->CheckLen == 1) { /* CheckSum */
+ /* Calc sum */
+ Check = 0;
+ for (i = 0; i <= xv->DataLen - 1; i++)
+ Check = Check + (BYTE) (PktBuf[3 + i]);
+ return (Check & 0xff);
+ } else { /* CRC */
+ Check = 0;
+ for (i = 0; i <= xv->DataLen - 1; i++)
+ Check = UpdateCRC(PktBuf[3 + i], Check);
+ return (Check);
+ }
+}
+
+BOOL XCheckPacket(PXVar xv)
+{
+ WORD Check;
+
+ Check = XCalcCheck(xv, xv->PktIn);
+ if (xv->CheckLen == 1) /* Checksum */
+ return ((BYTE) Check == xv->PktIn[xv->DataLen + 3]);
+ else
+ return ((HIBYTE(Check) == xv->PktIn[xv->DataLen + 3]) &&
+ (LOBYTE(Check) == xv->PktIn[xv->DataLen + 4]));
+}
+
+void XInit(PFileVar fv, PXVar xv, PComVar cv, PTTSet ts) {
+ char inistr[MAXPATHLEN + 10];
+
+ fv->LogFlag = ((ts->LogFlag & LOG_X) != 0);
+ if (fv->LogFlag)
+ fv->LogFile = _lcreat("XMODEM.LOG", 0);
+ fv->LogState = 0;
+ fv->LogCount = 0;
+
+ fv->FileSize = 0;
+ if ((xv->XMode == IdXSend) && fv->FileOpen) {
+ fv->FileSize = GetFSize(fv->FullName);
+ InitDlgProgress(fv->HWin, IDC_PROTOPROGRESS, &fv->ProgStat);
+ } else {
+ fv->ProgStat = -1;
+ }
+
+ SetWindowText(fv->HWin, fv->DlgCaption);
+ SetDlgItemText(fv->HWin, IDC_PROTOFNAME, &(fv->FullName[fv->DirLen]));
+
+ xv->PktNumOffset = 0;
+ xv->PktNum = 0;
+ xv->PktNumSent = 0;
+ xv->PktBufCount = 0;
+ xv->CRRecv = FALSE;
+
+ fv->ByteCount = 0;
+
+ if (cv->PortType == IdTCPIP) {
+ xv->TOutShort = TimeOutVeryLong;
+ xv->TOutLong = TimeOutVeryLong;
+ } else {
+ xv->TOutShort = TimeOutShort;
+ xv->TOutLong = TimeOutLong;
+ }
+
+ XSetOpt(fv, xv, xv->XOpt);
+
+ if (xv->XOpt == XoptCheck) {
+ xv->NAKMode = XnakNAK;
+ xv->NAKCount = 10;
+ } else {
+ xv->NAKMode = XnakC;
+ xv->NAKCount = 3;
+ }
+
+ switch (xv->XMode) {
+ case IdXSend:
+ xv->TextFlag = 0;
+
+ // ???????????"rx ?????"?ゥ???????B(2007.12.20 yutaka)
+ if (ts->XModemRcvCommand[0] != '\0') {
+ _snprintf_s(inistr, sizeof(inistr), _TRUNCATE, "%s %s\015",
+ ts->XModemRcvCommand, &(fv->FullName[fv->DirLen]));
+ FTConvFName(inistr + strlen(ts->XModemRcvCommand) + 1);
+ XWrite(fv, xv, cv, inistr, strlen(inistr));
+ }
+
+ FTSetTimeOut(fv, TimeOutVeryLong);
+ break;
+ case IdXReceive:
+ XSendNAK(fv, xv, cv);
+ break;
+ }
+}
+
+void XCancel(PFileVar fv, PXVar xv, PComVar cv)
+{
+ // five cancels & five backspaces per spec
+ BYTE cancel[] = { CAN, CAN, CAN, CAN, CAN, BS, BS, BS, BS, BS };
+
+ XWrite(fv,xv,cv, (PCHAR)&cancel, sizeof(cancel));
+ xv->XMode = 0; // quit
+}
+
+void XTimeOutProc(PFileVar fv, PXVar xv, PComVar cv)
+{
+ switch (xv->XMode) {
+ case IdXSend:
+ xv->XMode = 0; // quit
+ break;
+ case IdXReceive:
+ XSendNAK(fv, xv, cv);
+ break;
+ }
+}
+
+BOOL XReadPacket(PFileVar fv, PXVar xv, PComVar cv)
+{
+ BYTE b, d;
+ int i, c;
+ BOOL GetPkt;
+
+ c = XRead1Byte(fv, xv, cv, &b);
+
+ GetPkt = FALSE;
+
+ while ((c > 0) && (!GetPkt)) {
+ switch (xv->PktReadMode) {
+ case XpktSOH:
+ if (b == SOH) {
+ xv->PktIn[0] = b;
+ xv->PktReadMode = XpktBLK;
+ if (xv->XOpt == Xopt1K)
+ XSetOpt(fv, xv, XoptCRC);
+ FTSetTimeOut(fv, xv->TOutShort);
+ } else if (b == STX) {
+ xv->PktIn[0] = b;
+ xv->PktReadMode = XpktBLK;
+ XSetOpt(fv, xv, Xopt1K);
+ FTSetTimeOut(fv, xv->TOutShort);
+ } else if (b == EOT) {
+ b = ACK;
+ fv->Success = TRUE;
+ XWrite(fv, xv, cv, &b, 1);
+ return FALSE;
+ } else {
+ /* flush comm buffer */
+ cv->InBuffCount = 0;
+ cv->InPtr = 0;
+ return TRUE;
+ }
+ break;
+ case XpktBLK:
+ xv->PktIn[1] = b;
+ xv->PktReadMode = XpktBLK2;
+ FTSetTimeOut(fv, xv->TOutShort);
+ break;
+ case XpktBLK2:
+ xv->PktIn[2] = b;
+ if ((b ^ xv->PktIn[1]) == 0xff) {
+ xv->PktBufPtr = 3;
+ xv->PktBufCount = xv->DataLen + xv->CheckLen;
+ xv->PktReadMode = XpktDATA;
+ FTSetTimeOut(fv, xv->TOutShort);
+ } else
+ XSendNAK(fv, xv, cv);
+ break;
+ case XpktDATA:
+ xv->PktIn[xv->PktBufPtr] = b;
+ xv->PktBufPtr++;
+ xv->PktBufCount--;
+ GetPkt = xv->PktBufCount == 0;
+ if (GetPkt) {
+ FTSetTimeOut(fv, xv->TOutLong);
+ xv->PktReadMode = XpktSOH;
+ } else
+ FTSetTimeOut(fv, xv->TOutShort);
+ break;
+ }
+
+ if (!GetPkt)
+ c = XRead1Byte(fv, xv, cv, &b);
+ }
+
+ if (!GetPkt)
+ return TRUE;
+
+ if ((xv->PktIn[1] == 0) && (xv->PktNum == 0) &&
+ (xv->PktNumOffset == 0)) {
+ if (xv->NAKMode == XnakNAK)
+ xv->NAKCount = 10;
+ else
+ xv->NAKCount = 3;
+ XSendNAK(fv, xv, cv);
+ return TRUE;
+ }
+
+ GetPkt = XCheckPacket(xv);
+ if (!GetPkt) {
+ XSendNAK(fv, xv, cv);
+ return TRUE;
+ }
+
+ d = xv->PktIn[1] - xv->PktNum;
+ if (d > 1) {
+ XCancel(fv, xv, cv);
+ return FALSE;
+ }
+
+ /* send ACK */
+ b = ACK;
+ XWrite(fv, xv, cv, &b, 1);
+ xv->NAKMode = XnakNAK;
+ xv->NAKCount = 10;
+
+ if (d == 0)
+ return TRUE;
+ xv->PktNum = xv->PktIn[1];
+ if (xv->PktNum == 0)
+ xv->PktNumOffset = xv->PktNumOffset + 256;
+
+ c = xv->DataLen;
+ if (xv->TextFlag > 0)
+ while ((c > 0) && (xv->PktIn[2 + c] == 0x1A))
+ c--;
+
+ if (xv->TextFlag > 0)
+ for (i = 0; i <= c - 1; i++) {
+ b = xv->PktIn[3 + i];
+ if ((b == LF) && (!xv->CRRecv))
+ _lwrite(fv->FileHandle, "\015", 1);
+ if (xv->CRRecv && (b != LF))
+ _lwrite(fv->FileHandle, "\012", 1);
+ xv->CRRecv = b == CR;
+ _lwrite(fv->FileHandle, &b, 1);
+ } else
+ _lwrite(fv->FileHandle, &(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);
+
+ FTSetTimeOut(fv, xv->TOutLong);
+
+ return TRUE;
+}
+
+BOOL XSendPacket(PFileVar fv, PXVar xv, PComVar cv)
+{
+ BYTE b;
+ int i;
+ BOOL SendFlag;
+ WORD Check;
+
+ SendFlag = FALSE;
+ if (xv->PktBufCount == 0) {
+ i = XRead1Byte(fv, xv, cv, &b);
+ do {
+ if (i == 0)
+ return TRUE;
+ switch (b) {
+ case ACK:
+ if (!fv->FileOpen) {
+ fv->Success = TRUE;
+ return FALSE;
+ } else if (xv->PktNumSent == (BYTE) (xv->PktNum + 1)) {
+ xv->PktNum = xv->PktNumSent;
+ if (xv->PktNum == 0)
+ xv->PktNumOffset = xv->PktNumOffset + 256;
+ SendFlag = TRUE;
+ }
+ break;
+ case NAK:
+ if (xv->PktNum == 0 && xv->XOpt == Xopt1K) {
+ /* we wanted 1k with CRC, but the other end specified checksum */
+ /* keep the 1k block, but move back to checksum mode. */
+ xv->XOpt = XoptCheck;
+ xv->CheckLen = 1;
+ }
+ SendFlag = TRUE;
+ break;
+ case CAN:
+ break;
+ case 0x43:
+ if ((xv->PktNum == 0) && (xv->PktNumOffset == 0)) {
+ if ((xv->XOpt == XoptCheck) && (xv->PktNumSent == 0))
+ XSetOpt(fv, xv, XoptCRC);
+ if (xv->XOpt != XoptCheck)
+ SendFlag = TRUE;
+ }
+ break;
+ }
+ if (!SendFlag)
+ i = XRead1Byte(fv, xv, cv, &b);
+ } while (!SendFlag);
+ // reset timeout timer
+ FTSetTimeOut(fv, TimeOutVeryLong);
+
+ do {
+ i = XRead1Byte(fv, xv, cv, &b);
+ } while (i != 0);
+
+ if (xv->PktNumSent == xv->PktNum) { /* make a new packet */
+ xv->PktNumSent++;
+ if (xv->DataLen == 128)
+ xv->PktOut[0] = SOH;
+ else
+ xv->PktOut[0] = STX;
+ xv->PktOut[1] = xv->PktNumSent;
+ xv->PktOut[2] = ~xv->PktNumSent;
+
+ i = 1;
+ while ((i <= xv->DataLen) && fv->FileOpen &&
+ (_lread(fv->FileHandle, &b, 1) == 1)) {
+ xv->PktOut[2 + i] = b;
+ i++;
+ fv->ByteCount++;
+ }
+
+ if (i > 1) {
+ while (i <= xv->DataLen) {
+ xv->PktOut[2 + i] = 0x1A;
+ i++;
+ }
+
+ Check = XCalcCheck(xv, xv->PktOut);
+ if (xv->CheckLen == 1) /* Checksum */
+ xv->PktOut[xv->DataLen + 3] = (BYTE) Check;
+ else {
+ xv->PktOut[xv->DataLen + 3] = HIBYTE(Check);
+ xv->PktOut[xv->DataLen + 4] = LOBYTE(Check);
+ }
+ xv->PktBufCount = 3 + xv->DataLen + xv->CheckLen;
+ } else { /* send EOT */
+ if (fv->FileOpen) {
+ _lclose(fv->FileHandle);
+ fv->FileHandle = 0;
+ fv->FileOpen = FALSE;
+ }
+ xv->PktOut[0] = EOT;
+ xv->PktBufCount = 1;
+ }
+ } else { /* resend packet */
+ xv->PktBufCount = 3 + xv->DataLen + xv->CheckLen;
+ }
+ xv->PktBufPtr = 0;
+ }
+ /* a NAK or C could have arrived while we were buffering. Consume it. */
+ do {
+ i = XRead1Byte(fv, xv, cv, &b);
+ } while (i != 0);
+
+ i = 1;
+ while ((xv->PktBufCount > 0) && (i > 0)) {
+ b = xv->PktOut[xv->PktBufPtr];
+ i = XWrite(fv, xv, cv, &b, 1);
+ if (i > 0) {
+ xv->PktBufCount--;
+ xv->PktBufPtr++;
+ }
+ }
+
+ if (xv->PktBufCount == 0) {
+ SetDlgNum(fv->HWin, IDC_PROTOPKTNUM,
+ xv->PktNumOffset + xv->PktNumSent);
+ SetDlgNum(fv->HWin, IDC_PROTOBYTECOUNT, fv->ByteCount);
+ SetDlgPercent(fv->HWin, IDC_PROTOPERCENT, IDC_PROTOPROGRESS,
+ fv->ByteCount, fv->FileSize, &fv->ProgStat);
+ }
+
+ return TRUE;
+}
Modified: trunk/teraterm/ttpfile/ymodem.c
===================================================================
--- trunk/teraterm/ttpfile/ymodem.c 2010-04-12 12:51:24 UTC (rev 3854)
+++ trunk/teraterm/ttpfile/ymodem.c 2010-04-12 13:43:07 UTC (rev 3855)
@@ -1,794 +1,796 @@
-/* Tera Term
-Copyright(C) 2008-2010 TeraTerm Project
-All rights reserved. */
-
-/* TTFILE.DLL, YMODEM protocol */
-#include "teraterm.h"
-#include "tttypes.h"
-#include "ttftypes.h"
-#include
-#include
-#include
-#include
-
-#include "tt_res.h"
-#include "ttcommon.h"
-#include "ttlib.h"
-#include "ftlib.h"
-#include "dlglib.h"
-
-#include "ymodem.h"
-
-#define TimeOutInit 10
-#define TimeOutC 3
-#define TimeOutShort 10
-#define TimeOutLong 20
-#define TimeOutVeryLong 60
-
-// ?????????YMODEM?? 128 or 1024 byte ????????
-#define SOH_DATALEN 128
-#define STX_DATALEN 1024
-
-int YRead1Byte(PFileVar fv, PYVar yv, PComVar cv, LPBYTE b)
-{
- if (CommRead1Byte(cv,b) == 0)
- return 0;
-
- if (fv->LogFlag)
- {
- if (fv->LogState==0)
- {
- // ???ASCII?ヲ???
- fv->FlushLogLineBuf = 1;
- FTLog1Byte(fv,0);
- fv->FlushLogLineBuf = 0;
-
- fv->LogState = 1;
- fv->LogCount = 0;
- fv->FlushLogLineBuf = 0;
- _lwrite(fv->LogFile,"\015\012<<<\015\012",7);
- }
- FTLog1Byte(fv,*b);
- }
- return 1;
-}
-
-int YWrite(PFileVar fv, PYVar yv, PComVar cv, PCHAR B, int C)
-{
- int i, j;
-
- i = CommBinaryOut(cv,B,C);
- if (fv->LogFlag && (i>0))
- {
- if (fv->LogState != 0)
- {
- // ???ASCII?ヲ???
- fv->FlushLogLineBuf = 1;
- FTLog1Byte(fv,0);
- fv->FlushLogLineBuf = 0;
-
- fv->LogState = 0;
- fv->LogCount = 0;
- _lwrite(fv->LogFile,"\015\012>>>\015\012",7);
- }
- for (j=0 ; j <= i-1 ; j++)
- FTLog1Byte(fv,B[j]);
- }
- return i;
-}
-
-void YSetOpt(PFileVar fv, PYVar yv, WORD Opt)
-{
- char Tmp[21];
-
- yv->YOpt = Opt;
-
- strncpy_s(Tmp, sizeof(Tmp),"YMODEM (", _TRUNCATE);
- switch (yv->YOpt) {
- case Yopt1K: /* YMODEM */
- strncat_s(Tmp,sizeof(Tmp),"1k)",_TRUNCATE);
- yv->DataLen = 1024;
- yv->CheckLen = 2;
- break;
- case YoptG: /* YMODEM-g */
- strncat_s(Tmp,sizeof(Tmp),"-g)",_TRUNCATE);
- yv->DataLen = 1024;
- yv->CheckLen = 2;
- break;
- case YoptSingle: /* YMODEM(-g) single mode */
- strncat_s(Tmp,sizeof(Tmp),"single mode)",_TRUNCATE);
- yv->DataLen = 1024;
- yv->CheckLen = 2;
- break;
- }
- SetDlgItemText(fv->HWin, IDC_PROTOPROT, Tmp);
-}
-
-void YSendNAK(PFileVar fv, PYVar yv, PComVar cv)
-{
- BYTE b;
- int t;
-
- /* flush comm buffer */
- cv->InBuffCount = 0;
- cv->InPtr = 0;
-
- yv->NAKCount--;
- if (yv->NAKCount<0)
- {
- if (yv->NAKMode==YnakC)
- {
- YSetOpt(fv,yv,XoptCheck);
- yv->NAKMode = YnakC;
- yv->NAKCount = 9;
- }
- else {
- YCancel(fv,yv,cv);
- return;
- }
- }
-
- if (yv->NAKMode!=YnakC)
- {
- b = NAK;
- if ((yv->PktNum==0) && (yv->PktNumOffset==0))
- t = TimeOutInit;
- else
- t = yv->TOutLong;
- }
- else {
- b = 'C';
- t = TimeOutC;
- }
- YWrite(fv,yv,cv,&b,1);
- yv->PktReadMode = XpktSOH;
- FTSetTimeOut(fv,t);
-}
-
-WORD YCalcCheck(PYVar yv, PCHAR PktBuf)
-{
- int i;
- WORD Check;
-
- if (yv->CheckLen==1) /* CheckSum */
- {
- /* Calc sum */
- Check = 0;
- for (i = 0 ; i <= yv->DataLen-1 ; i++)
- Check = Check + (BYTE)(PktBuf[3+i]);
- return (Check & 0xff);
- }
- else { /* CRC */
- Check = 0;
- for (i = 0 ; i <= yv->DataLen-1 ; i++)
- Check = UpdateCRC(PktBuf[3+i],Check);
- return (Check);
- }
-}
-
-BOOL YCheckPacket(PYVar yv)
-{
- WORD Check;
-
- Check = YCalcCheck(yv,yv->PktIn);
- if (yv->CheckLen==1) /* Checksum */
- return ((BYTE)Check==yv->PktIn[yv->DataLen+3]);
- else
- return ((HIBYTE(Check)==yv->PktIn[yv->DataLen+3]) &&
- (LOBYTE(Check)==yv->PktIn[yv->DataLen+4]));
-}
-
-static void initialize_file_info(PFileVar fv, PYVar yv)
-{
- if (yv->YMode == IdYSend) {
- if (fv->FileOpen) {
- _lclose(fv->FileHandle);
- }
- fv->FileHandle = _lopen(fv->FullName,OF_READ);
- fv->FileSize = GetFSize(fv->FullName);
- } else {
- fv->FileHandle = -1;
- fv->FileSize = 0;
- }
- fv->FileOpen = fv->FileHandle>0;
-
- if (yv->YMode == IdYSend) {
- InitDlgProgress(fv->HWin, IDC_PROTOPROGRESS, &fv->ProgStat);
- } else {
- fv->ProgStat = -1;
- }
- SetDlgItemText(fv->HWin, IDC_PROTOFNAME, &(fv->FullName[fv->DirLen]));
-
- yv->PktNumOffset = 0;
- yv->PktNum = 0;
- yv->PktNumSent = 0;
- yv->PktBufCount = 0;
- yv->CRRecv = FALSE;
- fv->ByteCount = 0;
- yv->SendFileInfo = 0;
- yv->SendEot = 0;
- yv->LastSendEot = 0;
-}
-
-void YInit
-(PFileVar fv, PYVar yv, PComVar cv, PTTSet ts)
-{
- char inistr[MAXPATHLEN + 10];
-
- if (yv->YMode == IdYSend) {
- if (!GetNextFname(fv)) {
- return;
- }
- }
-
- fv->LogFlag = ((ts->LogFlag & LOG_Y)!=0);
- if (fv->LogFlag)
- fv->LogFile = _lcreat("YMODEM.LOG",0);
- fv->LogState = 0;
- fv->LogCount = 0;
-
- SetWindowText(fv->HWin, fv->DlgCaption);
-
- initialize_file_info(fv, yv);
-
- if (cv->PortType==IdTCPIP)
- {
- yv->TOutShort = TimeOutVeryLong;
- yv->TOutLong = TimeOutVeryLong;
- }
- else {
- yv->TOutShort = TimeOutShort;
- yv->TOutLong = TimeOutLong;
- }
-
- YSetOpt(fv,yv,yv->YOpt);
-
- if (yv->YOpt == Yopt1K)
- {
- yv->NAKMode = YnakC;
- yv->NAKCount = 10;
- }
- else {
- yv->NAKMode = YnakG;
- yv->NAKCount = 10;
- }
-
- if (fv->LogFlag) {
- char buf[128];
- time_t tm = time(NULL);
-
- _snprintf_s(buf, sizeof(buf), _TRUNCATE, "YMODEM %s start: %s\n",
- yv->YMode == IdYSend ? "Send" : "Recv",
- ctime(&tm)
- );
- _lwrite(fv->LogFile, buf, strlen(buf));
- }
-
- switch (yv->YMode) {
- case IdYSend:
- yv->TextFlag = 0;
-
- // ???????????"rb ?????"?ゥ???????B(2007.12.20 yutaka)
- //strcpy(ts->YModemRcvCommand, "rb");
- if (ts->YModemRcvCommand[0] != '\0') {
- _snprintf_s(inistr, sizeof(inistr), _TRUNCATE, "%s\015",
- ts->YModemRcvCommand);
- YWrite(fv,yv,cv, inistr , strlen(inistr));
- }
-
- FTSetTimeOut(fv,TimeOutVeryLong);
- break;
-
- case IdYReceive:
-#if 0 // for debug
- strcpy(inistr, "sb -b svnrev.exe lrzsz-0.12.20.tar.gz\r\n");
-// strcpy(inistr, "sb url3.txt url4.txt url5.txt\r\n");
- YWrite(fv,yv,cv, inistr , strlen(inistr));
-#endif
- yv->TextFlag = 0;
-
- YSendNAK(fv,yv,cv);
-
- break;
- }
-}
-
-void YCancel(PFileVar fv, PYVar yv, PComVar cv)
-{
- BYTE b;
-
- b = CAN;
- YWrite(fv,yv,cv,&b,1);
- yv->YMode = 0; // quit
-}
-
-void YTimeOutProc(PFileVar fv, PYVar yv, PComVar cv)
-{
- switch (yv->YMode) {
- case IdXSend:
- yv->YMode = 0; // quit
- break;
- case IdXReceive:
- YSendNAK(fv,yv,cv);
- break;
- }
-}
-
-// YMODEM????????????????ProtoParse()??????????B
-//
-// +-------+-------+--------+---------+-----+
-// |Header |Block# |1-Block#| Payload | CRC |
-// +-------+-------+--------+---------+-----+
-// 1 1 1 128/1024 2 byte
-//
-// return TRUE: ???????
-// FALSE: ????
-BOOL YReadPacket(PFileVar fv, PYVar yv, PComVar cv)
-{
- BYTE b, d;
- int i, c, nak;
- BOOL GetPkt;
-
- c = YRead1Byte(fv,yv,cv,&b);
-
- GetPkt = FALSE;
-
- while ((c>0) && (! GetPkt))
- {
- switch (yv->PktReadMode) {
- case XpktSOH:
- // SOH ? STX ????????????
- if (b==SOH)
- {
- yv->PktIn[0] = b;
- yv->PktReadMode = XpktBLK;
- yv->DataLen = SOH_DATALEN;
- FTSetTimeOut(fv,yv->TOutShort);
- }
- else if (b==STX)
- {
- yv->PktIn[0] = b;
- yv->PktReadMode = XpktBLK;
- yv->DataLen = STX_DATALEN;
- FTSetTimeOut(fv,yv->TOutShort);
- }
- else if (b==EOT)
- {
- // EOT?????1????????????????ヲ??
- if (fv->FileOpen) {
- fv->FileOpen = 0;
- _lclose(fv->FileHandle);
- fv->FileHandle = -1;
- }
-
- initialize_file_info(fv, yv);
-
- // EOT????ACK???
- b = ACK;
- YWrite(fv,yv,cv,&b, 1);
-
- // ??????????????'C'????
- YSendNAK(fv,yv,cv);
-
- return TRUE;
- }
- else {
- /* flush comm buffer */
- cv->InBuffCount = 0;
- cv->InPtr = 0;
- return TRUE;
- }
- break;
- case XpktBLK:
- yv->PktIn[1] = b;
- yv->PktReadMode = XpktBLK2;
- FTSetTimeOut(fv,yv->TOutShort);
- break;
- case XpktBLK2:
- nak = 1;
- yv->PktIn[2] = b;
- if ((b ^ yv->PktIn[1]) == 0xff) {
- nak = 0;
- if (yv->SendFileInfo) {
- if (yv->PktIn[1] == (BYTE)(yv->PktNum + 1)) // ?????????
- nak = 0;
- }
- }
-
- if (nak == 0)
- {
- yv->PktBufPtr = 3;
- yv->PktBufCount = yv->DataLen + yv->CheckLen;
- yv->PktReadMode = XpktDATA;
- FTSetTimeOut(fv,yv->TOutShort);
- }
- else
- YSendNAK(fv,yv,cv);
- break;
- case XpktDATA:
- yv->PktIn[yv->PktBufPtr] = b;
- yv->PktBufPtr++;
- yv->PktBufCount--;
- GetPkt = yv->PktBufCount==0;
- if (GetPkt)
- {
- FTSetTimeOut(fv,yv->TOutLong);
- yv->PktReadMode = XpktSOH;
- }
- else
- FTSetTimeOut(fv,yv->TOutShort);
- break;
- }
-
- if (! GetPkt) c = YRead1Byte(fv,yv,cv,&b);
- }
-
- if (! GetPkt) return TRUE;
-
- GetPkt = YCheckPacket(yv);
- if (! GetPkt)
- {
- YSendNAK(fv,yv,cv);
- return TRUE;
- }
-
- // ????????????????????ヲ??
- if (yv->PktIn[1] == 0x00 && yv->PktIn[2] == 0xFF &&
- yv->SendFileInfo == 0
- ) {
- c = yv->DataLen;
- while ((c>0) && (yv->PktIn[2+c]==0x00))
- c--;
- if (c == 0) {
- b = ACK;
- YWrite(fv,yv,cv,&b, 1);
- fv->Success = TRUE;
- return FALSE;
- }
- }
-
- d = yv->PktIn[1] - yv->PktNum;
- if (d>1)
- {
- YCancel(fv,yv,cv);
- return FALSE;
- }
-
- /* send ACK */
- b = ACK;
- YWrite(fv,yv,cv,&b, 1);
- yv->NAKMode = YnakC;
- yv->NAKCount = 10;
-
- // ?????????A??????
- if (yv->SendFileInfo &&
- yv->PktIn[1] == (BYTE)(yv->PktNum)) {
- return TRUE;
- }
-
- yv->PktNum = yv->PktIn[1];
-
- // YMODEM???Ablock#0????????v????
- if (d == 0 &&
- yv->SendFileInfo == 0) {
- long modtime;
- long bytes_total;
- int mode;
- int ret;
- BYTE *p;
- char *name, *nameend;
-
- p = &(yv->PktIn[3]);
- name = p;
- strncpy_s(fv->FullName, sizeof(fv->FullName), name, _TRUNCATE);
- nameend = name + 1 + strlen(name);
- if (*nameend) {
- ret = sscanf(nameend, "%ld%lo%o", &bytes_total, &modtime, &mode);
- if (ret == 3) {
- fv->FileSize = bytes_total;
- }
- }
- fv->FileHandle = _lcreat(fv->FullName,0);
- fv->FileOpen = fv->FileHandle>0;
-
- fv->DirLen = 0;
- SetDlgItemText(fv->HWin, IDC_PROTOFNAME, &(fv->FullName[fv->DirLen]));
-
- yv->SendFileInfo = 1;
-
- return TRUE;
- }
-
- if (yv->PktNum==0)
- yv->PktNumOffset = yv->PktNumOffset + 256;
-
- c = yv->DataLen;
- if (yv->TextFlag>0)
- while ((c>0) && (yv->PktIn[2+c]==0x1A))
- c--;
-
- // ??u???????????????- if (fv->ByteCount + c > fv->FileSize) {
- c = fv->FileSize - fv->ByteCount;
- }
-
- if (yv->TextFlag>0)
- for (i = 0 ; i <= c-1 ; i++)
- {
- b = yv->PktIn[3+i];
- if ((b==LF) && (! yv->CRRecv))
- _lwrite(fv->FileHandle,"\015",1);
- if (yv->CRRecv && (b!=LF))
- _lwrite(fv->FileHandle,"\012",1);
- yv->CRRecv = b==CR;
- _lwrite(fv->FileHandle,&b,1);
- }
- else
- _lwrite(fv->FileHandle, &(yv->PktIn[3]), c);
-
- fv->ByteCount = fv->ByteCount + c;
-
- SetDlgNum(fv->HWin, IDC_PROTOPKTNUM, yv->PktNumOffset+yv->PktNum);
- SetDlgNum(fv->HWin, IDC_PROTOBYTECOUNT, fv->ByteCount);
-
- FTSetTimeOut(fv,yv->TOutLong);
-
- return TRUE;
-}
-
-// ??????(local-to-remote)???YMODEM????????????????????????B
-BOOL YSendPacket(PFileVar fv, PYVar yv, PComVar cv)
-{
- BYTE b;
- int i;
- BOOL SendFlag;
- WORD Check;
- BYTE firstch, lastrx;
-
- SendFlag = FALSE;
- if (yv->PktBufCount==0)
- {
- i = YRead1Byte(fv,yv,cv,&b);
- do {
- if (i==0) return TRUE;
- firstch = b;
- switch (b) {
- case ACK:
- // 1???EOT????ACK?????1??????????????B
- if (yv->SendEot) {
- yv->SendEot = 0;
-
- // ????????????????A?????????????v??????
- if (!GetNextFname(fv)) {
- yv->LastSendEot = 1;
- break;
- } else {
- initialize_file_info(fv, yv);
- }
- }
-
- if (! fv->FileOpen) // ????????????????A??I??
- {
- fv->Success = TRUE;
- return FALSE;
- }
- else if (yv->PktNumSent==(BYTE)(yv->PktNum+1)) // ?????????
- {
- yv->PktNum = yv->PktNumSent;
- if (yv->PktNum==0)
- yv->PktNumOffset = yv->PktNumOffset + 256;
- SendFlag = TRUE;
- }
- break;
-
- case NAK:
- SendFlag = TRUE;
- break;
-
- case CAN:
- break;
-
- case 0x43: // 'C'(43h)
- case 0x47: // 'G'(47h)
- // 'C'????????????????????
- if ((yv->PktNum==0) && (yv->PktNumOffset==0))
- {
- SendFlag = TRUE;
- }
- else if (yv->LastSendEot) {
- SendFlag = TRUE;
- }
- break;
- }
- if (! SendFlag) i = YRead1Byte(fv,yv,cv,&b);
- } while (!SendFlag);
- // reset timeout timer
- FTSetTimeOut(fv,TimeOutVeryLong);
-
- // ???????????????フ???
- do {
- lastrx = firstch;
- i = YRead1Byte(fv,yv,cv,&b);
- if (i != 0) {
- firstch = b;
- if (firstch == CAN && lastrx == CAN) {
- // CAN(0x18)????????????????ク??????
- // ?????????????????????????B
- // (2010.3.23 yutaka)
- fv->Success = FALSE; // failure
- return FALSE;
- }
- }
- } while (i != 0);
-
- if (yv->LastSendEot) { // ?????????????????????????????????
- yv->LastSendEot = 0;
-
- if (yv->DataLen == SOH_DATALEN)
- yv->PktOut[0] = SOH;
- else
- yv->PktOut[0] = STX;
- yv->PktOut[1] = 0;
- yv->PktOut[2] = ~0;
-
- i = 0;
- while (i < yv->DataLen)
- {
- yv->PktOut[i+3] = 0x00;
- i++;
- }
-
- Check = YCalcCheck(yv,yv->PktOut);
- if (yv->CheckLen==1) /* Checksum */
- yv->PktOut[yv->DataLen+3] = (BYTE)Check;
- else {
- yv->PktOut[yv->DataLen+3] = HIBYTE(Check);
- yv->PktOut[yv->DataLen+4] = LOBYTE(Check);
- }
- yv->PktBufCount = 3 + yv->DataLen + yv->CheckLen;
-
- }
- else if (yv->PktNumSent==yv->PktNum) /* make a new packet */
- {
- BYTE *dataptr = &yv->PktOut[3];
- int eot = 0; // End Of Transfer
-
- if (yv->DataLen == SOH_DATALEN)
- yv->PktOut[0] = SOH;
- else
- yv->PktOut[0] = STX;
- yv->PktOut[1] = yv->PktNumSent;
- yv->PktOut[2] = ~ yv->PktNumSent;
-
- // ???????????????YMODEM??"0"???????
- yv->PktNumSent++;
-
- // ????0
- if (yv->SendFileInfo == 0) { // ????????M
- struct _stat st;
- int ret, total;
- BYTE buf[1024 + 10];
-
- yv->SendFileInfo = 1; // ???????on
-
- /* timestamp */
- _stat(fv->FullName, &st);
-
- ret = _snprintf_s(buf, sizeof(buf), _TRUNCATE, "%s",
- &(fv->FullName[fv->DirLen]));
- buf[ret] = 0x00; // NUL
- total = ret + 1;
-
- ret = _snprintf_s(&(buf[total]), sizeof(buf) - total, _TRUNCATE, "%lu %lo %o",
- fv->FileSize, (long)st.st_mtime, 0644|_S_IFREG);
- total += ret;
-
- i = total;
- while (i <= yv->DataLen)
- {
- buf[i] = 0x00;
- i++;
- }
-
- // ??????
- memcpy(dataptr, buf, yv->DataLen);
-
- } else {
- i = 1;
- while ((i<=yv->DataLen) && fv->FileOpen &&
- (_lread(fv->FileHandle,&b,1)==1))
- {
- yv->PktOut[2+i] = b;
- i++;
- fv->ByteCount++;
- }
-
-
- if (i>1)
- {
- while (i<=yv->DataLen)
- {
- yv->PktOut[2+i] = 0x1A;
- i++;
- }
-
- }
- else { /* send EOT */
- if (fv->FileOpen)
- {
- _lclose(fv->FileHandle);
- fv->FileHandle = 0;
- fv->FileOpen = FALSE;
- }
-
- eot = 1;
- }
-
- }
-
- if (eot == 0) { // ???????
- Check = YCalcCheck(yv,yv->PktOut);
- if (yv->CheckLen==1) /* Checksum */
- yv->PktOut[yv->DataLen+3] = (BYTE)Check;
- else {
- yv->PktOut[yv->DataLen+3] = HIBYTE(Check);
- yv->PktOut[yv->DataLen+4] = LOBYTE(Check);
- }
- yv->PktBufCount = 3 + yv->DataLen + yv->CheckLen;
-
- } else { // EOT
- yv->PktOut[0] = EOT;
- yv->PktBufCount = 1;
-
- yv->SendEot = 1; // EOT???on???NAK??????
- yv->LastSendEot = 0;
- }
-
- }
- else { /* resend packet */
- yv->PktBufCount = 3 + yv->DataLen + yv->CheckLen;
- }
-
- yv->PktBufPtr = 0;
- }
- /* a NAK or C could have arrived while we were buffering. Consume it. */
- // ???????????????フ???
- do {
- lastrx = firstch;
- i = YRead1Byte(fv,yv,cv,&b);
- if (i != 0) {
- firstch = b;
- if (firstch == CAN && lastrx == CAN) {
- // CAN(0x18)????????????????ク??????
- // ?????????????????????????B
- // (2010.3.23 yutaka)
- fv->Success = FALSE; // failure
- return FALSE;
- }
- }
- } while (i != 0);
-
-
- i = 1;
- while ((yv->PktBufCount>0) && (i>0))
- {
- b = yv->PktOut[yv->PktBufPtr];
- i = YWrite(fv,yv,cv,&b, 1);
- if (i>0)
- {
- yv->PktBufCount--;
- yv->PktBufPtr++;
- }
- }
-
- if (yv->PktBufCount==0)
- {
- SetDlgNum(fv->HWin, IDC_PROTOPKTNUM,
- yv->PktNumOffset+yv->PktNumSent);
- SetDlgNum(fv->HWin, IDC_PROTOBYTECOUNT, fv->ByteCount);
- SetDlgPercent(fv->HWin, IDC_PROTOPERCENT, IDC_PROTOPROGRESS,
- fv->ByteCount, fv->FileSize, &fv->ProgStat);
- }
-
- return TRUE;
-}
+/* Tera Term
+Copyright(C) 2008-2010 TeraTerm Project
+All rights reserved. */
+
+/* TTFILE.DLL, YMODEM protocol */
+#include "teraterm.h"
+#include "tttypes.h"
+#include "ttftypes.h"
+#include
+#include
+#include
+#include
+
+#include "tt_res.h"
+#include "ttcommon.h"
+#include "ttlib.h"
+#include "ftlib.h"
+#include "dlglib.h"
+
+#include "ymodem.h"
+
+#define TimeOutInit 10
+#define TimeOutC 3
+#define TimeOutShort 10
+#define TimeOutLong 20
+#define TimeOutVeryLong 60
+
+// ?????????YMODEM?? 128 or 1024 byte ????????
+#define SOH_DATALEN 128
+#define STX_DATALEN 1024
+
+int YRead1Byte(PFileVar fv, PYVar yv, PComVar cv, LPBYTE b)
+{
+ if (CommRead1Byte(cv,b) == 0)
+ return 0;
+
+ if (fv->LogFlag)
+ {
+ if (fv->LogState==0)
+ {
+ // ???ASCII?ヲ???
+ fv->FlushLogLineBuf = 1;
+ FTLog1Byte(fv,0);
+ fv->FlushLogLineBuf = 0;
+
+ fv->LogState = 1;
+ fv->LogCount = 0;
+ fv->FlushLogLineBuf = 0;
+ _lwrite(fv->LogFile,"\015\012<<<\015\012",7);
+ }
+ FTLog1Byte(fv,*b);
+ }
+ return 1;
+}
+
+int YWrite(PFileVar fv, PYVar yv, PComVar cv, PCHAR B, int C)
+{
+ int i, j;
+
+ i = CommBinaryOut(cv,B,C);
+ if (fv->LogFlag && (i>0))
+ {
+ if (fv->LogState != 0)
+ {
+ // ???ASCII?ヲ???
+ fv->FlushLogLineBuf = 1;
+ FTLog1Byte(fv,0);
+ fv->FlushLogLineBuf = 0;
+
+ fv->LogState = 0;
+ fv->LogCount = 0;
+ _lwrite(fv->LogFile,"\015\012>>>\015\012",7);
+ }
+ for (j=0 ; j <= i-1 ; j++)
+ FTLog1Byte(fv,B[j]);
+ }
+ return i;
+}
+
+void YSetOpt(PFileVar fv, PYVar yv, WORD Opt)
+{
+ char Tmp[21];
+
+ yv->YOpt = Opt;
+
+ strncpy_s(Tmp, sizeof(Tmp),"YMODEM (", _TRUNCATE);
+ switch (yv->YOpt) {
+ case Yopt1K: /* YMODEM */
+ strncat_s(Tmp,sizeof(Tmp),"1k)",_TRUNCATE);
+ yv->DataLen = 1024;
+ yv->CheckLen = 2;
+ break;
+ case YoptG: /* YMODEM-g */
+ strncat_s(Tmp,sizeof(Tmp),"-g)",_TRUNCATE);
+ yv->DataLen = 1024;
+ yv->CheckLen = 2;
+ break;
+ case YoptSingle: /* YMODEM(-g) single mode */
+ strncat_s(Tmp,sizeof(Tmp),"single mode)",_TRUNCATE);
+ yv->DataLen = 1024;
+ yv->CheckLen = 2;
+ break;
+ }
+ SetDlgItemText(fv->HWin, IDC_PROTOPROT, Tmp);
+}
+
+void YSendNAK(PFileVar fv, PYVar yv, PComVar cv)
+{
+ BYTE b;
+ int t;
+
+ /* flush comm buffer */
+ cv->InBuffCount = 0;
+ cv->InPtr = 0;
+
+ yv->NAKCount--;
+ if (yv->NAKCount<0)
+ {
+ if (yv->NAKMode==YnakC)
+ {
+ YSetOpt(fv,yv,XoptCheck);
+ yv->NAKMode = YnakC;
+ yv->NAKCount = 9;
+ }
+ else {
+ YCancel(fv,yv,cv);
+ return;
+ }
+ }
+
+ if (yv->NAKMode!=YnakC)
+ {
+ b = NAK;
+ if ((yv->PktNum==0) && (yv->PktNumOffset==0))
+ t = TimeOutInit;
+ else
+ t = yv->TOutLong;
+ }
+ else {
+ b = 'C';
+ t = TimeOutC;
+ }
+ YWrite(fv,yv,cv,&b,1);
+ yv->PktReadMode = XpktSOH;
+ FTSetTimeOut(fv,t);
+}
+
+WORD YCalcCheck(PYVar yv, PCHAR PktBuf)
+{
+ int i;
+ WORD Check;
+
+ if (yv->CheckLen==1) /* CheckSum */
+ {
+ /* Calc sum */
+ Check = 0;
+ for (i = 0 ; i <= yv->DataLen-1 ; i++)
+ Check = Check + (BYTE)(PktBuf[3+i]);
+ return (Check & 0xff);
+ }
+ else { /* CRC */
+ Check = 0;
+ for (i = 0 ; i <= yv->DataLen-1 ; i++)
+ Check = UpdateCRC(PktBuf[3+i],Check);
+ return (Check);
+ }
+}
+
+BOOL YCheckPacket(PYVar yv)
+{
+ WORD Check;
+
+ Check = YCalcCheck(yv,yv->PktIn);
+ if (yv->CheckLen==1) /* Checksum */
+ return ((BYTE)Check==yv->PktIn[yv->DataLen+3]);
+ else
+ return ((HIBYTE(Check)==yv->PktIn[yv->DataLen+3]) &&
+ (LOBYTE(Check)==yv->PktIn[yv->DataLen+4]));
+}
+
+static void initialize_file_info(PFileVar fv, PYVar yv)
+{
+ if (yv->YMode == IdYSend) {
+ if (fv->FileOpen) {
+ _lclose(fv->FileHandle);
+ }
+ fv->FileHandle = _lopen(fv->FullName,OF_READ);
+ fv->FileSize = GetFSize(fv->FullName);
+ } else {
+ fv->FileHandle = -1;
+ fv->FileSize = 0;
+ }
+ fv->FileOpen = fv->FileHandle>0;
+
+ if (yv->YMode == IdYSend) {
+ InitDlgProgress(fv->HWin, IDC_PROTOPROGRESS, &fv->ProgStat);
+ } else {
+ fv->ProgStat = -1;
+ }
+ SetDlgItemText(fv->HWin, IDC_PROTOFNAME, &(fv->FullName[fv->DirLen]));
+
+ yv->PktNumOffset = 0;
+ yv->PktNum = 0;
+ yv->PktNumSent = 0;
+ yv->PktBufCount = 0;
+ yv->CRRecv = FALSE;
+ fv->ByteCount = 0;
+ yv->SendFileInfo = 0;
+ yv->SendEot = 0;
+ yv->LastSendEot = 0;
+}
+
+void YInit
+(PFileVar fv, PYVar yv, PComVar cv, PTTSet ts)
+{
+ char inistr[MAXPATHLEN + 10];
+
+ if (yv->YMode == IdYSend) {
+ if (!GetNextFname(fv)) {
+ return;
+ }
+ }
+
+ fv->LogFlag = ((ts->LogFlag & LOG_Y)!=0);
+ if (fv->LogFlag)
+ fv->LogFile = _lcreat("YMODEM.LOG",0);
+ fv->LogState = 0;
+ fv->LogCount = 0;
+
+ SetWindowText(fv->HWin, fv->DlgCaption);
+
+ initialize_file_info(fv, yv);
+
+ if (cv->PortType==IdTCPIP)
+ {
+ yv->TOutShort = TimeOutVeryLong;
+ yv->TOutLong = TimeOutVeryLong;
+ }
+ else {
+ yv->TOutShort = TimeOutShort;
+ yv->TOutLong = TimeOutLong;
+ }
+
+ YSetOpt(fv,yv,yv->YOpt);
+
+ if (yv->YOpt == Yopt1K)
+ {
+ yv->NAKMode = YnakC;
+ yv->NAKCount = 10;
+ }
+ else {
+ yv->NAKMode = YnakG;
+ yv->NAKCount = 10;
+ }
+
+ if (fv->LogFlag) {
+ char buf[128];
+ time_t tm = time(NULL);
+
+ _snprintf_s(buf, sizeof(buf), _TRUNCATE, "YMODEM %s start: %s\n",
+ yv->YMode == IdYSend ? "Send" : "Recv",
+ ctime(&tm)
+ );
+ _lwrite(fv->LogFile, buf, strlen(buf));
+ }
+
+ switch (yv->YMode) {
+ case IdYSend:
+ yv->TextFlag = 0;
+
+ // ???????????"rb ?????"?ゥ???????B(2007.12.20 yutaka)
+ //strcpy(ts->YModemRcvCommand, "rb");
+ if (ts->YModemRcvCommand[0] != '\0') {
+ _snprintf_s(inistr, sizeof(inistr), _TRUNCATE, "%s\015",
+ ts->YModemRcvCommand);
+ YWrite(fv,yv,cv, inistr , strlen(inistr));
+ }
+
+ FTSetTimeOut(fv,TimeOutVeryLong);
+ break;
+
+ case IdYReceive:
+#if 0 // for debug
+ strcpy(inistr, "sb -b svnrev.exe lrzsz-0.12.20.tar.gz\r\n");
+// strcpy(inistr, "sb url3.txt url4.txt url5.txt\r\n");
+ YWrite(fv,yv,cv, inistr , strlen(inistr));
+#endif
+ yv->TextFlag = 0;
+
+ YSendNAK(fv,yv,cv);
+
+ break;
+ }
+}
+
+void YCancel(PFileVar fv, PYVar yv, PComVar cv)
+{
+ // five cancels & five backspaces per spec
+ BYTE cancel[] = { CAN, CAN, CAN, CAN, CAN, BS, BS, BS, BS, BS };
+
+ YWrite(fv,yv,cv, (PCHAR)&cancel, sizeof(cancel));
+ yv->YMode = 0; // quit
+}
+
+void YTimeOutProc(PFileVar fv, PYVar yv, PComVar cv)
+{
+ switch (yv->YMode) {
+ case IdXSend:
+ yv->YMode = 0; // quit
+ break;
+ case IdXReceive:
+ YSendNAK(fv,yv,cv);
+ break;
+ }
+}
+
+// YMODEM????????????????ProtoParse()??????????B
+//
+// +-------+-------+--------+---------+-----+
+// |Header |Block# |1-Block#| Payload | CRC |
+// +-------+-------+--------+---------+-----+
+// 1 1 1 128/1024 2 byte
+//
+// return TRUE: ???????
+// FALSE: ????
+BOOL YReadPacket(PFileVar fv, PYVar yv, PComVar cv)
+{
+ BYTE b, d;
+ int i, c, nak;
+ BOOL GetPkt;
+
+ c = YRead1Byte(fv,yv,cv,&b);
+
+ GetPkt = FALSE;
+
+ while ((c>0) && (! GetPkt))
+ {
+ switch (yv->PktReadMode) {
+ case XpktSOH:
+ // SOH ? STX ????????????
+ if (b==SOH)
+ {
+ yv->PktIn[0] = b;
+ yv->PktReadMode = XpktBLK;
+ yv->DataLen = SOH_DATALEN;
+ FTSetTimeOut(fv,yv->TOutShort);
+ }
+ else if (b==STX)
+ {
+ yv->PktIn[0] = b;
+ yv->PktReadMode = XpktBLK;
+ yv->DataLen = STX_DATALEN;
+ FTSetTimeOut(fv,yv->TOutShort);
+ }
+ else if (b==EOT)
+ {
+ // EOT?????1????????????????ヲ??
+ if (fv->FileOpen) {
+ fv->FileOpen = 0;
+ _lclose(fv->FileHandle);
+ fv->FileHandle = -1;
+ }
+
+ initialize_file_info(fv, yv);
+
+ // EOT????ACK???
+ b = ACK;
+ YWrite(fv,yv,cv,&b, 1);
+
+ // ??????????????'C'????
+ YSendNAK(fv,yv,cv);
+
+ return TRUE;
+ }
+ else {
+ /* flush comm buffer */
+ cv->InBuffCount = 0;
+ cv->InPtr = 0;
+ return TRUE;
+ }
+ break;
+ case XpktBLK:
+ yv->PktIn[1] = b;
+ yv->PktReadMode = XpktBLK2;
+ FTSetTimeOut(fv,yv->TOutShort);
+ break;
+ case XpktBLK2:
+ nak = 1;
+ yv->PktIn[2] = b;
+ if ((b ^ yv->PktIn[1]) == 0xff) {
+ nak = 0;
+ if (yv->SendFileInfo) {
+ if (yv->PktIn[1] == (BYTE)(yv->PktNum + 1)) // ?????????
+ nak = 0;
+ }
+ }
+
+ if (nak == 0)
+ {
+ yv->PktBufPtr = 3;
+ yv->PktBufCount = yv->DataLen + yv->CheckLen;
+ yv->PktReadMode = XpktDATA;
+ FTSetTimeOut(fv,yv->TOutShort);
+ }
+ else
+ YSendNAK(fv,yv,cv);
+ break;
+ case XpktDATA:
+ yv->PktIn[yv->PktBufPtr] = b;
+ yv->PktBufPtr++;
+ yv->PktBufCount--;
+ GetPkt = yv->PktBufCount==0;
+ if (GetPkt)
+ {
+ FTSetTimeOut(fv,yv->TOutLong);
+ yv->PktReadMode = XpktSOH;
+ }
+ else
+ FTSetTimeOut(fv,yv->TOutShort);
+ break;
+ }
+
+ if (! GetPkt) c = YRead1Byte(fv,yv,cv,&b);
+ }
+
+ if (! GetPkt) return TRUE;
+
+ GetPkt = YCheckPacket(yv);
+ if (! GetPkt)
+ {
+ YSendNAK(fv,yv,cv);
+ return TRUE;
+ }
+
+ // ????????????????????ヲ??
+ if (yv->PktIn[1] == 0x00 && yv->PktIn[2] == 0xFF &&
+ yv->SendFileInfo == 0
+ ) {
+ c = yv->DataLen;
+ while ((c>0) && (yv->PktIn[2+c]==0x00))
+ c--;
+ if (c == 0) {
+ b = ACK;
+ YWrite(fv,yv,cv,&b, 1);
+ fv->Success = TRUE;
+ return FALSE;
+ }
+ }
+
+ d = yv->PktIn[1] - yv->PktNum;
+ if (d>1)
+ {
+ YCancel(fv,yv,cv);
+ return FALSE;
+ }
+
+ /* send ACK */
+ b = ACK;
+ YWrite(fv,yv,cv,&b, 1);
+ yv->NAKMode = YnakC;
+ yv->NAKCount = 10;
+
+ // ?????????A??????
+ if (yv->SendFileInfo &&
+ yv->PktIn[1] == (BYTE)(yv->PktNum)) {
+ return TRUE;
+ }
+
+ yv->PktNum = yv->PktIn[1];
+
+ // YMODEM???Ablock#0????????v????
+ if (d == 0 &&
+ yv->SendFileInfo == 0) {
+ long modtime;
+ long bytes_total;
+ int mode;
+ int ret;
+ BYTE *p;
+ char *name, *nameend;
+
+ p = &(yv->PktIn[3]);
+ name = p;
+ strncpy_s(fv->FullName, sizeof(fv->FullName), name, _TRUNCATE);
+ nameend = name + 1 + strlen(name);
+ if (*nameend) {
+ ret = sscanf(nameend, "%ld%lo%o", &bytes_total, &modtime, &mode);
+ if (ret == 3) {
+ fv->FileSize = bytes_total;
+ }
+ }
+ fv->FileHandle = _lcreat(fv->FullName,0);
+ fv->FileOpen = fv->FileHandle>0;
+
+ fv->DirLen = 0;
+ SetDlgItemText(fv->HWin, IDC_PROTOFNAME, &(fv->FullName[fv->DirLen]));
+
+ yv->SendFileInfo = 1;
+
+ return TRUE;
+ }
+
+ if (yv->PktNum==0)
+ yv->PktNumOffset = yv->PktNumOffset + 256;
+
+ c = yv->DataLen;
+ if (yv->TextFlag>0)
+ while ((c>0) && (yv->PktIn[2+c]==0x1A))
+ c--;
+
+ // ??u???????????????+ if (fv->ByteCount + c > fv->FileSize) {
+ c = fv->FileSize - fv->ByteCount;
+ }
+
+ if (yv->TextFlag>0)
+ for (i = 0 ; i <= c-1 ; i++)
+ {
+ b = yv->PktIn[3+i];
+ if ((b==LF) && (! yv->CRRecv))
+ _lwrite(fv->FileHandle,"\015",1);
+ if (yv->CRRecv && (b!=LF))
+ _lwrite(fv->FileHandle,"\012",1);
+ yv->CRRecv = b==CR;
+ _lwrite(fv->FileHandle,&b,1);
+ }
+ else
+ _lwrite(fv->FileHandle, &(yv->PktIn[3]), c);
+
+ fv->ByteCount = fv->ByteCount + c;
+
+ SetDlgNum(fv->HWin, IDC_PROTOPKTNUM, yv->PktNumOffset+yv->PktNum);
+ SetDlgNum(fv->HWin, IDC_PROTOBYTECOUNT, fv->ByteCount);
+
+ FTSetTimeOut(fv,yv->TOutLong);
+
+ return TRUE;
+}
+
+// ??????(local-to-remote)???YMODEM????????????????????????B
+BOOL YSendPacket(PFileVar fv, PYVar yv, PComVar cv)
+{
+ BYTE b;
+ int i;
+ BOOL SendFlag;
+ WORD Check;
+ BYTE firstch, lastrx;
+
+ SendFlag = FALSE;
+ if (yv->PktBufCount==0)
+ {
+ i = YRead1Byte(fv,yv,cv,&b);
+ do {
+ if (i==0) return TRUE;
+ firstch = b;
+ switch (b) {
+ case ACK:
+ // 1???EOT????ACK?????1??????????????B
+ if (yv->SendEot) {
+ yv->SendEot = 0;
+
+ // ????????????????A?????????????v??????
+ if (!GetNextFname(fv)) {
+ yv->LastSendEot = 1;
+ break;
+ } else {
+ initialize_file_info(fv, yv);
+ }
+ }
+
+ if (! fv->FileOpen) // ????????????????A??I??
+ {
+ fv->Success = TRUE;
+ return FALSE;
+ }
+ else if (yv->PktNumSent==(BYTE)(yv->PktNum+1)) // ?????????
+ {
+ yv->PktNum = yv->PktNumSent;
+ if (yv->PktNum==0)
+ yv->PktNumOffset = yv->PktNumOffset + 256;
+ SendFlag = TRUE;
+ }
+ break;
+
+ case NAK:
+ SendFlag = TRUE;
+ break;
+
+ case CAN:
+ break;
+
+ case 0x43: // 'C'(43h)
+ case 0x47: // 'G'(47h)
+ // 'C'????????????????????
+ if ((yv->PktNum==0) && (yv->PktNumOffset==0))
+ {
+ SendFlag = TRUE;
+ }
+ else if (yv->LastSendEot) {
+ SendFlag = TRUE;
+ }
+ break;
+ }
+ if (! SendFlag) i = YRead1Byte(fv,yv,cv,&b);
+ } while (!SendFlag);
+
+ // reset timeout timer
+ FTSetTimeOut(fv,TimeOutVeryLong);
+
+ // ???????????????フ???
+ do {
+ lastrx = firstch;
+ i = YRead1Byte(fv,yv,cv,&b);
+ if (i != 0) {
+ firstch = b;
+ if (firstch == CAN && lastrx == CAN) {
+ // CAN(0x18)????????????????ク??????
+ // ?????????????????????????B
+ // (2010.3.23 yutaka)
+ fv->Success = FALSE; // failure
+ return FALSE;
+ }
+ }
+ } while (i != 0);
+
+ if (yv->LastSendEot) { // ?????????????????????????????????
+ yv->LastSendEot = 0;
+
+ if (yv->DataLen == SOH_DATALEN)
+ yv->PktOut[0] = SOH;
+ else
+ yv->PktOut[0] = STX;
+ yv->PktOut[1] = 0;
+ yv->PktOut[2] = ~0;
+
+ i = 0;
+ while (i < yv->DataLen)
+ {
+ yv->PktOut[i+3] = 0x00;
+ i++;
+ }
+
+ Check = YCalcCheck(yv,yv->PktOut);
+ if (yv->CheckLen==1) /* Checksum */
+ yv->PktOut[yv->DataLen+3] = (BYTE)Check;
+ else {
+ yv->PktOut[yv->DataLen+3] = HIBYTE(Check);
+ yv->PktOut[yv->DataLen+4] = LOBYTE(Check);
+ }
+ yv->PktBufCount = 3 + yv->DataLen + yv->CheckLen;
+ //fv->Success = TRUE;
+
+ }
+ else if (yv->PktNumSent==yv->PktNum) /* make a new packet */
+ {
+ BYTE *dataptr = &yv->PktOut[3];
+ int eot = 0; // End Of Transfer
+
+ if (yv->DataLen == SOH_DATALEN)
+ yv->PktOut[0] = SOH;
+ else
+ yv->PktOut[0] = STX;
+ yv->PktOut[1] = yv->PktNumSent;
+ yv->PktOut[2] = ~ yv->PktNumSent;
+
+ // ???????????????YMODEM??"0"???????
+ yv->PktNumSent++;
+
+ // ????0
+ if (yv->SendFileInfo == 0) { // ????????M
+ struct _stat st;
+ int ret, total;
+ BYTE buf[1024 + 10];
+
+ yv->SendFileInfo = 1; // ???????on
+
+ /* timestamp */
+ _stat(fv->FullName, &st);
+
+ ret = _snprintf_s(buf, sizeof(buf), _TRUNCATE, "%s",
+ &(fv->FullName[fv->DirLen]));
+ buf[ret] = 0x00; // NUL
+ total = ret + 1;
+
+ ret = _snprintf_s(&(buf[total]), sizeof(buf) - total, _TRUNCATE, "%lu %lo %o",
+ fv->FileSize, (long)st.st_mtime, 0644|_S_IFREG);
+ total += ret;
+
+ i = total;
+ while (i <= yv->DataLen)
+ {
+ buf[i] = 0x00;
+ i++;
+ }
+
+ // ??????
+ memcpy(dataptr, buf, yv->DataLen);
+
+ } else {
+ i = 1;
+ while ((i<=yv->DataLen) && fv->FileOpen &&
+ (_lread(fv->FileHandle,&b,1)==1))
+ {
+ yv->PktOut[2+i] = b;
+ i++;
+ fv->ByteCount++;
+ }
+
+
+ if (i>1)
+ {
+ while (i<=yv->DataLen)
+ {
+ yv->PktOut[2+i] = 0x1A;
+ i++;
+ }
+
+ }
+ else { /* send EOT */
+ if (fv->FileOpen)
+ {
+ _lclose(fv->FileHandle);
+ fv->FileHandle = 0;
+ fv->FileOpen = FALSE;
+ }
+
+ eot = 1;
+ }
+
+ }
+
+ if (eot == 0) { // ???????
+ Check = YCalcCheck(yv,yv->PktOut);
+ if (yv->CheckLen==1) /* Checksum */
+ yv->PktOut[yv->DataLen+3] = (BYTE)Check;
+ else {
+ yv->PktOut[yv->DataLen+3] = HIBYTE(Check);
+ yv->PktOut[yv->DataLen+4] = LOBYTE(Check);
+ }
+ yv->PktBufCount = 3 + yv->DataLen + yv->CheckLen;
+
+ } else { // EOT
+ yv->PktOut[0] = EOT;
+ yv->PktBufCount = 1;
+
+ yv->SendEot = 1; // EOT???on???NAK??????
+ yv->LastSendEot = 0;
+ }
+
+ }
+ else { /* resend packet */
+ yv->PktBufCount = 3 + yv->DataLen + yv->CheckLen;
+ }
+
+ yv->PktBufPtr = 0;
+ }
+ /* a NAK or C could have arrived while we were buffering. Consume it. */
+ // ???????????????フ???
+ do {
+ lastrx = firstch;
+ i = YRead1Byte(fv,yv,cv,&b);
+ if (i != 0) {
+ firstch = b;
+ if (firstch == CAN && lastrx == CAN) {
+ // CAN(0x18)????????????????ク??????
+ // ?????????????????????????B
+ // (2010.3.23 yutaka)
+ fv->Success = FALSE; // failure
+ return FALSE;
+ }
+ }
+ } while (i != 0);
+
+
+ i = 1;
+ while ((yv->PktBufCount>0) && (i>0))
+ {
+ b = yv->PktOut[yv->PktBufPtr];
+ i = YWrite(fv,yv,cv,&b, 1);
+ if (i>0)
+ {
+ yv->PktBufCount--;
+ yv->PktBufPtr++;
+ }
+ }
+
+ if (yv->PktBufCount==0)
+ {
+ SetDlgNum(fv->HWin, IDC_PROTOPKTNUM,
+ yv->PktNumOffset+yv->PktNumSent);
+ SetDlgNum(fv->HWin, IDC_PROTOBYTECOUNT, fv->ByteCount);
+ SetDlgPercent(fv->HWin, IDC_PROTOPERCENT, IDC_PROTOPROGRESS,
+ fv->ByteCount, fv->FileSize, &fv->ProgStat);
+ }
+
+ return TRUE;
+}
From svnnotify @ sourceforge.jp Mon Apr 12 22:48:37 2010
From: svnnotify @ sourceforge.jp (svnnotify @ sourceforge.jp)
Date: Mon, 12 Apr 2010 22:48:37 +0900
Subject: [Ttssh2-commit] [3856] Z.
Message-ID: <1271080117.153833.16346.nullmailer@users.sourceforge.jp>
Revision: 3856
http://sourceforge.jp/projects/ttssh2/svn/view?view=rev&revision=3856
Author: yutakapon
Date: 2010-04-12 22:48:37 +0900 (Mon, 12 Apr 2010)
Log Message:
-----------
Z. Vickery 羂???????????????
Modified Paths:
--------------
trunk/doc/en/html/about/history.html
trunk/doc/ja/html/about/history.html
-------------- next part --------------
Modified: trunk/doc/en/html/about/history.html
===================================================================
--- trunk/doc/en/html/about/history.html 2010-04-12 13:43:07 UTC (rev 3855)
+++ trunk/doc/en/html/about/history.html 2010-04-12 13:48:37 UTC (rev 3856)
@@ -56,6 +56,8 @@
VPR control sequence does not work correctly.
The crc32file macro command does not work correctly for handling the file opening error. And also, the command supports the read-only file.
+ Fixed a problem where TeraTerm consumes 100% CPU if a USB serial port is disconnected. Special thanks to Z. Vickery.
+ Improved the cancellation logic for XModem and YModem transfers'. Special thanks to Z. Vickery.
Modified: trunk/doc/ja/html/about/history.html
===================================================================
--- trunk/doc/ja/html/about/history.html 2010-04-12 13:43:07 UTC (rev 3855)
+++ trunk/doc/ja/html/about/history.html 2010-04-12 13:48:37 UTC (rev 3856)
@@ -55,6 +55,8 @@
???????????? Alt+?? ????????????????????????????C????
VPR ??????????????????????B
crc32file ????????????????????????????????????????????B???????????????????????????????
+ USB???????????????ACPU????100%??????????BZ. Vickery???モ????
+ XMODEM/YMODEM??????????P???Z. Vickery???モ????
From svnnotify @ sourceforge.jp Mon Apr 12 23:47:55 2010
From: svnnotify @ sourceforge.jp (svnnotify @ sourceforge.jp)
Date: Mon, 12 Apr 2010 23:47:55 +0900
Subject: [Ttssh2-commit] =?utf-8?b?WzM4NTddICDmlLnooYzjgrPjg7zjg4njgYxM?=
=?utf-8?b?RuOBq+OBquOBo+OBpuOBl+OBvuOBo+OBn+OBruOBp+S/ruatow==?=
Message-ID: <1271083675.024556.29060.nullmailer@users.sourceforge.jp>
Revision: 3857
http://sourceforge.jp/projects/ttssh2/svn/view?view=rev&revision=3857
Author: maya
Date: 2010-04-12 23:47:54 +0900 (Mon, 12 Apr 2010)
Log Message:
-----------
?壕??潟????LF????c?????c????篆??
Modified Paths:
--------------
trunk/teraterm/teraterm/commlib.c
trunk/teraterm/ttpfile/ttfile.c
trunk/teraterm/ttpfile/xmodem.c
trunk/teraterm/ttpfile/ymodem.c
-------------- next part --------------
Modified: trunk/teraterm/teraterm/commlib.c
===================================================================
--- trunk/teraterm/teraterm/commlib.c 2010-04-12 13:48:37 UTC (rev 3856)
+++ trunk/teraterm/teraterm/commlib.c 2010-04-12 14:47:54 UTC (rev 3857)
@@ -1,1149 +1,1149 @@
-/* Tera Term
- Copyright(C) 1994-1998 T. Teranishi
- All rights reserved. */
-/* IPv6 modification is Copyright (C) 2000, 2001 Jun-ya KATO */
-
-/* TERATERM.EXE, Communication routines */
-#include "teraterm.h"
-#include "tttypes.h"
-#include "tt_res.h"
-#include
-
-#include "ttcommon.h"
-#include "ttwsk.h"
-#include "ttlib.h"
-#include "ttfileio.h"
-#include "ttplug.h" /* TTPLUG */
-
-#include "commlib.h"
-#ifndef NO_INET6
-#include
-#include
-#include /* for _snprintf() */
-#include "WSAAsyncGetAddrInfo.h"
-#endif /* NO_INET6 */
-#include
-
-static SOCKET OpenSocket(PComVar);
-static void AsyncConnect(PComVar);
-static int CloseSocket(SOCKET);
-
-/* create socket */
-static SOCKET OpenSocket(PComVar cv)
-{
- cv->s = cv->res->ai_family;
- cv->s = Psocket(cv->res->ai_family, cv->res->ai_socktype, cv->res->ai_protocol);
- return cv->s;
-}
-
-/* connect with asynchronous mode */
-static void AsyncConnect(PComVar cv)
-{
- int Err;
- BOOL BBuf;
- BBuf = TRUE;
- /* set synchronous mode */
- PWSAAsyncSelect(cv->s,cv->HWin,0,0);
- Psetsockopt(cv->s,(int)SOL_SOCKET,SO_OOBINLINE,(char FAR *)&BBuf,sizeof(BBuf));
- /* set asynchronous mode */
- PWSAAsyncSelect(cv->s,cv->HWin,WM_USER_COMMOPEN, FD_CONNECT);
-
- // ?????????????????????????????????
- // ?????L??????????0?????????B
- // (2007.1.11 yutaka)
- if (*cv->ConnetingTimeout > 0) {
- SetTimer(cv->HWin, IdCancelConnectTimer, *cv->ConnetingTimeout * 1000, NULL);
- }
-
- /* WM_USER_COMMOPEN occurs, CommOpen is called, then CommStart is called */
- Err = Pconnect(cv->s, cv->res->ai_addr, cv->res->ai_addrlen);
- if (Err != 0) {
- Err = PWSAGetLastError();
- if (Err == WSAEWOULDBLOCK) {
- /* Do nothing */
- } else if (Err!=0 ) {
- PostMessage(cv->HWin, WM_USER_COMMOPEN,0,
- MAKELONG(FD_CONNECT,Err));
- }
- }
-}
-
-/* close socket */
-static int CloseSocket(SOCKET s)
-{
- return Pclosesocket(s);
-}
-
-#define CommInQueSize 8192
-#define CommOutQueSize 2048
-#define CommXonLim 2048
-#define CommXoffLim 2048
-
-#define READENDNAME "ReadEnd"
-#define WRITENAME "Write"
-#define READNAME "Read"
-#define PRNWRITENAME "PrnWrite"
-
-static HANDLE ReadEnd;
-static OVERLAPPED wol, rol;
-
-// Winsock async operation handle
-static HANDLE HAsync=0;
-
-BOOL TCPIPClosed = TRUE;
-
-/* Printer port handle for
- direct pass-thru printing */
-static HANDLE PrnID = INVALID_HANDLE_VALUE;
-static BOOL LPTFlag;
-
-// Initialize ComVar.
-// This routine is called only once
-// by the initialization procedure of Tera Term.
-void CommInit(PComVar cv)
-{
- cv->Open = FALSE;
- cv->Ready = FALSE;
-
-// log-buffer variables
- cv->HLogBuf = 0;
- cv->HBinBuf = 0;
- cv->LogBuf = NULL;
- cv->BinBuf = NULL;
- cv->LogPtr = 0;
- cv->LStart = 0;
- cv->LCount = 0;
- cv->BinPtr = 0;
- cv->BStart = 0;
- cv->BCount = 0;
- cv->DStart = 0;
- cv->DCount = 0;
- cv->BinSkip = 0;
- cv->FilePause = 0;
- cv->ProtoFlag = FALSE;
-/* message flag */
- cv->NoMsg = 0;
-}
-
-/* reset a serial port which is already open */
-void CommResetSerial(PTTSet ts, PComVar cv, BOOL ClearBuff)
-{
- DCB dcb;
- DWORD DErr;
- COMMTIMEOUTS ctmo;
-
- if (! cv->Open ||
- (cv->PortType != IdSerial)) {
- return;
- }
-
- ClearCommError(cv->ComID,&DErr,NULL);
- SetupComm(cv->ComID,CommInQueSize,CommOutQueSize);
- /* flush input and output buffers */
- if (ClearBuff) {
- PurgeComm(cv->ComID, PURGE_TXABORT | PURGE_RXABORT |
- PURGE_TXCLEAR | PURGE_RXCLEAR);
- }
-
- memset(&ctmo,0,sizeof(ctmo));
- ctmo.ReadIntervalTimeout = MAXDWORD;
- ctmo.WriteTotalTimeoutConstant = 500;
- SetCommTimeouts(cv->ComID,&ctmo);
- cv->InBuffCount = 0;
- cv->InPtr = 0;
- cv->OutBuffCount = 0;
- cv->OutPtr = 0;
-
- cv->DelayPerChar = ts->DelayPerChar;
- cv->DelayPerLine = ts->DelayPerLine;
-
- memset(&dcb,0,sizeof(DCB));
- dcb.DCBlength = sizeof(DCB);
- dcb.BaudRate = GetCommSerialBaudRate(ts->Baud);
- dcb.fBinary = TRUE;
- switch (ts->Parity) {
- case IdParityEven:
- dcb.fParity = TRUE;
- dcb.Parity = EVENPARITY;
- break;
- case IdParityOdd:
- dcb.fParity = TRUE;
- dcb.Parity = ODDPARITY;
- break;
- case IdParityNone:
- dcb.Parity = NOPARITY;
- break;
- }
-
- dcb.fDtrControl = DTR_CONTROL_ENABLE;
- dcb.fRtsControl = RTS_CONTROL_ENABLE;
- switch (ts->Flow) {
- case IdFlowX:
- dcb.fOutX = TRUE;
- dcb.fInX = TRUE;
- dcb.XonLim = CommXonLim;
- dcb.XoffLim = CommXoffLim;
- dcb.XonChar = XON;
- dcb.XoffChar = XOFF;
- break;
- case IdFlowHard:
- dcb.fOutxCtsFlow = TRUE;
- dcb.fRtsControl = RTS_CONTROL_HANDSHAKE;
- break;
- }
-
- switch (ts->DataBit) {
- case IdDataBit7:
- dcb.ByteSize = 7;
- break;
- case IdDataBit8:
- dcb.ByteSize = 8;
- break;
- }
- switch (ts->StopBit) {
- case IdStopBit1:
- dcb.StopBits = ONESTOPBIT;
- break;
- case IdStopBit2:
- dcb.StopBits = TWOSTOPBITS;
- break;
- }
-
- SetCommState(cv->ComID, &dcb);
-
- /* enable receive request */
- SetCommMask(cv->ComID,0);
- SetCommMask(cv->ComID,EV_RXCHAR);
-}
-
-void CommOpen(HWND HW, PTTSet ts, PComVar cv)
-{
-#ifdef NO_INET6
- int Err;
-#endif /* NO_INET6 */
- char ErrMsg[21];
- char P[50];
-
- MSG Msg;
-#ifndef NO_INET6
- ADDRINFO hints;
- char pname[NI_MAXSERV];
-#else
- char HEntBuff[MAXGETHOSTSTRUCT];
- u_long addr;
- SOCKADDR_IN saddr;
-#endif /* NO_INET6 */
-
- BOOL InvalidHost;
-#ifdef NO_INET6
- BOOL BBuf;
-#endif /* NO_INET6 */
-
- char uimsg[MAX_UIMSG];
-
- /* initialize ComVar */
- cv->InBuffCount = 0;
- cv->InPtr = 0;
- cv->OutBuffCount = 0;
- cv->OutPtr = 0;
- cv->HWin = HW;
- cv->Ready = FALSE;
- cv->Open = FALSE;
- cv->PortType = ts->PortType;
- cv->ComPort = 0;
- cv->RetryCount = 0;
-#ifndef NO_INET6
- cv->RetryWithOtherProtocol = TRUE;
-#endif /* NO_INET6 */
- cv->s = INVALID_SOCKET;
- cv->ComID = INVALID_HANDLE_VALUE;
- cv->CanSend = TRUE;
- cv->RRQ = FALSE;
- cv->SendKanjiFlag = FALSE;
- cv->SendCode = IdASCII;
- cv->EchoKanjiFlag = FALSE;
- cv->EchoCode = IdASCII;
- cv->Language = ts->Language;
- cv->CRSend = ts->CRSend;
- cv->KanjiCodeEcho = ts->KanjiCode;
- cv->JIS7KatakanaEcho = ts->JIS7Katakana;
- cv->KanjiCodeSend = ts->KanjiCodeSend;
- cv->JIS7KatakanaSend = ts->JIS7KatakanaSend;
- cv->KanjiIn = ts->KanjiIn;
- cv->KanjiOut = ts->KanjiOut;
- cv->RussHost = ts->RussHost;
- cv->RussClient = ts->RussClient;
- cv->DelayFlag = TRUE;
- cv->DelayPerChar = ts->DelayPerChar;
- cv->DelayPerLine = ts->DelayPerLine;
- cv->TelBinRecv = FALSE;
- cv->TelBinSend = FALSE;
- cv->TelFlag = FALSE;
- cv->TelMode = FALSE;
- cv->IACFlag = FALSE;
- cv->TelCRFlag = FALSE;
- cv->TelCRSend = FALSE;
- cv->TelCRSendEcho = FALSE;
- cv->TelAutoDetect = ts->TelAutoDetect; /* TTPLUG */
- cv->Locale = ts->Locale;
- cv->CodePage = &ts->CodePage;
- cv->ConnetingTimeout = &ts->ConnectingTimeout;
- cv->LastSendTime = time(NULL);
- cv->LineModeBuffCount = 0;
- cv->Flush = FALSE;
- cv->FlushLen = 0;
- cv->TelLineMode = FALSE;
-
- if ((ts->PortType!=IdSerial) && (strlen(ts->HostName)==0))
- {
- PostMessage(cv->HWin, WM_USER_COMMNOTIFY, 0, FD_CLOSE);
- return;
- }
-
- switch (ts->PortType) {
- case IdTCPIP:
- cv->TelFlag = (ts->Telnet > 0);
- if (ts->EnableLineMode) {
- cv->TelLineMode = TRUE;
- }
- if (! LoadWinsock()) {
- if (cv->NoMsg==0) {
- get_lang_msg("MSG_TT_ERROR", uimsg, sizeof(uimsg), "Tera Term: Error", ts->UILanguageFile);
- get_lang_msg("MSG_WINSOCK_ERROR", ts->UIMsg, sizeof(ts->UIMsg), "Cannot use winsock", ts->UILanguageFile);
- MessageBox(cv->HWin,ts->UIMsg,uimsg,MB_TASKMODAL | MB_ICONEXCLAMATION);
- }
- InvalidHost = TRUE;
- }
- else {
- TTXOpenTCP(); /* TTPLUG */
- cv->Open = TRUE;
-#ifndef NO_INET6
- /* resolving address */
- memset(&hints, 0, sizeof(hints));
- hints.ai_family = ts->ProtocolFamily;
- hints.ai_socktype = SOCK_STREAM;
- hints.ai_protocol = IPPROTO_TCP;
- _snprintf_s(pname, sizeof(pname), _TRUNCATE, "%d", ts->TCPPort);
-
- HAsync = WSAAsyncGetAddrInfo(HW, WM_USER_GETHOST,
- ts->HostName, pname, &hints, &cv->res0);
- if (HAsync == 0)
- InvalidHost = TRUE;
- else {
- cv->ComPort = 1; // set "getting host" flag
- // (see CVTWindow::OnSysCommand())
- do {
- if (GetMessage(&Msg,0,0,0)) {
- if ((Msg.hwnd==HW) &&
- ((Msg.message == WM_SYSCOMMAND) &&
- ((Msg.wParam & 0xfff0) == SC_CLOSE) ||
- (Msg.message == WM_COMMAND) &&
- (LOWORD(Msg.wParam) == ID_FILE_EXIT) ||
- (Msg.message == WM_CLOSE))) { /* Exit when the user closes Tera Term */
- PWSACancelAsyncRequest(HAsync);
- CloseHandle(HAsync);
- HAsync = 0;
- cv->ComPort = 0; // clear "getting host" flag
- PostMessage(HW,Msg.message,Msg.wParam,Msg.lParam);
- return;
- }
- if (Msg.message != WM_USER_GETHOST) { /* Prosess messages */
- TranslateMessage(&Msg);
- DispatchMessage(&Msg);
- }
- }
- else {
- return;
- }
- } while (Msg.message!=WM_USER_GETHOST);
- cv->ComPort = 0; // clear "getting host" flag
- CloseHandle(HAsync);
- HAsync = 0;
- InvalidHost = WSAGETASYNCERROR(Msg.lParam) != 0;
- }
- } /* if (!LoadWinsock()) */
-
- if (InvalidHost) {
- if (cv->NoMsg==0) {
- get_lang_msg("MSG_TT_ERROR", uimsg, sizeof(uimsg), "Tera Term: Error", ts->UILanguageFile);
- get_lang_msg("MSG_INVALID_HOST_ERROR", ts->UIMsg, sizeof(ts->UIMsg), "Invalid host", ts->UILanguageFile);
- MessageBox(cv->HWin,ts->UIMsg,uimsg,MB_TASKMODAL | MB_ICONEXCLAMATION);
- }
- goto BreakSC;
- }
- for (cv->res = cv->res0; cv->res; cv->res = cv->res->ai_next) {
- cv->s = OpenSocket(cv);
- if (cv->s == INVALID_SOCKET) {
- CloseSocket(cv->s);
- continue;
- }
- /* start asynchronous connect */
- AsyncConnect(cv);
- break; /* break for-loop immediately */
- }
- break;
-#else
- if ((ts->HostName[0] >= 0x30) && (ts->HostName[0] <= 0x39))
- {
- addr = Pinet_addr(ts->HostName);
- InvalidHost = (addr == 0xffffffff);
- }
- else {
- HAsync = PWSAAsyncGetHostByName(HW,WM_USER_GETHOST,
- ts->HostName,HEntBuff,sizeof(HEntBuff));
- if (HAsync == 0)
- InvalidHost = TRUE;
- else {
- cv->ComPort = 1; // set "getting host" flag
- // (see CVTWindow::OnSysCommand())
- do {
- if (GetMessage(&Msg,0,0,0))
- {
- if ((Msg.hwnd==HW) &&
- ((Msg.message == WM_SYSCOMMAND) &&
- ((Msg.wParam & 0xfff0) == SC_CLOSE) ||
- (Msg.message == WM_COMMAND) &&
- (LOWORD(Msg.wParam) == ID_FILE_EXIT) ||
- (Msg.message == WM_CLOSE)))
- { /* Exit when the user closes Tera Term */
- PWSACancelAsyncRequest(HAsync);
- HAsync = 0;
- cv->ComPort = 0; // clear "getting host" flag
- PostMessage(HW,Msg.message,Msg.wParam,Msg.lParam);
- return;
- }
- if (Msg.message != WM_USER_GETHOST)
- { /* Prosess messages */
- TranslateMessage(&Msg);
- DispatchMessage(&Msg);
- }
- }
- else {
- return;
- }
- } while (Msg.message!=WM_USER_GETHOST);
- cv->ComPort = 0; // clear "getting host" flag
- HAsync = 0;
- InvalidHost = WSAGETASYNCERROR(Msg.lParam) != 0;
- if (! InvalidHost)
- {
- if (((PHOSTENT)HEntBuff)->h_addr_list != NULL)
- memcpy(&addr,
- ((PHOSTENT)HEntBuff)->h_addr_list[0],sizeof(addr));
- else
- InvalidHost = TRUE;
- }
- }
-
- }
-
- if (InvalidHost)
- {
- if (cv->NoMsg==0)
- MessageBox(cv->HWin,"Invalid host",ErrorCaption,
- MB_TASKMODAL | MB_ICONEXCLAMATION);
- }
- else {
- cv->s= Psocket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
- if (cv->s==INVALID_SOCKET)
- {
- InvalidHost = TRUE;
- if (cv->NoMsg==0)
- MessageBox(cv->HWin,ErrorCantConn,ErrorCaption,
- MB_TASKMODAL | MB_ICONEXCLAMATION);
- }
- else {
- BBuf = TRUE;
- Psetsockopt(cv->s,(int)SOL_SOCKET,SO_OOBINLINE,(char FAR *)&BBuf,sizeof(BBuf));
-
- PWSAAsyncSelect(cv->s,cv->HWin,WM_USER_COMMOPEN, FD_CONNECT);
- saddr.sin_family = AF_INET;
- saddr.sin_port = Phtons(ts->TCPPort);
- saddr.sin_addr.s_addr = addr;
- memset(saddr.sin_zero,0,8);
-
- Err = Pconnect(cv->s,(LPSOCKADDR)&saddr,sizeof(saddr));
- if (Err!=0 ) Err = PWSAGetLastError();
- if (Err==WSAEWOULDBLOCK )
- {
- /* Do nothing */
- }
- else if (Err!=0 )
- PostMessage(cv->HWin, WM_USER_COMMOPEN,0,
- MAKELONG(FD_CONNECT,Err));
- }
- }
- }
- break;
-#endif /* NO_INET6 */
-
- case IdSerial:
- InitFileIO(IdSerial); /* TTPLUG */
- TTXOpenFile(); /* TTPLUG */
- _snprintf_s(P, sizeof(P), _TRUNCATE, "COM%d", ts->ComPort);
- strncpy_s(ErrMsg, sizeof(ErrMsg),P, _TRUNCATE);
- strncpy_s(P, sizeof(P),"\\\\.\\", _TRUNCATE);
- strncat_s(P, sizeof(P),ErrMsg, _TRUNCATE);
- cv->ComID =
- PCreateFile(P,GENERIC_READ | GENERIC_WRITE,
- 0,NULL,OPEN_EXISTING,
- FILE_FLAG_OVERLAPPED,NULL);
- if (cv->ComID == INVALID_HANDLE_VALUE ) {
- get_lang_msg("MSG_CANTOEPN_ERROR", ts->UIMsg, sizeof(ts->UIMsg), "Cannot open %s", ts->UILanguageFile);
- _snprintf_s(ErrMsg, sizeof(ErrMsg), _TRUNCATE, ts->UIMsg, &P[4]);
-
- if (cv->NoMsg==0) {
- get_lang_msg("MSG_TT_ERROR", uimsg, sizeof(uimsg), "Tera Term: Error", ts->UILanguageFile);
- MessageBox(cv->HWin,ErrMsg,uimsg,MB_TASKMODAL | MB_ICONEXCLAMATION);
- }
- InvalidHost = TRUE;
- }
- else {
- cv->Open = TRUE;
- cv->ComPort = ts->ComPort;
- CommResetSerial(ts, cv, ts->ClearComBuffOnOpen);
- if (!ts->ClearComBuffOnOpen) {
- cv->RRQ = TRUE;
- }
-
- /* notify to VT window that Comm Port is open */
- PostMessage(cv->HWin, WM_USER_COMMOPEN, 0, 0);
- InvalidHost = FALSE;
-
- SetCOMFlag(ts->ComPort);
- }
- break; /* end of "case IdSerial:" */
-
- case IdFile:
- InitFileIO(IdFile); /* TTPLUG */
- TTXOpenFile(); /* TTPLUG */
- cv->ComID = PCreateFile(ts->HostName,GENERIC_READ,0,NULL,
- OPEN_EXISTING,0,NULL);
- InvalidHost = (cv->ComID == INVALID_HANDLE_VALUE);
- if (InvalidHost) {
- if (cv->NoMsg==0) {
- get_lang_msg("MSG_TT_ERROR", uimsg, sizeof(uimsg), "Tera Term: Error", ts->UILanguageFile);
- get_lang_msg("MSG_CANTOEPN_FILE_ERROR", ts->UIMsg, sizeof(ts->UIMsg), "Cannot open file", ts->UILanguageFile);
- MessageBox(cv->HWin,ts->UIMsg,uimsg,MB_TASKMODAL | MB_ICONEXCLAMATION);
- }
- }
- else {
- cv->Open = TRUE;
- PostMessage(cv->HWin, WM_USER_COMMOPEN, 0, 0);
- }
- break;
- } /* end of "switch" */
-
-#ifndef NO_INET6
-BreakSC:
-#endif /* NO_INET6 */
- if (InvalidHost) {
- PostMessage(cv->HWin, WM_USER_COMMNOTIFY, 0, FD_CLOSE);
- if ( (ts->PortType==IdTCPIP) && cv->Open ) {
- if ( cv->s!=INVALID_SOCKET ) {
- Pclosesocket(cv->s);
- }
- FreeWinsock();
- }
- return;
- }
-}
-
-void CommThread(void *arg)
-{
- DWORD Evt;
- PComVar cv = (PComVar)arg;
- DWORD DErr;
- HANDLE REnd;
- char Temp[20];
-
- _snprintf_s(Temp, sizeof(Temp), _TRUNCATE, "%s%d", READENDNAME, cv->ComPort);
- REnd = OpenEvent(EVENT_ALL_ACCESS,FALSE, Temp);
- while (TRUE) {
- if (WaitCommEvent(cv->ComID,&Evt,NULL)) {
- if (! cv->Ready) {
- _endthread();
- }
- if (! cv->RRQ) {
- PostMessage(cv->HWin, WM_USER_COMMNOTIFY, 0, FD_READ);
- }
- WaitForSingleObject(REnd,INFINITE);
- }
- else {
- DErr = GetLastError(); // this returns 995 (operation aborted) if a USB com port is removed
- if (! cv->Ready || ERROR_OPERATION_ABORTED == DErr) {
- _endthread();
- }
- ClearCommError(cv->ComID,&DErr,NULL);
- }
- }
-}
-
-void CommStart(PComVar cv, LONG lParam, PTTSet ts)
-{
- char ErrMsg[31];
- char Temp[20];
- char uimsg[MAX_UIMSG];
-
- if (! cv->Open ) {
- return;
- }
- if ( cv->Ready ) {
- return;
- }
-
- // ????????????????B????????? WM_TIMER ??????????????
- if (*cv->ConnetingTimeout > 0) {
- KillTimer(cv->HWin, IdCancelConnectTimer);
- }
-
- switch (cv->PortType) {
- case IdTCPIP:
- ErrMsg[0] = 0;
- switch (HIWORD(lParam)) {
- case WSAECONNREFUSED:
- get_lang_msg("MSG_COMM_REFUSE_ERROR", ts->UIMsg, sizeof(ts->UIMsg), "Connection refused", ts->UILanguageFile);
- _snprintf_s(ErrMsg, sizeof(ErrMsg), _TRUNCATE, "%s", ts->UIMsg);
- break;
- case WSAENETUNREACH:
- get_lang_msg("MSG_COMM_REACH_ERROR", ts->UIMsg, sizeof(ts->UIMsg), "Network cannot be reached", ts->UILanguageFile);
- _snprintf_s(ErrMsg, sizeof(ErrMsg), _TRUNCATE, "%s", ts->UIMsg);
- break;
- case WSAETIMEDOUT:
- get_lang_msg("MSG_COMM_CONNECT_ERROR", ts->UIMsg, sizeof(ts->UIMsg), "Connection timed out", ts->UILanguageFile);
- _snprintf_s(ErrMsg, sizeof(ErrMsg), _TRUNCATE, "%s", ts->UIMsg);
- break;
- default:
- get_lang_msg("MSG_COMM_TIMEOUT_ERROR", ts->UIMsg, sizeof(ts->UIMsg), "Cannot connect the host", ts->UILanguageFile);
- _snprintf_s(ErrMsg, sizeof(ErrMsg), _TRUNCATE, "%s", ts->UIMsg);
- }
- if (HIWORD(lParam)>0) {
-#ifndef NO_INET6
- /* connect() failed */
- if (cv->res->ai_next != NULL) {
- /* try to connect with other protocol */
- CloseSocket(cv->s);
- for (cv->res = cv->res->ai_next; cv->res; cv->res = cv->res->ai_next) {
- cv->s = OpenSocket(cv);
- if (cv->s == INVALID_SOCKET) {
- CloseSocket(cv->s);
- continue;
- }
- AsyncConnect(cv);
- cv->Ready = FALSE;
- cv->RetryWithOtherProtocol = TRUE; /* retry with other procotol */
- return;
- }
- } else {
- /* trying with all protocol family are failed */
- if (cv->NoMsg==0)
- {
- get_lang_msg("MSG_TT_ERROR", uimsg, sizeof(uimsg), "Tera Term: Error", ts->UILanguageFile);
- MessageBox(cv->HWin,ErrMsg,uimsg,MB_TASKMODAL | MB_ICONEXCLAMATION);
- }
- PostMessage(cv->HWin, WM_USER_COMMNOTIFY, 0, FD_CLOSE);
- cv->RetryWithOtherProtocol = FALSE;
- return;
- }
-#else
- if (cv->NoMsg==0)
- MessageBox(cv->HWin,ErrMsg,ErrorCaption,
- MB_TASKMODAL | MB_ICONEXCLAMATION);
- PostMessage(cv->HWin, WM_USER_COMMNOTIFY, 0, FD_CLOSE);
- return;
-#endif /* NO_INET6 */
- }
-
-#ifndef NO_INET6
- /* here is connection established */
- cv->RetryWithOtherProtocol = FALSE;
-#endif /* NO_INET6 */
- PWSAAsyncSelect(cv->s,cv->HWin,WM_USER_COMMNOTIFY, FD_READ | FD_OOB | FD_CLOSE);
- TCPIPClosed = FALSE;
- break;
-
- case IdSerial:
- _snprintf_s(Temp, sizeof(Temp), _TRUNCATE, "%s%d", READENDNAME, cv->ComPort);
- ReadEnd = CreateEvent(NULL,FALSE,FALSE,Temp);
- _snprintf_s(Temp, sizeof(Temp), _TRUNCATE, "%s%d", WRITENAME, cv->ComPort);
- memset(&wol,0,sizeof(OVERLAPPED));
- wol.hEvent = CreateEvent(NULL,TRUE,TRUE,Temp);
- _snprintf_s(Temp, sizeof(Temp), _TRUNCATE, "%s%d", READNAME, cv->ComPort);
- memset(&rol,0,sizeof(OVERLAPPED));
- rol.hEvent = CreateEvent(NULL,TRUE,FALSE,Temp);
-
- /* create the receiver thread */
- if (_beginthread(CommThread,0,cv) == -1) {
- get_lang_msg("MSG_TT_ERROR", uimsg, sizeof(uimsg), "Tera Term: Error", ts->UILanguageFile);
- get_lang_msg("MSG_TT_ERROR", ts->UIMsg, sizeof(ts->UIMsg), "Can't create thread", ts->UILanguageFile);
- MessageBox(cv->HWin,ts->UIMsg,uimsg,MB_TASKMODAL | MB_ICONEXCLAMATION);
- }
- break;
-
- case IdFile:
- cv->RRQ = TRUE;
- break;
- }
- cv->Ready = TRUE;
-}
-
-BOOL CommCanClose(PComVar cv)
-{ // check if data remains in buffer
- if (! cv->Open) {
- return TRUE;
- }
- if (cv->InBuffCount>0) {
- return FALSE;
- }
- if ((cv->HLogBuf!=NULL) &&
- ((cv->LCount>0) ||
- (cv->DCount>0))) {
- return FALSE;
- }
- if ((cv->HBinBuf!=NULL) &&
- (cv->BCount>0)) {
- return FALSE;
- }
- return TRUE;
-}
-
-void CommClose(PComVar cv)
-{
- if ( ! cv->Open ) {
- return;
- }
- cv->Open = FALSE;
-
- /* disable event message posting & flush buffer */
- cv->RRQ = FALSE;
- cv->Ready = FALSE;
- cv->InPtr = 0;
- cv->InBuffCount = 0;
- cv->OutPtr = 0;
- cv->OutBuffCount = 0;
- cv->LineModeBuffCount = 0;
- cv->FlushLen = 0;
- cv->Flush = FALSE;
-
- /* close port & release resources */
- switch (cv->PortType) {
- case IdTCPIP:
- if (HAsync!=0) {
- PWSACancelAsyncRequest(HAsync);
- }
- HAsync = 0;
-#ifndef NO_INET6
- freeaddrinfo(cv->res0);
-#endif /* NO_INET6 */
- if ( cv->s!=INVALID_SOCKET ) {
- Pclosesocket(cv->s);
- }
- cv->s = INVALID_SOCKET;
- TTXCloseTCP(); /* TTPLUG */
- FreeWinsock();
- break;
- case IdSerial:
- if ( cv->ComID != INVALID_HANDLE_VALUE ) {
- CloseHandle(ReadEnd);
- CloseHandle(wol.hEvent);
- CloseHandle(rol.hEvent);
- PurgeComm(cv->ComID, PURGE_TXABORT | PURGE_RXABORT |
- PURGE_TXCLEAR | PURGE_RXCLEAR);
- EscapeCommFunction(cv->ComID,CLRDTR);
- SetCommMask(cv->ComID,0);
- PCloseFile(cv->ComID);
- ClearCOMFlag(cv->ComPort);
- }
- TTXCloseFile(); /* TTPLUG */
- break;
- case IdFile:
- if (cv->ComID != INVALID_HANDLE_VALUE) {
- PCloseFile(cv->ComID);
- }
- TTXCloseFile(); /* TTPLUG */
- break;
- }
- cv->ComID = INVALID_HANDLE_VALUE;
- cv->PortType = 0;
-}
-
-void CommProcRRQ(PComVar cv)
-{
- if ( ! cv->Ready ) {
- return;
- }
- /* disable receive request */
- switch (cv->PortType) {
- case IdTCPIP:
- if (! TCPIPClosed) {
- PWSAAsyncSelect(cv->s,cv->HWin,WM_USER_COMMNOTIFY, FD_OOB | FD_CLOSE);
- }
- break;
- case IdSerial:
- break;
- }
- cv->RRQ = TRUE;
- CommReceive(cv);
-}
-
-void CommReceive(PComVar cv)
-{
- DWORD C;
- DWORD DErr;
-
- if (! cv->Ready || ! cv->RRQ ||
- (cv->InBuffCount>=InBuffSize)) {
- return;
- }
-
- /* Compact buffer */
- if ((cv->InBuffCount>0) && (cv->InPtr>0)) {
- memmove(cv->InBuff,&(cv->InBuff[cv->InPtr]),cv->InBuffCount);
- cv->InPtr = 0;
- }
-
- if (cv->InBuffCountPortType) {
- case IdTCPIP:
- C = Precv(cv->s, &(cv->InBuff[cv->InBuffCount]),
- InBuffSize-cv->InBuffCount, 0);
- if (C == SOCKET_ERROR) {
- C = 0;
- PWSAGetLastError();
- }
- cv->InBuffCount = cv->InBuffCount + C;
- break;
- case IdSerial:
- do {
- ClearCommError(cv->ComID,&DErr,NULL);
- if (! PReadFile(cv->ComID,&(cv->InBuff[cv->InBuffCount]),
- InBuffSize-cv->InBuffCount,&C,&rol)) {
- if (GetLastError() == ERROR_IO_PENDING) {
- if (WaitForSingleObject(rol.hEvent, 1000) != WAIT_OBJECT_0) {
- C = 0;
- }
- else {
- GetOverlappedResult(cv->ComID,&rol,&C,FALSE);
- }
- }
- else {
- C = 0;
- }
- }
- cv->InBuffCount = cv->InBuffCount + C;
- } while ((C!=0) && (cv->InBuffCountComID,&DErr,NULL);
- break;
- case IdFile:
- if (PReadFile(cv->ComID,&(cv->InBuff[cv->InBuffCount]),
- InBuffSize-cv->InBuffCount,&C,NULL)) {
- if (C == 0) {
- DErr = ERROR_HANDLE_EOF;
- }
- else {
- cv->InBuffCount = cv->InBuffCount + C;
- }
- }
- else {
- DErr = GetLastError();
- }
- break;
- }
- }
-
- if (cv->InBuffCount==0) {
- switch (cv->PortType) {
- case IdTCPIP:
- if (! TCPIPClosed) {
- PWSAAsyncSelect(cv->s,cv->HWin, WM_USER_COMMNOTIFY,
- FD_READ | FD_OOB | FD_CLOSE);
- }
- break;
- case IdSerial:
- cv->RRQ = FALSE;
- SetEvent(ReadEnd);
- return;
- case IdFile:
- if (DErr != ERROR_IO_PENDING) {
- PostMessage(cv->HWin, WM_USER_COMMNOTIFY, 0, FD_CLOSE);
- cv->RRQ = FALSE;
- }
- else {
- cv->RRQ = TRUE;
- }
- return;
- }
- cv->RRQ = FALSE;
- }
-}
-
-void CommSend(PComVar cv)
-{
- int delay;
- COMSTAT Stat;
- BYTE LineEnd;
- int C, D, Max;
- DWORD DErr;
-
- if ((! cv->Open) || (! cv->Ready)) {
- cv->OutBuffCount = 0;
- return;
- }
-
- if ((cv->OutBuffCount == 0) || (! cv->CanSend)) {
- return;
- }
-
- /* Max num of bytes to be written */
- switch (cv->PortType) {
- case IdTCPIP:
- if (TCPIPClosed) {
- cv->OutBuffCount = 0;
- }
- Max = cv->OutBuffCount;
- break;
- case IdSerial:
- ClearCommError(cv->ComID,&DErr,&Stat);
- Max = OutBuffSize - Stat.cbOutQue;
- break;
- case IdFile:
- Max = cv->OutBuffCount;
- break;
- }
-
- if ( Max<=0 ) {
- return;
- }
- if ( Max > cv->OutBuffCount ) {
- Max = cv->OutBuffCount;
- }
-
- if (cv->PortType == IdTCPIP && cv->TelFlag) {
- cv->LastSendTime = time(NULL);
- }
-
- C = Max;
- delay = 0;
-
- if ( cv->DelayFlag && (cv->PortType==IdSerial) ) {
- if ( cv->DelayPerLine > 0 ) {
- if ( cv->CRSend==IdCR ) {
- LineEnd = 0x0d;
- }
- else {
- LineEnd = 0x0a;
- }
- C = 1;
- if ( cv->DelayPerChar==0 ) {
- while ((COutBuff[cv->OutPtr+C-1]!=LineEnd)) {
- C++;
- }
- }
- if ( cv->OutBuff[cv->OutPtr+C-1]==LineEnd ) {
- delay = cv->DelayPerLine;
- }
- else {
- delay = cv->DelayPerChar;
- }
- }
- else if ( cv->DelayPerChar > 0 ) {
- C = 1;
- delay = cv->DelayPerChar;
- }
- }
-
- /* Write to comm driver/Winsock */
- switch (cv->PortType) {
- case IdTCPIP:
- D = Psend(cv->s, &(cv->OutBuff[cv->OutPtr]), C, 0);
- if ( D==SOCKET_ERROR ) { /* if error occurs */
- PWSAGetLastError(); /* Clear error */
- D = 0;
- }
- break;
-
- case IdSerial:
- if (! PWriteFile(cv->ComID,&(cv->OutBuff[cv->OutPtr]),C,(LPDWORD)&D,&wol)) {
- if (GetLastError() == ERROR_IO_PENDING) {
- if (WaitForSingleObject(wol.hEvent,1000) != WAIT_OBJECT_0) {
- D = C; /* Time out, ignore data */
- }
- else {
- GetOverlappedResult(cv->ComID,&wol,(LPDWORD)&D,FALSE);
- }
- }
- else { /* I/O error */
- D = C; /* ignore error */
- }
- }
- ClearCommError(cv->ComID,&DErr,&Stat);
- break;
-
- case IdFile:
- if (! PWriteFile(cv->ComID, &(cv->OutBuff[cv->OutPtr]), C, (LPDWORD)&D, NULL)) {
- if (! GetLastError() == ERROR_IO_PENDING) {
- D = C; /* ignore data */
- }
- }
- break;
- }
-
- cv->OutBuffCount = cv->OutBuffCount - D;
- if ( cv->OutBuffCount==0 ) {
- cv->OutPtr = 0;
- }
- else {
- cv->OutPtr = cv->OutPtr + D;
- }
-
- if ( (C==D) && (delay>0) ) {
- cv->CanSend = FALSE;
- SetTimer(cv->HWin, IdDelayTimer, delay, NULL);
- }
-}
-
-void CommSendBreak(PComVar cv)
-/* for only serial ports */
-{
- MSG DummyMsg;
-
- if ( ! cv->Ready ) {
- return;
- }
-
- switch (cv->PortType) {
- case IdSerial:
- /* Set com port into a break state */
- SetCommBreak(cv->ComID);
-
- /* pause for 1 sec */
- if (SetTimer(cv->HWin, IdBreakTimer, 1000, NULL) != 0) {
- GetMessage(&DummyMsg,cv->HWin,WM_TIMER,WM_TIMER);
- }
-
- /* Set com port into the nonbreak state */
- ClearCommBreak(cv->ComID);
- break;
- }
-}
-
-void CommLock(PTTSet ts, PComVar cv, BOOL Lock)
-{
- BYTE b;
- DWORD Func;
-
- if (! cv->Ready) {
- return;
- }
- if ((cv->PortType==IdTCPIP) ||
- (cv->PortType==IdSerial) &&
- (ts->Flow!=IdFlowHard)) {
- if (Lock) {
- b = XOFF;
- }
- else {
- b = XON;
- }
- CommBinaryOut(cv,&b,1);
- }
- else if ((cv->PortType==IdSerial) &&
- (ts->Flow==IdFlowHard)) {
- if (Lock) {
- Func = CLRRTS;
- }
- else {
- Func = SETRTS;
- }
- EscapeCommFunction(cv->ComID,Func);
- }
-}
-
-int GetCommSerialBaudRate(int id)
-{
- char *ch;
- int val;
-
- // id-1?????index????
- ch = BaudList[id - 1];
- val = atoi(ch);
- return (val);
-}
-
-BOOL PrnOpen(PCHAR DevName)
-{
- char Temp[MAXPATHLEN];
- DCB dcb;
- DWORD DErr;
- COMMTIMEOUTS ctmo;
-
- strncpy_s(Temp, sizeof(Temp),DevName, _TRUNCATE);
- Temp[4] = 0; // COMn or LPTn
- LPTFlag = (Temp[0]=='L') ||
- (Temp[0]=='l');
- PrnID = CreateFile(Temp,GENERIC_WRITE,
- 0,NULL,OPEN_EXISTING,
- 0,NULL);
- if (PrnID == INVALID_HANDLE_VALUE) {
- return FALSE;
- }
-
- if (GetCommState(PrnID,&dcb)) {
- BuildCommDCB(DevName,&dcb);
- SetCommState(PrnID,&dcb);
- }
- ClearCommError(PrnID,&DErr,NULL);
- if (! LPTFlag) {
- SetupComm(PrnID,0,CommOutQueSize);
- }
- /* flush output buffer */
- PurgeComm(PrnID, PURGE_TXABORT | PURGE_TXCLEAR);
- memset(&ctmo,0,sizeof(ctmo));
- ctmo.WriteTotalTimeoutConstant = 1000;
- SetCommTimeouts(PrnID,&ctmo);
- if (! LPTFlag) {
- EscapeCommFunction(PrnID,SETDTR);
- }
- return TRUE;
-}
-
-int PrnWrite(PCHAR b, int c)
-{
- int d;
- DWORD DErr;
- COMSTAT Stat;
-
- if (PrnID == INVALID_HANDLE_VALUE ) {
- return c;
- }
-
- ClearCommError(PrnID,&DErr,&Stat);
- if (! LPTFlag &&
- (OutBuffSize - (int)Stat.cbOutQue < c)) {
- c = OutBuffSize - Stat.cbOutQue;
- }
- if (c<=0) {
- return 0;
- }
- if (! WriteFile(PrnID,b,c,(LPDWORD)&d,NULL)) {
- d = 0;
- }
- ClearCommError(PrnID,&DErr,NULL);
- return d;
-}
-
-void PrnCancel()
-{
- PurgeComm(PrnID, PURGE_TXABORT | PURGE_TXCLEAR);
- PrnClose();
-}
-
-void PrnClose()
-{
- if (PrnID != INVALID_HANDLE_VALUE) {
- if (!LPTFlag) {
- EscapeCommFunction(PrnID,CLRDTR);
- }
- CloseHandle(PrnID);
- }
- PrnID = INVALID_HANDLE_VALUE;
-}
+/* Tera Term
+ Copyright(C) 1994-1998 T. Teranishi
+ All rights reserved. */
+/* IPv6 modification is Copyright (C) 2000, 2001 Jun-ya KATO */
+
+/* TERATERM.EXE, Communication routines */
+#include "teraterm.h"
+#include "tttypes.h"
+#include "tt_res.h"
+#include
+
+#include "ttcommon.h"
+#include "ttwsk.h"
+#include "ttlib.h"
+#include "ttfileio.h"
+#include "ttplug.h" /* TTPLUG */
+
+#include "commlib.h"
+#ifndef NO_INET6
+#include
+#include
+#include /* for _snprintf() */
+#include "WSAAsyncGetAddrInfo.h"
+#endif /* NO_INET6 */
+#include
+
+static SOCKET OpenSocket(PComVar);
+static void AsyncConnect(PComVar);
+static int CloseSocket(SOCKET);
+
+/* create socket */
+static SOCKET OpenSocket(PComVar cv)
+{
+ cv->s = cv->res->ai_family;
+ cv->s = Psocket(cv->res->ai_family, cv->res->ai_socktype, cv->res->ai_protocol);
+ return cv->s;
+}
+
+/* connect with asynchronous mode */
+static void AsyncConnect(PComVar cv)
+{
+ int Err;
+ BOOL BBuf;
+ BBuf = TRUE;
+ /* set synchronous mode */
+ PWSAAsyncSelect(cv->s,cv->HWin,0,0);
+ Psetsockopt(cv->s,(int)SOL_SOCKET,SO_OOBINLINE,(char FAR *)&BBuf,sizeof(BBuf));
+ /* set asynchronous mode */
+ PWSAAsyncSelect(cv->s,cv->HWin,WM_USER_COMMOPEN, FD_CONNECT);
+
+ // ?????????????????????????????????
+ // ?????L??????????0?????????B
+ // (2007.1.11 yutaka)
+ if (*cv->ConnetingTimeout > 0) {
+ SetTimer(cv->HWin, IdCancelConnectTimer, *cv->ConnetingTimeout * 1000, NULL);
+ }
+
+ /* WM_USER_COMMOPEN occurs, CommOpen is called, then CommStart is called */
+ Err = Pconnect(cv->s, cv->res->ai_addr, cv->res->ai_addrlen);
+ if (Err != 0) {
+ Err = PWSAGetLastError();
+ if (Err == WSAEWOULDBLOCK) {
+ /* Do nothing */
+ } else if (Err!=0 ) {
+ PostMessage(cv->HWin, WM_USER_COMMOPEN,0,
+ MAKELONG(FD_CONNECT,Err));
+ }
+ }
+}
+
+/* close socket */
+static int CloseSocket(SOCKET s)
+{
+ return Pclosesocket(s);
+}
+
+#define CommInQueSize 8192
+#define CommOutQueSize 2048
+#define CommXonLim 2048
+#define CommXoffLim 2048
+
+#define READENDNAME "ReadEnd"
+#define WRITENAME "Write"
+#define READNAME "Read"
+#define PRNWRITENAME "PrnWrite"
+
+static HANDLE ReadEnd;
+static OVERLAPPED wol, rol;
+
+// Winsock async operation handle
+static HANDLE HAsync=0;
+
+BOOL TCPIPClosed = TRUE;
+
+/* Printer port handle for
+ direct pass-thru printing */
+static HANDLE PrnID = INVALID_HANDLE_VALUE;
+static BOOL LPTFlag;
+
+// Initialize ComVar.
+// This routine is called only once
+// by the initialization procedure of Tera Term.
+void CommInit(PComVar cv)
+{
+ cv->Open = FALSE;
+ cv->Ready = FALSE;
+
+// log-buffer variables
+ cv->HLogBuf = 0;
+ cv->HBinBuf = 0;
+ cv->LogBuf = NULL;
+ cv->BinBuf = NULL;
+ cv->LogPtr = 0;
+ cv->LStart = 0;
+ cv->LCount = 0;
+ cv->BinPtr = 0;
+ cv->BStart = 0;
+ cv->BCount = 0;
+ cv->DStart = 0;
+ cv->DCount = 0;
+ cv->BinSkip = 0;
+ cv->FilePause = 0;
+ cv->ProtoFlag = FALSE;
+/* message flag */
+ cv->NoMsg = 0;
+}
+
+/* reset a serial port which is already open */
+void CommResetSerial(PTTSet ts, PComVar cv, BOOL ClearBuff)
+{
+ DCB dcb;
+ DWORD DErr;
+ COMMTIMEOUTS ctmo;
+
+ if (! cv->Open ||
+ (cv->PortType != IdSerial)) {
+ return;
+ }
+
+ ClearCommError(cv->ComID,&DErr,NULL);
+ SetupComm(cv->ComID,CommInQueSize,CommOutQueSize);
+ /* flush input and output buffers */
+ if (ClearBuff) {
+ PurgeComm(cv->ComID, PURGE_TXABORT | PURGE_RXABORT |
+ PURGE_TXCLEAR | PURGE_RXCLEAR);
+ }
+
+ memset(&ctmo,0,sizeof(ctmo));
+ ctmo.ReadIntervalTimeout = MAXDWORD;
+ ctmo.WriteTotalTimeoutConstant = 500;
+ SetCommTimeouts(cv->ComID,&ctmo);
+ cv->InBuffCount = 0;
+ cv->InPtr = 0;
+ cv->OutBuffCount = 0;
+ cv->OutPtr = 0;
+
+ cv->DelayPerChar = ts->DelayPerChar;
+ cv->DelayPerLine = ts->DelayPerLine;
+
+ memset(&dcb,0,sizeof(DCB));
+ dcb.DCBlength = sizeof(DCB);
+ dcb.BaudRate = GetCommSerialBaudRate(ts->Baud);
+ dcb.fBinary = TRUE;
+ switch (ts->Parity) {
+ case IdParityEven:
+ dcb.fParity = TRUE;
+ dcb.Parity = EVENPARITY;
+ break;
+ case IdParityOdd:
+ dcb.fParity = TRUE;
+ dcb.Parity = ODDPARITY;
+ break;
+ case IdParityNone:
+ dcb.Parity = NOPARITY;
+ break;
+ }
+
+ dcb.fDtrControl = DTR_CONTROL_ENABLE;
+ dcb.fRtsControl = RTS_CONTROL_ENABLE;
+ switch (ts->Flow) {
+ case IdFlowX:
+ dcb.fOutX = TRUE;
+ dcb.fInX = TRUE;
+ dcb.XonLim = CommXonLim;
+ dcb.XoffLim = CommXoffLim;
+ dcb.XonChar = XON;
+ dcb.XoffChar = XOFF;
+ break;
+ case IdFlowHard:
+ dcb.fOutxCtsFlow = TRUE;
+ dcb.fRtsControl = RTS_CONTROL_HANDSHAKE;
+ break;
+ }
+
+ switch (ts->DataBit) {
+ case IdDataBit7:
+ dcb.ByteSize = 7;
+ break;
+ case IdDataBit8:
+ dcb.ByteSize = 8;
+ break;
+ }
+ switch (ts->StopBit) {
+ case IdStopBit1:
+ dcb.StopBits = ONESTOPBIT;
+ break;
+ case IdStopBit2:
+ dcb.StopBits = TWOSTOPBITS;
+ break;
+ }
+
+ SetCommState(cv->ComID, &dcb);
+
+ /* enable receive request */
+ SetCommMask(cv->ComID,0);
+ SetCommMask(cv->ComID,EV_RXCHAR);
+}
+
+void CommOpen(HWND HW, PTTSet ts, PComVar cv)
+{
+#ifdef NO_INET6
+ int Err;
+#endif /* NO_INET6 */
+ char ErrMsg[21];
+ char P[50];
+
+ MSG Msg;
+#ifndef NO_INET6
+ ADDRINFO hints;
+ char pname[NI_MAXSERV];
+#else
+ char HEntBuff[MAXGETHOSTSTRUCT];
+ u_long addr;
+ SOCKADDR_IN saddr;
+#endif /* NO_INET6 */
+
+ BOOL InvalidHost;
+#ifdef NO_INET6
+ BOOL BBuf;
+#endif /* NO_INET6 */
+
+ char uimsg[MAX_UIMSG];
+
+ /* initialize ComVar */
+ cv->InBuffCount = 0;
+ cv->InPtr = 0;
+ cv->OutBuffCount = 0;
+ cv->OutPtr = 0;
+ cv->HWin = HW;
+ cv->Ready = FALSE;
+ cv->Open = FALSE;
+ cv->PortType = ts->PortType;
+ cv->ComPort = 0;
+ cv->RetryCount = 0;
+#ifndef NO_INET6
+ cv->RetryWithOtherProtocol = TRUE;
+#endif /* NO_INET6 */
+ cv->s = INVALID_SOCKET;
+ cv->ComID = INVALID_HANDLE_VALUE;
+ cv->CanSend = TRUE;
+ cv->RRQ = FALSE;
+ cv->SendKanjiFlag = FALSE;
+ cv->SendCode = IdASCII;
+ cv->EchoKanjiFlag = FALSE;
+ cv->EchoCode = IdASCII;
+ cv->Language = ts->Language;
+ cv->CRSend = ts->CRSend;
+ cv->KanjiCodeEcho = ts->KanjiCode;
+ cv->JIS7KatakanaEcho = ts->JIS7Katakana;
+ cv->KanjiCodeSend = ts->KanjiCodeSend;
+ cv->JIS7KatakanaSend = ts->JIS7KatakanaSend;
+ cv->KanjiIn = ts->KanjiIn;
+ cv->KanjiOut = ts->KanjiOut;
+ cv->RussHost = ts->RussHost;
+ cv->RussClient = ts->RussClient;
+ cv->DelayFlag = TRUE;
+ cv->DelayPerChar = ts->DelayPerChar;
+ cv->DelayPerLine = ts->DelayPerLine;
+ cv->TelBinRecv = FALSE;
+ cv->TelBinSend = FALSE;
+ cv->TelFlag = FALSE;
+ cv->TelMode = FALSE;
+ cv->IACFlag = FALSE;
+ cv->TelCRFlag = FALSE;
+ cv->TelCRSend = FALSE;
+ cv->TelCRSendEcho = FALSE;
+ cv->TelAutoDetect = ts->TelAutoDetect; /* TTPLUG */
+ cv->Locale = ts->Locale;
+ cv->CodePage = &ts->CodePage;
+ cv->ConnetingTimeout = &ts->ConnectingTimeout;
+ cv->LastSendTime = time(NULL);
+ cv->LineModeBuffCount = 0;
+ cv->Flush = FALSE;
+ cv->FlushLen = 0;
+ cv->TelLineMode = FALSE;
+
+ if ((ts->PortType!=IdSerial) && (strlen(ts->HostName)==0))
+ {
+ PostMessage(cv->HWin, WM_USER_COMMNOTIFY, 0, FD_CLOSE);
+ return;
+ }
+
+ switch (ts->PortType) {
+ case IdTCPIP:
+ cv->TelFlag = (ts->Telnet > 0);
+ if (ts->EnableLineMode) {
+ cv->TelLineMode = TRUE;
+ }
+ if (! LoadWinsock()) {
+ if (cv->NoMsg==0) {
+ get_lang_msg("MSG_TT_ERROR", uimsg, sizeof(uimsg), "Tera Term: Error", ts->UILanguageFile);
+ get_lang_msg("MSG_WINSOCK_ERROR", ts->UIMsg, sizeof(ts->UIMsg), "Cannot use winsock", ts->UILanguageFile);
+ MessageBox(cv->HWin,ts->UIMsg,uimsg,MB_TASKMODAL | MB_ICONEXCLAMATION);
+ }
+ InvalidHost = TRUE;
+ }
+ else {
+ TTXOpenTCP(); /* TTPLUG */
+ cv->Open = TRUE;
+#ifndef NO_INET6
+ /* resolving address */
+ memset(&hints, 0, sizeof(hints));
+ hints.ai_family = ts->ProtocolFamily;
+ hints.ai_socktype = SOCK_STREAM;
+ hints.ai_protocol = IPPROTO_TCP;
+ _snprintf_s(pname, sizeof(pname), _TRUNCATE, "%d", ts->TCPPort);
+
+ HAsync = WSAAsyncGetAddrInfo(HW, WM_USER_GETHOST,
+ ts->HostName, pname, &hints, &cv->res0);
+ if (HAsync == 0)
+ InvalidHost = TRUE;
+ else {
+ cv->ComPort = 1; // set "getting host" flag
+ // (see CVTWindow::OnSysCommand())
+ do {
+ if (GetMessage(&Msg,0,0,0)) {
+ if ((Msg.hwnd==HW) &&
+ ((Msg.message == WM_SYSCOMMAND) &&
+ ((Msg.wParam & 0xfff0) == SC_CLOSE) ||
+ (Msg.message == WM_COMMAND) &&
+ (LOWORD(Msg.wParam) == ID_FILE_EXIT) ||
+ (Msg.message == WM_CLOSE))) { /* Exit when the user closes Tera Term */
+ PWSACancelAsyncRequest(HAsync);
+ CloseHandle(HAsync);
+ HAsync = 0;
+ cv->ComPort = 0; // clear "getting host" flag
+ PostMessage(HW,Msg.message,Msg.wParam,Msg.lParam);
+ return;
+ }
+ if (Msg.message != WM_USER_GETHOST) { /* Prosess messages */
+ TranslateMessage(&Msg);
+ DispatchMessage(&Msg);
+ }
+ }
+ else {
+ return;
+ }
+ } while (Msg.message!=WM_USER_GETHOST);
+ cv->ComPort = 0; // clear "getting host" flag
+ CloseHandle(HAsync);
+ HAsync = 0;
+ InvalidHost = WSAGETASYNCERROR(Msg.lParam) != 0;
+ }
+ } /* if (!LoadWinsock()) */
+
+ if (InvalidHost) {
+ if (cv->NoMsg==0) {
+ get_lang_msg("MSG_TT_ERROR", uimsg, sizeof(uimsg), "Tera Term: Error", ts->UILanguageFile);
+ get_lang_msg("MSG_INVALID_HOST_ERROR", ts->UIMsg, sizeof(ts->UIMsg), "Invalid host", ts->UILanguageFile);
+ MessageBox(cv->HWin,ts->UIMsg,uimsg,MB_TASKMODAL | MB_ICONEXCLAMATION);
+ }
+ goto BreakSC;
+ }
+ for (cv->res = cv->res0; cv->res; cv->res = cv->res->ai_next) {
+ cv->s = OpenSocket(cv);
+ if (cv->s == INVALID_SOCKET) {
+ CloseSocket(cv->s);
+ continue;
+ }
+ /* start asynchronous connect */
+ AsyncConnect(cv);
+ break; /* break for-loop immediately */
+ }
+ break;
+#else
+ if ((ts->HostName[0] >= 0x30) && (ts->HostName[0] <= 0x39))
+ {
+ addr = Pinet_addr(ts->HostName);
+ InvalidHost = (addr == 0xffffffff);
+ }
+ else {
+ HAsync = PWSAAsyncGetHostByName(HW,WM_USER_GETHOST,
+ ts->HostName,HEntBuff,sizeof(HEntBuff));
+ if (HAsync == 0)
+ InvalidHost = TRUE;
+ else {
+ cv->ComPort = 1; // set "getting host" flag
+ // (see CVTWindow::OnSysCommand())
+ do {
+ if (GetMessage(&Msg,0,0,0))
+ {
+ if ((Msg.hwnd==HW) &&
+ ((Msg.message == WM_SYSCOMMAND) &&
+ ((Msg.wParam & 0xfff0) == SC_CLOSE) ||
+ (Msg.message == WM_COMMAND) &&
+ (LOWORD(Msg.wParam) == ID_FILE_EXIT) ||
+ (Msg.message == WM_CLOSE)))
+ { /* Exit when the user closes Tera Term */
+ PWSACancelAsyncRequest(HAsync);
+ HAsync = 0;
+ cv->ComPort = 0; // clear "getting host" flag
+ PostMessage(HW,Msg.message,Msg.wParam,Msg.lParam);
+ return;
+ }
+ if (Msg.message != WM_USER_GETHOST)
+ { /* Prosess messages */
+ TranslateMessage(&Msg);
+ DispatchMessage(&Msg);
+ }
+ }
+ else {
+ return;
+ }
+ } while (Msg.message!=WM_USER_GETHOST);
+ cv->ComPort = 0; // clear "getting host" flag
+ HAsync = 0;
+ InvalidHost = WSAGETASYNCERROR(Msg.lParam) != 0;
+ if (! InvalidHost)
+ {
+ if (((PHOSTENT)HEntBuff)->h_addr_list != NULL)
+ memcpy(&addr,
+ ((PHOSTENT)HEntBuff)->h_addr_list[0],sizeof(addr));
+ else
+ InvalidHost = TRUE;
+ }
+ }
+
+ }
+
+ if (InvalidHost)
+ {
+ if (cv->NoMsg==0)
+ MessageBox(cv->HWin,"Invalid host",ErrorCaption,
+ MB_TASKMODAL | MB_ICONEXCLAMATION);
+ }
+ else {
+ cv->s= Psocket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
+ if (cv->s==INVALID_SOCKET)
+ {
+ InvalidHost = TRUE;
+ if (cv->NoMsg==0)
+ MessageBox(cv->HWin,ErrorCantConn,ErrorCaption,
+ MB_TASKMODAL | MB_ICONEXCLAMATION);
+ }
+ else {
+ BBuf = TRUE;
+ Psetsockopt(cv->s,(int)SOL_SOCKET,SO_OOBINLINE,(char FAR *)&BBuf,sizeof(BBuf));
+
+ PWSAAsyncSelect(cv->s,cv->HWin,WM_USER_COMMOPEN, FD_CONNECT);
+ saddr.sin_family = AF_INET;
+ saddr.sin_port = Phtons(ts->TCPPort);
+ saddr.sin_addr.s_addr = addr;
+ memset(saddr.sin_zero,0,8);
+
+ Err = Pconnect(cv->s,(LPSOCKADDR)&saddr,sizeof(saddr));
+ if (Err!=0 ) Err = PWSAGetLastError();
+ if (Err==WSAEWOULDBLOCK )
+ {
+ /* Do nothing */
+ }
+ else if (Err!=0 )
+ PostMessage(cv->HWin, WM_USER_COMMOPEN,0,
+ MAKELONG(FD_CONNECT,Err));
+ }
+ }
+ }
+ break;
+#endif /* NO_INET6 */
+
+ case IdSerial:
+ InitFileIO(IdSerial); /* TTPLUG */
+ TTXOpenFile(); /* TTPLUG */
+ _snprintf_s(P, sizeof(P), _TRUNCATE, "COM%d", ts->ComPort);
+ strncpy_s(ErrMsg, sizeof(ErrMsg),P, _TRUNCATE);
+ strncpy_s(P, sizeof(P),"\\\\.\\", _TRUNCATE);
+ strncat_s(P, sizeof(P),ErrMsg, _TRUNCATE);
+ cv->ComID =
+ PCreateFile(P,GENERIC_READ | GENERIC_WRITE,
+ 0,NULL,OPEN_EXISTING,
+ FILE_FLAG_OVERLAPPED,NULL);
+ if (cv->ComID == INVALID_HANDLE_VALUE ) {
+ get_lang_msg("MSG_CANTOEPN_ERROR", ts->UIMsg, sizeof(ts->UIMsg), "Cannot open %s", ts->UILanguageFile);
+ _snprintf_s(ErrMsg, sizeof(ErrMsg), _TRUNCATE, ts->UIMsg, &P[4]);
+
+ if (cv->NoMsg==0) {
+ get_lang_msg("MSG_TT_ERROR", uimsg, sizeof(uimsg), "Tera Term: Error", ts->UILanguageFile);
+ MessageBox(cv->HWin,ErrMsg,uimsg,MB_TASKMODAL | MB_ICONEXCLAMATION);
+ }
+ InvalidHost = TRUE;
+ }
+ else {
+ cv->Open = TRUE;
+ cv->ComPort = ts->ComPort;
+ CommResetSerial(ts, cv, ts->ClearComBuffOnOpen);
+ if (!ts->ClearComBuffOnOpen) {
+ cv->RRQ = TRUE;
+ }
+
+ /* notify to VT window that Comm Port is open */
+ PostMessage(cv->HWin, WM_USER_COMMOPEN, 0, 0);
+ InvalidHost = FALSE;
+
+ SetCOMFlag(ts->ComPort);
+ }
+ break; /* end of "case IdSerial:" */
+
+ case IdFile:
+ InitFileIO(IdFile); /* TTPLUG */
+ TTXOpenFile(); /* TTPLUG */
+ cv->ComID = PCreateFile(ts->HostName,GENERIC_READ,0,NULL,
+ OPEN_EXISTING,0,NULL);
+ InvalidHost = (cv->ComID == INVALID_HANDLE_VALUE);
+ if (InvalidHost) {
+ if (cv->NoMsg==0) {
+ get_lang_msg("MSG_TT_ERROR", uimsg, sizeof(uimsg), "Tera Term: Error", ts->UILanguageFile);
+ get_lang_msg("MSG_CANTOEPN_FILE_ERROR", ts->UIMsg, sizeof(ts->UIMsg), "Cannot open file", ts->UILanguageFile);
+ MessageBox(cv->HWin,ts->UIMsg,uimsg,MB_TASKMODAL | MB_ICONEXCLAMATION);
+ }
+ }
+ else {
+ cv->Open = TRUE;
+ PostMessage(cv->HWin, WM_USER_COMMOPEN, 0, 0);
+ }
+ break;
+ } /* end of "switch" */
+
+#ifndef NO_INET6
+BreakSC:
+#endif /* NO_INET6 */
+ if (InvalidHost) {
+ PostMessage(cv->HWin, WM_USER_COMMNOTIFY, 0, FD_CLOSE);
+ if ( (ts->PortType==IdTCPIP) && cv->Open ) {
+ if ( cv->s!=INVALID_SOCKET ) {
+ Pclosesocket(cv->s);
+ }
+ FreeWinsock();
+ }
+ return;
+ }
+}
+
+void CommThread(void *arg)
+{
+ DWORD Evt;
+ PComVar cv = (PComVar)arg;
+ DWORD DErr;
+ HANDLE REnd;
+ char Temp[20];
+
+ _snprintf_s(Temp, sizeof(Temp), _TRUNCATE, "%s%d", READENDNAME, cv->ComPort);
+ REnd = OpenEvent(EVENT_ALL_ACCESS,FALSE, Temp);
+ while (TRUE) {
+ if (WaitCommEvent(cv->ComID,&Evt,NULL)) {
+ if (! cv->Ready) {
+ _endthread();
+ }
+ if (! cv->RRQ) {
+ PostMessage(cv->HWin, WM_USER_COMMNOTIFY, 0, FD_READ);
+ }
+ WaitForSingleObject(REnd,INFINITE);
+ }
+ else {
+ DErr = GetLastError(); // this returns 995 (operation aborted) if a USB com port is removed
+ if (! cv->Ready || ERROR_OPERATION_ABORTED == DErr) {
+ _endthread();
+ }
+ ClearCommError(cv->ComID,&DErr,NULL);
+ }
+ }
+}
+
+void CommStart(PComVar cv, LONG lParam, PTTSet ts)
+{
+ char ErrMsg[31];
+ char Temp[20];
+ char uimsg[MAX_UIMSG];
+
+ if (! cv->Open ) {
+ return;
+ }
+ if ( cv->Ready ) {
+ return;
+ }
+
+ // ????????????????B????????? WM_TIMER ??????????????
+ if (*cv->ConnetingTimeout > 0) {
+ KillTimer(cv->HWin, IdCancelConnectTimer);
+ }
+
+ switch (cv->PortType) {
+ case IdTCPIP:
+ ErrMsg[0] = 0;
+ switch (HIWORD(lParam)) {
+ case WSAECONNREFUSED:
+ get_lang_msg("MSG_COMM_REFUSE_ERROR", ts->UIMsg, sizeof(ts->UIMsg), "Connection refused", ts->UILanguageFile);
+ _snprintf_s(ErrMsg, sizeof(ErrMsg), _TRUNCATE, "%s", ts->UIMsg);
+ break;
+ case WSAENETUNREACH:
+ get_lang_msg("MSG_COMM_REACH_ERROR", ts->UIMsg, sizeof(ts->UIMsg), "Network cannot be reached", ts->UILanguageFile);
+ _snprintf_s(ErrMsg, sizeof(ErrMsg), _TRUNCATE, "%s", ts->UIMsg);
+ break;
+ case WSAETIMEDOUT:
+ get_lang_msg("MSG_COMM_CONNECT_ERROR", ts->UIMsg, sizeof(ts->UIMsg), "Connection timed out", ts->UILanguageFile);
+ _snprintf_s(ErrMsg, sizeof(ErrMsg), _TRUNCATE, "%s", ts->UIMsg);
+ break;
+ default:
+ get_lang_msg("MSG_COMM_TIMEOUT_ERROR", ts->UIMsg, sizeof(ts->UIMsg), "Cannot connect the host", ts->UILanguageFile);
+ _snprintf_s(ErrMsg, sizeof(ErrMsg), _TRUNCATE, "%s", ts->UIMsg);
+ }
+ if (HIWORD(lParam)>0) {
+#ifndef NO_INET6
+ /* connect() failed */
+ if (cv->res->ai_next != NULL) {
+ /* try to connect with other protocol */
+ CloseSocket(cv->s);
+ for (cv->res = cv->res->ai_next; cv->res; cv->res = cv->res->ai_next) {
+ cv->s = OpenSocket(cv);
+ if (cv->s == INVALID_SOCKET) {
+ CloseSocket(cv->s);
+ continue;
+ }
+ AsyncConnect(cv);
+ cv->Ready = FALSE;
+ cv->RetryWithOtherProtocol = TRUE; /* retry with other procotol */
+ return;
+ }
+ } else {
+ /* trying with all protocol family are failed */
+ if (cv->NoMsg==0)
+ {
+ get_lang_msg("MSG_TT_ERROR", uimsg, sizeof(uimsg), "Tera Term: Error", ts->UILanguageFile);
+ MessageBox(cv->HWin,ErrMsg,uimsg,MB_TASKMODAL | MB_ICONEXCLAMATION);
+ }
+ PostMessage(cv->HWin, WM_USER_COMMNOTIFY, 0, FD_CLOSE);
+ cv->RetryWithOtherProtocol = FALSE;
+ return;
+ }
+#else
+ if (cv->NoMsg==0)
+ MessageBox(cv->HWin,ErrMsg,ErrorCaption,
+ MB_TASKMODAL | MB_ICONEXCLAMATION);
+ PostMessage(cv->HWin, WM_USER_COMMNOTIFY, 0, FD_CLOSE);
+ return;
+#endif /* NO_INET6 */
+ }
+
+#ifndef NO_INET6
+ /* here is connection established */
+ cv->RetryWithOtherProtocol = FALSE;
+#endif /* NO_INET6 */
+ PWSAAsyncSelect(cv->s,cv->HWin,WM_USER_COMMNOTIFY, FD_READ | FD_OOB | FD_CLOSE);
+ TCPIPClosed = FALSE;
+ break;
+
+ case IdSerial:
+ _snprintf_s(Temp, sizeof(Temp), _TRUNCATE, "%s%d", READENDNAME, cv->ComPort);
+ ReadEnd = CreateEvent(NULL,FALSE,FALSE,Temp);
+ _snprintf_s(Temp, sizeof(Temp), _TRUNCATE, "%s%d", WRITENAME, cv->ComPort);
+ memset(&wol,0,sizeof(OVERLAPPED));
+ wol.hEvent = CreateEvent(NULL,TRUE,TRUE,Temp);
+ _snprintf_s(Temp, sizeof(Temp), _TRUNCATE, "%s%d", READNAME, cv->ComPort);
+ memset(&rol,0,sizeof(OVERLAPPED));
+ rol.hEvent = CreateEvent(NULL,TRUE,FALSE,Temp);
+
+ /* create the receiver thread */
+ if (_beginthread(CommThread,0,cv) == -1) {
+ get_lang_msg("MSG_TT_ERROR", uimsg, sizeof(uimsg), "Tera Term: Error", ts->UILanguageFile);
+ get_lang_msg("MSG_TT_ERROR", ts->UIMsg, sizeof(ts->UIMsg), "Can't create thread", ts->UILanguageFile);
+ MessageBox(cv->HWin,ts->UIMsg,uimsg,MB_TASKMODAL | MB_ICONEXCLAMATION);
+ }
+ break;
+
+ case IdFile:
+ cv->RRQ = TRUE;
+ break;
+ }
+ cv->Ready = TRUE;
+}
+
+BOOL CommCanClose(PComVar cv)
+{ // check if data remains in buffer
+ if (! cv->Open) {
+ return TRUE;
+ }
+ if (cv->InBuffCount>0) {
+ return FALSE;
+ }
+ if ((cv->HLogBuf!=NULL) &&
+ ((cv->LCount>0) ||
+ (cv->DCount>0))) {
+ return FALSE;
+ }
+ if ((cv->HBinBuf!=NULL) &&
+ (cv->BCount>0)) {
+ return FALSE;
+ }
+ return TRUE;
+}
+
+void CommClose(PComVar cv)
+{
+ if ( ! cv->Open ) {
+ return;
+ }
+ cv->Open = FALSE;
+
+ /* disable event message posting & flush buffer */
+ cv->RRQ = FALSE;
+ cv->Ready = FALSE;
+ cv->InPtr = 0;
+ cv->InBuffCount = 0;
+ cv->OutPtr = 0;
+ cv->OutBuffCount = 0;
+ cv->LineModeBuffCount = 0;
+ cv->FlushLen = 0;
+ cv->Flush = FALSE;
+
+ /* close port & release resources */
+ switch (cv->PortType) {
+ case IdTCPIP:
+ if (HAsync!=0) {
+ PWSACancelAsyncRequest(HAsync);
+ }
+ HAsync = 0;
+#ifndef NO_INET6
+ freeaddrinfo(cv->res0);
+#endif /* NO_INET6 */
+ if ( cv->s!=INVALID_SOCKET ) {
+ Pclosesocket(cv->s);
+ }
+ cv->s = INVALID_SOCKET;
+ TTXCloseTCP(); /* TTPLUG */
+ FreeWinsock();
+ break;
+ case IdSerial:
+ if ( cv->ComID != INVALID_HANDLE_VALUE ) {
+ CloseHandle(ReadEnd);
+ CloseHandle(wol.hEvent);
+ CloseHandle(rol.hEvent);
+ PurgeComm(cv->ComID, PURGE_TXABORT | PURGE_RXABORT |
+ PURGE_TXCLEAR | PURGE_RXCLEAR);
+ EscapeCommFunction(cv->ComID,CLRDTR);
+ SetCommMask(cv->ComID,0);
+ PCloseFile(cv->ComID);
+ ClearCOMFlag(cv->ComPort);
+ }
+ TTXCloseFile(); /* TTPLUG */
+ break;
+ case IdFile:
+ if (cv->ComID != INVALID_HANDLE_VALUE) {
+ PCloseFile(cv->ComID);
+ }
+ TTXCloseFile(); /* TTPLUG */
+ break;
+ }
+ cv->ComID = INVALID_HANDLE_VALUE;
+ cv->PortType = 0;
+}
+
+void CommProcRRQ(PComVar cv)
+{
+ if ( ! cv->Ready ) {
+ return;
+ }
+ /* disable receive request */
+ switch (cv->PortType) {
+ case IdTCPIP:
+ if (! TCPIPClosed) {
+ PWSAAsyncSelect(cv->s,cv->HWin,WM_USER_COMMNOTIFY, FD_OOB | FD_CLOSE);
+ }
+ break;
+ case IdSerial:
+ break;
+ }
+ cv->RRQ = TRUE;
+ CommReceive(cv);
+}
+
+void CommReceive(PComVar cv)
+{
+ DWORD C;
+ DWORD DErr;
+
+ if (! cv->Ready || ! cv->RRQ ||
+ (cv->InBuffCount>=InBuffSize)) {
+ return;
+ }
+
+ /* Compact buffer */
+ if ((cv->InBuffCount>0) && (cv->InPtr>0)) {
+ memmove(cv->InBuff,&(cv->InBuff[cv->InPtr]),cv->InBuffCount);
+ cv->InPtr = 0;
+ }
+
+ if (cv->InBuffCountPortType) {
+ case IdTCPIP:
+ C = Precv(cv->s, &(cv->InBuff[cv->InBuffCount]),
+ InBuffSize-cv->InBuffCount, 0);
+ if (C == SOCKET_ERROR) {
+ C = 0;
+ PWSAGetLastError();
+ }
+ cv->InBuffCount = cv->InBuffCount + C;
+ break;
+ case IdSerial:
+ do {
+ ClearCommError(cv->ComID,&DErr,NULL);
+ if (! PReadFile(cv->ComID,&(cv->InBuff[cv->InBuffCount]),
+ InBuffSize-cv->InBuffCount,&C,&rol)) {
+ if (GetLastError() == ERROR_IO_PENDING) {
+ if (WaitForSingleObject(rol.hEvent, 1000) != WAIT_OBJECT_0) {
+ C = 0;
+ }
+ else {
+ GetOverlappedResult(cv->ComID,&rol,&C,FALSE);
+ }
+ }
+ else {
+ C = 0;
+ }
+ }
+ cv->InBuffCount = cv->InBuffCount + C;
+ } while ((C!=0) && (cv->InBuffCountComID,&DErr,NULL);
+ break;
+ case IdFile:
+ if (PReadFile(cv->ComID,&(cv->InBuff[cv->InBuffCount]),
+ InBuffSize-cv->InBuffCount,&C,NULL)) {
+ if (C == 0) {
+ DErr = ERROR_HANDLE_EOF;
+ }
+ else {
+ cv->InBuffCount = cv->InBuffCount + C;
+ }
+ }
+ else {
+ DErr = GetLastError();
+ }
+ break;
+ }
+ }
+
+ if (cv->InBuffCount==0) {
+ switch (cv->PortType) {
+ case IdTCPIP:
+ if (! TCPIPClosed) {
+ PWSAAsyncSelect(cv->s,cv->HWin, WM_USER_COMMNOTIFY,
+ FD_READ | FD_OOB | FD_CLOSE);
+ }
+ break;
+ case IdSerial:
+ cv->RRQ = FALSE;
+ SetEvent(ReadEnd);
+ return;
+ case IdFile:
+ if (DErr != ERROR_IO_PENDING) {
+ PostMessage(cv->HWin, WM_USER_COMMNOTIFY, 0, FD_CLOSE);
+ cv->RRQ = FALSE;
+ }
+ else {
+ cv->RRQ = TRUE;
+ }
+ return;
+ }
+ cv->RRQ = FALSE;
+ }
+}
+
+void CommSend(PComVar cv)
+{
+ int delay;
+ COMSTAT Stat;
+ BYTE LineEnd;
+ int C, D, Max;
+ DWORD DErr;
+
+ if ((! cv->Open) || (! cv->Ready)) {
+ cv->OutBuffCount = 0;
+ return;
+ }
+
+ if ((cv->OutBuffCount == 0) || (! cv->CanSend)) {
+ return;
+ }
+
+ /* Max num of bytes to be written */
+ switch (cv->PortType) {
+ case IdTCPIP:
+ if (TCPIPClosed) {
+ cv->OutBuffCount = 0;
+ }
+ Max = cv->OutBuffCount;
+ break;
+ case IdSerial:
+ ClearCommError(cv->ComID,&DErr,&Stat);
+ Max = OutBuffSize - Stat.cbOutQue;
+ break;
+ case IdFile:
+ Max = cv->OutBuffCount;
+ break;
+ }
+
+ if ( Max<=0 ) {
+ return;
+ }
+ if ( Max > cv->OutBuffCount ) {
+ Max = cv->OutBuffCount;
+ }
+
+ if (cv->PortType == IdTCPIP && cv->TelFlag) {
+ cv->LastSendTime = time(NULL);
+ }
+
+ C = Max;
+ delay = 0;
+
+ if ( cv->DelayFlag && (cv->PortType==IdSerial) ) {
+ if ( cv->DelayPerLine > 0 ) {
+ if ( cv->CRSend==IdCR ) {
+ LineEnd = 0x0d;
+ }
+ else {
+ LineEnd = 0x0a;
+ }
+ C = 1;
+ if ( cv->DelayPerChar==0 ) {
+ while ((COutBuff[cv->OutPtr+C-1]!=LineEnd)) {
+ C++;
+ }
+ }
+ if ( cv->OutBuff[cv->OutPtr+C-1]==LineEnd ) {
+ delay = cv->DelayPerLine;
+ }
+ else {
+ delay = cv->DelayPerChar;
+ }
+ }
+ else if ( cv->DelayPerChar > 0 ) {
+ C = 1;
+ delay = cv->DelayPerChar;
+ }
+ }
+
+ /* Write to comm driver/Winsock */
+ switch (cv->PortType) {
+ case IdTCPIP:
+ D = Psend(cv->s, &(cv->OutBuff[cv->OutPtr]), C, 0);
+ if ( D==SOCKET_ERROR ) { /* if error occurs */
+ PWSAGetLastError(); /* Clear error */
+ D = 0;
+ }
+ break;
+
+ case IdSerial:
+ if (! PWriteFile(cv->ComID,&(cv->OutBuff[cv->OutPtr]),C,(LPDWORD)&D,&wol)) {
+ if (GetLastError() == ERROR_IO_PENDING) {
+ if (WaitForSingleObject(wol.hEvent,1000) != WAIT_OBJECT_0) {
+ D = C; /* Time out, ignore data */
+ }
+ else {
+ GetOverlappedResult(cv->ComID,&wol,(LPDWORD)&D,FALSE);
+ }
+ }
+ else { /* I/O error */
+ D = C; /* ignore error */
+ }
+ }
+ ClearCommError(cv->ComID,&DErr,&Stat);
+ break;
+
+ case IdFile:
+ if (! PWriteFile(cv->ComID, &(cv->OutBuff[cv->OutPtr]), C, (LPDWORD)&D, NULL)) {
+ if (! GetLastError() == ERROR_IO_PENDING) {
+ D = C; /* ignore data */
+ }
+ }
+ break;
+ }
+
+ cv->OutBuffCount = cv->OutBuffCount - D;
+ if ( cv->OutBuffCount==0 ) {
+ cv->OutPtr = 0;
+ }
+ else {
+ cv->OutPtr = cv->OutPtr + D;
+ }
+
+ if ( (C==D) && (delay>0) ) {
+ cv->CanSend = FALSE;
+ SetTimer(cv->HWin, IdDelayTimer, delay, NULL);
+ }
+}
+
+void CommSendBreak(PComVar cv)
+/* for only serial ports */
+{
+ MSG DummyMsg;
+
+ if ( ! cv->Ready ) {
+ return;
+ }
+
+ switch (cv->PortType) {
+ case IdSerial:
+ /* Set com port into a break state */
+ SetCommBreak(cv->ComID);
+
+ /* pause for 1 sec */
+ if (SetTimer(cv->HWin, IdBreakTimer, 1000, NULL) != 0) {
+ GetMessage(&DummyMsg,cv->HWin,WM_TIMER,WM_TIMER);
+ }
+
+ /* Set com port into the nonbreak state */
+ ClearCommBreak(cv->ComID);
+ break;
+ }
+}
+
+void CommLock(PTTSet ts, PComVar cv, BOOL Lock)
+{
+ BYTE b;
+ DWORD Func;
+
+ if (! cv->Ready) {
+ return;
+ }
+ if ((cv->PortType==IdTCPIP) ||
+ (cv->PortType==IdSerial) &&
+ (ts->Flow!=IdFlowHard)) {
+ if (Lock) {
+ b = XOFF;
+ }
+ else {
+ b = XON;
+ }
+ CommBinaryOut(cv,&b,1);
+ }
+ else if ((cv->PortType==IdSerial) &&
+ (ts->Flow==IdFlowHard)) {
+ if (Lock) {
+ Func = CLRRTS;
+ }
+ else {
+ Func = SETRTS;
+ }
+ EscapeCommFunction(cv->ComID,Func);
+ }
+}
+
+int GetCommSerialBaudRate(int id)
+{
+ char *ch;
+ int val;
+
+ // id-1?????index????
+ ch = BaudList[id - 1];
+ val = atoi(ch);
+ return (val);
+}
+
+BOOL PrnOpen(PCHAR DevName)
+{
+ char Temp[MAXPATHLEN];
+ DCB dcb;
+ DWORD DErr;
+ COMMTIMEOUTS ctmo;
+
+ strncpy_s(Temp, sizeof(Temp),DevName, _TRUNCATE);
+ Temp[4] = 0; // COMn or LPTn
+ LPTFlag = (Temp[0]=='L') ||
+ (Temp[0]=='l');
+ PrnID = CreateFile(Temp,GENERIC_WRITE,
+ 0,NULL,OPEN_EXISTING,
+ 0,NULL);
+ if (PrnID == INVALID_HANDLE_VALUE) {
+ return FALSE;
+ }
+
+ if (GetCommState(PrnID,&dcb)) {
+ BuildCommDCB(DevName,&dcb);
+ SetCommState(PrnID,&dcb);
+ }
+ ClearCommError(PrnID,&DErr,NULL);
+ if (! LPTFlag) {
+ SetupComm(PrnID,0,CommOutQueSize);
+ }
+ /* flush output buffer */
+ PurgeComm(PrnID, PURGE_TXABORT | PURGE_TXCLEAR);
+ memset(&ctmo,0,sizeof(ctmo));
+ ctmo.WriteTotalTimeoutConstant = 1000;
+ SetCommTimeouts(PrnID,&ctmo);
+ if (! LPTFlag) {
+ EscapeCommFunction(PrnID,SETDTR);
+ }
+ return TRUE;
+}
+
+int PrnWrite(PCHAR b, int c)
+{
+ int d;
+ DWORD DErr;
+ COMSTAT Stat;
+
+ if (PrnID == INVALID_HANDLE_VALUE ) {
+ return c;
+ }
+
+ ClearCommError(PrnID,&DErr,&Stat);
+ if (! LPTFlag &&
+ (OutBuffSize - (int)Stat.cbOutQue < c)) {
+ c = OutBuffSize - Stat.cbOutQue;
+ }
+ if (c<=0) {
+ return 0;
+ }
+ if (! WriteFile(PrnID,b,c,(LPDWORD)&d,NULL)) {
+ d = 0;
+ }
+ ClearCommError(PrnID,&DErr,NULL);
+ return d;
+}
+
+void PrnCancel()
+{
+ PurgeComm(PrnID, PURGE_TXABORT | PURGE_TXCLEAR);
+ PrnClose();
+}
+
+void PrnClose()
+{
+ if (PrnID != INVALID_HANDLE_VALUE) {
+ if (!LPTFlag) {
+ EscapeCommFunction(PrnID,CLRDTR);
+ }
+ CloseHandle(PrnID);
+ }
+ PrnID = INVALID_HANDLE_VALUE;
+}
Modified: trunk/teraterm/ttpfile/ttfile.c
===================================================================
--- trunk/teraterm/ttpfile/ttfile.c 2010-04-12 13:48:37 UTC (rev 3856)
+++ trunk/teraterm/ttpfile/ttfile.c 2010-04-12 14:47:54 UTC (rev 3857)
@@ -1,1195 +1,1195 @@
-/* Tera Term
- Copyright(C) 1994-1998 T. Teranishi
- All rights reserved. */
-
-/* TTFILE.DLL, file transfer, VT window printing */
-#include "teraterm.h"
-#include "tttypes.h"
-#include "ttftypes.h"
-#include
-#include
-#include
-
-#include "ttlib.h"
-#include "ftlib.h"
-#include "dlglib.h"
-#include "kermit.h"
-#include "xmodem.h"
-#include "ymodem.h"
-#include "zmodem.h"
-#include "bplus.h"
-#include "quickvan.h"
-// resource IDs
-#include "file_res.h"
-
-#include
-#include
-#include
-
-#include "compat_w95.h"
-
-static HANDLE hInst;
-
-static HFONT DlgFoptFont;
-static HFONT DlgXoptFont;
-static HFONT DlgGetfnFont;
-
-char UILanguageFile[MAX_PATH];
-char FileSendFilter[128];
-
-BOOL FAR PASCAL GetSetupFname(HWND HWin, WORD FuncId, PTTSet ts)
-{
- int i, j;
- OPENFILENAME ofn;
- char uimsg[MAX_UIMSG];
-
- // char FNameFilter[HostNameMaxLength + 1]; // 81(yutaka)
- char FNameFilter[81]; // 81(yutaka)
- char TempDir[MAXPATHLEN];
- char Dir[MAXPATHLEN];
- char Name[MAXPATHLEN];
- BOOL Ok;
-
- /* save current dir */
- _getcwd(TempDir,sizeof(TempDir));
-
- /* File name filter */
- memset(FNameFilter, 0, sizeof(FNameFilter));
- if (FuncId==GSF_LOADKEY)
- {
- get_lang_msg("FILEDLG_KEYBOARD_FILTER", uimsg, sizeof(uimsg), "keyboard setup files (*.cnf)\\0*.cnf\\0\\0", UILanguageFile);
- memcpy(FNameFilter, uimsg, sizeof(FNameFilter));
- }
- else {
- get_lang_msg("FILEDLG_SETUP_FILTER", uimsg, sizeof(uimsg), "setup files (*.ini)\\0*.ini\\0\\0", UILanguageFile);
- memcpy(FNameFilter, uimsg, sizeof(FNameFilter));
- }
-
- /* OPENFILENAME record */
- memset(&ofn, 0, sizeof(OPENFILENAME));
-
- ofn.lStructSize = sizeof(OPENFILENAME);
- ofn.hwndOwner = HWin;
- ofn.lpstrFile = Name;
- ofn.nMaxFile = sizeof(Name);
- ofn.lpstrFilter = FNameFilter;
- ofn.nFilterIndex = 1;
- ofn.hInstance = hInst;
-
- if (FuncId==GSF_LOADKEY)
- {
- ofn.lpstrDefExt = "cnf";
- GetFileNamePos(ts->KeyCnfFN,&i,&j);
- strncpy_s(Name, sizeof(Name),&(ts->KeyCnfFN[j]), _TRUNCATE);
- memcpy(Dir,ts->KeyCnfFN,i);
- Dir[i] = 0;
-
- if ((strlen(Name)==0) || (_stricmp(Name,"KEYBOARD.CNF")==0))
- strncpy_s(Name, sizeof(Name),"KEYBOARD.CNF", _TRUNCATE);
- }
- else {
- ofn.lpstrDefExt = "ini";
- GetFileNamePos(ts->SetupFName,&i,&j);
- strncpy_s(Name, sizeof(Name),&(ts->SetupFName[j]), _TRUNCATE);
- memcpy(Dir,ts->SetupFName,i);
- Dir[i] = 0;
-
- if ((strlen(Name)==0) || (_stricmp(Name,"TERATERM.INI")==0))
- strncpy_s(Name, sizeof(Name),"TERATERM.INI", _TRUNCATE);
- }
-
- if (strlen(Dir)==0)
- strncpy_s(Dir, sizeof(Dir),ts->HomeDir, _TRUNCATE);
-
- _chdir(Dir);
-
- ofn.Flags = OFN_SHOWHELP | OFN_HIDEREADONLY;
- switch (FuncId) {
- case GSF_SAVE:
- // ??t???????????????????????????(2005.1.6 yutaka)
- // ??????teraterm.ini???????????????
- // ??????/F= ????????????????????(2005.1.26 yutaka)
- // Windows Vista ?????????????? NULL ??????????????
- // ?????????????????????????????(2006.9.16 maya)
-// ofn.lpstrInitialDir = __argv[0];
-// ofn.lpstrInitialDir = ts->SetupFName;
- ofn.lpstrInitialDir = Dir;
- get_lang_msg("FILEDLG_SAVE_SETUP_TITLE", uimsg, sizeof(uimsg), "Tera Term: Save setup", UILanguageFile);
- ofn.lpstrTitle = uimsg;
- Ok = GetSaveFileName(&ofn);
- if (Ok)
- strncpy_s(ts->SetupFName, sizeof(ts->SetupFName),Name, _TRUNCATE);
- break;
- case GSF_RESTORE:
- ofn.Flags = ofn.Flags | OFN_FILEMUSTEXIST;
- get_lang_msg("FILEDLG_RESTORE_SETUP_TITLE", uimsg, sizeof(uimsg), "Tera Term: Restore setup", UILanguageFile);
- ofn.lpstrTitle = uimsg;
- Ok = GetOpenFileName(&ofn);
- if (Ok)
- strncpy_s(ts->SetupFName, sizeof(ts->SetupFName),Name, _TRUNCATE);
- break;
- case GSF_LOADKEY:
- ofn.Flags = ofn.Flags | OFN_FILEMUSTEXIST;
- get_lang_msg("FILEDLG_LOAD_KEYMAP_TITLE", uimsg, sizeof(uimsg), "Tera Term: Load key map", UILanguageFile);
- ofn.lpstrTitle = uimsg;
- Ok = GetOpenFileName(&ofn);
- if (Ok)
- strncpy_s(ts->KeyCnfFN, sizeof(ts->KeyCnfFN),Name, _TRUNCATE);
- break;
- }
-
- /* restore dir */
- _chdir(TempDir);
-
- return Ok;
-}
-
-/* Hook function for file name dialog box */
-BOOL CALLBACK TFnHook(HWND Dialog, UINT Message, WPARAM wParam, LPARAM lParam)
-{
- LPOPENFILENAME ofn;
- WORD Lo, Hi;
- LPLONG pl;
- LPOFNOTIFY notify;
- char uimsg[MAX_UIMSG], uimsg2[MAX_UIMSG];
- LOGFONT logfont;
- HFONT font;
-
- switch (Message) {
- case WM_INITDIALOG:
- ofn = (LPOPENFILENAME)lParam;
- pl = (LPLONG)(ofn->lCustData);
- SetWindowLong(Dialog, DWL_USER, (LONG)pl);
-
- font = (HFONT)SendMessage(Dialog, WM_GETFONT, 0, 0);
- GetObject(font, sizeof(LOGFONT), &logfont);
- if (get_lang_font("DLG_TAHOMA_FONT", Dialog, &logfont, &DlgFoptFont, UILanguageFile)) {
- SendDlgItemMessage(Dialog, IDC_FOPT, WM_SETFONT, (WPARAM)DlgFoptFont, MAKELPARAM(TRUE,0));
- SendDlgItemMessage(Dialog, IDC_FOPTBIN, WM_SETFONT, (WPARAM)DlgFoptFont, MAKELPARAM(TRUE,0));
- SendDlgItemMessage(Dialog, IDC_FOPTAPPEND, WM_SETFONT, (WPARAM)DlgFoptFont, MAKELPARAM(TRUE,0));
- SendDlgItemMessage(Dialog, IDC_PLAINTEXT, WM_SETFONT, (WPARAM)DlgFoptFont, MAKELPARAM(TRUE,0));
- SendDlgItemMessage(Dialog, IDC_TIMESTAMP, WM_SETFONT, (WPARAM)DlgFoptFont, MAKELPARAM(TRUE,0));
- SendDlgItemMessage(Dialog, IDC_HIDEDIALOG, WM_SETFONT, (WPARAM)DlgFoptFont, MAKELPARAM(TRUE,0));
- }
- else {
- DlgFoptFont = NULL;
- }
-
- GetDlgItemText(Dialog, IDC_FOPT, uimsg2, sizeof(uimsg2));
- get_lang_msg("DLG_FOPT", uimsg, sizeof(uimsg), uimsg2, UILanguageFile);
- SetDlgItemText(Dialog, IDC_FOPT, uimsg);
- GetDlgItemText(Dialog, IDC_FOPTBIN, uimsg2, sizeof(uimsg2));
- get_lang_msg("DLG_FOPT_BINARY", uimsg, sizeof(uimsg), uimsg2, UILanguageFile);
- SetDlgItemText(Dialog, IDC_FOPTBIN, uimsg);
- GetDlgItemText(Dialog, IDC_FOPTAPPEND, uimsg2, sizeof(uimsg2));
- get_lang_msg("DLG_FOPT_APPEND", uimsg, sizeof(uimsg), uimsg2, UILanguageFile);
- SetDlgItemText(Dialog, IDC_FOPTAPPEND, uimsg);
- GetDlgItemText(Dialog, IDC_PLAINTEXT, uimsg2, sizeof(uimsg2));
- get_lang_msg("DLG_FOPT_PLAIN", uimsg, sizeof(uimsg), uimsg2, UILanguageFile);
- SetDlgItemText(Dialog, IDC_PLAINTEXT, uimsg);
- GetDlgItemText(Dialog, IDC_TIMESTAMP, uimsg2, sizeof(uimsg2));
- get_lang_msg("DLG_FOPT_TIMESTAMP", uimsg, sizeof(uimsg), uimsg2, UILanguageFile);
- SetDlgItemText(Dialog, IDC_TIMESTAMP, uimsg);
- GetDlgItemText(Dialog, IDC_HIDEDIALOG, uimsg2, sizeof(uimsg2));
- get_lang_msg("DLG_FOPT_HIDEDIALOG", uimsg, sizeof(uimsg), uimsg2, UILanguageFile);
- SetDlgItemText(Dialog, IDC_HIDEDIALOG, uimsg);
-
- Lo = LOWORD(*pl) & 1;
- Hi = HIWORD(*pl);
- SetRB(Dialog,Lo,IDC_FOPTBIN,IDC_FOPTBIN);
- if (Hi!=0xFFFF)
- {
- ShowDlgItem(Dialog,IDC_FOPTAPPEND,IDC_FOPTAPPEND);
- SetRB(Dialog,Hi & 1,IDC_FOPTAPPEND,IDC_FOPTAPPEND);
-
- // plain text???????????????ON (2005.2.20 yutaka)
- ShowDlgItem(Dialog,IDC_PLAINTEXT,IDC_PLAINTEXT);
- if (Lo) {
- // Binary??????????????????
- DisableDlgItem(Dialog,IDC_PLAINTEXT,IDC_PLAINTEXT);
- }
- else if (Hi & 0x1000) {
- SetRB(Dialog,1,IDC_PLAINTEXT,IDC_PLAINTEXT);
- }
-
- // timestamp???????? (2006.7.23 maya)
- ShowDlgItem(Dialog,IDC_TIMESTAMP,IDC_TIMESTAMP);
- if (Lo) {
- // Binary??????????????????
- DisableDlgItem(Dialog,IDC_TIMESTAMP,IDC_TIMESTAMP);
- }
- else if (Hi & 0x2000) {
- SetRB(Dialog,1,IDC_TIMESTAMP,IDC_TIMESTAMP);
- }
-
- // Hide dialog???????? (2008.1.30 maya)
- ShowDlgItem(Dialog,IDC_HIDEDIALOG,IDC_HIDEDIALOG);
- if (Hi & 0x4000) {
- SetRB(Dialog,1,IDC_HIDEDIALOG,IDC_HIDEDIALOG);
- }
- }
- return TRUE;
-
- case WM_COMMAND: // for old style dialog
- switch (LOWORD(wParam)) {
- case IDOK:
- pl = (LPLONG)GetWindowLong(Dialog,DWL_USER);
- if (pl!=NULL)
- {
- GetRB(Dialog,&Lo,IDC_FOPTBIN,IDC_FOPTBIN);
- Hi = HIWORD(*pl);
- if (Hi!=0xFFFF)
- GetRB(Dialog,&Hi,IDC_FOPTAPPEND,IDC_FOPTAPPEND);
- *pl = MAKELONG(Lo,Hi);
- }
- break;
- case IDCANCEL:
- break;
- case IDC_FOPTBIN:
- GetRB(Dialog,&Lo,IDC_FOPTBIN,IDC_FOPTBIN);
- if (Lo) {
- DisableDlgItem(Dialog,IDC_PLAINTEXT,IDC_TIMESTAMP);
- }
- else {
- EnableDlgItem(Dialog,IDC_PLAINTEXT,IDC_TIMESTAMP);
- }
- break;
- }
- break;
- case WM_NOTIFY: // for Explorer-style dialog
- notify = (LPOFNOTIFY)lParam;
- switch (notify->hdr.code) {
- case CDN_FILEOK:
- pl = (LPLONG)GetWindowLong(Dialog,DWL_USER);
- if (pl!=NULL)
- {
- WORD val = 0;
-
- GetRB(Dialog,&Lo,IDC_FOPTBIN,IDC_FOPTBIN);
- Hi = HIWORD(*pl);
- if (Hi!=0xFFFF)
- GetRB(Dialog,&Hi,IDC_FOPTAPPEND,IDC_FOPTAPPEND);
-
- if (!Lo) {
- // plain text check-box
- GetRB(Dialog,&val,IDC_PLAINTEXT,IDC_PLAINTEXT);
- if (val > 0) { // checked
- Hi |= 0x1000;
- }
-
- // timestamp???????? (2006.7.23 maya)
- GetRB(Dialog,&val,IDC_TIMESTAMP,IDC_TIMESTAMP);
- if (val > 0) {
- Hi |= 0x2000;
- }
- }
-
- // Hide dialog???????? (2008.1.30 maya)
- GetRB(Dialog,&val,IDC_HIDEDIALOG,IDC_HIDEDIALOG);
- if (val > 0) {
- Hi |= 0x4000;
- }
-
- *pl = MAKELONG(Lo,Hi);
- }
- if (DlgFoptFont != NULL) {
- DeleteObject(DlgFoptFont);
- }
- break;
- }
- break;
- }
- return FALSE;
-}
-
-BOOL FAR PASCAL GetTransFname
- (PFileVar fv, PCHAR CurDir, WORD FuncId, LPLONG Option)
-{
- char uimsg[MAX_UIMSG];
- char FNFilter[sizeof(FileSendFilter)*3], *pf;
- OPENFILENAME ofn;
- LONG opt;
- char TempDir[MAXPATHLEN];
- BOOL Ok;
- char FileName[MAX_PATH];
-
- /* save current dir */
- _getcwd(TempDir,sizeof(TempDir));
-
- memset(FNFilter, 0, sizeof(FNFilter)); /* Set up for double null at end */
- memset(&ofn, 0, sizeof(OPENFILENAME));
-
- strncpy_s(fv->DlgCaption, sizeof(fv->DlgCaption),"Tera Term: ", _TRUNCATE);
- pf = FNFilter;
- switch (FuncId) {
- case GTF_SEND:
- get_lang_msg("FILEDLG_TRANS_TITLE_SENDFILE", uimsg, sizeof(uimsg), TitSendFile, UILanguageFile);
- strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
- if (strlen(FileSendFilter) > 0) {
- get_lang_msg("FILEDLG_USER_FILTER_NAME", uimsg, sizeof(uimsg), "User define", UILanguageFile);
- _snprintf_s(FNFilter, sizeof(FNFilter), _TRUNCATE, "%s(%s)", uimsg, FileSendFilter);
- pf = pf + strlen(FNFilter) + 1;
- strncpy_s(pf, sizeof(FNFilter)-(pf - FNFilter) ,FileSendFilter, _TRUNCATE);
- pf = pf + strlen(pf) + 1;
- }
- break;
- case GTF_LOG:
- get_lang_msg("FILEDLG_TRANS_TITLE_LOG", uimsg, sizeof(uimsg), TitLog, UILanguageFile);
- strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
- break;
- case GTF_BP:
- get_lang_msg("FILEDLG_TRANS_TITLE_BPSEND", uimsg, sizeof(uimsg), TitBPSend, UILanguageFile);
- strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
- if (strlen(FileSendFilter) > 0) {
- get_lang_msg("FILEDLG_USER_FILTER_NAME", uimsg, sizeof(uimsg), "User define", UILanguageFile);
- _snprintf_s(FNFilter, sizeof(FNFilter), _TRUNCATE, "%s(%s)", uimsg, FileSendFilter);
- pf = pf + strlen(FNFilter) + 1;
- strncpy_s(pf, sizeof(FNFilter)-(pf - FNFilter) ,FileSendFilter, _TRUNCATE);
- pf = pf + strlen(pf) + 1;
- }
- break;
- default: return FALSE;
- }
-
- get_lang_msg("FILEDLG_ALL_FILTER", uimsg, sizeof(uimsg), "All(*.*)\\0*.*\\0\\0", UILanguageFile);
- // \0\0 ????K?????? 2 ???
- memcpy(pf, uimsg, sizeof(FNFilter) - (pf - FNFilter + 2));
-
- ExtractFileName(fv->FullName, FileName ,sizeof(FileName));
- strncpy_s(fv->FullName, sizeof(fv->FullName), FileName, _TRUNCATE);
- ofn.lStructSize = sizeof(OPENFILENAME);
- ofn.hwndOwner = fv->HMainWin;
- ofn.lpstrFilter = FNFilter;
- ofn.nFilterIndex = 1;
- ofn.lpstrFile = fv->FullName;
- ofn.nMaxFile = sizeof(fv->FullName);
- if (FuncId == GTF_LOG) {
- DWORD logdir = GetFileAttributes(fv->LogDefaultPath);
- // ??????????t?????????????????(2007.8.24 yutaka)
- if (logdir != -1 && logdir & FILE_ATTRIBUTE_DIRECTORY) {
- // LogDefaultPath?????????????t???????(2007.11.30 maya)
- ofn.lpstrInitialDir = fv->LogDefaultPath;
- }
- else {
- ofn.lpstrInitialDir = NULL;
- }
- } else {
- ofn.lpstrInitialDir = CurDir;
- }
- ofn.Flags = OFN_SHOWHELP | OFN_HIDEREADONLY;
- if (FuncId!=GTF_BP)
- {
- ofn.Flags = ofn.Flags | OFN_ENABLETEMPLATE | OFN_ENABLEHOOK;
- ofn.Flags = ofn.Flags | OFN_EXPLORER;
- ofn.lpTemplateName = MAKEINTRESOURCE(IDD_FOPT);
- ofn.lpfnHook = (LPOFNHOOKPROC)(&TFnHook);
- }
- opt = *Option;
- if (FuncId!=GTF_LOG)
- {
- ofn.Flags = ofn.Flags | OFN_FILEMUSTEXIST;
- opt = MAKELONG(LOWORD(*Option),0xFFFF);
-
- // ??????????????????????????????- // ?????????????????????? (2008.5.18 maya)
- if (strlen(FileSendFilter) > 0 &&
- !isInvalidFileNameChar(FileSendFilter)) {
- char file[MAX_PATH];
- strncpy_s(file, sizeof(file), CurDir, _TRUNCATE);
- AppendSlash(file, sizeof(file));
- strncat_s(file, sizeof(file), FileSendFilter, _TRUNCATE);
- if (_access(file, 0) == 0) {
- strncpy_s(fv->FullName, sizeof(fv->FullName), FileSendFilter, _TRUNCATE);
- }
- }
- }
- ofn.lCustData = (DWORD)&opt;
- ofn.lpstrTitle = fv->DlgCaption;
-
- ofn.hInstance = hInst;
-
- // logging???A????????????????????? (2005.1.6 yutaka)
- if (FuncId == GTF_LOG) {
- // ?????????(log_YYYYMMDD_HHMMSS.txt)????? (2005.1.21 yutaka)
- // ??????????? teraterm.log ??? (2005.2.22 yutaka)
- // ??????????????????o????? (2006.8.28 maya)
- Ok = GetSaveFileName(&ofn);
- } else {
- Ok = GetOpenFileName(&ofn);
- }
-
- if (Ok)
- {
- if (FuncId==GTF_LOG)
- *Option = opt;
- else
- *Option = MAKELONG(LOWORD(opt),HIWORD(*Option));
-
- fv->DirLen = ofn.nFileOffset;
-
- if (CurDir!=NULL)
- {
- memcpy(CurDir,fv->FullName,fv->DirLen-1);
- CurDir[fv->DirLen-1] = 0;
- }
- }
- /* restore dir */
- _chdir(TempDir);
- return Ok;
-}
-
-BOOL CALLBACK TFn2Hook(HWND Dialog, UINT Message, WPARAM wParam, LPARAM lParam)
-{
- LPOPENFILENAME ofn;
- LPWORD pw;
- LPOFNOTIFY notify;
- char uimsg[MAX_UIMSG], uimsg2[MAX_UIMSG];
- LOGFONT logfont;
- HFONT font;
-
- switch (Message) {
- case WM_INITDIALOG:
- ofn = (LPOPENFILENAME)lParam;
- pw = (LPWORD)ofn->lCustData;
- SetWindowLong(Dialog, DWL_USER, (LONG)pw);
-
- font = (HFONT)SendMessage(Dialog, WM_GETFONT, 0, 0);
- GetObject(font, sizeof(LOGFONT), &logfont);
- if (get_lang_font("DLG_TAHOMA_FONT", Dialog, &logfont, &DlgFoptFont, UILanguageFile)) {
- SendDlgItemMessage(Dialog, IDC_FOPT, WM_SETFONT, (WPARAM)DlgFoptFont, MAKELPARAM(TRUE,0));
- SendDlgItemMessage(Dialog, IDC_FOPTBIN, WM_SETFONT, (WPARAM)DlgFoptFont, MAKELPARAM(TRUE,0));
- SendDlgItemMessage(Dialog, IDC_FOPTAPPEND, WM_SETFONT, (WPARAM)DlgFoptFont, MAKELPARAM(TRUE,0));
- SendDlgItemMessage(Dialog, IDC_PLAINTEXT, WM_SETFONT, (WPARAM)DlgFoptFont, MAKELPARAM(TRUE,0));
- SendDlgItemMessage(Dialog, IDC_TIMESTAMP, WM_SETFONT, (WPARAM)DlgFoptFont, MAKELPARAM(TRUE,0));
- }
- else {
- DlgFoptFont = NULL;
- }
-
- GetDlgItemText(Dialog, IDC_FOPT, uimsg2, sizeof(uimsg2));
- get_lang_msg("DLG_FOPT", uimsg, sizeof(uimsg), uimsg2, UILanguageFile);
- SetDlgItemText(Dialog, IDC_FOPT, uimsg);
- GetDlgItemText(Dialog, IDC_FOPTBIN, uimsg2, sizeof(uimsg2));
- get_lang_msg("DLG_FOPT_BINARY", uimsg, sizeof(uimsg), uimsg2, UILanguageFile);
- SetDlgItemText(Dialog, IDC_FOPTBIN, uimsg);
-
- SetRB(Dialog,*pw & 1,IDC_FOPTBIN,IDC_FOPTBIN);
- return TRUE;
- case WM_COMMAND: // for old style dialog
- switch (LOWORD(wParam)) {
- case IDOK:
- pw = (LPWORD)GetWindowLong(Dialog,DWL_USER);
- if (pw!=NULL)
- GetRB(Dialog,pw,IDC_FOPTBIN,IDC_FOPTBIN);
- break;
- case IDCANCEL:
- break;
- }
- break;
- case WM_NOTIFY: // for Explorer-style dialog
- notify = (LPOFNOTIFY)lParam;
- switch (notify->hdr.code) {
- case CDN_FILEOK:
- pw = (LPWORD)GetWindowLong(Dialog,DWL_USER);
- if (pw!=NULL)
- GetRB(Dialog,pw,IDC_FOPTBIN,IDC_FOPTBIN);
- if (DlgFoptFont != NULL) {
- DeleteObject(DlgFoptFont);
- }
- break;
- }
- break;
- }
- return FALSE;
-}
-
-BOOL FAR PASCAL GetMultiFname
- (PFileVar fv, PCHAR CurDir, WORD FuncId, LPWORD Option)
-{
- int i, len;
- char uimsg[MAX_UIMSG];
- char FNFilter[sizeof(FileSendFilter)*2+128], *pf;
- OPENFILENAME ofn;
- char TempDir[MAXPATHLEN];
- BOOL Ok;
- char defaultFName[MAX_PATH];
-
- memset(FNFilter, 0, sizeof(FNFilter)); /* Set up for double null at end */
-
- /* save current dir */
- _getcwd(TempDir,sizeof(TempDir));
-
- fv->NumFname = 0;
-
- strncpy_s(fv->DlgCaption, sizeof(fv->DlgCaption),"Tera Term: ", _TRUNCATE);
- pf = FNFilter;
- switch (FuncId) {
- case GMF_KERMIT:
- get_lang_msg("FILEDLG_TRANS_TITLE_KMTSEND", uimsg, sizeof(uimsg), TitKmtSend, UILanguageFile);
- strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
- break;
- case GMF_Z:
- get_lang_msg("FILEDLG_TRANS_TITLE_ZSEND", uimsg, sizeof(uimsg), TitZSend, UILanguageFile);
- strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
- break;
- case GMF_QV:
- get_lang_msg("FILEDLG_TRANS_TITLE_QVSEND", uimsg, sizeof(uimsg), TitQVSend, UILanguageFile);
- strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
- break;
- case GMF_Y:
- get_lang_msg("FILEDLG_TRANS_TITLE_YSEND", uimsg, sizeof(uimsg), TitYSend, UILanguageFile);
- strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
- break;
- default:
- return FALSE;
- }
- if (strlen(FileSendFilter) > 0) {
- get_lang_msg("FILEDLG_USER_FILTER_NAME", uimsg, sizeof(uimsg), "User define", UILanguageFile);
- _snprintf_s(FNFilter, sizeof(FNFilter), _TRUNCATE, "%s(%s)", uimsg, FileSendFilter);
- pf = pf + strlen(FNFilter) + 1;
- strncpy_s(pf, sizeof(FNFilter)-(pf - FNFilter) ,FileSendFilter, _TRUNCATE);
- pf = pf + strlen(pf) + 1;
- }
-
- /* moemory should be zero-initialized */
- fv->FnStrMemHandle = GlobalAlloc(GHND, FnStrMemSize);
- if (fv->FnStrMemHandle == NULL)
- {
- MessageBeep(0);
- return FALSE;
- }
- else {
- fv->FnStrMem = GlobalLock(fv->FnStrMemHandle);
- if (fv->FnStrMem == NULL)
- {
- GlobalFree(fv->FnStrMemHandle);
- fv->FnStrMemHandle = 0;
- MessageBeep(0);
- return FALSE;
- }
- }
-
- get_lang_msg("FILEDLG_ALL_FILTER", uimsg, sizeof(uimsg), "All(*.*)\\0*.*\\0\\0", UILanguageFile);
- // \0\0 ????K?????? 2 ???
- memcpy(pf, uimsg, sizeof(FNFilter) - (pf - FNFilter + 2));
-
- memset(&ofn, 0, sizeof(OPENFILENAME));
- ofn.lStructSize = sizeof(OPENFILENAME);
- ofn.hwndOwner = fv->HMainWin;
- ofn.lpstrFilter = FNFilter;
- ofn.nFilterIndex = 1;
- ofn.lpstrFile = fv->FnStrMem;
- ofn.nMaxFile = FnStrMemSize;
- ofn.lpstrTitle= fv->DlgCaption;
- ofn.lpstrInitialDir = CurDir;
- ofn.Flags = OFN_SHOWHELP | OFN_ALLOWMULTISELECT |
- OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
- ofn.Flags = ofn.Flags | OFN_EXPLORER;
- ofn.lCustData = 0;
- if (FuncId==GMF_Z)
- {
- ofn.Flags = ofn.Flags | OFN_ENABLETEMPLATE | OFN_ENABLEHOOK;
- ofn.lCustData = (DWORD)Option;
- ofn.lpfnHook = (LPOFNHOOKPROC)(&TFn2Hook);
- ofn.lpTemplateName = MAKEINTRESOURCE(IDD_FOPT);
- } else if (FuncId==GMF_Y) {
- // TODO: YMODEM
-
- }
-
- ofn.hInstance = hInst;
-
- // ??????????????????????????????- // ?????????????????????? (2008.5.18 maya)
- if (strlen(FileSendFilter) > 0 &&
- !isInvalidFileNameChar(FileSendFilter)) {
- char file[MAX_PATH];
- strncpy_s(file, sizeof(file), CurDir, _TRUNCATE);
- AppendSlash(file, sizeof(file));
- strncat_s(file, sizeof(file), FileSendFilter, _TRUNCATE);
- if (_access(file, 0) == 0) {
- strncpy_s(defaultFName, sizeof(defaultFName), FileSendFilter, _TRUNCATE);
- ofn.lpstrFile = defaultFName;
- }
- }
-
- Ok = GetOpenFileName(&ofn);
- if (Ok)
- {
- /* count number of file names */
- len = strlen(fv->FnStrMem);
- i = 0;
- while (len>0)
- {
- i = i + len + 1;
- fv->NumFname++;
- len = strlen(&fv->FnStrMem[i]);
- }
-
- fv->NumFname--;
-
- 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;
- }
-
- memcpy(CurDir,fv->FullName,fv->DirLen);
- CurDir[fv->DirLen] = 0;
- if ((fv->DirLen>3) &&
- (CurDir[fv->DirLen-1]=='\\'))
- CurDir[fv->DirLen-1] = 0;
-
- fv->FNCount = 0;
- }
-
- GlobalUnlock(fv->FnStrMemHandle);
- if (! Ok)
- {
- GlobalFree(fv->FnStrMemHandle);
- fv->FnStrMemHandle = NULL;
- }
-
- /* restore dir */
- _chdir(TempDir);
-
- return Ok;
-}
-
-BOOL CALLBACK GetFnDlg
- (HWND Dialog, UINT Message, WPARAM wParam, LPARAM lParam)
-{
- PFileVar fv;
- char TempFull[MAXPATHLEN];
- int i, j;
- char uimsg[MAX_UIMSG], uimsg2[MAX_UIMSG];
- LOGFONT logfont;
- HFONT font;
-
- switch (Message) {
- case WM_INITDIALOG:
- fv = (PFileVar)lParam;
- SetWindowLong(Dialog, DWL_USER, lParam);
- SendDlgItemMessage(Dialog, IDC_GETFN, EM_LIMITTEXT, sizeof(TempFull)-1,0);
-
- font = (HFONT)SendMessage(Dialog, WM_GETFONT, 0, 0);
- GetObject(font, sizeof(LOGFONT), &logfont);
- if (get_lang_font("DLG_SYSTEM_FONT", Dialog, &logfont, &DlgGetfnFont, UILanguageFile)) {
- SendDlgItemMessage(Dialog, IDC_FILENAME, WM_SETFONT, (WPARAM)DlgGetfnFont, MAKELPARAM(TRUE,0));
- SendDlgItemMessage(Dialog, IDC_GETFN, WM_SETFONT, (WPARAM)DlgGetfnFont, MAKELPARAM(TRUE,0));
- SendDlgItemMessage(Dialog, IDOK, WM_SETFONT, (WPARAM)DlgGetfnFont, MAKELPARAM(TRUE,0));
- SendDlgItemMessage(Dialog, IDCANCEL, WM_SETFONT, (WPARAM)DlgGetfnFont, MAKELPARAM(TRUE,0));
- SendDlgItemMessage(Dialog, IDC_GETFNHELP, WM_SETFONT, (WPARAM)DlgGetfnFont, MAKELPARAM(TRUE,0));
- }
- else {
- DlgGetfnFont = NULL;
- }
-
- GetWindowText(Dialog, uimsg2, sizeof(uimsg2));
- get_lang_msg("DLG_GETFN_TITLE", uimsg, sizeof(uimsg), uimsg2, UILanguageFile);
- SetWindowText(Dialog, uimsg);
- GetDlgItemText(Dialog, IDC_FILENAME, uimsg2, sizeof(uimsg2));
- get_lang_msg("DLG_GETFN_FILENAME", uimsg, sizeof(uimsg), uimsg2, UILanguageFile);
- SetDlgItemText(Dialog, IDC_FILENAME, uimsg);
- GetDlgItemText(Dialog, IDOK, uimsg2, sizeof(uimsg2));
- get_lang_msg("BTN_OK", uimsg, sizeof(uimsg), uimsg2, UILanguageFile);
- SetDlgItemText(Dialog, IDOK, uimsg);
- GetDlgItemText(Dialog, IDCANCEL, uimsg2, sizeof(uimsg2));
- get_lang_msg("BTN_CANCEL", uimsg, sizeof(uimsg), uimsg2, UILanguageFile);
- SetDlgItemText(Dialog, IDCANCEL, uimsg);
- GetDlgItemText(Dialog, IDC_GETFNHELP, uimsg2, sizeof(uimsg2));
- get_lang_msg("BTN_HELP", uimsg, sizeof(uimsg), uimsg2, UILanguageFile);
- SetDlgItemText(Dialog, IDC_GETFNHELP, uimsg);
-
- return TRUE;
-
- case WM_COMMAND:
- fv = (PFileVar)GetWindowLong(Dialog,DWL_USER);
- switch (LOWORD(wParam)) {
- case IDOK:
- if (fv!=NULL)
- {
- GetDlgItemText(Dialog, IDC_GETFN, TempFull, sizeof(TempFull));
- if (strlen(TempFull)==0) return TRUE;
- GetFileNamePos(TempFull,&i,&j);
- FitFileName(&(TempFull[j]),sizeof(TempFull) - j, NULL);
- strncat_s(fv->FullName,sizeof(fv->FullName),&(TempFull[j]),_TRUNCATE);
- }
- EndDialog(Dialog, 1);
- if (DlgGetfnFont != NULL) {
- DeleteObject(DlgGetfnFont);
- }
- return TRUE;
- case IDCANCEL:
- EndDialog(Dialog, 0);
- if (DlgGetfnFont != NULL) {
- DeleteObject(DlgGetfnFont);
- }
- return TRUE;
- case IDC_GETFNHELP:
- if (fv!=NULL)
- PostMessage(fv->HMainWin,WM_USER_DLGHELP2,0,0);
- break;
- }
- }
- return FALSE;
-}
-
-BOOL FAR PASCAL GetGetFname(HWND HWin, PFileVar fv)
-{
- return (BOOL)DialogBoxParam(hInst,
- MAKEINTRESOURCE(IDD_GETFNDLG),
- HWin, GetFnDlg, (LONG)fv);
-}
-
-void FAR PASCAL SetFileVar(PFileVar fv)
-{
- int i;
- char uimsg[MAX_UIMSG];
-
- GetFileNamePos(fv->FullName,&(fv->DirLen),&i);
- if (fv->FullName[fv->DirLen]=='\\') fv->DirLen++;
- strncpy_s(fv->DlgCaption, sizeof(fv->DlgCaption),"Tera Term: ", _TRUNCATE);
- switch (fv->OpId) {
- case OpLog:
- get_lang_msg("FILEDLG_TRANS_TITLE_LOG", uimsg, sizeof(uimsg), TitLog, UILanguageFile);
- strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
- break;
- case OpSendFile:
- get_lang_msg("FILEDLG_TRANS_TITLE_SENDFILE", uimsg, sizeof(uimsg), TitSendFile, UILanguageFile);
- strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
- break;
- case OpKmtRcv:
- get_lang_msg("FILEDLG_TRANS_TITLE_KMTRCV", uimsg, sizeof(uimsg), TitKmtRcv, UILanguageFile);
- strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
- break;
- case OpKmtGet:
- get_lang_msg("FILEDLG_TRANS_TITLE_KMTGET", uimsg, sizeof(uimsg), TitKmtGet, UILanguageFile);
- strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
- break;
- case OpKmtSend:
- get_lang_msg("FILEDLG_TRANS_TITLE_KMTSEND", uimsg, sizeof(uimsg), TitKmtSend, UILanguageFile);
- strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
- break;
- case OpKmtFin:
- get_lang_msg("FILEDLG_TRANS_TITLE_KMTFIN", uimsg, sizeof(uimsg), TitKmtFin, UILanguageFile);
- strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
- break;
- case OpXRcv:
- get_lang_msg("FILEDLG_TRANS_TITLE_XRCV", uimsg, sizeof(uimsg), TitXRcv, UILanguageFile);
- strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
- break;
- case OpXSend:
- get_lang_msg("FILEDLG_TRANS_TITLE_XSEND", uimsg, sizeof(uimsg), TitXSend, UILanguageFile);
- strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
- break;
- case OpYRcv:
- get_lang_msg("FILEDLG_TRANS_TITLE_YRCV", uimsg, sizeof(uimsg), TitYRcv, UILanguageFile);
- strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
- break;
- case OpYSend:
- get_lang_msg("FILEDLG_TRANS_TITLE_YSEND", uimsg, sizeof(uimsg), TitYSend, UILanguageFile);
- strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
- break;
- case OpZRcv:
- get_lang_msg("FILEDLG_TRANS_TITLE_ZRCV", uimsg, sizeof(uimsg), TitZRcv, UILanguageFile);
- strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
- break;
- case OpZSend:
- get_lang_msg("FILEDLG_TRANS_TITLE_ZSEND", uimsg, sizeof(uimsg), TitZSend, UILanguageFile);
- strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
- break;
- case OpBPRcv:
- get_lang_msg("FILEDLG_TRANS_TITLE_BPRCV", uimsg, sizeof(uimsg), TitBPRcv, UILanguageFile);
- strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
- break;
- case OpBPSend:
- get_lang_msg("FILEDLG_TRANS_TITLE_BPSEND", uimsg, sizeof(uimsg), TitBPSend, UILanguageFile);
- strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
- break;
- case OpQVRcv:
- get_lang_msg("FILEDLG_TRANS_TITLE_QVRCV", uimsg, sizeof(uimsg), TitQVRcv, UILanguageFile);
- strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
- break;
- case OpQVSend:
- get_lang_msg("FILEDLG_TRANS_TITLE_QVSEND", uimsg, sizeof(uimsg), TitQVSend, UILanguageFile);
- strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
- break;
- }
-}
-
-/* Hook function for XMODEM file name dialog box */
-BOOL CALLBACK XFnHook(HWND Dialog, UINT Message, WPARAM wParam, LPARAM lParam)
-{
- LPOPENFILENAME ofn;
- WORD Hi, Lo;
- LPLONG pl;
- LPOFNOTIFY notify;
- char uimsg[MAX_UIMSG], uimsg2[MAX_UIMSG];
- LOGFONT logfont;
- HFONT font;
-
- switch (Message) {
- case WM_INITDIALOG:
- ofn = (LPOPENFILENAME)lParam;
- pl = (LPLONG)ofn->lCustData;
- SetWindowLong(Dialog, DWL_USER, (LONG)pl);
-
- font = (HFONT)SendMessage(Dialog, WM_GETFONT, 0, 0);
- GetObject(font, sizeof(LOGFONT), &logfont);
- if (get_lang_font("DLG_TAHOMA_FONT", Dialog, &logfont, &DlgFoptFont, UILanguageFile)) {
- SendDlgItemMessage(Dialog, IDC_XOPT, WM_SETFONT, (WPARAM)DlgFoptFont, MAKELPARAM(TRUE,0));
- SendDlgItemMessage(Dialog, IDC_XOPTCHECK, WM_SETFONT, (WPARAM)DlgFoptFont, MAKELPARAM(TRUE,0));
- SendDlgItemMessage(Dialog, IDC_XOPTCRC, WM_SETFONT, (WPARAM)DlgFoptFont, MAKELPARAM(TRUE,0));
- SendDlgItemMessage(Dialog, IDC_XOPT1K, WM_SETFONT, (WPARAM)DlgFoptFont, MAKELPARAM(TRUE,0));
- SendDlgItemMessage(Dialog, IDC_XOPTBIN, WM_SETFONT, (WPARAM)DlgFoptFont, MAKELPARAM(TRUE,0));
- }
- else {
- DlgFoptFont = NULL;
- }
-
- GetDlgItemText(Dialog, IDC_XOPT, uimsg2, sizeof(uimsg2));
- get_lang_msg("DLG_XOPT", uimsg, sizeof(uimsg), uimsg2, UILanguageFile);
- SetDlgItemText(Dialog, IDC_XOPT, uimsg);
- GetDlgItemText(Dialog, IDC_XOPTCHECK, uimsg2, sizeof(uimsg2));
- get_lang_msg("DLG_XOPT_CHECKSUM", uimsg, sizeof(uimsg), uimsg2, UILanguageFile);
- SetDlgItemText(Dialog, IDC_XOPTCHECK, uimsg);
- GetDlgItemText(Dialog, IDC_XOPTCRC, uimsg2, sizeof(uimsg2));
- get_lang_msg("DLG_XOPT_CRC", uimsg, sizeof(uimsg), uimsg2, UILanguageFile);
- SetDlgItemText(Dialog, IDC_XOPTCRC, uimsg);
- GetDlgItemText(Dialog, IDC_XOPT1K, uimsg2, sizeof(uimsg2));
- get_lang_msg("DLG_XOPT_1K", uimsg, sizeof(uimsg), uimsg2, UILanguageFile);
- SetDlgItemText(Dialog, IDC_XOPT1K, uimsg);
- GetDlgItemText(Dialog, IDC_XOPTBIN, uimsg2, sizeof(uimsg2));
- get_lang_msg("DLG_XOPT_BINARY", uimsg, sizeof(uimsg), uimsg2, UILanguageFile);
- SetDlgItemText(Dialog, IDC_XOPTBIN, uimsg);
-
- SetRB(Dialog,HIWORD(*pl),IDC_XOPTCHECK,IDC_XOPT1K);
- if (LOWORD(*pl)!=0xFFFF)
- {
- ShowDlgItem(Dialog,IDC_XOPTBIN,IDC_XOPTBIN);
- SetRB(Dialog,LOWORD(*pl),IDC_XOPTBIN,IDC_XOPTBIN);
- }
- return TRUE;
- case WM_COMMAND: // for old style dialog
- switch (LOWORD(wParam)) {
- case IDOK:
- pl = (LPLONG)GetWindowLong(Dialog,DWL_USER);
- if (pl!=NULL)
- {
- GetRB(Dialog,&Hi,IDC_XOPTCHECK,IDC_XOPT1K);
- if (LOWORD(*pl)==0xFFFF)
- Lo = 0xFFFF;
- else
- GetRB(Dialog,&Lo,IDC_XOPTBIN,IDC_XOPTBIN);
- *pl = MAKELONG(Lo,Hi);
- }
- break;
- case IDCANCEL:
- break;
- }
- break;
- case WM_NOTIFY: // for Explorer-style dialog
- notify = (LPOFNOTIFY)lParam;
- switch (notify->hdr.code) {
- case CDN_FILEOK:
- pl = (LPLONG)GetWindowLong(Dialog,DWL_USER);
- if (pl!=NULL)
- {
- GetRB(Dialog,&Hi,IDC_XOPTCHECK,IDC_XOPT1K);
- if (LOWORD(*pl)==0xFFFF)
- Lo = 0xFFFF;
- else
- GetRB(Dialog,&Lo,IDC_XOPTBIN,IDC_XOPTBIN);
- *pl = MAKELONG(Lo,Hi);
- }
- if (DlgXoptFont != NULL) {
- DeleteObject(DlgXoptFont);
- }
- break;
- }
- break;
- }
- return FALSE;
-}
-
-BOOL FAR PASCAL GetXFname
- (HWND HWin, BOOL Receive, LPLONG Option, PFileVar fv, PCHAR CurDir)
-{
- char uimsg[MAX_UIMSG];
- char FNFilter[sizeof(FileSendFilter)*2+128], *pf;
- OPENFILENAME ofn;
- LONG opt;
- char TempDir[MAXPATHLEN];
- BOOL Ok;
-
- memset(FNFilter, 0, sizeof(FNFilter)); /* Set up for double null at end */
-
- /* save current dir */
- _getcwd(TempDir,sizeof(TempDir));
-
- fv->FullName[0] = 0;
- memset(FNFilter, 0, sizeof(FNFilter)); /* Set up for double null at end */
- memset(&ofn, 0, sizeof(OPENFILENAME));
-
- strncpy_s(fv->DlgCaption, sizeof(fv->DlgCaption),"Tera Term: ", _TRUNCATE);
- pf = FNFilter;
- if (Receive)
- {
- get_lang_msg("FILEDLG_TRANS_TITLE_XRCV", uimsg, sizeof(uimsg), TitXRcv, UILanguageFile);
- strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
- }
- else
- {
- get_lang_msg("FILEDLG_TRANS_TITLE_XSEND", uimsg, sizeof(uimsg), TitXSend, UILanguageFile);
- strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
- if (strlen(FileSendFilter) > 0) {
- get_lang_msg("FILEDLG_USER_FILTER_NAME", uimsg, sizeof(uimsg), "User define", UILanguageFile);
- _snprintf_s(FNFilter, sizeof(FNFilter), _TRUNCATE, "%s(%s)", uimsg, FileSendFilter);
- pf = pf + strlen(FNFilter) + 1;
- strncpy_s(pf, sizeof(FNFilter)-(pf - FNFilter) ,FileSendFilter, _TRUNCATE);
- pf = pf + strlen(pf) + 1;
-
- // ??????????????????????????????- // ?????????????????????? (2008.5.18 maya)
- if (!isInvalidFileNameChar(FileSendFilter)) {
- char file[MAX_PATH];
- strncpy_s(file, sizeof(file), CurDir, _TRUNCATE);
- AppendSlash(file, sizeof(file));
- strncat_s(file, sizeof(file), FileSendFilter, _TRUNCATE);
- if (_access(file, 0) == 0) {
- strncpy_s(fv->FullName, sizeof(fv->FullName), FileSendFilter, _TRUNCATE);
- }
- }
- }
- }
-
- get_lang_msg("FILEDLG_ALL_FILTER", uimsg, sizeof(uimsg), "All(*.*)\\0*.*\\0\\0", UILanguageFile);
- // \0\0 ????K?????? 2 ???
- memcpy(pf, uimsg, sizeof(FNFilter) - (pf - FNFilter + 2));
-
- ofn.lStructSize = sizeof(OPENFILENAME);
- ofn.hwndOwner = HWin;
- ofn.lpstrFilter = FNFilter;
- ofn.nFilterIndex = 1;
- ofn.lpstrFile = fv->FullName;
- ofn.nMaxFile = sizeof(fv->FullName);
- ofn.lpstrInitialDir = CurDir;
- ofn.Flags = OFN_SHOWHELP | OFN_HIDEREADONLY |
- OFN_ENABLETEMPLATE | OFN_ENABLEHOOK;
- opt = *Option;
- if (! Receive)
- {
- ofn.Flags = ofn.Flags | OFN_FILEMUSTEXIST;
- opt = opt | 0xFFFF;
- }
- ofn.lCustData = (DWORD)&opt;
-
- ofn.lpstrTitle = fv->DlgCaption;
- ofn.lpfnHook = (LPOFNHOOKPROC)(&XFnHook);
- ofn.Flags = ofn.Flags | OFN_EXPLORER;
- ofn.lpTemplateName = MAKEINTRESOURCE(IDD_XOPT);
- ofn.hInstance = hInst;
-
- Ok = GetOpenFileName(&ofn);
-
- if (Ok)
- {
- fv->DirLen = ofn.nFileOffset;
- fv->FnPtr = ofn.nFileOffset;
- memcpy(CurDir,fv->FullName,fv->DirLen-1);
- CurDir[fv->DirLen-1] = 0;
-
- if (Receive)
- *Option = opt;
- else
- *Option = MAKELONG(LOWORD(*Option),HIWORD(opt));
- }
-
- /* restore dir */
- _chdir(TempDir);
-
- return Ok;
-}
-
-void FAR PASCAL ProtoInit(int Proto, PFileVar fv, PCHAR pv, PComVar cv, PTTSet ts)
-{
- switch (Proto) {
- case PROTO_KMT:
- KmtInit(fv,(PKmtVar)pv,cv,ts);
- break;
- case PROTO_XM:
- XInit(fv,(PXVar)pv,cv,ts);
- break;
- case PROTO_YM:
- YInit(fv,(PYVar)pv,cv,ts);
- break;
- case PROTO_ZM:
- ZInit(fv,(PZVar)pv,cv,ts);
- break;
- case PROTO_BP:
- BPInit(fv,(PBPVar)pv,cv,ts);
- break;
- case PROTO_QV:
- QVInit(fv,(PQVVar)pv,cv,ts);
- break;
- }
-}
-
-BOOL FAR PASCAL ProtoParse
- (int Proto, PFileVar fv, PCHAR pv, PComVar cv)
-{
- BOOL Ok;
-
- Ok = FALSE;
- switch (Proto) {
- case PROTO_KMT:
- Ok = KmtReadPacket(fv,(PKmtVar)pv,cv);
- break;
- case PROTO_XM:
- switch (((PXVar)pv)->XMode) {
- case IdXReceive:
- Ok = XReadPacket(fv,(PXVar)pv,cv);
- break;
- case IdXSend:
- Ok = XSendPacket(fv,(PXVar)pv,cv);
- break;
- }
- break;
- case PROTO_YM:
- switch (((PYVar)pv)->YMode) {
- case IdYReceive:
- Ok = YReadPacket(fv,(PYVar)pv,cv);
- break;
- case IdYSend:
- Ok = YSendPacket(fv,(PYVar)pv,cv);
- break;
- }
- break;
- case PROTO_ZM:
- Ok = ZParse(fv,(PZVar)pv,cv);
- break;
- case PROTO_BP:
- Ok = BPParse(fv,(PBPVar)pv,cv);
- break;
- case PROTO_QV:
- switch (((PQVVar)pv)->QVMode) {
- case IdQVReceive:
- Ok = QVReadPacket(fv,(PQVVar)pv,cv);
- break;
- case IdQVSend:
- Ok = QVSendPacket(fv,(PQVVar)pv,cv);
- break;
- }
- break;
- }
- return Ok;
-}
-
-void FAR PASCAL ProtoTimeOutProc
- (int Proto, PFileVar fv, PCHAR pv, PComVar cv)
-{
- switch (Proto) {
- case PROTO_KMT:
- KmtTimeOutProc(fv,(PKmtVar)pv,cv);
- break;
- case PROTO_XM:
- XTimeOutProc(fv,(PXVar)pv,cv);
- break;
- case PROTO_YM:
- YTimeOutProc(fv,(PYVar)pv,cv);
- break;
- case PROTO_ZM:
- ZTimeOutProc(fv,(PZVar)pv,cv);
- break;
- case PROTO_BP:
- BPTimeOutProc(fv,(PBPVar)pv,cv);
- break;
- case PROTO_QV:
- QVTimeOutProc(fv,(PQVVar)pv,cv);
- break;
- }
-}
-
-BOOL FAR PASCAL ProtoCancel
- (int Proto, PFileVar fv, PCHAR pv, PComVar cv)
-{
- switch (Proto) {
- case PROTO_KMT:
- KmtCancel(fv,(PKmtVar)pv,cv);
- break;
- case PROTO_XM:
- XCancel(fv,(PXVar)pv,cv);
- break;
- case PROTO_YM:
- YCancel(fv, (PYVar)pv,cv);
- break;
- case PROTO_ZM:
- ZCancel((PZVar)pv);
- break;
- case PROTO_BP:
- if (((PBPVar)pv)->BPState != BP_Failure)
- {
- BPCancel((PBPVar)pv);
- return FALSE;
- }
- break;
- case PROTO_QV:
- QVCancel(fv,(PQVVar)pv,cv);
- break;
- }
- return TRUE;
-}
-
-void FAR PASCAL TTFILESetUILanguageFile(char *file)
-{
- strncpy_s(UILanguageFile, sizeof(UILanguageFile), file, _TRUNCATE);
-}
-
-void FAR PASCAL TTFILESetFileSendFilter(char *file)
-{
- strncpy_s(FileSendFilter, sizeof(FileSendFilter), file, _TRUNCATE);
-}
-
-BOOL WINAPI DllMain(HANDLE hInstance,
- ULONG ul_reason_for_call,
- LPVOID lpReserved)
-{
-// PMap pm;
-// HANDLE HMap = NULL;
-
- hInst = hInstance;
- switch( ul_reason_for_call ) {
- case DLL_THREAD_ATTACH:
- /* do thread initialization */
- break;
- case DLL_THREAD_DETACH:
- /* do thread cleanup */
- break;
- case DLL_PROCESS_ATTACH:
- /* do process initialization */
-// HMap = CreateFileMapping((HANDLE) 0xFFFFFFFF, NULL, PAGE_READONLY,
-// 0, sizeof(TMap), TT_FILEMAPNAME);
-// if (HMap != NULL) {
-// pm = (PMap)MapViewOfFile(HMap,FILE_MAP_READ,0,0,0);
-// if (pm != NULL) {
-// strncpy_s(UILanguageFile, sizeof(UILanguageFile), pm->ts.UILanguageFile, _TRUNCATE);
-// strncpy_s(FileSendFilter, sizeof(FileSendFilter), pm->ts.FileSendFilter, _TRUNCATE);
-// }
-// }
- DoCover_IsDebuggerPresent();
- break;
- case DLL_PROCESS_DETACH:
- /* do process cleanup */
- break;
- }
- return TRUE;
-}
+/* Tera Term
+ Copyright(C) 1994-1998 T. Teranishi
+ All rights reserved. */
+
+/* TTFILE.DLL, file transfer, VT window printing */
+#include "teraterm.h"
+#include "tttypes.h"
+#include "ttftypes.h"
+#include
+#include
+#include
+
+#include "ttlib.h"
+#include "ftlib.h"
+#include "dlglib.h"
+#include "kermit.h"
+#include "xmodem.h"
+#include "ymodem.h"
+#include "zmodem.h"
+#include "bplus.h"
+#include "quickvan.h"
+// resource IDs
+#include "file_res.h"
+
+#include
+#include
+#include
+
+#include "compat_w95.h"
+
+static HANDLE hInst;
+
+static HFONT DlgFoptFont;
+static HFONT DlgXoptFont;
+static HFONT DlgGetfnFont;
+
+char UILanguageFile[MAX_PATH];
+char FileSendFilter[128];
+
+BOOL FAR PASCAL GetSetupFname(HWND HWin, WORD FuncId, PTTSet ts)
+{
+ int i, j;
+ OPENFILENAME ofn;
+ char uimsg[MAX_UIMSG];
+
+ // char FNameFilter[HostNameMaxLength + 1]; // 81(yutaka)
+ char FNameFilter[81]; // 81(yutaka)
+ char TempDir[MAXPATHLEN];
+ char Dir[MAXPATHLEN];
+ char Name[MAXPATHLEN];
+ BOOL Ok;
+
+ /* save current dir */
+ _getcwd(TempDir,sizeof(TempDir));
+
+ /* File name filter */
+ memset(FNameFilter, 0, sizeof(FNameFilter));
+ if (FuncId==GSF_LOADKEY)
+ {
+ get_lang_msg("FILEDLG_KEYBOARD_FILTER", uimsg, sizeof(uimsg), "keyboard setup files (*.cnf)\\0*.cnf\\0\\0", UILanguageFile);
+ memcpy(FNameFilter, uimsg, sizeof(FNameFilter));
+ }
+ else {
+ get_lang_msg("FILEDLG_SETUP_FILTER", uimsg, sizeof(uimsg), "setup files (*.ini)\\0*.ini\\0\\0", UILanguageFile);
+ memcpy(FNameFilter, uimsg, sizeof(FNameFilter));
+ }
+
+ /* OPENFILENAME record */
+ memset(&ofn, 0, sizeof(OPENFILENAME));
+
+ ofn.lStructSize = sizeof(OPENFILENAME);
+ ofn.hwndOwner = HWin;
+ ofn.lpstrFile = Name;
+ ofn.nMaxFile = sizeof(Name);
+ ofn.lpstrFilter = FNameFilter;
+ ofn.nFilterIndex = 1;
+ ofn.hInstance = hInst;
+
+ if (FuncId==GSF_LOADKEY)
+ {
+ ofn.lpstrDefExt = "cnf";
+ GetFileNamePos(ts->KeyCnfFN,&i,&j);
+ strncpy_s(Name, sizeof(Name),&(ts->KeyCnfFN[j]), _TRUNCATE);
+ memcpy(Dir,ts->KeyCnfFN,i);
+ Dir[i] = 0;
+
+ if ((strlen(Name)==0) || (_stricmp(Name,"KEYBOARD.CNF")==0))
+ strncpy_s(Name, sizeof(Name),"KEYBOARD.CNF", _TRUNCATE);
+ }
+ else {
+ ofn.lpstrDefExt = "ini";
+ GetFileNamePos(ts->SetupFName,&i,&j);
+ strncpy_s(Name, sizeof(Name),&(ts->SetupFName[j]), _TRUNCATE);
+ memcpy(Dir,ts->SetupFName,i);
+ Dir[i] = 0;
+
+ if ((strlen(Name)==0) || (_stricmp(Name,"TERATERM.INI")==0))
+ strncpy_s(Name, sizeof(Name),"TERATERM.INI", _TRUNCATE);
+ }
+
+ if (strlen(Dir)==0)
+ strncpy_s(Dir, sizeof(Dir),ts->HomeDir, _TRUNCATE);
+
+ _chdir(Dir);
+
+ ofn.Flags = OFN_SHOWHELP | OFN_HIDEREADONLY;
+ switch (FuncId) {
+ case GSF_SAVE:
+ // ??t???????????????????????????(2005.1.6 yutaka)
+ // ??????teraterm.ini???????????????
+ // ??????/F= ????????????????????(2005.1.26 yutaka)
+ // Windows Vista ?????????????? NULL ??????????????
+ // ?????????????????????????????(2006.9.16 maya)
+// ofn.lpstrInitialDir = __argv[0];
+// ofn.lpstrInitialDir = ts->SetupFName;
+ ofn.lpstrInitialDir = Dir;
+ get_lang_msg("FILEDLG_SAVE_SETUP_TITLE", uimsg, sizeof(uimsg), "Tera Term: Save setup", UILanguageFile);
+ ofn.lpstrTitle = uimsg;
+ Ok = GetSaveFileName(&ofn);
+ if (Ok)
+ strncpy_s(ts->SetupFName, sizeof(ts->SetupFName),Name, _TRUNCATE);
+ break;
+ case GSF_RESTORE:
+ ofn.Flags = ofn.Flags | OFN_FILEMUSTEXIST;
+ get_lang_msg("FILEDLG_RESTORE_SETUP_TITLE", uimsg, sizeof(uimsg), "Tera Term: Restore setup", UILanguageFile);
+ ofn.lpstrTitle = uimsg;
+ Ok = GetOpenFileName(&ofn);
+ if (Ok)
+ strncpy_s(ts->SetupFName, sizeof(ts->SetupFName),Name, _TRUNCATE);
+ break;
+ case GSF_LOADKEY:
+ ofn.Flags = ofn.Flags | OFN_FILEMUSTEXIST;
+ get_lang_msg("FILEDLG_LOAD_KEYMAP_TITLE", uimsg, sizeof(uimsg), "Tera Term: Load key map", UILanguageFile);
+ ofn.lpstrTitle = uimsg;
+ Ok = GetOpenFileName(&ofn);
+ if (Ok)
+ strncpy_s(ts->KeyCnfFN, sizeof(ts->KeyCnfFN),Name, _TRUNCATE);
+ break;
+ }
+
+ /* restore dir */
+ _chdir(TempDir);
+
+ return Ok;
+}
+
+/* Hook function for file name dialog box */
+BOOL CALLBACK TFnHook(HWND Dialog, UINT Message, WPARAM wParam, LPARAM lParam)
+{
+ LPOPENFILENAME ofn;
+ WORD Lo, Hi;
+ LPLONG pl;
+ LPOFNOTIFY notify;
+ char uimsg[MAX_UIMSG], uimsg2[MAX_UIMSG];
+ LOGFONT logfont;
+ HFONT font;
+
+ switch (Message) {
+ case WM_INITDIALOG:
+ ofn = (LPOPENFILENAME)lParam;
+ pl = (LPLONG)(ofn->lCustData);
+ SetWindowLong(Dialog, DWL_USER, (LONG)pl);
+
+ font = (HFONT)SendMessage(Dialog, WM_GETFONT, 0, 0);
+ GetObject(font, sizeof(LOGFONT), &logfont);
+ if (get_lang_font("DLG_TAHOMA_FONT", Dialog, &logfont, &DlgFoptFont, UILanguageFile)) {
+ SendDlgItemMessage(Dialog, IDC_FOPT, WM_SETFONT, (WPARAM)DlgFoptFont, MAKELPARAM(TRUE,0));
+ SendDlgItemMessage(Dialog, IDC_FOPTBIN, WM_SETFONT, (WPARAM)DlgFoptFont, MAKELPARAM(TRUE,0));
+ SendDlgItemMessage(Dialog, IDC_FOPTAPPEND, WM_SETFONT, (WPARAM)DlgFoptFont, MAKELPARAM(TRUE,0));
+ SendDlgItemMessage(Dialog, IDC_PLAINTEXT, WM_SETFONT, (WPARAM)DlgFoptFont, MAKELPARAM(TRUE,0));
+ SendDlgItemMessage(Dialog, IDC_TIMESTAMP, WM_SETFONT, (WPARAM)DlgFoptFont, MAKELPARAM(TRUE,0));
+ SendDlgItemMessage(Dialog, IDC_HIDEDIALOG, WM_SETFONT, (WPARAM)DlgFoptFont, MAKELPARAM(TRUE,0));
+ }
+ else {
+ DlgFoptFont = NULL;
+ }
+
+ GetDlgItemText(Dialog, IDC_FOPT, uimsg2, sizeof(uimsg2));
+ get_lang_msg("DLG_FOPT", uimsg, sizeof(uimsg), uimsg2, UILanguageFile);
+ SetDlgItemText(Dialog, IDC_FOPT, uimsg);
+ GetDlgItemText(Dialog, IDC_FOPTBIN, uimsg2, sizeof(uimsg2));
+ get_lang_msg("DLG_FOPT_BINARY", uimsg, sizeof(uimsg), uimsg2, UILanguageFile);
+ SetDlgItemText(Dialog, IDC_FOPTBIN, uimsg);
+ GetDlgItemText(Dialog, IDC_FOPTAPPEND, uimsg2, sizeof(uimsg2));
+ get_lang_msg("DLG_FOPT_APPEND", uimsg, sizeof(uimsg), uimsg2, UILanguageFile);
+ SetDlgItemText(Dialog, IDC_FOPTAPPEND, uimsg);
+ GetDlgItemText(Dialog, IDC_PLAINTEXT, uimsg2, sizeof(uimsg2));
+ get_lang_msg("DLG_FOPT_PLAIN", uimsg, sizeof(uimsg), uimsg2, UILanguageFile);
+ SetDlgItemText(Dialog, IDC_PLAINTEXT, uimsg);
+ GetDlgItemText(Dialog, IDC_TIMESTAMP, uimsg2, sizeof(uimsg2));
+ get_lang_msg("DLG_FOPT_TIMESTAMP", uimsg, sizeof(uimsg), uimsg2, UILanguageFile);
+ SetDlgItemText(Dialog, IDC_TIMESTAMP, uimsg);
+ GetDlgItemText(Dialog, IDC_HIDEDIALOG, uimsg2, sizeof(uimsg2));
+ get_lang_msg("DLG_FOPT_HIDEDIALOG", uimsg, sizeof(uimsg), uimsg2, UILanguageFile);
+ SetDlgItemText(Dialog, IDC_HIDEDIALOG, uimsg);
+
+ Lo = LOWORD(*pl) & 1;
+ Hi = HIWORD(*pl);
+ SetRB(Dialog,Lo,IDC_FOPTBIN,IDC_FOPTBIN);
+ if (Hi!=0xFFFF)
+ {
+ ShowDlgItem(Dialog,IDC_FOPTAPPEND,IDC_FOPTAPPEND);
+ SetRB(Dialog,Hi & 1,IDC_FOPTAPPEND,IDC_FOPTAPPEND);
+
+ // plain text???????????????ON (2005.2.20 yutaka)
+ ShowDlgItem(Dialog,IDC_PLAINTEXT,IDC_PLAINTEXT);
+ if (Lo) {
+ // Binary??????????????????
+ DisableDlgItem(Dialog,IDC_PLAINTEXT,IDC_PLAINTEXT);
+ }
+ else if (Hi & 0x1000) {
+ SetRB(Dialog,1,IDC_PLAINTEXT,IDC_PLAINTEXT);
+ }
+
+ // timestamp???????? (2006.7.23 maya)
+ ShowDlgItem(Dialog,IDC_TIMESTAMP,IDC_TIMESTAMP);
+ if (Lo) {
+ // Binary??????????????????
+ DisableDlgItem(Dialog,IDC_TIMESTAMP,IDC_TIMESTAMP);
+ }
+ else if (Hi & 0x2000) {
+ SetRB(Dialog,1,IDC_TIMESTAMP,IDC_TIMESTAMP);
+ }
+
+ // Hide dialog???????? (2008.1.30 maya)
+ ShowDlgItem(Dialog,IDC_HIDEDIALOG,IDC_HIDEDIALOG);
+ if (Hi & 0x4000) {
+ SetRB(Dialog,1,IDC_HIDEDIALOG,IDC_HIDEDIALOG);
+ }
+ }
+ return TRUE;
+
+ case WM_COMMAND: // for old style dialog
+ switch (LOWORD(wParam)) {
+ case IDOK:
+ pl = (LPLONG)GetWindowLong(Dialog,DWL_USER);
+ if (pl!=NULL)
+ {
+ GetRB(Dialog,&Lo,IDC_FOPTBIN,IDC_FOPTBIN);
+ Hi = HIWORD(*pl);
+ if (Hi!=0xFFFF)
+ GetRB(Dialog,&Hi,IDC_FOPTAPPEND,IDC_FOPTAPPEND);
+ *pl = MAKELONG(Lo,Hi);
+ }
+ break;
+ case IDCANCEL:
+ break;
+ case IDC_FOPTBIN:
+ GetRB(Dialog,&Lo,IDC_FOPTBIN,IDC_FOPTBIN);
+ if (Lo) {
+ DisableDlgItem(Dialog,IDC_PLAINTEXT,IDC_TIMESTAMP);
+ }
+ else {
+ EnableDlgItem(Dialog,IDC_PLAINTEXT,IDC_TIMESTAMP);
+ }
+ break;
+ }
+ break;
+ case WM_NOTIFY: // for Explorer-style dialog
+ notify = (LPOFNOTIFY)lParam;
+ switch (notify->hdr.code) {
+ case CDN_FILEOK:
+ pl = (LPLONG)GetWindowLong(Dialog,DWL_USER);
+ if (pl!=NULL)
+ {
+ WORD val = 0;
+
+ GetRB(Dialog,&Lo,IDC_FOPTBIN,IDC_FOPTBIN);
+ Hi = HIWORD(*pl);
+ if (Hi!=0xFFFF)
+ GetRB(Dialog,&Hi,IDC_FOPTAPPEND,IDC_FOPTAPPEND);
+
+ if (!Lo) {
+ // plain text check-box
+ GetRB(Dialog,&val,IDC_PLAINTEXT,IDC_PLAINTEXT);
+ if (val > 0) { // checked
+ Hi |= 0x1000;
+ }
+
+ // timestamp???????? (2006.7.23 maya)
+ GetRB(Dialog,&val,IDC_TIMESTAMP,IDC_TIMESTAMP);
+ if (val > 0) {
+ Hi |= 0x2000;
+ }
+ }
+
+ // Hide dialog???????? (2008.1.30 maya)
+ GetRB(Dialog,&val,IDC_HIDEDIALOG,IDC_HIDEDIALOG);
+ if (val > 0) {
+ Hi |= 0x4000;
+ }
+
+ *pl = MAKELONG(Lo,Hi);
+ }
+ if (DlgFoptFont != NULL) {
+ DeleteObject(DlgFoptFont);
+ }
+ break;
+ }
+ break;
+ }
+ return FALSE;
+}
+
+BOOL FAR PASCAL GetTransFname
+ (PFileVar fv, PCHAR CurDir, WORD FuncId, LPLONG Option)
+{
+ char uimsg[MAX_UIMSG];
+ char FNFilter[sizeof(FileSendFilter)*3], *pf;
+ OPENFILENAME ofn;
+ LONG opt;
+ char TempDir[MAXPATHLEN];
+ BOOL Ok;
+ char FileName[MAX_PATH];
+
+ /* save current dir */
+ _getcwd(TempDir,sizeof(TempDir));
+
+ memset(FNFilter, 0, sizeof(FNFilter)); /* Set up for double null at end */
+ memset(&ofn, 0, sizeof(OPENFILENAME));
+
+ strncpy_s(fv->DlgCaption, sizeof(fv->DlgCaption),"Tera Term: ", _TRUNCATE);
+ pf = FNFilter;
+ switch (FuncId) {
+ case GTF_SEND:
+ get_lang_msg("FILEDLG_TRANS_TITLE_SENDFILE", uimsg, sizeof(uimsg), TitSendFile, UILanguageFile);
+ strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
+ if (strlen(FileSendFilter) > 0) {
+ get_lang_msg("FILEDLG_USER_FILTER_NAME", uimsg, sizeof(uimsg), "User define", UILanguageFile);
+ _snprintf_s(FNFilter, sizeof(FNFilter), _TRUNCATE, "%s(%s)", uimsg, FileSendFilter);
+ pf = pf + strlen(FNFilter) + 1;
+ strncpy_s(pf, sizeof(FNFilter)-(pf - FNFilter) ,FileSendFilter, _TRUNCATE);
+ pf = pf + strlen(pf) + 1;
+ }
+ break;
+ case GTF_LOG:
+ get_lang_msg("FILEDLG_TRANS_TITLE_LOG", uimsg, sizeof(uimsg), TitLog, UILanguageFile);
+ strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
+ break;
+ case GTF_BP:
+ get_lang_msg("FILEDLG_TRANS_TITLE_BPSEND", uimsg, sizeof(uimsg), TitBPSend, UILanguageFile);
+ strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
+ if (strlen(FileSendFilter) > 0) {
+ get_lang_msg("FILEDLG_USER_FILTER_NAME", uimsg, sizeof(uimsg), "User define", UILanguageFile);
+ _snprintf_s(FNFilter, sizeof(FNFilter), _TRUNCATE, "%s(%s)", uimsg, FileSendFilter);
+ pf = pf + strlen(FNFilter) + 1;
+ strncpy_s(pf, sizeof(FNFilter)-(pf - FNFilter) ,FileSendFilter, _TRUNCATE);
+ pf = pf + strlen(pf) + 1;
+ }
+ break;
+ default: return FALSE;
+ }
+
+ get_lang_msg("FILEDLG_ALL_FILTER", uimsg, sizeof(uimsg), "All(*.*)\\0*.*\\0\\0", UILanguageFile);
+ // \0\0 ????K?????? 2 ???
+ memcpy(pf, uimsg, sizeof(FNFilter) - (pf - FNFilter + 2));
+
+ ExtractFileName(fv->FullName, FileName ,sizeof(FileName));
+ strncpy_s(fv->FullName, sizeof(fv->FullName), FileName, _TRUNCATE);
+ ofn.lStructSize = sizeof(OPENFILENAME);
+ ofn.hwndOwner = fv->HMainWin;
+ ofn.lpstrFilter = FNFilter;
+ ofn.nFilterIndex = 1;
+ ofn.lpstrFile = fv->FullName;
+ ofn.nMaxFile = sizeof(fv->FullName);
+ if (FuncId == GTF_LOG) {
+ DWORD logdir = GetFileAttributes(fv->LogDefaultPath);
+ // ??????????t?????????????????(2007.8.24 yutaka)
+ if (logdir != -1 && logdir & FILE_ATTRIBUTE_DIRECTORY) {
+ // LogDefaultPath?????????????t???????(2007.11.30 maya)
+ ofn.lpstrInitialDir = fv->LogDefaultPath;
+ }
+ else {
+ ofn.lpstrInitialDir = NULL;
+ }
+ } else {
+ ofn.lpstrInitialDir = CurDir;
+ }
+ ofn.Flags = OFN_SHOWHELP | OFN_HIDEREADONLY;
+ if (FuncId!=GTF_BP)
+ {
+ ofn.Flags = ofn.Flags | OFN_ENABLETEMPLATE | OFN_ENABLEHOOK;
+ ofn.Flags = ofn.Flags | OFN_EXPLORER;
+ ofn.lpTemplateName = MAKEINTRESOURCE(IDD_FOPT);
+ ofn.lpfnHook = (LPOFNHOOKPROC)(&TFnHook);
+ }
+ opt = *Option;
+ if (FuncId!=GTF_LOG)
+ {
+ ofn.Flags = ofn.Flags | OFN_FILEMUSTEXIST;
+ opt = MAKELONG(LOWORD(*Option),0xFFFF);
+
+ // ??????????????????????????????+ // ?????????????????????? (2008.5.18 maya)
+ if (strlen(FileSendFilter) > 0 &&
+ !isInvalidFileNameChar(FileSendFilter)) {
+ char file[MAX_PATH];
+ strncpy_s(file, sizeof(file), CurDir, _TRUNCATE);
+ AppendSlash(file, sizeof(file));
+ strncat_s(file, sizeof(file), FileSendFilter, _TRUNCATE);
+ if (_access(file, 0) == 0) {
+ strncpy_s(fv->FullName, sizeof(fv->FullName), FileSendFilter, _TRUNCATE);
+ }
+ }
+ }
+ ofn.lCustData = (DWORD)&opt;
+ ofn.lpstrTitle = fv->DlgCaption;
+
+ ofn.hInstance = hInst;
+
+ // logging???A????????????????????? (2005.1.6 yutaka)
+ if (FuncId == GTF_LOG) {
+ // ?????????(log_YYYYMMDD_HHMMSS.txt)????? (2005.1.21 yutaka)
+ // ??????????? teraterm.log ??? (2005.2.22 yutaka)
+ // ??????????????????o????? (2006.8.28 maya)
+ Ok = GetSaveFileName(&ofn);
+ } else {
+ Ok = GetOpenFileName(&ofn);
+ }
+
+ if (Ok)
+ {
+ if (FuncId==GTF_LOG)
+ *Option = opt;
+ else
+ *Option = MAKELONG(LOWORD(opt),HIWORD(*Option));
+
+ fv->DirLen = ofn.nFileOffset;
+
+ if (CurDir!=NULL)
+ {
+ memcpy(CurDir,fv->FullName,fv->DirLen-1);
+ CurDir[fv->DirLen-1] = 0;
+ }
+ }
+ /* restore dir */
+ _chdir(TempDir);
+ return Ok;
+}
+
+BOOL CALLBACK TFn2Hook(HWND Dialog, UINT Message, WPARAM wParam, LPARAM lParam)
+{
+ LPOPENFILENAME ofn;
+ LPWORD pw;
+ LPOFNOTIFY notify;
+ char uimsg[MAX_UIMSG], uimsg2[MAX_UIMSG];
+ LOGFONT logfont;
+ HFONT font;
+
+ switch (Message) {
+ case WM_INITDIALOG:
+ ofn = (LPOPENFILENAME)lParam;
+ pw = (LPWORD)ofn->lCustData;
+ SetWindowLong(Dialog, DWL_USER, (LONG)pw);
+
+ font = (HFONT)SendMessage(Dialog, WM_GETFONT, 0, 0);
+ GetObject(font, sizeof(LOGFONT), &logfont);
+ if (get_lang_font("DLG_TAHOMA_FONT", Dialog, &logfont, &DlgFoptFont, UILanguageFile)) {
+ SendDlgItemMessage(Dialog, IDC_FOPT, WM_SETFONT, (WPARAM)DlgFoptFont, MAKELPARAM(TRUE,0));
+ SendDlgItemMessage(Dialog, IDC_FOPTBIN, WM_SETFONT, (WPARAM)DlgFoptFont, MAKELPARAM(TRUE,0));
+ SendDlgItemMessage(Dialog, IDC_FOPTAPPEND, WM_SETFONT, (WPARAM)DlgFoptFont, MAKELPARAM(TRUE,0));
+ SendDlgItemMessage(Dialog, IDC_PLAINTEXT, WM_SETFONT, (WPARAM)DlgFoptFont, MAKELPARAM(TRUE,0));
+ SendDlgItemMessage(Dialog, IDC_TIMESTAMP, WM_SETFONT, (WPARAM)DlgFoptFont, MAKELPARAM(TRUE,0));
+ }
+ else {
+ DlgFoptFont = NULL;
+ }
+
+ GetDlgItemText(Dialog, IDC_FOPT, uimsg2, sizeof(uimsg2));
+ get_lang_msg("DLG_FOPT", uimsg, sizeof(uimsg), uimsg2, UILanguageFile);
+ SetDlgItemText(Dialog, IDC_FOPT, uimsg);
+ GetDlgItemText(Dialog, IDC_FOPTBIN, uimsg2, sizeof(uimsg2));
+ get_lang_msg("DLG_FOPT_BINARY", uimsg, sizeof(uimsg), uimsg2, UILanguageFile);
+ SetDlgItemText(Dialog, IDC_FOPTBIN, uimsg);
+
+ SetRB(Dialog,*pw & 1,IDC_FOPTBIN,IDC_FOPTBIN);
+ return TRUE;
+ case WM_COMMAND: // for old style dialog
+ switch (LOWORD(wParam)) {
+ case IDOK:
+ pw = (LPWORD)GetWindowLong(Dialog,DWL_USER);
+ if (pw!=NULL)
+ GetRB(Dialog,pw,IDC_FOPTBIN,IDC_FOPTBIN);
+ break;
+ case IDCANCEL:
+ break;
+ }
+ break;
+ case WM_NOTIFY: // for Explorer-style dialog
+ notify = (LPOFNOTIFY)lParam;
+ switch (notify->hdr.code) {
+ case CDN_FILEOK:
+ pw = (LPWORD)GetWindowLong(Dialog,DWL_USER);
+ if (pw!=NULL)
+ GetRB(Dialog,pw,IDC_FOPTBIN,IDC_FOPTBIN);
+ if (DlgFoptFont != NULL) {
+ DeleteObject(DlgFoptFont);
+ }
+ break;
+ }
+ break;
+ }
+ return FALSE;
+}
+
+BOOL FAR PASCAL GetMultiFname
+ (PFileVar fv, PCHAR CurDir, WORD FuncId, LPWORD Option)
+{
+ int i, len;
+ char uimsg[MAX_UIMSG];
+ char FNFilter[sizeof(FileSendFilter)*2+128], *pf;
+ OPENFILENAME ofn;
+ char TempDir[MAXPATHLEN];
+ BOOL Ok;
+ char defaultFName[MAX_PATH];
+
+ memset(FNFilter, 0, sizeof(FNFilter)); /* Set up for double null at end */
+
+ /* save current dir */
+ _getcwd(TempDir,sizeof(TempDir));
+
+ fv->NumFname = 0;
+
+ strncpy_s(fv->DlgCaption, sizeof(fv->DlgCaption),"Tera Term: ", _TRUNCATE);
+ pf = FNFilter;
+ switch (FuncId) {
+ case GMF_KERMIT:
+ get_lang_msg("FILEDLG_TRANS_TITLE_KMTSEND", uimsg, sizeof(uimsg), TitKmtSend, UILanguageFile);
+ strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
+ break;
+ case GMF_Z:
+ get_lang_msg("FILEDLG_TRANS_TITLE_ZSEND", uimsg, sizeof(uimsg), TitZSend, UILanguageFile);
+ strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
+ break;
+ case GMF_QV:
+ get_lang_msg("FILEDLG_TRANS_TITLE_QVSEND", uimsg, sizeof(uimsg), TitQVSend, UILanguageFile);
+ strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
+ break;
+ case GMF_Y:
+ get_lang_msg("FILEDLG_TRANS_TITLE_YSEND", uimsg, sizeof(uimsg), TitYSend, UILanguageFile);
+ strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
+ break;
+ default:
+ return FALSE;
+ }
+ if (strlen(FileSendFilter) > 0) {
+ get_lang_msg("FILEDLG_USER_FILTER_NAME", uimsg, sizeof(uimsg), "User define", UILanguageFile);
+ _snprintf_s(FNFilter, sizeof(FNFilter), _TRUNCATE, "%s(%s)", uimsg, FileSendFilter);
+ pf = pf + strlen(FNFilter) + 1;
+ strncpy_s(pf, sizeof(FNFilter)-(pf - FNFilter) ,FileSendFilter, _TRUNCATE);
+ pf = pf + strlen(pf) + 1;
+ }
+
+ /* moemory should be zero-initialized */
+ fv->FnStrMemHandle = GlobalAlloc(GHND, FnStrMemSize);
+ if (fv->FnStrMemHandle == NULL)
+ {
+ MessageBeep(0);
+ return FALSE;
+ }
+ else {
+ fv->FnStrMem = GlobalLock(fv->FnStrMemHandle);
+ if (fv->FnStrMem == NULL)
+ {
+ GlobalFree(fv->FnStrMemHandle);
+ fv->FnStrMemHandle = 0;
+ MessageBeep(0);
+ return FALSE;
+ }
+ }
+
+ get_lang_msg("FILEDLG_ALL_FILTER", uimsg, sizeof(uimsg), "All(*.*)\\0*.*\\0\\0", UILanguageFile);
+ // \0\0 ????K?????? 2 ???
+ memcpy(pf, uimsg, sizeof(FNFilter) - (pf - FNFilter + 2));
+
+ memset(&ofn, 0, sizeof(OPENFILENAME));
+ ofn.lStructSize = sizeof(OPENFILENAME);
+ ofn.hwndOwner = fv->HMainWin;
+ ofn.lpstrFilter = FNFilter;
+ ofn.nFilterIndex = 1;
+ ofn.lpstrFile = fv->FnStrMem;
+ ofn.nMaxFile = FnStrMemSize;
+ ofn.lpstrTitle= fv->DlgCaption;
+ ofn.lpstrInitialDir = CurDir;
+ ofn.Flags = OFN_SHOWHELP | OFN_ALLOWMULTISELECT |
+ OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
+ ofn.Flags = ofn.Flags | OFN_EXPLORER;
+ ofn.lCustData = 0;
+ if (FuncId==GMF_Z)
+ {
+ ofn.Flags = ofn.Flags | OFN_ENABLETEMPLATE | OFN_ENABLEHOOK;
+ ofn.lCustData = (DWORD)Option;
+ ofn.lpfnHook = (LPOFNHOOKPROC)(&TFn2Hook);
+ ofn.lpTemplateName = MAKEINTRESOURCE(IDD_FOPT);
+ } else if (FuncId==GMF_Y) {
+ // TODO: YMODEM
+
+ }
+
+ ofn.hInstance = hInst;
+
+ // ??????????????????????????????+ // ?????????????????????? (2008.5.18 maya)
+ if (strlen(FileSendFilter) > 0 &&
+ !isInvalidFileNameChar(FileSendFilter)) {
+ char file[MAX_PATH];
+ strncpy_s(file, sizeof(file), CurDir, _TRUNCATE);
+ AppendSlash(file, sizeof(file));
+ strncat_s(file, sizeof(file), FileSendFilter, _TRUNCATE);
+ if (_access(file, 0) == 0) {
+ strncpy_s(defaultFName, sizeof(defaultFName), FileSendFilter, _TRUNCATE);
+ ofn.lpstrFile = defaultFName;
+ }
+ }
+
+ Ok = GetOpenFileName(&ofn);
+ if (Ok)
+ {
+ /* count number of file names */
+ len = strlen(fv->FnStrMem);
+ i = 0;
+ while (len>0)
+ {
+ i = i + len + 1;
+ fv->NumFname++;
+ len = strlen(&fv->FnStrMem[i]);
+ }
+
+ fv->NumFname--;
+
+ 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;
+ }
+
+ memcpy(CurDir,fv->FullName,fv->DirLen);
+ CurDir[fv->DirLen] = 0;
+ if ((fv->DirLen>3) &&
+ (CurDir[fv->DirLen-1]=='\\'))
+ CurDir[fv->DirLen-1] = 0;
+
+ fv->FNCount = 0;
+ }
+
+ GlobalUnlock(fv->FnStrMemHandle);
+ if (! Ok)
+ {
+ GlobalFree(fv->FnStrMemHandle);
+ fv->FnStrMemHandle = NULL;
+ }
+
+ /* restore dir */
+ _chdir(TempDir);
+
+ return Ok;
+}
+
+BOOL CALLBACK GetFnDlg
+ (HWND Dialog, UINT Message, WPARAM wParam, LPARAM lParam)
+{
+ PFileVar fv;
+ char TempFull[MAXPATHLEN];
+ int i, j;
+ char uimsg[MAX_UIMSG], uimsg2[MAX_UIMSG];
+ LOGFONT logfont;
+ HFONT font;
+
+ switch (Message) {
+ case WM_INITDIALOG:
+ fv = (PFileVar)lParam;
+ SetWindowLong(Dialog, DWL_USER, lParam);
+ SendDlgItemMessage(Dialog, IDC_GETFN, EM_LIMITTEXT, sizeof(TempFull)-1,0);
+
+ font = (HFONT)SendMessage(Dialog, WM_GETFONT, 0, 0);
+ GetObject(font, sizeof(LOGFONT), &logfont);
+ if (get_lang_font("DLG_SYSTEM_FONT", Dialog, &logfont, &DlgGetfnFont, UILanguageFile)) {
+ SendDlgItemMessage(Dialog, IDC_FILENAME, WM_SETFONT, (WPARAM)DlgGetfnFont, MAKELPARAM(TRUE,0));
+ SendDlgItemMessage(Dialog, IDC_GETFN, WM_SETFONT, (WPARAM)DlgGetfnFont, MAKELPARAM(TRUE,0));
+ SendDlgItemMessage(Dialog, IDOK, WM_SETFONT, (WPARAM)DlgGetfnFont, MAKELPARAM(TRUE,0));
+ SendDlgItemMessage(Dialog, IDCANCEL, WM_SETFONT, (WPARAM)DlgGetfnFont, MAKELPARAM(TRUE,0));
+ SendDlgItemMessage(Dialog, IDC_GETFNHELP, WM_SETFONT, (WPARAM)DlgGetfnFont, MAKELPARAM(TRUE,0));
+ }
+ else {
+ DlgGetfnFont = NULL;
+ }
+
+ GetWindowText(Dialog, uimsg2, sizeof(uimsg2));
+ get_lang_msg("DLG_GETFN_TITLE", uimsg, sizeof(uimsg), uimsg2, UILanguageFile);
+ SetWindowText(Dialog, uimsg);
+ GetDlgItemText(Dialog, IDC_FILENAME, uimsg2, sizeof(uimsg2));
+ get_lang_msg("DLG_GETFN_FILENAME", uimsg, sizeof(uimsg), uimsg2, UILanguageFile);
+ SetDlgItemText(Dialog, IDC_FILENAME, uimsg);
+ GetDlgItemText(Dialog, IDOK, uimsg2, sizeof(uimsg2));
+ get_lang_msg("BTN_OK", uimsg, sizeof(uimsg), uimsg2, UILanguageFile);
+ SetDlgItemText(Dialog, IDOK, uimsg);
+ GetDlgItemText(Dialog, IDCANCEL, uimsg2, sizeof(uimsg2));
+ get_lang_msg("BTN_CANCEL", uimsg, sizeof(uimsg), uimsg2, UILanguageFile);
+ SetDlgItemText(Dialog, IDCANCEL, uimsg);
+ GetDlgItemText(Dialog, IDC_GETFNHELP, uimsg2, sizeof(uimsg2));
+ get_lang_msg("BTN_HELP", uimsg, sizeof(uimsg), uimsg2, UILanguageFile);
+ SetDlgItemText(Dialog, IDC_GETFNHELP, uimsg);
+
+ return TRUE;
+
+ case WM_COMMAND:
+ fv = (PFileVar)GetWindowLong(Dialog,DWL_USER);
+ switch (LOWORD(wParam)) {
+ case IDOK:
+ if (fv!=NULL)
+ {
+ GetDlgItemText(Dialog, IDC_GETFN, TempFull, sizeof(TempFull));
+ if (strlen(TempFull)==0) return TRUE;
+ GetFileNamePos(TempFull,&i,&j);
+ FitFileName(&(TempFull[j]),sizeof(TempFull) - j, NULL);
+ strncat_s(fv->FullName,sizeof(fv->FullName),&(TempFull[j]),_TRUNCATE);
+ }
+ EndDialog(Dialog, 1);
+ if (DlgGetfnFont != NULL) {
+ DeleteObject(DlgGetfnFont);
+ }
+ return TRUE;
+ case IDCANCEL:
+ EndDialog(Dialog, 0);
+ if (DlgGetfnFont != NULL) {
+ DeleteObject(DlgGetfnFont);
+ }
+ return TRUE;
+ case IDC_GETFNHELP:
+ if (fv!=NULL)
+ PostMessage(fv->HMainWin,WM_USER_DLGHELP2,0,0);
+ break;
+ }
+ }
+ return FALSE;
+}
+
+BOOL FAR PASCAL GetGetFname(HWND HWin, PFileVar fv)
+{
+ return (BOOL)DialogBoxParam(hInst,
+ MAKEINTRESOURCE(IDD_GETFNDLG),
+ HWin, GetFnDlg, (LONG)fv);
+}
+
+void FAR PASCAL SetFileVar(PFileVar fv)
+{
+ int i;
+ char uimsg[MAX_UIMSG];
+
+ GetFileNamePos(fv->FullName,&(fv->DirLen),&i);
+ if (fv->FullName[fv->DirLen]=='\\') fv->DirLen++;
+ strncpy_s(fv->DlgCaption, sizeof(fv->DlgCaption),"Tera Term: ", _TRUNCATE);
+ switch (fv->OpId) {
+ case OpLog:
+ get_lang_msg("FILEDLG_TRANS_TITLE_LOG", uimsg, sizeof(uimsg), TitLog, UILanguageFile);
+ strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
+ break;
+ case OpSendFile:
+ get_lang_msg("FILEDLG_TRANS_TITLE_SENDFILE", uimsg, sizeof(uimsg), TitSendFile, UILanguageFile);
+ strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
+ break;
+ case OpKmtRcv:
+ get_lang_msg("FILEDLG_TRANS_TITLE_KMTRCV", uimsg, sizeof(uimsg), TitKmtRcv, UILanguageFile);
+ strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
+ break;
+ case OpKmtGet:
+ get_lang_msg("FILEDLG_TRANS_TITLE_KMTGET", uimsg, sizeof(uimsg), TitKmtGet, UILanguageFile);
+ strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
+ break;
+ case OpKmtSend:
+ get_lang_msg("FILEDLG_TRANS_TITLE_KMTSEND", uimsg, sizeof(uimsg), TitKmtSend, UILanguageFile);
+ strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
+ break;
+ case OpKmtFin:
+ get_lang_msg("FILEDLG_TRANS_TITLE_KMTFIN", uimsg, sizeof(uimsg), TitKmtFin, UILanguageFile);
+ strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
+ break;
+ case OpXRcv:
+ get_lang_msg("FILEDLG_TRANS_TITLE_XRCV", uimsg, sizeof(uimsg), TitXRcv, UILanguageFile);
+ strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
+ break;
+ case OpXSend:
+ get_lang_msg("FILEDLG_TRANS_TITLE_XSEND", uimsg, sizeof(uimsg), TitXSend, UILanguageFile);
+ strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
+ break;
+ case OpYRcv:
+ get_lang_msg("FILEDLG_TRANS_TITLE_YRCV", uimsg, sizeof(uimsg), TitYRcv, UILanguageFile);
+ strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
+ break;
+ case OpYSend:
+ get_lang_msg("FILEDLG_TRANS_TITLE_YSEND", uimsg, sizeof(uimsg), TitYSend, UILanguageFile);
+ strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
+ break;
+ case OpZRcv:
+ get_lang_msg("FILEDLG_TRANS_TITLE_ZRCV", uimsg, sizeof(uimsg), TitZRcv, UILanguageFile);
+ strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
+ break;
+ case OpZSend:
+ get_lang_msg("FILEDLG_TRANS_TITLE_ZSEND", uimsg, sizeof(uimsg), TitZSend, UILanguageFile);
+ strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
+ break;
+ case OpBPRcv:
+ get_lang_msg("FILEDLG_TRANS_TITLE_BPRCV", uimsg, sizeof(uimsg), TitBPRcv, UILanguageFile);
+ strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
+ break;
+ case OpBPSend:
+ get_lang_msg("FILEDLG_TRANS_TITLE_BPSEND", uimsg, sizeof(uimsg), TitBPSend, UILanguageFile);
+ strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
+ break;
+ case OpQVRcv:
+ get_lang_msg("FILEDLG_TRANS_TITLE_QVRCV", uimsg, sizeof(uimsg), TitQVRcv, UILanguageFile);
+ strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
+ break;
+ case OpQVSend:
+ get_lang_msg("FILEDLG_TRANS_TITLE_QVSEND", uimsg, sizeof(uimsg), TitQVSend, UILanguageFile);
+ strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
+ break;
+ }
+}
+
+/* Hook function for XMODEM file name dialog box */
+BOOL CALLBACK XFnHook(HWND Dialog, UINT Message, WPARAM wParam, LPARAM lParam)
+{
+ LPOPENFILENAME ofn;
+ WORD Hi, Lo;
+ LPLONG pl;
+ LPOFNOTIFY notify;
+ char uimsg[MAX_UIMSG], uimsg2[MAX_UIMSG];
+ LOGFONT logfont;
+ HFONT font;
+
+ switch (Message) {
+ case WM_INITDIALOG:
+ ofn = (LPOPENFILENAME)lParam;
+ pl = (LPLONG)ofn->lCustData;
+ SetWindowLong(Dialog, DWL_USER, (LONG)pl);
+
+ font = (HFONT)SendMessage(Dialog, WM_GETFONT, 0, 0);
+ GetObject(font, sizeof(LOGFONT), &logfont);
+ if (get_lang_font("DLG_TAHOMA_FONT", Dialog, &logfont, &DlgFoptFont, UILanguageFile)) {
+ SendDlgItemMessage(Dialog, IDC_XOPT, WM_SETFONT, (WPARAM)DlgFoptFont, MAKELPARAM(TRUE,0));
+ SendDlgItemMessage(Dialog, IDC_XOPTCHECK, WM_SETFONT, (WPARAM)DlgFoptFont, MAKELPARAM(TRUE,0));
+ SendDlgItemMessage(Dialog, IDC_XOPTCRC, WM_SETFONT, (WPARAM)DlgFoptFont, MAKELPARAM(TRUE,0));
+ SendDlgItemMessage(Dialog, IDC_XOPT1K, WM_SETFONT, (WPARAM)DlgFoptFont, MAKELPARAM(TRUE,0));
+ SendDlgItemMessage(Dialog, IDC_XOPTBIN, WM_SETFONT, (WPARAM)DlgFoptFont, MAKELPARAM(TRUE,0));
+ }
+ else {
+ DlgFoptFont = NULL;
+ }
+
+ GetDlgItemText(Dialog, IDC_XOPT, uimsg2, sizeof(uimsg2));
+ get_lang_msg("DLG_XOPT", uimsg, sizeof(uimsg), uimsg2, UILanguageFile);
+ SetDlgItemText(Dialog, IDC_XOPT, uimsg);
+ GetDlgItemText(Dialog, IDC_XOPTCHECK, uimsg2, sizeof(uimsg2));
+ get_lang_msg("DLG_XOPT_CHECKSUM", uimsg, sizeof(uimsg), uimsg2, UILanguageFile);
+ SetDlgItemText(Dialog, IDC_XOPTCHECK, uimsg);
+ GetDlgItemText(Dialog, IDC_XOPTCRC, uimsg2, sizeof(uimsg2));
+ get_lang_msg("DLG_XOPT_CRC", uimsg, sizeof(uimsg), uimsg2, UILanguageFile);
+ SetDlgItemText(Dialog, IDC_XOPTCRC, uimsg);
+ GetDlgItemText(Dialog, IDC_XOPT1K, uimsg2, sizeof(uimsg2));
+ get_lang_msg("DLG_XOPT_1K", uimsg, sizeof(uimsg), uimsg2, UILanguageFile);
+ SetDlgItemText(Dialog, IDC_XOPT1K, uimsg);
+ GetDlgItemText(Dialog, IDC_XOPTBIN, uimsg2, sizeof(uimsg2));
+ get_lang_msg("DLG_XOPT_BINARY", uimsg, sizeof(uimsg), uimsg2, UILanguageFile);
+ SetDlgItemText(Dialog, IDC_XOPTBIN, uimsg);
+
+ SetRB(Dialog,HIWORD(*pl),IDC_XOPTCHECK,IDC_XOPT1K);
+ if (LOWORD(*pl)!=0xFFFF)
+ {
+ ShowDlgItem(Dialog,IDC_XOPTBIN,IDC_XOPTBIN);
+ SetRB(Dialog,LOWORD(*pl),IDC_XOPTBIN,IDC_XOPTBIN);
+ }
+ return TRUE;
+ case WM_COMMAND: // for old style dialog
+ switch (LOWORD(wParam)) {
+ case IDOK:
+ pl = (LPLONG)GetWindowLong(Dialog,DWL_USER);
+ if (pl!=NULL)
+ {
+ GetRB(Dialog,&Hi,IDC_XOPTCHECK,IDC_XOPT1K);
+ if (LOWORD(*pl)==0xFFFF)
+ Lo = 0xFFFF;
+ else
+ GetRB(Dialog,&Lo,IDC_XOPTBIN,IDC_XOPTBIN);
+ *pl = MAKELONG(Lo,Hi);
+ }
+ break;
+ case IDCANCEL:
+ break;
+ }
+ break;
+ case WM_NOTIFY: // for Explorer-style dialog
+ notify = (LPOFNOTIFY)lParam;
+ switch (notify->hdr.code) {
+ case CDN_FILEOK:
+ pl = (LPLONG)GetWindowLong(Dialog,DWL_USER);
+ if (pl!=NULL)
+ {
+ GetRB(Dialog,&Hi,IDC_XOPTCHECK,IDC_XOPT1K);
+ if (LOWORD(*pl)==0xFFFF)
+ Lo = 0xFFFF;
+ else
+ GetRB(Dialog,&Lo,IDC_XOPTBIN,IDC_XOPTBIN);
+ *pl = MAKELONG(Lo,Hi);
+ }
+ if (DlgXoptFont != NULL) {
+ DeleteObject(DlgXoptFont);
+ }
+ break;
+ }
+ break;
+ }
+ return FALSE;
+}
+
+BOOL FAR PASCAL GetXFname
+ (HWND HWin, BOOL Receive, LPLONG Option, PFileVar fv, PCHAR CurDir)
+{
+ char uimsg[MAX_UIMSG];
+ char FNFilter[sizeof(FileSendFilter)*2+128], *pf;
+ OPENFILENAME ofn;
+ LONG opt;
+ char TempDir[MAXPATHLEN];
+ BOOL Ok;
+
+ memset(FNFilter, 0, sizeof(FNFilter)); /* Set up for double null at end */
+
+ /* save current dir */
+ _getcwd(TempDir,sizeof(TempDir));
+
+ fv->FullName[0] = 0;
+ memset(FNFilter, 0, sizeof(FNFilter)); /* Set up for double null at end */
+ memset(&ofn, 0, sizeof(OPENFILENAME));
+
+ strncpy_s(fv->DlgCaption, sizeof(fv->DlgCaption),"Tera Term: ", _TRUNCATE);
+ pf = FNFilter;
+ if (Receive)
+ {
+ get_lang_msg("FILEDLG_TRANS_TITLE_XRCV", uimsg, sizeof(uimsg), TitXRcv, UILanguageFile);
+ strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
+ }
+ else
+ {
+ get_lang_msg("FILEDLG_TRANS_TITLE_XSEND", uimsg, sizeof(uimsg), TitXSend, UILanguageFile);
+ strncat_s(fv->DlgCaption, sizeof(fv->DlgCaption), uimsg, _TRUNCATE);
+ if (strlen(FileSendFilter) > 0) {
+ get_lang_msg("FILEDLG_USER_FILTER_NAME", uimsg, sizeof(uimsg), "User define", UILanguageFile);
+ _snprintf_s(FNFilter, sizeof(FNFilter), _TRUNCATE, "%s(%s)", uimsg, FileSendFilter);
+ pf = pf + strlen(FNFilter) + 1;
+ strncpy_s(pf, sizeof(FNFilter)-(pf - FNFilter) ,FileSendFilter, _TRUNCATE);
+ pf = pf + strlen(pf) + 1;
+
+ // ??????????????????????????????+ // ?????????????????????? (2008.5.18 maya)
+ if (!isInvalidFileNameChar(FileSendFilter)) {
+ char file[MAX_PATH];
+ strncpy_s(file, sizeof(file), CurDir, _TRUNCATE);
+ AppendSlash(file, sizeof(file));
+ strncat_s(file, sizeof(file), FileSendFilter, _TRUNCATE);
+ if (_access(file, 0) == 0) {
+ strncpy_s(fv->FullName, sizeof(fv->FullName), FileSendFilter, _TRUNCATE);
+ }
+ }
+ }
+ }
+
+ get_lang_msg("FILEDLG_ALL_FILTER", uimsg, sizeof(uimsg), "All(*.*)\\0*.*\\0\\0", UILanguageFile);
+ // \0\0 ????K?????? 2 ???
+ memcpy(pf, uimsg, sizeof(FNFilter) - (pf - FNFilter + 2));
+
+ ofn.lStructSize = sizeof(OPENFILENAME);
+ ofn.hwndOwner = HWin;
+ ofn.lpstrFilter = FNFilter;
+ ofn.nFilterIndex = 1;
+ ofn.lpstrFile = fv->FullName;
+ ofn.nMaxFile = sizeof(fv->FullName);
+ ofn.lpstrInitialDir = CurDir;
+ ofn.Flags = OFN_SHOWHELP | OFN_HIDEREADONLY |
+ OFN_ENABLETEMPLATE | OFN_ENABLEHOOK;
+ opt = *Option;
+ if (! Receive)
+ {
+ ofn.Flags = ofn.Flags | OFN_FILEMUSTEXIST;
+ opt = opt | 0xFFFF;
+ }
+ ofn.lCustData = (DWORD)&opt;
+
+ ofn.lpstrTitle = fv->DlgCaption;
+ ofn.lpfnHook = (LPOFNHOOKPROC)(&XFnHook);
+ ofn.Flags = ofn.Flags | OFN_EXPLORER;
+ ofn.lpTemplateName = MAKEINTRESOURCE(IDD_XOPT);
+ ofn.hInstance = hInst;
+
+ Ok = GetOpenFileName(&ofn);
+
+ if (Ok)
+ {
+ fv->DirLen = ofn.nFileOffset;
+ fv->FnPtr = ofn.nFileOffset;
+ memcpy(CurDir,fv->FullName,fv->DirLen-1);
+ CurDir[fv->DirLen-1] = 0;
+
+ if (Receive)
+ *Option = opt;
+ else
+ *Option = MAKELONG(LOWORD(*Option),HIWORD(opt));
+ }
+
+ /* restore dir */
+ _chdir(TempDir);
+
+ return Ok;
+}
+
+void FAR PASCAL ProtoInit(int Proto, PFileVar fv, PCHAR pv, PComVar cv, PTTSet ts)
+{
+ switch (Proto) {
+ case PROTO_KMT:
+ KmtInit(fv,(PKmtVar)pv,cv,ts);
+ break;
+ case PROTO_XM:
+ XInit(fv,(PXVar)pv,cv,ts);
+ break;
+ case PROTO_YM:
+ YInit(fv,(PYVar)pv,cv,ts);
+ break;
+ case PROTO_ZM:
+ ZInit(fv,(PZVar)pv,cv,ts);
+ break;
+ case PROTO_BP:
+ BPInit(fv,(PBPVar)pv,cv,ts);
+ break;
+ case PROTO_QV:
+ QVInit(fv,(PQVVar)pv,cv,ts);
+ break;
+ }
+}
+
+BOOL FAR PASCAL ProtoParse
+ (int Proto, PFileVar fv, PCHAR pv, PComVar cv)
+{
+ BOOL Ok;
+
+ Ok = FALSE;
+ switch (Proto) {
+ case PROTO_KMT:
+ Ok = KmtReadPacket(fv,(PKmtVar)pv,cv);
+ break;
+ case PROTO_XM:
+ switch (((PXVar)pv)->XMode) {
+ case IdXReceive:
+ Ok = XReadPacket(fv,(PXVar)pv,cv);
+ break;
+ case IdXSend:
+ Ok = XSendPacket(fv,(PXVar)pv,cv);
+ break;
+ }
+ break;
+ case PROTO_YM:
+ switch (((PYVar)pv)->YMode) {
+ case IdYReceive:
+ Ok = YReadPacket(fv,(PYVar)pv,cv);
+ break;
+ case IdYSend:
+ Ok = YSendPacket(fv,(PYVar)pv,cv);
+ break;
+ }
+ break;
+ case PROTO_ZM:
+ Ok = ZParse(fv,(PZVar)pv,cv);
+ break;
+ case PROTO_BP:
+ Ok = BPParse(fv,(PBPVar)pv,cv);
+ break;
+ case PROTO_QV:
+ switch (((PQVVar)pv)->QVMode) {
+ case IdQVReceive:
+ Ok = QVReadPacket(fv,(PQVVar)pv,cv);
+ break;
+ case IdQVSend:
+ Ok = QVSendPacket(fv,(PQVVar)pv,cv);
+ break;
+ }
+ break;
+ }
+ return Ok;
+}
+
+void FAR PASCAL ProtoTimeOutProc
+ (int Proto, PFileVar fv, PCHAR pv, PComVar cv)
+{
+ switch (Proto) {
+ case PROTO_KMT:
+ KmtTimeOutProc(fv,(PKmtVar)pv,cv);
+ break;
+ case PROTO_XM:
+ XTimeOutProc(fv,(PXVar)pv,cv);
+ break;
+ case PROTO_YM:
+ YTimeOutProc(fv,(PYVar)pv,cv);
+ break;
+ case PROTO_ZM:
+ ZTimeOutProc(fv,(PZVar)pv,cv);
+ break;
+ case PROTO_BP:
+ BPTimeOutProc(fv,(PBPVar)pv,cv);
+ break;
+ case PROTO_QV:
+ QVTimeOutProc(fv,(PQVVar)pv,cv);
+ break;
+ }
+}
+
+BOOL FAR PASCAL ProtoCancel
+ (int Proto, PFileVar fv, PCHAR pv, PComVar cv)
+{
+ switch (Proto) {
+ case PROTO_KMT:
+ KmtCancel(fv,(PKmtVar)pv,cv);
+ break;
+ case PROTO_XM:
+ XCancel(fv,(PXVar)pv,cv);
+ break;
+ case PROTO_YM:
+ YCancel(fv, (PYVar)pv,cv);
+ break;
+ case PROTO_ZM:
+ ZCancel((PZVar)pv);
+ break;
+ case PROTO_BP:
+ if (((PBPVar)pv)->BPState != BP_Failure)
+ {
+ BPCancel((PBPVar)pv);
+ return FALSE;
+ }
+ break;
+ case PROTO_QV:
+ QVCancel(fv,(PQVVar)pv,cv);
+ break;
+ }
+ return TRUE;
+}
+
+void FAR PASCAL TTFILESetUILanguageFile(char *file)
+{
+ strncpy_s(UILanguageFile, sizeof(UILanguageFile), file, _TRUNCATE);
+}
+
+void FAR PASCAL TTFILESetFileSendFilter(char *file)
+{
+ strncpy_s(FileSendFilter, sizeof(FileSendFilter), file, _TRUNCATE);
+}
+
+BOOL WINAPI DllMain(HANDLE hInstance,
+ ULONG ul_reason_for_call,
+ LPVOID lpReserved)
+{
+// PMap pm;
+// HANDLE HMap = NULL;
+
+ hInst = hInstance;
+ switch( ul_reason_for_call ) {
+ case DLL_THREAD_ATTACH:
+ /* do thread initialization */
+ break;
+ case DLL_THREAD_DETACH:
+ /* do thread cleanup */
+ break;
+ case DLL_PROCESS_ATTACH:
+ /* do process initialization */
+// HMap = CreateFileMapping((HANDLE) 0xFFFFFFFF, NULL, PAGE_READONLY,
+// 0, sizeof(TMap), TT_FILEMAPNAME);
+// if (HMap != NULL) {
+// pm = (PMap)MapViewOfFile(HMap,FILE_MAP_READ,0,0,0);
+// if (pm != NULL) {
+// strncpy_s(UILanguageFile, sizeof(UILanguageFile), pm->ts.UILanguageFile, _TRUNCATE);
+// strncpy_s(FileSendFilter, sizeof(FileSendFilter), pm->ts.FileSendFilter, _TRUNCATE);
+// }
+// }
+ DoCover_IsDebuggerPresent();
+ break;
+ case DLL_PROCESS_DETACH:
+ /* do process cleanup */
+ break;
+ }
+ return TRUE;
+}
Modified: trunk/teraterm/ttpfile/xmodem.c
===================================================================
--- trunk/teraterm/ttpfile/xmodem.c 2010-04-12 13:48:37 UTC (rev 3856)
+++ trunk/teraterm/ttpfile/xmodem.c 2010-04-12 14:47:54 UTC (rev 3857)
@@ -1,505 +1,505 @@
-/* Tera Term
- Copyright(C) 1994-1998 T. Teranishi
- All rights reserved. */
-
-/* TTFILE.DLL, XMODEM protocol */
-#include "teraterm.h"
-#include "tttypes.h"
-#include "ttftypes.h"
-#include
-
-#include "tt_res.h"
-#include "ttcommon.h"
-#include "ttlib.h"
-#include "ftlib.h"
-#include "dlglib.h"
-
-#include "xmodem.h"
-
-#define TimeOutInit 10
-#define TimeOutC 3
-#define TimeOutShort 10
-#define TimeOutLong 20
-#define TimeOutVeryLong 60
-
-int XRead1Byte(PFileVar fv, PXVar xv, PComVar cv, LPBYTE b)
-{
- if (CommRead1Byte(cv, b) == 0)
- return 0;
-
- if (fv->LogFlag) {
- if (fv->LogState == 0) {
- // ???ASCII?ヲ???
- fv->FlushLogLineBuf = 1;
- FTLog1Byte(fv, 0);
- fv->FlushLogLineBuf = 0;
-
- fv->LogState = 1;
- fv->LogCount = 0;
- _lwrite(fv->LogFile, "\015\012<<<\015\012", 7);
- }
- FTLog1Byte(fv, *b);
- }
- return 1;
-}
-
-int XWrite(PFileVar fv, PXVar xv, PComVar cv, PCHAR B, int C)
-{
- int i, j;
-
- i = CommBinaryOut(cv, B, C);
- if (fv->LogFlag && (i > 0)) {
- if (fv->LogState != 0) {
- // ???ASCII?ヲ???
- fv->FlushLogLineBuf = 1;
- FTLog1Byte(fv, 0);
- fv->FlushLogLineBuf = 0;
-
- fv->LogState = 0;
- fv->LogCount = 0;
- _lwrite(fv->LogFile, "\015\012>>>\015\012", 7);
- }
- for (j = 0; j <= i - 1; j++)
- FTLog1Byte(fv, B[j]);
- }
- return i;
-}
-
-void XSetOpt(PFileVar fv, PXVar xv, WORD Opt)
-{
- char Tmp[21];
-
- xv->XOpt = Opt;
-
- strncpy_s(Tmp, sizeof(Tmp), "XMODEM (", _TRUNCATE);
- switch (xv->XOpt) {
- case XoptCheck: /* Checksum */
- strncat_s(Tmp, sizeof(Tmp), "checksum)", _TRUNCATE);
- xv->DataLen = 128;
- xv->CheckLen = 1;
- break;
- case XoptCRC: /* CRC */
- strncat_s(Tmp, sizeof(Tmp), "CRC)", _TRUNCATE);
- xv->DataLen = 128;
- xv->CheckLen = 2;
- break;
- case Xopt1K: /* 1K */
- strncat_s(Tmp, sizeof(Tmp), "1K)", _TRUNCATE);
- xv->DataLen = 1024;
- xv->CheckLen = 2;
- break;
- }
- SetDlgItemText(fv->HWin, IDC_PROTOPROT, Tmp);
-}
-
-void XSendNAK(PFileVar fv, PXVar xv, PComVar cv)
-{
- BYTE b;
- int t;
-
- /* flush comm buffer */
- cv->InBuffCount = 0;
- cv->InPtr = 0;
-
- xv->NAKCount--;
- if (xv->NAKCount < 0) {
- if (xv->NAKMode == XnakC) {
- XSetOpt(fv, xv, XoptCheck);
- xv->NAKMode = XnakNAK;
- xv->NAKCount = 9;
- } else {
- XCancel(fv, xv, cv);
- return;
- }
- }
-
- if (xv->NAKMode == XnakNAK) {
- b = NAK;
- if ((xv->PktNum == 0) && (xv->PktNumOffset == 0))
- t = TimeOutInit;
- else
- t = xv->TOutLong;
- } else {
- b = 'C';
- t = TimeOutC;
- }
- XWrite(fv, xv, cv, &b, 1);
- xv->PktReadMode = XpktSOH;
- FTSetTimeOut(fv, t);
-}
-
-WORD XCalcCheck(PXVar xv, PCHAR PktBuf)
-{
- int i;
- WORD Check;
-
- if (xv->CheckLen == 1) { /* CheckSum */
- /* Calc sum */
- Check = 0;
- for (i = 0; i <= xv->DataLen - 1; i++)
- Check = Check + (BYTE) (PktBuf[3 + i]);
- return (Check & 0xff);
- } else { /* CRC */
- Check = 0;
- for (i = 0; i <= xv->DataLen - 1; i++)
- Check = UpdateCRC(PktBuf[3 + i], Check);
- return (Check);
- }
-}
-
-BOOL XCheckPacket(PXVar xv)
-{
- WORD Check;
-
- Check = XCalcCheck(xv, xv->PktIn);
- if (xv->CheckLen == 1) /* Checksum */
- return ((BYTE) Check == xv->PktIn[xv->DataLen + 3]);
- else
- return ((HIBYTE(Check) == xv->PktIn[xv->DataLen + 3]) &&
- (LOBYTE(Check) == xv->PktIn[xv->DataLen + 4]));
-}
-
-void XInit(PFileVar fv, PXVar xv, PComVar cv, PTTSet ts) {
- char inistr[MAXPATHLEN + 10];
-
- fv->LogFlag = ((ts->LogFlag & LOG_X) != 0);
- if (fv->LogFlag)
- fv->LogFile = _lcreat("XMODEM.LOG", 0);
- fv->LogState = 0;
- fv->LogCount = 0;
-
- fv->FileSize = 0;
- if ((xv->XMode == IdXSend) && fv->FileOpen) {
- fv->FileSize = GetFSize(fv->FullName);
- InitDlgProgress(fv->HWin, IDC_PROTOPROGRESS, &fv->ProgStat);
- } else {
- fv->ProgStat = -1;
- }
-
- SetWindowText(fv->HWin, fv->DlgCaption);
- SetDlgItemText(fv->HWin, IDC_PROTOFNAME, &(fv->FullName[fv->DirLen]));
-
- xv->PktNumOffset = 0;
- xv->PktNum = 0;
- xv->PktNumSent = 0;
- xv->PktBufCount = 0;
- xv->CRRecv = FALSE;
-
- fv->ByteCount = 0;
-
- if (cv->PortType == IdTCPIP) {
- xv->TOutShort = TimeOutVeryLong;
- xv->TOutLong = TimeOutVeryLong;
- } else {
- xv->TOutShort = TimeOutShort;
- xv->TOutLong = TimeOutLong;
- }
-
- XSetOpt(fv, xv, xv->XOpt);
-
- if (xv->XOpt == XoptCheck) {
- xv->NAKMode = XnakNAK;
- xv->NAKCount = 10;
- } else {
- xv->NAKMode = XnakC;
- xv->NAKCount = 3;
- }
-
- switch (xv->XMode) {
- case IdXSend:
- xv->TextFlag = 0;
-
- // ???????????"rx ?????"?ゥ???????B(2007.12.20 yutaka)
- if (ts->XModemRcvCommand[0] != '\0') {
- _snprintf_s(inistr, sizeof(inistr), _TRUNCATE, "%s %s\015",
- ts->XModemRcvCommand, &(fv->FullName[fv->DirLen]));
- FTConvFName(inistr + strlen(ts->XModemRcvCommand) + 1);
- XWrite(fv, xv, cv, inistr, strlen(inistr));
- }
-
- FTSetTimeOut(fv, TimeOutVeryLong);
- break;
- case IdXReceive:
- XSendNAK(fv, xv, cv);
- break;
- }
-}
-
-void XCancel(PFileVar fv, PXVar xv, PComVar cv)
-{
- // five cancels & five backspaces per spec
- BYTE cancel[] = { CAN, CAN, CAN, CAN, CAN, BS, BS, BS, BS, BS };
-
- XWrite(fv,xv,cv, (PCHAR)&cancel, sizeof(cancel));
- xv->XMode = 0; // quit
-}
-
-void XTimeOutProc(PFileVar fv, PXVar xv, PComVar cv)
-{
- switch (xv->XMode) {
- case IdXSend:
- xv->XMode = 0; // quit
- break;
- case IdXReceive:
- XSendNAK(fv, xv, cv);
- break;
- }
-}
-
-BOOL XReadPacket(PFileVar fv, PXVar xv, PComVar cv)
-{
- BYTE b, d;
- int i, c;
- BOOL GetPkt;
-
- c = XRead1Byte(fv, xv, cv, &b);
-
- GetPkt = FALSE;
-
- while ((c > 0) && (!GetPkt)) {
- switch (xv->PktReadMode) {
- case XpktSOH:
- if (b == SOH) {
- xv->PktIn[0] = b;
- xv->PktReadMode = XpktBLK;
- if (xv->XOpt == Xopt1K)
- XSetOpt(fv, xv, XoptCRC);
- FTSetTimeOut(fv, xv->TOutShort);
- } else if (b == STX) {
- xv->PktIn[0] = b;
- xv->PktReadMode = XpktBLK;
- XSetOpt(fv, xv, Xopt1K);
- FTSetTimeOut(fv, xv->TOutShort);
- } else if (b == EOT) {
- b = ACK;
- fv->Success = TRUE;
- XWrite(fv, xv, cv, &b, 1);
- return FALSE;
- } else {
- /* flush comm buffer */
- cv->InBuffCount = 0;
- cv->InPtr = 0;
- return TRUE;
- }
- break;
- case XpktBLK:
- xv->PktIn[1] = b;
- xv->PktReadMode = XpktBLK2;
- FTSetTimeOut(fv, xv->TOutShort);
- break;
- case XpktBLK2:
- xv->PktIn[2] = b;
- if ((b ^ xv->PktIn[1]) == 0xff) {
- xv->PktBufPtr = 3;
- xv->PktBufCount = xv->DataLen + xv->CheckLen;
- xv->PktReadMode = XpktDATA;
- FTSetTimeOut(fv, xv->TOutShort);
- } else
- XSendNAK(fv, xv, cv);
- break;
- case XpktDATA:
- xv->PktIn[xv->PktBufPtr] = b;
- xv->PktBufPtr++;
- xv->PktBufCount--;
- GetPkt = xv->PktBufCount == 0;
- if (GetPkt) {
- FTSetTimeOut(fv, xv->TOutLong);
- xv->PktReadMode = XpktSOH;
- } else
- FTSetTimeOut(fv, xv->TOutShort);
- break;
- }
-
- if (!GetPkt)
- c = XRead1Byte(fv, xv, cv, &b);
- }
-
- if (!GetPkt)
- return TRUE;
-
- if ((xv->PktIn[1] == 0) && (xv->PktNum == 0) &&
- (xv->PktNumOffset == 0)) {
- if (xv->NAKMode == XnakNAK)
- xv->NAKCount = 10;
- else
- xv->NAKCount = 3;
- XSendNAK(fv, xv, cv);
- return TRUE;
- }
-
- GetPkt = XCheckPacket(xv);
- if (!GetPkt) {
- XSendNAK(fv, xv, cv);
- return TRUE;
- }
-
- d = xv->PktIn[1] - xv->PktNum;
- if (d > 1) {
- XCancel(fv, xv, cv);
- return FALSE;
- }
-
- /* send ACK */
- b = ACK;
- XWrite(fv, xv, cv, &b, 1);
- xv->NAKMode = XnakNAK;
- xv->NAKCount = 10;
-
- if (d == 0)
- return TRUE;
- xv->PktNum = xv->PktIn[1];
- if (xv->PktNum == 0)
- xv->PktNumOffset = xv->PktNumOffset + 256;
-
- c = xv->DataLen;
- if (xv->TextFlag > 0)
- while ((c > 0) && (xv->PktIn[2 + c] == 0x1A))
- c--;
-
- if (xv->TextFlag > 0)
- for (i = 0; i <= c - 1; i++) {
- b = xv->PktIn[3 + i];
- if ((b == LF) && (!xv->CRRecv))
- _lwrite(fv->FileHandle, "\015", 1);
- if (xv->CRRecv && (b != LF))
- _lwrite(fv->FileHandle, "\012", 1);
- xv->CRRecv = b == CR;
- _lwrite(fv->FileHandle, &b, 1);
- } else
- _lwrite(fv->FileHandle, &(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);
-
- FTSetTimeOut(fv, xv->TOutLong);
-
- return TRUE;
-}
-
-BOOL XSendPacket(PFileVar fv, PXVar xv, PComVar cv)
-{
- BYTE b;
- int i;
- BOOL SendFlag;
- WORD Check;
-
- SendFlag = FALSE;
- if (xv->PktBufCount == 0) {
- i = XRead1Byte(fv, xv, cv, &b);
- do {
- if (i == 0)
- return TRUE;
- switch (b) {
- case ACK:
- if (!fv->FileOpen) {
- fv->Success = TRUE;
- return FALSE;
- } else if (xv->PktNumSent == (BYTE) (xv->PktNum + 1)) {
- xv->PktNum = xv->PktNumSent;
- if (xv->PktNum == 0)
- xv->PktNumOffset = xv->PktNumOffset + 256;
- SendFlag = TRUE;
- }
- break;
- case NAK:
- if (xv->PktNum == 0 && xv->XOpt == Xopt1K) {
- /* we wanted 1k with CRC, but the other end specified checksum */
- /* keep the 1k block, but move back to checksum mode. */
- xv->XOpt = XoptCheck;
- xv->CheckLen = 1;
- }
- SendFlag = TRUE;
- break;
- case CAN:
- break;
- case 0x43:
- if ((xv->PktNum == 0) && (xv->PktNumOffset == 0)) {
- if ((xv->XOpt == XoptCheck) && (xv->PktNumSent == 0))
- XSetOpt(fv, xv, XoptCRC);
- if (xv->XOpt != XoptCheck)
- SendFlag = TRUE;
- }
- break;
- }
- if (!SendFlag)
- i = XRead1Byte(fv, xv, cv, &b);
- } while (!SendFlag);
- // reset timeout timer
- FTSetTimeOut(fv, TimeOutVeryLong);
-
- do {
- i = XRead1Byte(fv, xv, cv, &b);
- } while (i != 0);
-
- if (xv->PktNumSent == xv->PktNum) { /* make a new packet */
- xv->PktNumSent++;
- if (xv->DataLen == 128)
- xv->PktOut[0] = SOH;
- else
- xv->PktOut[0] = STX;
- xv->PktOut[1] = xv->PktNumSent;
- xv->PktOut[2] = ~xv->PktNumSent;
-
- i = 1;
- while ((i <= xv->DataLen) && fv->FileOpen &&
- (_lread(fv->FileHandle, &b, 1) == 1)) {
- xv->PktOut[2 + i] = b;
- i++;
- fv->ByteCount++;
- }
-
- if (i > 1) {
- while (i <= xv->DataLen) {
- xv->PktOut[2 + i] = 0x1A;
- i++;
- }
-
- Check = XCalcCheck(xv, xv->PktOut);
- if (xv->CheckLen == 1) /* Checksum */
- xv->PktOut[xv->DataLen + 3] = (BYTE) Check;
- else {
- xv->PktOut[xv->DataLen + 3] = HIBYTE(Check);
- xv->PktOut[xv->DataLen + 4] = LOBYTE(Check);
- }
- xv->PktBufCount = 3 + xv->DataLen + xv->CheckLen;
- } else { /* send EOT */
- if (fv->FileOpen) {
- _lclose(fv->FileHandle);
- fv->FileHandle = 0;
- fv->FileOpen = FALSE;
- }
- xv->PktOut[0] = EOT;
- xv->PktBufCount = 1;
- }
- } else { /* resend packet */
- xv->PktBufCount = 3 + xv->DataLen + xv->CheckLen;
- }
- xv->PktBufPtr = 0;
- }
- /* a NAK or C could have arrived while we were buffering. Consume it. */
- do {
- i = XRead1Byte(fv, xv, cv, &b);
- } while (i != 0);
-
- i = 1;
- while ((xv->PktBufCount > 0) && (i > 0)) {
- b = xv->PktOut[xv->PktBufPtr];
- i = XWrite(fv, xv, cv, &b, 1);
- if (i > 0) {
- xv->PktBufCount--;
- xv->PktBufPtr++;
- }
- }
-
- if (xv->PktBufCount == 0) {
- SetDlgNum(fv->HWin, IDC_PROTOPKTNUM,
- xv->PktNumOffset + xv->PktNumSent);
- SetDlgNum(fv->HWin, IDC_PROTOBYTECOUNT, fv->ByteCount);
- SetDlgPercent(fv->HWin, IDC_PROTOPERCENT, IDC_PROTOPROGRESS,
- fv->ByteCount, fv->FileSize, &fv->ProgStat);
- }
-
- return TRUE;
-}
+/* Tera Term
+ Copyright(C) 1994-1998 T. Teranishi
+ All rights reserved. */
+
+/* TTFILE.DLL, XMODEM protocol */
+#include "teraterm.h"
+#include "tttypes.h"
+#include "ttftypes.h"
+#include
+
+#include "tt_res.h"
+#include "ttcommon.h"
+#include "ttlib.h"
+#include "ftlib.h"
+#include "dlglib.h"
+
+#include "xmodem.h"
+
+#define TimeOutInit 10
+#define TimeOutC 3
+#define TimeOutShort 10
+#define TimeOutLong 20
+#define TimeOutVeryLong 60
+
+int XRead1Byte(PFileVar fv, PXVar xv, PComVar cv, LPBYTE b)
+{
+ if (CommRead1Byte(cv, b) == 0)
+ return 0;
+
+ if (fv->LogFlag) {
+ if (fv->LogState == 0) {
+ // ???ASCII?ヲ???
+ fv->FlushLogLineBuf = 1;
+ FTLog1Byte(fv, 0);
+ fv->FlushLogLineBuf = 0;
+
+ fv->LogState = 1;
+ fv->LogCount = 0;
+ _lwrite(fv->LogFile, "\015\012<<<\015\012", 7);
+ }
+ FTLog1Byte(fv, *b);
+ }
+ return 1;
+}
+
+int XWrite(PFileVar fv, PXVar xv, PComVar cv, PCHAR B, int C)
+{
+ int i, j;
+
+ i = CommBinaryOut(cv, B, C);
+ if (fv->LogFlag && (i > 0)) {
+ if (fv->LogState != 0) {
+ // ???ASCII?ヲ???
+ fv->FlushLogLineBuf = 1;
+ FTLog1Byte(fv, 0);
+ fv->FlushLogLineBuf = 0;
+
+ fv->LogState = 0;
+ fv->LogCount = 0;
+ _lwrite(fv->LogFile, "\015\012>>>\015\012", 7);
+ }
+ for (j = 0; j <= i - 1; j++)
+ FTLog1Byte(fv, B[j]);
+ }
+ return i;
+}
+
+void XSetOpt(PFileVar fv, PXVar xv, WORD Opt)
+{
+ char Tmp[21];
+
+ xv->XOpt = Opt;
+
+ strncpy_s(Tmp, sizeof(Tmp), "XMODEM (", _TRUNCATE);
+ switch (xv->XOpt) {
+ case XoptCheck: /* Checksum */
+ strncat_s(Tmp, sizeof(Tmp), "checksum)", _TRUNCATE);
+ xv->DataLen = 128;
+ xv->CheckLen = 1;
+ break;
+ case XoptCRC: /* CRC */
+ strncat_s(Tmp, sizeof(Tmp), "CRC)", _TRUNCATE);
+ xv->DataLen = 128;
+ xv->CheckLen = 2;
+ break;
+ case Xopt1K: /* 1K */
+ strncat_s(Tmp, sizeof(Tmp), "1K)", _TRUNCATE);
+ xv->DataLen = 1024;
+ xv->CheckLen = 2;
+ break;
+ }
+ SetDlgItemText(fv->HWin, IDC_PROTOPROT, Tmp);
+}
+
+void XSendNAK(PFileVar fv, PXVar xv, PComVar cv)
+{
+ BYTE b;
+ int t;
+
+ /* flush comm buffer */
+ cv->InBuffCount = 0;
+ cv->InPtr = 0;
+
+ xv->NAKCount--;
+ if (xv->NAKCount < 0) {
+ if (xv->NAKMode == XnakC) {
+ XSetOpt(fv, xv, XoptCheck);
+ xv->NAKMode = XnakNAK;
+ xv->NAKCount = 9;
+ } else {
+ XCancel(fv, xv, cv);
+ return;
+ }
+ }
+
+ if (xv->NAKMode == XnakNAK) {
+ b = NAK;
+ if ((xv->PktNum == 0) && (xv->PktNumOffset == 0))
+ t = TimeOutInit;
+ else
+ t = xv->TOutLong;
+ } else {
+ b = 'C';
+ t = TimeOutC;
+ }
+ XWrite(fv, xv, cv, &b, 1);
+ xv->PktReadMode = XpktSOH;
+ FTSetTimeOut(fv, t);
+}
+
+WORD XCalcCheck(PXVar xv, PCHAR PktBuf)
+{
+ int i;
+ WORD Check;
+
+ if (xv->CheckLen == 1) { /* CheckSum */
+ /* Calc sum */
+ Check = 0;
+ for (i = 0; i <= xv->DataLen - 1; i++)
+ Check = Check + (BYTE) (PktBuf[3 + i]);
+ return (Check & 0xff);
+ } else { /* CRC */
+ Check = 0;
+ for (i = 0; i <= xv->DataLen - 1; i++)
+ Check = UpdateCRC(PktBuf[3 + i], Check);
+ return (Check);
+ }
+}
+
+BOOL XCheckPacket(PXVar xv)
+{
+ WORD Check;
+
+ Check = XCalcCheck(xv, xv->PktIn);
+ if (xv->CheckLen == 1) /* Checksum */
+ return ((BYTE) Check == xv->PktIn[xv->DataLen + 3]);
+ else
+ return ((HIBYTE(Check) == xv->PktIn[xv->DataLen + 3]) &&
+ (LOBYTE(Check) == xv->PktIn[xv->DataLen + 4]));
+}
+
+void XInit(PFileVar fv, PXVar xv, PComVar cv, PTTSet ts) {
+ char inistr[MAXPATHLEN + 10];
+
+ fv->LogFlag = ((ts->LogFlag & LOG_X) != 0);
+ if (fv->LogFlag)
+ fv->LogFile = _lcreat("XMODEM.LOG", 0);
+ fv->LogState = 0;
+ fv->LogCount = 0;
+
+ fv->FileSize = 0;
+ if ((xv->XMode == IdXSend) && fv->FileOpen) {
+ fv->FileSize = GetFSize(fv->FullName);
+ InitDlgProgress(fv->HWin, IDC_PROTOPROGRESS, &fv->ProgStat);
+ } else {
+ fv->ProgStat = -1;
+ }
+
+ SetWindowText(fv->HWin, fv->DlgCaption);
+ SetDlgItemText(fv->HWin, IDC_PROTOFNAME, &(fv->FullName[fv->DirLen]));
+
+ xv->PktNumOffset = 0;
+ xv->PktNum = 0;
+ xv->PktNumSent = 0;
+ xv->PktBufCount = 0;
+ xv->CRRecv = FALSE;
+
+ fv->ByteCount = 0;
+
+ if (cv->PortType == IdTCPIP) {
+ xv->TOutShort = TimeOutVeryLong;
+ xv->TOutLong = TimeOutVeryLong;
+ } else {
+ xv->TOutShort = TimeOutShort;
+ xv->TOutLong = TimeOutLong;
+ }
+
+ XSetOpt(fv, xv, xv->XOpt);
+
+ if (xv->XOpt == XoptCheck) {
+ xv->NAKMode = XnakNAK;
+ xv->NAKCount = 10;
+ } else {
+ xv->NAKMode = XnakC;
+ xv->NAKCount = 3;
+ }
+
+ switch (xv->XMode) {
+ case IdXSend:
+ xv->TextFlag = 0;
+
+ // ???????????"rx ?????"?ゥ???????B(2007.12.20 yutaka)
+ if (ts->XModemRcvCommand[0] != '\0') {
+ _snprintf_s(inistr, sizeof(inistr), _TRUNCATE, "%s %s\015",
+ ts->XModemRcvCommand, &(fv->FullName[fv->DirLen]));
+ FTConvFName(inistr + strlen(ts->XModemRcvCommand) + 1);
+ XWrite(fv, xv, cv, inistr, strlen(inistr));
+ }
+
+ FTSetTimeOut(fv, TimeOutVeryLong);
+ break;
+ case IdXReceive:
+ XSendNAK(fv, xv, cv);
+ break;
+ }
+}
+
+void XCancel(PFileVar fv, PXVar xv, PComVar cv)
+{
+ // five cancels & five backspaces per spec
+ BYTE cancel[] = { CAN, CAN, CAN, CAN, CAN, BS, BS, BS, BS, BS };
+
+ XWrite(fv,xv,cv, (PCHAR)&cancel, sizeof(cancel));
+ xv->XMode = 0; // quit
+}
+
+void XTimeOutProc(PFileVar fv, PXVar xv, PComVar cv)
+{
+ switch (xv->XMode) {
+ case IdXSend:
+ xv->XMode = 0; // quit
+ break;
+ case IdXReceive:
+ XSendNAK(fv, xv, cv);
+ break;
+ }
+}
+
+BOOL XReadPacket(PFileVar fv, PXVar xv, PComVar cv)
+{
+ BYTE b, d;
+ int i, c;
+ BOOL GetPkt;
+
+ c = XRead1Byte(fv, xv, cv, &b);
+
+ GetPkt = FALSE;
+
+ while ((c > 0) && (!GetPkt)) {
+ switch (xv->PktReadMode) {
+ case XpktSOH:
+ if (b == SOH) {
+ xv->PktIn[0] = b;
+ xv->PktReadMode = XpktBLK;
+ if (xv->XOpt == Xopt1K)
+ XSetOpt(fv, xv, XoptCRC);
+ FTSetTimeOut(fv, xv->TOutShort);
+ } else if (b == STX) {
+ xv->PktIn[0] = b;
+ xv->PktReadMode = XpktBLK;
+ XSetOpt(fv, xv, Xopt1K);
+ FTSetTimeOut(fv, xv->TOutShort);
+ } else if (b == EOT) {
+ b = ACK;
+ fv->Success = TRUE;
+ XWrite(fv, xv, cv, &b, 1);
+ return FALSE;
+ } else {
+ /* flush comm buffer */
+ cv->InBuffCount = 0;
+ cv->InPtr = 0;
+ return TRUE;
+ }
+ break;
+ case XpktBLK:
+ xv->PktIn[1] = b;
+ xv->PktReadMode = XpktBLK2;
+ FTSetTimeOut(fv, xv->TOutShort);
+ break;
+ case XpktBLK2:
+ xv->PktIn[2] = b;
+ if ((b ^ xv->PktIn[1]) == 0xff) {
+ xv->PktBufPtr = 3;
+ xv->PktBufCount = xv->DataLen + xv->CheckLen;
+ xv->PktReadMode = XpktDATA;
+ FTSetTimeOut(fv, xv->TOutShort);
+ } else
+ XSendNAK(fv, xv, cv);
+ break;
+ case XpktDATA:
+ xv->PktIn[xv->PktBufPtr] = b;
+ xv->PktBufPtr++;
+ xv->PktBufCount--;
+ GetPkt = xv->PktBufCount == 0;
+ if (GetPkt) {
+ FTSetTimeOut(fv, xv->TOutLong);
+ xv->PktReadMode = XpktSOH;
+ } else
+ FTSetTimeOut(fv, xv->TOutShort);
+ break;
+ }
+
+ if (!GetPkt)
+ c = XRead1Byte(fv, xv, cv, &b);
+ }
+
+ if (!GetPkt)
+ return TRUE;
+
+ if ((xv->PktIn[1] == 0) && (xv->PktNum == 0) &&
+ (xv->PktNumOffset == 0)) {
+ if (xv->NAKMode == XnakNAK)
+ xv->NAKCount = 10;
+ else
+ xv->NAKCount = 3;
+ XSendNAK(fv, xv, cv);
+ return TRUE;
+ }
+
+ GetPkt = XCheckPacket(xv);
+ if (!GetPkt) {
+ XSendNAK(fv, xv, cv);
+ return TRUE;
+ }
+
+ d = xv->PktIn[1] - xv->PktNum;
+ if (d > 1) {
+ XCancel(fv, xv, cv);
+ return FALSE;
+ }
+
+ /* send ACK */
+ b = ACK;
+ XWrite(fv, xv, cv, &b, 1);
+ xv->NAKMode = XnakNAK;
+ xv->NAKCount = 10;
+
+ if (d == 0)
+ return TRUE;
+ xv->PktNum = xv->PktIn[1];
+ if (xv->PktNum == 0)
+ xv->PktNumOffset = xv->PktNumOffset + 256;
+
+ c = xv->DataLen;
+ if (xv->TextFlag > 0)
+ while ((c > 0) && (xv->PktIn[2 + c] == 0x1A))
+ c--;
+
+ if (xv->TextFlag > 0)
+ for (i = 0; i <= c - 1; i++) {
+ b = xv->PktIn[3 + i];
+ if ((b == LF) && (!xv->CRRecv))
+ _lwrite(fv->FileHandle, "\015", 1);
+ if (xv->CRRecv && (b != LF))
+ _lwrite(fv->FileHandle, "\012", 1);
+ xv->CRRecv = b == CR;
+ _lwrite(fv->FileHandle, &b, 1);
+ } else
+ _lwrite(fv->FileHandle, &(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);
+
+ FTSetTimeOut(fv, xv->TOutLong);
+
+ return TRUE;
+}
+
+BOOL XSendPacket(PFileVar fv, PXVar xv, PComVar cv)
+{
+ BYTE b;
+ int i;
+ BOOL SendFlag;
+ WORD Check;
+
+ SendFlag = FALSE;
+ if (xv->PktBufCount == 0) {
+ i = XRead1Byte(fv, xv, cv, &b);
+ do {
+ if (i == 0)
+ return TRUE;
+ switch (b) {
+ case ACK:
+ if (!fv->FileOpen) {
+ fv->Success = TRUE;
+ return FALSE;
+ } else if (xv->PktNumSent == (BYTE) (xv->PktNum + 1)) {
+ xv->PktNum = xv->PktNumSent;
+ if (xv->PktNum == 0)
+ xv->PktNumOffset = xv->PktNumOffset + 256;
+ SendFlag = TRUE;
+ }
+ break;
+ case NAK:
+ if (xv->PktNum == 0 && xv->XOpt == Xopt1K) {
+ /* we wanted 1k with CRC, but the other end specified checksum */
+ /* keep the 1k block, but move back to checksum mode. */
+ xv->XOpt = XoptCheck;
+ xv->CheckLen = 1;
+ }
+ SendFlag = TRUE;
+ break;
+ case CAN:
+ break;
+ case 0x43:
+ if ((xv->PktNum == 0) && (xv->PktNumOffset == 0)) {
+ if ((xv->XOpt == XoptCheck) && (xv->PktNumSent == 0))
+ XSetOpt(fv, xv, XoptCRC);
+ if (xv->XOpt != XoptCheck)
+ SendFlag = TRUE;
+ }
+ break;
+ }
+ if (!SendFlag)
+ i = XRead1Byte(fv, xv, cv, &b);
+ } while (!SendFlag);
+ // reset timeout timer
+ FTSetTimeOut(fv, TimeOutVeryLong);
+
+ do {
+ i = XRead1Byte(fv, xv, cv, &b);
+ } while (i != 0);
+
+ if (xv->PktNumSent == xv->PktNum) { /* make a new packet */
+ xv->PktNumSent++;
+ if (xv->DataLen == 128)
+ xv->PktOut[0] = SOH;
+ else
+ xv->PktOut[0] = STX;
+ xv->PktOut[1] = xv->PktNumSent;
+ xv->PktOut[2] = ~xv->PktNumSent;
+
+ i = 1;
+ while ((i <= xv->DataLen) && fv->FileOpen &&
+ (_lread(fv->FileHandle, &b, 1) == 1)) {
+ xv->PktOut[2 + i] = b;
+ i++;
+ fv->ByteCount++;
+ }
+
+ if (i > 1) {
+ while (i <= xv->DataLen) {
+ xv->PktOut[2 + i] = 0x1A;
+ i++;
+ }
+
+ Check = XCalcCheck(xv, xv->PktOut);
+ if (xv->CheckLen == 1) /* Checksum */
+ xv->PktOut[xv->DataLen + 3] = (BYTE) Check;
+ else {
+ xv->PktOut[xv->DataLen + 3] = HIBYTE(Check);
+ xv->PktOut[xv->DataLen + 4] = LOBYTE(Check);
+ }
+ xv->PktBufCount = 3 + xv->DataLen + xv->CheckLen;
+ } else { /* send EOT */
+ if (fv->FileOpen) {
+ _lclose(fv->FileHandle);
+ fv->FileHandle = 0;
+ fv->FileOpen = FALSE;
+ }
+ xv->PktOut[0] = EOT;
+ xv->PktBufCount = 1;
+ }
+ } else { /* resend packet */
+ xv->PktBufCount = 3 + xv->DataLen + xv->CheckLen;
+ }
+ xv->PktBufPtr = 0;
+ }
+ /* a NAK or C could have arrived while we were buffering. Consume it. */
+ do {
+ i = XRead1Byte(fv, xv, cv, &b);
+ } while (i != 0);
+
+ i = 1;
+ while ((xv->PktBufCount > 0) && (i > 0)) {
+ b = xv->PktOut[xv->PktBufPtr];
+ i = XWrite(fv, xv, cv, &b, 1);
+ if (i > 0) {
+ xv->PktBufCount--;
+ xv->PktBufPtr++;
+ }
+ }
+
+ if (xv->PktBufCount == 0) {
+ SetDlgNum(fv->HWin, IDC_PROTOPKTNUM,
+ xv->PktNumOffset + xv->PktNumSent);
+ SetDlgNum(fv->HWin, IDC_PROTOBYTECOUNT, fv->ByteCount);
+ SetDlgPercent(fv->HWin, IDC_PROTOPERCENT, IDC_PROTOPROGRESS,
+ fv->ByteCount, fv->FileSize, &fv->ProgStat);
+ }
+
+ return TRUE;
+}
Modified: trunk/teraterm/ttpfile/ymodem.c
===================================================================
--- trunk/teraterm/ttpfile/ymodem.c 2010-04-12 13:48:37 UTC (rev 3856)
+++ trunk/teraterm/ttpfile/ymodem.c 2010-04-12 14:47:54 UTC (rev 3857)
@@ -1,796 +1,796 @@
-/* Tera Term
-Copyright(C) 2008-2010 TeraTerm Project
-All rights reserved. */
-
-/* TTFILE.DLL, YMODEM protocol */
-#include "teraterm.h"
-#include "tttypes.h"
-#include "ttftypes.h"
-#include
-#include
-#include
-#include
-
-#include "tt_res.h"
-#include "ttcommon.h"
-#include "ttlib.h"
-#include "ftlib.h"
-#include "dlglib.h"
-
-#include "ymodem.h"
-
-#define TimeOutInit 10
-#define TimeOutC 3
-#define TimeOutShort 10
-#define TimeOutLong 20
-#define TimeOutVeryLong 60
-
-// ?????????YMODEM?? 128 or 1024 byte ????????
-#define SOH_DATALEN 128
-#define STX_DATALEN 1024
-
-int YRead1Byte(PFileVar fv, PYVar yv, PComVar cv, LPBYTE b)
-{
- if (CommRead1Byte(cv,b) == 0)
- return 0;
-
- if (fv->LogFlag)
- {
- if (fv->LogState==0)
- {
- // ???ASCII?ヲ???
- fv->FlushLogLineBuf = 1;
- FTLog1Byte(fv,0);
- fv->FlushLogLineBuf = 0;
-
- fv->LogState = 1;
- fv->LogCount = 0;
- fv->FlushLogLineBuf = 0;
- _lwrite(fv->LogFile,"\015\012<<<\015\012",7);
- }
- FTLog1Byte(fv,*b);
- }
- return 1;
-}
-
-int YWrite(PFileVar fv, PYVar yv, PComVar cv, PCHAR B, int C)
-{
- int i, j;
-
- i = CommBinaryOut(cv,B,C);
- if (fv->LogFlag && (i>0))
- {
- if (fv->LogState != 0)
- {
- // ???ASCII?ヲ???
- fv->FlushLogLineBuf = 1;
- FTLog1Byte(fv,0);
- fv->FlushLogLineBuf = 0;
-
- fv->LogState = 0;
- fv->LogCount = 0;
- _lwrite(fv->LogFile,"\015\012>>>\015\012",7);
- }
- for (j=0 ; j <= i-1 ; j++)
- FTLog1Byte(fv,B[j]);
- }
- return i;
-}
-
-void YSetOpt(PFileVar fv, PYVar yv, WORD Opt)
-{
- char Tmp[21];
-
- yv->YOpt = Opt;
-
- strncpy_s(Tmp, sizeof(Tmp),"YMODEM (", _TRUNCATE);
- switch (yv->YOpt) {
- case Yopt1K: /* YMODEM */
- strncat_s(Tmp,sizeof(Tmp),"1k)",_TRUNCATE);
- yv->DataLen = 1024;
- yv->CheckLen = 2;
- break;
- case YoptG: /* YMODEM-g */
- strncat_s(Tmp,sizeof(Tmp),"-g)",_TRUNCATE);
- yv->DataLen = 1024;
- yv->CheckLen = 2;
- break;
- case YoptSingle: /* YMODEM(-g) single mode */
- strncat_s(Tmp,sizeof(Tmp),"single mode)",_TRUNCATE);
- yv->DataLen = 1024;
- yv->CheckLen = 2;
- break;
- }
- SetDlgItemText(fv->HWin, IDC_PROTOPROT, Tmp);
-}
-
-void YSendNAK(PFileVar fv, PYVar yv, PComVar cv)
-{
- BYTE b;
- int t;
-
- /* flush comm buffer */
- cv->InBuffCount = 0;
- cv->InPtr = 0;
-
- yv->NAKCount--;
- if (yv->NAKCount<0)
- {
- if (yv->NAKMode==YnakC)
- {
- YSetOpt(fv,yv,XoptCheck);
- yv->NAKMode = YnakC;
- yv->NAKCount = 9;
- }
- else {
- YCancel(fv,yv,cv);
- return;
- }
- }
-
- if (yv->NAKMode!=YnakC)
- {
- b = NAK;
- if ((yv->PktNum==0) && (yv->PktNumOffset==0))
- t = TimeOutInit;
- else
- t = yv->TOutLong;
- }
- else {
- b = 'C';
- t = TimeOutC;
- }
- YWrite(fv,yv,cv,&b,1);
- yv->PktReadMode = XpktSOH;
- FTSetTimeOut(fv,t);
-}
-
-WORD YCalcCheck(PYVar yv, PCHAR PktBuf)
-{
- int i;
- WORD Check;
-
- if (yv->CheckLen==1) /* CheckSum */
- {
- /* Calc sum */
- Check = 0;
- for (i = 0 ; i <= yv->DataLen-1 ; i++)
- Check = Check + (BYTE)(PktBuf[3+i]);
- return (Check & 0xff);
- }
- else { /* CRC */
- Check = 0;
- for (i = 0 ; i <= yv->DataLen-1 ; i++)
- Check = UpdateCRC(PktBuf[3+i],Check);
- return (Check);
- }
-}
-
-BOOL YCheckPacket(PYVar yv)
-{
- WORD Check;
-
- Check = YCalcCheck(yv,yv->PktIn);
- if (yv->CheckLen==1) /* Checksum */
- return ((BYTE)Check==yv->PktIn[yv->DataLen+3]);
- else
- return ((HIBYTE(Check)==yv->PktIn[yv->DataLen+3]) &&
- (LOBYTE(Check)==yv->PktIn[yv->DataLen+4]));
-}
-
-static void initialize_file_info(PFileVar fv, PYVar yv)
-{
- if (yv->YMode == IdYSend) {
- if (fv->FileOpen) {
- _lclose(fv->FileHandle);
- }
- fv->FileHandle = _lopen(fv->FullName,OF_READ);
- fv->FileSize = GetFSize(fv->FullName);
- } else {
- fv->FileHandle = -1;
- fv->FileSize = 0;
- }
- fv->FileOpen = fv->FileHandle>0;
-
- if (yv->YMode == IdYSend) {
- InitDlgProgress(fv->HWin, IDC_PROTOPROGRESS, &fv->ProgStat);
- } else {
- fv->ProgStat = -1;
- }
- SetDlgItemText(fv->HWin, IDC_PROTOFNAME, &(fv->FullName[fv->DirLen]));
-
- yv->PktNumOffset = 0;
- yv->PktNum = 0;
- yv->PktNumSent = 0;
- yv->PktBufCount = 0;
- yv->CRRecv = FALSE;
- fv->ByteCount = 0;
- yv->SendFileInfo = 0;
- yv->SendEot = 0;
- yv->LastSendEot = 0;
-}
-
-void YInit
-(PFileVar fv, PYVar yv, PComVar cv, PTTSet ts)
-{
- char inistr[MAXPATHLEN + 10];
-
- if (yv->YMode == IdYSend) {
- if (!GetNextFname(fv)) {
- return;
- }
- }
-
- fv->LogFlag = ((ts->LogFlag & LOG_Y)!=0);
- if (fv->LogFlag)
- fv->LogFile = _lcreat("YMODEM.LOG",0);
- fv->LogState = 0;
- fv->LogCount = 0;
-
- SetWindowText(fv->HWin, fv->DlgCaption);
-
- initialize_file_info(fv, yv);
-
- if (cv->PortType==IdTCPIP)
- {
- yv->TOutShort = TimeOutVeryLong;
- yv->TOutLong = TimeOutVeryLong;
- }
- else {
- yv->TOutShort = TimeOutShort;
- yv->TOutLong = TimeOutLong;
- }
-
- YSetOpt(fv,yv,yv->YOpt);
-
- if (yv->YOpt == Yopt1K)
- {
- yv->NAKMode = YnakC;
- yv->NAKCount = 10;
- }
- else {
- yv->NAKMode = YnakG;
- yv->NAKCount = 10;
- }
-
- if (fv->LogFlag) {
- char buf[128];
- time_t tm = time(NULL);
-
- _snprintf_s(buf, sizeof(buf), _TRUNCATE, "YMODEM %s start: %s\n",
- yv->YMode == IdYSend ? "Send" : "Recv",
- ctime(&tm)
- );
- _lwrite(fv->LogFile, buf, strlen(buf));
- }
-
- switch (yv->YMode) {
- case IdYSend:
- yv->TextFlag = 0;
-
- // ???????????"rb ?????"?ゥ???????B(2007.12.20 yutaka)
- //strcpy(ts->YModemRcvCommand, "rb");
- if (ts->YModemRcvCommand[0] != '\0') {
- _snprintf_s(inistr, sizeof(inistr), _TRUNCATE, "%s\015",
- ts->YModemRcvCommand);
- YWrite(fv,yv,cv, inistr , strlen(inistr));
- }
-
- FTSetTimeOut(fv,TimeOutVeryLong);
- break;
-
- case IdYReceive:
-#if 0 // for debug
- strcpy(inistr, "sb -b svnrev.exe lrzsz-0.12.20.tar.gz\r\n");
-// strcpy(inistr, "sb url3.txt url4.txt url5.txt\r\n");
- YWrite(fv,yv,cv, inistr , strlen(inistr));
-#endif
- yv->TextFlag = 0;
-
- YSendNAK(fv,yv,cv);
-
- break;
- }
-}
-
-void YCancel(PFileVar fv, PYVar yv, PComVar cv)
-{
- // five cancels & five backspaces per spec
- BYTE cancel[] = { CAN, CAN, CAN, CAN, CAN, BS, BS, BS, BS, BS };
-
- YWrite(fv,yv,cv, (PCHAR)&cancel, sizeof(cancel));
- yv->YMode = 0; // quit
-}
-
-void YTimeOutProc(PFileVar fv, PYVar yv, PComVar cv)
-{
- switch (yv->YMode) {
- case IdXSend:
- yv->YMode = 0; // quit
- break;
- case IdXReceive:
- YSendNAK(fv,yv,cv);
- break;
- }
-}
-
-// YMODEM????????????????ProtoParse()??????????B
-//
-// +-------+-------+--------+---------+-----+
-// |Header |Block# |1-Block#| Payload | CRC |
-// +-------+-------+--------+---------+-----+
-// 1 1 1 128/1024 2 byte
-//
-// return TRUE: ???????
-// FALSE: ????
-BOOL YReadPacket(PFileVar fv, PYVar yv, PComVar cv)
-{
- BYTE b, d;
- int i, c, nak;
- BOOL GetPkt;
-
- c = YRead1Byte(fv,yv,cv,&b);
-
- GetPkt = FALSE;
-
- while ((c>0) && (! GetPkt))
- {
- switch (yv->PktReadMode) {
- case XpktSOH:
- // SOH ? STX ????????????
- if (b==SOH)
- {
- yv->PktIn[0] = b;
- yv->PktReadMode = XpktBLK;
- yv->DataLen = SOH_DATALEN;
- FTSetTimeOut(fv,yv->TOutShort);
- }
- else if (b==STX)
- {
- yv->PktIn[0] = b;
- yv->PktReadMode = XpktBLK;
- yv->DataLen = STX_DATALEN;
- FTSetTimeOut(fv,yv->TOutShort);
- }
- else if (b==EOT)
- {
- // EOT?????1????????????????ヲ??
- if (fv->FileOpen) {
- fv->FileOpen = 0;
- _lclose(fv->FileHandle);
- fv->FileHandle = -1;
- }
-
- initialize_file_info(fv, yv);
-
- // EOT????ACK???
- b = ACK;
- YWrite(fv,yv,cv,&b, 1);
-
- // ??????????????'C'????
- YSendNAK(fv,yv,cv);
-
- return TRUE;
- }
- else {
- /* flush comm buffer */
- cv->InBuffCount = 0;
- cv->InPtr = 0;
- return TRUE;
- }
- break;
- case XpktBLK:
- yv->PktIn[1] = b;
- yv->PktReadMode = XpktBLK2;
- FTSetTimeOut(fv,yv->TOutShort);
- break;
- case XpktBLK2:
- nak = 1;
- yv->PktIn[2] = b;
- if ((b ^ yv->PktIn[1]) == 0xff) {
- nak = 0;
- if (yv->SendFileInfo) {
- if (yv->PktIn[1] == (BYTE)(yv->PktNum + 1)) // ?????????
- nak = 0;
- }
- }
-
- if (nak == 0)
- {
- yv->PktBufPtr = 3;
- yv->PktBufCount = yv->DataLen + yv->CheckLen;
- yv->PktReadMode = XpktDATA;
- FTSetTimeOut(fv,yv->TOutShort);
- }
- else
- YSendNAK(fv,yv,cv);
- break;
- case XpktDATA:
- yv->PktIn[yv->PktBufPtr] = b;
- yv->PktBufPtr++;
- yv->PktBufCount--;
- GetPkt = yv->PktBufCount==0;
- if (GetPkt)
- {
- FTSetTimeOut(fv,yv->TOutLong);
- yv->PktReadMode = XpktSOH;
- }
- else
- FTSetTimeOut(fv,yv->TOutShort);
- break;
- }
-
- if (! GetPkt) c = YRead1Byte(fv,yv,cv,&b);
- }
-
- if (! GetPkt) return TRUE;
-
- GetPkt = YCheckPacket(yv);
- if (! GetPkt)
- {
- YSendNAK(fv,yv,cv);
- return TRUE;
- }
-
- // ????????????????????ヲ??
- if (yv->PktIn[1] == 0x00 && yv->PktIn[2] == 0xFF &&
- yv->SendFileInfo == 0
- ) {
- c = yv->DataLen;
- while ((c>0) && (yv->PktIn[2+c]==0x00))
- c--;
- if (c == 0) {
- b = ACK;
- YWrite(fv,yv,cv,&b, 1);
- fv->Success = TRUE;
- return FALSE;
- }
- }
-
- d = yv->PktIn[1] - yv->PktNum;
- if (d>1)
- {
- YCancel(fv,yv,cv);
- return FALSE;
- }
-
- /* send ACK */
- b = ACK;
- YWrite(fv,yv,cv,&b, 1);
- yv->NAKMode = YnakC;
- yv->NAKCount = 10;
-
- // ?????????A??????
- if (yv->SendFileInfo &&
- yv->PktIn[1] == (BYTE)(yv->PktNum)) {
- return TRUE;
- }
-
- yv->PktNum = yv->PktIn[1];
-
- // YMODEM???Ablock#0????????v????
- if (d == 0 &&
- yv->SendFileInfo == 0) {
- long modtime;
- long bytes_total;
- int mode;
- int ret;
- BYTE *p;
- char *name, *nameend;
-
- p = &(yv->PktIn[3]);
- name = p;
- strncpy_s(fv->FullName, sizeof(fv->FullName), name, _TRUNCATE);
- nameend = name + 1 + strlen(name);
- if (*nameend) {
- ret = sscanf(nameend, "%ld%lo%o", &bytes_total, &modtime, &mode);
- if (ret == 3) {
- fv->FileSize = bytes_total;
- }
- }
- fv->FileHandle = _lcreat(fv->FullName,0);
- fv->FileOpen = fv->FileHandle>0;
-
- fv->DirLen = 0;
- SetDlgItemText(fv->HWin, IDC_PROTOFNAME, &(fv->FullName[fv->DirLen]));
-
- yv->SendFileInfo = 1;
-
- return TRUE;
- }
-
- if (yv->PktNum==0)
- yv->PktNumOffset = yv->PktNumOffset + 256;
-
- c = yv->DataLen;
- if (yv->TextFlag>0)
- while ((c>0) && (yv->PktIn[2+c]==0x1A))
- c--;
-
- // ??u???????????????- if (fv->ByteCount + c > fv->FileSize) {
- c = fv->FileSize - fv->ByteCount;
- }
-
- if (yv->TextFlag>0)
- for (i = 0 ; i <= c-1 ; i++)
- {
- b = yv->PktIn[3+i];
- if ((b==LF) && (! yv->CRRecv))
- _lwrite(fv->FileHandle,"\015",1);
- if (yv->CRRecv && (b!=LF))
- _lwrite(fv->FileHandle,"\012",1);
- yv->CRRecv = b==CR;
- _lwrite(fv->FileHandle,&b,1);
- }
- else
- _lwrite(fv->FileHandle, &(yv->PktIn[3]), c);
-
- fv->ByteCount = fv->ByteCount + c;
-
- SetDlgNum(fv->HWin, IDC_PROTOPKTNUM, yv->PktNumOffset+yv->PktNum);
- SetDlgNum(fv->HWin, IDC_PROTOBYTECOUNT, fv->ByteCount);
-
- FTSetTimeOut(fv,yv->TOutLong);
-
- return TRUE;
-}
-
-// ??????(local-to-remote)???YMODEM????????????????????????B
-BOOL YSendPacket(PFileVar fv, PYVar yv, PComVar cv)
-{
- BYTE b;
- int i;
- BOOL SendFlag;
- WORD Check;
- BYTE firstch, lastrx;
-
- SendFlag = FALSE;
- if (yv->PktBufCount==0)
- {
- i = YRead1Byte(fv,yv,cv,&b);
- do {
- if (i==0) return TRUE;
- firstch = b;
- switch (b) {
- case ACK:
- // 1???EOT????ACK?????1??????????????B
- if (yv->SendEot) {
- yv->SendEot = 0;
-
- // ????????????????A?????????????v??????
- if (!GetNextFname(fv)) {
- yv->LastSendEot = 1;
- break;
- } else {
- initialize_file_info(fv, yv);
- }
- }
-
- if (! fv->FileOpen) // ????????????????A??I??
- {
- fv->Success = TRUE;
- return FALSE;
- }
- else if (yv->PktNumSent==(BYTE)(yv->PktNum+1)) // ?????????
- {
- yv->PktNum = yv->PktNumSent;
- if (yv->PktNum==0)
- yv->PktNumOffset = yv->PktNumOffset + 256;
- SendFlag = TRUE;
- }
- break;
-
- case NAK:
- SendFlag = TRUE;
- break;
-
- case CAN:
- break;
-
- case 0x43: // 'C'(43h)
- case 0x47: // 'G'(47h)
- // 'C'????????????????????
- if ((yv->PktNum==0) && (yv->PktNumOffset==0))
- {
- SendFlag = TRUE;
- }
- else if (yv->LastSendEot) {
- SendFlag = TRUE;
- }
- break;
- }
- if (! SendFlag) i = YRead1Byte(fv,yv,cv,&b);
- } while (!SendFlag);
-
- // reset timeout timer
- FTSetTimeOut(fv,TimeOutVeryLong);
-
- // ???????????????フ???
- do {
- lastrx = firstch;
- i = YRead1Byte(fv,yv,cv,&b);
- if (i != 0) {
- firstch = b;
- if (firstch == CAN && lastrx == CAN) {
- // CAN(0x18)????????????????ク??????
- // ?????????????????????????B
- // (2010.3.23 yutaka)
- fv->Success = FALSE; // failure
- return FALSE;
- }
- }
- } while (i != 0);
-
- if (yv->LastSendEot) { // ?????????????????????????????????
- yv->LastSendEot = 0;
-
- if (yv->DataLen == SOH_DATALEN)
- yv->PktOut[0] = SOH;
- else
- yv->PktOut[0] = STX;
- yv->PktOut[1] = 0;
- yv->PktOut[2] = ~0;
-
- i = 0;
- while (i < yv->DataLen)
- {
- yv->PktOut[i+3] = 0x00;
- i++;
- }
-
- Check = YCalcCheck(yv,yv->PktOut);
- if (yv->CheckLen==1) /* Checksum */
- yv->PktOut[yv->DataLen+3] = (BYTE)Check;
- else {
- yv->PktOut[yv->DataLen+3] = HIBYTE(Check);
- yv->PktOut[yv->DataLen+4] = LOBYTE(Check);
- }
- yv->PktBufCount = 3 + yv->DataLen + yv->CheckLen;
- //fv->Success = TRUE;
-
- }
- else if (yv->PktNumSent==yv->PktNum) /* make a new packet */
- {
- BYTE *dataptr = &yv->PktOut[3];
- int eot = 0; // End Of Transfer
-
- if (yv->DataLen == SOH_DATALEN)
- yv->PktOut[0] = SOH;
- else
- yv->PktOut[0] = STX;
- yv->PktOut[1] = yv->PktNumSent;
- yv->PktOut[2] = ~ yv->PktNumSent;
-
- // ???????????????YMODEM??"0"???????
- yv->PktNumSent++;
-
- // ????0
- if (yv->SendFileInfo == 0) { // ????????M
- struct _stat st;
- int ret, total;
- BYTE buf[1024 + 10];
-
- yv->SendFileInfo = 1; // ???????on
-
- /* timestamp */
- _stat(fv->FullName, &st);
-
- ret = _snprintf_s(buf, sizeof(buf), _TRUNCATE, "%s",
- &(fv->FullName[fv->DirLen]));
- buf[ret] = 0x00; // NUL
- total = ret + 1;
-
- ret = _snprintf_s(&(buf[total]), sizeof(buf) - total, _TRUNCATE, "%lu %lo %o",
- fv->FileSize, (long)st.st_mtime, 0644|_S_IFREG);
- total += ret;
-
- i = total;
- while (i <= yv->DataLen)
- {
- buf[i] = 0x00;
- i++;
- }
-
- // ??????
- memcpy(dataptr, buf, yv->DataLen);
-
- } else {
- i = 1;
- while ((i<=yv->DataLen) && fv->FileOpen &&
- (_lread(fv->FileHandle,&b,1)==1))
- {
- yv->PktOut[2+i] = b;
- i++;
- fv->ByteCount++;
- }
-
-
- if (i>1)
- {
- while (i<=yv->DataLen)
- {
- yv->PktOut[2+i] = 0x1A;
- i++;
- }
-
- }
- else { /* send EOT */
- if (fv->FileOpen)
- {
- _lclose(fv->FileHandle);
- fv->FileHandle = 0;
- fv->FileOpen = FALSE;
- }
-
- eot = 1;
- }
-
- }
-
- if (eot == 0) { // ???????
- Check = YCalcCheck(yv,yv->PktOut);
- if (yv->CheckLen==1) /* Checksum */
- yv->PktOut[yv->DataLen+3] = (BYTE)Check;
- else {
- yv->PktOut[yv->DataLen+3] = HIBYTE(Check);
- yv->PktOut[yv->DataLen+4] = LOBYTE(Check);
- }
- yv->PktBufCount = 3 + yv->DataLen + yv->CheckLen;
-
- } else { // EOT
- yv->PktOut[0] = EOT;
- yv->PktBufCount = 1;
-
- yv->SendEot = 1; // EOT???on???NAK??????
- yv->LastSendEot = 0;
- }
-
- }
- else { /* resend packet */
- yv->PktBufCount = 3 + yv->DataLen + yv->CheckLen;
- }
-
- yv->PktBufPtr = 0;
- }
- /* a NAK or C could have arrived while we were buffering. Consume it. */
- // ???????????????フ???
- do {
- lastrx = firstch;
- i = YRead1Byte(fv,yv,cv,&b);
- if (i != 0) {
- firstch = b;
- if (firstch == CAN && lastrx == CAN) {
- // CAN(0x18)????????????????ク??????
- // ?????????????????????????B
- // (2010.3.23 yutaka)
- fv->Success = FALSE; // failure
- return FALSE;
- }
- }
- } while (i != 0);
-
-
- i = 1;
- while ((yv->PktBufCount>0) && (i>0))
- {
- b = yv->PktOut[yv->PktBufPtr];
- i = YWrite(fv,yv,cv,&b, 1);
- if (i>0)
- {
- yv->PktBufCount--;
- yv->PktBufPtr++;
- }
- }
-
- if (yv->PktBufCount==0)
- {
- SetDlgNum(fv->HWin, IDC_PROTOPKTNUM,
- yv->PktNumOffset+yv->PktNumSent);
- SetDlgNum(fv->HWin, IDC_PROTOBYTECOUNT, fv->ByteCount);
- SetDlgPercent(fv->HWin, IDC_PROTOPERCENT, IDC_PROTOPROGRESS,
- fv->ByteCount, fv->FileSize, &fv->ProgStat);
- }
-
- return TRUE;
-}
+/* Tera Term
+Copyright(C) 2008-2010 TeraTerm Project
+All rights reserved. */
+
+/* TTFILE.DLL, YMODEM protocol */
+#include "teraterm.h"
+#include "tttypes.h"
+#include "ttftypes.h"
+#include
+#include
+#include
+#include
+
+#include "tt_res.h"
+#include "ttcommon.h"
+#include "ttlib.h"
+#include "ftlib.h"
+#include "dlglib.h"
+
+#include "ymodem.h"
+
+#define TimeOutInit 10
+#define TimeOutC 3
+#define TimeOutShort 10
+#define TimeOutLong 20
+#define TimeOutVeryLong 60
+
+// ?????????YMODEM?? 128 or 1024 byte ????????
+#define SOH_DATALEN 128
+#define STX_DATALEN 1024
+
+int YRead1Byte(PFileVar fv, PYVar yv, PComVar cv, LPBYTE b)
+{
+ if (CommRead1Byte(cv,b) == 0)
+ return 0;
+
+ if (fv->LogFlag)
+ {
+ if (fv->LogState==0)
+ {
+ // ???ASCII?ヲ???
+ fv->FlushLogLineBuf = 1;
+ FTLog1Byte(fv,0);
+ fv->FlushLogLineBuf = 0;
+
+ fv->LogState = 1;
+ fv->LogCount = 0;
+ fv->FlushLogLineBuf = 0;
+ _lwrite(fv->LogFile,"\015\012<<<\015\012",7);
+ }
+ FTLog1Byte(fv,*b);
+ }
+ return 1;
+}
+
+int YWrite(PFileVar fv, PYVar yv, PComVar cv, PCHAR B, int C)
+{
+ int i, j;
+
+ i = CommBinaryOut(cv,B,C);
+ if (fv->LogFlag && (i>0))
+ {
+ if (fv->LogState != 0)
+ {
+ // ???ASCII?ヲ???
+ fv->FlushLogLineBuf = 1;
+ FTLog1Byte(fv,0);
+ fv->FlushLogLineBuf = 0;
+
+ fv->LogState = 0;
+ fv->LogCount = 0;
+ _lwrite(fv->LogFile,"\015\012>>>\015\012",7);
+ }
+ for (j=0 ; j <= i-1 ; j++)
+ FTLog1Byte(fv,B[j]);
+ }
+ return i;
+}
+
+void YSetOpt(PFileVar fv, PYVar yv, WORD Opt)
+{
+ char Tmp[21];
+
+ yv->YOpt = Opt;
+
+ strncpy_s(Tmp, sizeof(Tmp),"YMODEM (", _TRUNCATE);
+ switch (yv->YOpt) {
+ case Yopt1K: /* YMODEM */
+ strncat_s(Tmp,sizeof(Tmp),"1k)",_TRUNCATE);
+ yv->DataLen = 1024;
+ yv->CheckLen = 2;
+ break;
+ case YoptG: /* YMODEM-g */
+ strncat_s(Tmp,sizeof(Tmp),"-g)",_TRUNCATE);
+ yv->DataLen = 1024;
+ yv->CheckLen = 2;
+ break;
+ case YoptSingle: /* YMODEM(-g) single mode */
+ strncat_s(Tmp,sizeof(Tmp),"single mode)",_TRUNCATE);
+ yv->DataLen = 1024;
+ yv->CheckLen = 2;
+ break;
+ }
+ SetDlgItemText(fv->HWin, IDC_PROTOPROT, Tmp);
+}
+
+void YSendNAK(PFileVar fv, PYVar yv, PComVar cv)
+{
+ BYTE b;
+ int t;
+
+ /* flush comm buffer */
+ cv->InBuffCount = 0;
+ cv->InPtr = 0;
+
+ yv->NAKCount--;
+ if (yv->NAKCount<0)
+ {
+ if (yv->NAKMode==YnakC)
+ {
+ YSetOpt(fv,yv,XoptCheck);
+ yv->NAKMode = YnakC;
+ yv->NAKCount = 9;
+ }
+ else {
+ YCancel(fv,yv,cv);
+ return;
+ }
+ }
+
+ if (yv->NAKMode!=YnakC)
+ {
+ b = NAK;
+ if ((yv->PktNum==0) && (yv->PktNumOffset==0))
+ t = TimeOutInit;
+ else
+ t = yv->TOutLong;
+ }
+ else {
+ b = 'C';
+ t = TimeOutC;
+ }
+ YWrite(fv,yv,cv,&b,1);
+ yv->PktReadMode = XpktSOH;
+ FTSetTimeOut(fv,t);
+}
+
+WORD YCalcCheck(PYVar yv, PCHAR PktBuf)
+{
+ int i;
+ WORD Check;
+
+ if (yv->CheckLen==1) /* CheckSum */
+ {
+ /* Calc sum */
+ Check = 0;
+ for (i = 0 ; i <= yv->DataLen-1 ; i++)
+ Check = Check + (BYTE)(PktBuf[3+i]);
+ return (Check & 0xff);
+ }
+ else { /* CRC */
+ Check = 0;
+ for (i = 0 ; i <= yv->DataLen-1 ; i++)
+ Check = UpdateCRC(PktBuf[3+i],Check);
+ return (Check);
+ }
+}
+
+BOOL YCheckPacket(PYVar yv)
+{
+ WORD Check;
+
+ Check = YCalcCheck(yv,yv->PktIn);
+ if (yv->CheckLen==1) /* Checksum */
+ return ((BYTE)Check==yv->PktIn[yv->DataLen+3]);
+ else
+ return ((HIBYTE(Check)==yv->PktIn[yv->DataLen+3]) &&
+ (LOBYTE(Check)==yv->PktIn[yv->DataLen+4]));
+}
+
+static void initialize_file_info(PFileVar fv, PYVar yv)
+{
+ if (yv->YMode == IdYSend) {
+ if (fv->FileOpen) {
+ _lclose(fv->FileHandle);
+ }
+ fv->FileHandle = _lopen(fv->FullName,OF_READ);
+ fv->FileSize = GetFSize(fv->FullName);
+ } else {
+ fv->FileHandle = -1;
+ fv->FileSize = 0;
+ }
+ fv->FileOpen = fv->FileHandle>0;
+
+ if (yv->YMode == IdYSend) {
+ InitDlgProgress(fv->HWin, IDC_PROTOPROGRESS, &fv->ProgStat);
+ } else {
+ fv->ProgStat = -1;
+ }
+ SetDlgItemText(fv->HWin, IDC_PROTOFNAME, &(fv->FullName[fv->DirLen]));
+
+ yv->PktNumOffset = 0;
+ yv->PktNum = 0;
+ yv->PktNumSent = 0;
+ yv->PktBufCount = 0;
+ yv->CRRecv = FALSE;
+ fv->ByteCount = 0;
+ yv->SendFileInfo = 0;
+ yv->SendEot = 0;
+ yv->LastSendEot = 0;
+}
+
+void YInit
+(PFileVar fv, PYVar yv, PComVar cv, PTTSet ts)
+{
+ char inistr[MAXPATHLEN + 10];
+
+ if (yv->YMode == IdYSend) {
+ if (!GetNextFname(fv)) {
+ return;
+ }
+ }
+
+ fv->LogFlag = ((ts->LogFlag & LOG_Y)!=0);
+ if (fv->LogFlag)
+ fv->LogFile = _lcreat("YMODEM.LOG",0);
+ fv->LogState = 0;
+ fv->LogCount = 0;
+
+ SetWindowText(fv->HWin, fv->DlgCaption);
+
+ initialize_file_info(fv, yv);
+
+ if (cv->PortType==IdTCPIP)
+ {
+ yv->TOutShort = TimeOutVeryLong;
+ yv->TOutLong = TimeOutVeryLong;
+ }
+ else {
+ yv->TOutShort = TimeOutShort;
+ yv->TOutLong = TimeOutLong;
+ }
+
+ YSetOpt(fv,yv,yv->YOpt);
+
+ if (yv->YOpt == Yopt1K)
+ {
+ yv->NAKMode = YnakC;
+ yv->NAKCount = 10;
+ }
+ else {
+ yv->NAKMode = YnakG;
+ yv->NAKCount = 10;
+ }
+
+ if (fv->LogFlag) {
+ char buf[128];
+ time_t tm = time(NULL);
+
+ _snprintf_s(buf, sizeof(buf), _TRUNCATE, "YMODEM %s start: %s\n",
+ yv->YMode == IdYSend ? "Send" : "Recv",
+ ctime(&tm)
+ );
+ _lwrite(fv->LogFile, buf, strlen(buf));
+ }
+
+ switch (yv->YMode) {
+ case IdYSend:
+ yv->TextFlag = 0;
+
+ // ???????????"rb ?????"?ゥ???????B(2007.12.20 yutaka)
+ //strcpy(ts->YModemRcvCommand, "rb");
+ if (ts->YModemRcvCommand[0] != '\0') {
+ _snprintf_s(inistr, sizeof(inistr), _TRUNCATE, "%s\015",
+ ts->YModemRcvCommand);
+ YWrite(fv,yv,cv, inistr , strlen(inistr));
+ }
+
+ FTSetTimeOut(fv,TimeOutVeryLong);
+ break;
+
+ case IdYReceive:
+#if 0 // for debug
+ strcpy(inistr, "sb -b svnrev.exe lrzsz-0.12.20.tar.gz\r\n");
+// strcpy(inistr, "sb url3.txt url4.txt url5.txt\r\n");
+ YWrite(fv,yv,cv, inistr , strlen(inistr));
+#endif
+ yv->TextFlag = 0;
+
+ YSendNAK(fv,yv,cv);
+
+ break;
+ }
+}
+
+void YCancel(PFileVar fv, PYVar yv, PComVar cv)
+{
+ // five cancels & five backspaces per spec
+ BYTE cancel[] = { CAN, CAN, CAN, CAN, CAN, BS, BS, BS, BS, BS };
+
+ YWrite(fv,yv,cv, (PCHAR)&cancel, sizeof(cancel));
+ yv->YMode = 0; // quit
+}
+
+void YTimeOutProc(PFileVar fv, PYVar yv, PComVar cv)
+{
+ switch (yv->YMode) {
+ case IdXSend:
+ yv->YMode = 0; // quit
+ break;
+ case IdXReceive:
+ YSendNAK(fv,yv,cv);
+ break;
+ }
+}
+
+// YMODEM????????????????ProtoParse()??????????B
+//
+// +-------+-------+--------+---------+-----+
+// |Header |Block# |1-Block#| Payload | CRC |
+// +-------+-------+--------+---------+-----+
+// 1 1 1 128/1024 2 byte
+//
+// return TRUE: ???????
+// FALSE: ????
+BOOL YReadPacket(PFileVar fv, PYVar yv, PComVar cv)
+{
+ BYTE b, d;
+ int i, c, nak;
+ BOOL GetPkt;
+
+ c = YRead1Byte(fv,yv,cv,&b);
+
+ GetPkt = FALSE;
+
+ while ((c>0) && (! GetPkt))
+ {
+ switch (yv->PktReadMode) {
+ case XpktSOH:
+ // SOH ? STX ????????????
+ if (b==SOH)
+ {
+ yv->PktIn[0] = b;
+ yv->PktReadMode = XpktBLK;
+ yv->DataLen = SOH_DATALEN;
+ FTSetTimeOut(fv,yv->TOutShort);
+ }
+ else if (b==STX)
+ {
+ yv->PktIn[0] = b;
+ yv->PktReadMode = XpktBLK;
+ yv->DataLen = STX_DATALEN;
+ FTSetTimeOut(fv,yv->TOutShort);
+ }
+ else if (b==EOT)
+ {
+ // EOT?????1????????????????ヲ??
+ if (fv->FileOpen) {
+ fv->FileOpen = 0;
+ _lclose(fv->FileHandle);
+ fv->FileHandle = -1;
+ }
+
+ initialize_file_info(fv, yv);
+
+ // EOT????ACK???
+ b = ACK;
+ YWrite(fv,yv,cv,&b, 1);
+
+ // ??????????????'C'????
+ YSendNAK(fv,yv,cv);
+
+ return TRUE;
+ }
+ else {
+ /* flush comm buffer */
+ cv->InBuffCount = 0;
+ cv->InPtr = 0;
+ return TRUE;
+ }
+ break;
+ case XpktBLK:
+ yv->PktIn[1] = b;
+ yv->PktReadMode = XpktBLK2;
+ FTSetTimeOut(fv,yv->TOutShort);
+ break;
+ case XpktBLK2:
+ nak = 1;
+ yv->PktIn[2] = b;
+ if ((b ^ yv->PktIn[1]) == 0xff) {
+ nak = 0;
+ if (yv->SendFileInfo) {
+ if (yv->PktIn[1] == (BYTE)(yv->PktNum + 1)) // ?????????
+ nak = 0;
+ }
+ }
+
+ if (nak == 0)
+ {
+ yv->PktBufPtr = 3;
+ yv->PktBufCount = yv->DataLen + yv->CheckLen;
+ yv->PktReadMode = XpktDATA;
+ FTSetTimeOut(fv,yv->TOutShort);
+ }
+ else
+ YSendNAK(fv,yv,cv);
+ break;
+ case XpktDATA:
+ yv->PktIn[yv->PktBufPtr] = b;
+ yv->PktBufPtr++;
+ yv->PktBufCount--;
+ GetPkt = yv->PktBufCount==0;
+ if (GetPkt)
+ {
+ FTSetTimeOut(fv,yv->TOutLong);
+ yv->PktReadMode = XpktSOH;
+ }
+ else
+ FTSetTimeOut(fv,yv->TOutShort);
+ break;
+ }
+
+ if (! GetPkt) c = YRead1Byte(fv,yv,cv,&b);
+ }
+
+ if (! GetPkt) return TRUE;
+
+ GetPkt = YCheckPacket(yv);
+ if (! GetPkt)
+ {
+ YSendNAK(fv,yv,cv);
+ return TRUE;
+ }
+
+ // ????????????????????ヲ??
+ if (yv->PktIn[1] == 0x00 && yv->PktIn[2] == 0xFF &&
+ yv->SendFileInfo == 0
+ ) {
+ c = yv->DataLen;
+ while ((c>0) && (yv->PktIn[2+c]==0x00))
+ c--;
+ if (c == 0) {
+ b = ACK;
+ YWrite(fv,yv,cv,&b, 1);
+ fv->Success = TRUE;
+ return FALSE;
+ }
+ }
+
+ d = yv->PktIn[1] - yv->PktNum;
+ if (d>1)
+ {
+ YCancel(fv,yv,cv);
+ return FALSE;
+ }
+
+ /* send ACK */
+ b = ACK;
+ YWrite(fv,yv,cv,&b, 1);
+ yv->NAKMode = YnakC;
+ yv->NAKCount = 10;
+
+ // ?????????A??????
+ if (yv->SendFileInfo &&
+ yv->PktIn[1] == (BYTE)(yv->PktNum)) {
+ return TRUE;
+ }
+
+ yv->PktNum = yv->PktIn[1];
+
+ // YMODEM???Ablock#0????????v????
+ if (d == 0 &&
+ yv->SendFileInfo == 0) {
+ long modtime;
+ long bytes_total;
+ int mode;
+ int ret;
+ BYTE *p;
+ char *name, *nameend;
+
+ p = &(yv->PktIn[3]);
+ name = p;
+ strncpy_s(fv->FullName, sizeof(fv->FullName), name, _TRUNCATE);
+ nameend = name + 1 + strlen(name);
+ if (*nameend) {
+ ret = sscanf(nameend, "%ld%lo%o", &bytes_total, &modtime, &mode);
+ if (ret == 3) {
+ fv->FileSize = bytes_total;
+ }
+ }
+ fv->FileHandle = _lcreat(fv->FullName,0);
+ fv->FileOpen = fv->FileHandle>0;
+
+ fv->DirLen = 0;
+ SetDlgItemText(fv->HWin, IDC_PROTOFNAME, &(fv->FullName[fv->DirLen]));
+
+ yv->SendFileInfo = 1;
+
+ return TRUE;
+ }
+
+ if (yv->PktNum==0)
+ yv->PktNumOffset = yv->PktNumOffset + 256;
+
+ c = yv->DataLen;
+ if (yv->TextFlag>0)
+ while ((c>0) && (yv->PktIn[2+c]==0x1A))
+ c--;
+
+ // ??u???????????????+ if (fv->ByteCount + c > fv->FileSize) {
+ c = fv->FileSize - fv->ByteCount;
+ }
+
+ if (yv->TextFlag>0)
+ for (i = 0 ; i <= c-1 ; i++)
+ {
+ b = yv->PktIn[3+i];
+ if ((b==LF) && (! yv->CRRecv))
+ _lwrite(fv->FileHandle,"\015",1);
+ if (yv->CRRecv && (b!=LF))
+ _lwrite(fv->FileHandle,"\012",1);
+ yv->CRRecv = b==CR;
+ _lwrite(fv->FileHandle,&b,1);
+ }
+ else
+ _lwrite(fv->FileHandle, &(yv->PktIn[3]), c);
+
+ fv->ByteCount = fv->ByteCount + c;
+
+ SetDlgNum(fv->HWin, IDC_PROTOPKTNUM, yv->PktNumOffset+yv->PktNum);
+ SetDlgNum(fv->HWin, IDC_PROTOBYTECOUNT, fv->ByteCount);
+
+ FTSetTimeOut(fv,yv->TOutLong);
+
+ return TRUE;
+}
+
+// ??????(local-to-remote)???YMODEM????????????????????????B
+BOOL YSendPacket(PFileVar fv, PYVar yv, PComVar cv)
+{
+ BYTE b;
+ int i;
+ BOOL SendFlag;
+ WORD Check;
+ BYTE firstch, lastrx;
+
+ SendFlag = FALSE;
+ if (yv->PktBufCount==0)
+ {
+ i = YRead1Byte(fv,yv,cv,&b);
+ do {
+ if (i==0) return TRUE;
+ firstch = b;
+ switch (b) {
+ case ACK:
+ // 1???EOT????ACK?????1??????????????B
+ if (yv->SendEot) {
+ yv->SendEot = 0;
+
+ // ????????????????A?????????????v??????
+ if (!GetNextFname(fv)) {
+ yv->LastSendEot = 1;
+ break;
+ } else {
+ initialize_file_info(fv, yv);
+ }
+ }
+
+ if (! fv->FileOpen) // ????????????????A??I??
+ {
+ fv->Success = TRUE;
+ return FALSE;
+ }
+ else if (yv->PktNumSent==(BYTE)(yv->PktNum+1)) // ?????????
+ {
+ yv->PktNum = yv->PktNumSent;
+ if (yv->PktNum==0)
+ yv->PktNumOffset = yv->PktNumOffset + 256;
+ SendFlag = TRUE;
+ }
+ break;
+
+ case NAK:
+ SendFlag = TRUE;
+ break;
+
+ case CAN:
+ break;
+
+ case 0x43: // 'C'(43h)
+ case 0x47: // 'G'(47h)
+ // 'C'????????????????????
+ if ((yv->PktNum==0) && (yv->PktNumOffset==0))
+ {
+ SendFlag = TRUE;
+ }
+ else if (yv->LastSendEot) {
+ SendFlag = TRUE;
+ }
+ break;
+ }
+ if (! SendFlag) i = YRead1Byte(fv,yv,cv,&b);
+ } while (!SendFlag);
+
+ // reset timeout timer
+ FTSetTimeOut(fv,TimeOutVeryLong);
+
+ // ???????????????フ???
+ do {
+ lastrx = firstch;
+ i = YRead1Byte(fv,yv,cv,&b);
+ if (i != 0) {
+ firstch = b;
+ if (firstch == CAN && lastrx == CAN) {
+ // CAN(0x18)????????????????ク??????
+ // ?????????????????????????B
+ // (2010.3.23 yutaka)
+ fv->Success = FALSE; // failure
+ return FALSE;
+ }
+ }
+ } while (i != 0);
+
+ if (yv->LastSendEot) { // ?????????????????????????????????
+ yv->LastSendEot = 0;
+
+ if (yv->DataLen == SOH_DATALEN)
+ yv->PktOut[0] = SOH;
+ else
+ yv->PktOut[0] = STX;
+ yv->PktOut[1] = 0;
+ yv->PktOut[2] = ~0;
+
+ i = 0;
+ while (i < yv->DataLen)
+ {
+ yv->PktOut[i+3] = 0x00;
+ i++;
+ }
+
+ Check = YCalcCheck(yv,yv->PktOut);
+ if (yv->CheckLen==1) /* Checksum */
+ yv->PktOut[yv->DataLen+3] = (BYTE)Check;
+ else {
+ yv->PktOut[yv->DataLen+3] = HIBYTE(Check);
+ yv->PktOut[yv->DataLen+4] = LOBYTE(Check);
+ }
+ yv->PktBufCount = 3 + yv->DataLen + yv->CheckLen;
+ //fv->Success = TRUE;
+
+ }
+ else if (yv->PktNumSent==yv->PktNum) /* make a new packet */
+ {
+ BYTE *dataptr = &yv->PktOut[3];
+ int eot = 0; // End Of Transfer
+
+ if (yv->DataLen == SOH_DATALEN)
+ yv->PktOut[0] = SOH;
+ else
+ yv->PktOut[0] = STX;
+ yv->PktOut[1] = yv->PktNumSent;
+ yv->PktOut[2] = ~ yv->PktNumSent;
+
+ // ???????????????YMODEM??"0"???????
+ yv->PktNumSent++;
+
+ // ????0
+ if (yv->SendFileInfo == 0) { // ????????M
+ struct _stat st;
+ int ret, total;
+ BYTE buf[1024 + 10];
+
+ yv->SendFileInfo = 1; // ???????on
+
+ /* timestamp */
+ _stat(fv->FullName, &st);
+
+ ret = _snprintf_s(buf, sizeof(buf), _TRUNCATE, "%s",
+ &(fv->FullName[fv->DirLen]));
+ buf[ret] = 0x00; // NUL
+ total = ret + 1;
+
+ ret = _snprintf_s(&(buf[total]), sizeof(buf) - total, _TRUNCATE, "%lu %lo %o",
+ fv->FileSize, (long)st.st_mtime, 0644|_S_IFREG);
+ total += ret;
+
+ i = total;
+ while (i <= yv->DataLen)
+ {
+ buf[i] = 0x00;
+ i++;
+ }
+
+ // ??????
+ memcpy(dataptr, buf, yv->DataLen);
+
+ } else {
+ i = 1;
+ while ((i<=yv->DataLen) && fv->FileOpen &&
+ (_lread(fv->FileHandle,&b,1)==1))
+ {
+ yv->PktOut[2+i] = b;
+ i++;
+ fv->ByteCount++;
+ }
+
+
+ if (i>1)
+ {
+ while (i<=yv->DataLen)
+ {
+ yv->PktOut[2+i] = 0x1A;
+ i++;
+ }
+
+ }
+ else { /* send EOT */
+ if (fv->FileOpen)
+ {
+ _lclose(fv->FileHandle);
+ fv->FileHandle = 0;
+ fv->FileOpen = FALSE;
+ }
+
+ eot = 1;
+ }
+
+ }
+
+ if (eot == 0) { // ???????
+ Check = YCalcCheck(yv,yv->PktOut);
+ if (yv->CheckLen==1) /* Checksum */
+ yv->PktOut[yv->DataLen+3] = (BYTE)Check;
+ else {
+ yv->PktOut[yv->DataLen+3] = HIBYTE(Check);
+ yv->PktOut[yv->DataLen+4] = LOBYTE(Check);
+ }
+ yv->PktBufCount = 3 + yv->DataLen + yv->CheckLen;
+
+ } else { // EOT
+ yv->PktOut[0] = EOT;
+ yv->PktBufCount = 1;
+
+ yv->SendEot = 1; // EOT???on???NAK??????
+ yv->LastSendEot = 0;
+ }
+
+ }
+ else { /* resend packet */
+ yv->PktBufCount = 3 + yv->DataLen + yv->CheckLen;
+ }
+
+ yv->PktBufPtr = 0;
+ }
+ /* a NAK or C could have arrived while we were buffering. Consume it. */
+ // ???????????????フ???
+ do {
+ lastrx = firstch;
+ i = YRead1Byte(fv,yv,cv,&b);
+ if (i != 0) {
+ firstch = b;
+ if (firstch == CAN && lastrx == CAN) {
+ // CAN(0x18)????????????????ク??????
+ // ?????????????????????????B
+ // (2010.3.23 yutaka)
+ fv->Success = FALSE; // failure
+ return FALSE;
+ }
+ }
+ } while (i != 0);
+
+
+ i = 1;
+ while ((yv->PktBufCount>0) && (i>0))
+ {
+ b = yv->PktOut[yv->PktBufPtr];
+ i = YWrite(fv,yv,cv,&b, 1);
+ if (i>0)
+ {
+ yv->PktBufCount--;
+ yv->PktBufPtr++;
+ }
+ }
+
+ if (yv->PktBufCount==0)
+ {
+ SetDlgNum(fv->HWin, IDC_PROTOPKTNUM,
+ yv->PktNumOffset+yv->PktNumSent);
+ SetDlgNum(fv->HWin, IDC_PROTOBYTECOUNT, fv->ByteCount);
+ SetDlgPercent(fv->HWin, IDC_PROTOPERCENT, IDC_PROTOPROGRESS,
+ fv->ByteCount, fv->FileSize, &fv->ProgStat);
+ }
+
+ return TRUE;
+}
From svnnotify @ sourceforge.jp Tue Apr 13 00:53:16 2010
From: svnnotify @ sourceforge.jp (svnnotify @ sourceforge.jp)
Date: Tue, 13 Apr 2010 00:53:16 +0900
Subject: [Ttssh2-commit] =?utf-8?b?WzM4NThdICBmaWxlc3RhdOOBruOCv+OCpA==?=
=?utf-8?b?44Og44K544K/44Oz44OX44Gu44OV44Kp44O844Oe44OD44OI44KS5aSJ5pu0?=
=?utf-8?b?44GX44Gf44CC?=
Message-ID: <1271087596.841300.22823.nullmailer@users.sourceforge.jp>
Revision: 3858
http://sourceforge.jp/projects/ttssh2/svn/view?view=rev&revision=3858
Author: yutakapon
Date: 2010-04-13 00:53:16 +0900 (Tue, 13 Apr 2010)
Log Message:
-----------
filestatのタイムスタンプのフォーマットを変更した。
cf.
http://logmett.com/forum/viewtopic.php?f=6&t=1357
Modified Paths:
--------------
trunk/teraterm/ttpmacro/ttl.c
-------------- next part --------------
Modified: trunk/teraterm/ttpmacro/ttl.c
===================================================================
--- trunk/teraterm/ttpmacro/ttl.c 2010-04-12 14:47:54 UTC (rev 3857)
+++ trunk/teraterm/ttpmacro/ttl.c 2010-04-12 15:53:16 UTC (rev 3858)
@@ -1367,6 +1367,7 @@
struct _stat st;
int ret;
int result = -1;
+ struct tm *tmp;
Err = 0;
GetStrVal(FName,&Err);
@@ -1393,7 +1394,8 @@
if (CheckParameterGiven()) {
GetStrVar(&TimeVarId,&Err);
if (Err!=0) return Err;
- ctime_s(TimeStr, sizeof(TimeStr), &st.st_mtime);
+ tmp = localtime(&st.st_mtime);
+ strftime(TimeStr, sizeof(TimeStr), "%Y-%m-%d %H:%M:%S", tmp);
SetStrVal(TimeVarId, TimeStr);
}
From svnnotify @ sourceforge.jp Thu Apr 15 19:25:27 2010
From: svnnotify @ sourceforge.jp (svnnotify @ sourceforge.jp)
Date: Thu, 15 Apr 2010 19:25:27 +0900
Subject: [Ttssh2-commit] =?utf-8?b?WzM4NTldICBMaXN0ZW4g44Ki44OJ44Os44K5?=
=?utf-8?b?5oyH5a6a5a++5b+c44CC?=
Message-ID: <1271327127.488658.2909.nullmailer@users.sourceforge.jp>
Revision: 3859
http://sourceforge.jp/projects/ttssh2/svn/view?view=rev&revision=3859
Author: doda
Date: 2010-04-15 19:25:27 +0900 (Thu, 15 Apr 2010)
Log Message:
-----------
Listen ?≪???????絲上???
Modified Paths:
--------------
trunk/installer/release/lang/English.lng
trunk/installer/release/lang/German.lng
trunk/installer/release/lang/Japanese.lng
-------------- next part --------------
Modified: trunk/installer/release/lang/English.lng
===================================================================
--- trunk/installer/release/lang/English.lng 2010-04-12 15:53:16 UTC (rev 3858)
+++ trunk/installer/release/lang/English.lng 2010-04-15 10:25:27 UTC (rev 3859)
@@ -549,8 +549,8 @@
MSG_FWD_REMOTE_XSERVER=remote X server
MSG_FWD_REMOTE_XSCREEN=X server (screen %d)
-MSG_FWD_REMOTE=Remote %s to local "%s" port %s
-MSG_FWD_LOCAL=Local %s to remote "%s" port %s
+MSG_FWD_REMOTE=Remote %s:%s to local "%s" port %s
+MSG_FWD_LOCAL=Local %s:%s to remote "%s" port %s
MSG_FWD_X=Remote X applications to local X server
; dlg host
Modified: trunk/installer/release/lang/German.lng
===================================================================
--- trunk/installer/release/lang/German.lng 2010-04-12 15:53:16 UTC (rev 3858)
+++ trunk/installer/release/lang/German.lng 2010-04-15 10:25:27 UTC (rev 3859)
@@ -547,8 +547,8 @@
MSG_FWD_REMOTE_XSERVER=remote X server
MSG_FWD_REMOTE_XSCREEN=X server (screen %d)
-MSG_FWD_REMOTE=Remote %s to local "%s" port %s
-MSG_FWD_LOCAL=Local %s to remote "%s" port %s
+MSG_FWD_REMOTE=Remote %s:%s to local "%s" port %s
+MSG_FWD_LOCAL=Local %s:%s to remote "%s" port %s
MSG_FWD_X=Remote X applications to local X server
; dlg host
Modified: trunk/installer/release/lang/Japanese.lng
===================================================================
--- trunk/installer/release/lang/Japanese.lng 2010-04-12 15:53:16 UTC (rev 3858)
+++ trunk/installer/release/lang/Japanese.lng 2010-04-15 10:25:27 UTC (rev 3859)
@@ -549,8 +549,8 @@
MSG_FWD_REMOTE_XSERVER=????X ???
MSG_FWD_REMOTE_XSCREEN=X ??? (?? %d)
-MSG_FWD_REMOTE=????? %s ?????????? "%s" ???? %s
-MSG_FWD_LOCAL=????? %s ?? ???????? "%s" ???? %s
+MSG_FWD_REMOTE=????? %s:%s ?????????? "%s" ???? %s
+MSG_FWD_LOCAL=????? %s:%s ?? ???????? "%s" ???? %s
MSG_FWD_X=?????X???????????????X???
; dlg host
From svnnotify @ sourceforge.jp Thu Apr 15 22:09:39 2010
From: svnnotify @ sourceforge.jp (svnnotify @ sourceforge.jp)
Date: Thu, 15 Apr 2010 22:09:39 +0900
Subject: [Ttssh2-commit] =?utf-8?b?WzM4NjBdICDjg5DjgqTjg4rjg6rjg5Xjg6k=?=
=?utf-8?b?44Kw44KS6KaL44Gm5YuV5L2c44KS5aSJ44GI44KL5oSP576p44GM6KaL5Ye6?=
=?utf-8?b?44Gb44Gq44GL44Gj44Gf44Gf44KB44CBQ29tbVRleHRPdXQgLyBDb21tVGV4?=
=?utf-8?b?dEVjaG8g44KS55u05o6l5ZG844G244KI44GG44Gr5aSJ5pu044CC?=
Message-ID: <1271336979.243857.6269.nullmailer@users.sourceforge.jp>
Revision: 3860
http://sourceforge.jp/projects/ttssh2/svn/view?view=rev&revision=3860
Author: doda
Date: 2010-04-15 22:09:38 +0900 (Thu, 15 Apr 2010)
Log Message:
-----------
??????????違?荀????????????靸??荀??????????????CommTextOut/CommTextEcho ????ュ??吟????紊????
Modified Paths:
--------------
trunk/teraterm/teraterm/vtwin.cpp
-------------- next part --------------
Modified: trunk/teraterm/teraterm/vtwin.cpp
===================================================================
--- trunk/teraterm/teraterm/vtwin.cpp 2010-04-15 10:25:27 UTC (rev 3859)
+++ trunk/teraterm/teraterm/vtwin.cpp 2010-04-15 13:09:38 UTC (rev 3860)
@@ -1827,9 +1827,9 @@
// console???
while (*ptr) {
- FSOut1(*ptr);
+ CommTextOut(&cv, ptr, 1);
if (ts.LocalEcho > 0) {
- FSEcho1(*ptr);
+ CommTextEcho(&cv, ptr, 1);
}
ptr++;
}
From svnnotify @ sourceforge.jp Thu Apr 15 22:15:43 2010
From: svnnotify @ sourceforge.jp (svnnotify @ sourceforge.jp)
Date: Thu, 15 Apr 2010 22:15:43 +0900
Subject: [Ttssh2-commit] =?utf-8?b?WzM4NjFdICDlpJbpg6jjgYvjgonjgrPjg7w=?=
=?utf-8?b?44Or44GV44KM44Gq44GP44Gq44Gj44Gf44Gu44Gn44CB44Kz44O844Or44GV?=
=?utf-8?b?44KM44KL54K644Gu6Kit5a6a44KS5YmK6Zmk44CC?=
Message-ID: <1271337343.532812.16279.nullmailer@users.sourceforge.jp>
Revision: 3861
http://sourceforge.jp/projects/ttssh2/svn/view?view=rev&revision=3861
Author: doda
Date: 2010-04-15 22:15:43 +0900 (Thu, 15 Apr 2010)
Log Message:
-----------
紊??????潟???????????????с??潟????????冴?荐??????ゃ?
Modified Paths:
--------------
trunk/teraterm/teraterm/filesys.cpp
trunk/teraterm/teraterm/filesys.h
-------------- next part --------------
Modified: trunk/teraterm/teraterm/filesys.cpp
===================================================================
--- trunk/teraterm/teraterm/filesys.cpp 2010-04-15 13:09:38 UTC (rev 3860)
+++ trunk/teraterm/teraterm/filesys.cpp 2010-04-15 13:15:43 UTC (rev 3861)
@@ -876,8 +876,6 @@
EndDdeCmnd(0);
}
-// vtwin.cpp ???????????extern "C"?????(2004.11.3 yutaka)
-extern "C" {
int FSOut1(BYTE b)
{
if (ts.TransBin > 0)
@@ -886,7 +884,7 @@
return CommTextOut(&cv,(PCHAR)&b,1);
else
return 1;
- }
+}
int FSEcho1(BYTE b)
{
@@ -894,7 +892,6 @@
return CommBinaryEcho(&cv,(PCHAR)&b,1);
else
return CommTextEcho(&cv,(PCHAR)&b,1);
- }
}
extern "C" {
Modified: trunk/teraterm/teraterm/filesys.h
===================================================================
--- trunk/teraterm/teraterm/filesys.h 2010-04-15 13:09:38 UTC (rev 3860)
+++ trunk/teraterm/teraterm/filesys.h 2010-04-15 13:15:43 UTC (rev 3861)
@@ -56,8 +56,6 @@
void FLogChangeButton(BOOL Pause);
void FLogRefreshNum();
void FileTransEnd(WORD OpId);
-int FSOut1(BYTE b);
-int FSEcho1(BYTE b);
void ProtoEnd();
int ProtoDlgParse();
From svnnotify @ sourceforge.jp Fri Apr 16 20:09:17 2010
From: svnnotify @ sourceforge.jp (svnnotify @ sourceforge.jp)
Date: Fri, 16 Apr 2010 20:09:17 +0900
Subject: [Ttssh2-commit] =?utf-8?b?WzM4NjJdICBTU0gg44Od44O844OI6Lui6YCB?=
=?utf-8?b?44Gu44OH44OV44Kp44Or44OI44GuIGJpbmRfYWRkcmVzcyDjgpIgMTI3IC4w?=
=?utf-8?b?LjAuIDEg44GL44KJIGxvY2FsaG9zdCDjgavlpInmm7TjgZfjgZ/jgII=?=
Message-ID: <1271416157.855105.10166.nullmailer@users.sourceforge.jp>
Revision: 3862
http://sourceforge.jp/projects/ttssh2/svn/view?view=rev&revision=3862
Author: maya
Date: 2010-04-16 20:09:17 +0900 (Fri, 16 Apr 2010)
Log Message:
-----------
SSH ポート転送のデフォルトの bind_address を 127.0.0.1 から localhost に変更した。
Modified Paths:
--------------
trunk/ttssh2/ttxssh/fwdui.c
-------------- next part --------------
Modified: trunk/ttssh2/ttxssh/fwdui.c
===================================================================
--- trunk/ttssh2/ttxssh/fwdui.c 2010-04-15 13:15:43 UTC (rev 3861)
+++ trunk/ttssh2/ttxssh/fwdui.c 2010-04-16 11:09:17 UTC (rev 3862)
@@ -482,7 +482,7 @@
}
strncpy_s(request->bind_address, sizeof(request->bind_address),
- "127.0.0.1", _TRUNCATE);
+ "localhost", _TRUNCATE);
i=0;
switch (argc) {
case 4:
@@ -552,7 +552,7 @@
switch (spec->type) {
case FWD_LOCAL_TO_REMOTE:
- if (strcmp(spec->bind_address,"127.0.0.1") == 0) {
+ if (strcmp(spec->bind_address,"localhost") == 0) {
_snprintf_s(str, str_remaining, _TRUNCATE, "L%s:%s:%s",
spec->from_port_name, spec->to_host,
spec->to_port_name);
@@ -565,7 +565,7 @@
}
break;
case FWD_REMOTE_TO_LOCAL:
- if (strcmp(spec->bind_address,"127.0.0.1") == 0) {
+ if (strcmp(spec->bind_address,"localhost") == 0) {
_snprintf_s(str, str_remaining, _TRUNCATE, "R%s:%s:%s",
spec->from_port_name, spec->to_host,
spec->to_port_name);
@@ -961,7 +961,7 @@
if (strcmp(spec->to_host, "localhost") != 0) {
SetDlgItemText(dlg, to_host_item, spec->to_host);
}
- if (strcmp(spec->bind_address, "127.0.0.1") != 0) {
+ if (strcmp(spec->bind_address, "localhost") != 0) {
SetDlgItemText(dlg, listen_address_item, spec->bind_address);
}
@@ -1051,7 +1051,7 @@
grab_control_text(dlg, type, IDC_SSHRTLLISTENADDR, IDC_SSHLTRLISTENADDR,
new_spec.bind_address, sizeof(new_spec.bind_address));
if (new_spec.bind_address[0] == 0) {
- strncpy_s(new_spec.bind_address, sizeof(new_spec.bind_address), "127.0.0.1", _TRUNCATE);
+ strncpy_s(new_spec.bind_address, sizeof(new_spec.bind_address), "localhost", _TRUNCATE);
}
else if (strcmp(new_spec.bind_address, "*") == 0 ) {
strncpy_s(new_spec.bind_address, sizeof(new_spec.bind_address), "0.0.0.0", _TRUNCATE);
From svnnotify @ sourceforge.jp Fri Apr 16 21:50:15 2010
From: svnnotify @ sourceforge.jp (svnnotify @ sourceforge.jp)
Date: Fri, 16 Apr 2010 21:50:15 +0900
Subject: [Ttssh2-commit] =?utf-8?b?WzM4NjNdICBTU0gg44Od44O844OI6Lui6YCB?=
=?utf-8?b?44Gu44OH44OV44Kp44Or44OI44GuIGJpbmRfYWRkcmVzcyDjgaggdG9faG9z?=
=?utf-8?b?dCDjga7op6PmnpDjgacgW10gIOOCkuWkluOBmeOCiOOBhuOBq+OBl+OBnw==?=
=?utf-8?b?44CC?=
Message-ID: <1271422215.990775.29413.nullmailer@users.sourceforge.jp>
Revision: 3863
http://sourceforge.jp/projects/ttssh2/svn/view?view=rev&revision=3863
Author: maya
Date: 2010-04-16 21:50:15 +0900 (Fri, 16 Apr 2010)
Log Message:
-----------
SSH ?????拶???????????? bind_address ??to_host ??В??? [] ?????????????? ?潟??潟?????潟? IPv6 ?≪???????絎???????? [] ??????綽????????
Modified Paths:
--------------
trunk/installer/release/lang/English.lng
trunk/installer/release/lang/German.lng
trunk/installer/release/lang/Japanese.lng
trunk/ttssh2/ttxssh/fwdui.c
-------------- next part --------------
Modified: trunk/installer/release/lang/English.lng
===================================================================
--- trunk/installer/release/lang/English.lng 2010-04-16 11:09:17 UTC (rev 3862)
+++ trunk/installer/release/lang/English.lng 2010-04-16 12:50:15 UTC (rev 3863)
@@ -549,8 +549,8 @@
MSG_FWD_REMOTE_XSERVER=remote X server
MSG_FWD_REMOTE_XSCREEN=X server (screen %d)
-MSG_FWD_REMOTE=Remote %s:%s to local "%s" port %s
-MSG_FWD_LOCAL=Local %s:%s to remote "%s" port %s
+MSG_FWD_REMOTE=Remote "%s" port %s to local "%s" port %s
+MSG_FWD_LOCAL=Local "%s" port %s to remote "%s" port %s
MSG_FWD_X=Remote X applications to local X server
; dlg host
Modified: trunk/installer/release/lang/German.lng
===================================================================
--- trunk/installer/release/lang/German.lng 2010-04-16 11:09:17 UTC (rev 3862)
+++ trunk/installer/release/lang/German.lng 2010-04-16 12:50:15 UTC (rev 3863)
@@ -547,8 +547,8 @@
MSG_FWD_REMOTE_XSERVER=remote X server
MSG_FWD_REMOTE_XSCREEN=X server (screen %d)
-MSG_FWD_REMOTE=Remote %s:%s to local "%s" port %s
-MSG_FWD_LOCAL=Local %s:%s to remote "%s" port %s
+MSG_FWD_REMOTE=Remote "%s" port %s to local "%s" port %s
+MSG_FWD_LOCAL=Local "%s" port %s to remote "%s" port %s
MSG_FWD_X=Remote X applications to local X server
; dlg host
Modified: trunk/installer/release/lang/Japanese.lng
===================================================================
--- trunk/installer/release/lang/Japanese.lng 2010-04-16 11:09:17 UTC (rev 3862)
+++ trunk/installer/release/lang/Japanese.lng 2010-04-16 12:50:15 UTC (rev 3863)
@@ -549,8 +549,8 @@
MSG_FWD_REMOTE_XSERVER=????X ???
MSG_FWD_REMOTE_XSCREEN=X ??? (?? %d)
-MSG_FWD_REMOTE=????? %s:%s ?????????? "%s" ???? %s
-MSG_FWD_LOCAL=????? %s:%s ?? ???????? "%s" ???? %s
+MSG_FWD_REMOTE=????? "%s" ???? %s ?????????? "%s" ???? %s
+MSG_FWD_LOCAL=????? "%s" ???? %s ?? ???????? "%s" ???? %s
MSG_FWD_X=?????X???????????????X???
; dlg host
Modified: trunk/ttssh2/ttxssh/fwdui.c
===================================================================
--- trunk/ttssh2/ttxssh/fwdui.c 2010-04-16 11:09:17 UTC (rev 3862)
+++ trunk/ttssh2/ttxssh/fwdui.c 2010-04-16 12:50:15 UTC (rev 3863)
@@ -440,6 +440,8 @@
char *tmp, *ch;
int len, i, argc = 0, bracketed = 0;
char *argv[4];
+ char hostname[256];
+ int start;
if ((tmp = strchr(str, ';')) != NULL) {
len = tmp - str;
@@ -491,8 +493,18 @@
"0.0.0.0", _TRUNCATE);
}
else {
+ // IPv6 ????? "[", "]" ??????+ start = 0;
+ strncpy_s(hostname, sizeof(hostname), argv[i], _TRUNCATE);
+ if (strlen(hostname) > 0 &&
+ hostname[strlen(hostname)-1] == ']') {
+ hostname[strlen(hostname)-1] = '\0';
+ }
+ if (hostname[0] == '[') {
+ start = 1;
+ }
strncpy_s(request->bind_address, sizeof(request->bind_address),
- argv[i], _TRUNCATE);
+ hostname + start, _TRUNCATE);
}
i++;
// don't break here
@@ -505,8 +517,18 @@
}
i++;
+ // IPv6 ????? "[", "]" ??????+ start = 0;
+ strncpy_s(hostname, sizeof(hostname), argv[i], _TRUNCATE);
+ if (strlen(hostname) > 0 &&
+ hostname[strlen(hostname)-1] == ']') {
+ hostname[strlen(hostname)-1] = '\0';
+ }
+ if (hostname[0] == '[') {
+ start = 1;
+ }
strncpy_s(request->to_host, sizeof(request->to_host),
- argv[i], _TRUNCATE);
+ hostname + start, _TRUNCATE);
i++;
request->to_port = parse_port(argv[i], request->to_port_name,
@@ -532,6 +554,7 @@
int i;
char FAR *str = pvar->settings.DefaultForwarding;
int str_remaining = sizeof(pvar->settings.DefaultForwarding) - 1;
+ char format[20];
FWD_get_request_specs(pvar, requests, num_specs);
@@ -550,31 +573,74 @@
FWDRequestSpec FAR *spec = requests + i;
int chars;
+ // IPv6 ?????? "[", "]" ?????????
switch (spec->type) {
case FWD_LOCAL_TO_REMOTE:
if (strcmp(spec->bind_address,"localhost") == 0) {
- _snprintf_s(str, str_remaining, _TRUNCATE, "L%s:%s:%s",
+ if (strchr(spec->to_host, ':') == NULL) {
+ strncpy_s(format, sizeof(format), "L%s:%s:%s", _TRUNCATE);
+ }
+ else {
+ strncpy_s(format, sizeof(format), "L%s:[%s]:%s", _TRUNCATE);
+ }
+ _snprintf_s(str, str_remaining, _TRUNCATE, format,
spec->from_port_name, spec->to_host,
spec->to_port_name);
}
else {
- _snprintf_s(str, str_remaining, _TRUNCATE, "L%s:%s:%s:%s",
- spec->bind_address,
- spec->from_port_name, spec->to_host,
- spec->to_port_name);
+ if (strchr(spec->bind_address, ':') == NULL) {
+ if (strchr(spec->to_host, ':') == NULL) {
+ strncpy_s(format, sizeof(format), "L%s:%s:%s:%s", _TRUNCATE);
+ }
+ else {
+ strncpy_s(format, sizeof(format), "L%s:%s:[%s]:%s", _TRUNCATE);
+ }
+ }
+ else {
+ if (strchr(spec->to_host, ':') == NULL) {
+ strncpy_s(format, sizeof(format), "L[%s]:%s:%s:%s", _TRUNCATE);
+ }
+ else {
+ strncpy_s(format, sizeof(format), "L[%s]:%s:[%s]:%s", _TRUNCATE);
+ }
+ }
+ _snprintf_s(str, str_remaining, _TRUNCATE, format,
+ spec->bind_address, spec->from_port_name,
+ spec->to_host, spec->to_port_name);
}
break;
case FWD_REMOTE_TO_LOCAL:
if (strcmp(spec->bind_address,"localhost") == 0) {
- _snprintf_s(str, str_remaining, _TRUNCATE, "R%s:%s:%s",
+ if (strchr(spec->to_host, ':') == NULL) {
+ strncpy_s(format, sizeof(format), "R%s:%s:%s", _TRUNCATE);
+ }
+ else {
+ strncpy_s(format, sizeof(format), "R%s:[%s]:%s", _TRUNCATE);
+ }
+ _snprintf_s(str, str_remaining, _TRUNCATE, format,
spec->from_port_name, spec->to_host,
spec->to_port_name);
}
else {
- _snprintf_s(str, str_remaining, _TRUNCATE, "R%s:%s:%s:%s",
- spec->bind_address,
- spec->from_port_name, spec->to_host,
- spec->to_port_name);
+ if (strchr(spec->bind_address, ':') == NULL) {
+ if (strchr(spec->to_host, ':') == NULL) {
+ strncpy_s(format, sizeof(format), "R%s:%s:%s:%s", _TRUNCATE);
+ }
+ else {
+ strncpy_s(format, sizeof(format), "R%s:%s:[%s]:%s", _TRUNCATE);
+ }
+ }
+ else {
+ if (strchr(spec->to_host, ':') == NULL) {
+ strncpy_s(format, sizeof(format), "R[%s]:%s:%s:%s", _TRUNCATE);
+ }
+ else {
+ strncpy_s(format, sizeof(format), "R[%s]:%s:[%s]:%s", _TRUNCATE);
+ }
+ }
+ _snprintf_s(str, str_remaining, _TRUNCATE, format,
+ spec->bind_address, spec->from_port_name,
+ spec->to_host, spec->to_port_name);
}
break;
case FWD_REMOTE_X11_TO_LOCAL:
@@ -677,14 +743,14 @@
switch (spec->type) {
case FWD_REMOTE_TO_LOCAL:
UTIL_get_lang_msg("MSG_FWD_REMOTE", pvar,
- "Remote %s:%s to local \"%s\" port %s");
+ "Remote \"%s\" port %s to local \"%s\" port %s");
_snprintf_s(buf, bufsize, _TRUNCATE, pvar->ts->UIMsg,
spec->bind_address, verbose_from_port,
spec->to_host, verbose_to_port);
break;
case FWD_LOCAL_TO_REMOTE:
UTIL_get_lang_msg("MSG_FWD_LOCAL", pvar,
- "Local %s:%s to remote \"%s\" port %s");
+ "Local \"%s\" port %s to remote \"%s\" port %s");
_snprintf_s(buf, bufsize, _TRUNCATE, pvar->ts->UIMsg,
spec->bind_address, verbose_from_port,
spec->to_host,verbose_to_port);
@@ -1056,11 +1122,29 @@
else if (strcmp(new_spec.bind_address, "*") == 0 ) {
strncpy_s(new_spec.bind_address, sizeof(new_spec.bind_address), "0.0.0.0", _TRUNCATE);
}
+ else {
+ // IPv6 ????? "[", "]" ??????+ if (new_spec.bind_address[strlen(new_spec.bind_address)-1] == ']') {
+ new_spec.bind_address[strlen(new_spec.bind_address)-1] = '\0';
+ }
+ if (new_spec.bind_address[0] == '[') {
+ memmove(new_spec.bind_address, new_spec.bind_address + 1, strlen(new_spec.bind_address)+1);
+ }
+ }
grab_control_text(dlg, type, IDC_SSHRTLTOHOST, IDC_SSHLTRTOHOST,
new_spec.to_host, sizeof(new_spec.to_host));
if (new_spec.to_host[0] == 0) {
strncpy_s(new_spec.to_host, sizeof(new_spec.to_host), "localhost", _TRUNCATE);
}
+ else {
+ // IPv6 ????? "[", "]" ??????+ if (new_spec.to_host[strlen(new_spec.to_host)-1] == ']') {
+ new_spec.to_host[strlen(new_spec.to_host)-1] = '\0';
+ }
+ if (new_spec.to_host[0] == '[') {
+ memmove(new_spec.to_host, new_spec.to_host + 1, strlen(new_spec.to_host)+1);
+ }
+ }
grab_control_text(dlg, type, IDC_SSHRTLTOPORT, IDC_SSHLTRTOPORT,
new_spec.to_port_name,
sizeof(new_spec.to_port_name));
From svnnotify @ sourceforge.jp Sat Apr 17 18:13:04 2010
From: svnnotify @ sourceforge.jp (svnnotify @ sourceforge.jp)
Date: Sat, 17 Apr 2010 18:13:04 +0900
Subject: [Ttssh2-commit] =?utf-8?b?WzM4NjRdICBTU0gg44Od44O844OI6Lui6YCB?=
=?utf-8?b?44Gu44OH44OV44Kp44Or44OI44GuIGJpbmRfYWRkcmVzcyDjgpIgMTI3IC4w?=
=?utf-8?b?LjAuIDEg44GL44KJIGxvY2FsaG9zdCDjgavlpInmm7TjgZfjgZ/jgII=?=
Message-ID: <1271495584.513674.8079.nullmailer@users.sourceforge.jp>
Revision: 3864
http://sourceforge.jp/projects/ttssh2/svn/view?view=rev&revision=3864
Author: maya
Date: 2010-04-17 18:13:04 +0900 (Sat, 17 Apr 2010)
Log Message:
-----------
SSH ?????拶???????????? bind_address ??127.0.0.1 ??? localhost ????眼????
Modified Paths:
--------------
trunk/doc/en/html/commandline/ttssh.html
trunk/doc/en/html/menu/setup-sshforward.html
trunk/doc/ja/html/commandline/ttssh.html
trunk/doc/ja/html/menu/setup-sshforward.html
-------------- next part --------------
Modified: trunk/doc/en/html/commandline/ttssh.html
===================================================================
--- trunk/doc/en/html/commandline/ttssh.html 2010-04-16 12:50:15 UTC (rev 3863)
+++ trunk/doc/en/html/commandline/ttssh.html 2010-04-17 09:13:04 UTC (rev 3864)
@@ -106,11 +106,11 @@
/ssh-L[<listen_addr>:]<port1>:<host>:<port2>
port-fowarding from local listen-address(<listen_addr>) port(<port1>) to remote side host(<host>) port(<port2>)
- if <listen_addr> is omitted, it listens at 127.0.0.1.
+ if <listen_addr> is omitted, it listens at localhost.
/ssh-R[<listen_addr>:]<port1>:<host>:<port2>
port-fowarding from remote listen-address(<listen_addr>) port(<port1>) to local side host(<host>) port(<port2>)
- if <listen_addr> is omitted, it listens at 127.0.0.1.
+ if <listen_addr> is omitted, it listens at localhost.
<listen_addr> is not used with SSH1 protocol.
/ssh-X
Modified: trunk/doc/en/html/menu/setup-sshforward.html
===================================================================
--- trunk/doc/en/html/menu/setup-sshforward.html 2010-04-16 12:50:15 UTC (rev 3863)
+++ trunk/doc/en/html/menu/setup-sshforward.html 2010-04-17 09:13:04 UTC (rev 3864)
@@ -57,7 +57,7 @@
listen
- Listen address of local side. If omitted, 127.0.0.1 is used.
+ Listen address of local side. If omitted, localhost is used.
to remote machine
@@ -81,7 +81,7 @@
listen
- Listen address of remote side. If omitted, 127.0.0.1 is used.
+ Listen address of remote side. If omitted, localhost is used.
It is not used with SSH1 protocol.
Modified: trunk/doc/ja/html/commandline/ttssh.html
===================================================================
--- trunk/doc/ja/html/commandline/ttssh.html 2010-04-16 12:50:15 UTC (rev 3863)
+++ trunk/doc/ja/html/commandline/ttssh.html 2010-04-17 09:13:04 UTC (rev 3864)
@@ -106,11 +106,11 @@
/ssh-L[<listen_addr>:]<port1>:<host>:<port2>
?????????????(<listen_addr>)???(<port1>)??????????(<host>)????(<port2>)??????????????
- <listen_addr>??????A127.0.0.1???????
+ <listen_addr>??????Alocalhost???????
/ssh-R[<listen_addr>:]<port1>:<host>:<port2>
?????????????(<listen_addr>)???(<port1>)??????????(<host>)????(<port2>)??????????????
- <listen_addr>??????A127.0.0.1???????
+ <listen_addr>??????Alocalhost???????
SSH1???????<listen_addr>???????
/ssh-X
Modified: trunk/doc/ja/html/menu/setup-sshforward.html
===================================================================
--- trunk/doc/ja/html/menu/setup-sshforward.html 2010-04-16 12:50:15 UTC (rev 3863)
+++ trunk/doc/ja/html/menu/setup-sshforward.html 2010-04-17 09:13:04 UTC (rev 3864)
@@ -58,7 +58,7 @@
listen
- ????????????????????127.0.0.1 ??????
+ ????????????????????localhost ??????
to remote machine
@@ -82,7 +82,7 @@
listen
- ????????????????????127.0.0.1 ??????
+ ????????????????????localhost ??????
SSH1??????????????
From svnnotify @ sourceforge.jp Tue Apr 20 01:51:24 2010
From: svnnotify @ sourceforge.jp (svnnotify @ sourceforge.jp)
Date: Tue, 20 Apr 2010 01:51:24 +0900
Subject: [Ttssh2-commit] =?utf-8?b?WzM4NjVdICDoi7HoqLPjgpLov73liqDjgII=?=
Message-ID: <1271695884.365089.10517.nullmailer@users.sourceforge.jp>
Revision: 3865
http://sourceforge.jp/projects/ttssh2/svn/view?view=rev&revision=3865
Author: yutakapon
Date: 2010-04-20 01:51:24 +0900 (Tue, 20 Apr 2010)
Log Message:
-----------
?沿┳??申???
Modified Paths:
--------------
trunk/doc/en/html/about/history.html
-------------- next part --------------
Modified: trunk/doc/en/html/about/history.html
===================================================================
--- trunk/doc/en/html/about/history.html 2010-04-17 09:13:04 UTC (rev 3864)
+++ trunk/doc/en/html/about/history.html 2010-04-19 16:51:24 UTC (rev 3865)
@@ -53,7 +53,7 @@
When using alternate screen buffer, saving and restoring cursor position do not work correctly.
If ClearOnResize setting is on, DECCOLM (Change Column Mode) control sequence does not clear screen.
-
+ When a user assigns a function to the Alt key in the KEYBOARD.CNF file, the unnecessary string print.
VPR control sequence does not work correctly.
The crc32file macro command does not work correctly for handling the file opening error. And also, the command supports the read-only file.
Fixed a problem where TeraTerm consumes 100% CPU if a USB serial port is disconnected. Special thanks to Z. Vickery.
@@ -1472,9 +1472,9 @@
Changes
- Port forwarding.
+ Specifying the listen address in the port forwarding.
From svnnotify @ sourceforge.jp Tue Apr 20 20:33:08 2010
From: svnnotify @ sourceforge.jp (svnnotify @ sourceforge.jp)
Date: Tue, 20 Apr 2010 20:33:08 +0900
Subject: [Ttssh2-commit] =?utf-8?b?WzM4NjZdICBTU0gg5o6l57aa5Lit44GrIFNT?=
=?utf-8?b?SCDjg53jg7zjg4jou6LpgIHjga7oqK3lrprjgpLjgZfjgZ/jgajjgY3jgIFS?=
=?utf-8?b?ZW1vdGUgdG8gTG9jYWwg44GM6L+95Yqg44GV44KM44Gm44GE44Gq44GP44Gm?=
=?utf-8?b?44KC44Ki44Op44O844OI44GM5Ye644KL5ZWP6aGM44KS5L+u5q2j44GX44Gf?=
=?utf-8?b?44CC?=
Message-ID: <1271763188.313591.4310.nullmailer@users.sourceforge.jp>
Revision: 3866
http://sourceforge.jp/projects/ttssh2/svn/view?view=rev&revision=3866
Author: maya
Date: 2010-04-20 20:33:07 +0900 (Tue, 20 Apr 2010)
Log Message:
-----------
SSH 接続中に SSH ポート転送の設定をしたとき、Remote to Local が追加されていなくてもアラートが出る問題を修正した。
Modified Paths:
--------------
trunk/ttssh2/ttxssh/fwd.c
-------------- next part --------------
Modified: trunk/ttssh2/ttxssh/fwd.c
===================================================================
--- trunk/ttssh2/ttxssh/fwd.c 2010-04-19 16:51:24 UTC (rev 3865)
+++ trunk/ttssh2/ttxssh/fwd.c 2010-04-20 11:33:07 UTC (rev 3866)
@@ -1010,7 +1010,8 @@
&& listener->to_port == spec->to_port
&& (spec->type == FWD_REMOTE_X11_TO_LOCAL
|| strcmp(listener->to_host, spec->to_host) == 0)
- && strcmp(listener->bind_address, spec->bind_address);
+ && (spec->type == FWD_REMOTE_X11_TO_LOCAL
+ || strcmp(listener->bind_address, spec->bind_address) == 0);
}
BOOL FWD_can_server_listen_for(PTInstVar pvar, FWDRequestSpec FAR * spec)
From svnnotify @ sourceforge.jp Wed Apr 21 01:10:32 2010
From: svnnotify @ sourceforge.jp (svnnotify @ sourceforge.jp)
Date: Wed, 21 Apr 2010 01:10:32 +0900
Subject: [Ttssh2-commit] =?utf-8?b?WzM4NjddICDoi7HoqLPjgpLov73liqDjgII=?=
Message-ID: <1271779832.454852.2646.nullmailer@users.sourceforge.jp>
Revision: 3867
http://sourceforge.jp/projects/ttssh2/svn/view?view=rev&revision=3867
Author: yutakapon
Date: 2010-04-21 01:10:32 +0900 (Wed, 21 Apr 2010)
Log Message:
-----------
?沿┳??申???
Modified Paths:
--------------
trunk/doc/en/html/about/history.html
-------------- next part --------------
Modified: trunk/doc/en/html/about/history.html
===================================================================
--- trunk/doc/en/html/about/history.html 2010-04-20 11:33:07 UTC (rev 3866)
+++ trunk/doc/en/html/about/history.html 2010-04-20 16:10:32 UTC (rev 3867)
@@ -50,8 +50,8 @@
Bug fixes
- When using alternate screen buffer, saving and restoring cursor position do not work correctly.
-
+ Switching to alternate screen buffer, saving and restoring cursor position do not work correctly.
+ By using the "Save Cursor" control sequence, the alternate screen buffer switching and the screen clear execute in the wrong.
If ClearOnResize setting is on, DECCOLM (Change Column Mode) control sequence does not clear screen.
When a user assigns a function to the Alt key in the KEYBOARD.CNF file, the unnecessary string print.
VPR control sequence does not work correctly.
From svnnotify @ sourceforge.jp Thu Apr 22 00:13:26 2010
From: svnnotify @ sourceforge.jp (svnnotify @ sourceforge.jp)
Date: Thu, 22 Apr 2010 00:13:26 +0900
Subject: [Ttssh2-commit] =?utf-8?b?WzM4NjhdICDjg5DjgqTjg4rjg6rou6LpgIE=?=
=?utf-8?b?44OX44Ot44OI44Kz44Or44Gr44Gk44GE44Gm6L+96KiY44GX44Gf44CC?=
Message-ID: <1271862806.915506.13209.nullmailer@users.sourceforge.jp>
Revision: 3868
http://sourceforge.jp/projects/ttssh2/svn/view?view=rev&revision=3868
Author: yutakapon
Date: 2010-04-22 00:13:26 +0900 (Thu, 22 Apr 2010)
Log Message:
-----------
??????荵∫???????????ゃ???申荐?????
Modified Paths:
--------------
trunk/doc/ja/html/reference/sourcecode.html
-------------- next part --------------
Modified: trunk/doc/ja/html/reference/sourcecode.html
===================================================================
--- trunk/doc/ja/html/reference/sourcecode.html 2010-04-20 16:10:32 UTC (rev 3867)
+++ trunk/doc/ja/html/reference/sourcecode.html 2010-04-21 15:13:26 UTC (rev 3868)
@@ -29,6 +29,7 @@
?????????タ?
???????
???????
+ ???????????
@@ -1203,6 +1204,115 @@
+
+
+
+ ??
+???????????????????????????????????????Tera Term??????????ョ???????????????????????????????????????????????????????????????????????????????????????????????????????
+?????XMODEM/YMODEM/ZMODEM??????????
+
+ ????
+???????????????????????????????????????????????
+
+
+ +-------------------------------------------------------+
+ |ttermpro.exe (filesys.cpp) |
+ +-------------------------------------------------------+
+ |ttpfile.dll (ttfile.c) |
+ +-------+--------+--------+--------+--------+-----------+
+ |Kermit | XMODEM | YMODEM | ZMODEM | B-Plus | Quick-VAN |
+ +-------+--------+--------+--------+--------+-----------+
+
+
+?????XMODEM??????????????A???t??????????????
+
+
+filesys.cpp: OnFileXSend() -> XMODEMStart() -> OpenProtoDlg() ->
+ttfile.c: ProtoInit() ->
+xmodem.c: XInit()
+
+
+ZMODEM???????????????A?????????
+
+
+filesys.cpp: OnFileZRcv() -> ZMODEMStart() -> OpenProtoDlg() ->
+ttfile.c: ProtoInit() ->
+zmodem.c: ZInit()
+
+
+ ????????
+??????????タ???????ttpfile.dll?????????????????????????????????????????????????????????????????????????????ProtoInit()?ProtoParse()?ProtoTimeOutProc()?ProtoCancel()?????????B
+XMODEM?????????????????ヲ????
+
+
+
+ ??
+ ??
+
+
+
+ XInit
+ ???/td>
+
+
+
+ XSendPacket
+ ??????
+
+
+
+ YReadPacket
+ ??????
+
+
+
+ XTimeOutProc
+ ????????/td>
+
+
+
+ XCancel
+ ???????/td>
+
+
+
+
+ZMODEM?????????????????ヲ????
+
+
+
+ ??
+ ??
+
+
+
+ ZInit
+ ???/td>
+
+
+
+ ZParse
+ ??????
+
+
+
+ ZParse
+ ??????
+
+
+
+ ZTimeOutProc
+ ????????/td>
+
+
+
+ ZCancel
+ ???????/td>
+
+
+
+
+