OSDN Git Service

Modify documents.
[ffftp/ffftp.git] / src / history.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 <mbstring.h>\r
38 #include <malloc.h>\r
39 #include <windowsx.h>\r
40 #include <commctrl.h>\r
41 #include <stdarg.h>\r
42 // IPv6対応\r
43 //#include <winsock.h>\r
44 \r
45 #include "common.h"\r
46 #include "resource.h"\r
47 \r
48 \r
49 /*===== プロトタイプ =====*/\r
50 \r
51 static void CopyHostToHistory(HOSTDATA *Host, HISTORYDATA *New);\r
52 static void AddOneFnameToMenu(char *Host, char *User, char *Remote, int Num);\r
53 static void RemoveAllHistoryFromMenu(void);\r
54 \r
55 /*===== 外部参照 =====*/\r
56 \r
57 /* 設定値 */\r
58 extern int FileHist;\r
59 extern int PassToHist;\r
60 \r
61 /*===== ローカルなワーク =====*/\r
62 \r
63 static HISTORYDATA *HistoryBase = NULL;\r
64 static int HistoryNum = 0;\r
65 \r
66 /* ヒストリのメニュー項目のID */\r
67 static int MenuHistId[HISTORY_MAX] = {\r
68         MENU_HIST_1,  MENU_HIST_2,  MENU_HIST_3,  MENU_HIST_4,  MENU_HIST_5,\r
69         MENU_HIST_6,  MENU_HIST_7,  MENU_HIST_8,  MENU_HIST_9,  MENU_HIST_10,\r
70         MENU_HIST_11, MENU_HIST_12, MENU_HIST_13, MENU_HIST_14, MENU_HIST_15,\r
71         MENU_HIST_16, MENU_HIST_17, MENU_HIST_18, MENU_HIST_19, MENU_HIST_20\r
72 };\r
73 \r
74 \r
75 \r
76 /*----- ホスト情報をヒストリリストの先頭に追加する ----------------------------\r
77 *\r
78 *       Parameter\r
79 *               HOSTDATA *Host : ホストデータ\r
80 *               int TrMode : 転送モード\r
81 *\r
82 *       Return Value\r
83 *               なし\r
84 *----------------------------------------------------------------------------*/\r
85 \r
86 void AddHostToHistory(HOSTDATA *Host, int TrMode)\r
87 {\r
88         HISTORYDATA New;\r
89 \r
90         CopyHostToHistory(Host, &New);\r
91         New.Type = TrMode;\r
92         AddHistoryToHistory(&New);\r
93         return;\r
94 }\r
95 \r
96 \r
97 /*----- ヒストリをヒストリリストの先頭に追加する ------------------------------\r
98 *\r
99 *       Parameter\r
100 *               HISTORYDATA *Hist : ヒストリデータ\r
101 *\r
102 *       Return Value\r
103 *               なし\r
104 *----------------------------------------------------------------------------*/\r
105 \r
106 void AddHistoryToHistory(HISTORYDATA *Hist)\r
107 {\r
108         HISTORYDATA *New;\r
109 \r
110         CheckHistoryNum(1);\r
111         if(FileHist > HistoryNum)\r
112         {\r
113                 New = malloc(sizeof(HISTORYDATA));\r
114                 if(New != NULL)\r
115                 {\r
116                         memcpy(New, Hist, sizeof(HISTORYDATA));\r
117                         New->Next = HistoryBase;\r
118                         HistoryBase = New;\r
119                         HistoryNum++;\r
120                 }\r
121         }\r
122         return;\r
123 }\r
124 \r
125 \r
126 /*----- ヒストリの数を返す ----------------------------------------------------\r
127 *\r
128 *       Parameter\r
129 *               なし\r
130 *\r
131 *       Return Value\r
132 *               int ヒストリの数\r
133 *----------------------------------------------------------------------------*/\r
134 \r
135 int AskHistoryNum(void)\r
136 {\r
137         return(HistoryNum);\r
138 }\r
139 \r
140 \r
141 /*----- ヒストリの数をチェックし多すぎたら削除 --------------------------------\r
142 *\r
143 *       Parameter\r
144 *               int Space : 空けておく個数 (0~)\r
145 *\r
146 *       Return Value\r
147 *               なし\r
148 *----------------------------------------------------------------------------*/\r
149 \r
150 void CheckHistoryNum(int Space)\r
151 {\r
152         int i;\r
153         HISTORYDATA *Prev;\r
154         HISTORYDATA *Pos;\r
155         HISTORYDATA *Next;\r
156 \r
157         if(HistoryNum > FileHist-Space)\r
158         {\r
159                 /* 残すべきヒストリを探す */\r
160                 Pos = HistoryBase;\r
161                 Prev = NULL;\r
162                 for(i = 0; i < FileHist-Space; i++)\r
163                 {\r
164                         Prev = Pos;\r
165                         Pos = Pos->Next;\r
166                 }\r
167 \r
168                 /* いらないヒストリを消す */\r
169                 if(Prev == NULL)\r
170                         HistoryBase = NULL;\r
171                 else\r
172                         Prev->Next = NULL;\r
173 \r
174                 while(Pos != NULL)\r
175                 {\r
176                         Next = Pos->Next;\r
177                         free(Pos);\r
178                         Pos = Next;\r
179                         HistoryNum--;\r
180                 }\r
181         }\r
182         return;\r
183 }\r
184 \r
185 \r
186 /*----- ホスト情報をヒストリにセット ------------------------------------------\r
187 *\r
188 *       Parameter\r
189 *               HOSTDATA *Host : ホストデータ\r
190 *               HISTORYDATA *New : ヒストリをセットするワーク\r
191 *\r
192 *       Return Value\r
193 *               なし\r
194 *----------------------------------------------------------------------------*/\r
195 \r
196 static void CopyHostToHistory(HOSTDATA *Host, HISTORYDATA *New)\r
197 {\r
198         strcpy(New->HostAdrs, Host->HostAdrs);\r
199         strcpy(New->UserName, Host->UserName);\r
200         if(PassToHist == YES)\r
201                 strcpy(New->PassWord, Host->PassWord);\r
202         else\r
203                 strcpy(New->PassWord, "");\r
204         strcpy(New->Account, Host->Account);\r
205         strcpy(New->LocalInitDir, Host->LocalInitDir);\r
206         strcpy(New->RemoteInitDir, Host->RemoteInitDir);\r
207         strcpy(New->ChmodCmd, Host->ChmodCmd);\r
208         strcpy(New->LsName, Host->LsName);\r
209         strcpy(New->InitCmd, Host->InitCmd);\r
210         New->Port = Host->Port;\r
211         New->KanjiCode = Host->KanjiCode;\r
212         New->KanaCnv = Host->KanaCnv;\r
213         New->NameKanjiCode = Host->NameKanjiCode;\r
214         New->NameKanaCnv = Host->NameKanaCnv;\r
215         New->Pasv = Host->Pasv;\r
216         New->FireWall = Host->FireWall;\r
217         New->ListCmdOnly = Host->ListCmdOnly;\r
218         New->UseNLST_R = Host->UseNLST_R;\r
219         New->TimeZone = Host->TimeZone;\r
220         New->HostType = Host->HostType;\r
221         New->SyncMove = Host->SyncMove;\r
222         New->NoFullPath = Host->NoFullPath;\r
223         New->Sort = Host->Sort;\r
224         New->Security = Host->Security;\r
225         New->Dialup = Host->Dialup;\r
226         New->DialupAlways = Host->DialupAlways;\r
227         New->DialupNotify = Host->DialupNotify;\r
228         strcpy(New->DialEntry, Host->DialEntry);\r
229         // 暗号化通信対応\r
230         New->UseNoEncryption = Host->UseNoEncryption;\r
231         New->UseFTPES = Host->UseFTPES;\r
232         New->UseFTPIS = Host->UseFTPIS;\r
233         New->UseSFTP = Host->UseSFTP;\r
234         strcpy(New->PrivateKey, Host->PrivateKey);\r
235         New->NoWeakEncryption = Host->NoWeakEncryption;\r
236         // 同時接続対応\r
237         New->MaxThreadCount = Host->MaxThreadCount;\r
238         New->ReuseCmdSkt = Host->ReuseCmdSkt;\r
239         // MLSD対応\r
240         New->UseMLSD = Host->UseMLSD;\r
241         // IPv6対応\r
242         New->NetType = Host->NetType;\r
243         // 自動切断対策\r
244         New->NoopInterval = Host->NoopInterval;\r
245         // 再転送対応\r
246         New->TransferErrorMode = Host->TransferErrorMode;\r
247         New->TransferErrorNotify = Host->TransferErrorNotify;\r
248         // セッションあたりの転送量制限対策\r
249         New->TransferErrorReconnect = Host->TransferErrorReconnect;\r
250         // ホスト側の設定ミス対策\r
251         New->NoPasvAdrs = Host->NoPasvAdrs;\r
252         return;\r
253 }\r
254 \r
255 \r
256 /*----- ヒストリ情報をホスト情報にセット --------------------------------------\r
257 *\r
258 *       Parameter\r
259 *               HISTORYDATA *Hist : ヒストリ\r
260 *               HOSTDATA *Host : ホストデータをセットするワーク\r
261 *\r
262 *       Return Value\r
263 *               なし\r
264 *----------------------------------------------------------------------------*/\r
265 \r
266 void CopyHistoryToHost(HISTORYDATA *Hist, HOSTDATA *Host)\r
267 {\r
268         CopyDefaultHost(Host);\r
269 \r
270         strcpy(Host->HostAdrs, Hist->HostAdrs);\r
271         strcpy(Host->UserName, Hist->UserName);\r
272         if(PassToHist == YES)\r
273                 strcpy(Host->PassWord, Hist->PassWord);\r
274         else\r
275                 strcpy(Host->PassWord, "");\r
276         strcpy(Host->Account, Hist->Account);\r
277         strcpy(Host->LocalInitDir, Hist->LocalInitDir);\r
278         strcpy(Host->RemoteInitDir, Hist->RemoteInitDir);\r
279         strcpy(Host->ChmodCmd, Hist->ChmodCmd);\r
280         strcpy(Host->LsName, Hist->LsName);\r
281         strcpy(Host->InitCmd, Hist->InitCmd);\r
282         Host->Port = Hist->Port;\r
283         Host->KanjiCode = Hist->KanjiCode;\r
284         Host->KanaCnv = Hist->KanaCnv;\r
285         Host->NameKanjiCode = Hist->NameKanjiCode;\r
286         Host->NameKanaCnv = Hist->NameKanaCnv;\r
287         Host->Pasv = Hist->Pasv;\r
288         Host->FireWall = Hist->FireWall;\r
289         Host->ListCmdOnly = Hist->ListCmdOnly;\r
290         Host->UseNLST_R = Hist->UseNLST_R;\r
291         Host->TimeZone = Hist->TimeZone;\r
292         Host->HostType = Hist->HostType;\r
293         Host->SyncMove = Hist->SyncMove;\r
294         Host->NoFullPath = Hist->NoFullPath;\r
295         Host->Sort = Hist->Sort;\r
296         Host->Security = Hist->Security;\r
297         Host->Dialup = Hist->Dialup;\r
298         Host->DialupAlways = Hist->DialupAlways;\r
299         Host->DialupNotify = Hist->DialupNotify;\r
300         strcpy(Host->DialEntry, Hist->DialEntry);\r
301         // 暗号化通信対応\r
302         Host->UseNoEncryption = Hist->UseNoEncryption;\r
303         Host->UseFTPES = Hist->UseFTPES;\r
304         Host->UseFTPIS = Hist->UseFTPIS;\r
305         Host->UseSFTP = Hist->UseSFTP;\r
306         strcpy(Host->PrivateKey, Hist->PrivateKey);\r
307         Host->NoWeakEncryption = Hist->NoWeakEncryption;\r
308         // 同時接続対応\r
309         Host->MaxThreadCount = Hist->MaxThreadCount;\r
310         Host->ReuseCmdSkt = Hist->ReuseCmdSkt;\r
311         // MLSD対応\r
312         Host->UseMLSD = Hist->UseMLSD;\r
313         // IPv6対応\r
314         Host->NetType = Hist->NetType;\r
315         // 自動切断対策\r
316         Host->NoopInterval = Hist->NoopInterval;\r
317         // 再転送対応\r
318         Host->TransferErrorMode = Hist->TransferErrorMode;\r
319         Host->TransferErrorNotify = Hist->TransferErrorNotify;\r
320         // セッションあたりの転送量制限対策\r
321         Host->TransferErrorReconnect = Hist->TransferErrorReconnect;\r
322         // ホスト側の設定ミス対策\r
323         Host->NoPasvAdrs = Hist->NoPasvAdrs;\r
324         return;\r
325 }\r
326 \r
327 \r
328 /*----- ヒストリ情報の初期値を取得 --------------------------------------------\r
329 *\r
330 *       Parameter\r
331 *               HISTORYDATA *Set : ヒストリをセットするワーク\r
332 *\r
333 *       Return Value\r
334 *               なし\r
335 *----------------------------------------------------------------------------*/\r
336 \r
337 void CopyDefaultHistory(HISTORYDATA *Set)\r
338 {\r
339         HOSTDATA Host;\r
340 \r
341         // ホスト共通設定機能\r
342 //      CopyDefaultHost(&Host);\r
343         CopyDefaultDefaultHost(&Host);\r
344         CopyHostToHistory(&Host, Set);\r
345         return;\r
346 }\r
347 \r
348 \r
349 /*----- 全ヒストリをメニューにセット ------------------------------------------\r
350 *\r
351 *       Parameter\r
352 *               なし\r
353 *\r
354 *       Return Value\r
355 *               なし\r
356 *----------------------------------------------------------------------------*/\r
357 \r
358 void SetAllHistoryToMenu(void)\r
359 {\r
360         int i;\r
361         HISTORYDATA *Pos;\r
362 \r
363         RemoveAllHistoryFromMenu();\r
364 \r
365         Pos = HistoryBase;\r
366         for(i = 0; i < HistoryNum; i++)\r
367         {\r
368                 AddOneFnameToMenu(Pos->HostAdrs, Pos->UserName, Pos->RemoteInitDir, i);\r
369                 Pos = Pos->Next;\r
370         }\r
371         return;\r
372 }\r
373 \r
374 \r
375 /*----- ヒストリをメニューに追加 ----------------------------------------------\r
376 *\r
377 *       Parameter\r
378 *               char *Host : ホスト名\r
379 *               char *User : ユーザ名\r
380 *               char *Remote : ホストのフォルダ\r
381 *               int Num : 番号\r
382 *\r
383 *       Return Value\r
384 *               なし\r
385 *----------------------------------------------------------------------------*/\r
386 \r
387 static void AddOneFnameToMenu(char *Host, char *User, char *Remote, int Num)\r
388 {\r
389         HMENU hMenu;\r
390         char Tmp[HOST_ADRS_LEN+USER_NAME_LEN+INIT_DIR_LEN+7+1];\r
391 \r
392         hMenu = GetSubMenu(GetMenu(GetMainHwnd()), 0);\r
393 \r
394         if(Num == 0)\r
395                 AppendMenu(hMenu, MF_SEPARATOR, 0, NULL);\r
396 \r
397         if(Num < 9)\r
398                 sprintf(Tmp, "&%d %s (%s) %s", Num+1, Host, User, Remote);\r
399         else if(Num == 9)\r
400                 sprintf(Tmp, "&0 %s (%s) %s", Host, User, Remote);\r
401         else\r
402                 sprintf(Tmp, "&* %s (%s) %s", Host, User, Remote);\r
403 \r
404         AppendMenu(hMenu, MF_STRING, MenuHistId[Num], Tmp);\r
405 \r
406         return;\r
407 }\r
408 \r
409 \r
410 /*----- 全ヒストリをメニューから削除 ------------------------------------------\r
411 *\r
412 *       Parameter\r
413 *               なし\r
414 *\r
415 *       Return Value\r
416 *               なし\r
417 *----------------------------------------------------------------------------*/\r
418 \r
419 static void RemoveAllHistoryFromMenu(void)\r
420 {\r
421         HMENU hMenu;\r
422         int Cnt;\r
423         int i;\r
424 \r
425         hMenu = GetSubMenu(GetMenu(GetMainHwnd()), 0);\r
426         Cnt = GetMenuItemCount(hMenu);\r
427         for(i = DEF_FMENU_ITEMS; i < Cnt; i++)\r
428         {\r
429                 DeleteMenu(hMenu, DEF_FMENU_ITEMS, MF_BYPOSITION);\r
430         }\r
431         return;\r
432 }\r
433 \r
434 \r
435 /*----- 指定メニューコマンドに対応するヒストリを返す --------------------------\r
436 *\r
437 *       Parameter\r
438 *               int MenuCmd : 取り出すヒストリに割り当てられたメニューコマンド (MENU_xxx)\r
439 *               HISTORYDATA *Buf : ヒストリデータを返すバッファ\r
440 *\r
441 *       Return Value\r
442 *               int ステータス\r
443 *                       FFFTP_SUCCESS/FFFTP_FAIL\r
444 *----------------------------------------------------------------------------*/\r
445 \r
446 int GetHistoryByCmd(int MenuCmd, HISTORYDATA *Buf)\r
447 {\r
448         int Sts;\r
449         int i;\r
450         HISTORYDATA *Pos;\r
451 \r
452         Sts = FFFTP_FAIL;\r
453         Pos = HistoryBase;\r
454         for(i = 0; i < HistoryNum; i++)\r
455         {\r
456                 if(MenuHistId[i] == MenuCmd)\r
457                 {\r
458                         memcpy(Buf, Pos, sizeof(HISTORYDATA));\r
459                         Sts = FFFTP_SUCCESS;\r
460                 }\r
461                 Pos = Pos->Next;\r
462         }\r
463         return(Sts);\r
464 }\r
465 \r
466 \r
467 /*----- 指定番号に対応するヒストリを返す --------------------------------------\r
468 *\r
469 *       Parameter\r
470 *               int Num : 番号(0~)\r
471 *               HISTORYDATA *Buf : ヒストリデータを返すバッファ\r
472 *\r
473 *       Return Value\r
474 *               int ステータス\r
475 *                       FFFTP_SUCCESS/FFFTP_FAIL\r
476 *----------------------------------------------------------------------------*/\r
477 \r
478 int GetHistoryByNum(int Num, HISTORYDATA *Buf)\r
479 {\r
480         return(GetHistoryByCmd(MenuHistId[Num], Buf));\r
481 }\r
482 \r
483 \r