1 /*=============================================================================
\r
5 ===============================================================================
\r
6 / Copyright (C) 1997-2007 Sota. All rights reserved.
\r
8 / Redistribution and use in source and binary forms, with or without
\r
9 / modification, are permitted provided that the following conditions
\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
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
32 #include <winsock2.h>
\r
33 #include <windows.h>
\r
38 #include <mbstring.h>
\r
40 #include <windowsx.h>
\r
41 #include <commctrl.h>
\r
46 #include "resource.h"
\r
51 static BOOL CALLBACK CountPrevFfftpWindowsProc(HWND hWnd, LPARAM lParam);
\r
55 /*===== キャッシュデータのストラクチャ =====*/
\r
58 time_t Time; /* リストに登録した時間 */
\r
59 char HostAdrs[HOST_ADRS_LEN+1]; /* ホストのアドレス */
\r
60 char UserName[USER_NAME_LEN+1]; /* ユーザ名 */
\r
61 char Path[FMAX_PATH+1]; /* パス名 */
\r
64 /*===== ローカルなワーク =====*/
\r
66 static CACHELIST *RemoteCache = NULL; /* キャッシュデータ */
\r
67 static int TmpCacheEntry = 0; /* キャッシュされているデータの数 */
\r
68 static int LastNum; /* 現在表示しているデータの番号 */
\r
69 static int ProgNum; /* FFFTPの起動番号 */
\r
72 /*----- ファイル一覧キャッシュを作成する --------------------------------------
\r
75 * int Num : キャッシュ可能個数
\r
79 * FFFTP_SUCCESS/FFFTP_FAIL
\r
80 *----------------------------------------------------------------------------*/
\r
82 int MakeCacheBuf(int Num)
\r
87 Sts = FFFTP_SUCCESS;
\r
91 if((RemoteCache = malloc(sizeof(CACHELIST) * Num)) != NULL)
\r
93 TmpCacheEntry = Num;
\r
94 for(i = 0; i < TmpCacheEntry; i++)
\r
96 Sts = FFFTP_SUCCESS;
\r
103 /*----- ファイル一覧キャッシュを削除する --------------------------------------
\r
110 *----------------------------------------------------------------------------*/
\r
112 void DeleteCacheBuf(void)
\r
114 if(RemoteCache != NULL)
\r
116 RemoteCache = NULL;
\r
122 /*----- パスがキャッシュされているかどうかを返す ------------------------------
\r
130 *----------------------------------------------------------------------------*/
\r
132 int AskCached(char *Path)
\r
139 if(TmpCacheEntry > 0)
\r
142 for(i = 0; i < TmpCacheEntry; i++)
\r
144 if((_stricmp(AskHostAdrs(), Pos->HostAdrs) == 0) &&
\r
145 (strcmp(AskHostUserName(), Pos->UserName) == 0) &&
\r
146 (strcmp(Path, Pos->Path) == 0))
\r
148 time(&(Pos->Time)); /* Refresh */
\r
150 // DoPrintf("Filelist cache found. (%d)", Ret);
\r
160 /*----- 未使用のキャッシュデータ番号を返す ------------------------------------
\r
166 * int 未使用のキャッシュデータ番号
\r
169 * 未使用の物が無い時は、一番古いものに上書きする
\r
170 *----------------------------------------------------------------------------*/
\r
172 int AskFreeCache(void)
\r
180 if(TmpCacheEntry > 0)
\r
185 for(i = 0; i < TmpCacheEntry; i++)
\r
187 if(strlen(Pos->Path) == 0)
\r
194 if((Ret == -1) || (Pos->Time < Oldest))
\r
196 Oldest = Pos->Time;
\r
203 // DoPrintf("Set filelist cache. (%d)", Ret);
\r
208 /*----- キャッシュデータをセットする ------------------------------------------
\r
211 * int Num : キャッシュデータ番号
\r
219 *----------------------------------------------------------------------------*/
\r
221 void SetCache(int Num, char *Path)
\r
223 if(TmpCacheEntry > 0)
\r
225 strcpy((RemoteCache + Num)->HostAdrs, AskHostAdrs());
\r
226 strcpy((RemoteCache + Num)->UserName, AskHostUserName());
\r
227 strcpy((RemoteCache + Num)->Path, Path);
\r
228 time(&((RemoteCache + Num)->Time));
\r
234 /*----- キャッシュデータをクリアする ------------------------------------------
\r
237 * int Num : キャッシュデータ番号
\r
241 *----------------------------------------------------------------------------*/
\r
243 void ClearCache(int Num)
\r
245 if(TmpCacheEntry > 0)
\r
247 strcpy((RemoteCache + Num)->HostAdrs, "");
\r
248 strcpy((RemoteCache + Num)->UserName, "");
\r
249 strcpy((RemoteCache + Num)->Path, "");
\r
250 (RemoteCache + Num)->Time = 0;
\r
256 /*----- 現在表示中のキャッシュデータ番号を返す --------------------------------
\r
263 *----------------------------------------------------------------------------*/
\r
265 int AskCurrentFileListNum(void)
\r
271 /*----- 現在表示中のキャッシュデータ番号をセットする --------------------------
\r
274 * int Num : キャッシュデータ番号
\r
278 *----------------------------------------------------------------------------*/
\r
280 void SetCurrentFileListNum(int Num)
\r
286 /*----- キャッシュデータを保存する --------------------------------------------
\r
295 * キャッシュデータそのものはファイルになっているので、ここではインデック
\r
298 *----------------------------------------------------------------------------*/
\r
300 void SaveCache(void)
\r
302 char Buf[FMAX_PATH+1];
\r
307 if(ProgNum == 0) /* 最初のインスタンスだけがキャッシュを保存できる */
\r
309 if(TmpCacheEntry > 0)
\r
311 strcpy(Buf, AskTmpFilePath());
\r
313 strcat(Buf, "_ffftp.idx");
\r
314 if((fd = fopen(Buf, "wt"))!=NULL)
\r
317 for(i = 0; i < TmpCacheEntry; i++)
\r
319 if(strlen(Pos->Path) != 0)
\r
320 fprintf(fd, "%s %s %s %ld\n", Pos->HostAdrs, Pos->UserName, Pos->Path, Pos->Time);
\r
330 MakeCacheFileName(998, Buf);
\r
333 MakeCacheFileName(999, Buf);
\r
340 /*----- キャッシュデータを読み込む --------------------------------------------
\r
347 *----------------------------------------------------------------------------*/
\r
349 void LoadCache(void)
\r
351 char Buf[FMAX_PATH+1];
\r
356 if(ProgNum == 0) /* 最初のインスタンスだけがキャッシュを保存できる */
\r
358 if(TmpCacheEntry > 0)
\r
360 strcpy(Buf, AskTmpFilePath());
\r
362 strcat(Buf, "_ffftp.idx");
\r
363 if((fd = fopen(Buf, "rt"))!=NULL)
\r
367 while(Num < TmpCacheEntry)
\r
369 if(fgets(Buf, FMAX_PATH, fd) == NULL)
\r
372 if(sscanf(Buf, "%s %s %s %ld\n", Pos->HostAdrs, Pos->UserName, Pos->Path, &(Pos->Time)) == 4)
\r
388 /*----- キャッシュデータを全て削除する ----------------------------------------
\r
395 *----------------------------------------------------------------------------*/
\r
397 void DeleteCache(void)
\r
399 char Buf[FMAX_PATH+1];
\r
404 strcpy(Buf, AskTmpFilePath());
\r
406 strcat(Buf, "_ffftp.idx");
\r
410 for(i = 0; i <= TmpCacheEntry; i++)
\r
412 MakeCacheFileName(i, Buf);
\r
416 MakeCacheFileName(998, Buf);
\r
419 MakeCacheFileName(999, Buf);
\r
426 /*----- キャッシュのファイル名を作成する --------------------------------------
\r
429 * int Num : キャッシュデータ番号
\r
430 * char *Buf : ファイル名を格納するバッファ
\r
434 *----------------------------------------------------------------------------*/
\r
436 void MakeCacheFileName(int Num, char *Buf)
\r
441 strcpy(Buf, AskTmpFilePath());
\r
443 Pos = strchr(Buf, NUL);
\r
447 sprintf(Prog, ".%d", ProgNum);
\r
449 sprintf(Pos, "_ffftp.%03d%s", Num, Prog);
\r
454 /*----- 起動しているFFFTPの数を数える ------------------------------------------
\r
464 *----------------------------------------------------------------------------*/
\r
466 void CountPrevFfftpWindows(void)
\r
469 EnumWindows(CountPrevFfftpWindowsProc, 0);
\r
474 /*----- 起動しているFFFTPの数を数えるコールバック-------------------------------
\r
477 * HWND hWnd : ウインドウハンドル
\r
478 * LPARAM lParam : パラメータ
\r
482 *----------------------------------------------------------------------------*/
\r
484 static BOOL CALLBACK CountPrevFfftpWindowsProc(HWND hWnd, LPARAM lParam)
\r
486 char Buf[FMAX_PATH+1];
\r
488 if(GetClassName(hWnd, Buf, FMAX_PATH) > 0)
\r
490 if(strcmp(Buf, "FFFTPWin") == 0)
\r