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 @@ +

Fix the initial window position

+ + +
+VTPos=200,100
+
+ + + +
+Default:
+VTPos=-2147483648,-2147483648
+TEKPos=-2147483648,-2147483648
+
+ +

Save the window position

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?????

    +

    +?????????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 @@

    Tera Term

    -

    2010.3.24 (Ver 4.66 unreleased)

    +

    2010.4.2 (Ver 4.66 unreleased)

    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 @@

    Tera Term

    -

    2010.3.24 (Ver 4.66 unreleased)

    +

    2010.4.2 (Ver 4.66 unreleased)

    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 @@

    Tera Term

    -

    2010.4.2 (Ver 4.66 unreleased)

    +

    2010.4.7 (Ver 4.66 unreleased)

    • 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 @@

      Tera Term

      -

      2010.4.2 (Ver 4.66 unreleased)

      +

      2010.4.7 (Ver 4.66 unreleased)

      • ??
          @@ -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> +
              + + + From svnnotify @ sourceforge.jp Sat Apr 24 13:12:02 2010 From: svnnotify @ sourceforge.jp (svnnotify @ sourceforge.jp) Date: Sat, 24 Apr 2010 13:12:02 +0900 Subject: [Ttssh2-commit] =?utf-8?b?WzM4NjldICB6bGliIOOBruODkOODvOOCuA==?= =?utf-8?b?44On44Oz44KS5LiK44GS44Gf?= Message-ID: <1272082322.160641.7852.nullmailer@users.sourceforge.jp> Revision: 3869 http://sourceforge.jp/projects/ttssh2/svn/view?view=rev&revision=3869 Author: maya Date: 2010-04-24 13:12:01 +0900 (Sat, 24 Apr 2010) Log Message: ----------- zlib ????若??с??????? Modified Paths: -------------- trunk/doc/en/html/about/history.html trunk/doc/en/html/reference/develop.txt trunk/doc/ja/html/about/history.html trunk/doc/ja/html/reference/develop.txt trunk/libs/buildzlib.bat -------------- next part -------------- Modified: trunk/doc/en/html/about/history.html =================================================================== --- trunk/doc/en/html/about/history.html 2010-04-21 15:13:26 UTC (rev 3868) +++ trunk/doc/en/html/about/history.html 2010-04-24 04:12:01 UTC (rev 3869) @@ -1493,7 +1493,7 @@
            • Misc
              • upgraded OpenSSL to 1.0.0
              • -
              • upgraded zlib to 1.2.4
              • +
              • upgraded zlib to 1.2.5
            Modified: trunk/doc/en/html/reference/develop.txt =================================================================== --- trunk/doc/en/html/reference/develop.txt 2010-04-21 15:13:26 UTC (rev 3868) +++ trunk/doc/en/html/reference/develop.txt 2010-04-24 04:12:01 UTC (rev 3869) @@ -17,7 +17,7 @@ * Libraries - oniguruma 5.9.2 (http://www.geocities.jp/kosako3/oniguruma/) - openssl 1.0.0 (http://www.openssl.org/) -- zlib 1.2.4 (http://www.zlib.net/) +- zlib 1.2.5 (http://www.zlib.net/) - PuTTY 0.60 (http://www.chiark.greenend.org.uk/~sgtatham/putty/) Modified: trunk/doc/ja/html/about/history.html =================================================================== --- trunk/doc/ja/html/about/history.html 2010-04-21 15:13:26 UTC (rev 3868) +++ trunk/doc/ja/html/about/history.html 2010-04-24 04:12:01 UTC (rev 3869) @@ -1494,7 +1494,7 @@
          • ???
            • OpenSSL 1.0.0??????
            • -
            • zlib 1.2.4??????
            • +
            • zlib 1.2.5??????
          Modified: trunk/doc/ja/html/reference/develop.txt =================================================================== --- trunk/doc/ja/html/reference/develop.txt 2010-04-21 15:13:26 UTC (rev 3868) +++ trunk/doc/ja/html/reference/develop.txt 2010-04-24 04:12:01 UTC (rev 3869) @@ -20,7 +20,7 @@ ? ????? - oniguruma 5.9.2 (http://www.geocities.jp/kosako3/oniguruma/) - openssl 1.0.0 (http://www.openssl.org/) -- zlib 1.2.4 (http://www.zlib.net/) +- zlib 1.2.5 (http://www.zlib.net/) - PuTTY 0.60 (http://www.chiark.greenend.org.uk/~sgtatham/putty/) Modified: trunk/libs/buildzlib.bat =================================================================== --- trunk/libs/buildzlib.bat 2010-04-21 15:13:26 UTC (rev 3868) +++ trunk/libs/buildzlib.bat 2010-04-24 04:12:01 UTC (rev 3869) @@ -16,7 +16,7 @@ :build if exist zlibd.lib goto build_release nmake -f win32\Makefile.msc.debug clean -nmake -f win32\Makefile.msc.debug +nmake -f win32\Makefile.msc.debug OBJA="inffast.obj" move zlibd.lib examples\ move zlib.pdb examples\ nmake -f win32\Makefile.msc.release clean @@ -24,6 +24,6 @@ move examples\zlib.pdb .\ :build_release -nmake -f win32\Makefile.msc.release +nmake -f win32\Makefile.msc.release OBJA="inffast.obj" cd .. From svnnotify @ sourceforge.jp Mon Apr 26 20:36:33 2010 From: svnnotify @ sourceforge.jp (svnnotify @ sourceforge.jp) Date: Mon, 26 Apr 2010 20:36:33 +0900 Subject: [Ttssh2-commit] =?utf-8?b?WzM4NzBdICDjgrXjg7Pjg5fjg6vjgrPjg7w=?= =?utf-8?b?44OJ44KS6L+95Yqg44CC?= Message-ID: <1272281793.432100.30588.nullmailer@users.sourceforge.jp> Revision: 3870 http://sourceforge.jp/projects/ttssh2/svn/view?view=rev&revision=3870 Author: yutakapon Date: 2010-04-26 20:36:33 +0900 (Mon, 26 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-24 04:12:01 UTC (rev 3869) +++ trunk/doc/ja/html/reference/sourcecode.html 2010-04-26 11:36:33 UTC (rev 3870) @@ -291,6 +291,8 @@

          ???????????

          + +

          ?????

          ?Windows????????????Administrator???????????????Windows Vista??????????????????????????????????????????メ?????メ??????????????????
          ???AC?????????J?メ????????????????????????????????????B????Microsoft?Visual Studio 2005??????????Z??????????????????????????
          ?
          @@ -330,7 +332,32 @@ ?????????????_s("secure")?????ォ?????????????????????????????????????????ANSI C??????
          ?
          ?????????????????Count???????????????"_TRUNCATE"??????????????????????????????A????????????????????? +

          +?????strncpy_s()?????ヲ????strncpy_s()??2??(numberOfElements)???????(\0)????????????????????????o????3???????????3??(strSource)?????5?????????2???????????buf[]??"he\0"???????? + +

          +char buf[3];
          +strncpy_s(buf, sizeof(buf), "hello", _TRUNCATE);
          +
          + +????strncat_s()?????ヲ??????????????????????????????????????????1??(strDest)?????null-terminate?????????????strncpy_s()??2??(numberOfElements)???????(\0)????????????????????????????????s????5????4????????????????2??????タ???????2??????????2?????????????I?"TeraTe"?4???2?????????????? +? +
          +char str[7];
          +str[0] = '\0';
          +strncat_s(str, sizeof(str), "Tera", _TRUNCATE);
          +strncat_s(str, sizeof(str), "Term", _TRUNCATE);
          +
          + +?????_snprintf_s()?????????? _snprintf() ??????????????null-terminate????????????????????????_snprintf_s()?????ヲ???????????buf[]??"ab\0"???????? + +
          +char buf[3];
          +_snprintf_s(buf, sizeof(buf), _TRUNCATE, "abcdef");
          +
          + +
          From svnnotify @ sourceforge.jp Mon Apr 26 21:06:23 2010 From: svnnotify @ sourceforge.jp (svnnotify @ sourceforge.jp) Date: Mon, 26 Apr 2010 21:06:23 +0900 Subject: [Ttssh2-commit] =?utf-8?b?WzM4NzFdICBXaW5kb3dzOTXjgrXjg53jg7w=?= =?utf-8?b?44OI44Gr44Gk44GE44Gm44CC?= Message-ID: <1272283583.924460.10534.nullmailer@users.sourceforge.jp> Revision: 3871 http://sourceforge.jp/projects/ttssh2/svn/view?view=rev&revision=3871 Author: yutakapon Date: 2010-04-26 21:06:23 +0900 (Mon, 26 Apr 2010) Log Message: ----------- Windows95?泣??若????????? 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-26 11:36:33 UTC (rev 3870) +++ trunk/doc/ja/html/reference/sourcecode.html 2010-04-26 12:06:23 UTC (rev 3871) @@ -363,6 +363,9 @@

          ????????Windows???????

          + +

          ????????????

          + ?Windows??????????????????????????????????????????????Windows??N??????????????????????????????????????
          ??????Windows2000?????? SetLayeredWindowAttributes() API????????AWindowsNT4.0?98????????????????ク???????????????????API????????ALoadLibrary()??????????????????
          @@ -392,6 +395,19 @@ ?????????????????????????|??????A?DLL??????????????????????L???????s???????????????????????B???????????????????A?????Windows?????????????????????Visual Studio????????????DLL?????????????DLL?????????? + +

          Windows 95

          + +Visual Studio 2005???????Windows 95???????????????????????Visual Studio 2005????????????Windows 95????????????????????Visual Studio 2008?? Windows 98 ? NT4.0 ?2000 ????????????Visual Studio 2010???????????Windows XP?????????????????????

          + +???Tera Term??Visual Studio 2005?????????????????????? Windows 95 ?????????????????????Microsoft????????????Microsoft????ョ??????????????
          +?????Visual Studio 2005 ??????????????????? IsDebuggerPresent ????????????????????? Windows 98 ?????????API??????Windows 95????????????????
          +????Windows 95????????? IsDebuggerPresent ???????????????????????????????????????????????comapt_w95.h"????????????B
          + +

          +