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
31 #include <windows.h>
\r
36 #include <mbstring.h>
\r
38 #include <windowsx.h>
\r
39 #include <commctrl.h>
\r
44 #include "resource.h"
\r
49 static BOOL CALLBACK CountPrevFfftpWindowsProc(HWND hWnd, LPARAM lParam);
\r
53 /*===== キャッシュデータのストラクチャ =====*/
\r
56 time_t Time; /* リストに登録した時間 */
\r
57 char HostAdrs[HOST_ADRS_LEN+1]; /* ホストのアドレス */
\r
58 char UserName[USER_NAME_LEN+1]; /* ユーザ名 */
\r
59 char Path[FMAX_PATH+1]; /* パス名 */
\r
62 /*===== ローカルなワーク =====*/
\r
64 static CACHELIST *RemoteCache = NULL; /* キャッシュデータ */
\r
65 static int TmpCacheEntry = 0; /* キャッシュされているデータの数 */
\r
66 static int LastNum; /* 現在表示しているデータの番号 */
\r
67 static int ProgNum; /* FFFTPの起動番号 */
\r
70 /*----- ファイル一覧キャッシュを作成する --------------------------------------
\r
73 * int Num : キャッシュ可能個数
\r
77 * FFFTP_SUCCESS/FFFTP_FAIL
\r
78 *----------------------------------------------------------------------------*/
\r
80 int MakeCacheBuf(int Num)
\r
85 Sts = FFFTP_SUCCESS;
\r
89 if((RemoteCache = malloc(sizeof(CACHELIST) * Num)) != NULL)
\r
91 TmpCacheEntry = Num;
\r
92 for(i = 0; i < TmpCacheEntry; i++)
\r
94 Sts = FFFTP_SUCCESS;
\r
101 /*----- ファイル一覧キャッシュを削除する --------------------------------------
\r
108 *----------------------------------------------------------------------------*/
\r
110 void DeleteCacheBuf(void)
\r
112 if(RemoteCache != NULL)
\r
114 RemoteCache = NULL;
\r
120 /*----- パスがキャッシュされているかどうかを返す ------------------------------
\r
128 *----------------------------------------------------------------------------*/
\r
130 int AskCached(char *Path)
\r
137 if(TmpCacheEntry > 0)
\r
140 for(i = 0; i < TmpCacheEntry; i++)
\r
142 if((_stricmp(AskHostAdrs(), Pos->HostAdrs) == 0) &&
\r
143 (strcmp(AskHostUserName(), Pos->UserName) == 0) &&
\r
144 (strcmp(Path, Pos->Path) == 0))
\r
146 time(&(Pos->Time)); /* Refresh */
\r
148 // DoPrintf("Filelist cache found. (%d)", Ret);
\r
158 /*----- 未使用のキャッシュデータ番号を返す ------------------------------------
\r
164 * int 未使用のキャッシュデータ番号
\r
167 * 未使用の物が無い時は、一番古いものに上書きする
\r
168 *----------------------------------------------------------------------------*/
\r
170 int AskFreeCache(void)
\r
178 if(TmpCacheEntry > 0)
\r
183 for(i = 0; i < TmpCacheEntry; i++)
\r
185 if(strlen(Pos->Path) == 0)
\r
192 if((Ret == -1) || (Pos->Time < Oldest))
\r
194 Oldest = Pos->Time;
\r
201 // DoPrintf("Set filelist cache. (%d)", Ret);
\r
206 /*----- キャッシュデータをセットする ------------------------------------------
\r
209 * int Num : キャッシュデータ番号
\r
217 *----------------------------------------------------------------------------*/
\r
219 void SetCache(int Num, char *Path)
\r
221 if(TmpCacheEntry > 0)
\r
223 strcpy((RemoteCache + Num)->HostAdrs, AskHostAdrs());
\r
224 strcpy((RemoteCache + Num)->UserName, AskHostUserName());
\r
225 strcpy((RemoteCache + Num)->Path, Path);
\r
226 time(&((RemoteCache + Num)->Time));
\r
232 /*----- キャッシュデータをクリアする ------------------------------------------
\r
235 * int Num : キャッシュデータ番号
\r
239 *----------------------------------------------------------------------------*/
\r
241 void ClearCache(int Num)
\r
243 if(TmpCacheEntry > 0)
\r
245 strcpy((RemoteCache + Num)->HostAdrs, "");
\r
246 strcpy((RemoteCache + Num)->UserName, "");
\r
247 strcpy((RemoteCache + Num)->Path, "");
\r
248 (RemoteCache + Num)->Time = 0;
\r
254 /*----- 現在表示中のキャッシュデータ番号を返す --------------------------------
\r
261 *----------------------------------------------------------------------------*/
\r
263 int AskCurrentFileListNum(void)
\r
269 /*----- 現在表示中のキャッシュデータ番号をセットする --------------------------
\r
272 * int Num : キャッシュデータ番号
\r
276 *----------------------------------------------------------------------------*/
\r
278 void SetCurrentFileListNum(int Num)
\r
284 /*----- キャッシュデータを保存する --------------------------------------------
\r
293 * キャッシュデータそのものはファイルになっているので、ここではインデック
\r
296 *----------------------------------------------------------------------------*/
\r
298 void SaveCache(void)
\r
300 char Buf[FMAX_PATH+1];
\r
305 if(ProgNum == 0) /* 最初のインスタンスだけがキャッシュを保存できる */
\r
307 if(TmpCacheEntry > 0)
\r
309 strcpy(Buf, AskTmpFilePath());
\r
311 strcat(Buf, "_ffftp.idx");
\r
312 if((fd = fopen(Buf, "wt"))!=NULL)
\r
315 for(i = 0; i < TmpCacheEntry; i++)
\r
317 if(strlen(Pos->Path) != 0)
\r
318 fprintf(fd, "%s %s %s %ld\n", Pos->HostAdrs, Pos->UserName, Pos->Path, Pos->Time);
\r
328 MakeCacheFileName(998, Buf);
\r
331 MakeCacheFileName(999, Buf);
\r
338 /*----- キャッシュデータを読み込む --------------------------------------------
\r
345 *----------------------------------------------------------------------------*/
\r
347 void LoadCache(void)
\r
349 char Buf[FMAX_PATH+1];
\r
354 if(ProgNum == 0) /* 最初のインスタンスだけがキャッシュを保存できる */
\r
356 if(TmpCacheEntry > 0)
\r
358 strcpy(Buf, AskTmpFilePath());
\r
360 strcat(Buf, "_ffftp.idx");
\r
361 if((fd = fopen(Buf, "rt"))!=NULL)
\r
365 while(Num < TmpCacheEntry)
\r
367 if(fgets(Buf, FMAX_PATH, fd) == NULL)
\r
370 if(sscanf(Buf, "%s %s %s %ld\n", Pos->HostAdrs, Pos->UserName, Pos->Path, &(Pos->Time)) == 4)
\r
386 /*----- キャッシュデータを全て削除する ----------------------------------------
\r
393 *----------------------------------------------------------------------------*/
\r
395 void DeleteCache(void)
\r
397 char Buf[FMAX_PATH+1];
\r
402 strcpy(Buf, AskTmpFilePath());
\r
404 strcat(Buf, "_ffftp.idx");
\r
408 for(i = 0; i <= TmpCacheEntry; i++)
\r
410 MakeCacheFileName(i, Buf);
\r
414 MakeCacheFileName(998, Buf);
\r
417 MakeCacheFileName(999, Buf);
\r
424 /*----- キャッシュのファイル名を作成する --------------------------------------
\r
427 * int Num : キャッシュデータ番号
\r
428 * char *Buf : ファイル名を格納するバッファ
\r
432 *----------------------------------------------------------------------------*/
\r
434 void MakeCacheFileName(int Num, char *Buf)
\r
439 strcpy(Buf, AskTmpFilePath());
\r
441 Pos = strchr(Buf, NUL);
\r
445 sprintf(Prog, ".%d", ProgNum);
\r
447 sprintf(Pos, "_ffftp.%03d%s", Num, Prog);
\r
452 /*----- 起動しているFFFTPの数を数える ------------------------------------------
\r
462 *----------------------------------------------------------------------------*/
\r
464 void CountPrevFfftpWindows(void)
\r
467 EnumWindows(CountPrevFfftpWindowsProc, 0);
\r
472 /*----- 起動しているFFFTPの数を数えるコールバック-------------------------------
\r
475 * HWND hWnd : ウインドウハンドル
\r
476 * LPARAM lParam : パラメータ
\r
480 *----------------------------------------------------------------------------*/
\r
482 static BOOL CALLBACK CountPrevFfftpWindowsProc(HWND hWnd, LPARAM lParam)
\r
484 char Buf[FMAX_PATH+1];
\r
486 if(GetClassName(hWnd, Buf, FMAX_PATH) > 0)
\r
488 if(strcmp(Buf, "FFFTPWin") == 0)
\r