OSDN Git Service

Modify documents.
[ffftp/ffftp.git] / src / hostman.c
1 /*=============================================================================\r
2 *\r
3 *                                                               ホスト一覧\r
4 *\r
5 ===============================================================================\r
6 / Copyright (C) 1997-2007 Sota. All rights reserved.\r
7 /\r
8 / Redistribution and use in source and binary forms, with or without \r
9 / modification, are permitted provided that the following conditions \r
10 / are met:\r
11 /\r
12 /  1. Redistributions of source code must retain the above copyright \r
13 /     notice, this list of conditions and the following disclaimer.\r
14 /  2. Redistributions in binary form must reproduce the above copyright \r
15 /     notice, this list of conditions and the following disclaimer in the \r
16 /     documentation and/or other materials provided with the distribution.\r
17 /\r
18 / THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR \r
19 / IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES \r
20 / OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \r
21 / IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, \r
22 / INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, \r
23 / BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF \r
24 / USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON \r
25 / ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT \r
26 / (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF \r
27 / THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
28 /============================================================================*/\r
29 \r
30 #define STRICT\r
31 // IPv6対応\r
32 #include <winsock2.h>\r
33 #include <windows.h>\r
34 #include <stdio.h>\r
35 #include <stdlib.h>\r
36 #include <string.h>\r
37 #include <commctrl.h>\r
38 #include <windowsx.h>\r
39 \r
40 #include "common.h"\r
41 #include "resource.h"\r
42 \r
43 #include <htmlhelp.h>\r
44 #include "helpid.h"\r
45 \r
46 // UTF-8対応\r
47 #undef __MBSWRAPPER_H__\r
48 #include "mbswrapper.h"\r
49 \r
50 \r
51 /*===== プロトタイプ =====*/\r
52 \r
53 // 64ビット対応\r
54 //static BOOL CALLBACK SelectHostProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);\r
55 static INT_PTR CALLBACK SelectHostProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);\r
56 static LRESULT CALLBACK HostListWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);\r
57 static HOSTLISTDATA *GetNextNode(HOSTLISTDATA *Pos);\r
58 static int GetNodeLevel(int Num);\r
59 static int GetNodeLevelByData(HOSTLISTDATA *Data);\r
60 static int GetNodeNumByData(HOSTLISTDATA *Data);\r
61 static HOSTLISTDATA *GetNodeByNum(int Num);\r
62 static int SetNodeLevelAll(void);\r
63 static int UpdateHostToList(int Num, HOSTDATA *Set);\r
64 static int DelHostFromList(int Num);\r
65 static int DeleteChildAndNext(HOSTLISTDATA *Pos);\r
66 static void SendAllHostNames(HWND hWnd, int Cur);\r
67 static int IsNodeGroup(int Num);\r
68 static int DispHostSetDlg(HWND hDlg);\r
69 // 64ビット対応\r
70 //static BOOL CALLBACK MainSettingProc(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);\r
71 //static BOOL CALLBACK AdvSettingProc(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);\r
72 //static BOOL CALLBACK CodeSettingProc(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);\r
73 //static BOOL CALLBACK DialupSettingProc(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);\r
74 //static BOOL CALLBACK Adv2SettingProc(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);\r
75 static INT_PTR CALLBACK MainSettingProc(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);\r
76 static INT_PTR CALLBACK AdvSettingProc(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);\r
77 static INT_PTR CALLBACK CodeSettingProc(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);\r
78 static INT_PTR CALLBACK DialupSettingProc(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);\r
79 static INT_PTR CALLBACK Adv2SettingProc(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);\r
80 // 暗号化通信対応\r
81 static INT_PTR CALLBACK CryptSettingProc(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);\r
82 // 同時接続対応\r
83 static INT_PTR CALLBACK Adv3SettingProc(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);\r
84 \r
85 /*===== 外部参照 =====*/\r
86 \r
87 extern HWND hHelpWin;\r
88 \r
89 /* 設定値 */\r
90 extern char UserMailAdrs[USER_MAIL_LEN+1];\r
91 extern HFONT ListFont;\r
92 extern char DefaultLocalPath[FMAX_PATH+1];\r
93 extern int ConnectAndSet;\r
94 extern SIZE HostDlgSize;\r
95 \r
96 /*===== ローカルなワーク =====*/\r
97 \r
98 static int Hosts = 0;                                           /* ホスト数 */\r
99 static int ConnectingHost;                                      /* 接続中のホスト */\r
100 static int CurrentHost;                                         /* カーソル位置のホスト */\r
101 static HOSTLISTDATA *HostListTop = NULL;        /* ホスト一覧データ */\r
102 static HOSTDATA TmpHost;                                        /* ホスト情報コピー用 */\r
103 static int Apply;                                                       /* プロパティシートでOKを押したフラグ */\r
104 static WNDPROC HostListProcPtr;\r
105 \r
106 // ホスト共通設定機能\r
107 HOSTDATA DefaultHost;\r
108 \r
109 \r
110 \r
111 /*----- ホスト一覧ウインドウ --------------------------------------------------\r
112 *\r
113 *       Parameter\r
114 *               int Type : ダイアログのタイプ (DLG_TYPE_xxx)\r
115 *\r
116 *       Return Value\r
117 *               ステータス (YES=実行/NO=取消)\r
118 *----------------------------------------------------------------------------*/\r
119 \r
120 int SelectHost(int Type)\r
121 {\r
122         int Sts;\r
123         int Dlg;\r
124 \r
125         Dlg = hostconnect_dlg;\r
126         if((ConnectAndSet == YES) || (Type == DLG_TYPE_SET))\r
127                 Dlg = hostlist_dlg;\r
128 \r
129         Sts = DialogBox(GetFtpInst(), MAKEINTRESOURCE(Dlg), GetMainHwnd(), SelectHostProc);\r
130 \r
131         /* ホスト設定を保存 */\r
132         SetNodeLevelAll();\r
133         SaveRegistry();\r
134 \r
135         return(Sts);\r
136 }\r
137 \r
138 \r
139 /*----- ホスト一覧ウインドウのコールバック ------------------------------------\r
140 *\r
141 *       Parameter\r
142 *               HWND hDlg : ウインドウハンドル\r
143 *               UINT message : メッセージ番号\r
144 *               WPARAM wParam : メッセージの WPARAM 引数\r
145 *               LPARAM lParam : メッセージの LPARAM 引数\r
146 *\r
147 *       Return Value\r
148 *               BOOL TRUE/FALSE\r
149 *----------------------------------------------------------------------------*/\r
150 \r
151 // 64ビット対応\r
152 //static BOOL CALLBACK SelectHostProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)\r
153 static INT_PTR CALLBACK SelectHostProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)\r
154 {\r
155         static DIALOGSIZE DlgSize = {\r
156                 // ホスト共通設定機能\r
157 //              { HOST_NEW, HOST_FOLDER, HOST_SET, HOST_COPY, HOST_DEL, HOST_DOWN, HOST_UP, IDHELP, HOST_SIZEGRIP, -1 },\r
158                 { HOST_NEW, HOST_FOLDER, HOST_SET, HOST_COPY, HOST_DEL, HOST_DOWN, HOST_UP, HOST_SET_DEFAULT, IDHELP, HOST_SIZEGRIP, -1 },\r
159                 { IDOK, IDCANCEL, HOST_SIZEGRIP, -1 },\r
160                 { HOST_LIST, -1 },\r
161                 { 0, 0 },\r
162                 { 0, 0 }\r
163         };\r
164         static HIMAGELIST hImage;\r
165         HTREEITEM hItem;\r
166         TV_ITEM Item;\r
167         int Level1;\r
168         int Level2;\r
169         HOSTLISTDATA *Data1;\r
170         HOSTLISTDATA *Data2;\r
171         // UTF-8対応\r
172 //      NM_TREEVIEW *tView;\r
173         NM_TREEVIEWW *tView;\r
174         HTREEITEM tViewPos;\r
175         TV_HITTESTINFO HitInfo;\r
176         // バグ修正\r
177         RECT Rect;\r
178 \r
179         switch (message)\r
180         {\r
181                 // バグ修正\r
182                 case WM_SIZE :\r
183                         GetWindowRect(hDlg, &Rect);\r
184                         DlgSizeChange(hDlg, &DlgSize, &Rect, 0);\r
185                         RedrawWindow(hDlg, NULL, NULL, RDW_INVALIDATE | RDW_ERASE | RDW_ALLCHILDREN);\r
186                         break;\r
187 \r
188                 case WM_INITDIALOG :\r
189                         /* TreeViewでのダブルクリックをつかまえるため */\r
190                         // 64ビット対応\r
191 //                      HostListProcPtr = (WNDPROC)SetWindowLong(GetDlgItem(hDlg, HOST_LIST), GWL_WNDPROC, (LONG)HostListWndProc);\r
192                         HostListProcPtr = (WNDPROC)SetWindowLongPtr(GetDlgItem(hDlg, HOST_LIST), GWLP_WNDPROC, (LONG_PTR)HostListWndProc);\r
193 \r
194 \r
195 //              SetClassLong(hDlg, GCL_HICON, (LONG)LoadIcon(GetFtpInst(), MAKEINTRESOURCE(ffftp)));\r
196 \r
197                         if(AskConnecting() == YES)\r
198                         {\r
199                                 /* 接続中は「変更」のみ許可 */\r
200                                 EnableWindow(GetDlgItem(hDlg, HOST_NEW), FALSE);\r
201                                 EnableWindow(GetDlgItem(hDlg, HOST_FOLDER), FALSE);\r
202                                 EnableWindow(GetDlgItem(hDlg, HOST_COPY), FALSE);\r
203                                 EnableWindow(GetDlgItem(hDlg, HOST_DEL), FALSE);\r
204                                 EnableWindow(GetDlgItem(hDlg, HOST_DOWN), FALSE);\r
205                                 EnableWindow(GetDlgItem(hDlg, HOST_UP), FALSE);\r
206                         }\r
207                         if(ListFont != NULL)\r
208                                 SendDlgItemMessage(hDlg, HOST_LIST, WM_SETFONT, (WPARAM)ListFont, MAKELPARAM(TRUE, 0));\r
209                         hImage = ImageList_LoadBitmap(GetFtpInst(), MAKEINTRESOURCE(hlist_bmp), 16, 8, RGB(255,0,0));\r
210                         SendDlgItemMessage(hDlg, HOST_LIST, TVM_SETIMAGELIST, TVSIL_NORMAL, (LPARAM)hImage);\r
211                         CurrentHost = 0;\r
212                         if(ConnectingHost >= 0)\r
213                                 CurrentHost = ConnectingHost;\r
214                         SendAllHostNames(GetDlgItem(hDlg, HOST_LIST), CurrentHost);\r
215                         DlgSizeInit(hDlg, &DlgSize, &HostDlgSize);\r
216                         return(TRUE);\r
217 \r
218                 case WM_COMMAND :\r
219                         switch(GET_WM_COMMAND_ID(wParam, lParam))\r
220                         {\r
221                                 case IDOK :\r
222                                         if((hItem = (HTREEITEM)SendDlgItemMessage(hDlg, HOST_LIST, TVM_GETNEXTITEM, TVGN_CARET, 0)) != NULL)\r
223                                         {\r
224                                                 Item.hItem = hItem;\r
225                                                 Item.mask = TVIF_PARAM;\r
226                                                 SendDlgItemMessage(hDlg, HOST_LIST, TVM_GETITEM, TVGN_CARET, (LPARAM)&Item);\r
227                                                 CurrentHost = Item.lParam;\r
228                                                 ConnectingHost = CurrentHost;\r
229                                                 AskDlgSize(hDlg, &DlgSize, &HostDlgSize);\r
230                                                 ImageList_Destroy(hImage);\r
231                                                 EndDialog(hDlg, YES);\r
232                                                 break;\r
233                                         }\r
234                                         /* ここにbreakはない */\r
235 \r
236                                 case IDCANCEL :\r
237                                         AskDlgSize(hDlg, &DlgSize, &HostDlgSize);\r
238                                         ImageList_Destroy(hImage);\r
239                                         EndDialog(hDlg, NO);\r
240                                         break;\r
241 \r
242                                 case HOST_NEW :\r
243                                         CopyDefaultHost(&TmpHost);\r
244                                         if(DispHostSetDlg(hDlg) == YES)\r
245                                         {\r
246                                                 if((hItem = (HTREEITEM)SendDlgItemMessage(hDlg, HOST_LIST, TVM_GETNEXTITEM, TVGN_CARET, 0)) != NULL)\r
247                                                 {\r
248                                                         Item.hItem = hItem;\r
249                                                         Item.mask = TVIF_PARAM;\r
250                                                         SendDlgItemMessage(hDlg, HOST_LIST, TVM_GETITEM, TVGN_CARET, (LPARAM)&Item);\r
251 \r
252                                                         TmpHost.Level = GetNodeLevel(Item.lParam);\r
253                                                         Level1 = Item.lParam + 1;\r
254                                                         CurrentHost = Level1;\r
255                                                 }\r
256                                                 else\r
257                                                 {\r
258                                                         TmpHost.Level = 0;\r
259                                                         Level1 = -1;\r
260                                                         CurrentHost = Hosts;\r
261                                                 }\r
262                                                 AddHostToList(&TmpHost, Level1, SET_LEVEL_SAME);\r
263                                                 SendAllHostNames(GetDlgItem(hDlg, HOST_LIST), CurrentHost);\r
264                                         }\r
265                                         break;\r
266 \r
267                                 case HOST_FOLDER :\r
268                                         CopyDefaultHost(&TmpHost);\r
269                                         if(InputDialogBox(group_dlg, hDlg, NULL, TmpHost.HostName, HOST_NAME_LEN+1, &Level1, IDH_HELP_TOPIC_0000001) == YES)\r
270                                         {\r
271                                                 if((hItem = (HTREEITEM)SendDlgItemMessage(hDlg, HOST_LIST, TVM_GETNEXTITEM, TVGN_CARET, 0)) != NULL)\r
272                                                 {\r
273                                                         Item.hItem = hItem;\r
274                                                         Item.mask = TVIF_PARAM;\r
275                                                         SendDlgItemMessage(hDlg, HOST_LIST, TVM_GETITEM, TVGN_CARET, (LPARAM)&Item);\r
276 \r
277                                                         TmpHost.Level = GetNodeLevel(Item.lParam) | SET_LEVEL_GROUP ;\r
278                                                         Level1 = Item.lParam + 1;\r
279                                                         CurrentHost = Level1;\r
280                                                 }\r
281                                                 else\r
282                                                 {\r
283                                                         TmpHost.Level = 0 | SET_LEVEL_GROUP;\r
284                                                         Level1 = -1;\r
285                                                         CurrentHost = Hosts;\r
286                                                 }\r
287                                                 AddHostToList(&TmpHost, Level1, SET_LEVEL_SAME);\r
288                                                 SendAllHostNames(GetDlgItem(hDlg, HOST_LIST), CurrentHost);\r
289                                         }\r
290                                         break;\r
291 \r
292                                 case HOST_SET :\r
293                                         if((hItem = (HTREEITEM)SendDlgItemMessage(hDlg, HOST_LIST, TVM_GETNEXTITEM, TVGN_CARET, 0)) != NULL)\r
294                                         {\r
295                                                 Item.hItem = hItem;\r
296                                                 Item.mask = TVIF_PARAM;\r
297                                                 SendDlgItemMessage(hDlg, HOST_LIST, TVM_GETITEM, TVGN_CARET, (LPARAM)&Item);\r
298                                                 CurrentHost = Item.lParam;\r
299 \r
300                                                 CopyHostFromList(CurrentHost, &TmpHost);\r
301                                                 Level1 = IsNodeGroup(CurrentHost);\r
302                                                 if(((Level1 == NO) && (DispHostSetDlg(hDlg) == YES)) ||\r
303                                                    ((Level1 == YES) && (InputDialogBox(group_dlg, hDlg, NULL, TmpHost.HostName, HOST_NAME_LEN+1, &Level1, IDH_HELP_TOPIC_0000001) == YES)))\r
304                                                 {\r
305                                                         UpdateHostToList(CurrentHost, &TmpHost);\r
306                                                         SendAllHostNames(GetDlgItem(hDlg, HOST_LIST), CurrentHost);\r
307                                                 }\r
308                                         }\r
309                                         break;\r
310 \r
311                                 case HOST_COPY :\r
312                                         if((hItem = (HTREEITEM)SendDlgItemMessage(hDlg, HOST_LIST, TVM_GETNEXTITEM, TVGN_CARET, 0)) != NULL)\r
313                                         {\r
314                                                 Item.hItem = hItem;\r
315                                                 Item.mask = TVIF_PARAM;\r
316                                                 SendDlgItemMessage(hDlg, HOST_LIST, TVM_GETITEM, TVGN_CARET, (LPARAM)&Item);\r
317                                                 CurrentHost = Item.lParam;\r
318 \r
319                                                 CopyHostFromList(CurrentHost, &TmpHost);\r
320                                                 strcpy(TmpHost.BookMark, "\0");\r
321                                                 CurrentHost++;\r
322                                                 AddHostToList(&TmpHost, CurrentHost, SET_LEVEL_SAME);\r
323                                                 SendAllHostNames(GetDlgItem(hDlg, HOST_LIST), CurrentHost);\r
324                                         }\r
325                                         break;\r
326 \r
327                                 case HOST_DEL :\r
328                                         if((hItem = (HTREEITEM)SendDlgItemMessage(hDlg, HOST_LIST, TVM_GETNEXTITEM, TVGN_CARET, 0)) != NULL)\r
329                                         {\r
330                                                 Item.hItem = hItem;\r
331                                                 Item.mask = TVIF_PARAM;\r
332                                                 SendDlgItemMessage(hDlg, HOST_LIST, TVM_GETITEM, TVGN_CARET, (LPARAM)&Item);\r
333                                                 CurrentHost = Item.lParam;\r
334                                                 Level1 = IsNodeGroup(CurrentHost);\r
335 \r
336                                                 // バグ修正\r
337 //                                              if(((Level1 == YES) && (DialogBox(GetFtpInst(), MAKEINTRESOURCE(groupdel_dlg), GetMainHwnd(), ExeEscDialogProc) == YES)) ||\r
338 //                                                 ((Level1 == NO) && (DialogBox(GetFtpInst(), MAKEINTRESOURCE(hostdel_dlg), GetMainHwnd(), ExeEscDialogProc) == YES)))\r
339                                                 if(((Level1 == YES) && (DialogBox(GetFtpInst(), MAKEINTRESOURCE(groupdel_dlg), hDlg, ExeEscDialogProc) == YES)) ||\r
340                                                    ((Level1 == NO) && (DialogBox(GetFtpInst(), MAKEINTRESOURCE(hostdel_dlg), hDlg, ExeEscDialogProc) == YES)))\r
341                                                 {\r
342                                                         DelHostFromList(CurrentHost);\r
343                                                         if(CurrentHost >= Hosts)\r
344                                                                 CurrentHost = max1(0, Hosts-1);\r
345                                                         SendAllHostNames(GetDlgItem(hDlg, HOST_LIST), CurrentHost);\r
346                                                 }\r
347                                         }\r
348                                         break;\r
349 \r
350                                 case HOST_UP :\r
351                                         if((hItem = (HTREEITEM)SendDlgItemMessage(hDlg, HOST_LIST, TVM_GETNEXTITEM, TVGN_CARET, 0)) != NULL)\r
352                                         {\r
353                                                 Item.hItem = hItem;\r
354                                                 Item.mask = TVIF_PARAM;\r
355                                                 SendDlgItemMessage(hDlg, HOST_LIST, TVM_GETITEM, TVGN_CARET, (LPARAM)&Item);\r
356                                                 CurrentHost = Item.lParam;\r
357 \r
358                                                 if(CurrentHost > 0)\r
359                                                 {\r
360                                                         Data1 = HostListTop;\r
361                                                         for(Level1 = CurrentHost; Level1 > 0; Level1--)\r
362                                                                 Data1 = GetNextNode(Data1);\r
363                                                         Level1 = GetNodeLevel(CurrentHost);\r
364 \r
365                                                         Data2 = HostListTop;\r
366                                                         for(Level2 = CurrentHost-1; Level2 > 0; Level2--)\r
367                                                                 Data2 = GetNextNode(Data2);\r
368                                                         Level2 = GetNodeLevel(CurrentHost-1);\r
369 \r
370                                                         if((Level1 == Level2) && (Data2->Set.Level & SET_LEVEL_GROUP))\r
371                                                         {\r
372                                                                 //Data2のchildへ\r
373                                                                 if(Data1->Next != NULL)\r
374                                                                         Data1->Next->Prev = Data1->Prev;\r
375                                                                 if(Data1->Prev != NULL)\r
376                                                                         Data1->Prev->Next = Data1->Next;\r
377                                                                 if((Data1->Parent != NULL) && (Data1->Parent->Child == Data1))\r
378                                                                         Data1->Parent->Child = Data1->Next;\r
379                                                                 if((Data1->Parent == NULL) && (HostListTop == Data1))\r
380                                                                         HostListTop = Data1->Next;\r
381 \r
382                                                                 Data1->Next = Data2->Child;\r
383                                                                 Data1->Prev = NULL;\r
384                                                                 Data1->Parent = Data2;\r
385                                                                 Data2->Child = Data1;\r
386                                                         }\r
387                                                         else if(Level1 < Level2)\r
388                                                         {\r
389                                                                 //Data1のPrevのChildのNextの末尾へ\r
390                                                                 Data2 = Data1->Prev->Child;\r
391                                                                 while(Data2->Next != NULL)\r
392                                                                         Data2 = Data2->Next;\r
393 \r
394                                                                 if(Data1->Next != NULL)\r
395                                                                         Data1->Next->Prev = Data1->Prev;\r
396                                                                 if(Data1->Prev != NULL)\r
397                                                                         Data1->Prev->Next = Data1->Next;\r
398                                                                 if((Data1->Parent != NULL) && (Data1->Parent->Child == Data1))\r
399                                                                         Data1->Parent->Child = Data1->Next;\r
400                                                                 if((Data1->Parent == NULL) && (HostListTop == Data1))\r
401                                                                         HostListTop = Data1->Next;\r
402 \r
403                                                                 Data2->Next = Data1;\r
404                                                                 Data1->Prev = Data2;\r
405                                                                 Data1->Next = NULL;\r
406                                                                 Data1->Parent = Data2->Parent;\r
407                                                         }\r
408                                                         else\r
409                                                         {\r
410                                                                 //Data2のprevへ\r
411                                                                 if(Data1->Next != NULL)\r
412                                                                         Data1->Next->Prev = Data1->Prev;\r
413                                                                 if(Data1->Prev != NULL)\r
414                                                                         Data1->Prev->Next = Data1->Next;\r
415                                                                 if((Data1->Parent != NULL) && (Data1->Parent->Child == Data1))\r
416                                                                         Data1->Parent->Child = Data1->Next;\r
417                                                                 if((Data1->Parent == NULL) && (HostListTop == Data1))\r
418                                                                         HostListTop = Data1->Next;\r
419 \r
420                                                                 if(Data2->Prev != NULL)\r
421                                                                         Data2->Prev->Next = Data1;\r
422                                                                 Data1->Prev = Data2->Prev;\r
423                                                                 Data2->Prev = Data1;\r
424                                                                 Data1->Next = Data2;\r
425                                                                 Data1->Parent = Data2->Parent;\r
426 \r
427                                                                 if((Data1->Parent != NULL) && (Data1->Parent->Child == Data2))\r
428                                                                         Data1->Parent->Child = Data1;\r
429                                                                 if((Data1->Parent == NULL) && (HostListTop == Data2))\r
430                                                                         HostListTop = Data1;\r
431                                                         }\r
432 \r
433                                                         CurrentHost = GetNodeNumByData(Data1);\r
434                                                         SendAllHostNames(GetDlgItem(hDlg, HOST_LIST), CurrentHost);\r
435                                                 }\r
436                                         }\r
437                                         break;\r
438 \r
439                                 case HOST_DOWN :\r
440                                         if((hItem = (HTREEITEM)SendDlgItemMessage(hDlg, HOST_LIST, TVM_GETNEXTITEM, TVGN_CARET, 0)) != NULL)\r
441                                         {\r
442                                                 Item.hItem = hItem;\r
443                                                 Item.mask = TVIF_PARAM;\r
444                                                 SendDlgItemMessage(hDlg, HOST_LIST, TVM_GETITEM, TVGN_CARET, (LPARAM)&Item);\r
445                                                 CurrentHost = Item.lParam;\r
446 \r
447                                                 Data1 = HostListTop;\r
448                                                 for(Level1 = CurrentHost; Level1 > 0; Level1--)\r
449                                                         Data1 = GetNextNode(Data1);\r
450                                                 Level1 = GetNodeLevel(CurrentHost);\r
451 \r
452                                                 Data2 = NULL;\r
453                                                 Level2 = SET_LEVEL_SAME;\r
454                                                 if(CurrentHost < Hosts-1)\r
455                                                 {\r
456                                                         Data2 = HostListTop;\r
457                                                         for(Level2 = CurrentHost+1; Level2 > 0; Level2--)\r
458                                                                 Data2 = GetNextNode(Data2);\r
459                                                         Level2 = GetNodeLevel(CurrentHost+1);\r
460 \r
461                                                         if(Level1 < Level2)\r
462                                                         {\r
463                                                                 if(Data1->Next != NULL)\r
464                                                                 {\r
465                                                                         //Data2 = Data1のNext\r
466                                                                         Data2 = Data1->Next;\r
467                                                                         Level2 = GetNodeLevelByData(Data2);\r
468                                                                 }\r
469                                                                 else if(Data1->Parent != NULL)\r
470                                                                 {\r
471                                                                         Data2 = NULL;\r
472                                                                         Level2 = SET_LEVEL_SAME;\r
473                                                                 }\r
474                                                         }\r
475                                                 }\r
476 \r
477                                                 if(((Data2 == NULL) && (Level1 > 0)) ||\r
478                                                    (Level1 > Level2))\r
479                                                 {\r
480                                                         //Data1のParentのNextへ\r
481                                                         Data2 = Data1->Parent;\r
482 \r
483                                                         if(Data1->Next != NULL)\r
484                                                                 Data1->Next->Prev = Data1->Prev;\r
485                                                         if(Data1->Prev != NULL)\r
486                                                                 Data1->Prev->Next = Data1->Next;\r
487                                                         if((Data1->Parent != NULL) && (Data1->Parent->Child == Data1))\r
488                                                                 Data1->Parent->Child = Data1->Next;\r
489                                                         if((Data1->Parent == NULL) && (HostListTop == Data1))\r
490                                                                 HostListTop = Data1->Next;\r
491 \r
492                                                         if(Data2->Next != NULL)\r
493                                                                 Data2->Next->Prev = Data1;\r
494                                                         Data1->Next = Data2->Next;\r
495                                                         Data2->Next = Data1;\r
496                                                         Data1->Prev = Data2;\r
497                                                         Data1->Parent = Data2->Parent;\r
498 \r
499                                                         if((Data1->Parent != NULL) && (Data1->Parent->Child == Data1))\r
500                                                                 Data1->Parent->Child = Data2;\r
501                                                         if((Data1->Parent == NULL) && (HostListTop == Data1))\r
502                                                                 HostListTop = Data2;\r
503                                                 }\r
504                                                 else if(Level1 == Level2)\r
505                                                 {\r
506                                                         if(Data2->Set.Level & SET_LEVEL_GROUP)\r
507                                                         {\r
508                                                                 //Data2のChildへ\r
509                                                                 if(Data1->Next != NULL)\r
510                                                                         Data1->Next->Prev = Data1->Prev;\r
511                                                                 if(Data1->Prev != NULL)\r
512                                                                         Data1->Prev->Next = Data1->Next;\r
513                                                                 if((Data1->Parent != NULL) && (Data1->Parent->Child == Data1))\r
514                                                                         Data1->Parent->Child = Data1->Next;\r
515                                                                 if((Data1->Parent == NULL) && (HostListTop == Data1))\r
516                                                                         HostListTop = Data1->Next;\r
517 \r
518                                                                 if(Data2->Child != NULL)\r
519                                                                         Data2->Child->Prev = Data1;\r
520                                                                 Data1->Next = Data2->Child;\r
521                                                                 Data1->Prev = NULL;\r
522                                                                 Data1->Parent = Data2;\r
523                                                                 Data2->Child = Data1;\r
524                                                         }\r
525                                                         else\r
526                                                         {\r
527                                                                 //Data2のNextへ\r
528                                                                 if(Data1->Next != NULL)\r
529                                                                         Data1->Next->Prev = Data1->Prev;\r
530                                                                 if(Data1->Prev != NULL)\r
531                                                                         Data1->Prev->Next = Data1->Next;\r
532                                                                 if((Data1->Parent != NULL) && (Data1->Parent->Child == Data1))\r
533                                                                         Data1->Parent->Child = Data1->Next;\r
534                                                                 if((Data1->Parent == NULL) && (HostListTop == Data1))\r
535                                                                         HostListTop = Data1->Next;\r
536 \r
537                                                                 if(Data2->Next != NULL)\r
538                                                                         Data2->Next->Prev = Data1;\r
539                                                                 Data1->Next = Data2->Next;\r
540                                                                 Data2->Next = Data1;\r
541                                                                 Data1->Prev = Data2;\r
542                                                                 Data1->Parent = Data2->Parent;\r
543 \r
544                                                                 if((Data1->Parent != NULL) && (Data1->Parent->Child == Data1))\r
545                                                                         Data1->Parent->Child = Data2;\r
546                                                                 if((Data1->Parent == NULL) && (HostListTop == Data1))\r
547                                                                         HostListTop = Data2;\r
548                                                         }\r
549                                                 }\r
550 \r
551                                                 CurrentHost = GetNodeNumByData(Data1);\r
552                                                 SendAllHostNames(GetDlgItem(hDlg, HOST_LIST), CurrentHost);\r
553                                         }\r
554                                         break;\r
555 \r
556                                 // ホスト共通設定機能\r
557                                 case HOST_SET_DEFAULT :\r
558                                         CopyDefaultHost(&TmpHost);\r
559                                         if(DispHostSetDlg(hDlg) == YES)\r
560                                                 SetDefaultHost(&TmpHost);\r
561                                         break;\r
562 \r
563                                 case HOST_LIST :\r
564                                         if(HIWORD(wParam) == LBN_DBLCLK)\r
565                                                 PostMessage(hDlg, WM_COMMAND, MAKEWORD(IDOK, 0), 0);\r
566                                         break;\r
567 \r
568                                 case IDHELP :\r
569                                         hHelpWin = HtmlHelp(NULL, AskHelpFilePath(), HH_HELP_CONTEXT, IDH_HELP_TOPIC_0000027);\r
570                                         break;\r
571                         }\r
572                         SetFocus(GetDlgItem(hDlg, HOST_LIST));\r
573                         return(TRUE);\r
574 \r
575                 case WM_SIZING :\r
576                         DlgSizeChange(hDlg, &DlgSize, (RECT *)lParam, (int)wParam);\r
577                         return(TRUE);\r
578 \r
579                 case WM_SELECT_HOST :\r
580                         HitInfo.pt.x = LOWORD(lParam);\r
581                         HitInfo.pt.y = HIWORD(lParam);\r
582                         HitInfo.flags = TVHT_ONITEM;\r
583                         hItem = (HTREEITEM)SendDlgItemMessage(hDlg, HOST_LIST, TVM_GETNEXTITEM, TVGN_CARET, 0);\r
584                         HitInfo.hItem = hItem;\r
585                         if((HTREEITEM)SendMessage(GetDlgItem(hDlg, HOST_LIST), TVM_HITTEST, 0, (LPARAM)&HitInfo) == hItem)\r
586                         {\r
587                                 if(IsWindowEnabled(GetDlgItem(hDlg, IDOK)) == TRUE)\r
588                                         PostMessage(hDlg, WM_COMMAND, MAKEWPARAM(IDOK, 0), 0);\r
589                         }\r
590                         break;\r
591 \r
592                 case WM_NOTIFY:\r
593                         // UTF-8対応\r
594 //                      tView = (NM_TREEVIEW FAR *)lParam;\r
595                         tView = (NM_TREEVIEWW FAR *)lParam;\r
596                         switch(tView->hdr.idFrom)\r
597                         {\r
598                                 case HOST_LIST :\r
599                                         tViewPos = tView->itemNew.hItem;\r
600                                         hItem = tView->itemNew.hItem;\r
601                                         switch(tView->hdr.code)\r
602                                         {\r
603                                                 // UTF-8対応\r
604 //                                              case TVN_SELCHANGED :\r
605                                                 case TVN_SELCHANGEDW :\r
606                                                         /* フォルダが選ばれたときは接続、コピーボタンは禁止 */\r
607                                                         Item.hItem = hItem;\r
608                                                         Item.mask = TVIF_PARAM;\r
609                                                         SendDlgItemMessage(hDlg, HOST_LIST, TVM_GETITEM, TVGN_CARET, (LPARAM)&Item);\r
610                                                         if(IsNodeGroup(Item.lParam) == YES)\r
611                                                         {\r
612                                                                 EnableWindow(GetDlgItem(hDlg, IDOK), FALSE);\r
613                                                                 EnableWindow(GetDlgItem(hDlg, HOST_COPY), FALSE);\r
614                                                         }\r
615                                                         else\r
616                                                         {\r
617                                                                 EnableWindow(GetDlgItem(hDlg, IDOK), TRUE);\r
618                                                                 if(AskConnecting() == NO)\r
619                                                                         EnableWindow(GetDlgItem(hDlg, HOST_COPY), TRUE);\r
620                                                         }\r
621                                                         break;\r
622                                         }\r
623                                         break;\r
624                         }\r
625                         break;\r
626         }\r
627         return(FALSE);\r
628 }\r
629 \r
630 \r
631 /*----- ホスト一覧TreeViewのメッセージ処理 ------------------------------------\r
632 *\r
633 *       Parameter\r
634 *               HWND hWnd : ウインドウハンドル\r
635 *               UINT message  : メッセージ番号\r
636 *               WPARAM wParam : メッセージの WPARAM 引数\r
637 *               LPARAM lParam : メッセージの LPARAM 引数\r
638 *\r
639 *       Return Value\r
640 *               メッセージに対応する戻り値\r
641 *----------------------------------------------------------------------------*/\r
642 \r
643 static LRESULT CALLBACK HostListWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)\r
644 {\r
645         switch (message)\r
646         {\r
647                 case WM_LBUTTONDBLCLK :\r
648                         PostMessage(GetParent(hWnd), WM_SELECT_HOST, 0, lParam);\r
649                         break;\r
650         }\r
651         return(CallWindowProc(HostListProcPtr, hWnd, message, wParam, lParam));\r
652 }\r
653 \r
654 \r
655 /*----- 次の設定番号のノードを返す --------------------------------------------\r
656 *\r
657 *       Parameter\r
658 *               HOSTLISTDATA *Pos : ノードデータ\r
659 *\r
660 *       Return Value\r
661 *               HOSTLISTDATA *次のノード\r
662 *                       NULL=次はない\r
663 *----------------------------------------------------------------------------*/\r
664 \r
665 static HOSTLISTDATA *GetNextNode(HOSTLISTDATA *Pos)\r
666 {\r
667         HOSTLISTDATA *Ret;\r
668 \r
669         Ret = NULL;\r
670         if(Pos->Child != NULL)\r
671                 Ret = Pos->Child;\r
672         else\r
673         {\r
674                 if(Pos->Next != NULL)\r
675                         Ret = Pos->Next;\r
676                 else\r
677                 {\r
678                         while(Pos->Parent != NULL)\r
679                         {\r
680                                 Pos = Pos->Parent;\r
681                                 if(Pos->Next != NULL)\r
682                                 {\r
683                                         Ret = Pos->Next;\r
684                                         break;\r
685                                 }\r
686                         }\r
687                 }\r
688         }\r
689         return(Ret);\r
690 }\r
691 \r
692 \r
693 /*----- ノードのレベル数を返す(設定番号指定) --------------------------------\r
694 *\r
695 *       Parameter\r
696 *               int Num : 設定値号番号\r
697 *\r
698 *       Return Value\r
699 *               int レベル数 (-1=設定がない)\r
700 *----------------------------------------------------------------------------*/\r
701 \r
702 static int GetNodeLevel(int Num)\r
703 {\r
704         int Ret;\r
705         HOSTLISTDATA *Pos;\r
706 \r
707         Ret = -1;\r
708         if((Num >= 0) && (Num < Hosts))\r
709         {\r
710                 Pos = GetNodeByNum(Num);\r
711                 Ret = 0;\r
712                 while(Pos->Parent != NULL)\r
713                 {\r
714                         Pos = Pos->Parent;\r
715                         Ret++;\r
716                 }\r
717         }\r
718         return(Ret);\r
719 }\r
720 \r
721 \r
722 /*----- ノードのレベル数を返す(ノードデータ指定)-----------------------------\r
723 *\r
724 *       Parameter\r
725 *               HOSTLISTDATA *Data : 設定値\r
726 *\r
727 *       Return Value\r
728 *               int レベル数\r
729 *----------------------------------------------------------------------------*/\r
730 \r
731 static int GetNodeLevelByData(HOSTLISTDATA *Data)\r
732 {\r
733         int Ret;\r
734 \r
735         Ret = 0;\r
736         while(Data->Parent != NULL)\r
737         {\r
738                 Data = Data->Parent;\r
739                 Ret++;\r
740         }\r
741         return(Ret);\r
742 }\r
743 \r
744 \r
745 /*----- ノードの設定番号を返す ------------------------------------------------\r
746 *\r
747 *       Parameter\r
748 *               HOSTLISTDATA *Data : 設定値\r
749 *\r
750 *       Return Value\r
751 *               int 設定番号\r
752 *----------------------------------------------------------------------------*/\r
753 \r
754 static int GetNodeNumByData(HOSTLISTDATA *Data)\r
755 {\r
756         int Ret;\r
757         HOSTLISTDATA *Pos;\r
758 \r
759         Ret = 0;\r
760         Pos = HostListTop;\r
761         while(Pos != Data)\r
762         {\r
763                 Pos = GetNextNode(Pos);\r
764                 Ret++;\r
765         }\r
766         return(Ret);\r
767 }\r
768 \r
769 \r
770 /*----- 指定番号のノードを返す ------------------------------------------------\r
771 *\r
772 *       Parameter\r
773 *               int Num : 設定番号\r
774 *\r
775 *       Return Value\r
776 *               HOSTLISTDATA * : 設定値\r
777 *----------------------------------------------------------------------------*/\r
778 \r
779 static HOSTLISTDATA *GetNodeByNum(int Num)\r
780 {\r
781         HOSTLISTDATA *Pos;\r
782 \r
783         Pos = HostListTop;\r
784         for(; Num > 0; Num--)\r
785                 Pos = GetNextNode(Pos);\r
786 \r
787         return(Pos);\r
788 }\r
789 \r
790 \r
791 /*----- 設定値リストの各ノードのレベル番号をセット ----------------------------\r
792 *\r
793 *       Parameter\r
794 *               int Num : 設定番号\r
795 *\r
796 *       Return Value\r
797 *               HOSTLISTDATA * : 設定値\r
798 *----------------------------------------------------------------------------*/\r
799 \r
800 static int SetNodeLevelAll(void)\r
801 {\r
802         HOSTLISTDATA *Pos;\r
803         int i;\r
804 \r
805         Pos = HostListTop;\r
806         for(i = 0; i < Hosts; i++)\r
807         {\r
808                 Pos->Set.Level &= ~SET_LEVEL_MASK;\r
809                 Pos->Set.Level |= GetNodeLevelByData(Pos);\r
810                 Pos = GetNextNode(Pos);\r
811         }\r
812         return(FFFTP_SUCCESS);\r
813 }\r
814 \r
815 \r
816 /*----- 設定値リストに追加 ----------------------------------------------------\r
817 *\r
818 *       Parameter\r
819 *               HOSTDATA *Set : 追加する設定値\r
820 *               int Pos : 追加する位置 (0~ : -1=最後)\r
821 *               int Level : レベル数 (SET_LEVEL_SAME=追加位置のものと同レベル)\r
822 *\r
823 *       Return Value\r
824 *               int ステータス\r
825 *                       FFFTP_SUCCESS/FFFTP_FAIL\r
826 *----------------------------------------------------------------------------*/\r
827 \r
828 int AddHostToList(HOSTDATA *Set, int Pos, int Level)\r
829 {\r
830         int Sts;\r
831         HOSTLISTDATA *New;\r
832         HOSTLISTDATA *Last;\r
833         int Cur;\r
834 \r
835         Sts = FFFTP_FAIL;\r
836         if((Pos >= -1) && (Pos <= Hosts))\r
837         {\r
838                 if(Pos == -1)\r
839                         Pos = Hosts;\r
840                 Level &= SET_LEVEL_MASK;\r
841 \r
842                 if((New = malloc(sizeof(HOSTLISTDATA))) != NULL)\r
843                 {\r
844                         memcpy(&New->Set, Set, sizeof(HOSTDATA));\r
845                         New->Next = NULL;\r
846                         New->Prev = NULL;\r
847                         New->Child = NULL;\r
848                         New->Parent = NULL;\r
849 \r
850                         if(HostListTop == NULL)\r
851                         {\r
852                                 if(Pos == 0)\r
853                                         HostListTop = New;\r
854                         }\r
855                         else\r
856                         {\r
857                                 if(Pos == 0)\r
858                                 {\r
859                                         New->Next = HostListTop;\r
860                                         HostListTop = New;\r
861                                 }\r
862                                 else\r
863                                 {\r
864                                         Cur = GetNodeLevel(Pos-1);\r
865                                         Last = HostListTop;\r
866                                         for(Pos--; Pos > 0; Pos--)\r
867                                                 Last = GetNextNode(Last);\r
868                                         if((Level != SET_LEVEL_SAME) && (Level > Cur))\r
869                                         {\r
870                                                 New->Next = Last->Child;\r
871                                                 New->Parent = Last;\r
872                                                 Last->Child = New;\r
873                                                 if(New->Next != NULL)\r
874                                                         New->Next->Prev = New;\r
875                                         }\r
876                                         else\r
877                                         {\r
878                                                 if((Level >= 0) && (Level < SET_LEVEL_SAME))\r
879                                                 {\r
880                                                         for(; Level < Cur; Cur--)\r
881                                                                 Last = Last->Parent;\r
882                                                 }\r
883                                                 New->Prev = Last;\r
884                                                 New->Next = Last->Next;\r
885                                                 New->Parent = Last->Parent;\r
886                                                 Last->Next = New;\r
887                                                 if(New->Next != NULL)\r
888                                                         New->Next->Prev = New;\r
889                                         }\r
890                                 }\r
891                         }\r
892                         Hosts++;\r
893                         Sts = FFFTP_SUCCESS;\r
894                 }\r
895         }\r
896         return(Sts);\r
897 }\r
898 \r
899 \r
900 /*----- 設定値リストを更新する ------------------------------------------------\r
901 *\r
902 *       Parameter\r
903 *               int Num : 設定値号番号\r
904 *               HOSTDATA *Set : 設定値をコピーするワーク\r
905 *\r
906 *       Return Value\r
907 *               int ステータス\r
908 *                       FFFTP_SUCCESS/FFFTP_FAIL\r
909 *----------------------------------------------------------------------------*/\r
910 \r
911 static int UpdateHostToList(int Num, HOSTDATA *Set)\r
912 {\r
913         int Sts;\r
914         HOSTLISTDATA *Pos;\r
915 \r
916         Sts = FFFTP_FAIL;\r
917         if((Num >= 0) && (Num < Hosts))\r
918         {\r
919                 Pos = GetNodeByNum(Num);\r
920                 memcpy(&Pos->Set, Set, sizeof(HOSTDATA));\r
921                 Sts = FFFTP_SUCCESS;\r
922         }\r
923         return(Sts);\r
924 }\r
925 \r
926 \r
927 /*----- 設定値リストから削除 --------------------------------------------------\r
928 *\r
929 *       Parameter\r
930 *               int Num : 削除する番号\r
931 *\r
932 *       Return Value\r
933 *               int ステータス\r
934 *                       FFFTP_SUCCESS/FFFTP_FAIL\r
935 *----------------------------------------------------------------------------*/\r
936 \r
937 static int DelHostFromList(int Num)\r
938 {\r
939         int Sts;\r
940         HOSTLISTDATA *Pos;\r
941 \r
942         Sts = FFFTP_FAIL;\r
943         if((Num >= 0) && (Num < Hosts))\r
944         {\r
945                 if(Num == 0)\r
946                 {\r
947                         Pos = HostListTop;\r
948                         if(Pos->Child != NULL)\r
949                                 DeleteChildAndNext(Pos->Child);\r
950                         HostListTop = Pos->Next;\r
951                 }\r
952                 else\r
953                 {\r
954                         Pos = GetNodeByNum(Num);\r
955                         if(Pos->Child != NULL)\r
956                                 DeleteChildAndNext(Pos->Child);\r
957 \r
958                         if(Pos->Next != NULL)\r
959                                 Pos->Next->Prev = Pos->Prev;\r
960                         if(Pos->Prev != NULL)\r
961                                 Pos->Prev->Next = Pos->Next;\r
962                         if((Pos->Parent != NULL) && (Pos->Parent->Child == Pos))\r
963                                 Pos->Parent->Child = Pos->Next;\r
964                 }\r
965                 free(Pos);\r
966                 Hosts--;\r
967                 Sts = FFFTP_SUCCESS;\r
968         }\r
969         return(Sts);\r
970 }\r
971 \r
972 \r
973 /*----- 設定値リストからノードデータを削除 ------------------------------------\r
974 *\r
975 *       Parameter\r
976 *               HOSTLISTDATA *Pos : 削除するノード\r
977 *\r
978 *       Return Value\r
979 *               int ステータス\r
980 *                       FFFTP_SUCCESS/FFFTP_FAIL\r
981 *\r
982 *       Note\r
983 *               Pos->Next, Pos->Childの全てのノードを削除する\r
984 *----------------------------------------------------------------------------*/\r
985 \r
986 static int DeleteChildAndNext(HOSTLISTDATA *Pos)\r
987 {\r
988         HOSTLISTDATA *Next;\r
989 \r
990         while(Pos != NULL)\r
991         {\r
992                 if(Pos->Child != NULL)\r
993                         DeleteChildAndNext(Pos->Child);\r
994 \r
995                 Next = Pos->Next;\r
996                 free(Pos);\r
997                 Hosts--;\r
998                 Pos = Next;\r
999         }\r
1000         return(FFFTP_SUCCESS);\r
1001 }\r
1002 \r
1003 \r
1004 /*----- 設定値リストから設定値を取り出す --------------------------------------\r
1005 *\r
1006 *       Parameter\r
1007 *               int Num : 設定値号番号\r
1008 *               HOSTDATA *Set : 設定値をコピーするワーク\r
1009 *\r
1010 *       Return Value\r
1011 *               int ステータス\r
1012 *                       FFFTP_SUCCESS/FFFTP_FAIL\r
1013 *\r
1014 *       Note\r
1015 *               現在ホストに接続中の時は、CopyHostFromListInConnect() を使う事\r
1016 *----------------------------------------------------------------------------*/\r
1017 \r
1018 int CopyHostFromList(int Num, HOSTDATA *Set)\r
1019 {\r
1020         int Sts;\r
1021         HOSTLISTDATA *Pos;\r
1022 \r
1023         Sts = FFFTP_FAIL;\r
1024         if((Num >= 0) && (Num < Hosts))\r
1025         {\r
1026                 Pos = GetNodeByNum(Num);\r
1027                 memcpy(Set, &Pos->Set, sizeof(HOSTDATA));\r
1028                 Sts = FFFTP_SUCCESS;\r
1029         }\r
1030         return(Sts);\r
1031 }\r
1032 \r
1033 \r
1034 /*----- 設定値リストから設定値を取り出す --------------------------------------\r
1035 *\r
1036 *       Parameter\r
1037 *               int Num : 設定値号番号\r
1038 *               HOSTDATA *Set : 設定値をコピーするワーク\r
1039 *\r
1040 *       Return Value\r
1041 *               int ステータス\r
1042 *                       FFFTP_SUCCESS/FFFTP_FAIL\r
1043 *\r
1044 *       Note\r
1045 *               現在ホストに接続中の時に使う\r
1046 *----------------------------------------------------------------------------*/\r
1047 \r
1048 int CopyHostFromListInConnect(int Num, HOSTDATA *Set)\r
1049 {\r
1050         int Sts;\r
1051         HOSTLISTDATA *Pos;\r
1052 \r
1053         Sts = FFFTP_FAIL;\r
1054         if((Num >= 0) && (Num < Hosts))\r
1055         {\r
1056                 Pos = GetNodeByNum(Num);\r
1057                 strcpy(Set->ChmodCmd, Pos->Set.ChmodCmd);\r
1058                 Set->Port = Pos->Set.Port;\r
1059                 Set->Anonymous = Pos->Set.Anonymous;\r
1060                 Set->KanjiCode = Pos->Set.KanjiCode;\r
1061                 Set->KanaCnv = Pos->Set.KanaCnv;\r
1062                 Set->NameKanjiCode = Pos->Set.NameKanjiCode;\r
1063                 Set->NameKanaCnv = Pos->Set.NameKanaCnv;\r
1064                 Set->Pasv = Pos->Set.Pasv;\r
1065                 Set->FireWall = Pos->Set.FireWall;\r
1066                 Set->ListCmdOnly = Pos->Set.ListCmdOnly;\r
1067                 Set->UseNLST_R = Pos->Set.UseNLST_R;\r
1068                 Set->LastDir = Pos->Set.LastDir;\r
1069                 Set->TimeZone = Pos->Set.TimeZone;\r
1070                 // 暗号化通信対応\r
1071                 Set->UseNoEncryption = Pos->Set.UseNoEncryption;\r
1072                 Set->UseFTPES = Pos->Set.UseFTPES;\r
1073                 Set->UseFTPIS = Pos->Set.UseFTPIS;\r
1074                 Set->UseSFTP = Pos->Set.UseSFTP;\r
1075                 strcpy(Set->PrivateKey, Pos->Set.PrivateKey);\r
1076                 Set->NoWeakEncryption = Pos->Set.NoWeakEncryption;\r
1077                 // 同時接続対応\r
1078                 Set->MaxThreadCount = Pos->Set.MaxThreadCount;\r
1079                 Set->ReuseCmdSkt = Pos->Set.ReuseCmdSkt;\r
1080                 // MLSD対応\r
1081                 Set->UseMLSD = Pos->Set.UseMLSD;\r
1082                 // IPv6対応\r
1083                 Set->NetType = Pos->Set.NetType;\r
1084                 // 自動切断対策\r
1085                 Set->NoopInterval = Pos->Set.NoopInterval;\r
1086                 // 再転送対応\r
1087                 Set->TransferErrorMode = Pos->Set.TransferErrorMode;\r
1088                 Set->TransferErrorNotify = Pos->Set.TransferErrorNotify;\r
1089                 // セッションあたりの転送量制限対策\r
1090                 Set->TransferErrorReconnect = Pos->Set.TransferErrorReconnect;\r
1091                 // ホスト側の設定ミス対策\r
1092                 Set->NoPasvAdrs = Pos->Set.NoPasvAdrs;\r
1093                 Sts = FFFTP_SUCCESS;\r
1094         }\r
1095         return(Sts);\r
1096 }\r
1097 \r
1098 \r
1099 /*----- 設定値リストのブックマークを更新 --------------------------------------\r
1100 *\r
1101 *       Parameter\r
1102 *               int Num : 設定値号番号\r
1103 *               char *Bmask : ブックマーク文字列\r
1104 *               int Len : ブックマーク文字列の長さ\r
1105 *\r
1106 *       Return Value\r
1107 *               int ステータス\r
1108 *                       FFFTP_SUCCESS/FFFTP_FAIL\r
1109 *----------------------------------------------------------------------------*/\r
1110 \r
1111 int SetHostBookMark(int Num, char *Bmask, int Len)\r
1112 {\r
1113         int Sts;\r
1114         HOSTLISTDATA *Pos;\r
1115 \r
1116         Sts = FFFTP_FAIL;\r
1117         if((Num >= 0) && (Num < Hosts))\r
1118         {\r
1119                 Pos = GetNodeByNum(Num);\r
1120                 memcpy(Pos->Set.BookMark, Bmask, Len);\r
1121                 Sts = FFFTP_SUCCESS;\r
1122         }\r
1123         return(Sts);\r
1124 }\r
1125 \r
1126 \r
1127 /*----- 設定値リストのブックマーク文字列を返す --------------------------------\r
1128 *\r
1129 *       Parameter\r
1130 *               int Num : 設定値号番号\r
1131 *\r
1132 *       Return Value\r
1133 *               char *ブックマーク文字列\r
1134 *----------------------------------------------------------------------------*/\r
1135 \r
1136 char *AskHostBookMark(int Num)\r
1137 {\r
1138         char *Ret;\r
1139         HOSTLISTDATA *Pos;\r
1140 \r
1141         Ret = NULL;\r
1142         if((Num >= 0) && (Num < Hosts))\r
1143         {\r
1144                 Pos = GetNodeByNum(Num);\r
1145                 Ret = Pos->Set.BookMark;\r
1146         }\r
1147         return(Ret);\r
1148 }\r
1149 \r
1150 \r
1151 /*----- 設定値リストのディレクトリを更新 --------------------------------------\r
1152 *\r
1153 *       Parameter\r
1154 *               int Num : 設定値号番号\r
1155 *               char *LocDir : ローカルのディレクトリ\r
1156 *               char *HostDir : ホストのディレクトリ\r
1157 *\r
1158 *       Return Value\r
1159 *               int ステータス\r
1160 *                       FFFTP_SUCCESS/FFFTP_FAIL\r
1161 *----------------------------------------------------------------------------*/\r
1162 \r
1163 int SetHostDir(int Num, char *LocDir, char *HostDir)\r
1164 {\r
1165         int Sts;\r
1166         HOSTLISTDATA *Pos;\r
1167 \r
1168         Sts = FFFTP_FAIL;\r
1169         if((Num >= 0) && (Num < Hosts))\r
1170         {\r
1171                 Pos = GetNodeByNum(Num);\r
1172                 strcpy(Pos->Set.LocalInitDir, LocDir);\r
1173                 strcpy(Pos->Set.RemoteInitDir, HostDir);\r
1174                 Sts = FFFTP_SUCCESS;\r
1175         }\r
1176         return(Sts);\r
1177 }\r
1178 \r
1179 \r
1180 /*----- 設定値リストのパスワードを更新 ----------------------------------------\r
1181 *\r
1182 *       Parameter\r
1183 *               int Num : 設定値号番号\r
1184 *               char *Pass : パスワード\r
1185 *\r
1186 *       Return Value\r
1187 *               int ステータス\r
1188 *                       FFFTP_SUCCESS/FFFTP_FAIL\r
1189 *----------------------------------------------------------------------------*/\r
1190 \r
1191 int SetHostPassword(int Num, char *Pass)\r
1192 {\r
1193         int Sts;\r
1194         HOSTLISTDATA *Pos;\r
1195 \r
1196         Sts = FFFTP_FAIL;\r
1197         if((Num >= 0) && (Num < Hosts))\r
1198         {\r
1199                 Pos = GetNodeByNum(Num);\r
1200                 strcpy(Pos->Set.PassWord, Pass);\r
1201                 Sts = FFFTP_SUCCESS;\r
1202         }\r
1203         return(Sts);\r
1204 }\r
1205 \r
1206 \r
1207 /*----- 指定の設定名を持つ設定の番号を返す ------------------------------------\r
1208 *\r
1209 *       Parameter\r
1210 *               char *Name : 設定名\r
1211 *\r
1212 *       Return Value\r
1213 *               int 設定番号 (0~)\r
1214 *                       -1=見つからない\r
1215 *----------------------------------------------------------------------------*/\r
1216 \r
1217 int SearchHostName(char *Name)\r
1218 {\r
1219         int Ret;\r
1220         int i;\r
1221         HOSTLISTDATA *Pos;\r
1222 \r
1223         Ret = -1;\r
1224         Pos = HostListTop;\r
1225         for(i = 0; i < Hosts; i++)\r
1226         {\r
1227                 if(strcmp(Name, Pos->Set.HostName) == 0)\r
1228                 {\r
1229                         Ret = i;\r
1230                         break;\r
1231                 }\r
1232                 Pos = GetNextNode(Pos);\r
1233         }\r
1234         return(Ret);\r
1235 }\r
1236 \r
1237 \r
1238 /*----- 設定値リストのソート方法を更新 ----------------------------------------\r
1239 *\r
1240 *       Parameter\r
1241 *               int Num : 設定値号番号\r
1242 *               int LFSort : ローカルのファイルのソート方法\r
1243 *               int LDSort : ローカルのフォルダのソート方法\r
1244 *               int RFSort : リモートのファイルのソート方法\r
1245 *               int RDSort : リモートのフォルダのソート方法\r
1246 *\r
1247 *       Return Value\r
1248 *               int ステータス\r
1249 *                       FFFTP_SUCCESS/FFFTP_FAIL\r
1250 *----------------------------------------------------------------------------*/\r
1251 \r
1252 int SetHostSort(int Num, int LFSort, int LDSort, int RFSort, int RDSort)\r
1253 {\r
1254         int Sts;\r
1255         HOSTLISTDATA *Pos;\r
1256 \r
1257         Sts = FFFTP_FAIL;\r
1258         if((Num >= 0) && (Num < Hosts))\r
1259         {\r
1260                 Pos = GetNodeByNum(Num);\r
1261                 Pos->Set.Sort = LFSort * 0x1000000 | LDSort * 0x10000 | RFSort * 0x100 | RDSort;\r
1262                 Sts = FFFTP_SUCCESS;\r
1263         }\r
1264         return(Sts);\r
1265 }\r
1266 \r
1267 \r
1268 /*----- 登録されているソート方法を分解する ------------------------------------\r
1269 *\r
1270 *       Parameter\r
1271 *               ulong Sort : ソート方法 \r
1272 *               int *LFSort : ローカルのファイルのソート方法を格納するワーク\r
1273 *               int *LDSort : ローカルのフォルダのソート方法を格納するワーク\r
1274 *               int *RFSort : リモートのファイルのソート方法を格納するワーク\r
1275 *               int *RDSort : リモートのフォルダのソート方法を格納するワーク\r
1276 *\r
1277 *       Return Value\r
1278 *               なし\r
1279 *----------------------------------------------------------------------------*/\r
1280 \r
1281 void DecomposeSortType(ulong Sort, int *LFSort, int *LDSort, int *RFSort, int *RDSort)\r
1282 {\r
1283         *LFSort = (int)((Sort / 0x1000000) & 0xFF);\r
1284         *LDSort = (int)((Sort / 0x10000) & 0xFF);\r
1285         *RFSort = (int)((Sort / 0x100) & 0xFF);\r
1286         *RDSort = (int)(Sort & 0xFF);\r
1287         return;\r
1288 }\r
1289 \r
1290 \r
1291 /*----- 現在接続中の設定番号を返す --------------------------------------------\r
1292 *\r
1293 *       Parameter\r
1294 *               なし\r
1295 *\r
1296 *       Return Value\r
1297 *               int 設定番号\r
1298 *----------------------------------------------------------------------------*/\r
1299 \r
1300 int AskCurrentHost(void)\r
1301 {\r
1302         return(ConnectingHost);\r
1303 }\r
1304 \r
1305 \r
1306 /*----- 現在接続中の設定番号をセットする --------------------------------------\r
1307 *\r
1308 *       Parameter\r
1309 *               int Num : 設定番号\r
1310 *\r
1311 *       Return Value\r
1312 *               なし\r
1313 *----------------------------------------------------------------------------*/\r
1314 \r
1315 void SetCurrentHost(int Num)\r
1316 {\r
1317         ConnectingHost = Num;\r
1318         return;\r
1319 }\r
1320 \r
1321 \r
1322 /*----- デフォルト設定値を取り出す --------------------------------------------\r
1323 *\r
1324 *       Parameter\r
1325 *               HOSTDATA *Set : 設定値をコピーするワーク\r
1326 *\r
1327 *       Return Value\r
1328 *               なし\r
1329 *----------------------------------------------------------------------------*/\r
1330 \r
1331 void CopyDefaultHost(HOSTDATA *Set)\r
1332 {\r
1333         // ホスト共通設定機能\r
1334 //      Set->Level = 0;\r
1335 //      strcpy(Set->HostName, "");\r
1336 //      strcpy(Set->HostAdrs, "");\r
1337 //      strcpy(Set->UserName, "");\r
1338 //      strcpy(Set->PassWord, "");\r
1339 //      strcpy(Set->Account, "");\r
1340 //      strcpy(Set->LocalInitDir, DefaultLocalPath);\r
1341 //      strcpy(Set->RemoteInitDir, "");\r
1342 //      memcpy(Set->BookMark, "\0\0", 2);\r
1343 //      strcpy(Set->ChmodCmd, CHMOD_CMD_NOR);\r
1344 //      strcpy(Set->LsName, LS_FNAME);\r
1345 //      strcpy(Set->InitCmd, "");\r
1346 //      Set->Port = PORT_NOR;\r
1347 //      Set->Anonymous = NO;\r
1348 //      Set->KanjiCode = KANJI_NOCNV;\r
1349 //      Set->KanaCnv = YES;\r
1350 //      Set->NameKanjiCode = KANJI_NOCNV;\r
1351 //      Set->NameKanaCnv = NO;\r
1352 //      Set->Pasv = YES;\r
1353 //      Set->FireWall = NO;\r
1354 //      Set->ListCmdOnly = YES;\r
1355 //      Set->UseNLST_R = YES;\r
1356 //      Set->LastDir = NO;\r
1357 //      Set->TimeZone = 9;                              /* GMT+9 (JST) */\r
1358 //      Set->HostType = HTYPE_AUTO;\r
1359 //      Set->SyncMove = NO;\r
1360 //      Set->NoFullPath = NO;\r
1361 //      Set->Sort = SORT_NOTSAVED;\r
1362 //      Set->Security = SECURITY_AUTO;\r
1363 //      Set->Dialup = NO;\r
1364 //      Set->DialupAlways = NO;\r
1365 //      Set->DialupNotify = YES;\r
1366 //      strcpy(Set->DialEntry, "");\r
1367         memcpy(Set, &DefaultHost, sizeof(HOSTDATA));\r
1368         return;\r
1369 }\r
1370 \r
1371 \r
1372 // ホスト共通設定機能\r
1373 void ResetDefaultHost(void)\r
1374 {\r
1375         CopyDefaultDefaultHost(&DefaultHost);\r
1376         return;\r
1377 }\r
1378 \r
1379 void SetDefaultHost(HOSTDATA *Set)\r
1380 {\r
1381         memcpy(&DefaultHost, Set, sizeof(HOSTDATA));\r
1382         return;\r
1383 }\r
1384 \r
1385 void CopyDefaultDefaultHost(HOSTDATA *Set)\r
1386 {\r
1387         // 国際化対応\r
1388         TIME_ZONE_INFORMATION tzi;\r
1389         Set->Level = 0;\r
1390         strcpy(Set->HostName, "");\r
1391         strcpy(Set->HostAdrs, "");\r
1392         strcpy(Set->UserName, "");\r
1393         strcpy(Set->PassWord, "");\r
1394         strcpy(Set->Account, "");\r
1395         strcpy(Set->LocalInitDir, DefaultLocalPath);\r
1396         strcpy(Set->RemoteInitDir, "");\r
1397         memcpy(Set->BookMark, "\0\0", 2);\r
1398         strcpy(Set->ChmodCmd, CHMOD_CMD_NOR);\r
1399         strcpy(Set->LsName, LS_FNAME);\r
1400         strcpy(Set->InitCmd, "");\r
1401         Set->Port = PORT_NOR;\r
1402         Set->Anonymous = NO;\r
1403         Set->KanjiCode = KANJI_NOCNV;\r
1404         Set->KanaCnv = YES;\r
1405         Set->NameKanjiCode = KANJI_NOCNV;\r
1406         // UTF-8対応\r
1407         Set->CurNameKanjiCode = KANJI_NOCNV;\r
1408         Set->NameKanaCnv = NO;\r
1409         Set->Pasv = YES;\r
1410         Set->FireWall = NO;\r
1411         Set->ListCmdOnly = YES;\r
1412         Set->UseNLST_R = YES;\r
1413         Set->LastDir = NO;\r
1414         // 国際化対応\r
1415 //      Set->TimeZone = 9;                              /* GMT+9 (JST) */\r
1416         GetTimeZoneInformation(&tzi);\r
1417         Set->TimeZone = (int)(tzi.Bias / -60);\r
1418         Set->HostType = HTYPE_AUTO;\r
1419         Set->SyncMove = NO;\r
1420         Set->NoFullPath = NO;\r
1421         Set->Sort = SORT_NOTSAVED;\r
1422         Set->Security = SECURITY_AUTO;\r
1423         Set->Dialup = NO;\r
1424         Set->DialupAlways = NO;\r
1425         Set->DialupNotify = YES;\r
1426         strcpy(Set->DialEntry, "");\r
1427         // 暗号化通信対応\r
1428         Set->CryptMode = CRYPT_NONE;\r
1429         Set->UseNoEncryption = YES;\r
1430         Set->UseFTPES = YES;\r
1431         Set->UseFTPIS = YES;\r
1432         Set->UseSFTP = YES;\r
1433         strcpy(Set->PrivateKey, "");\r
1434         Set->NoWeakEncryption = YES;\r
1435         // 同時接続対応\r
1436         Set->MaxThreadCount = 1;\r
1437         Set->ReuseCmdSkt = YES;\r
1438         Set->NoDisplayUI = NO;\r
1439         // MLSD対応\r
1440         Set->Feature = 0;\r
1441         Set->UseMLSD = YES;\r
1442         // IPv6対応\r
1443         Set->NetType = NTYPE_AUTO;\r
1444         Set->CurNetType = NTYPE_AUTO;\r
1445         // 自動切断対策\r
1446         Set->NoopInterval = 60;\r
1447         // 再転送対応\r
1448         Set->TransferErrorMode = EXIST_OVW;\r
1449         Set->TransferErrorNotify = YES;\r
1450         // セッションあたりの転送量制限対策\r
1451         Set->TransferErrorReconnect = YES;\r
1452         // ホスト側の設定ミス対策\r
1453         Set->NoPasvAdrs = YES;\r
1454         return;\r
1455 }\r
1456 \r
1457 /*----- 設定名一覧をウィンドウに送る ------------------------------------------\r
1458 *\r
1459 *       Parameter\r
1460 *               HWND hWnd : ウインドウハンドル\r
1461 *               int Cur : \r
1462 *\r
1463 *       Return Value\r
1464 *               なし\r
1465 *----------------------------------------------------------------------------*/\r
1466 \r
1467 static void SendAllHostNames(HWND hWnd, int Cur)\r
1468 {\r
1469         int i;\r
1470         HOSTLISTDATA *Pos;\r
1471         TV_INSERTSTRUCT tvIns;\r
1472         HTREEITEM hItem;\r
1473         HTREEITEM hItemCur;\r
1474         HTREEITEM *Level;\r
1475         int CurLevel;\r
1476 \r
1477         hItemCur = NULL;\r
1478 \r
1479         /* ちらつくので再描画禁止 */\r
1480         SendMessage(hWnd, WM_SETREDRAW, (WPARAM)FALSE, 0);\r
1481 \r
1482         SendMessage(hWnd, TVM_DELETEITEM, 0, (LPARAM)TVI_ROOT);         /* 全てを削除 */\r
1483 \r
1484         if((Level = malloc(sizeof(HTREEITEM*) * Hosts + 1)) != NULL)\r
1485         {\r
1486                 Pos = HostListTop;\r
1487                 for(i = 0; i < Hosts; i++)\r
1488                 {\r
1489                         if(Pos->Set.Level & SET_LEVEL_GROUP)\r
1490                         {\r
1491                                 tvIns.item.iImage = 0;\r
1492                                 tvIns.item.iSelectedImage = 0;\r
1493                         }\r
1494                         else\r
1495                         {\r
1496                                 tvIns.item.iImage = 2;\r
1497                                 tvIns.item.iSelectedImage = 2;\r
1498                         }\r
1499 \r
1500                         CurLevel = GetNodeLevel(i);\r
1501                         if(CurLevel == 0)\r
1502                                 tvIns.hParent = TVI_ROOT;\r
1503                         else\r
1504                                 tvIns.hParent = Level[CurLevel - 1];\r
1505 \r
1506                         tvIns.hInsertAfter = TVI_LAST;\r
1507                         tvIns.item.mask = TVIF_TEXT | TVIF_PARAM | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_CHILDREN;\r
1508         //              tvIns.item.hItem = 0;\r
1509         //              tvIns.item.state = 0;\r
1510         //              tvIns.item.stateMask = 0;\r
1511                         tvIns.item.pszText = Pos->Set.HostName;\r
1512                         tvIns.item.cchTextMax = 0;\r
1513                         tvIns.item.cChildren = 1;\r
1514                         tvIns.item.lParam = i;\r
1515                         hItem = (HTREEITEM)SendMessage(hWnd, TVM_INSERTITEM, 0, (LPARAM)&tvIns);\r
1516 \r
1517                         if(Pos->Set.Level & SET_LEVEL_GROUP)\r
1518                                 Level[CurLevel] = hItem;\r
1519 \r
1520 //                      DoPrintf("%d = %x", i, hItem);\r
1521                         if(i == Cur)\r
1522                         {\r
1523                                 hItemCur = hItem;\r
1524                         }\r
1525                         Pos = GetNextNode(Pos);\r
1526                 }\r
1527                 free(Level);\r
1528         }\r
1529 \r
1530         /* 再描画 */\r
1531         SendMessage(hWnd, WM_SETREDRAW, (WPARAM)TRUE, 0);\r
1532 \r
1533         if(hItemCur != NULL)\r
1534         {\r
1535                 SendMessage(hWnd, TVM_SELECTITEM, TVGN_CARET, (LPARAM)hItemCur);\r
1536 //              SendMessage(hWnd, TVM_ENSUREVISIBLE, 0, (LPARAM)hItemCur);\r
1537         }\r
1538         UpdateWindow(hWnd);\r
1539 \r
1540         return;\r
1541 }\r
1542 \r
1543 \r
1544 /*----- 設定値がグループかどうかを返す ----------------------------------------\r
1545 *\r
1546 *       Parameter\r
1547 *               int Num : 設定値号番号\r
1548 *\r
1549 *       Return Value\r
1550 *               int グループかどうか\r
1551 *                       YES/NO/-1=設定値がない\r
1552 *----------------------------------------------------------------------------*/\r
1553 \r
1554 static int IsNodeGroup(int Num)\r
1555 {\r
1556         int Ret;\r
1557         HOSTLISTDATA *Pos;\r
1558 \r
1559         Ret = -1;\r
1560         if((Num >= 0) && (Num < Hosts))\r
1561         {\r
1562                 Pos = GetNodeByNum(Num);\r
1563                 Ret = (Pos->Set.Level & SET_LEVEL_GROUP) ? YES : NO;\r
1564         }\r
1565         return(Ret);\r
1566 }\r
1567 \r
1568 \r
1569 /*----- WS_FTP.INIからのインポート --------------------------------------------\r
1570 *\r
1571 *       Parameter\r
1572 *               なし\r
1573 *\r
1574 *       Return Value\r
1575 *               なし\r
1576 *----------------------------------------------------------------------------*/\r
1577 \r
1578 void ImportFromWSFTP(void)\r
1579 {\r
1580         FILE *Strm;\r
1581         char Buf[FMAX_PATH+1];\r
1582         HOSTDATA Host;\r
1583         int InHost;\r
1584 \r
1585         strcpy(Buf, "WS_FTP.INI");\r
1586         if(SelectFile(GetMainHwnd(), Buf, MSGJPN126, MSGJPN276, NULL, OFN_FILEMUSTEXIST, 0) == TRUE)\r
1587         {\r
1588                 if((Strm = fopen(Buf, "rt")) != NULL)\r
1589                 {\r
1590                         InHost = NO;\r
1591                         while(fgets(Buf, FMAX_PATH, Strm) != NULL)\r
1592                         {\r
1593                                 if(Buf[0] == '[')\r
1594                                 {\r
1595                                         if(InHost == YES)\r
1596                                         {\r
1597                                                 AddHostToList(&Host, -1, 0);\r
1598                                                 InHost = NO;\r
1599                                         }\r
1600                                         if(_stricmp(Buf, "[_config_]\n") != 0)\r
1601                                         {\r
1602                                                 CopyDefaultHost(&Host);\r
1603 \r
1604                                                 *(Buf + strlen(Buf) - 2) = NUL;\r
1605                                                 memset(Host.HostName, NUL, HOST_NAME_LEN+1);\r
1606                                                 strncpy(Host.HostName, Buf+1, HOST_NAME_LEN);\r
1607                                                 InHost = YES;\r
1608                                         }\r
1609                                 }\r
1610                                 else if(InHost == YES)\r
1611                                 {\r
1612                                         FormatIniString(Buf);\r
1613 \r
1614                                         if(_strnicmp(Buf, "HOST=", 5) == 0)\r
1615                                         {\r
1616                                                 memset(Host.HostAdrs, NUL, HOST_ADRS_LEN+1);\r
1617                                                 strncpy(Host.HostAdrs, Buf+5, HOST_ADRS_LEN);\r
1618                                         }\r
1619                                         else if(_strnicmp(Buf, "UID=", 4) == 0)\r
1620                                         {\r
1621                                                 memset(Host.UserName, NUL, USER_NAME_LEN+1);\r
1622                                                 strncpy(Host.UserName, Buf+4, USER_NAME_LEN);\r
1623                                                 if(strcmp(Host.UserName, "anonymous") == 0)\r
1624                                                         strcpy(Host.PassWord, UserMailAdrs);\r
1625                                         }\r
1626                                         else if(_strnicmp(Buf, "LOCDIR=", 7) == 0)\r
1627                                         {\r
1628                                                 memset(Host.LocalInitDir, NUL, INIT_DIR_LEN+1);\r
1629                                                 strncpy(Host.LocalInitDir, Buf+7, INIT_DIR_LEN);\r
1630                                         }\r
1631                                         else if(_strnicmp(Buf, "DIR=", 4) == 0)\r
1632                                         {\r
1633                                                 memset(Host.RemoteInitDir, NUL, INIT_DIR_LEN+1);\r
1634                                                 strncpy(Host.RemoteInitDir, Buf+4, INIT_DIR_LEN);\r
1635                                         }\r
1636                                         else if(_strnicmp(Buf, "PASVMODE=", 9) == 0)\r
1637                                                 Host.Pasv = (atoi(Buf+9) == 0) ? 0 : 1;\r
1638                                         else if(_strnicmp(Buf, "FIREWALL=", 9) == 0)\r
1639                                                 Host.FireWall = (atoi(Buf+9) == 0) ? 0 : 1;\r
1640                                 }\r
1641                         }\r
1642 \r
1643                         if(InHost == YES)\r
1644                                 AddHostToList(&Host, -1, 0);\r
1645                         fclose(Strm);\r
1646                 }\r
1647         }\r
1648         return;\r
1649 }\r
1650 \r
1651 \r
1652 \r
1653 /*----- ホスト設定のプロパティシート ------------------------------------------\r
1654 *\r
1655 *       Parameter\r
1656 *               HWND hDlg : 親ウインドウのハンドル\r
1657 *\r
1658 *       Return Value\r
1659 *               なし\r
1660 *----------------------------------------------------------------------------*/\r
1661 \r
1662 static int DispHostSetDlg(HWND hDlg)\r
1663 {\r
1664         // SFTP、FTPES、FTPIS対応\r
1665         // 同時接続対応\r
1666 //      PROPSHEETPAGE psp[5];\r
1667         PROPSHEETPAGE psp[7];\r
1668         PROPSHEETHEADER psh;\r
1669 \r
1670         // 変数が未初期化のバグ修正\r
1671         memset(&psp, 0, sizeof(psp));\r
1672         memset(&psh, 0, sizeof(psh));\r
1673 \r
1674         psp[0].dwSize = sizeof(PROPSHEETPAGE);\r
1675         psp[0].dwFlags = PSP_USETITLE | PSP_HASHELP;\r
1676         psp[0].hInstance = GetFtpInst();\r
1677         psp[0].pszTemplate = MAKEINTRESOURCE(hset_main_dlg);\r
1678         psp[0].pszIcon = NULL;\r
1679         psp[0].pfnDlgProc = MainSettingProc;\r
1680         psp[0].pszTitle = MSGJPN127;\r
1681         psp[0].lParam = 0;\r
1682         psp[0].pfnCallback = NULL;\r
1683 \r
1684         psp[1].dwSize = sizeof(PROPSHEETPAGE);\r
1685         psp[1].dwFlags = PSP_USETITLE | PSP_HASHELP;\r
1686         psp[1].hInstance = GetFtpInst();\r
1687         psp[1].pszTemplate = MAKEINTRESOURCE(hset_adv_dlg);\r
1688         psp[1].pszIcon = NULL;\r
1689         psp[1].pfnDlgProc = AdvSettingProc;\r
1690         psp[1].pszTitle = MSGJPN128;\r
1691         psp[1].lParam = 0;\r
1692         psp[1].pfnCallback = NULL;\r
1693 \r
1694         psp[2].dwSize = sizeof(PROPSHEETPAGE);\r
1695         psp[2].dwFlags = PSP_USETITLE | PSP_HASHELP;\r
1696         psp[2].hInstance = GetFtpInst();\r
1697         psp[2].pszTemplate = MAKEINTRESOURCE(hset_code_dlg);\r
1698         psp[2].pszIcon = NULL;\r
1699         psp[2].pfnDlgProc = CodeSettingProc;\r
1700         psp[2].pszTitle = MSGJPN129;\r
1701         psp[2].lParam = 0;\r
1702         psp[2].pfnCallback = NULL;\r
1703 \r
1704         psp[3].dwSize = sizeof(PROPSHEETPAGE);\r
1705         psp[3].dwFlags = PSP_USETITLE | PSP_HASHELP;\r
1706         psp[3].hInstance = GetFtpInst();\r
1707         psp[3].pszTemplate = MAKEINTRESOURCE(hset_dialup_dlg);\r
1708         psp[3].pszIcon = NULL;\r
1709         psp[3].pfnDlgProc = DialupSettingProc;\r
1710         psp[3].pszTitle = MSGJPN130;\r
1711         psp[3].lParam = 0;\r
1712         psp[3].pfnCallback = NULL;\r
1713 \r
1714         psp[4].dwSize = sizeof(PROPSHEETPAGE);\r
1715         psp[4].dwFlags = PSP_USETITLE | PSP_HASHELP;\r
1716         psp[4].hInstance = GetFtpInst();\r
1717         psp[4].pszTemplate = MAKEINTRESOURCE(hset_adv2_dlg);\r
1718         psp[4].pszIcon = NULL;\r
1719         psp[4].pfnDlgProc = Adv2SettingProc;\r
1720         psp[4].pszTitle = MSGJPN131;\r
1721         psp[4].lParam = 0;\r
1722         psp[4].pfnCallback = NULL;\r
1723 \r
1724         // SFTP、FTPES、FTPIS対応\r
1725         psp[5].dwSize = sizeof(PROPSHEETPAGE);\r
1726         psp[5].dwFlags = PSP_USETITLE | PSP_HASHELP;\r
1727         psp[5].hInstance = GetFtpInst();\r
1728         psp[5].pszTemplate = MAKEINTRESOURCE(hset_crypt_dlg);\r
1729         psp[5].pszIcon = NULL;\r
1730         psp[5].pfnDlgProc = CryptSettingProc;\r
1731         psp[5].pszTitle = MSGJPN313;\r
1732         psp[5].lParam = 0;\r
1733         psp[5].pfnCallback = NULL;\r
1734 \r
1735         // 同時接続対応\r
1736         psp[6].dwSize = sizeof(PROPSHEETPAGE);\r
1737         psp[6].dwFlags = PSP_USETITLE | PSP_HASHELP;\r
1738         psp[6].hInstance = GetFtpInst();\r
1739         psp[6].pszTemplate = MAKEINTRESOURCE(hset_adv3_dlg);\r
1740         psp[6].pszIcon = NULL;\r
1741         psp[6].pfnDlgProc = Adv3SettingProc;\r
1742         psp[6].pszTitle = MSGJPN320;\r
1743         psp[6].lParam = 0;\r
1744         psp[6].pfnCallback = NULL;\r
1745 \r
1746         psh.dwSize = sizeof(PROPSHEETHEADER);\r
1747         psh.dwFlags = PSH_HASHELP | PSH_NOAPPLYNOW | PSH_PROPSHEETPAGE;\r
1748         psh.hwndParent = hDlg;\r
1749         psh.hInstance = GetFtpInst();\r
1750         psh.pszIcon = NULL;\r
1751         psh.pszCaption = MSGJPN132;\r
1752         psh.nPages = sizeof(psp) / sizeof(PROPSHEETPAGE);\r
1753         psh.nStartPage = 0;\r
1754         psh.ppsp = (LPCPROPSHEETPAGE)&psp;\r
1755         psh.pfnCallback = NULL;\r
1756 \r
1757         Apply = NO;\r
1758         PropertySheet(&psh);\r
1759 \r
1760         return(Apply);\r
1761 }\r
1762 \r
1763 \r
1764 /*----- 基本設定ウインドウのコールバック --------------------------------------\r
1765 *\r
1766 *       Parameter\r
1767 *               HWND hDlg : ウインドウハンドル\r
1768 *               UINT message : メッセージ番号\r
1769 *               WPARAM wParam : メッセージの WPARAM 引数\r
1770 *               LPARAM lParam : メッセージの LPARAM 引数\r
1771 *\r
1772 *       Return Value\r
1773 *               BOOL TRUE/FALSE\r
1774 *----------------------------------------------------------------------------*/\r
1775 \r
1776 // 64ビット対応\r
1777 //static BOOL CALLBACK MainSettingProc(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam)\r
1778 static INT_PTR CALLBACK MainSettingProc(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam)\r
1779 {\r
1780         // 64ビット対応\r
1781 //      long wStyle;\r
1782         LONG_PTR wStyle;\r
1783         char Tmp[FMAX_PATH+1];\r
1784         NMHDR *pnmhdr;\r
1785 \r
1786         switch (iMessage)\r
1787         {\r
1788                 case WM_INITDIALOG :\r
1789                         // プロセス保護\r
1790                         ProtectAllEditControls(hDlg);\r
1791                         SendDlgItemMessage(hDlg, HSET_HOST, EM_LIMITTEXT, HOST_NAME_LEN, 0);\r
1792                         SendDlgItemMessage(hDlg, HSET_ADRS, EM_LIMITTEXT, HOST_ADRS_LEN, 0);\r
1793                         SendDlgItemMessage(hDlg, HSET_USER, EM_LIMITTEXT, USER_NAME_LEN, 0);\r
1794                         SendDlgItemMessage(hDlg, HSET_PASS, EM_LIMITTEXT, PASSWORD_LEN, 0);\r
1795                         SendDlgItemMessage(hDlg, HSET_LOCAL, EM_LIMITTEXT, INIT_DIR_LEN, 0);\r
1796                         SendDlgItemMessage(hDlg, HSET_REMOTE, EM_LIMITTEXT, INIT_DIR_LEN, 0);\r
1797                         SendDlgItemMessage(hDlg, HSET_HOST, WM_SETTEXT, 0, (LPARAM)TmpHost.HostName);\r
1798                         SendDlgItemMessage(hDlg, HSET_ADRS, WM_SETTEXT, 0, (LPARAM)TmpHost.HostAdrs);\r
1799                         SendDlgItemMessage(hDlg, HSET_USER, WM_SETTEXT, 0, (LPARAM)TmpHost.UserName);\r
1800                         SendDlgItemMessage(hDlg, HSET_PASS, WM_SETTEXT, 0, (LPARAM)TmpHost.PassWord);\r
1801                         SendDlgItemMessage(hDlg, HSET_LOCAL, WM_SETTEXT, 0, (LPARAM)TmpHost.LocalInitDir);\r
1802                         SendDlgItemMessage(hDlg, HSET_REMOTE, WM_SETTEXT, 0, (LPARAM)TmpHost.RemoteInitDir);\r
1803                         SendDlgItemMessage(hDlg, HSET_ANONYMOUS, BM_SETCHECK, TmpHost.Anonymous, 0);\r
1804                         SendDlgItemMessage(hDlg, HSET_LASTDIR, BM_SETCHECK, TmpHost.LastDir, 0);\r
1805                         if(AskConnecting() == NO)\r
1806                                 EnableWindow(GetDlgItem(hDlg, HSET_REMOTE_CUR), FALSE);\r
1807                         return(TRUE);\r
1808 \r
1809                 case WM_NOTIFY:\r
1810                         pnmhdr = (NMHDR FAR *)lParam;\r
1811                         switch(pnmhdr->code)\r
1812                         {\r
1813                                 case PSN_APPLY :\r
1814                                         SendDlgItemMessage(hDlg, HSET_HOST, WM_GETTEXT, HOST_NAME_LEN+1, (LPARAM)TmpHost.HostName);\r
1815                                         SendDlgItemMessage(hDlg, HSET_ADRS, WM_GETTEXT, HOST_ADRS_LEN+1, (LPARAM)TmpHost.HostAdrs);\r
1816                                         RemoveTailingSpaces(TmpHost.HostAdrs);\r
1817                                         SendDlgItemMessage(hDlg, HSET_USER, WM_GETTEXT, USER_NAME_LEN+1, (LPARAM)TmpHost.UserName);\r
1818                                         SendDlgItemMessage(hDlg, HSET_PASS, WM_GETTEXT, PASSWORD_LEN+1, (LPARAM)TmpHost.PassWord);\r
1819                                         SendDlgItemMessage(hDlg, HSET_LOCAL, WM_GETTEXT, INIT_DIR_LEN+1, (LPARAM)TmpHost.LocalInitDir);\r
1820                                         SendDlgItemMessage(hDlg, HSET_REMOTE, WM_GETTEXT, INIT_DIR_LEN+1, (LPARAM)TmpHost.RemoteInitDir);\r
1821                                         TmpHost.Anonymous = SendDlgItemMessage(hDlg, HSET_ANONYMOUS, BM_GETCHECK, 0, 0);\r
1822                                         TmpHost.LastDir = SendDlgItemMessage(hDlg, HSET_LASTDIR, BM_GETCHECK, 0, 0);\r
1823                                         if((strlen(TmpHost.HostName) == 0) && (strlen(TmpHost.HostAdrs) > 0))\r
1824                                         {\r
1825                                                 memset(TmpHost.HostName, NUL, HOST_NAME_LEN+1);\r
1826                                                 strncpy(TmpHost.HostName, TmpHost.HostAdrs, HOST_NAME_LEN);\r
1827                                         }\r
1828                                         else if((strlen(TmpHost.HostName) > 0) && (strlen(TmpHost.HostAdrs) == 0))\r
1829                                         {\r
1830                                                 memset(TmpHost.HostAdrs, NUL, HOST_ADRS_LEN+1);\r
1831                                                 strncpy(TmpHost.HostAdrs, TmpHost.HostName, HOST_ADRS_LEN);\r
1832                                         }\r
1833                                         Apply = YES;\r
1834                                         break;\r
1835 \r
1836                                 case PSN_RESET :\r
1837                                         break;\r
1838 \r
1839                                 case PSN_HELP :\r
1840                                         hHelpWin = HtmlHelp(NULL, AskHelpFilePath(), HH_HELP_CONTEXT, IDH_HELP_TOPIC_0000028);\r
1841                                         break;\r
1842                         }\r
1843                         break;\r
1844 \r
1845                 case WM_COMMAND :\r
1846                         switch(GET_WM_COMMAND_ID(wParam, lParam))\r
1847                         {\r
1848                                 case HSET_LOCAL_BR :\r
1849                                         if(SelectDir(hDlg, TmpHost.LocalInitDir, INIT_DIR_LEN) == TRUE)\r
1850                                                 SendDlgItemMessage(hDlg, HSET_LOCAL, WM_SETTEXT, 0, (LPARAM)TmpHost.LocalInitDir);\r
1851                                         break;\r
1852 \r
1853                                 case HSET_REMOTE_CUR :\r
1854                                                 AskRemoteCurDir(Tmp, FMAX_PATH);\r
1855                                                 SendDlgItemMessage(hDlg, HSET_REMOTE, WM_SETTEXT, 0, (LPARAM)Tmp);\r
1856                                         break;\r
1857 \r
1858                                 case HSET_ANONYMOUS :\r
1859                                         if(SendDlgItemMessage(hDlg, HSET_ANONYMOUS, BM_GETCHECK, 0, 0) == 1)\r
1860                                         {\r
1861                                                 SendDlgItemMessage(hDlg, HSET_USER, WM_SETTEXT, 0, (LPARAM)"anonymous");\r
1862                                                 // 64ビット対応\r
1863 //                                              wStyle = GetWindowLong(GetDlgItem(hDlg, HSET_PASS), GWL_STYLE);\r
1864                                                 wStyle = GetWindowLongPtr(GetDlgItem(hDlg, HSET_PASS), GWL_STYLE);\r
1865                                                 wStyle &= ~ES_PASSWORD;\r
1866                                                 // 64ビット対応\r
1867 //                                              SetWindowLong(GetDlgItem(hDlg, HSET_PASS), GWL_STYLE, wStyle);\r
1868                                                 SetWindowLongPtr(GetDlgItem(hDlg, HSET_PASS), GWL_STYLE, wStyle);\r
1869                                                 SendDlgItemMessage(hDlg, HSET_PASS, WM_SETTEXT, 0, (LPARAM)UserMailAdrs);\r
1870                                         }\r
1871                                         else\r
1872                                         {\r
1873                                                 SendDlgItemMessage(hDlg, HSET_USER, WM_SETTEXT, 0, (LPARAM)"");\r
1874                                                 // 64ビット対応\r
1875 //                                              wStyle = GetWindowLong(GetDlgItem(hDlg, HSET_PASS), GWL_STYLE);\r
1876                                                 wStyle = GetWindowLongPtr(GetDlgItem(hDlg, HSET_PASS), GWL_STYLE);\r
1877                                                 wStyle |= ES_PASSWORD;\r
1878                                                 // 64ビット対応\r
1879 //                                              SetWindowLong(GetDlgItem(hDlg, HSET_PASS), GWL_STYLE, wStyle);\r
1880                                                 SetWindowLongPtr(GetDlgItem(hDlg, HSET_PASS), GWL_STYLE, wStyle);\r
1881                                                 SendDlgItemMessage(hDlg, HSET_PASS, WM_SETTEXT, 0, (LPARAM)"");\r
1882                                         }\r
1883                                         break;\r
1884                         }\r
1885                         return(TRUE);\r
1886         }\r
1887         return(FALSE);\r
1888 }\r
1889 \r
1890 \r
1891 /*----- 拡張設定ウインドウのコールバック --------------------------------------\r
1892 *\r
1893 *       Parameter\r
1894 *               HWND hDlg : ウインドウハンドル\r
1895 *               UINT message : メッセージ番号\r
1896 *               WPARAM wParam : メッセージの WPARAM 引数\r
1897 *               LPARAM lParam : メッセージの LPARAM 引数\r
1898 *\r
1899 *       Return Value\r
1900 *               BOOL TRUE/FALSE\r
1901 *----------------------------------------------------------------------------*/\r
1902 \r
1903 // 64ビット対応\r
1904 //static BOOL CALLBACK AdvSettingProc(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam)\r
1905 static INT_PTR CALLBACK AdvSettingProc(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam)\r
1906 {\r
1907         NMHDR *pnmhdr;\r
1908         char Tmp[20];\r
1909         int i;\r
1910 \r
1911         switch (iMessage)\r
1912         {\r
1913                 case WM_INITDIALOG :\r
1914                         SendDlgItemMessage(hDlg, HSET_PORT, EM_LIMITTEXT, 5, 0);\r
1915                         sprintf(Tmp, "%d", TmpHost.Port);\r
1916                         SendDlgItemMessage(hDlg, HSET_PORT, WM_SETTEXT, 0, (LPARAM)Tmp);\r
1917                         SendDlgItemMessage(hDlg, HSET_ACCOUNT, EM_LIMITTEXT, ACCOUNT_LEN, 0);\r
1918                         SendDlgItemMessage(hDlg, HSET_ACCOUNT, WM_SETTEXT, 0, (LPARAM)TmpHost.Account);\r
1919                         SendDlgItemMessage(hDlg, HSET_PASV, BM_SETCHECK, TmpHost.Pasv, 0);\r
1920                         SendDlgItemMessage(hDlg, HSET_FIREWALL, BM_SETCHECK, TmpHost.FireWall, 0);\r
1921                         SendDlgItemMessage(hDlg, HSET_SYNCMOVE, BM_SETCHECK, TmpHost.SyncMove, 0);\r
1922                         for(i = -12; i <= 12; i++)\r
1923                         {\r
1924                                 if(i == 0)\r
1925                                         sprintf(Tmp, "GMT");\r
1926                                 else if(i == 9)\r
1927                                         sprintf(Tmp, MSGJPN133, i);\r
1928                                 else\r
1929                                         sprintf(Tmp, "GMT%+02d:00", i);\r
1930                                 SendDlgItemMessage(hDlg, HSET_TIMEZONE, CB_ADDSTRING, 0, (LPARAM)Tmp);\r
1931                         }\r
1932                         SendDlgItemMessage(hDlg, HSET_TIMEZONE, CB_SETCURSEL, TmpHost.TimeZone+12, 0);\r
1933 \r
1934                         SendDlgItemMessage(hDlg, HSET_SECURITY, CB_ADDSTRING, 0, (LPARAM)MSGJPN134);\r
1935                         SendDlgItemMessage(hDlg, HSET_SECURITY, CB_ADDSTRING, 0, (LPARAM)MSGJPN135);\r
1936                         SendDlgItemMessage(hDlg, HSET_SECURITY, CB_ADDSTRING, 0, (LPARAM)MSGJPN136);\r
1937                         SendDlgItemMessage(hDlg, HSET_SECURITY, CB_ADDSTRING, 0, (LPARAM)MSGJPN137);\r
1938                         SendDlgItemMessage(hDlg, HSET_SECURITY, CB_ADDSTRING, 0, (LPARAM)MSGJPN138);\r
1939                         SendDlgItemMessage(hDlg, HSET_SECURITY, CB_SETCURSEL, TmpHost.Security, 0);\r
1940                         SendDlgItemMessage(hDlg, HSET_INITCMD, EM_LIMITTEXT, INITCMD_LEN, 0);\r
1941                         SendDlgItemMessage(hDlg, HSET_INITCMD, WM_SETTEXT, 0, (LPARAM)TmpHost.InitCmd);\r
1942                         // IPv6対応\r
1943                         SendDlgItemMessage(hDlg, HSET_NETTYPE, CB_ADDSTRING, 0, (LPARAM)MSGJPN332);\r
1944                         SendDlgItemMessage(hDlg, HSET_NETTYPE, CB_ADDSTRING, 0, (LPARAM)MSGJPN333);\r
1945                         SendDlgItemMessage(hDlg, HSET_NETTYPE, CB_ADDSTRING, 0, (LPARAM)MSGJPN334);\r
1946                         SendDlgItemMessage(hDlg, HSET_NETTYPE, CB_SETCURSEL, TmpHost.NetType, 0);\r
1947                         return(TRUE);\r
1948 \r
1949                 case WM_NOTIFY:\r
1950                         pnmhdr = (NMHDR FAR *)lParam;\r
1951                         switch(pnmhdr->code)\r
1952                         {\r
1953                                 case PSN_APPLY :\r
1954                                         TmpHost.Pasv = SendDlgItemMessage(hDlg, HSET_PASV, BM_GETCHECK, 0, 0);\r
1955                                         TmpHost.FireWall = SendDlgItemMessage(hDlg, HSET_FIREWALL, BM_GETCHECK, 0, 0);\r
1956                                         TmpHost.SyncMove = SendDlgItemMessage(hDlg, HSET_SYNCMOVE, BM_GETCHECK, 0, 0);\r
1957                                         SendDlgItemMessage(hDlg, HSET_PORT, WM_GETTEXT, 5+1, (LPARAM)Tmp);\r
1958                                         TmpHost.Port = atoi(Tmp);\r
1959                                         SendDlgItemMessage(hDlg, HSET_ACCOUNT, WM_GETTEXT, ACCOUNT_LEN+1, (LPARAM)TmpHost.Account);\r
1960                                         TmpHost.TimeZone = SendDlgItemMessage(hDlg, HSET_TIMEZONE, CB_GETCURSEL, 0, 0) - 12;\r
1961                                         TmpHost.Security = SendDlgItemMessage(hDlg, HSET_SECURITY, CB_GETCURSEL, 0, 0);\r
1962                                         SendDlgItemMessage(hDlg, HSET_INITCMD, WM_GETTEXT, INITCMD_LEN+1, (LPARAM)TmpHost.InitCmd);\r
1963                                         // IPv6対応\r
1964                                         TmpHost.NetType = SendDlgItemMessage(hDlg, HSET_NETTYPE, CB_GETCURSEL, 0, 0);\r
1965                                         Apply = YES;\r
1966                                         break;\r
1967 \r
1968                                 case PSN_RESET :\r
1969                                         break;\r
1970 \r
1971                                 case PSN_HELP :\r
1972                                         hHelpWin = HtmlHelp(NULL, AskHelpFilePath(), HH_HELP_CONTEXT, IDH_HELP_TOPIC_0000029);\r
1973                                         break;\r
1974                         }\r
1975                         break;\r
1976 \r
1977                 case WM_COMMAND :\r
1978                         switch(GET_WM_COMMAND_ID(wParam, lParam))\r
1979                         {\r
1980                                 case HSET_PORT_NOR :\r
1981                                         sprintf(Tmp, "%d", PORT_NOR);\r
1982                                         SendDlgItemMessage(hDlg, HSET_PORT, WM_SETTEXT, 0, (LPARAM)Tmp);\r
1983                                         break;\r
1984                         }\r
1985                         return(TRUE);\r
1986         }\r
1987         return(FALSE);\r
1988 }\r
1989 \r
1990 \r
1991 /*----- 文字コード設定ウインドウのコールバック --------------------------------\r
1992 *\r
1993 *       Parameter\r
1994 *               HWND hDlg : ウインドウハンドル\r
1995 *               UINT message : メッセージ番号\r
1996 *               WPARAM wParam : メッセージの WPARAM 引数\r
1997 *               LPARAM lParam : メッセージの LPARAM 引数\r
1998 *\r
1999 *       Return Value\r
2000 *               BOOL TRUE/FALSE\r
2001 *----------------------------------------------------------------------------*/\r
2002 \r
2003 // 64ビット対応\r
2004 //static BOOL CALLBACK CodeSettingProc(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam)\r
2005 static INT_PTR CALLBACK CodeSettingProc(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam)\r
2006 {\r
2007         NMHDR *pnmhdr;\r
2008 \r
2009         // UTF-8対応\r
2010         static const RADIOBUTTON KanjiButton[] = {\r
2011                 { HSET_NO_CNV, KANJI_NOCNV },\r
2012                 { HSET_SJIS_CNV, KANJI_SJIS },\r
2013                 { HSET_JIS_CNV, KANJI_JIS },\r
2014                 { HSET_EUC_CNV, KANJI_EUC },\r
2015                 { HSET_UTF8N_CNV, KANJI_UTF8N },\r
2016                 { HSET_UTF8BOM_CNV, KANJI_UTF8BOM }\r
2017         };\r
2018         #define KANJIBUTTONS    (sizeof(KanjiButton)/sizeof(RADIOBUTTON))\r
2019 \r
2020         static const RADIOBUTTON NameKanjiButton[] = {\r
2021                 { HSET_FN_AUTO_CNV, KANJI_AUTO },\r
2022                 { HSET_FN_SJIS_CNV, KANJI_SJIS },\r
2023                 { HSET_FN_JIS_CNV, KANJI_JIS },\r
2024                 { HSET_FN_EUC_CNV, KANJI_EUC },\r
2025                 { HSET_FN_SMH_CNV, KANJI_SMB_HEX },\r
2026                 { HSET_FN_SMC_CNV, KANJI_SMB_CAP },\r
2027                 // UTF-8 HFS+対応\r
2028 //              { HSET_FN_UTF8N_CNV, KANJI_UTF8N }              // UTF-8対応\r
2029                 { HSET_FN_UTF8N_CNV, KANJI_UTF8N },             // UTF-8対応\r
2030                 { HSET_FN_UTF8HFSX_CNV, KANJI_UTF8HFSX }\r
2031         };\r
2032         #define NAMEKANJIBUTTONS        (sizeof(NameKanjiButton)/sizeof(RADIOBUTTON))\r
2033 \r
2034         switch (iMessage)\r
2035         {\r
2036                 case WM_INITDIALOG :\r
2037                         SetRadioButtonByValue(hDlg, TmpHost.KanjiCode, KanjiButton, KANJIBUTTONS);\r
2038                         SendDlgItemMessage(hDlg, HSET_HANCNV, BM_SETCHECK, TmpHost.KanaCnv, 0);\r
2039                         SetRadioButtonByValue(hDlg, TmpHost.NameKanjiCode, NameKanjiButton, NAMEKANJIBUTTONS);\r
2040                         // UTF-8 HFS+対応\r
2041                         if(IsUnicodeNormalizationDllLoaded() == NO)\r
2042                                 EnableWindow(GetDlgItem(hDlg, HSET_FN_UTF8HFSX_CNV), FALSE);\r
2043                         SendDlgItemMessage(hDlg, HSET_FN_HANCNV, BM_SETCHECK, TmpHost.NameKanaCnv, 0);\r
2044                         return(TRUE);\r
2045 \r
2046                 case WM_NOTIFY:\r
2047                         pnmhdr = (NMHDR FAR *)lParam;\r
2048                         switch(pnmhdr->code)\r
2049                         {\r
2050                                 case PSN_APPLY :\r
2051                                         TmpHost.KanjiCode = AskRadioButtonValue(hDlg, KanjiButton, KANJIBUTTONS);\r
2052                                         TmpHost.KanaCnv = SendDlgItemMessage(hDlg, HSET_HANCNV, BM_GETCHECK, 0, 0);\r
2053                                         TmpHost.NameKanjiCode = AskRadioButtonValue(hDlg, NameKanjiButton, NAMEKANJIBUTTONS);\r
2054                                         TmpHost.NameKanaCnv = SendDlgItemMessage(hDlg, HSET_FN_HANCNV, BM_GETCHECK, 0, 0);\r
2055                                         Apply = YES;\r
2056                                         break;\r
2057 \r
2058                                 case PSN_RESET :\r
2059                                         break;\r
2060 \r
2061                                 case PSN_HELP :\r
2062                                         hHelpWin = HtmlHelp(NULL, AskHelpFilePath(), HH_HELP_CONTEXT, IDH_HELP_TOPIC_0000030);\r
2063                                         break;\r
2064                         }\r
2065                         break;\r
2066 \r
2067                 case WM_COMMAND :\r
2068                         switch(GET_WM_COMMAND_ID(wParam, lParam))\r
2069                         {\r
2070                                 case HSET_SJIS_CNV :\r
2071                                 case HSET_JIS_CNV :\r
2072                                 case HSET_EUC_CNV :\r
2073                                         EnableWindow(GetDlgItem(hDlg, HSET_HANCNV), TRUE);\r
2074                                         break;\r
2075 \r
2076                                 // UTF-8対応\r
2077                                 case HSET_NO_CNV :\r
2078                                 case HSET_UTF8N_CNV :\r
2079                                 case HSET_UTF8BOM_CNV :\r
2080                                         EnableWindow(GetDlgItem(hDlg, HSET_HANCNV), FALSE);\r
2081                                         break;\r
2082 \r
2083                                 case HSET_FN_JIS_CNV :\r
2084                                 case HSET_FN_EUC_CNV :\r
2085                                         EnableWindow(GetDlgItem(hDlg, HSET_FN_HANCNV), TRUE);\r
2086                                         break;\r
2087 \r
2088                                 case HSET_FN_AUTO_CNV :\r
2089                                 case HSET_FN_SJIS_CNV :\r
2090                                 case HSET_FN_SMH_CNV :\r
2091                                 case HSET_FN_SMC_CNV :\r
2092                                 case HSET_FN_UTF8N_CNV :        // UTF-8対応\r
2093                                 // UTF-8 HFS+対応\r
2094                                 case HSET_FN_UTF8HFSX_CNV :\r
2095                                         EnableWindow(GetDlgItem(hDlg, HSET_FN_HANCNV), FALSE);\r
2096                                         break;\r
2097                         }\r
2098                         return(TRUE);\r
2099         }\r
2100         return(FALSE);\r
2101 }\r
2102 \r
2103 \r
2104 /*----- ダイアルアップ設定ウインドウのコールバック ----------------------------\r
2105 *\r
2106 *       Parameter\r
2107 *               HWND hDlg : ウインドウハンドル\r
2108 *               UINT message : メッセージ番号\r
2109 *               WPARAM wParam : メッセージの WPARAM 引数\r
2110 *               LPARAM lParam : メッセージの LPARAM 引数\r
2111 *\r
2112 *       Return Value\r
2113 *               BOOL TRUE/FALSE\r
2114 *----------------------------------------------------------------------------*/\r
2115 \r
2116 // 64ビット対応\r
2117 //static BOOL CALLBACK DialupSettingProc(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam)\r
2118 static INT_PTR CALLBACK DialupSettingProc(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam)\r
2119 {\r
2120         NMHDR *pnmhdr;\r
2121 \r
2122         switch (iMessage)\r
2123         {\r
2124                 case WM_INITDIALOG :\r
2125                         SendDlgItemMessage(hDlg, HSET_DIALUP, BM_SETCHECK, TmpHost.Dialup, 0);\r
2126                         SendDlgItemMessage(hDlg, HSET_DIALUSETHIS, BM_SETCHECK, TmpHost.DialupAlways, 0);\r
2127                         SendDlgItemMessage(hDlg, HSET_DIALNOTIFY, BM_SETCHECK, TmpHost.DialupNotify, 0);\r
2128                         if(AskRasUsable() == NO)\r
2129                                 EnableWindow(GetDlgItem(hDlg, HSET_DIALUP), FALSE);\r
2130                         if((TmpHost.DialupAlways == NO) || (AskRasUsable() == NO))\r
2131                                 EnableWindow(GetDlgItem(hDlg, HSET_DIALNOTIFY), FALSE);\r
2132                         if((TmpHost.Dialup == NO) || (AskRasUsable() == NO))\r
2133                         {\r
2134                                 EnableWindow(GetDlgItem(hDlg, HSET_DIALENTRY), FALSE);\r
2135                                 EnableWindow(GetDlgItem(hDlg, HSET_DIALUSETHIS), FALSE);\r
2136                                 EnableWindow(GetDlgItem(hDlg, HSET_DIALNOTIFY), FALSE);\r
2137                         }\r
2138                         SetRasEntryToComboBox(hDlg, HSET_DIALENTRY, TmpHost.DialEntry);\r
2139                         return(TRUE);\r
2140 \r
2141                 case WM_NOTIFY:\r
2142                         pnmhdr = (NMHDR FAR *)lParam;\r
2143                         switch(pnmhdr->code)\r
2144                         {\r
2145                                 case PSN_APPLY :\r
2146                                         TmpHost.Dialup = SendDlgItemMessage(hDlg, HSET_DIALUP, BM_GETCHECK, 0, 0);\r
2147                                         TmpHost.DialupAlways = SendDlgItemMessage(hDlg, HSET_DIALUSETHIS, BM_GETCHECK, 0, 0);\r
2148                                         TmpHost.DialupNotify = SendDlgItemMessage(hDlg, HSET_DIALNOTIFY, BM_GETCHECK, 0, 0);\r
2149                                         SendDlgItemMessage(hDlg, HSET_DIALENTRY, WM_GETTEXT, RAS_NAME_LEN+1, (LPARAM)TmpHost.DialEntry);\r
2150                                         Apply = YES;\r
2151                                         break;\r
2152 \r
2153                                 case PSN_RESET :\r
2154                                         break;\r
2155 \r
2156                                 case PSN_HELP :\r
2157                                         hHelpWin = HtmlHelp(NULL, AskHelpFilePath(), HH_HELP_CONTEXT, IDH_HELP_TOPIC_0000031);\r
2158                                         break;\r
2159                         }\r
2160                         break;\r
2161 \r
2162                 case WM_COMMAND :\r
2163                         switch(GET_WM_COMMAND_ID(wParam, lParam))\r
2164                         {\r
2165                                 case HSET_DIALUP :\r
2166                                         if(SendDlgItemMessage(hDlg, HSET_DIALUP, BM_GETCHECK, 0, 0) == 0)\r
2167                                         {\r
2168                                                 EnableWindow(GetDlgItem(hDlg, HSET_DIALENTRY), FALSE);\r
2169                                                 EnableWindow(GetDlgItem(hDlg, HSET_DIALUSETHIS), FALSE);\r
2170                                                 EnableWindow(GetDlgItem(hDlg, HSET_DIALNOTIFY), FALSE);\r
2171                                                 break;\r
2172                                         }\r
2173                                         else\r
2174                                         {\r
2175                                                 EnableWindow(GetDlgItem(hDlg, HSET_DIALENTRY), TRUE);\r
2176                                                 EnableWindow(GetDlgItem(hDlg, HSET_DIALUSETHIS), TRUE);\r
2177                                         }\r
2178                                         /* ここにbreakはない */\r
2179 \r
2180                                 case HSET_DIALUSETHIS :\r
2181                                         if(SendDlgItemMessage(hDlg, HSET_DIALUSETHIS, BM_GETCHECK, 0, 0) == 0)\r
2182                                                 EnableWindow(GetDlgItem(hDlg, HSET_DIALNOTIFY), FALSE);\r
2183                                         else\r
2184                                                 EnableWindow(GetDlgItem(hDlg, HSET_DIALNOTIFY), TRUE);\r
2185                                         break;\r
2186                         }\r
2187                         return(TRUE);\r
2188         }\r
2189         return(FALSE);\r
2190 }\r
2191 \r
2192 \r
2193 /*----- 高度設定ウインドウのコールバック --------------------------------------\r
2194 *\r
2195 *       Parameter\r
2196 *               HWND hDlg : ウインドウハンドル\r
2197 *               UINT message : メッセージ番号\r
2198 *               WPARAM wParam : メッセージの WPARAM 引数\r
2199 *               LPARAM lParam : メッセージの LPARAM 引数\r
2200 *\r
2201 *       Return Value\r
2202 *               BOOL TRUE/FALSE\r
2203 *----------------------------------------------------------------------------*/\r
2204 \r
2205 // 64ビット対応\r
2206 //static BOOL CALLBACK Adv2SettingProc(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam)\r
2207 static INT_PTR CALLBACK Adv2SettingProc(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam)\r
2208 {\r
2209         NMHDR *pnmhdr;\r
2210         int Num;\r
2211 \r
2212         switch (iMessage)\r
2213         {\r
2214                 case WM_INITDIALOG :\r
2215                         SendDlgItemMessage(hDlg, HSET_CHMOD_CMD, EM_LIMITTEXT, CHMOD_CMD_LEN, 0);\r
2216                         SendDlgItemMessage(hDlg, HSET_CHMOD_CMD, WM_SETTEXT, 0, (LPARAM)TmpHost.ChmodCmd);\r
2217                         SendDlgItemMessage(hDlg, HSET_LS_FNAME, EM_LIMITTEXT, NLST_NAME_LEN, 0);\r
2218                         SendDlgItemMessage(hDlg, HSET_LS_FNAME, WM_SETTEXT, 0, (LPARAM)TmpHost.LsName);\r
2219                         SendDlgItemMessage(hDlg, HSET_LISTCMD, BM_SETCHECK, TmpHost.ListCmdOnly, 0);\r
2220                         if(TmpHost.ListCmdOnly == YES)\r
2221                                 EnableWindow(GetDlgItem(hDlg, HSET_NLST_R), FALSE);\r
2222                         // MLSD対応\r
2223                         else\r
2224                                 EnableWindow(GetDlgItem(hDlg, HSET_MLSDCMD), FALSE);\r
2225                         SendDlgItemMessage(hDlg, HSET_MLSDCMD, BM_SETCHECK, TmpHost.UseMLSD, 0);\r
2226                         SendDlgItemMessage(hDlg, HSET_NLST_R, BM_SETCHECK, TmpHost.UseNLST_R, 0);\r
2227                         SendDlgItemMessage(hDlg, HSET_FULLPATH, BM_SETCHECK, TmpHost.NoFullPath, 0);\r
2228                         SendDlgItemMessage(hDlg, HSET_HOSTTYPE, CB_ADDSTRING, 0, (LPARAM)MSGJPN139);\r
2229                         SendDlgItemMessage(hDlg, HSET_HOSTTYPE, CB_ADDSTRING, 0, (LPARAM)MSGJPN140);\r
2230                         SendDlgItemMessage(hDlg, HSET_HOSTTYPE, CB_ADDSTRING, 0, (LPARAM)MSGJPN141);\r
2231                         SendDlgItemMessage(hDlg, HSET_HOSTTYPE, CB_ADDSTRING, 0, (LPARAM)MSGJPN142);\r
2232                         SendDlgItemMessage(hDlg, HSET_HOSTTYPE, CB_ADDSTRING, 0, (LPARAM)MSGJPN143);\r
2233                         SendDlgItemMessage(hDlg, HSET_HOSTTYPE, CB_ADDSTRING, 0, (LPARAM)MSGJPN144);\r
2234                         SendDlgItemMessage(hDlg, HSET_HOSTTYPE, CB_ADDSTRING, 0, (LPARAM)MSGJPN289);\r
2235                         SendDlgItemMessage(hDlg, HSET_HOSTTYPE, CB_ADDSTRING, 0, (LPARAM)MSGJPN295);\r
2236 #if defined(HAVE_TANDEM)\r
2237                         SendDlgItemMessage(hDlg, HSET_HOSTTYPE, CB_ADDSTRING, 0, (LPARAM)MSGJPN2000);\r
2238 #endif\r
2239                         SendDlgItemMessage(hDlg, HSET_HOSTTYPE, CB_SETCURSEL, TmpHost.HostType, 0);\r
2240 #if defined(HAVE_TANDEM)\r
2241                         if(TmpHost.HostType == 2 || TmpHost.HostType == HTYPE_TANDEM)  /* VAX or Tandem */\r
2242 #else\r
2243                         if(TmpHost.HostType == 2)\r
2244 #endif\r
2245                         {\r
2246                                 EnableWindow(GetDlgItem(hDlg, HSET_NLST_R), FALSE);\r
2247                                 EnableWindow(GetDlgItem(hDlg, HSET_LISTCMD), FALSE);\r
2248                                 EnableWindow(GetDlgItem(hDlg, HSET_FULLPATH), FALSE);\r
2249                         }\r
2250                         return(TRUE);\r
2251 \r
2252                 case WM_NOTIFY:\r
2253                         pnmhdr = (NMHDR FAR *)lParam;\r
2254                         switch(pnmhdr->code)\r
2255                         {\r
2256                                 case PSN_APPLY :\r
2257                                         SendDlgItemMessage(hDlg, HSET_CHMOD_CMD, WM_GETTEXT, CHMOD_CMD_LEN+1, (LPARAM)TmpHost.ChmodCmd);\r
2258                                         SendDlgItemMessage(hDlg, HSET_LS_FNAME, WM_GETTEXT, NLST_NAME_LEN+1, (LPARAM)TmpHost.LsName);\r
2259                                         TmpHost.ListCmdOnly = SendDlgItemMessage(hDlg, HSET_LISTCMD, BM_GETCHECK, 0, 0);\r
2260                                         // MLSD対応\r
2261                                         TmpHost.UseMLSD = SendDlgItemMessage(hDlg, HSET_MLSDCMD, BM_GETCHECK, 0, 0);\r
2262                                         TmpHost.UseNLST_R = SendDlgItemMessage(hDlg, HSET_NLST_R, BM_GETCHECK, 0, 0);\r
2263                                         TmpHost.NoFullPath = SendDlgItemMessage(hDlg, HSET_FULLPATH, BM_GETCHECK, 0, 0);\r
2264                                         TmpHost.HostType = SendDlgItemMessage(hDlg, HSET_HOSTTYPE, CB_GETCURSEL, 0, 0);\r
2265                                         Apply = YES;\r
2266                                         break;\r
2267 \r
2268                                 case PSN_RESET :\r
2269                                         break;\r
2270 \r
2271                                 case PSN_HELP :\r
2272                                         hHelpWin = HtmlHelp(NULL, AskHelpFilePath(), HH_HELP_CONTEXT, IDH_HELP_TOPIC_0000032);\r
2273                                         break;\r
2274                         }\r
2275                         break;\r
2276 \r
2277                 case WM_COMMAND :\r
2278                         switch(GET_WM_COMMAND_ID(wParam, lParam))\r
2279                         {\r
2280                                 case HSET_CHMOD_NOR :\r
2281                                         SendDlgItemMessage(hDlg, HSET_CHMOD_CMD, WM_SETTEXT, 0, (LPARAM)CHMOD_CMD_NOR);\r
2282                                         break;\r
2283 \r
2284                                 case HSET_LS_FNAME_NOR :\r
2285                                         SendDlgItemMessage(hDlg, HSET_LS_FNAME, WM_SETTEXT, 0, (LPARAM)LS_FNAME);\r
2286                                         break;\r
2287 \r
2288                                 case HSET_LISTCMD :\r
2289                                         if(SendDlgItemMessage(hDlg, HSET_LISTCMD, BM_GETCHECK, 0, 0) == 0)\r
2290                                                 // MLSD対応\r
2291 //                                              EnableWindow(GetDlgItem(hDlg, HSET_NLST_R), TRUE);\r
2292                                         {\r
2293                                                 EnableWindow(GetDlgItem(hDlg, HSET_MLSDCMD), FALSE);\r
2294                                                 EnableWindow(GetDlgItem(hDlg, HSET_NLST_R), TRUE);\r
2295                                         }\r
2296                                         else\r
2297                                                 // MLSD対応\r
2298 //                                              EnableWindow(GetDlgItem(hDlg, HSET_NLST_R), FALSE);\r
2299                                         {\r
2300                                                 EnableWindow(GetDlgItem(hDlg, HSET_MLSDCMD), TRUE);\r
2301                                                 EnableWindow(GetDlgItem(hDlg, HSET_NLST_R), FALSE);\r
2302                                         }\r
2303                                         break;\r
2304 \r
2305                                 case HSET_HOSTTYPE :\r
2306                                         Num = SendDlgItemMessage(hDlg, HSET_HOSTTYPE, CB_GETCURSEL, 0, 0);\r
2307                                         if(Num == 2)\r
2308                                         {\r
2309                                                 EnableWindow(GetDlgItem(hDlg, HSET_NLST_R), FALSE);\r
2310                                                 EnableWindow(GetDlgItem(hDlg, HSET_LISTCMD), FALSE);\r
2311                                                 EnableWindow(GetDlgItem(hDlg, HSET_FULLPATH), FALSE);\r
2312                                         }\r
2313 #if defined(HAVE_TANDEM)\r
2314                                         else if(Num == HTYPE_TANDEM) /* Tandem */\r
2315                                         {\r
2316                                                 /* Tandem を選択すると自動的に LIST にチェックをいれる */\r
2317                                                 SendDlgItemMessage(hDlg, HSET_LISTCMD, BM_SETCHECK, 1, 0);\r
2318                                                 EnableWindow(GetDlgItem(hDlg, HSET_NLST_R), FALSE);\r
2319                                                 EnableWindow(GetDlgItem(hDlg, HSET_LISTCMD), FALSE);\r
2320                                                 EnableWindow(GetDlgItem(hDlg, HSET_FULLPATH), FALSE);\r
2321                                         }\r
2322                                         else\r
2323                                         {\r
2324                                                 if(SendDlgItemMessage(hDlg, HSET_LISTCMD, BM_GETCHECK, 0, 0) == 0) {\r
2325                                                         EnableWindow(GetDlgItem(hDlg, HSET_NLST_R), TRUE);\r
2326                                                         EnableWindow(GetDlgItem(hDlg, HSET_LISTCMD), TRUE);\r
2327                                                 } else {\r
2328                                                         EnableWindow(GetDlgItem(hDlg, HSET_NLST_R), FALSE);\r
2329                                                         EnableWindow(GetDlgItem(hDlg, HSET_LISTCMD), TRUE);\r
2330                                                 }\r
2331                                                 EnableWindow(GetDlgItem(hDlg, HSET_FULLPATH), TRUE);\r
2332                                         }\r
2333 #else\r
2334                                         else\r
2335                                         {\r
2336                                                 EnableWindow(GetDlgItem(hDlg, HSET_NLST_R), TRUE);\r
2337                                                 EnableWindow(GetDlgItem(hDlg, HSET_LISTCMD), TRUE);\r
2338                                                 EnableWindow(GetDlgItem(hDlg, HSET_FULLPATH), TRUE);\r
2339                                         }\r
2340 #endif\r
2341                                         break;\r
2342                         }\r
2343                         return(TRUE);\r
2344         }\r
2345         return(FALSE);\r
2346 }\r
2347 \r
2348 \r
2349 // 暗号化通信対応\r
2350 static INT_PTR CALLBACK CryptSettingProc(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam)\r
2351 {\r
2352         NMHDR *pnmhdr;\r
2353 //      int Num;\r
2354 \r
2355         switch (iMessage)\r
2356         {\r
2357                 case WM_INITDIALOG :\r
2358                         SendDlgItemMessage(hDlg, HSET_NO_ENCRYPTION, BM_SETCHECK, TmpHost.UseNoEncryption, 0);\r
2359                         if(IsOpenSSLLoaded())\r
2360                         {\r
2361                                 SendDlgItemMessage(hDlg, HSET_FTPES, BM_SETCHECK, TmpHost.UseFTPES, 0);\r
2362                                 SendDlgItemMessage(hDlg, HSET_FTPIS, BM_SETCHECK, TmpHost.UseFTPIS, 0);\r
2363                         }\r
2364                         else\r
2365                         {\r
2366                                 SendDlgItemMessage(hDlg, HSET_FTPES, BM_SETCHECK, BST_UNCHECKED, 0);\r
2367                                 EnableWindow(GetDlgItem(hDlg, HSET_FTPES), FALSE);\r
2368                                 SendDlgItemMessage(hDlg, HSET_FTPIS, BM_SETCHECK, BST_UNCHECKED, 0);\r
2369                                 EnableWindow(GetDlgItem(hDlg, HSET_FTPIS), FALSE);\r
2370                         }\r
2371                         SendDlgItemMessage(hDlg, HSET_SFTP, BM_SETCHECK, BST_UNCHECKED, 0);\r
2372                         EnableWindow(GetDlgItem(hDlg, HSET_SFTP), FALSE);\r
2373                         EnableWindow(GetDlgItem(hDlg, PKEY_FILE_BR), FALSE);\r
2374                         EnableWindow(GetDlgItem(hDlg, HSET_PRIVATE_KEY), FALSE);\r
2375                         SendDlgItemMessage(hDlg, HSET_NO_WEAK, BM_SETCHECK, TmpHost.NoWeakEncryption, 0);\r
2376                         return(TRUE);\r
2377 \r
2378                 case WM_NOTIFY:\r
2379                         pnmhdr = (NMHDR FAR *)lParam;\r
2380                         switch(pnmhdr->code)\r
2381                         {\r
2382                                 case PSN_APPLY :\r
2383                                         TmpHost.UseNoEncryption = SendDlgItemMessage(hDlg, HSET_NO_ENCRYPTION, BM_GETCHECK, 0, 0);\r
2384                                         if(IsOpenSSLLoaded())\r
2385                                         {\r
2386                                                 TmpHost.UseFTPES = SendDlgItemMessage(hDlg, HSET_FTPES, BM_GETCHECK, 0, 0);\r
2387                                                 TmpHost.UseFTPIS = SendDlgItemMessage(hDlg, HSET_FTPIS, BM_GETCHECK, 0, 0);\r
2388                                         }\r
2389                                         TmpHost.NoWeakEncryption = SendDlgItemMessage(hDlg, HSET_NO_WEAK, BM_GETCHECK, 0, 0);\r
2390                                         Apply = YES;\r
2391                                         break;\r
2392 \r
2393                                 case PSN_RESET :\r
2394                                         break;\r
2395 \r
2396                                 case PSN_HELP :\r
2397                                         hHelpWin = HtmlHelp(NULL, AskHelpFilePath(), HH_HELP_CONTEXT, IDH_HELP_TOPIC_0000065);\r
2398                                         break;\r
2399                         }\r
2400                         break;\r
2401         }\r
2402         return(FALSE);\r
2403 }\r
2404 \r
2405 // 同時接続対応\r
2406 static INT_PTR CALLBACK Adv3SettingProc(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam)\r
2407 {\r
2408         NMHDR *pnmhdr;\r
2409 //      int Num;\r
2410 \r
2411         // UTF-8対応\r
2412         static const RADIOBUTTON KanjiButton[] = {\r
2413                 { HSET_NO_CNV, KANJI_NOCNV },\r
2414                 { HSET_SJIS_CNV, KANJI_SJIS },\r
2415                 { HSET_JIS_CNV, KANJI_JIS },\r
2416                 { HSET_EUC_CNV, KANJI_EUC },\r
2417                 { HSET_UTF8N_CNV, KANJI_UTF8N },\r
2418                 { HSET_UTF8BOM_CNV, KANJI_UTF8BOM }\r
2419         };\r
2420         #define KANJIBUTTONS    (sizeof(KanjiButton)/sizeof(RADIOBUTTON))\r
2421 \r
2422         switch (iMessage)\r
2423         {\r
2424                 case WM_INITDIALOG :\r
2425                         SendDlgItemMessage(hDlg, HSET_THREAD_COUNT, EM_LIMITTEXT, (WPARAM)1, 0);\r
2426                         SetDecimalText(hDlg, HSET_THREAD_COUNT, TmpHost.MaxThreadCount);\r
2427                         SendDlgItemMessage(hDlg, HSET_THREAD_COUNT_SPN, UDM_SETRANGE, 0, (LPARAM)MAKELONG(MAX_DATA_CONNECTION, 1));\r
2428                         SendDlgItemMessage(hDlg, HSET_REUSE_SOCKET, BM_SETCHECK, TmpHost.ReuseCmdSkt, 0);\r
2429                         SendDlgItemMessage(hDlg, HSET_NOOP_INTERVAL, EM_LIMITTEXT, (WPARAM)3, 0);\r
2430                         SetDecimalText(hDlg, HSET_NOOP_INTERVAL, TmpHost.NoopInterval);\r
2431                         SendDlgItemMessage(hDlg, HSET_NOOP_INTERVAL_SPN, UDM_SETRANGE, 0, (LPARAM)MAKELONG(300, 0));\r
2432                         SendDlgItemMessage(hDlg, HSET_ERROR_MODE, CB_ADDSTRING, 0, (LPARAM)MSGJPN335);\r
2433                         SendDlgItemMessage(hDlg, HSET_ERROR_MODE, CB_ADDSTRING, 0, (LPARAM)MSGJPN336);\r
2434                         SendDlgItemMessage(hDlg, HSET_ERROR_MODE, CB_ADDSTRING, 0, (LPARAM)MSGJPN337);\r
2435                         SendDlgItemMessage(hDlg, HSET_ERROR_MODE, CB_ADDSTRING, 0, (LPARAM)MSGJPN338);\r
2436                         if(TmpHost.TransferErrorNotify == YES)\r
2437                                 SendDlgItemMessage(hDlg, HSET_ERROR_MODE, CB_SETCURSEL, 0, 0);\r
2438                         else if(TmpHost.TransferErrorMode == EXIST_OVW)\r
2439                                 SendDlgItemMessage(hDlg, HSET_ERROR_MODE, CB_SETCURSEL, 1, 0);\r
2440                         else if(TmpHost.TransferErrorMode == EXIST_RESUME)\r
2441                                 SendDlgItemMessage(hDlg, HSET_ERROR_MODE, CB_SETCURSEL, 2, 0);\r
2442                         else if(TmpHost.TransferErrorMode == EXIST_IGNORE)\r
2443                                 SendDlgItemMessage(hDlg, HSET_ERROR_MODE, CB_SETCURSEL, 3, 0);\r
2444                         else\r
2445                                 SendDlgItemMessage(hDlg, HSET_ERROR_MODE, CB_SETCURSEL, 0, 0);\r
2446                         SendDlgItemMessage(hDlg, HSET_ERROR_RECONNECT, BM_SETCHECK, TmpHost.TransferErrorReconnect, 0);\r
2447                         SendDlgItemMessage(hDlg, HSET_NO_PASV_ADRS, BM_SETCHECK, TmpHost.NoPasvAdrs, 0);\r
2448                         return(TRUE);\r
2449 \r
2450                 case WM_NOTIFY:\r
2451                         pnmhdr = (NMHDR FAR *)lParam;\r
2452                         switch(pnmhdr->code)\r
2453                         {\r
2454                                 case PSN_APPLY :\r
2455                                         TmpHost.MaxThreadCount = GetDecimalText(hDlg, HSET_THREAD_COUNT);\r
2456                                         CheckRange2(&TmpHost.MaxThreadCount, MAX_DATA_CONNECTION, 1);\r
2457                                         TmpHost.ReuseCmdSkt = SendDlgItemMessage(hDlg, HSET_REUSE_SOCKET, BM_GETCHECK, 0, 0);\r
2458                                         TmpHost.NoopInterval = GetDecimalText(hDlg, HSET_NOOP_INTERVAL);\r
2459                                         CheckRange2(&TmpHost.NoopInterval, 300, 0);\r
2460                                         switch(SendDlgItemMessage(hDlg, HSET_ERROR_MODE, CB_GETCURSEL, 0, 0))\r
2461                                         {\r
2462                                         case 0:\r
2463                                                 TmpHost.TransferErrorMode = EXIST_OVW;\r
2464                                                 TmpHost.TransferErrorNotify = YES;\r
2465                                                 break;\r
2466                                         case 1:\r
2467                                                 TmpHost.TransferErrorMode = EXIST_OVW;\r
2468                                                 TmpHost.TransferErrorNotify = NO;\r
2469                                                 break;\r
2470                                         case 2:\r
2471                                                 TmpHost.TransferErrorMode = EXIST_RESUME;\r
2472                                                 TmpHost.TransferErrorNotify = NO;\r
2473                                                 break;\r
2474                                         case 3:\r
2475                                                 TmpHost.TransferErrorMode = EXIST_IGNORE;\r
2476                                                 TmpHost.TransferErrorNotify = NO;\r
2477                                                 break;\r
2478                                         }\r
2479                                         TmpHost.TransferErrorReconnect = SendDlgItemMessage(hDlg, HSET_ERROR_RECONNECT, BM_GETCHECK, 0, 0);\r
2480                                         TmpHost.NoPasvAdrs = SendDlgItemMessage(hDlg, HSET_NO_PASV_ADRS, BM_GETCHECK, 0, 0);\r
2481                                         Apply = YES;\r
2482                                         break;\r
2483 \r
2484                                 case PSN_RESET :\r
2485                                         break;\r
2486 \r
2487                                 case PSN_HELP :\r
2488                                         hHelpWin = HtmlHelp(NULL, AskHelpFilePath(), HH_HELP_CONTEXT, IDH_HELP_TOPIC_0000066);\r
2489                                         break;\r
2490                         }\r
2491                         break;\r
2492         }\r
2493         return(FALSE);\r
2494 }\r
2495 \r
2496 // 暗号化通信対応\r
2497 // ホストの暗号化設定を更新\r
2498 int SetHostEncryption(int Num, int UseNoEncryption, int UseFTPES, int UseFTPIS, int UseSFTP)\r
2499 {\r
2500         int Sts;\r
2501         HOSTLISTDATA *Pos;\r
2502 \r
2503         Sts = FFFTP_FAIL;\r
2504         if((Num >= 0) && (Num < Hosts))\r
2505         {\r
2506                 Pos = GetNodeByNum(Num);\r
2507                 Pos->Set.UseNoEncryption = UseNoEncryption;\r
2508                 Pos->Set.UseFTPES = UseFTPES;\r
2509                 Pos->Set.UseFTPIS = UseFTPIS;\r
2510                 Pos->Set.UseSFTP = UseSFTP;\r
2511                 Sts = FFFTP_SUCCESS;\r
2512         }\r
2513         return(Sts);\r
2514 }\r
2515 \r