FFFTPのソースコードです。
修訂 | 19f7cced5712c402119825eb556f3dac6aee54f9 (tree) |
---|---|
時間 | 2012-01-10 21:01:37 |
作者 | Yuji Tanaka <chibi_honu@user...> |
Commiter | Yuji Tanaka |
Add support for HP NonStop Server
@@ -219,6 +219,7 @@ BEGIN | ||
219 | 219 | MENUITEM "URLをクリップボードへ", MENU_URL_COPY |
220 | 220 | MENUITEM "全てをダウンロード", MENU_DOWNLOAD_ALL |
221 | 221 | MENUITEM "全てをアップロード", MENU_UPLOAD_ALL |
222 | + MENUITEM "OSS<->GUARDIAN 切り替え", MENU_SWITCH_OSS | |
222 | 223 | END |
223 | 224 | END |
224 | 225 |
@@ -817,6 +818,19 @@ BEGIN | ||
817 | 818 | LTEXT "の名前を変更してください。",-1,15,20,133,8 |
818 | 819 | END |
819 | 820 | |
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 | + | |
820 | 834 | re_passwd_dlg DIALOG 0, 0, 187, 62 |
821 | 835 | STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION |
822 | 836 | CAPTION "パスワード" |
@@ -1695,6 +1709,14 @@ BEGIN | ||
1695 | 1709 | BOTTOMMARGIN, 65 |
1696 | 1710 | END |
1697 | 1711 | |
1712 | + updown_as_with_ext_dlg, DIALOG | |
1713 | + BEGIN | |
1714 | + LEFTMARGIN, 7 | |
1715 | + RIGHTMARGIN, 180 | |
1716 | + TOPMARGIN, 7 | |
1717 | + BOTTOMMARGIN, 87 | |
1718 | + END | |
1719 | + | |
1698 | 1720 | re_passwd_dlg, DIALOG |
1699 | 1721 | BEGIN |
1700 | 1722 | LEFTMARGIN, 7 |
@@ -112,6 +112,7 @@ | ||
112 | 112 | #define hset_adv3_dlg 190 |
113 | 113 | #define savecrypt_dlg 191 |
114 | 114 | #define updatesslroot_dlg 192 |
115 | +#define updown_as_with_ext_dlg 193 | |
115 | 116 | #define TRANS_TIME_BAR 1002 |
116 | 117 | #define TRANS_TEXT 1003 |
117 | 118 | #define TRANS_REMOTE 1003 |
@@ -358,6 +359,7 @@ | ||
358 | 359 | #define UPDOWNAS_TEXT 1113 |
359 | 360 | #define UPDOWNAS_NEW 1114 |
360 | 361 | #define UPDOWNAS_STOP 1115 |
362 | +#define UPDOWNAS_FILECODE 1116 | |
361 | 363 | #define SEL_FNAME 1117 |
362 | 364 | #define SEL_REGEXP 1118 |
363 | 365 | #define SEL_NOEXIST 1119 |
@@ -616,6 +618,7 @@ | ||
616 | 618 | #define ID_BUTTON40173 40173 |
617 | 619 | #define ID_BUTTON40174 40174 |
618 | 620 | #define ID_BUTTON40175 40175 |
621 | +#define MENU_SWITCH_OSS 40176 | |
619 | 622 | #define FSNOTIFY_TITLE 65535 |
620 | 623 | #define HOST_SIZEGRIP 65535 |
621 | 624 |
@@ -624,7 +627,7 @@ | ||
624 | 627 | #ifdef APSTUDIO_INVOKED |
625 | 628 | #ifndef APSTUDIO_READONLY_SYMBOLS |
626 | 629 | #define _APS_NEXT_RESOURCE_VALUE 193 |
627 | -#define _APS_NEXT_COMMAND_VALUE 40176 | |
630 | +#define _APS_NEXT_COMMAND_VALUE 40177 | |
628 | 631 | #define _APS_NEXT_CONTROL_VALUE 1213 |
629 | 632 | #define _APS_NEXT_SYMED_VALUE 101 |
630 | 633 | #endif |
@@ -219,6 +219,7 @@ BEGIN | ||
219 | 219 | MENUITEM "URL to clipboard", MENU_URL_COPY |
220 | 220 | MENUITEM "Download all", MENU_DOWNLOAD_ALL |
221 | 221 | MENUITEM "Upload all", MENU_UPLOAD_ALL |
222 | + MENUITEM "Switch OSS<->GUARDIAN", MENU_SWITCH_OSS | |
222 | 223 | END |
223 | 224 | END |
224 | 225 |
@@ -824,6 +825,19 @@ BEGIN | ||
824 | 825 | LTEXT "Enter new name",-1,7,7,133,8 |
825 | 826 | END |
826 | 827 | |
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 | + | |
827 | 841 | re_passwd_dlg DIALOG 0, 0, 187, 62 |
828 | 842 | STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION |
829 | 843 | CAPTION "Password" |
@@ -1723,6 +1737,14 @@ BEGIN | ||
1723 | 1737 | BOTTOMMARGIN, 65 |
1724 | 1738 | END |
1725 | 1739 | |
1740 | + updown_as_with_ext_dlg, DIALOG | |
1741 | + BEGIN | |
1742 | + LEFTMARGIN, 7 | |
1743 | + RIGHTMARGIN, 180 | |
1744 | + TOPMARGIN, 7 | |
1745 | + BOTTOMMARGIN, 87 | |
1746 | + END | |
1747 | + | |
1726 | 1748 | re_passwd_dlg, DIALOG |
1727 | 1749 | BEGIN |
1728 | 1750 | LEFTMARGIN, 7 |
@@ -112,6 +112,7 @@ | ||
112 | 112 | #define hset_adv3_dlg 190 |
113 | 113 | #define savecrypt_dlg 191 |
114 | 114 | #define updatesslroot_dlg 192 |
115 | +#define updown_as_with_ext_dlg 193 | |
115 | 116 | #define TRANS_TIME_BAR 1002 |
116 | 117 | #define TRANS_TEXT 1003 |
117 | 118 | #define TRANS_REMOTE 1003 |
@@ -358,6 +359,7 @@ | ||
358 | 359 | #define UPDOWNAS_TEXT 1113 |
359 | 360 | #define UPDOWNAS_NEW 1114 |
360 | 361 | #define UPDOWNAS_STOP 1115 |
362 | +#define UPDOWNAS_FILECODE 1116 | |
361 | 363 | #define SEL_FNAME 1117 |
362 | 364 | #define SEL_REGEXP 1118 |
363 | 365 | #define SEL_NOEXIST 1119 |
@@ -616,6 +618,7 @@ | ||
616 | 618 | #define ID_BUTTON40173 40173 |
617 | 619 | #define ID_BUTTON40174 40174 |
618 | 620 | #define ID_BUTTON40175 40175 |
621 | +#define MENU_SWITCH_OSS 40176 | |
619 | 622 | #define FSNOTIFY_TITLE 65535 |
620 | 623 | #define HOST_SIZEGRIP 65535 |
621 | 624 |
@@ -624,7 +627,7 @@ | ||
624 | 627 | #ifdef APSTUDIO_INVOKED |
625 | 628 | #ifndef APSTUDIO_READONLY_SYMBOLS |
626 | 629 | #define _APS_NEXT_RESOURCE_VALUE 193 |
627 | -#define _APS_NEXT_COMMAND_VALUE 40176 | |
630 | +#define _APS_NEXT_COMMAND_VALUE 40177 | |
628 | 631 | #define _APS_NEXT_CONTROL_VALUE 1213 |
629 | 632 | #define _APS_NEXT_SYMED_VALUE 101 |
630 | 633 | #endif |
@@ -150,6 +150,11 @@ | ||
150 | 150 | #define CHMOD_CMD_NOR "SITE CHMOD" /* 属性変更コマンド */ |
151 | 151 | #define PORT_NOR 21 /* ポート番号 */ |
152 | 152 | #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 | |
153 | 158 | |
154 | 159 | /*===== 同じ名前のファイルがあった時の処理 =====*/ |
155 | 160 |
@@ -301,6 +306,9 @@ | ||
301 | 306 | #define LIST_UNIX_16 48 /* UNIX 16 */ |
302 | 307 | // MLSD対応 |
303 | 308 | #define LIST_MLSD 49 |
309 | +#if defined(HAVE_TANDEM) | |
310 | +#define LIST_TANDEM 50 /* HP NonStop Server */ | |
311 | +#endif | |
304 | 312 | |
305 | 313 | #define LIST_MELCOM 0x100 /* MELCOM80 */ |
306 | 314 |
@@ -682,6 +690,13 @@ LIST_UNIX_70 | ||
682 | 690 | drwxr-x--- 3 root root 4096 2011-12-06 23:39 .. |
683 | 691 | -rw-r----- 1 root root 251 2011-12-06 23:39 .hoge |
684 | 692 | |
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 | + | |
685 | 700 | ------------------------------------*/ |
686 | 701 | |
687 | 702 | /*===== 接続ウインドウの形式 =====*/ |
@@ -762,6 +777,9 @@ LIST_UNIX_70 | ||
762 | 777 | #define HTYPE_STRATUS 5 /* Stratus */ |
763 | 778 | #define HTYPE_AGILENT 6 /* Agilent Logic analyzer */ |
764 | 779 | #define HTYPE_SHIBASOKU 7 /* Shibasoku LSI test system */ |
780 | +#if defined(HAVE_TANDEM) | |
781 | +#define HTYPE_TANDEM 8 /* HP NonStop Server */ | |
782 | +#endif | |
765 | 783 | |
766 | 784 | /*===== コマンドラインオプション =====*/ |
767 | 785 |
@@ -1066,6 +1084,12 @@ typedef struct transpacket { | ||
1066 | 1084 | int KanjiCodeDesired; /* ローカルの漢字コード (KANJI_xxx) */ |
1067 | 1085 | int KanaCnv; /* 半角カナを全角に変換(YES/NO) */ |
1068 | 1086 | 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 | |
1069 | 1093 | HWND hWndTrans; /* 転送中ダイアログのウインドウハンドル */ |
1070 | 1094 | int Abort; /* 転送中止フラグ (ABORT_xxx) */ |
1071 | 1095 | // 同時接続対応 |
@@ -1456,6 +1480,11 @@ int AskShareProh(void); | ||
1456 | 1480 | void DisconnectProc(void); |
1457 | 1481 | void DisconnectSet(void); |
1458 | 1482 | int AskConnecting(void); |
1483 | +#if defined(HAVE_TANDEM) | |
1484 | +int AskRealHostType(void); | |
1485 | +int SetOSS(int wkOss); | |
1486 | +int AskOSS(void); | |
1487 | +#endif | |
1459 | 1488 | SOCKET connectsock(char *host, int port, char *PreMsg, int *CancelCheckWork); |
1460 | 1489 | // IPv6対応 |
1461 | 1490 | SOCKET connectsockIPv4(char *host, int port, char *PreMsg, int *CancelCheckWork); |
@@ -1574,6 +1603,9 @@ int DoQUOTE(char *CmdStr); | ||
1574 | 1603 | SOCKET DoClose(SOCKET Sock); |
1575 | 1604 | int DoQUIT(SOCKET ctrl_skt); |
1576 | 1605 | int DoDirListCmdSkt(char *AddOpt, char *Path, int Num, int *CancelCheckWork); |
1606 | +#if defined(HAVE_TANDEM) | |
1607 | +void SwitchOSSProc(void); | |
1608 | +#endif | |
1577 | 1609 | int CommandProcCmd(char *Reply, char *fmt, ...); |
1578 | 1610 | // 同時接続対応 |
1579 | 1611 | //int CommandProcTrn(char *Reply, char *fmt, ...); |
@@ -1747,6 +1779,9 @@ char *MakeNumString(LONGLONG Num, char *Buf, BOOL Comma); | ||
1747 | 1779 | char* MakeDistinguishableFileName(char* Out, char* In); |
1748 | 1780 | // 環境依存の不具合対策 |
1749 | 1781 | char* GetAppTempPath(char* Buf); |
1782 | +#if defined(HAVE_TANDEM) | |
1783 | +void CalcExtentSize(TRANSPACKET *Pkt, LONGLONG Size); | |
1784 | +#endif | |
1750 | 1785 | |
1751 | 1786 | /*===== dlgsize.c =====*/ |
1752 | 1787 |
@@ -20,3 +20,6 @@ | ||
20 | 20 | // ファイル転送の同時接続数 |
21 | 21 | #define MAX_DATA_CONNECTION 4 |
22 | 22 | |
23 | +/* HP NonStop Server 用のコードを有効にする */ | |
24 | +#define HAVE_TANDEM | |
25 | + |
@@ -123,6 +123,9 @@ static const struct in6_addr IN6ADDR_NONE = {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff | ||
123 | 123 | static int UseIPadrs; |
124 | 124 | static char DomainName[HOST_ADRS_LEN+1]; |
125 | 125 | |
126 | +#if defined(HAVE_TANDEM) | |
127 | +static int Oss = NO; /* OSS ファイルシステムへアクセスしている場合は YES */ | |
128 | +#endif | |
126 | 129 | |
127 | 130 | |
128 | 131 |
@@ -895,6 +898,14 @@ int AskHostType(void) | ||
895 | 898 | if(AskCurrentHost() != HOSTNUM_NOENTRY) |
896 | 899 | CopyHostFromListInConnect(AskCurrentHost(), &CurHost); |
897 | 900 | |
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 | + | |
898 | 909 | return(CurHost.HostType); |
899 | 910 | } |
900 | 911 |
@@ -1316,6 +1327,55 @@ int AskConnecting(void) | ||
1316 | 1327 | } |
1317 | 1328 | |
1318 | 1329 | |
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 | + | |
1319 | 1379 | /*----- ホストへ接続する ------------------------------------------------------ |
1320 | 1380 | * |
1321 | 1381 | * Parameter |
@@ -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 | + |
@@ -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 | + |
@@ -898,6 +898,11 @@ static LRESULT FileListCommonWndProc(HWND hWnd, UINT message, WPARAM wParam, LPA | ||
898 | 898 | |
899 | 899 | } |
900 | 900 | |
901 | +#if defined(HAVE_TANDEM) | |
902 | + if(FileListBaseNoExpand == NULL) | |
903 | + pf = FileListBase; | |
904 | + else | |
905 | +#endif | |
901 | 906 | pf = FileListBaseNoExpand; |
902 | 907 | for (filenum = 0; pf ; filenum++) { |
903 | 908 | pf = pf->Next; |
@@ -1507,6 +1512,11 @@ static void AddDispFileList(FLISTANCHOR *Anchor, char *Name, FILETIME *Time, LON | ||
1507 | 1512 | { |
1508 | 1513 | if((((Sort & SORT_MASK_ORD) == SORT_EXT) && |
1509 | 1514 | ((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 | |
1510 | 1520 | (((Sort & SORT_MASK_ORD) == SORT_SIZE) && |
1511 | 1521 | ((Cmp = Size - Pos->Size) < 0)) || |
1512 | 1522 | (((Sort & SORT_MASK_ORD) == SORT_DATE) && |
@@ -1525,6 +1535,11 @@ static void AddDispFileList(FLISTANCHOR *Anchor, char *Name, FILETIME *Time, LON | ||
1525 | 1535 | { |
1526 | 1536 | if((((Sort & SORT_MASK_ORD) == SORT_EXT) && |
1527 | 1537 | ((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 | |
1528 | 1543 | (((Sort & SORT_MASK_ORD) == SORT_SIZE) && |
1529 | 1544 | ((Cmp = Size - Pos->Size) > 0)) || |
1530 | 1545 | (((Sort & SORT_MASK_ORD) == SORT_DATE) && |
@@ -1705,6 +1720,12 @@ static void AddListView(HWND hWnd, int Pos, char *Name, int Type, LONGLONG Size, | ||
1705 | 1720 | LvItem.mask = LVIF_TEXT; |
1706 | 1721 | LvItem.iItem = Pos; |
1707 | 1722 | 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 | |
1708 | 1729 | LvItem.pszText = GetFileExt(Name); |
1709 | 1730 | LvItem.iItem = SendMessage(hWnd, LVM_SETITEM, 0, (LPARAM)&LvItem); |
1710 | 1731 |
@@ -1712,7 +1733,11 @@ static void AddListView(HWND hWnd, int Pos, char *Name, int Type, LONGLONG Size, | ||
1712 | 1733 | { |
1713 | 1734 | /* 属性 */ |
1714 | 1735 | strcpy(Tmp, ""); |
1736 | +#if defined(HAVE_TANDEM) | |
1737 | + if((InfoExist & FINFO_ATTR) && (AskHostType() != HTYPE_TANDEM)) | |
1738 | +#else | |
1715 | 1739 | if(InfoExist & FINFO_ATTR) |
1740 | +#endif | |
1716 | 1741 | AttrValue2String(Attr, Tmp); |
1717 | 1742 | LvItem.mask = LVIF_TEXT; |
1718 | 1743 | LvItem.iItem = Pos; |
@@ -2337,6 +2362,13 @@ int GetNodeSize(int Win, int Pos, LONGLONG *Buf) | ||
2337 | 2362 | SendMessage(hWnd, LVM_GETITEM, 0, (LPARAM)&LvItem); |
2338 | 2363 | *Buf = -1; |
2339 | 2364 | 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 | |
2340 | 2372 | if(strlen(Tmp) > 0) |
2341 | 2373 | { |
2342 | 2374 | RemoveComma(Tmp); |
@@ -2371,12 +2403,22 @@ int GetNodeAttr(int Win, int Pos, int *Buf) | ||
2371 | 2403 | { |
2372 | 2404 | LvItem.mask = LVIF_TEXT; |
2373 | 2405 | LvItem.iItem = Pos; |
2406 | +#if defined(HAVE_TANDEM) | |
2407 | + if(AskHostType() == HTYPE_TANDEM) | |
2408 | + LvItem.iSubItem = 3; | |
2409 | + else | |
2410 | +#endif | |
2374 | 2411 | LvItem.iSubItem = 4; |
2375 | 2412 | LvItem.pszText = Tmp; |
2376 | 2413 | LvItem.cchTextMax = 20; |
2377 | 2414 | SendMessage(GetRemoteHwnd(), LVM_GETITEM, 0, (LPARAM)&LvItem); |
2378 | 2415 | if(strlen(Tmp) > 0) |
2379 | 2416 | { |
2417 | +#if defined(HAVE_TANDEM) | |
2418 | + if(AskHostType() == HTYPE_TANDEM) | |
2419 | + *Buf = atoi(Tmp); | |
2420 | + else | |
2421 | +#endif | |
2380 | 2422 | *Buf = AttrString2Value(Tmp); |
2381 | 2423 | Ret = YES; |
2382 | 2424 | } |
@@ -2679,10 +2721,19 @@ void MakeDroppedFileList(WPARAM wParam, char *Cur, FILELIST **Base) | ||
2679 | 2721 | strcpy(Pkt.File, GetFileName(Name)); |
2680 | 2722 | |
2681 | 2723 | memset(&Pkt.Time, 0, sizeof(FILETIME)); |
2724 | +#if defined(HAVE_TANDEM) | |
2725 | + /* Guardian スペースへのアップロードのためにサイズが必要 */ | |
2726 | + Pkt.Size = 0; | |
2727 | + Pkt.InfoExist = 0; | |
2728 | +#endif | |
2682 | 2729 | if((fHnd = FindFirstFile(Name, &Find)) != INVALID_HANDLE_VALUE) |
2683 | 2730 | { |
2684 | 2731 | FindClose(fHnd); |
2685 | 2732 | 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 | |
2686 | 2737 | } |
2687 | 2738 | AddFileList(&Pkt, Base); |
2688 | 2739 | } |
@@ -3713,6 +3764,20 @@ static int AnalizeFileInfo(char *Str) | ||
3713 | 3764 | } |
3714 | 3765 | } |
3715 | 3766 | } |
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 | |
3716 | 3781 | |
3717 | 3782 | // MLSD対応 |
3718 | 3783 | if(Ret == LIST_UNKNOWN) |
@@ -4719,6 +4784,66 @@ static int ResolvFileInfo(char *Str, int ListType, char *Fname, LONGLONG *Size, | ||
4719 | 4784 | } |
4720 | 4785 | break; |
4721 | 4786 | |
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 | + | |
4722 | 4847 | case LIST_UNIX_10 : |
4723 | 4848 | case LIST_UNIX_11 : |
4724 | 4849 | case LIST_UNIX_12 : |
@@ -75,6 +75,9 @@ static int AskUpLoadFileAttr(char *Fname); | ||
75 | 75 | // 64ビット対応 |
76 | 76 | //static BOOL CALLBACK UpDownAsDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam); |
77 | 77 | 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 | |
78 | 81 | static void DeleteAllDir(FILELIST *Dt, int Win, int *Sw, int *Flg, char *CurDir); |
79 | 82 | static void DelNotifyAndDo(FILELIST *Dt, int Win, int *Sw, int *Flg, char *CurDir); |
80 | 83 | // 64ビット対応 |
@@ -109,6 +112,9 @@ extern int CancelFlg; | ||
109 | 112 | /*===== ローカルなワーク =====*/ |
110 | 113 | |
111 | 114 | static char TmpString[FMAX_PATH+80]; /* テンポラリ */ |
115 | +#if defined(HAVE_TANDEM) | |
116 | +static char TmpFileCode[5]; /* テンポラリ */ | |
117 | +#endif | |
112 | 118 | static int CurWin; /* ウインドウ番号 */ |
113 | 119 | |
114 | 120 | int UpExistMode = EXIST_OVW; /* アップロードで同じ名前のファイルがある時の扱い方 EXIST_xxx */ |
@@ -217,6 +223,19 @@ void DownLoadProc(int ChName, int ForceFile, int All) | ||
217 | 223 | } |
218 | 224 | |
219 | 225 | 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 | |
220 | 239 | Pkt.Type = AskTransferTypeAssoc(Pkt.RemoteFile, AskTransferType()); |
221 | 240 | Pkt.Size = Pos->Size; |
222 | 241 | Pkt.Time = Pos->Time; |
@@ -911,12 +930,29 @@ void UpLoadListProc(int ChName, int All) | ||
911 | 930 | _mbslwr(Cat); |
912 | 931 | else if(FnameCnv == FNAME_UPPER) |
913 | 932 | _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 | |
914 | 939 | } |
915 | 940 | else |
916 | 941 | { |
917 | 942 | // 名前を変更する |
918 | 943 | strcpy(TmpString, Pos->File); |
919 | 944 | 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 | |
920 | 956 | if(DialogBox(GetFtpInst(), MAKEINTRESOURCE(updown_as_dlg), GetMainHwnd(), UpDownAsDialogCallBack) == YES) |
921 | 957 | strcat(Pkt.RemoteFile, TmpString); |
922 | 958 | else |
@@ -985,6 +1021,11 @@ void UpLoadListProc(int ChName, int All) | ||
985 | 1021 | // UTF-8対応 |
986 | 1022 | Pkt.KanjiCodeDesired = AskLocalKanjiCode(); |
987 | 1023 | Pkt.KanaCnv = AskHostKanaCnv(); |
1024 | +#if defined(HAVE_TANDEM) | |
1025 | + if(AskHostType() == HTYPE_TANDEM && AskOSS() == NO) { | |
1026 | + CalcExtentSize(&Pkt, Pos->Size); | |
1027 | + } | |
1028 | +#endif | |
988 | 1029 | Pkt.Mode = CheckRemoteFile(&Pkt, RemoteList); |
989 | 1030 | if(Pkt.Mode == EXIST_ABORT) |
990 | 1031 | break; |
@@ -1079,6 +1120,12 @@ void UpLoadDragProc(WPARAM wParam) | ||
1079 | 1120 | else if(FnameCnv == FNAME_UPPER) |
1080 | 1121 | _mbsupr(Cat); |
1081 | 1122 | 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 | |
1082 | 1129 | |
1083 | 1130 | if(AskHostType() == HTYPE_ACOS) |
1084 | 1131 | { |
@@ -1140,6 +1187,12 @@ void UpLoadDragProc(WPARAM wParam) | ||
1140 | 1187 | // UTF-8対応 |
1141 | 1188 | Pkt.KanjiCodeDesired = AskLocalKanjiCode(); |
1142 | 1189 | 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 | |
1143 | 1196 | Pkt.Mode = CheckRemoteFile(&Pkt, RemoteList); |
1144 | 1197 | if(Pkt.Mode == EXIST_ABORT) |
1145 | 1198 | break; |
@@ -1411,6 +1464,11 @@ void MirrorUploadProc(int Notify) | ||
1411 | 1464 | // UTF-8対応 |
1412 | 1465 | Pkt.KanjiCodeDesired = AskLocalKanjiCode(); |
1413 | 1466 | Pkt.KanaCnv = AskHostKanaCnv(); |
1467 | +#if defined(HAVE_TANDEM) | |
1468 | + if(AskHostType() == HTYPE_TANDEM && AskOSS() == NO) { | |
1469 | + CalcExtentSize(&Pkt, LocalPos->Size); | |
1470 | + } | |
1471 | +#endif | |
1414 | 1472 | Pkt.Mode = EXIST_OVW; |
1415 | 1473 | AddTmpTransFileList(&Pkt, &Base); |
1416 | 1474 | } |
@@ -1815,13 +1873,26 @@ static int AskUpLoadFileAttr(char *Fname) | ||
1815 | 1873 | static int CheckRemoteFile(TRANSPACKET *Pkt, FILELIST *ListList) |
1816 | 1874 | { |
1817 | 1875 | int Ret; |
1876 | +#if defined(HAVE_TANDEM) | |
1877 | + int Mode; | |
1878 | +#endif | |
1818 | 1879 | FILELIST *Exist; |
1819 | 1880 | |
1820 | 1881 | Ret = EXIST_OVW; |
1821 | 1882 | Pkt->ExistSize = 0; |
1822 | 1883 | if(SendMode != TRANS_OVW) |
1823 | 1884 | { |
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 | |
1824 | 1894 | if((Exist = SearchFileList(GetFileName(Pkt->RemoteFile), ListList, COMP_STRICT)) != NULL) |
1895 | +#endif | |
1825 | 1896 | { |
1826 | 1897 | Pkt->ExistSize = Exist->Size; |
1827 | 1898 |
@@ -1965,6 +2036,57 @@ static INT_PTR CALLBACK UpDownAsDialogCallBack(HWND hDlg, UINT iMessage, WPARAM | ||
1965 | 2036 | } |
1966 | 2037 | |
1967 | 2038 | |
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 | + | |
1968 | 2090 | /*----- ファイル一覧で指定されたファイルを削除する ---------------------------- |
1969 | 2091 | * |
1970 | 2092 | * Parameter |
@@ -2286,6 +2286,12 @@ static void DispDownloadFinishMsg(TRANSPACKET *Pkt, int iRetCode) | ||
2286 | 2286 | if (AskHostType() == HTYPE_VMS) |
2287 | 2287 | return; |
2288 | 2288 | #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 | |
2289 | 2295 | |
2290 | 2296 | if((strncmp(Pkt->Cmd, "NLST", 4) == 0) || (strncmp(Pkt->Cmd, "LIST", 4) == 0)) |
2291 | 2297 | { |
@@ -2636,6 +2642,16 @@ static int UpLoadNonPassive(TRANSPACKET *Pkt) | ||
2636 | 2642 | { |
2637 | 2643 | SetUploadResume(Pkt, Pkt->Mode, Pkt->ExistSize, &Resume); |
2638 | 2644 | 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 | |
2639 | 2655 | sprintf(Buf, "%s%s", Pkt->Cmd, Pkt->RemoteFile); |
2640 | 2656 | else |
2641 | 2657 | sprintf(Buf, "%s%s", "APPE ", Pkt->RemoteFile); |
@@ -2779,6 +2795,16 @@ static int UpLoadPassive(TRANSPACKET *Pkt) | ||
2779 | 2795 | |
2780 | 2796 | SetUploadResume(Pkt, Pkt->Mode, Pkt->ExistSize, &Resume); |
2781 | 2797 | 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 | |
2782 | 2808 | sprintf(Buf, "%s%s", Pkt->Cmd, Pkt->RemoteFile); |
2783 | 2809 | else |
2784 | 2810 | sprintf(Buf, "%s%s", "APPE ", Pkt->RemoteFile); |
@@ -2130,8 +2130,15 @@ static INT_PTR CALLBACK Adv2SettingProc(HWND hDlg, UINT iMessage, WPARAM wParam, | ||
2130 | 2130 | SendDlgItemMessage(hDlg, HSET_HOSTTYPE, CB_ADDSTRING, 0, (LPARAM)MSGJPN144); |
2131 | 2131 | SendDlgItemMessage(hDlg, HSET_HOSTTYPE, CB_ADDSTRING, 0, (LPARAM)MSGJPN289); |
2132 | 2132 | 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 | |
2133 | 2136 | 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 | |
2134 | 2140 | if(TmpHost.HostType == 2) |
2141 | +#endif | |
2135 | 2142 | { |
2136 | 2143 | EnableWindow(GetDlgItem(hDlg, HSET_NLST_R), FALSE); |
2137 | 2144 | EnableWindow(GetDlgItem(hDlg, HSET_LISTCMD), FALSE); |
@@ -2200,12 +2207,34 @@ static INT_PTR CALLBACK Adv2SettingProc(HWND hDlg, UINT iMessage, WPARAM wParam, | ||
2200 | 2207 | EnableWindow(GetDlgItem(hDlg, HSET_LISTCMD), FALSE); |
2201 | 2208 | EnableWindow(GetDlgItem(hDlg, HSET_FULLPATH), FALSE); |
2202 | 2209 | } |
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 | |
2203 | 2231 | else |
2204 | 2232 | { |
2205 | 2233 | EnableWindow(GetDlgItem(hDlg, HSET_NLST_R), TRUE); |
2206 | 2234 | EnableWindow(GetDlgItem(hDlg, HSET_LISTCMD), TRUE); |
2207 | 2235 | EnableWindow(GetDlgItem(hDlg, HSET_FULLPATH), TRUE); |
2208 | 2236 | } |
2237 | +#endif | |
2209 | 2238 | break; |
2210 | 2239 | } |
2211 | 2240 | return(TRUE); |
@@ -1407,6 +1407,12 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA | ||
1407 | 1407 | LocalRbuttonMenu(1); |
1408 | 1408 | break; |
1409 | 1409 | |
1410 | +#if defined(HAVE_TANDEM) | |
1411 | + case MENU_SWITCH_OSS : | |
1412 | + SwitchOSSProc(); | |
1413 | + break; | |
1414 | +#endif | |
1415 | + | |
1410 | 1416 | default : |
1411 | 1417 | if((LOWORD(wParam) >= MENU_BMARK_TOP) && |
1412 | 1418 | (LOWORD(wParam) < MENU_BMARK_TOP+100)) |
@@ -1449,7 +1455,15 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA | ||
1449 | 1455 | case MENU_DOWNLOAD : |
1450 | 1456 | lpttt->lpszText = MSGJPN157; |
1451 | 1457 | break; |
1458 | +#if defined(HAVE_TANDEM) | |
1459 | + case MENU_DOWNLOAD_AS : | |
1460 | + lpttt->lpszText = MSGJPN065; | |
1461 | + break; | |
1452 | 1462 | |
1463 | + case MENU_UPLOAD_AS : | |
1464 | + lpttt->lpszText = MSGJPN064; | |
1465 | + break; | |
1466 | +#endif | |
1453 | 1467 | case MENU_UPLOAD : |
1454 | 1468 | lpttt->lpszText = MSGJPN158; |
1455 | 1469 | break; |
@@ -336,3 +336,7 @@ | ||
336 | 336 | #define MSGJPN336 "Overwrite all later" |
337 | 337 | #define MSGJPN337 "Resume all later" |
338 | 338 | #define MSGJPN338 "Skip all" |
339 | +#if defined(HAVE_TANDEM) | |
340 | +#define MSGJPN2000 "NonStop Server" | |
341 | +#define MSGJPN2001 "OSS<->GUARDIAN Switch(&O)" | |
342 | +#endif |
@@ -336,3 +336,7 @@ | ||
336 | 336 | #define MSGJPN336 "Overwrite all later" |
337 | 337 | #define MSGJPN337 "Resume all later" |
338 | 338 | #define MSGJPN338 "Skip all" |
339 | +#if defined(HAVE_TANDEM) | |
340 | +#define MSGJPN2000 "NonStop Server" | |
341 | +#define MSGJPN2001 "OSS<->GUARDIAN Switch(&O)" | |
342 | +#endif |
@@ -336,3 +336,7 @@ | ||
336 | 336 | #define MSGJPN336 "\xE5\x85\xA8\xE3\x81\xA6\xE5\xBE\x8C\xE3\x81\xA7\xE4\xB8\x8A\xE6\x9B\xB8\xE3\x81\x8D" |
337 | 337 | #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" |
338 | 338 | #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 |
@@ -336,3 +336,7 @@ | ||
336 | 336 | #define MSGJPN336 "全て後で上書き" |
337 | 337 | #define MSGJPN337 "全て後でリジューム" |
338 | 338 | #define MSGJPN338 "全てスキップ" |
339 | +#if defined(HAVE_TANDEM) | |
340 | +#define MSGJPN2000 "NonStop Server" | |
341 | +#define MSGJPN2001 "OSS<->GUARDIAN 切り替え(&O)" | |
342 | +#endif |
@@ -318,6 +318,13 @@ void RemoveYenTail(char *Str) | ||
318 | 318 | |
319 | 319 | void SetSlashTail(char *Str) |
320 | 320 | { |
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 | |
321 | 328 | if(_mbscmp(_mbsninc(Str, _mbslen(Str) - 1), "/") != 0) |
322 | 329 | strcat(Str, "/"); |
323 | 330 |
@@ -364,6 +371,12 @@ void ReplaceAll(char *Str, char Src, char Dst) | ||
364 | 371 | { |
365 | 372 | char *Pos; |
366 | 373 | |
374 | +/* Tandem ではノード名の変換を行わない */ | |
375 | +/* 最初の1文字が \ でもそのままにする */ | |
376 | +#if defined(HAVE_TANDEM) | |
377 | + if (AskRealHostType() == HTYPE_TANDEM && strlen(Str) > 0) | |
378 | + Str++; | |
379 | +#endif | |
367 | 380 | while((Pos = _mbschr(Str, Src)) != NULL) |
368 | 381 | *Pos = Dst; |
369 | 382 | return; |
@@ -597,6 +610,11 @@ char *GetFileName(char *Path) | ||
597 | 610 | if((Pos = _mbsrchr(Path, '/')) != NULL) |
598 | 611 | Path = Pos + 1; |
599 | 612 | |
613 | +#if defined(HAVE_TANDEM) | |
614 | + /* Tandem は . がデリミッタとなる */ | |
615 | + if((AskHostType() == HTYPE_TANDEM) && ((Pos = _mbsrchr(Path, '.')) != NULL)) | |
616 | + Path = Pos + 1; | |
617 | +#endif | |
600 | 618 | return(Path); |
601 | 619 | } |
602 | 620 |
@@ -1788,3 +1806,34 @@ char* GetAppTempPath(char* Buf) | ||
1788 | 1806 | return Buf; |
1789 | 1807 | } |
1790 | 1808 | |
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 |
@@ -685,6 +685,39 @@ int CommandProcCmd(char *Reply, char *fmt, ...) | ||
685 | 685 | } |
686 | 686 | |
687 | 687 | |
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 | + | |
688 | 721 | /*----- リモート側へコマンドを送りリプライを待つ(転送ソケット)--------------- |
689 | 722 | * |
690 | 723 | * Parameter |
@@ -1846,9 +1846,18 @@ void RemoteRbuttonMenu(int Pos) | ||
1846 | 1846 | AppendMenu(hMenu, MF_STRING | Flg1, MENU_DOWNLOAD_ALL, MSGJPN266); |
1847 | 1847 | AppendMenu(hMenu, MF_STRING | Flg1 | Flg2, MENU_DELETE, MSGJPN267); |
1848 | 1848 | 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 | |
1849 | 1853 | AppendMenu(hMenu, MF_STRING | Flg1 | Flg2, MENU_CHMOD, MSGJPN269); |
1850 | 1854 | AppendMenu(hMenu, MF_STRING | Flg1, MENU_MKDIR, MSGJPN270); |
1851 | 1855 | 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 | |
1852 | 1861 | AppendMenu(hMenu, MF_SEPARATOR, 0, NULL); |
1853 | 1862 | AppendMenu(hMenu, MF_STRING | Flg1, MENU_FILESIZE, MSGJPN272); |
1854 | 1863 | AppendMenu(hMenu, MF_SEPARATOR, 0, NULL); |