OSDN Git Service

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