• R/O
  • HTTP
  • SSH
  • HTTPS

Commit

Tags
Keine Tags

Frequently used words (click to add to your profile)

javac++androidlinuxc#windowsobjective-ccocoa誰得qtpythonphprubygameguibathyscaphec計画中(planning stage)翻訳omegatframeworktwitterdomtestvb.netdirectxゲームエンジンbtronarduinopreviewer

FFFTPのソースコードです。


Commit MetaInfo

Revision19f7cced5712c402119825eb556f3dac6aee54f9 (tree)
Zeit2012-01-10 21:01:37
AutorYuji Tanaka <chibi_honu@user...>
CommiterYuji Tanaka

Log Message

Add support for HP NonStop Server

Ändern Zusammenfassung

Diff

Binary files a/FFFTP_Eng_Release/FFFTP.exe and b/FFFTP_Eng_Release/FFFTP.exe differ
Binary files a/Release/FFFTP.exe and b/Release/FFFTP.exe differ
--- a/Resource/FFFTP.rc
+++ b/Resource/FFFTP.rc
@@ -219,6 +219,7 @@ BEGIN
219219 MENUITEM "URLをクリップボードへ", MENU_URL_COPY
220220 MENUITEM "全てをダウンロード", MENU_DOWNLOAD_ALL
221221 MENUITEM "全てをアップロード", MENU_UPLOAD_ALL
222+ MENUITEM "OSS<->GUARDIAN 切り替え", MENU_SWITCH_OSS
222223 END
223224 END
224225
@@ -817,6 +818,19 @@ BEGIN
817818 LTEXT "の名前を変更してください。",-1,15,20,133,8
818819 END
819820
821+updown_as_with_ext_dlg DIALOGEX 0, 0, 187, 89
822+STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION
823+FONT 9, "MS Pゴシック", 0, 0, 0x0
824+BEGIN
825+ EDITTEXT UPDOWNAS_NEW,7,34,173,12,ES_AUTOHSCROLL
826+ LTEXT "",UPDOWNAS_TEXT,7,7,173,8,SS_NOPREFIX
827+ LTEXT "の名前を変更してください。",-1,15,20,133,8
828+ LTEXT "ファイルコード",-1,10,51,44,8
829+ EDITTEXT UPDOWNAS_FILECODE,55,49,21,12,ES_CENTER | ES_AUTOHSCROLL | ES_NUMBER
830+ DEFPUSHBUTTON "OK",IDOK,35,66,50,14
831+ PUSHBUTTON "中止(&S)",UPDOWNAS_STOP,101,66,50,14
832+END
833+
820834 re_passwd_dlg DIALOG 0, 0, 187, 62
821835 STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION
822836 CAPTION "パスワード"
@@ -1695,6 +1709,14 @@ BEGIN
16951709 BOTTOMMARGIN, 65
16961710 END
16971711
1712+ updown_as_with_ext_dlg, DIALOG
1713+ BEGIN
1714+ LEFTMARGIN, 7
1715+ RIGHTMARGIN, 180
1716+ TOPMARGIN, 7
1717+ BOTTOMMARGIN, 87
1718+ END
1719+
16981720 re_passwd_dlg, DIALOG
16991721 BEGIN
17001722 LEFTMARGIN, 7
--- a/Resource/resource.h
+++ b/Resource/resource.h
@@ -112,6 +112,7 @@
112112 #define hset_adv3_dlg 190
113113 #define savecrypt_dlg 191
114114 #define updatesslroot_dlg 192
115+#define updown_as_with_ext_dlg 193
115116 #define TRANS_TIME_BAR 1002
116117 #define TRANS_TEXT 1003
117118 #define TRANS_REMOTE 1003
@@ -358,6 +359,7 @@
358359 #define UPDOWNAS_TEXT 1113
359360 #define UPDOWNAS_NEW 1114
360361 #define UPDOWNAS_STOP 1115
362+#define UPDOWNAS_FILECODE 1116
361363 #define SEL_FNAME 1117
362364 #define SEL_REGEXP 1118
363365 #define SEL_NOEXIST 1119
@@ -616,6 +618,7 @@
616618 #define ID_BUTTON40173 40173
617619 #define ID_BUTTON40174 40174
618620 #define ID_BUTTON40175 40175
621+#define MENU_SWITCH_OSS 40176
619622 #define FSNOTIFY_TITLE 65535
620623 #define HOST_SIZEGRIP 65535
621624
@@ -624,7 +627,7 @@
624627 #ifdef APSTUDIO_INVOKED
625628 #ifndef APSTUDIO_READONLY_SYMBOLS
626629 #define _APS_NEXT_RESOURCE_VALUE 193
627-#define _APS_NEXT_COMMAND_VALUE 40176
630+#define _APS_NEXT_COMMAND_VALUE 40177
628631 #define _APS_NEXT_CONTROL_VALUE 1213
629632 #define _APS_NEXT_SYMED_VALUE 101
630633 #endif
--- a/Resource_eng/FFFTP-eng.rc
+++ b/Resource_eng/FFFTP-eng.rc
@@ -219,6 +219,7 @@ BEGIN
219219 MENUITEM "URL to clipboard", MENU_URL_COPY
220220 MENUITEM "Download all", MENU_DOWNLOAD_ALL
221221 MENUITEM "Upload all", MENU_UPLOAD_ALL
222+ MENUITEM "Switch OSS<->GUARDIAN", MENU_SWITCH_OSS
222223 END
223224 END
224225
@@ -824,6 +825,19 @@ BEGIN
824825 LTEXT "Enter new name",-1,7,7,133,8
825826 END
826827
828+updown_as_with_ext_dlg DIALOGEX 0, 0, 187, 89
829+STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION
830+FONT 9, "MS Sans Serif", 0, 0, 0x0
831+BEGIN
832+ EDITTEXT UPDOWNAS_NEW,7,34,173,12,ES_AUTOHSCROLL
833+ LTEXT "",UPDOWNAS_TEXT,7,7,173,8,SS_NOPREFIX
834+ LTEXT "Enter new name",-1,15,20,133,8
835+ LTEXT "File Code",-1,10,51,44,8
836+ EDITTEXT UPDOWNAS_FILECODE,55,49,21,12,ES_CENTER | ES_AUTOHSCROLL | ES_NUMBER
837+ DEFPUSHBUTTON "OK",IDOK,35,66,50,14
838+ PUSHBUTTON "Cancel",UPDOWNAS_STOP,101,66,50,14
839+END
840+
827841 re_passwd_dlg DIALOG 0, 0, 187, 62
828842 STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION
829843 CAPTION "Password"
@@ -1723,6 +1737,14 @@ BEGIN
17231737 BOTTOMMARGIN, 65
17241738 END
17251739
1740+ updown_as_with_ext_dlg, DIALOG
1741+ BEGIN
1742+ LEFTMARGIN, 7
1743+ RIGHTMARGIN, 180
1744+ TOPMARGIN, 7
1745+ BOTTOMMARGIN, 87
1746+ END
1747+
17261748 re_passwd_dlg, DIALOG
17271749 BEGIN
17281750 LEFTMARGIN, 7
--- a/Resource_eng/resource.h
+++ b/Resource_eng/resource.h
@@ -112,6 +112,7 @@
112112 #define hset_adv3_dlg 190
113113 #define savecrypt_dlg 191
114114 #define updatesslroot_dlg 192
115+#define updown_as_with_ext_dlg 193
115116 #define TRANS_TIME_BAR 1002
116117 #define TRANS_TEXT 1003
117118 #define TRANS_REMOTE 1003
@@ -358,6 +359,7 @@
358359 #define UPDOWNAS_TEXT 1113
359360 #define UPDOWNAS_NEW 1114
360361 #define UPDOWNAS_STOP 1115
362+#define UPDOWNAS_FILECODE 1116
361363 #define SEL_FNAME 1117
362364 #define SEL_REGEXP 1118
363365 #define SEL_NOEXIST 1119
@@ -616,6 +618,7 @@
616618 #define ID_BUTTON40173 40173
617619 #define ID_BUTTON40174 40174
618620 #define ID_BUTTON40175 40175
621+#define MENU_SWITCH_OSS 40176
619622 #define FSNOTIFY_TITLE 65535
620623 #define HOST_SIZEGRIP 65535
621624
@@ -624,7 +627,7 @@
624627 #ifdef APSTUDIO_INVOKED
625628 #ifndef APSTUDIO_READONLY_SYMBOLS
626629 #define _APS_NEXT_RESOURCE_VALUE 193
627-#define _APS_NEXT_COMMAND_VALUE 40176
630+#define _APS_NEXT_COMMAND_VALUE 40177
628631 #define _APS_NEXT_CONTROL_VALUE 1213
629632 #define _APS_NEXT_SYMED_VALUE 101
630633 #endif
--- a/common.h
+++ b/common.h
@@ -150,6 +150,11 @@
150150 #define CHMOD_CMD_NOR "SITE CHMOD" /* 属性変更コマンド */
151151 #define PORT_NOR 21 /* ポート番号 */
152152 #define LS_FNAME "-alL" /* NLSTに付けるもの */
153+#if defined(HAVE_TANDEM)
154+#define DEF_PRIEXT 4 /* Primary Extents の初期値 */
155+#define DEF_SECEXT 28 /* Secondary Extents の初期値 */
156+#define DEF_MAXEXT 978 /* Max Extents の初期値 */
157+#endif
153158
154159 /*===== 同じ名前のファイルがあった時の処理 =====*/
155160
@@ -301,6 +306,9 @@
301306 #define LIST_UNIX_16 48 /* UNIX 16 */
302307 // MLSD対応
303308 #define LIST_MLSD 49
309+#if defined(HAVE_TANDEM)
310+#define LIST_TANDEM 50 /* HP NonStop Server */
311+#endif
304312
305313 #define LIST_MELCOM 0x100 /* MELCOM80 */
306314
@@ -682,6 +690,13 @@ LIST_UNIX_70
682690 drwxr-x--- 3 root root 4096 2011-12-06 23:39 ..
683691 -rw-r----- 1 root root 251 2011-12-06 23:39 .hoge
684692
693+*LIST_TANDEM
694+ 0 1 2 3 4 5 6
695+ ---------------------------------------------------------------
696+ File Code EOF Last Modification Owner RWEP
697+ EMSACSTM 101 146 18-Sep-00 09:03:37 170,175 "nunu"
698+ TACLCSTM O 101 101 4-Mar-01 23:50:06 255,255 "oooo"
699+
685700 ------------------------------------*/
686701
687702 /*===== 接続ウインドウの形式 =====*/
@@ -762,6 +777,9 @@ LIST_UNIX_70
762777 #define HTYPE_STRATUS 5 /* Stratus */
763778 #define HTYPE_AGILENT 6 /* Agilent Logic analyzer */
764779 #define HTYPE_SHIBASOKU 7 /* Shibasoku LSI test system */
780+#if defined(HAVE_TANDEM)
781+#define HTYPE_TANDEM 8 /* HP NonStop Server */
782+#endif
765783
766784 /*===== コマンドラインオプション =====*/
767785
@@ -1066,6 +1084,12 @@ typedef struct transpacket {
10661084 int KanjiCodeDesired; /* ローカルの漢字コード (KANJI_xxx) */
10671085 int KanaCnv; /* 半角カナを全角に変換(YES/NO) */
10681086 int Mode; /* 転送モード (EXIST_xxx) */
1087+#if defined(HAVE_TANDEM)
1088+ int FileCode; /* ファイルコード */
1089+ int PriExt; /* Primary Extents */
1090+ int SecExt; /* Secondary Extents */
1091+ int MaxExt; /* Max Extents */
1092+#endif
10691093 HWND hWndTrans; /* 転送中ダイアログのウインドウハンドル */
10701094 int Abort; /* 転送中止フラグ (ABORT_xxx) */
10711095 // 同時接続対応
@@ -1456,6 +1480,11 @@ int AskShareProh(void);
14561480 void DisconnectProc(void);
14571481 void DisconnectSet(void);
14581482 int AskConnecting(void);
1483+#if defined(HAVE_TANDEM)
1484+int AskRealHostType(void);
1485+int SetOSS(int wkOss);
1486+int AskOSS(void);
1487+#endif
14591488 SOCKET connectsock(char *host, int port, char *PreMsg, int *CancelCheckWork);
14601489 // IPv6対応
14611490 SOCKET connectsockIPv4(char *host, int port, char *PreMsg, int *CancelCheckWork);
@@ -1574,6 +1603,9 @@ int DoQUOTE(char *CmdStr);
15741603 SOCKET DoClose(SOCKET Sock);
15751604 int DoQUIT(SOCKET ctrl_skt);
15761605 int DoDirListCmdSkt(char *AddOpt, char *Path, int Num, int *CancelCheckWork);
1606+#if defined(HAVE_TANDEM)
1607+void SwitchOSSProc(void);
1608+#endif
15771609 int CommandProcCmd(char *Reply, char *fmt, ...);
15781610 // 同時接続対応
15791611 //int CommandProcTrn(char *Reply, char *fmt, ...);
@@ -1747,6 +1779,9 @@ char *MakeNumString(LONGLONG Num, char *Buf, BOOL Comma);
17471779 char* MakeDistinguishableFileName(char* Out, char* In);
17481780 // 環境依存の不具合対策
17491781 char* GetAppTempPath(char* Buf);
1782+#if defined(HAVE_TANDEM)
1783+void CalcExtentSize(TRANSPACKET *Pkt, LONGLONG Size);
1784+#endif
17501785
17511786 /*===== dlgsize.c =====*/
17521787
--- a/config.h
+++ b/config.h
@@ -20,3 +20,6 @@
2020 // ファイル転送の同時接続数
2121 #define MAX_DATA_CONNECTION 4
2222
23+/* HP NonStop Server 用のコードを有効にする */
24+#define HAVE_TANDEM
25+
--- a/connect.c
+++ b/connect.c
@@ -123,6 +123,9 @@ static const struct in6_addr IN6ADDR_NONE = {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff
123123 static int UseIPadrs;
124124 static char DomainName[HOST_ADRS_LEN+1];
125125
126+#if defined(HAVE_TANDEM)
127+static int Oss = NO; /* OSS ファイルシステムへアクセスしている場合は YES */
128+#endif
126129
127130
128131
@@ -895,6 +898,14 @@ int AskHostType(void)
895898 if(AskCurrentHost() != HOSTNUM_NOENTRY)
896899 CopyHostFromListInConnect(AskCurrentHost(), &CurHost);
897900
901+#if defined(HAVE_TANDEM)
902+ /* OSS ファイルシステムは UNIX ファイルシステムと同じでいいので AUTO を返す
903+ ただし、Guardian ファイルシステムに戻ったときにおかしくならないように
904+ CurHost.HostType 変数は更新しない */
905+ if(CurHost.HostType == HTYPE_TANDEM && Oss == YES)
906+ return(HTYPE_AUTO);
907+#endif
908+
898909 return(CurHost.HostType);
899910 }
900911
@@ -1316,6 +1327,55 @@ int AskConnecting(void)
13161327 }
13171328
13181329
1330+#if defined(HAVE_TANDEM)
1331+/*----- 接続している本当のホストのホストタイプを返す --------------------------
1332+*
1333+* Parameter
1334+* なし
1335+*
1336+* Return Value
1337+* char *ファイル名/オプション
1338+*----------------------------------------------------------------------------*/
1339+
1340+int AskRealHostType(void)
1341+{
1342+ if(AskCurrentHost() != HOSTNUM_NOENTRY)
1343+ CopyHostFromListInConnect(AskCurrentHost(), &CurHost);
1344+
1345+ return(CurHost.HostType);
1346+}
1347+
1348+/*----- OSS ファイルシステムにアクセスしているかどうかのフラグを変更する ------
1349+*
1350+* Parameter
1351+* int ステータス (YES/NO)
1352+*
1353+* Return Value
1354+* int ステータス (YES/NO)
1355+*----------------------------------------------------------------------------*/
1356+
1357+int SetOSS(int wkOss)
1358+{
1359+ Oss = wkOss;
1360+ return(Oss);
1361+}
1362+
1363+/*----- OSS ファイルシステムにアクセスしているかどうかを返す ------------------
1364+*
1365+* Parameter
1366+* なし
1367+*
1368+* Return Value
1369+* int ステータス (YES/NO)
1370+*----------------------------------------------------------------------------*/
1371+
1372+int AskOSS(void)
1373+{
1374+ return(Oss);
1375+}
1376+#endif /* HAVE_TANDEM */
1377+
1378+
13191379 /*----- ホストへ接続する ------------------------------------------------------
13201380 *
13211381 * Parameter
--- /dev/null
+++ b/doc/eng/FFFTP_hpnonstop.txt
@@ -0,0 +1,67 @@
1+Overview
2+---------------------
3+
4+This is a supplemental document for HP NonStop Server.
5+
6+FFFTP supports Guardian and OSS environments. You can switch their
7+environments.
8+
9+How to use ?
10+---------------------
11+
12+Please specify the "NonStop Server" as "Host Type" of "Host Setting" -
13+"Special" tab.
14+
15+HP NonStop Server special features are implemented in right button menu.
16+
17+How to switch Guardian and OSS environments ?
18+---------------------------------------------------------------
19+
20+Please choose "OSS <-> Guardian Switch(O)" in right button menu at
21+remote window.
22+
23+How to move VOL/SUBVOL in Guardian environment ?
24+---------------------------------------------------------------
25+
26+Please input VOL/SUBVOL directly by clicking the "Change Folder" Icon
27+(Next to Up button in remote window). Up button is ignored although
28+the error message is not shown.
29+
30+- How to specify the file code for uploading to Guardian environment ?
31+
32+Please choose "Upload As..." in right button menu at local window.
33+You can specify the file code at Upload As dialog.
34+
35+Tips for Guardian environment
36+---------------------------------------------------------------
37+
38+When you upload to Guardian environment by "Filename Depend", "ASCII
39+mode Filenames" setting is used. So it is useful that "*.c/*.h/*.config/
40+*.pl" are added to ASCII mode Filenames of "Option - Transfer1".
41+This is a global setting.
42+
43+When ASCII mode filenames are uploaded to Guardian environment, ASCII
44+mode transfer is choosen. Otherwise, binary mode transfer is choosen.
45+
46+EXTENT and MAXEXTENTS
47+---------------------------------------------------------------
48+
49+HP Default FTPSERV program creates a file with EXT (4,28) MAXEXTENTS 978
50+as a default. When the file size is over than it, upload operation fails
51+with File Full (Error 45).
52+
53+FFFTP calculates the EXTENT and MAXEXTENT automatically when uploading
54+to Guardian environment with binary mode transfer.
55+
56+Target used ratio is 75 % and MAXEXTENTS is maximum (978). But NonStop
57+NS Series or later adjusts the EXTENT and MAXEXTENTS when it is not
58+multiples of 14. So it may be that the target used ratio is not accurate.
59+
60+When you wonder the EXTENT and MAXEXTENT size, you can see the calculated
61+size by FFFTP at console window as the follows.
62+
63+ STOR Filename,FileCode,Primary,Secondary,MaxExtents
64+
65+When an append mode transfer is used, EXTENT and MAXEXTENS are not
66+specified. This is a limitation at this version.
67+
--- /dev/null
+++ b/doc/jpn/FFFTP_hpnonstop.txt
@@ -0,0 +1,60 @@
1+●概要
2+
3+HP NonStop Server 対応の補足ドキュメントです
4+
5+Guardian & OSS の両方に対応しており、切り替えができます
6+
7+●使い方
8+
9+HP NonStop Server の場合は「ホスト設定→高度」から「ホストの種類」で
10+NonStop Server を選んでください。NonStop Server特有の動作は右ボタン
11+メニューとして実装されています。
12+
13+- Guardian と OSS を切り替える
14+
15+リモートリストが表示されているウィンドウで右ボタンを押すと表示される
16+メニューから「OSS<->Guardian 切り替え」を選択してください。
17+
18+- Guardian 環境で VOL/SUBVOLを切り替える
19+
20+ディレクトリの直接移動のアイコン(上のディレクトリのアイコンの隣)を押
21+して$VOL.SUBVOLを直接入力してください。上のディレクトリアイコンは(押
22+せますが)動作しません。
23+
24+- Guardian 環境へアップロードするときのファイルコードを指定する
25+
26+ローカルリストが表示されているウィンドウで右ボタンを押すと表示されるメ
27+ニューから「名前を変更してアップロード」を選択するとファイルコードを指
28+定してアップロードすることができます。
29+
30+- Guardian 環境で便利に使うには
31+
32+「環境設定→転送1」で「アスキーモードのファイル名」に「*.c/*.h/*.config/
33+*.pl」を追加しておくとGuardian環境にアップロードするとき自動判別転送でア
34+スキーモードになり、ファイルコードが101になりますので追加しておくことを
35+お勧めします。ダウンロード時はファイルコードをみてファイルコードが101な
36+ら ASCII モード、それ以外ならバイナリモードで転送されます。
37+
38+●EXTENTサイズとMAXEXTENTサイズについて
39+
40+FTPプロトコルでGuardian環境にファイルをアップロードするときFTPサーバがデ
41+フォルトで EXT (4,28) MAXEXTENTS 978 のファイルを作成します。これを超え
42+るファイルをアップロードしようとすると File Full (Error 45) となります。
43+
44+FFFTPではGuardian環境にバイナリモードでファイルをアップロードするときに
45+EXTENTサイズとMAXEXTENTサイズを自動計算してアップロードするようになって
46+います。
47+
48+MAXEXTENTSは最大(978)、75%の使用率を目指して計算していますが NS Series
49+以降はEXTENTサイズが14の倍数でないとき、システム側で自動的にEXTENTサイ
50+ズやMAXEXTENTサイズの調整を行います。必ずしも指定されたEXTENTで作成され
51+るわけではありませんのでご留意ください。
52+
53+なお、計算したEXT、MAXEXTENTサイズはコンソールウィンドウで以下のように
54+表示されています。計算結果が気になる方はご確認ください。
55+
56+STOR ファイル名,FileCode,Primary,Secondary,MaxExtents
57+
58+ファイルを再作成しないとEXTENTサイズは変更できないため、追記モードでは
59+自動計算しないようになっています。
60+
--- a/filelist.c
+++ b/filelist.c
@@ -898,6 +898,11 @@ static LRESULT FileListCommonWndProc(HWND hWnd, UINT message, WPARAM wParam, LPA
898898
899899 }
900900
901+#if defined(HAVE_TANDEM)
902+ if(FileListBaseNoExpand == NULL)
903+ pf = FileListBase;
904+ else
905+#endif
901906 pf = FileListBaseNoExpand;
902907 for (filenum = 0; pf ; filenum++) {
903908 pf = pf->Next;
@@ -1507,6 +1512,11 @@ static void AddDispFileList(FLISTANCHOR *Anchor, char *Name, FILETIME *Time, LON
15071512 {
15081513 if((((Sort & SORT_MASK_ORD) == SORT_EXT) &&
15091514 ((Cmp = _mbsicmp(GetFileExt(Name), GetFileExt(Pos->File))) < 0)) ||
1515+#if defined(HAVE_TANDEM)
1516+ ((AskHostType() == HTYPE_TANDEM) &&
1517+ ((Sort & SORT_MASK_ORD) == SORT_EXT) &&
1518+ ((Cmp = Attr - Pos->Attr) < 0)) ||
1519+#endif
15101520 (((Sort & SORT_MASK_ORD) == SORT_SIZE) &&
15111521 ((Cmp = Size - Pos->Size) < 0)) ||
15121522 (((Sort & SORT_MASK_ORD) == SORT_DATE) &&
@@ -1525,6 +1535,11 @@ static void AddDispFileList(FLISTANCHOR *Anchor, char *Name, FILETIME *Time, LON
15251535 {
15261536 if((((Sort & SORT_MASK_ORD) == SORT_EXT) &&
15271537 ((Cmp = _mbsicmp(GetFileExt(Name), GetFileExt(Pos->File))) > 0)) ||
1538+#if defined(HAVE_TANDEM)
1539+ ((AskHostType() == HTYPE_TANDEM) &&
1540+ ((Sort & SORT_MASK_ORD) == SORT_EXT) &&
1541+ ((Cmp = Attr - Pos->Attr) > 0)) ||
1542+#endif
15281543 (((Sort & SORT_MASK_ORD) == SORT_SIZE) &&
15291544 ((Cmp = Size - Pos->Size) > 0)) ||
15301545 (((Sort & SORT_MASK_ORD) == SORT_DATE) &&
@@ -1705,6 +1720,12 @@ static void AddListView(HWND hWnd, int Pos, char *Name, int Type, LONGLONG Size,
17051720 LvItem.mask = LVIF_TEXT;
17061721 LvItem.iItem = Pos;
17071722 LvItem.iSubItem = 3;
1723+#if defined(HAVE_TANDEM)
1724+ if (AskHostType() == HTYPE_TANDEM) {
1725+ _itoa_s(Attr, Tmp, sizeof(Tmp), 10);
1726+ LvItem.pszText = Tmp;
1727+ } else
1728+#endif
17081729 LvItem.pszText = GetFileExt(Name);
17091730 LvItem.iItem = SendMessage(hWnd, LVM_SETITEM, 0, (LPARAM)&LvItem);
17101731
@@ -1712,7 +1733,11 @@ static void AddListView(HWND hWnd, int Pos, char *Name, int Type, LONGLONG Size,
17121733 {
17131734 /* 属性 */
17141735 strcpy(Tmp, "");
1736+#if defined(HAVE_TANDEM)
1737+ if((InfoExist & FINFO_ATTR) && (AskHostType() != HTYPE_TANDEM))
1738+#else
17151739 if(InfoExist & FINFO_ATTR)
1740+#endif
17161741 AttrValue2String(Attr, Tmp);
17171742 LvItem.mask = LVIF_TEXT;
17181743 LvItem.iItem = Pos;
@@ -2337,6 +2362,13 @@ int GetNodeSize(int Win, int Pos, LONGLONG *Buf)
23372362 SendMessage(hWnd, LVM_GETITEM, 0, (LPARAM)&LvItem);
23382363 *Buf = -1;
23392364 Ret = NO;
2365+#if defined(HAVE_TANDEM)
2366+ if(AskHostType() == HTYPE_TANDEM) {
2367+ RemoveComma(Tmp);
2368+ *Buf = _atoi64(Tmp);
2369+ Ret = YES;
2370+ } else
2371+#endif
23402372 if(strlen(Tmp) > 0)
23412373 {
23422374 RemoveComma(Tmp);
@@ -2371,12 +2403,22 @@ int GetNodeAttr(int Win, int Pos, int *Buf)
23712403 {
23722404 LvItem.mask = LVIF_TEXT;
23732405 LvItem.iItem = Pos;
2406+#if defined(HAVE_TANDEM)
2407+ if(AskHostType() == HTYPE_TANDEM)
2408+ LvItem.iSubItem = 3;
2409+ else
2410+#endif
23742411 LvItem.iSubItem = 4;
23752412 LvItem.pszText = Tmp;
23762413 LvItem.cchTextMax = 20;
23772414 SendMessage(GetRemoteHwnd(), LVM_GETITEM, 0, (LPARAM)&LvItem);
23782415 if(strlen(Tmp) > 0)
23792416 {
2417+#if defined(HAVE_TANDEM)
2418+ if(AskHostType() == HTYPE_TANDEM)
2419+ *Buf = atoi(Tmp);
2420+ else
2421+#endif
23802422 *Buf = AttrString2Value(Tmp);
23812423 Ret = YES;
23822424 }
@@ -2679,10 +2721,19 @@ void MakeDroppedFileList(WPARAM wParam, char *Cur, FILELIST **Base)
26792721 strcpy(Pkt.File, GetFileName(Name));
26802722
26812723 memset(&Pkt.Time, 0, sizeof(FILETIME));
2724+#if defined(HAVE_TANDEM)
2725+ /* Guardian スペースへのアップロードのためにサイズが必要 */
2726+ Pkt.Size = 0;
2727+ Pkt.InfoExist = 0;
2728+#endif
26822729 if((fHnd = FindFirstFile(Name, &Find)) != INVALID_HANDLE_VALUE)
26832730 {
26842731 FindClose(fHnd);
26852732 Pkt.Time = Find.ftLastWriteTime;
2733+#if defined(HAVE_TANDEM)
2734+ Pkt.Size = MakeLongLong(Find.nFileSizeHigh, Find.nFileSizeLow);
2735+ Pkt.InfoExist |= (FINFO_TIME | FINFO_DATE | FINFO_SIZE);
2736+#endif
26862737 }
26872738 AddFileList(&Pkt, Base);
26882739 }
@@ -3713,6 +3764,20 @@ static int AnalizeFileInfo(char *Str)
37133764 }
37143765 }
37153766 }
3767+#if defined(HAVE_TANDEM)
3768+ /* 以下のフォーマットをチェック */
3769+ /* LIST_TANDEM */
3770+
3771+ /* OSS の場合は自動判別可能のため Ret == LIST_UNKNOWN のチェックは後 */
3772+ if(AskRealHostType() == HTYPE_TANDEM) {
3773+ if(Ret == LIST_UNKNOWN) {
3774+ SetOSS(NO);
3775+ Ret = LIST_TANDEM;
3776+ } else {
3777+ SetOSS(YES);
3778+ }
3779+ }
3780+#endif
37163781
37173782 // MLSD対応
37183783 if(Ret == LIST_UNKNOWN)
@@ -4719,6 +4784,66 @@ static int ResolvFileInfo(char *Str, int ListType, char *Fname, LONGLONG *Size,
47194784 }
47204785 break;
47214786
4787+#if defined(HAVE_TANDEM)
4788+ case LIST_TANDEM :
4789+ *InfoExist |= (FINFO_TIME | FINFO_DATE | FINFO_SIZE | FINFO_ATTR);
4790+ /* Open 中だったらずらす */
4791+ if(FindField(Str, Buf, 1, NO) != FFFTP_SUCCESS)
4792+ break;
4793+ if (!strncmp(Buf, "O", 1)) {
4794+ offs = 1;
4795+ }
4796+ /* 日付 */
4797+ if(FindField(Str, Buf, 3 + offs, NO) != FFFTP_SUCCESS)
4798+ break;
4799+ if (Buf[1] == '-') { /* 日付が 1桁 */
4800+ sTime.wYear = Assume1900or2000(atoi(Buf + 6));
4801+ Buf[5] = 0;
4802+ GetMonth(Buf+2, &sTime.wMonth, &sTime.wDay); /* wDayは常に0 */
4803+ sTime.wDay = atoi(Buf);
4804+ sTime.wDayOfWeek = 0;
4805+ } else {
4806+ sTime.wYear = Assume1900or2000(atoi(Buf + 7));
4807+ Buf[6] = 0;
4808+ GetMonth(Buf+3, &sTime.wMonth, &sTime.wDay); /* wDayは常に0 */
4809+ sTime.wDay = atoi(Buf);
4810+ sTime.wDayOfWeek = 0;
4811+ }
4812+ /* 時刻 */
4813+ FindField(Str, Buf, 4 + offs, NO);
4814+ sTime.wHour = atoi(Buf);
4815+ sTime.wMinute = atoi(Buf+3);
4816+ sTime.wSecond = atoi(Buf+6);
4817+ sTime.wMilliseconds = 0;
4818+ SystemTimeToFileTime(&sTime, Time);
4819+ SpecificLocalFileTime2FileTime(Time, AskHostTimeZone());
4820+
4821+ /* 属性 セキュリティではなく FileCode を保存する */
4822+ FindField(Str, Buf, 1 + offs, NO);
4823+ *Attr = atoi(Buf);
4824+ /* サイズ */
4825+ FindField(Str, Buf, 2 + offs, NO);
4826+ *Size = _atoi64(Buf);
4827+ /* オーナ名 */
4828+ if(FindField(Str, Buf, 5 + offs, NO) == FFFTP_SUCCESS) {
4829+ if(strncmp(Buf, "Owner", sizeof("Owner"))) {
4830+ memset(Owner, NUL, OWNER_NAME_LEN+1);
4831+ strncpy(Owner, Buf, OWNER_NAME_LEN);
4832+ /* 通常は 255,255 だが、20, 33 などにも対応する */
4833+ /* 最後の文字が , だったら後ろとつなげる */
4834+ if (Buf[strlen(Buf)-1] == ',') {
4835+ FindField(Str, Buf, 6 + offs, NO);
4836+ strncat(Owner, Buf, OWNER_NAME_LEN - strlen(Buf));
4837+ }
4838+ /* ファイル名 */
4839+ if(FindField(Str, Fname, 0, NO) == FFFTP_SUCCESS) {
4840+ Ret = NODE_FILE;
4841+ }
4842+ }
4843+ }
4844+ break;
4845+#endif
4846+
47224847 case LIST_UNIX_10 :
47234848 case LIST_UNIX_11 :
47244849 case LIST_UNIX_12 :
--- a/ftpproc.c
+++ b/ftpproc.c
@@ -75,6 +75,9 @@ static int AskUpLoadFileAttr(char *Fname);
7575 // 64ビット対応
7676 //static BOOL CALLBACK UpDownAsDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);
7777 static INT_PTR CALLBACK UpDownAsDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);
78+#if defined(HAVE_TANDEM)
79+static INT_PTR CALLBACK UpDownAsWithExtDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);
80+#endif
7881 static void DeleteAllDir(FILELIST *Dt, int Win, int *Sw, int *Flg, char *CurDir);
7982 static void DelNotifyAndDo(FILELIST *Dt, int Win, int *Sw, int *Flg, char *CurDir);
8083 // 64ビット対応
@@ -109,6 +112,9 @@ extern int CancelFlg;
109112 /*===== ローカルなワーク =====*/
110113
111114 static char TmpString[FMAX_PATH+80]; /* テンポラリ */
115+#if defined(HAVE_TANDEM)
116+static char TmpFileCode[5]; /* テンポラリ */
117+#endif
112118 static int CurWin; /* ウインドウ番号 */
113119
114120 int UpExistMode = EXIST_OVW; /* アップロードで同じ名前のファイルがある時の扱い方 EXIST_xxx */
@@ -217,6 +223,19 @@ void DownLoadProc(int ChName, int ForceFile, int All)
217223 }
218224
219225 strcpy(Pkt.Cmd, "RETR ");
226+#if defined(HAVE_TANDEM)
227+ if(AskHostType() == HTYPE_TANDEM) {
228+ if(AskTransferType() != TYPE_X) {
229+ Pkt.Type = AskTransferType();
230+ } else {
231+ Pkt.Attr = Pos->Attr;
232+ if (Pkt.Attr == 101)
233+ Pkt.Type = TYPE_A;
234+ else
235+ Pkt.Type = TYPE_I;
236+ }
237+ } else
238+#endif
220239 Pkt.Type = AskTransferTypeAssoc(Pkt.RemoteFile, AskTransferType());
221240 Pkt.Size = Pos->Size;
222241 Pkt.Time = Pos->Time;
@@ -911,12 +930,29 @@ void UpLoadListProc(int ChName, int All)
911930 _mbslwr(Cat);
912931 else if(FnameCnv == FNAME_UPPER)
913932 _mbsupr(Cat);
933+#if defined(HAVE_TANDEM)
934+ Pkt.FileCode = 0;
935+ Pkt.PriExt = DEF_PRIEXT;
936+ Pkt.SecExt = DEF_SECEXT;
937+ Pkt.MaxExt = DEF_MAXEXT;
938+#endif
914939 }
915940 else
916941 {
917942 // 名前を変更する
918943 strcpy(TmpString, Pos->File);
919944 CurWin = WIN_LOCAL;
945+#if defined(HAVE_TANDEM)
946+ strcpy(TmpFileCode, "0"); /* ASCII モードの場合は無視される */
947+ if(AskHostType() == HTYPE_TANDEM && AskOSS() == NO) {
948+ if(DialogBox(GetFtpInst(), MAKEINTRESOURCE(updown_as_with_ext_dlg), GetMainHwnd(), UpDownAsWithExtDialogCallBack) == YES) {
949+ strcat(Pkt.RemoteFile, TmpString);
950+ Pkt.FileCode = atoi(TmpFileCode);
951+ } else {
952+ break;
953+ }
954+ } else
955+#endif
920956 if(DialogBox(GetFtpInst(), MAKEINTRESOURCE(updown_as_dlg), GetMainHwnd(), UpDownAsDialogCallBack) == YES)
921957 strcat(Pkt.RemoteFile, TmpString);
922958 else
@@ -985,6 +1021,11 @@ void UpLoadListProc(int ChName, int All)
9851021 // UTF-8対応
9861022 Pkt.KanjiCodeDesired = AskLocalKanjiCode();
9871023 Pkt.KanaCnv = AskHostKanaCnv();
1024+#if defined(HAVE_TANDEM)
1025+ if(AskHostType() == HTYPE_TANDEM && AskOSS() == NO) {
1026+ CalcExtentSize(&Pkt, Pos->Size);
1027+ }
1028+#endif
9881029 Pkt.Mode = CheckRemoteFile(&Pkt, RemoteList);
9891030 if(Pkt.Mode == EXIST_ABORT)
9901031 break;
@@ -1079,6 +1120,12 @@ void UpLoadDragProc(WPARAM wParam)
10791120 else if(FnameCnv == FNAME_UPPER)
10801121 _mbsupr(Cat);
10811122 ReplaceAll(Pkt.RemoteFile, '\\', '/');
1123+#if defined(HAVE_TANDEM)
1124+ Pkt.FileCode = 0;
1125+ Pkt.PriExt = DEF_PRIEXT;
1126+ Pkt.SecExt = DEF_SECEXT;
1127+ Pkt.MaxExt = DEF_MAXEXT;
1128+#endif
10821129
10831130 if(AskHostType() == HTYPE_ACOS)
10841131 {
@@ -1140,6 +1187,12 @@ void UpLoadDragProc(WPARAM wParam)
11401187 // UTF-8対応
11411188 Pkt.KanjiCodeDesired = AskLocalKanjiCode();
11421189 Pkt.KanaCnv = AskHostKanaCnv();
1190+#if defined(HAVE_TANDEM)
1191+ if(AskHostType() == HTYPE_TANDEM && AskOSS() == NO) {
1192+ int a = Pos->InfoExist && FINFO_SIZE;
1193+ CalcExtentSize(&Pkt, Pos->Size);
1194+ }
1195+#endif
11431196 Pkt.Mode = CheckRemoteFile(&Pkt, RemoteList);
11441197 if(Pkt.Mode == EXIST_ABORT)
11451198 break;
@@ -1411,6 +1464,11 @@ void MirrorUploadProc(int Notify)
14111464 // UTF-8対応
14121465 Pkt.KanjiCodeDesired = AskLocalKanjiCode();
14131466 Pkt.KanaCnv = AskHostKanaCnv();
1467+#if defined(HAVE_TANDEM)
1468+ if(AskHostType() == HTYPE_TANDEM && AskOSS() == NO) {
1469+ CalcExtentSize(&Pkt, LocalPos->Size);
1470+ }
1471+#endif
14141472 Pkt.Mode = EXIST_OVW;
14151473 AddTmpTransFileList(&Pkt, &Base);
14161474 }
@@ -1815,13 +1873,26 @@ static int AskUpLoadFileAttr(char *Fname)
18151873 static int CheckRemoteFile(TRANSPACKET *Pkt, FILELIST *ListList)
18161874 {
18171875 int Ret;
1876+#if defined(HAVE_TANDEM)
1877+ int Mode;
1878+#endif
18181879 FILELIST *Exist;
18191880
18201881 Ret = EXIST_OVW;
18211882 Pkt->ExistSize = 0;
18221883 if(SendMode != TRANS_OVW)
18231884 {
1885+#if defined(HAVE_TANDEM)
1886+ /* HP NonStop Server は大文字小文字の区別なし(すべて大文字) */
1887+ if(AskHostType() == HTYPE_TANDEM)
1888+ Mode = COMP_IGNORE;
1889+ else
1890+ Mode = COMP_STRICT;
1891+
1892+ if((Exist = SearchFileList(GetFileName(Pkt->RemoteFile), ListList, Mode)) != NULL)
1893+#else
18241894 if((Exist = SearchFileList(GetFileName(Pkt->RemoteFile), ListList, COMP_STRICT)) != NULL)
1895+#endif
18251896 {
18261897 Pkt->ExistSize = Exist->Size;
18271898
@@ -1965,6 +2036,57 @@ static INT_PTR CALLBACK UpDownAsDialogCallBack(HWND hDlg, UINT iMessage, WPARAM
19652036 }
19662037
19672038
2039+#if defined(HAVE_TANDEM)
2040+/*----- アップロード/ダウンロードファイル名入力ダイアログのコールバック ------
2041+*
2042+* Parameter
2043+* HWND hDlg : ウインドウハンドル
2044+* UINT message : メッセージ番号
2045+* WPARAM wParam : メッセージの WPARAM 引数
2046+* LPARAM lParam : メッセージの LPARAM 引数
2047+*
2048+* Return Value
2049+* BOOL TRUE/FALSE
2050+*----------------------------------------------------------------------------*/
2051+
2052+static INT_PTR CALLBACK UpDownAsWithExtDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam)
2053+{
2054+ switch (iMessage)
2055+ {
2056+ case WM_INITDIALOG :
2057+ if(CurWin == WIN_LOCAL)
2058+ SendMessage(hDlg, WM_SETTEXT, 0, (LPARAM)MSGJPN064);
2059+ else
2060+ SendMessage(hDlg, WM_SETTEXT, 0, (LPARAM)MSGJPN065);
2061+
2062+ SendDlgItemMessage(hDlg, UPDOWNAS_NEW, EM_LIMITTEXT, FMAX_PATH, 0);
2063+ SendDlgItemMessage(hDlg, UPDOWNAS_NEW, WM_SETTEXT, 0, (LPARAM)TmpString);
2064+ SendDlgItemMessage(hDlg, UPDOWNAS_TEXT, WM_SETTEXT, 0, (LPARAM)TmpString);
2065+ SendDlgItemMessage(hDlg, UPDOWNAS_FILECODE, EM_LIMITTEXT, 4, 0);
2066+ SendDlgItemMessage(hDlg, UPDOWNAS_FILECODE, WM_SETTEXT, 0, (LPARAM)TmpFileCode);
2067+
2068+ return(TRUE);
2069+
2070+ case WM_COMMAND :
2071+ switch(GET_WM_COMMAND_ID(wParam, lParam))
2072+ {
2073+ case IDOK :
2074+ SendDlgItemMessage(hDlg, UPDOWNAS_NEW, WM_GETTEXT, FMAX_PATH, (LPARAM)TmpString);
2075+ SendDlgItemMessage(hDlg, UPDOWNAS_FILECODE, WM_GETTEXT, FMAX_PATH, (LPARAM)TmpFileCode);
2076+ EndDialog(hDlg, YES);
2077+ break;
2078+
2079+ case UPDOWNAS_STOP :
2080+ EndDialog(hDlg, NO_ALL);
2081+ break;
2082+ }
2083+ return(TRUE);
2084+ }
2085+ return(FALSE);
2086+}
2087+#endif
2088+
2089+
19682090 /*----- ファイル一覧で指定されたファイルを削除する ----------------------------
19692091 *
19702092 * Parameter
--- a/getput.c
+++ b/getput.c
@@ -2286,6 +2286,12 @@ static void DispDownloadFinishMsg(TRANSPACKET *Pkt, int iRetCode)
22862286 if (AskHostType() == HTYPE_VMS)
22872287 return;
22882288 #endif
2289+#if defined(HAVE_TANDEM)
2290+ /* HP Nonstop Server の場合、ファイルのない subvol へ移動すると550 File not found
2291+ * になるが問題ないのでエラーダイアログやエラーメッセージを出さないため */
2292+ if (AskHostType() == HTYPE_TANDEM)
2293+ return;
2294+#endif
22892295
22902296 if((strncmp(Pkt->Cmd, "NLST", 4) == 0) || (strncmp(Pkt->Cmd, "LIST", 4) == 0))
22912297 {
@@ -2636,6 +2642,16 @@ static int UpLoadNonPassive(TRANSPACKET *Pkt)
26362642 {
26372643 SetUploadResume(Pkt, Pkt->Mode, Pkt->ExistSize, &Resume);
26382644 if(Resume == NO)
2645+#if defined(HAVE_TANDEM)
2646+ if(AskHostType() == HTYPE_TANDEM && AskOSS() == NO && Pkt->Type != TYPE_A) {
2647+ if( Pkt->PriExt == DEF_PRIEXT && Pkt->SecExt == DEF_SECEXT && Pkt->MaxExt == DEF_MAXEXT) {
2648+ // EXTENTがデフォルトのときはコードのみ
2649+ sprintf(Buf, "%s%s,%d", Pkt->Cmd, Pkt->RemoteFile, Pkt->FileCode);
2650+ } else {
2651+ sprintf(Buf, "%s%s,%d,%d,%d,%d", Pkt->Cmd, Pkt->RemoteFile, Pkt->FileCode, Pkt->PriExt, Pkt->SecExt, Pkt->MaxExt);
2652+ }
2653+ } else
2654+#endif
26392655 sprintf(Buf, "%s%s", Pkt->Cmd, Pkt->RemoteFile);
26402656 else
26412657 sprintf(Buf, "%s%s", "APPE ", Pkt->RemoteFile);
@@ -2779,6 +2795,16 @@ static int UpLoadPassive(TRANSPACKET *Pkt)
27792795
27802796 SetUploadResume(Pkt, Pkt->Mode, Pkt->ExistSize, &Resume);
27812797 if(Resume == NO)
2798+#if defined(HAVE_TANDEM)
2799+ if(AskHostType() == HTYPE_TANDEM && AskOSS() == NO && Pkt->Type != TYPE_A) {
2800+ if( Pkt->PriExt == DEF_PRIEXT && Pkt->SecExt == DEF_SECEXT && Pkt->MaxExt == DEF_MAXEXT) {
2801+ // EXTENTがデフォルトのときはコードのみ
2802+ sprintf(Buf, "%s%s,%d", Pkt->Cmd, Pkt->RemoteFile, Pkt->FileCode);
2803+ } else {
2804+ sprintf(Buf, "%s%s,%d,%d,%d,%d", Pkt->Cmd, Pkt->RemoteFile, Pkt->FileCode, Pkt->PriExt, Pkt->SecExt, Pkt->MaxExt);
2805+ }
2806+ } else
2807+#endif
27822808 sprintf(Buf, "%s%s", Pkt->Cmd, Pkt->RemoteFile);
27832809 else
27842810 sprintf(Buf, "%s%s", "APPE ", Pkt->RemoteFile);
--- a/hostman.c
+++ b/hostman.c
@@ -2130,8 +2130,15 @@ static INT_PTR CALLBACK Adv2SettingProc(HWND hDlg, UINT iMessage, WPARAM wParam,
21302130 SendDlgItemMessage(hDlg, HSET_HOSTTYPE, CB_ADDSTRING, 0, (LPARAM)MSGJPN144);
21312131 SendDlgItemMessage(hDlg, HSET_HOSTTYPE, CB_ADDSTRING, 0, (LPARAM)MSGJPN289);
21322132 SendDlgItemMessage(hDlg, HSET_HOSTTYPE, CB_ADDSTRING, 0, (LPARAM)MSGJPN295);
2133+#if defined(HAVE_TANDEM)
2134+ SendDlgItemMessage(hDlg, HSET_HOSTTYPE, CB_ADDSTRING, 0, (LPARAM)MSGJPN2000);
2135+#endif
21332136 SendDlgItemMessage(hDlg, HSET_HOSTTYPE, CB_SETCURSEL, TmpHost.HostType, 0);
2137+#if defined(HAVE_TANDEM)
2138+ if(TmpHost.HostType == 2 || TmpHost.HostType == HTYPE_TANDEM) /* VAX or Tandem */
2139+#else
21342140 if(TmpHost.HostType == 2)
2141+#endif
21352142 {
21362143 EnableWindow(GetDlgItem(hDlg, HSET_NLST_R), FALSE);
21372144 EnableWindow(GetDlgItem(hDlg, HSET_LISTCMD), FALSE);
@@ -2200,12 +2207,34 @@ static INT_PTR CALLBACK Adv2SettingProc(HWND hDlg, UINT iMessage, WPARAM wParam,
22002207 EnableWindow(GetDlgItem(hDlg, HSET_LISTCMD), FALSE);
22012208 EnableWindow(GetDlgItem(hDlg, HSET_FULLPATH), FALSE);
22022209 }
2210+#if defined(HAVE_TANDEM)
2211+ else if(Num == HTYPE_TANDEM) /* Tandem */
2212+ {
2213+ /* Tandem を選択すると自動的に LIST にチェックをいれる */
2214+ SendDlgItemMessage(hDlg, HSET_LISTCMD, BM_SETCHECK, 1, 0);
2215+ EnableWindow(GetDlgItem(hDlg, HSET_NLST_R), FALSE);
2216+ EnableWindow(GetDlgItem(hDlg, HSET_LISTCMD), FALSE);
2217+ EnableWindow(GetDlgItem(hDlg, HSET_FULLPATH), FALSE);
2218+ }
2219+ else
2220+ {
2221+ if(SendDlgItemMessage(hDlg, HSET_LISTCMD, BM_GETCHECK, 0, 0) == 0) {
2222+ EnableWindow(GetDlgItem(hDlg, HSET_NLST_R), TRUE);
2223+ EnableWindow(GetDlgItem(hDlg, HSET_LISTCMD), TRUE);
2224+ } else {
2225+ EnableWindow(GetDlgItem(hDlg, HSET_NLST_R), FALSE);
2226+ EnableWindow(GetDlgItem(hDlg, HSET_LISTCMD), TRUE);
2227+ }
2228+ EnableWindow(GetDlgItem(hDlg, HSET_FULLPATH), TRUE);
2229+ }
2230+#else
22032231 else
22042232 {
22052233 EnableWindow(GetDlgItem(hDlg, HSET_NLST_R), TRUE);
22062234 EnableWindow(GetDlgItem(hDlg, HSET_LISTCMD), TRUE);
22072235 EnableWindow(GetDlgItem(hDlg, HSET_FULLPATH), TRUE);
22082236 }
2237+#endif
22092238 break;
22102239 }
22112240 return(TRUE);
--- a/main.c
+++ b/main.c
@@ -1407,6 +1407,12 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA
14071407 LocalRbuttonMenu(1);
14081408 break;
14091409
1410+#if defined(HAVE_TANDEM)
1411+ case MENU_SWITCH_OSS :
1412+ SwitchOSSProc();
1413+ break;
1414+#endif
1415+
14101416 default :
14111417 if((LOWORD(wParam) >= MENU_BMARK_TOP) &&
14121418 (LOWORD(wParam) < MENU_BMARK_TOP+100))
@@ -1449,7 +1455,15 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA
14491455 case MENU_DOWNLOAD :
14501456 lpttt->lpszText = MSGJPN157;
14511457 break;
1458+#if defined(HAVE_TANDEM)
1459+ case MENU_DOWNLOAD_AS :
1460+ lpttt->lpszText = MSGJPN065;
1461+ break;
14521462
1463+ case MENU_UPLOAD_AS :
1464+ lpttt->lpszText = MSGJPN064;
1465+ break;
1466+#endif
14531467 case MENU_UPLOAD :
14541468 lpttt->lpszText = MSGJPN158;
14551469 break;
--- a/mesg-eng.h
+++ b/mesg-eng.h
@@ -336,3 +336,7 @@
336336 #define MSGJPN336 "Overwrite all later"
337337 #define MSGJPN337 "Resume all later"
338338 #define MSGJPN338 "Skip all"
339+#if defined(HAVE_TANDEM)
340+#define MSGJPN2000 "NonStop Server"
341+#define MSGJPN2001 "OSS<->GUARDIAN Switch(&O)"
342+#endif
--- a/mesg-eng.old.h
+++ b/mesg-eng.old.h
@@ -336,3 +336,7 @@
336336 #define MSGJPN336 "Overwrite all later"
337337 #define MSGJPN337 "Resume all later"
338338 #define MSGJPN338 "Skip all"
339+#if defined(HAVE_TANDEM)
340+#define MSGJPN2000 "NonStop Server"
341+#define MSGJPN2001 "OSS<->GUARDIAN Switch(&O)"
342+#endif
--- a/mesg-jpn.h
+++ b/mesg-jpn.h
@@ -336,3 +336,7 @@
336336 #define MSGJPN336 "\xE5\x85\xA8\xE3\x81\xA6\xE5\xBE\x8C\xE3\x81\xA7\xE4\xB8\x8A\xE6\x9B\xB8\xE3\x81\x8D"
337337 #define MSGJPN337 "\xE5\x85\xA8\xE3\x81\xA6\xE5\xBE\x8C\xE3\x81\xA7\xE3\x83\xAA\xE3\x82\xB8\xE3\x83\xA5\xE3\x83\xBC\xE3\x83\xA0"
338338 #define MSGJPN338 "\xE5\x85\xA8\xE3\x81\xA6\xE3\x82\xB9\xE3\x82\xAD\xE3\x83\x83\xE3\x83\x97"
339+#if defined(HAVE_TANDEM)
340+#define MSGJPN2000 "NonStop Server"
341+#define MSGJPN2001 "OSS<->GUARDIAN \xE5\x88\x87\xE3\x82\x8A\xE6\x9B\xBF\xE3\x81\x88(&O)"
342+#endif
--- a/mesg-jpn.old.h
+++ b/mesg-jpn.old.h
@@ -336,3 +336,7 @@
336336 #define MSGJPN336 "全て後で上書き"
337337 #define MSGJPN337 "全て後でリジューム"
338338 #define MSGJPN338 "全てスキップ"
339+#if defined(HAVE_TANDEM)
340+#define MSGJPN2000 "NonStop Server"
341+#define MSGJPN2001 "OSS<->GUARDIAN 切り替え(&O)"
342+#endif
--- a/misc.c
+++ b/misc.c
@@ -318,6 +318,13 @@ void RemoveYenTail(char *Str)
318318
319319 void SetSlashTail(char *Str)
320320 {
321+#if defined(HAVE_TANDEM)
322+ /* Tandem では / の代わりに . を追加 */
323+ if(AskHostType() == HTYPE_TANDEM) {
324+ if(_mbscmp(_mbsninc(Str, _mbslen(Str) - 1), ".") != 0)
325+ strcat(Str, ".");
326+ } else
327+#endif
321328 if(_mbscmp(_mbsninc(Str, _mbslen(Str) - 1), "/") != 0)
322329 strcat(Str, "/");
323330
@@ -364,6 +371,12 @@ void ReplaceAll(char *Str, char Src, char Dst)
364371 {
365372 char *Pos;
366373
374+/* Tandem ではノード名の変換を行わない */
375+/* 最初の1文字が \ でもそのままにする */
376+#if defined(HAVE_TANDEM)
377+ if (AskRealHostType() == HTYPE_TANDEM && strlen(Str) > 0)
378+ Str++;
379+#endif
367380 while((Pos = _mbschr(Str, Src)) != NULL)
368381 *Pos = Dst;
369382 return;
@@ -597,6 +610,11 @@ char *GetFileName(char *Path)
597610 if((Pos = _mbsrchr(Path, '/')) != NULL)
598611 Path = Pos + 1;
599612
613+#if defined(HAVE_TANDEM)
614+ /* Tandem は . がデリミッタとなる */
615+ if((AskHostType() == HTYPE_TANDEM) && ((Pos = _mbsrchr(Path, '.')) != NULL))
616+ Path = Pos + 1;
617+#endif
600618 return(Path);
601619 }
602620
@@ -1788,3 +1806,34 @@ char* GetAppTempPath(char* Buf)
17881806 return Buf;
17891807 }
17901808
1809+#if defined(HAVE_TANDEM)
1810+/*----- ファイルサイズからEXTENTサイズの計算を行う ----------------------------
1811+*
1812+* Parameter
1813+* LONGLONG Size : ファイルサイズ
1814+*
1815+* Return Value
1816+* なし
1817+*----------------------------------------------------------------------------*/
1818+void CalcExtentSize(TRANSPACKET *Pkt, LONGLONG Size)
1819+{
1820+ LONGLONG extent;
1821+
1822+ /* EXTENTS(4,28) MAXEXTENTS 978 */
1823+ if(Size < 56025088) {
1824+ Pkt->PriExt = DEF_PRIEXT;
1825+ Pkt->SecExt = DEF_SECEXT;
1826+ Pkt->MaxExt = DEF_MAXEXT;
1827+ } else {
1828+ /* 増加余地を残すため Used 75% 近辺になるように EXTENT サイズを調整) */
1829+ extent = (LONGLONG)(Size / ((DEF_MAXEXT * 0.75) * 2048LL));
1830+ /* 28未満にすると誤差でFile Fullになる可能性がある */
1831+ if(extent < 28)
1832+ extent = 28;
1833+
1834+ Pkt->PriExt = (int)extent;
1835+ Pkt->SecExt = (int)extent;
1836+ Pkt->MaxExt = DEF_MAXEXT;
1837+ }
1838+}
1839+#endif
Binary files a/putty/Release/PuTTY.dll and b/putty/Release/PuTTY.dll differ
--- a/remote.c
+++ b/remote.c
@@ -685,6 +685,39 @@ int CommandProcCmd(char *Reply, char *fmt, ...)
685685 }
686686
687687
688+#if defined(HAVE_TANDEM)
689+/*----- OSS/Guardian ファイルシステムを切り替えるコマンドを送る ---------------
690+*
691+* Parameter
692+* なし
693+*
694+* Return Value
695+* なし
696+*----------------------------------------------------------------------------*/
697+
698+void SwitchOSSProc(void)
699+{
700+ char Buf[MAX_PATH+1];
701+
702+ /* DoPWD でノード名の \ を保存するために OSSフラグも変更する */
703+ if(AskOSS() == YES) {
704+ DoQUOTE("GUARDIAN");
705+ SetOSS(NO);
706+ } else {
707+ DoQUOTE("OSS");
708+ SetOSS(YES);
709+ }
710+ /* Current Dir 再取得 */
711+ if (DoPWD(Buf) == FTP_COMPLETE)
712+ SetRemoteDirHist(Buf);
713+ /* ファイルリスト再読み込み */
714+ PostMessage(GetMainHwnd(), WM_COMMAND, MAKEWPARAM(REFRESH_REMOTE, 0), 0);
715+
716+ return;
717+}
718+#endif
719+
720+
688721 /*----- リモート側へコマンドを送りリプライを待つ(転送ソケット)---------------
689722 *
690723 * Parameter
--- a/toolmenu.c
+++ b/toolmenu.c
@@ -1846,9 +1846,18 @@ void RemoteRbuttonMenu(int Pos)
18461846 AppendMenu(hMenu, MF_STRING | Flg1, MENU_DOWNLOAD_ALL, MSGJPN266);
18471847 AppendMenu(hMenu, MF_STRING | Flg1 | Flg2, MENU_DELETE, MSGJPN267);
18481848 AppendMenu(hMenu, MF_STRING | Flg1 | Flg2, MENU_RENAME, MSGJPN268);
1849+#if defined(HAVE_TANDEM)
1850+ /* HP NonStop Server では CHMOD の仕様が異なるため使用不可 */
1851+ if (AskRealHostType() != HTYPE_TANDEM)
1852+#endif
18491853 AppendMenu(hMenu, MF_STRING | Flg1 | Flg2, MENU_CHMOD, MSGJPN269);
18501854 AppendMenu(hMenu, MF_STRING | Flg1, MENU_MKDIR, MSGJPN270);
18511855 AppendMenu(hMenu, MF_STRING | Flg1 | Flg2, MENU_URL_COPY, MSGJPN271);
1856+#if defined(HAVE_TANDEM)
1857+ /* OSS モードのときに表示されるように AskRealHostType() を使用する */
1858+ if (AskRealHostType() == HTYPE_TANDEM)
1859+ AppendMenu(hMenu, MF_STRING | Flg1, MENU_SWITCH_OSS, MSGJPN2001);
1860+#endif
18521861 AppendMenu(hMenu, MF_SEPARATOR, 0, NULL);
18531862 AppendMenu(hMenu, MF_STRING | Flg1, MENU_FILESIZE, MSGJPN272);
18541863 AppendMenu(hMenu, MF_SEPARATOR, 0, NULL);