OSDN Git Service

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