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 //#define _WIN32_WINNT 0x400
\r
35 #include <winsock2.h>
\r
36 #include <windows.h>
\r
42 #include <mbstring.h>
\r
44 #include <windowsx.h>
\r
45 #include <commctrl.h>
\r
46 #include <sys/types.h>
\r
47 #include <sys/stat.h>
\r
51 #include "resource.h"
\r
53 #include <htmlhelp.h>
\r
57 #include "OleDragDrop.h"
\r
61 #undef __MBSWRAPPER_H__
\r
62 #include "mbswrapper.h"
\r
64 #define BUF_SIZE 256
\r
66 #define WM_DRAGDROP (WM_APP + 100)
\r
67 #define WM_GETDATA (WM_APP + 101)
\r
68 #define WM_DRAGOVER (WM_APP + 102)
\r
71 /*===== ファイルリストのリスト用ストラクチャ =====*/
\r
74 FILELIST *Top; /* ファイルリストの先頭 */
\r
75 int Files; /* ファイルの数 */
\r
78 /*===== プロトタイプ =====*/
\r
80 static LRESULT CALLBACK LocalWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
\r
81 static LRESULT CALLBACK RemoteWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
\r
82 static LRESULT FileListCommonWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
\r
83 static void AddDispFileList(FLISTANCHOR *Anchor, char *Name, FILETIME *Time, LONGLONG Size, int Attr, int Type, int Link, char *Owner, int InfoExist, int Win);
\r
84 static void EraseDispFileList(FLISTANCHOR *Anchor);
\r
85 static void DispFileList2View(HWND hWnd, FLISTANCHOR *Anchor);
\r
87 //static void AddListView(HWND hWnd, int Pos, char *Name, int Type, LONGLONG Size, FILETIME *Time, int Attr, char *Owner, int Link, int InfoExist);
\r
88 static void AddListView(HWND hWnd, int Pos, char *Name, int Type, LONGLONG Size, FILETIME *Time, int Attr, char *Owner, int Link, int InfoExist, int ImageId);
\r
90 //static BOOL CALLBACK SelectDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);
\r
91 static INT_PTR CALLBACK SelectDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);
\r
92 static int GetImageIndex(int Win, int Pos);
\r
93 static void DispListList(FILELIST *Pos, char *Title);
\r
95 //static void MakeRemoteTree1(char *Path, char *Cur, FILELIST **Base, int *CancelCheckWork);
\r
96 //static void MakeRemoteTree2(char *Path, char *Cur, FILELIST **Base, int *CancelCheckWork);
\r
97 static int MakeRemoteTree1(char *Path, char *Cur, FILELIST **Base, int *CancelCheckWork);
\r
98 static int MakeRemoteTree2(char *Path, char *Cur, FILELIST **Base, int *CancelCheckWork);
\r
99 static void CopyTmpListToFileList(FILELIST **Base, FILELIST *List);
\r
101 //static int GetListOneLine(char *Buf, int Max, FILE *Fd);
\r
102 static int GetListOneLine(char *Buf, int Max, FILE *Fd, int Convert);
\r
103 static int MakeDirPath(char *Str, int ListType, char *Path, char *Dir);
\r
105 //static void MakeLocalTree(char *Path, FILELIST **Base);
\r
106 static int MakeLocalTree(char *Path, FILELIST **Base);
\r
107 static void AddFileList(FILELIST *Pkt, FILELIST **Base);
\r
108 static int AnalyzeFileInfo(char *Str);
\r
109 static int CheckUnixType(char *Str, char *Tmp, int Add1, int Add2, int Day);
\r
110 static int CheckHHMMformat(char *Str);
\r
111 static int CheckYYMMDDformat(char *Str, char Sym, int Dig3);
\r
112 static int CheckYYYYMMDDformat(char *Str, char Sym);
\r
113 // Windows Server 2008 R2
\r
114 static int CheckMMDDYYYYformat(char *Str, char Sym);
\r
115 static int ResolveFileInfo(char *Str, int ListType, char *Fname, LONGLONG *Size, FILETIME *Time, int *Attr, char *Owner, int *Link, int *InfoExist);
\r
116 static int FindField(char *Str, char *Buf, int Num, int ToLast);
\r
118 static int FindField2(char *Str, char *Buf, char Separator, int Num, int ToLast);
\r
119 static void GetMonth(char *Str, WORD *Month, WORD *Day);
\r
120 static int GetYearMonthDay(char *Str, WORD *Year, WORD *Month, WORD *Day);
\r
121 static int GetHourAndMinute(char *Str, WORD *Hour, WORD *Minute);
\r
122 static int GetVMSdate(char *Str, WORD *Year, WORD *Month, WORD *Day);
\r
123 static int CheckSpecialDirName(char *Fname);
\r
124 static int AskFilterStr(char *Fname, int Type);
\r
126 //static BOOL CALLBACK FilterWndProc(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);
\r
127 static INT_PTR CALLBACK FilterWndProc(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);
\r
128 static int atoi_n(const char *Str, int Len);
\r
130 /*===== 外部参照 =====*/
\r
132 extern int SepaWidth;
\r
133 extern int RemoteWidth;
\r
134 extern int ListHeight;
\r
135 extern char FilterStr[FILTER_EXT_LEN+1];
\r
136 extern HWND hHelpWin;
\r
137 // 外部アプリケーションへドロップ後にローカル側のファイル一覧に作業フォルダが表示されるバグ対策
\r
138 extern int SuppressRefresh;
\r
140 extern HANDLE ChangeNotification;
\r
141 // 特定の操作を行うと異常終了するバグ修正
\r
142 extern int CancelFlg;
\r
145 extern int LocalWidth;
\r
146 extern int LocalTabWidth[4];
\r
147 extern int RemoteTabWidth[6];
\r
148 extern char UserMailAdrs[USER_MAIL_LEN+1];
\r
149 extern HFONT ListFont;
\r
150 extern int ListType;
\r
151 extern int FindMode;
\r
152 extern int DotFile;
\r
153 extern int DispIgnoreHide;
\r
154 extern int DispDrives;
\r
155 extern int MoveMode;
\r
157 extern int DispFileIcon;
\r
159 extern int DispTimeSeconds;
\r
161 extern int DispPermissionsNumber;
\r
163 /*===== ローカルなワーク =====*/
\r
165 static HWND hWndListLocal = NULL;
\r
166 static HWND hWndListRemote = NULL;
\r
168 static WNDPROC LocalProcPtr;
\r
169 static WNDPROC RemoteProcPtr;
\r
171 static HIMAGELIST ListImg = NULL;
\r
173 static HIMAGELIST ListImgFileIcon = NULL;
\r
175 static char FindStr[40+1] = { "*" }; /* 検索文字列 */
\r
176 static int IgnoreNew = NO;
\r
177 static int IgnoreOld = NO;
\r
178 static int IgnoreExist = NO;
\r
180 static int Dragging = NO;
\r
181 // 特定の操作を行うと異常終了するバグ修正
\r
182 static POINT DropPoint;
\r
184 static int StratusMode; /* 0=ファイル, 1=ディレクトリ, 2=リンク */
\r
187 // リモートファイルリスト (2007.9.3 yutaka)
\r
188 static FILELIST *remoteFileListBase;
\r
189 static FILELIST *remoteFileListBaseNoExpand;
\r
190 static char remoteFileDir[FMAX_PATH + 1];
\r
193 /*----- ファイルリストウインドウを作成する ------------------------------------
\r
196 * HWND hWnd : 親ウインドウのウインドウハンドル
\r
197 * HINSTANCE hInst : インスタンスハンドル
\r
201 * FFFTP_SUCCESS/FFFTP_FAIL
\r
202 *----------------------------------------------------------------------------*/
\r
204 int MakeListWin(HWND hWnd, HINSTANCE hInst)
\r
211 memset(&LvCol, 0, sizeof(LV_COLUMN));
\r
213 /*===== ローカル側のリストビュー =====*/
\r
216 // hWndListLocal = CreateWindowEx(/*WS_EX_STATICEDGE*/WS_EX_CLIENTEDGE,
\r
217 // WC_LISTVIEWA, NULL,
\r
218 // WS_CHILD | /*WS_BORDER | */LVS_REPORT | LVS_SHOWSELALWAYS,
\r
219 // 0, TOOLWIN_HEIGHT*2, LocalWidth, ListHeight,
\r
220 // GetMainHwnd(), (HMENU)1500, hInst, NULL);
\r
221 hWndListLocal = CreateWindowEx(/*WS_EX_STATICEDGE*/WS_EX_CLIENTEDGE,
\r
222 WC_LISTVIEWA, NULL,
\r
223 WS_CHILD | /*WS_BORDER | */LVS_REPORT | LVS_SHOWSELALWAYS,
\r
224 0, AskToolWinHeight()*2, LocalWidth, ListHeight,
\r
225 GetMainHwnd(), (HMENU)1500, hInst, NULL);
\r
227 if(hWndListLocal != NULL)
\r
230 // LocalProcPtr = (WNDPROC)SetWindowLong(hWndListLocal, GWL_WNDPROC, (LONG)LocalWndProc);
\r
231 LocalProcPtr = (WNDPROC)SetWindowLongPtr(hWndListLocal, GWLP_WNDPROC, (LONG_PTR)LocalWndProc);
\r
233 Tmp = SendMessage(hWndListLocal, LVM_GETEXTENDEDLISTVIEWSTYLE, 0, 0);
\r
234 Tmp |= LVS_EX_FULLROWSELECT;
\r
235 SendMessage(hWndListLocal, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, (LPARAM)Tmp);
\r
237 if(ListFont != NULL)
\r
238 SendMessage(hWndListLocal, WM_SETFONT, (WPARAM)ListFont, MAKELPARAM(TRUE, 0));
\r
240 ListImg = ImageList_LoadBitmap(hInst, MAKEINTRESOURCE(dirattr_bmp), 16, 9, RGB(255,0,0));
\r
241 SendMessage(hWndListLocal, LVM_SETIMAGELIST, LVSIL_SMALL, (LPARAM)ListImg);
\r
242 ShowWindow(hWndListLocal, SW_SHOW);
\r
244 LvCol.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM;
\r
245 LvCol.cx = LocalTabWidth[0];
\r
246 LvCol.pszText = MSGJPN038;
\r
247 LvCol.iSubItem = 0;
\r
248 SendMessage(hWndListLocal, LVM_INSERTCOLUMN, 0, (LPARAM)&LvCol);
\r
250 LvCol.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM;
\r
251 LvCol.cx = LocalTabWidth[1];
\r
252 LvCol.pszText = MSGJPN039;
\r
253 LvCol.iSubItem = 1;
\r
254 SendMessage(hWndListLocal, LVM_INSERTCOLUMN, 1, (LPARAM)&LvCol);
\r
256 LvCol.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM | LVCF_FMT;
\r
257 LvCol.fmt = LVCFMT_RIGHT;
\r
258 LvCol.cx = LocalTabWidth[2];
\r
259 LvCol.pszText = MSGJPN040;
\r
260 LvCol.iSubItem = 2;
\r
261 SendMessage(hWndListLocal, LVM_INSERTCOLUMN, 2, (LPARAM)&LvCol);
\r
263 LvCol.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM;
\r
264 LvCol.cx = LocalTabWidth[3];
\r
265 LvCol.pszText = MSGJPN041;
\r
266 LvCol.iSubItem = 3;
\r
267 SendMessage(hWndListLocal, LVM_INSERTCOLUMN, 3, (LPARAM)&LvCol);
\r
270 /*===== ホスト側のリストビュー =====*/
\r
273 // hWndListRemote = CreateWindowEx(/*WS_EX_STATICEDGE*/WS_EX_CLIENTEDGE,
\r
274 // WC_LISTVIEWA, NULL,
\r
275 // WS_CHILD | /*WS_BORDER | */LVS_REPORT | LVS_SHOWSELALWAYS,
\r
276 // LocalWidth + SepaWidth, TOOLWIN_HEIGHT*2, RemoteWidth, ListHeight,
\r
277 // GetMainHwnd(), (HMENU)1500, hInst, NULL);
\r
278 hWndListRemote = CreateWindowEx(/*WS_EX_STATICEDGE*/WS_EX_CLIENTEDGE,
\r
279 WC_LISTVIEWA, NULL,
\r
280 WS_CHILD | /*WS_BORDER | */LVS_REPORT | LVS_SHOWSELALWAYS,
\r
281 LocalWidth + SepaWidth, AskToolWinHeight()*2, RemoteWidth, ListHeight,
\r
282 GetMainHwnd(), (HMENU)1500, hInst, NULL);
\r
284 if(hWndListRemote != NULL)
\r
287 // RemoteProcPtr = (WNDPROC)SetWindowLong(hWndListRemote, GWL_WNDPROC, (LONG)RemoteWndProc);
\r
288 RemoteProcPtr = (WNDPROC)SetWindowLongPtr(hWndListRemote, GWLP_WNDPROC, (LONG_PTR)RemoteWndProc);
\r
290 Tmp = SendMessage(hWndListRemote, LVM_GETEXTENDEDLISTVIEWSTYLE, 0, 0);
\r
291 Tmp |= LVS_EX_FULLROWSELECT;
\r
292 SendMessage(hWndListRemote, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, (LPARAM)Tmp);
\r
294 if(ListFont != NULL)
\r
295 SendMessage(hWndListRemote, WM_SETFONT, (WPARAM)ListFont, MAKELPARAM(TRUE, 0));
\r
297 SendMessage(hWndListRemote, LVM_SETIMAGELIST, LVSIL_SMALL, (LPARAM)ListImg);
\r
298 ShowWindow(hWndListRemote, SW_SHOW);
\r
300 LvCol.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM;
\r
301 LvCol.cx = RemoteTabWidth[0];
\r
302 LvCol.pszText = MSGJPN042;
\r
303 LvCol.iSubItem = 0;
\r
304 SendMessage(hWndListRemote, LVM_INSERTCOLUMN, 0, (LPARAM)&LvCol);
\r
306 LvCol.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM;
\r
307 LvCol.cx = RemoteTabWidth[1];
\r
308 LvCol.pszText = MSGJPN043;
\r
309 LvCol.iSubItem = 1;
\r
310 SendMessage(hWndListRemote, LVM_INSERTCOLUMN, 1, (LPARAM)&LvCol);
\r
312 LvCol.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM | LVCF_FMT;
\r
313 LvCol.fmt = LVCFMT_RIGHT;
\r
314 LvCol.cx = RemoteTabWidth[2];
\r
315 LvCol.pszText = MSGJPN044;
\r
316 LvCol.iSubItem = 2;
\r
317 SendMessage(hWndListRemote, LVM_INSERTCOLUMN, 2, (LPARAM)&LvCol);
\r
319 LvCol.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM;
\r
320 LvCol.cx = RemoteTabWidth[3];
\r
321 LvCol.pszText = MSGJPN045;
\r
322 LvCol.iSubItem = 3;
\r
323 SendMessage(hWndListRemote, LVM_INSERTCOLUMN, 3, (LPARAM)&LvCol);
\r
325 LvCol.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM;
\r
326 LvCol.cx = RemoteTabWidth[4];
\r
327 LvCol.pszText = MSGJPN046;
\r
328 LvCol.iSubItem = 4;
\r
329 SendMessage(hWndListRemote, LVM_INSERTCOLUMN, 4, (LPARAM)&LvCol);
\r
331 LvCol.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM;
\r
332 LvCol.cx = RemoteTabWidth[5];
\r
333 LvCol.pszText = MSGJPN047;
\r
334 LvCol.iSubItem = 5;
\r
335 SendMessage(hWndListRemote, LVM_INSERTCOLUMN, 5, (LPARAM)&LvCol);
\r
338 Sts = FFFTP_SUCCESS;
\r
339 if((hWndListLocal == NULL) ||
\r
340 (hWndListRemote == NULL))
\r
348 /*----- ファイルリストウインドウを削除 ----------------------------------------
\r
355 *----------------------------------------------------------------------------*/
\r
357 void DeleteListWin(void)
\r
359 // if(ListImg != NULL)
\r
360 // ImageList_Destroy(ListImg);
\r
361 if(hWndListLocal != NULL)
\r
362 DestroyWindow(hWndListLocal);
\r
363 if(hWndListRemote != NULL)
\r
364 DestroyWindow(hWndListRemote);
\r
369 /*----- ローカル側のファイルリストのウインドウハンドルを返す ------------------
\r
376 *----------------------------------------------------------------------------*/
\r
378 HWND GetLocalHwnd(void)
\r
380 return(hWndListLocal);
\r
384 /*----- ホスト側のファイルリストのウインドウハンドルを返す --------------------
\r
391 *----------------------------------------------------------------------------*/
\r
393 HWND GetRemoteHwnd(void)
\r
395 return(hWndListRemote);
\r
399 /*----- ローカル側のファイルリストウインドウのメッセージ処理 ------------------
\r
402 * HWND hWnd : ウインドウハンドル
\r
403 * UINT message : メッセージ番号
\r
404 * WPARAM wParam : メッセージの WPARAM 引数
\r
405 * LPARAM lParam : メッセージの LPARAM 引数
\r
409 *----------------------------------------------------------------------------*/
\r
411 static LRESULT CALLBACK LocalWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
\r
413 return(FileListCommonWndProc(hWnd, message, wParam, lParam));
\r
417 /*----- ホスト側のファイルリストウインドウのメッセージ処理 --------------------
\r
420 * HWND hWnd : ウインドウハンドル
\r
421 * UINT message : メッセージ番号
\r
422 * WPARAM wParam : メッセージの WPARAM 引数
\r
423 * LPARAM lParam : メッセージの LPARAM 引数
\r
427 *----------------------------------------------------------------------------*/
\r
429 static LRESULT CALLBACK RemoteWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
\r
431 return(FileListCommonWndProc(hWnd, message, wParam, lParam));
\r
436 static BOOL CALLBACK doOleDlgProc(HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
\r
438 #define TIMER_ID (100) // 作成するタイマの識別ID
\r
439 #define TIMER_ELAPSE (100) // WM_TIMERの発生間隔
\r
443 case WM_INITDIALOG: // ダイアログボックスが作成されたとき
\r
444 SetTimer( hDlg, TIMER_ID, 0, NULL);
\r
448 ShowWindow(hDlg, SW_HIDE); // ダイアログは隠す
\r
450 if (wp != TIMER_ID)
\r
453 if (PeekMessage(&message, NULL, 0, 0, PM_REMOVE)) {
\r
454 TranslateMessage(&message);
\r
455 DispatchMessage(&message);
\r
458 if (AskTransferNow() == NO) {
\r
459 EndDialog( hDlg, 0 );
\r
464 SetTimer( hDlg, TIMER_ID, TIMER_ELAPSE, NULL );
\r
467 case WM_COMMAND: // ダイアログボックス内の何かが選択されたとき
\r
468 switch( LOWORD( wp ) ){
\r
469 // case IDOK: // 「OK」ボタンが選択された
\r
470 case IDCANCEL: // 「キャンセル」ボタンが選択された
\r
472 EndDialog( hDlg, 0 );
\r
478 return FALSE; // DefWindowProc()ではなく、FALSEを返すこと!
\r
480 #undef TIMER_ELAPSE
\r
484 static void doTransferRemoteFile(void)
\r
486 FILELIST *FileListBase, *FileListBaseNoExpand, *pf;
\r
487 // 特定の操作を行うと異常終了するバグ修正
\r
488 // int CancelFlg = NO;
\r
489 char LocDir[FMAX_PATH+1];
\r
490 char TmpDir[FMAX_PATH+1];
\r
497 // すでにリモートから転送済みなら何もしない。(2007.9.3 yutaka)
\r
498 if (remoteFileListBase != NULL)
\r
501 // 特定の操作を行うと異常終了するバグ修正
\r
505 if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
\r
507 TranslateMessage(&msg);
\r
508 DispatchMessage(&msg);
\r
510 else if(AskTransferNow() == NO)
\r
515 FileListBase = NULL;
\r
516 MakeSelectedFileList(WIN_REMOTE, YES, NO, &FileListBase, &CancelFlg);
\r
517 FileListBaseNoExpand = NULL;
\r
518 MakeSelectedFileList(WIN_REMOTE, NO, NO, &FileListBaseNoExpand, &CancelFlg);
\r
520 // set temporary folder
\r
521 AskLocalCurDir(LocDir, FMAX_PATH);
\r
523 // アプリを多重起動してもコンフリクトしないように、テンポラリフォルダ名にプロセスID
\r
524 // を付加する。(2007.9.13 yutaka)
\r
526 // GetTempPath(sizeof(TmpDir), TmpDir);
\r
527 // pid = GetCurrentProcessId();
\r
528 // _snprintf_s(buf, sizeof(buf), _TRUNCATE, "ffftp%d", pid);
\r
529 // strncat_s(TmpDir, sizeof(TmpDir), buf, _TRUNCATE);
\r
530 GetAppTempPath(TmpDir);
\r
532 SetYenTail(TmpDir);
\r
533 strcat(TmpDir, "file");
\r
536 if (TmpDir[strlen(TmpDir) - 1] == '\\') {
\r
537 TmpDir[strlen(TmpDir) - 1] = '\0';
\r
542 for (pf = FileListBase ; pf ; pf = pf->Next) {
\r
543 char fn[FMAX_PATH+1];
\r
545 strncpy_s(fn, sizeof(fn), TmpDir, _TRUNCATE);
\r
546 strncat_s(fn, sizeof(fn), "\\", _TRUNCATE);
\r
547 strncat_s(fn, sizeof(fn), pf->File, _TRUNCATE);
\r
552 // 外部アプリケーションへドロップ後にローカル側のファイル一覧に作業フォルダが表示されるバグ対策
\r
553 SuppressRefresh = 1;
\r
555 // ダウンロード先をテンポラリに設定
\r
556 SetLocalDirHist(TmpDir);
\r
558 // FFFTPにダウンロード要求を出し、ダウンロードの完了を待つ。
\r
559 PostMessage(GetMainHwnd(), WM_COMMAND, MAKEWPARAM(MENU_DOWNLOAD, 0), 0);
\r
561 // 特定の操作を行うと異常終了するバグ修正
\r
562 // for (i = 0 ; i < 10 ; i++) {
\r
567 if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
\r
568 TranslateMessage(&msg);
\r
569 DispatchMessage(&msg);
\r
572 // 転送スレッドが動き出したら抜ける。
\r
573 if (AskTransferNow() == YES)
\r
580 // OLE D&D中にメインウィンドウをユーザに操作させると、おかしくなるので、
\r
582 // (2007.9.11 yutaka)
\r
583 // 特定の操作を行うと異常終了するバグ修正
\r
584 // DialogBox(GetFtpInst(), MAKEINTRESOURCE(IDD_OLEDRAG), GetMainHwnd(), (DLGPROC)doOleDlgProc);
\r
588 if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
\r
590 TranslateMessage(&msg);
\r
591 DispatchMessage(&msg);
\r
593 else if(AskTransferNow() == NO)
\r
599 SetLocalDirHist(LocDir);
\r
600 SetCurrentDirAsDirHist();
\r
602 // 外部アプリケーションへドロップ後にローカル側のファイル一覧に作業フォルダが表示されるバグ対策
\r
603 SuppressRefresh = 0;
\r
604 GetLocalDirForWnd();
\r
606 remoteFileListBase = FileListBase; // あとでフリーすること
\r
607 remoteFileListBaseNoExpand = FileListBaseNoExpand; // あとでフリーすること
\r
608 strncpy_s(remoteFileDir, sizeof(remoteFileDir), TmpDir, _TRUNCATE);
\r
611 // add temporary list
\r
612 if (remoteFileListBase != NULL) {
\r
613 FILELIST *pf = remoteFileListBase;
\r
614 char fn[FMAX_PATH + 1];
\r
616 strncpy_s(fn, sizeof(fn), remoteFileDir, _TRUNCATE);
\r
617 strncat_s(fn, sizeof(fn), "\\", _TRUNCATE);
\r
618 strncat_s(fn, sizeof(fn), pf->File, _TRUNCATE);
\r
619 AddTempFileList(fn);
\r
627 int isDirectory(char *fn)
\r
631 if (_stat(fn, &buf) == 0) {
\r
632 if (buf.st_mode & _S_IFDIR) { // is directory
\r
639 // テンポラリのファイルおよびフォルダを削除する。
\r
640 void doDeleteRemoteFile(void)
\r
642 if (remoteFileListBase != NULL) {
\r
646 FILELIST *pf = remoteFileListBase;
\r
647 char fn[FMAX_PATH + 1];
\r
649 strncpy_s(fn, sizeof(fn), remoteFileDir, _TRUNCATE);
\r
650 strncat_s(fn, sizeof(fn), "\\", _TRUNCATE);
\r
651 strncat_s(fn, sizeof(fn), pf->File, _TRUNCATE);
\r
652 if (isDirectory(fn)) {
\r
661 for (i = 0 ; i < 1000 ; i++) {
\r
662 pf = remoteFileListBase;
\r
664 strncpy_s(fn, sizeof(fn), remoteFileDir, _TRUNCATE);
\r
665 strncat_s(fn, sizeof(fn), "\\", _TRUNCATE);
\r
666 strncat_s(fn, sizeof(fn), pf->File, _TRUNCATE);
\r
667 if (isDirectory(fn)) {
\r
668 if (_rmdir(fn) == 0) { // ディレクトリを消せたらカウントアップ
\r
670 if (count >= dirs) // すべて消せたら終わり
\r
678 _rmdir(remoteFileDir); // 自分で作ったディレクトリも消す
\r
680 SHFILEOPSTRUCT FileOp = { NULL, FO_DELETE, remoteFileDir, NULL,
\r
681 FOF_SILENT | FOF_NOCONFIRMATION | FOF_NOERRORUI,
\r
682 FALSE, NULL, NULL };
\r
683 SHFileOperation(&FileOp);
\r
686 DeleteFileList(&remoteFileListBase);
\r
687 remoteFileListBase = NULL;
\r
690 if (remoteFileListBaseNoExpand != NULL) {
\r
691 DeleteFileList(&remoteFileListBaseNoExpand);
\r
692 remoteFileListBaseNoExpand = NULL;
\r
698 // cf. http://www.nakka.com/lib/
\r
700 static HDROP APIPRIVATE CreateDropFileMem(char **FileName,int cnt,BOOL fWide)
\r
703 LPDROPFILES lpDropFile;
\r
704 wchar_t wbuf[BUF_SIZE];
\r
710 for(i = 0;i < cnt;i++){
\r
712 // MultiByteToWideChar(CP_ACP,0,FileName[i],-1,wbuf,BUF_SIZE);
\r
713 // flen += (wcslen(wbuf) + 1) * sizeof(wchar_t);
\r
714 flen += sizeof(wchar_t) * MtoW(NULL, 0, FileName[i], -1);
\r
719 for(i = 0;i < cnt;i++){
\r
721 // flen += lstrlen(FileName[i]) + 1;
\r
722 MtoW(wbuf, BUF_SIZE, FileName[i], -1);
\r
723 flen += sizeof(char) * WtoA(NULL, 0, wbuf, -1);
\r
727 hDrop = (HDROP)GlobalAlloc(GHND,sizeof(DROPFILES) + flen + 1);
\r
728 if (hDrop == NULL){
\r
732 lpDropFile = (LPDROPFILES) GlobalLock(hDrop);
\r
733 lpDropFile->pFiles = sizeof(DROPFILES); /* ファイル名のリストまでのオフセット */
\r
734 lpDropFile->pt.x = 0;
\r
735 lpDropFile->pt.y = 0;
\r
736 lpDropFile->fNC = FALSE;
\r
737 lpDropFile->fWide = fWide; /* ワイドキャラの場合は TRUE */
\r
739 /* 構造体の後ろにファイル名のリストをコピーする。(ファイル名\0ファイル名\0ファイル名\0\0) */
\r
744 buf = (wchar_t *)(&lpDropFile[1]);
\r
745 for(i = 0;i < cnt;i++){
\r
747 // MultiByteToWideChar(CP_ACP,0,FileName[i],-1,wbuf,BUF_SIZE);
\r
748 // wcscpy(buf,wbuf);
\r
749 // buf += wcslen(wbuf) + 1;
\r
750 buf += MtoW(buf, BUF_SIZE, FileName[i], -1);
\r
756 buf = (char *)(&lpDropFile[1]);
\r
757 for(i = 0;i < cnt;i++){
\r
759 // lstrcpy(buf,FileName[i]);
\r
760 // buf += lstrlen(FileName[i]) + 1;
\r
761 MtoW(wbuf, BUF_SIZE, FileName[i], -1);
\r
762 buf += WtoA(buf, BUF_SIZE, wbuf, -1);
\r
766 GlobalUnlock(hDrop);
\r
772 // (2007.8.30 yutaka)
\r
773 static void doDragDrop(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
\r
779 // テンポラリをきれいにする (2007.9.3 yutaka)
\r
780 doDeleteRemoteFile();
\r
784 cf[1] = CF_HDROP; /* ファイル */
\r
785 if((ret = OLE_IDropSource_Start(hWnd,WM_GETDATA, WM_DRAGOVER, cf,1,DROPEFFECT_COPY | DROPEFFECT_MOVE | DROPEFFECT_LINK)) == DROPEFFECT_MOVE){
\r
788 // ドロップ先のアプリに WM_LBUTTONUP を飛ばす。
\r
789 // 特定の操作を行うと異常終了するバグ修正
\r
790 // GetCursorPos(&pt);
\r
792 ScreenToClient(hWnd, &pt);
\r
793 PostMessage(hWnd,WM_LBUTTONUP,0,MAKELPARAM(pt.x,pt.y));
\r
794 // ドロップ先が他プロセスかつカーソルが自プロセスのドロップ可能なウィンドウ上にある場合の対策
\r
795 EnableWindow(GetMainHwnd(), TRUE);
\r
800 /*----- ファイル一覧ウインドウの共通メッセージ処理 ----------------------------
\r
803 * HWND hWnd : ウインドウハンドル
\r
804 * UINT message : メッセージ番号
\r
805 * WPARAM wParam : メッセージの WPARAM 引数
\r
806 * LPARAM lParam : メッセージの LPARAM 引数
\r
810 *----------------------------------------------------------------------------*/
\r
812 static LRESULT FileListCommonWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
\r
817 static HCURSOR hCsrDrg;
\r
818 static HCURSOR hCsrNoDrg;
\r
819 static POINT DragPoint;
\r
820 static HWND hWndDragStart;
\r
821 static int RemoteDropFileIndex = -1;
\r
826 // 特定の操作を行うと異常終了するバグ修正
\r
827 static int DragFirstTime = NO;
\r
830 hWndDst = hWndListRemote;
\r
831 ProcPtr = LocalProcPtr;
\r
832 hWndHistEdit = GetLocalHistEditHwnd();
\r
833 if(hWnd == hWndListRemote)
\r
836 hWndDst = hWndListLocal;
\r
837 ProcPtr = RemoteProcPtr;
\r
838 hWndHistEdit = GetRemoteHistEditHwnd();
\r
843 case WM_SYSKEYDOWN:
\r
844 if (wParam == 'D') { // Alt+D
\r
845 SetFocus(hWndHistEdit);
\r
848 EraseListViewTips();
\r
849 return(CallWindowProc(ProcPtr, hWnd, message, wParam, lParam));
\r
857 EraseListViewTips();
\r
858 return(CallWindowProc(ProcPtr, hWnd, message, wParam, lParam));
\r
861 SetFocusHwnd(hWnd);
\r
862 MakeButtonsFocus();
\r
863 DispCurrentWindow(Win);
\r
864 DispSelectedSpace();
\r
865 return(CallWindowProc(ProcPtr, hWnd, message, wParam, lParam));
\r
867 case WM_KILLFOCUS :
\r
868 EraseListViewTips();
\r
869 MakeButtonsFocus();
\r
870 DispCurrentWindow(-1);
\r
871 return(CallWindowProc(ProcPtr, hWnd, message, wParam, lParam));
\r
873 case WM_DROPFILES :
\r
875 if(AskUserOpeDisabled() == YES)
\r
877 // ドラッグ中は処理しない。ドラッグ後にWM_LBUTTONDOWNが飛んでくるため、そこで処理する。
\r
878 if (Dragging == YES)
\r
881 if(hWnd == hWndListRemote)
\r
883 if(AskConnecting() == YES)
\r
884 UploadDragProc(wParam);
\r
886 else if(hWnd == hWndListLocal)
\r
888 ChangeDirDropFileProc(wParam);
\r
892 case WM_LBUTTONDOWN :
\r
893 // 特定の操作を行うと異常終了するバグ修正
\r
894 if(AskUserOpeDisabled() == YES)
\r
896 if(Dragging == YES)
\r
898 DragFirstTime = NO;
\r
899 GetCursorPos(&DropPoint);
\r
900 EraseListViewTips();
\r
902 DragPoint.x = LOWORD(lParam);
\r
903 DragPoint.y = HIWORD(lParam);
\r
904 hWndDragStart = hWnd;
\r
905 return(CallWindowProc(ProcPtr, hWnd, message, wParam, lParam));
\r
908 case WM_LBUTTONUP :
\r
909 // 特定の操作を行うと異常終了するバグ修正
\r
910 if(AskUserOpeDisabled() == YES)
\r
912 if(Dragging == YES)
\r
916 hCsrDrg = LoadCursor(NULL, IDC_ARROW);
\r
917 SetCursor(hCsrDrg);
\r
919 Point.x = (long)(short)LOWORD(lParam);
\r
920 Point.y = (long)(short)HIWORD(lParam);
\r
921 ClientToScreen(hWnd, &Point);
\r
922 hWndPnt = WindowFromPoint(Point);
\r
923 if(hWndPnt == hWndDst) // local <-> remote
\r
925 if(hWndPnt == hWndListRemote) {
\r
926 PostMessage(GetMainHwnd(), WM_COMMAND, MAKEWPARAM(MENU_UPLOAD, 0), 0);
\r
927 } else if(hWndPnt == hWndListLocal) {
\r
928 PostMessage(GetMainHwnd(), WM_COMMAND, MAKEWPARAM(MENU_DOWNLOAD, 0), 0);
\r
930 } else { // 同一ウィンドウ内の場合 (yutaka)
\r
931 if (hWndDragStart == hWndListRemote && hWndPnt == hWndListRemote) {
\r
932 // remote <-> remoteの場合は、サーバでのファイルの移動を行う。(2007.9.5 yutaka)
\r
933 if (RemoteDropFileIndex != -1) {
\r
934 ListView_SetItemState(hWnd, RemoteDropFileIndex, 0, LVIS_DROPHILITED);
\r
935 MoveRemoteFileProc(RemoteDropFileIndex);
\r
942 return(CallWindowProc(ProcPtr, hWnd, message, wParam, lParam));
\r
945 // OLE D&Dを開始する (yutaka)
\r
946 // 特定の操作を行うと異常終了するバグ修正
\r
947 // doDragDrop(hWnd, message, wParam, lParam);
\r
948 if(DragFirstTime == NO)
\r
949 doDragDrop(hWnd, message, wParam, lParam);
\r
950 DragFirstTime = YES;
\r
954 case WM_GETDATA: // ファイルのパスをD&D先のアプリへ返す (yutaka)
\r
957 case CF_HDROP: /* ファイル */
\r
959 OSVERSIONINFO os_info;
\r
960 BOOL NTFlag = FALSE;
\r
961 char **FileNameList;
\r
963 int i, j, filenum = 0;
\r
965 FILELIST *FileListBase, *FileListBaseNoExpand, *pf;
\r
966 // 特定の操作を行うと異常終了するバグ修正
\r
967 // int CancelFlg = NO;
\r
968 char LocDir[FMAX_PATH+1];
\r
971 // 特定の操作を行うと異常終了するバグ修正
\r
972 GetCursorPos(&DropPoint);
\r
973 hWndPnt = WindowFromPoint(DropPoint);
\r
974 hWndParent = GetParent(hWndPnt);
\r
979 FileListBaseNoExpand = NULL;
\r
980 // ローカル側で選ばれているファイルをFileListBaseに登録
\r
981 if (hWndDragStart == hWndListLocal) {
\r
982 AskLocalCurDir(LocDir, FMAX_PATH);
\r
985 FileListBase = NULL;
\r
986 // ローカル側からアプリケーションにD&Dできないバグ修正
\r
987 // MakeSelectedFileList(WIN_LOCAL, YES, NO, &FileListBase, &CancelFlg);
\r
988 if(hWndPnt != hWndListRemote && hWndPnt != hWndListLocal && hWndParent != hWndListRemote && hWndParent != hWndListLocal)
\r
989 MakeSelectedFileList(WIN_LOCAL, NO, NO, &FileListBase, &CancelFlg);
\r
990 FileListBaseNoExpand = FileListBase;
\r
992 } else if (hWndDragStart == hWndListRemote) {
\r
993 // 特定の操作を行うと異常終了するバグ修正
\r
994 // GetCursorPos(&Point);
\r
995 // hWndPnt = WindowFromPoint(Point);
\r
996 // hWndParent = GetParent(hWndPnt);
\r
997 if (hWndPnt == hWndListRemote || hWndPnt == hWndListLocal ||
\r
998 hWndParent == hWndListRemote || hWndParent == hWndListLocal) {
\r
999 FileListBase = NULL;
\r
1002 // 選択されているリモートファイルのリストアップ
\r
1003 // このタイミングでリモートからローカルの一時フォルダへダウンロードする
\r
1004 // (2007.8.31 yutaka)
\r
1005 doTransferRemoteFile();
\r
1006 PathDir = remoteFileDir;
\r
1007 FileListBase = remoteFileListBase;
\r
1008 FileListBaseNoExpand = remoteFileListBaseNoExpand;
\r
1013 #if defined(HAVE_TANDEM)
\r
1014 if(FileListBaseNoExpand == NULL)
\r
1015 pf = FileListBase;
\r
1018 pf = FileListBaseNoExpand;
\r
1019 // 特定の操作を行うと異常終了するバグ修正
\r
1024 hCsrDrg = LoadCursor(NULL, IDC_ARROW);
\r
1025 SetCursor(hCsrDrg);
\r
1026 // ドロップ先が他プロセスかつカーソルが自プロセスのドロップ可能なウィンドウ上にある場合の対策
\r
1027 EnableWindow(GetMainHwnd(), FALSE);
\r
1030 // ドロップ先が他プロセスかつカーソルが自プロセスのドロップ可能なウィンドウ上にある場合の対策
\r
1032 EnableWindow(GetMainHwnd(), FALSE);
\r
1033 for (filenum = 0; pf ; filenum++) {
\r
1036 // ファイルが未選択の場合は何もしない。(yutaka)
\r
1037 if (filenum <= 0) {
\r
1038 *((HANDLE *)lParam) = NULL;
\r
1042 /* ファイル名の配列を作成する */
\r
1043 FileNameList = (char **)GlobalAlloc(GPTR,sizeof(char *) * filenum);
\r
1044 if(FileNameList == NULL){
\r
1047 pf = FileListBaseNoExpand;
\r
1048 for (j = 0; pf ; j++) {
\r
1049 filelen = strlen(PathDir) + 1 + strlen(pf->File) + 1;
\r
1050 FileNameList[j] = (char *)GlobalAlloc(GPTR, filelen);
\r
1051 strncpy_s(FileNameList[j], filelen, PathDir, _TRUNCATE);
\r
1052 strncat_s(FileNameList[j], filelen, "\\", _TRUNCATE);
\r
1053 strncat_s(FileNameList[j], filelen, pf->File, _TRUNCATE);
\r
1056 if (FileListBase->Node == NODE_DIR) {
\r
1057 // フォルダを掴んだ場合はそれ以降展開しない
\r
1064 os_info.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
\r
1065 GetVersionEx(&os_info);
\r
1066 if(os_info.dwPlatformId == VER_PLATFORM_WIN32_NT){
\r
1070 /* ドロップファイルリストの作成 */
\r
1071 /* NTの場合はUNICODEになるようにする */
\r
1072 *((HANDLE *)lParam) = CreateDropFileMem(FileNameList, filenum, NTFlag);
\r
1074 /* ファイル名の配列を解放する */
\r
1075 for (i = 0; i < filenum ; i++) {
\r
1076 GlobalFree(FileNameList[i]);
\r
1078 GlobalFree(FileNameList);
\r
1080 if (hWndDragStart == hWndListLocal) {
\r
1081 DeleteFileList(&FileListBase);
\r
1083 // あとでファイル削除してフリーする
\r
1091 *((HANDLE *)lParam) = NULL;
\r
1101 static int prev_index = -1;
\r
1103 // 同一ウィンドウ内でのD&Dはリモート側のみ
\r
1104 if (Win != WIN_REMOTE)
\r
1107 if(MoveMode == MOVE_DISABLE)
\r
1110 memset(&hi, 0, sizeof(hi));
\r
1112 GetCursorPos(&Point);
\r
1113 hWndPnt = WindowFromPoint(Point);
\r
1114 ScreenToClient(hWnd, &Point);
\r
1119 ListView_SetItemState(hWnd, prev_index, 0, LVIS_DROPHILITED);
\r
1120 RemoteDropFileIndex = -1;
\r
1122 if ((hWndPnt == hWndListRemote) && (ListView_HitTest(hWnd, &hi) != -1)) {
\r
1123 if (hi.flags == LVHT_ONITEMLABEL) { // The position is over a list-view item's text.
\r
1126 prev_index = index;
\r
1127 Node = GetNodeType(Win, index);
\r
1128 if (Node == NODE_DIR) {
\r
1129 ListView_SetItemState(hWnd, index, LVIS_DROPHILITED, LVIS_DROPHILITED);
\r
1130 RemoteDropFileIndex = index;
\r
1138 case WM_RBUTTONDOWN :
\r
1139 // 特定の操作を行うと異常終了するバグ修正
\r
1140 if(AskUserOpeDisabled() == YES)
\r
1143 CallWindowProc(ProcPtr, hWnd, message, wParam, lParam);
\r
1145 EraseListViewTips();
\r
1147 if(hWnd == hWndListRemote)
\r
1148 RemoteRbuttonMenu(0);
\r
1149 else if(hWnd == hWndListLocal)
\r
1150 LocalRbuttonMenu(0);
\r
1153 case WM_LBUTTONDBLCLK :
\r
1154 // 特定の操作を行うと異常終了するバグ修正
\r
1155 if(AskUserOpeDisabled() == YES)
\r
1157 DoubleClickProc(Win, NO, -1);
\r
1160 case WM_MOUSEMOVE :
\r
1161 // 特定の操作を行うと異常終了するバグ修正
\r
1162 if(AskUserOpeDisabled() == YES)
\r
1164 if(wParam == MK_LBUTTON)
\r
1166 if((Dragging == NO) &&
\r
1167 (hWnd == hWndDragStart) &&
\r
1168 (AskConnecting() == YES) &&
\r
1169 (SendMessage(hWnd, LVM_GETSELECTEDCOUNT, 0, 0) > 0) &&
\r
1170 ((abs((short)LOWORD(lParam) - DragPoint.x) > 5) ||
\r
1171 (abs((short)HIWORD(lParam) - DragPoint.y) > 5)))
\r
1175 hCsrDrg = LoadCursor(GetFtpInst(), MAKEINTRESOURCE(drag_csr));
\r
1176 hCsrNoDrg = LoadCursor(GetFtpInst(), MAKEINTRESOURCE(nodrop_csr));
\r
1177 SetCursor(hCsrDrg);
\r
1179 else if(Dragging == YES)
\r
1181 Point.x = (long)(short)LOWORD(lParam);
\r
1182 Point.y = (long)(short)HIWORD(lParam);
\r
1183 ClientToScreen(hWnd, &Point);
\r
1184 hWndPnt = WindowFromPoint(Point);
\r
1185 if((hWndPnt == hWndListRemote) || (hWndPnt == hWndListLocal))
\r
1186 SetCursor(hCsrDrg);
\r
1188 // マウスポインタの×表示をやめる (yutaka)
\r
1190 SetCursor(hCsrNoDrg);
\r
1194 // OLE D&Dの開始を指示する
\r
1195 PostMessage(hWnd, WM_DRAGDROP, MAKEWPARAM(wParam, lParam), 0);
\r
1199 return(CallWindowProc(ProcPtr, hWnd, message, wParam, lParam));
\r
1203 CheckTipsDisplay(hWnd, lParam);
\r
1204 return(CallWindowProc(ProcPtr, hWnd, message, wParam, lParam));
\r
1208 case WM_MOUSEWHEEL :
\r
1210 if(AskUserOpeDisabled() == YES)
\r
1212 if(Dragging == NO)
\r
1214 short zDelta = (short)HIWORD(wParam);
\r
1216 EraseListViewTips();
\r
1217 Point.x = (short)LOWORD(lParam);
\r
1218 Point.y = (short)HIWORD(lParam);
\r
1219 hWndPnt = WindowFromPoint(Point);
\r
1221 if((wParam & MAKEWPARAM(MK_SHIFT, 0)) &&
\r
1222 ((hWndPnt == hWndListRemote) ||
\r
1223 (hWndPnt == hWndListLocal) ||
\r
1224 (hWndPnt == GetTaskWnd())))
\r
1226 PostMessage(hWndPnt, WM_VSCROLL, zDelta > 0 ? MAKEWPARAM(SB_PAGEUP, 0) : MAKEWPARAM(SB_PAGEDOWN, 0), 0);
\r
1227 // PostMessage(hWndPnt, WM_VSCROLL, MAKEWPARAM(SB_ENDSCROLL, 0), 0);
\r
1229 else if(hWndPnt == hWnd)
\r
1230 return(CallWindowProc(ProcPtr, hWnd, message, wParam, lParam));
\r
1231 else if((hWndPnt == hWndDst) || (hWndPnt == GetTaskWnd()))
\r
1232 PostMessage(hWndPnt, message, wParam, lParam);
\r
1237 return(CallWindowProc(ProcPtr, hWnd, message, wParam, lParam));
\r
1243 /*----- ファイルリストのタブ幅を取得する --------------------------------------
\r
1250 *----------------------------------------------------------------------------*/
\r
1252 void GetListTabWidth(void)
\r
1258 memset(&LvCol, 0, sizeof(LV_COLUMN));
\r
1260 for(i = 0; i <= 3; i++)
\r
1262 LvCol.mask = LVCF_WIDTH;
\r
1263 if(SendMessage(hWndListLocal, LVM_GETCOLUMN, i, (LPARAM)&LvCol) == TRUE)
\r
1264 LocalTabWidth[i] = LvCol.cx;
\r
1267 for(i = 0; i <= 5; i++)
\r
1269 LvCol.mask = LVCF_WIDTH;
\r
1270 if(SendMessage(hWndListRemote, LVM_GETCOLUMN, i, (LPARAM)&LvCol) == TRUE)
\r
1271 RemoteTabWidth[i] = LvCol.cx;
\r
1277 /*----- ファイル一覧方法にしたがってリストビューを設定する --------------------
\r
1284 *----------------------------------------------------------------------------*/
\r
1286 void SetListViewType(void)
\r
1296 // lStyle = GetWindowLong(GetLocalHwnd(), GWL_STYLE);
\r
1297 lStyle = GetWindowLongPtr(GetLocalHwnd(), GWL_STYLE);
\r
1298 lStyle &= ~(LVS_REPORT | LVS_LIST);
\r
1299 lStyle |= LVS_LIST;
\r
1301 // SetWindowLong(GetLocalHwnd(), GWL_STYLE, lStyle);
\r
1302 SetWindowLongPtr(GetLocalHwnd(), GWL_STYLE, lStyle);
\r
1305 // lStyle = GetWindowLong(GetRemoteHwnd(), GWL_STYLE);
\r
1306 lStyle = GetWindowLongPtr(GetRemoteHwnd(), GWL_STYLE);
\r
1307 lStyle &= ~(LVS_REPORT | LVS_LIST);
\r
1308 lStyle |= LVS_LIST;
\r
1310 // SetWindowLong(GetRemoteHwnd(), GWL_STYLE, lStyle);
\r
1311 SetWindowLongPtr(GetRemoteHwnd(), GWL_STYLE, lStyle);
\r
1316 // lStyle = GetWindowLong(GetLocalHwnd(), GWL_STYLE);
\r
1317 lStyle = GetWindowLongPtr(GetLocalHwnd(), GWL_STYLE);
\r
1318 lStyle &= ~(LVS_REPORT | LVS_LIST);
\r
1319 lStyle |= LVS_REPORT;
\r
1321 // SetWindowLong(GetLocalHwnd(), GWL_STYLE, lStyle);
\r
1322 SetWindowLongPtr(GetLocalHwnd(), GWL_STYLE, lStyle);
\r
1325 // lStyle = GetWindowLong(GetRemoteHwnd(), GWL_STYLE);
\r
1326 lStyle = GetWindowLongPtr(GetRemoteHwnd(), GWL_STYLE);
\r
1327 lStyle &= ~(LVS_REPORT | LVS_LIST);
\r
1328 lStyle |= LVS_REPORT;
\r
1330 // SetWindowLong(GetRemoteHwnd(), GWL_STYLE, lStyle);
\r
1331 SetWindowLongPtr(GetRemoteHwnd(), GWL_STYLE, lStyle);
\r
1338 /*----- ホスト側のファイル一覧ウインドウにファイル名をセット ------------------
\r
1341 * int Mode : キャッシュモード (CACHE_xxx)
\r
1345 *----------------------------------------------------------------------------*/
\r
1347 void GetRemoteDirForWnd(int Mode, int *CancelCheckWork)
\r
1351 char Str[FMAX_PATH+1];
\r
1352 char Buf[FMAX_PATH+1];
\r
1358 FLISTANCHOR Anchor;
\r
1359 char Owner[OWNER_NAME_LEN+1];
\r
1364 //DoPrintf("===== GetRemoteDirForWnd");
\r
1366 Anchor.Top = NULL;
\r
1369 if(AskConnecting() == YES)
\r
1371 // SetCursor(LoadCursor(NULL, IDC_WAIT));
\r
1374 AskRemoteCurDir(Buf, FMAX_PATH);
\r
1375 SetRemoteDirHist(Buf);
\r
1377 Type = FTP_COMPLETE;
\r
1378 if(Mode != CACHE_LASTREAD)
\r
1381 if((Num = AskCached(Buf)) == -1)
\r
1383 Num = AskFreeCache();
\r
1384 Mode = CACHE_REFRESH;
\r
1387 if(Mode == CACHE_REFRESH)
\r
1389 if((Type = DoDirListCmdSkt("", "", Num, CancelCheckWork)) == FTP_COMPLETE)
\r
1390 SetCache(Num, Buf);
\r
1396 Num = AskCurrentFileListNum();
\r
1398 if(Type == FTP_COMPLETE)
\r
1400 SetCurrentFileListNum(Num);
\r
1401 MakeCacheFileName(Num, Buf);
\r
1402 if((fd = fopen(Buf, "rb"))!=NULL)
\r
1404 ListType = LIST_UNKNOWN;
\r
1407 // while(GetListOneLine(Str, FMAX_PATH, fd) == FFFTP_SUCCESS)
\r
1408 while(GetListOneLine(Str, FMAX_PATH, fd, YES) == FFFTP_SUCCESS)
\r
1410 if((ListType = AnalyzeFileInfo(Str)) != LIST_UNKNOWN)
\r
1412 if((Type = ResolveFileInfo(Str, ListType, Buf, &Size, &Time, &Attr, Owner, &Link, &InfoExist)) != NODE_NONE)
\r
1414 if(AskFilterStr(Buf, Type) == YES)
\r
1416 if((DotFile == YES) || (Buf[0] != '.'))
\r
1418 AddDispFileList(&Anchor, Buf, &Time, Size, Attr, Type, Link, Owner, InfoExist, WIN_REMOTE);
\r
1426 DispFileList2View(GetRemoteHwnd(), &Anchor);
\r
1427 EraseDispFileList(&Anchor);
\r
1430 ListView_SetItemState(GetRemoteHwnd(), 0, LVIS_FOCUSED, LVIS_FOCUSED);
\r
1434 SetTaskMsg(MSGJPN048);
\r
1435 SendMessage(GetRemoteHwnd(), LVM_DELETEALLITEMS, 0, 0);
\r
1440 #if defined(HAVE_OPENVMS)
\r
1441 /* OpenVMSの場合空ディレクトリ移動の時に出るので、メッセージだけ出さない
\r
1442 * ようにする(VIEWはクリアして良い) */
\r
1443 if (AskHostType() != HTYPE_VMS)
\r
1445 SetTaskMsg(MSGJPN049);
\r
1446 SendMessage(GetRemoteHwnd(), LVM_DELETEALLITEMS, 0, 0);
\r
1449 // SetCursor(LoadCursor(NULL, IDC_ARROW));
\r
1455 //DoPrintf("===== GetRemoteDirForWnd Done");
\r
1461 /*----- ローカル側のファイル一覧ウインドウにファイル名をセット ----------------
\r
1468 *----------------------------------------------------------------------------*/
\r
1471 void RefreshIconImageList(FLISTANCHOR *Anchor)
\r
1477 char Cur[FMAX_PATH+1];
\r
1478 SHFILEINFO FileInfo;
\r
1479 if(DispFileIcon == YES)
\r
1481 SendMessage(hWndListLocal, LVM_SETIMAGELIST, LVSIL_SMALL, (LPARAM)NULL);
\r
1482 ShowWindow(hWndListLocal, SW_SHOW);
\r
1483 SendMessage(hWndListRemote, LVM_SETIMAGELIST, LVSIL_SMALL, (LPARAM)NULL);
\r
1484 ShowWindow(hWndListRemote, SW_SHOW);
\r
1485 ImageList_Destroy(ListImgFileIcon);
\r
1486 ListImgFileIcon = ImageList_Create(16, 16, ILC_MASK | ILC_COLOR32, 0, 1);
\r
1487 hBitmap = LoadBitmap(GetFtpInst(), MAKEINTRESOURCE(dirattr16_bmp));
\r
1488 ImageList_AddMasked(ListImgFileIcon, hBitmap, RGB(255, 0, 0));
\r
1489 DeleteObject(hBitmap);
\r
1491 Pos = Anchor->Top;
\r
1492 for(i = 0; i < Anchor->Files; i++)
\r
1494 Pos->ImageId = -1;
\r
1495 if(Pos->Node == NODE_DRIVE)
\r
1496 strcpy(Cur, Pos->File);
\r
1499 AskLocalCurDir(Cur, FMAX_PATH);
\r
1501 strcat(Cur, Pos->File);
\r
1503 if(SHGetFileInfo(Cur, 0, &FileInfo, sizeof(SHFILEINFO), SHGFI_SMALLICON | SHGFI_ICON) != 0)
\r
1505 if(ImageList_AddIcon(ListImgFileIcon, FileInfo.hIcon) >= 0)
\r
1507 Pos->ImageId = ImageId;
\r
1510 DestroyIcon(FileInfo.hIcon);
\r
1514 SendMessage(hWndListLocal, LVM_SETIMAGELIST, LVSIL_SMALL, (LPARAM)ListImgFileIcon);
\r
1515 ShowWindow(hWndListLocal, SW_SHOW);
\r
1516 SendMessage(hWndListRemote, LVM_SETIMAGELIST, LVSIL_SMALL, (LPARAM)ListImgFileIcon);
\r
1517 ShowWindow(hWndListRemote, SW_SHOW);
\r
1521 SendMessage(hWndListLocal, LVM_SETIMAGELIST, LVSIL_SMALL, (LPARAM)ListImg);
\r
1522 ShowWindow(hWndListLocal, SW_SHOW);
\r
1523 SendMessage(hWndListRemote, LVM_SETIMAGELIST, LVSIL_SMALL, (LPARAM)ListImg);
\r
1524 ShowWindow(hWndListRemote, SW_SHOW);
\r
1528 void GetLocalDirForWnd(void)
\r
1531 WIN32_FIND_DATA Find;
\r
1532 char Scan[FMAX_PATH+1];
\r
1536 FLISTANCHOR Anchor;
\r
1540 Anchor.Top = NULL;
\r
1544 SetLocalDirHist(Scan);
\r
1545 DispLocalFreeSpace(Scan);
\r
1548 if(ChangeNotification != INVALID_HANDLE_VALUE)
\r
1549 FindCloseChangeNotification(ChangeNotification);
\r
1550 ChangeNotification = FindFirstChangeNotification(Scan, FALSE, FILE_NOTIFY_CHANGE_FILE_NAME | FILE_NOTIFY_CHANGE_DIR_NAME | FILE_NOTIFY_CHANGE_ATTRIBUTES | FILE_NOTIFY_CHANGE_SIZE | FILE_NOTIFY_CHANGE_LAST_WRITE);
\r
1555 strcat(Scan, "*");
\r
1556 if((fHnd = FindFirstFileAttr(Scan, &Find, DispIgnoreHide)) != INVALID_HANDLE_VALUE)
\r
1560 if((strcmp(Find.cFileName, ".") != 0) &&
\r
1561 (strcmp(Find.cFileName, "..") != 0))
\r
1563 if((DotFile == YES) || (Find.cFileName[0] != '.'))
\r
1565 if(Find.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
\r
1566 AddDispFileList(&Anchor, Find.cFileName, &Find.ftLastWriteTime, MakeLongLong(Find.nFileSizeHigh, Find.nFileSizeLow), 0, NODE_DIR, NO, "", FINFO_ALL, WIN_LOCAL);
\r
1569 if(AskFilterStr(Find.cFileName, NODE_FILE) == YES)
\r
1571 AddDispFileList(&Anchor, Find.cFileName, &Find.ftLastWriteTime, MakeLongLong(Find.nFileSizeHigh, Find.nFileSizeLow), 0, NODE_FILE, NO, "", FINFO_ALL, WIN_LOCAL);
\r
1577 while(FindNextFileAttr(fHnd, &Find, DispIgnoreHide) == TRUE);
\r
1584 GetLogicalDriveStrings(FMAX_PATH, Scan);
\r
1585 NoDrives = LoadHideDriveListRegistry();
\r
1588 while(*Pos != NUL)
\r
1590 Tmp = toupper(*Pos) - 'A';
\r
1591 if((NoDrives & (0x00000001 << Tmp)) == 0)
\r
1593 sprintf(Buf, "%s", Pos);
\r
1594 memset(&Time, 0, sizeof(FILETIME));
\r
1595 AddDispFileList(&Anchor, Buf, &Time, 0, 0, NODE_DRIVE, NO, "", FINFO_ALL, WIN_LOCAL);
\r
1597 Pos = strchr(Pos, NUL) + 1;
\r
1602 RefreshIconImageList(&Anchor);
\r
1603 DispFileList2View(GetLocalHwnd(), &Anchor);
\r
1604 EraseDispFileList(&Anchor);
\r
1607 ListView_SetItemState(GetLocalHwnd(), 0, LVIS_FOCUSED, LVIS_FOCUSED);
\r
1613 /*----- ファイル情報をファイル一覧用リストに登録する --------------------------
\r
1616 * FLISTANCHOR *Anchor : ファイルリストの先頭
\r
1617 * char *Name : ファイル名
\r
1618 * FILETIME *Time : 日付
\r
1619 * LONGLONG Size : サイズ
\r
1621 * int Type : タイプ (NODE_xxxx)
\r
1622 * int Link : リンクかどうか (YES/NO)
\r
1623 * char *Owner : オーナ名
\r
1624 * int InfoExist : 情報があるかどうか (FINFO_xxx)
\r
1625 * int Win : ウィンドウ番号 (WIN_xxxx)
\r
1629 *----------------------------------------------------------------------------*/
\r
1631 static void AddDispFileList(FLISTANCHOR *Anchor, char *Name, FILETIME *Time, LONGLONG Size, int Attr, int Type, int Link, char *Owner, int InfoExist, int Win)
\r
1642 FileSort = AskSortType(ITEM_LFILE);
\r
1643 DirSort = AskSortType(ITEM_LDIR);
\r
1644 if(Win == WIN_REMOTE)
\r
1646 FileSort = AskSortType(ITEM_RFILE);
\r
1647 DirSort = AskSortType(ITEM_RDIR);
\r
1650 Pos = Anchor->Top;
\r
1651 for(i = 0; i < Anchor->Files; i++)
\r
1653 if((Type == NODE_DIR) && (Pos->Node == NODE_FILE))
\r
1655 if((Type == NODE_FILE) && (Pos->Node == NODE_DRIVE))
\r
1658 if(Type == Pos->Node)
\r
1660 if(Type == NODE_DIR)
\r
1665 if((Sort & SORT_GET_ORD) == SORT_ASCENT)
\r
1667 // 読みにくいのでリファクタリング
\r
1668 // if((((Sort & SORT_MASK_ORD) == SORT_EXT) &&
\r
1669 // ((Cmp = _mbsicmp(GetFileExt(Name), GetFileExt(Pos->File))) < 0)) ||
\r
1670 //#if defined(HAVE_TANDEM)
\r
1671 // ((AskHostType() == HTYPE_TANDEM) &&
\r
1672 // ((Sort & SORT_MASK_ORD) == SORT_EXT) &&
\r
1673 // ((Cmp = Attr - Pos->Attr) < 0)) ||
\r
1675 // (((Sort & SORT_MASK_ORD) == SORT_SIZE) &&
\r
1676 // ((Cmp = Size - Pos->Size) < 0)) ||
\r
1677 // (((Sort & SORT_MASK_ORD) == SORT_DATE) &&
\r
1678 // ((Cmp = CompareFileTime(Time, &Pos->Time)) < 0)))
\r
1682 if(((Sort & SORT_MASK_ORD) == SORT_EXT) &&
\r
1683 ((Cmp = _mbsicmp(GetFileExt(Name), GetFileExt(Pos->File))) < 0))
\r
1685 #if defined(HAVE_TANDEM)
\r
1686 if((AskHostType() == HTYPE_TANDEM) &&
\r
1687 ((Sort & SORT_MASK_ORD) == SORT_EXT) &&
\r
1688 ((Cmp = Attr - Pos->Attr) < 0))
\r
1691 if(((Sort & SORT_MASK_ORD) == SORT_SIZE) &&
\r
1692 ((Cmp = Size - Pos->Size) < 0))
\r
1694 if(((Sort & SORT_MASK_ORD) == SORT_DATE) &&
\r
1695 ((Cmp = CompareFileTime(Time, &Pos->Time)) < 0))
\r
1698 if(((Sort & SORT_MASK_ORD) == SORT_NAME) || (Cmp == 0))
\r
1700 if(_mbsicmp(Name, Pos->File) < 0)
\r
1706 // 読みにくいのでリファクタリング
\r
1707 // if((((Sort & SORT_MASK_ORD) == SORT_EXT) &&
\r
1708 // ((Cmp = _mbsicmp(GetFileExt(Name), GetFileExt(Pos->File))) > 0)) ||
\r
1709 //#if defined(HAVE_TANDEM)
\r
1710 // ((AskHostType() == HTYPE_TANDEM) &&
\r
1711 // ((Sort & SORT_MASK_ORD) == SORT_EXT) &&
\r
1712 // ((Cmp = Attr - Pos->Attr) > 0)) ||
\r
1714 // (((Sort & SORT_MASK_ORD) == SORT_SIZE) &&
\r
1715 // ((Cmp = Size - Pos->Size) > 0)) ||
\r
1716 // (((Sort & SORT_MASK_ORD) == SORT_DATE) &&
\r
1717 // ((Cmp = CompareFileTime(Time, &Pos->Time)) > 0)))
\r
1721 if((((Sort & SORT_MASK_ORD) == SORT_EXT) &&
\r
1722 ((Cmp = _mbsicmp(GetFileExt(Name), GetFileExt(Pos->File))) > 0)))
\r
1724 #if defined(HAVE_TANDEM)
\r
1725 if(((AskHostType() == HTYPE_TANDEM) &&
\r
1726 ((Sort & SORT_MASK_ORD) == SORT_EXT) &&
\r
1727 ((Cmp = Attr - Pos->Attr) > 0)))
\r
1730 if(((Sort & SORT_MASK_ORD) == SORT_SIZE) &&
\r
1731 ((Cmp = Size - Pos->Size) > 0))
\r
1733 if(((Sort & SORT_MASK_ORD) == SORT_DATE) &&
\r
1734 ((Cmp = CompareFileTime(Time, &Pos->Time)) > 0))
\r
1737 if(((Sort & SORT_MASK_ORD) == SORT_NAME) || (Cmp == 0))
\r
1739 if(_mbsicmp(Name, Pos->File) > 0)
\r
1748 if((New = malloc(sizeof(FILELIST))) != NULL)
\r
1750 strcpy(New->File, Name);
\r
1755 New->Time = *Time;
\r
1756 strcpy(New->Owner, Owner);
\r
1757 New->InfoExist = InfoExist;
\r
1759 if(Pos == Anchor->Top)
\r
1761 New->Next = Anchor->Top;
\r
1762 Anchor->Top = New;
\r
1766 New->Next = Prev->Next;
\r
1769 Anchor->Files += 1;
\r
1775 /*----- ファイル一覧用リストをクリアする --------------------------------------
\r
1778 * FLISTANCHOR *Anchor : ファイルリストの先頭
\r
1782 *----------------------------------------------------------------------------*/
\r
1784 static void EraseDispFileList(FLISTANCHOR *Anchor)
\r
1790 Pos = Anchor->Top;
\r
1791 for(i = 0; i < Anchor->Files; i++)
\r
1797 Anchor->Files = 0;
\r
1798 Anchor->Top = NULL;
\r
1803 /*----- ファイル一覧用リストの内容をファイル一覧ウインドウにセット ------------
\r
1806 * HWND hWnd : ウインドウハンドル
\r
1807 * FLISTANCHOR *Anchor : ファイルリストの先頭
\r
1811 *----------------------------------------------------------------------------*/
\r
1813 static void DispFileList2View(HWND hWnd, FLISTANCHOR *Anchor)
\r
1818 SendMessage(hWnd, WM_SETREDRAW, (WPARAM)FALSE, 0);
\r
1819 SendMessage(hWnd, LVM_DELETEALLITEMS, 0, 0);
\r
1821 Pos = Anchor->Top;
\r
1822 for(i = 0; i < Anchor->Files; i++)
\r
1825 // AddListView(hWnd, -1, Pos->File, Pos->Node, Pos->Size, &Pos->Time, Pos->Attr, Pos->Owner, Pos->Link, Pos->InfoExist);
\r
1826 AddListView(hWnd, -1, Pos->File, Pos->Node, Pos->Size, &Pos->Time, Pos->Attr, Pos->Owner, Pos->Link, Pos->InfoExist, Pos->ImageId);
\r
1830 SendMessage(hWnd, WM_SETREDRAW, (WPARAM)TRUE, 0);
\r
1831 UpdateWindow(hWnd);
\r
1833 DispSelectedSpace();
\r
1838 /*----- ファイル一覧ウインドウ(リストビュー)に追加 --------------------------
\r
1841 * HWND hWnd : ウインドウハンドル
\r
1844 * int Type : タイプ (NIDE_xxxx)
\r
1845 * LONGLONG Size : サイズ
\r
1846 * FILETIME *Time : 日付
\r
1848 * char Owner : オーナ名
\r
1849 * int Link : リンクかどうか
\r
1850 * int InfoExist : 情報があるかどうか (FINFO_xxx)
\r
1854 *----------------------------------------------------------------------------*/
\r
1857 //static void AddListView(HWND hWnd, int Pos, char *Name, int Type, LONGLONG Size, FILETIME *Time, int Attr, char *Owner, int Link, int InfoExist)
\r
1858 static void AddListView(HWND hWnd, int Pos, char *Name, int Type, LONGLONG Size, FILETIME *Time, int Attr, char *Owner, int Link, int InfoExist, int ImageId)
\r
1864 Pos = SendMessage(hWnd, LVM_GETITEMCOUNT, 0, 0);
\r
1867 memset(&LvItem, 0, sizeof(LV_ITEM));
\r
1869 LvItem.mask = LVIF_TEXT | LVIF_IMAGE;
\r
1870 LvItem.iItem = Pos;
\r
1871 LvItem.iSubItem = 0;
\r
1872 LvItem.pszText = Name;
\r
1873 if((Type == NODE_FILE) && (AskTransferTypeAssoc(Name, TYPE_X) == TYPE_I))
\r
1876 LvItem.iImage = Type;
\r
1878 LvItem.iImage = 4;
\r
1880 if(DispFileIcon == YES && hWnd == GetLocalHwnd())
\r
1881 LvItem.iImage = ImageId + 5;
\r
1882 LvItem.iItem = SendMessage(hWnd, LVM_INSERTITEM, 0, (LPARAM)&LvItem);
\r
1886 // FileTime2TimeString(Time, Tmp, DISPFORM_LEGACY, InfoExist);
\r
1887 FileTime2TimeString(Time, Tmp, DISPFORM_LEGACY, InfoExist, DispTimeSeconds);
\r
1888 LvItem.mask = LVIF_TEXT;
\r
1889 LvItem.iItem = Pos;
\r
1890 LvItem.iSubItem = 1;
\r
1891 LvItem.pszText = Tmp;
\r
1892 LvItem.iItem = SendMessage(hWnd, LVM_SETITEM, 0, (LPARAM)&LvItem);
\r
1895 if(Type == NODE_DIR)
\r
1896 strcpy(Tmp, "<DIR>");
\r
1897 else if(Type == NODE_DRIVE)
\r
1898 strcpy(Tmp, "<DRIVE>");
\r
1899 else if(Size >= 0)
\r
1900 MakeNumString(Size, Tmp, TRUE);
\r
1903 LvItem.mask = LVIF_TEXT;
\r
1904 LvItem.iItem = Pos;
\r
1905 LvItem.iSubItem = 2;
\r
1906 LvItem.pszText = Tmp;
\r
1907 LvItem.iItem = SendMessage(hWnd, LVM_SETITEM, 0, (LPARAM)&LvItem);
\r
1910 LvItem.mask = LVIF_TEXT;
\r
1911 LvItem.iItem = Pos;
\r
1912 LvItem.iSubItem = 3;
\r
1913 #if defined(HAVE_TANDEM)
\r
1914 if (AskHostType() == HTYPE_TANDEM) {
\r
1915 _itoa_s(Attr, Tmp, sizeof(Tmp), 10);
\r
1916 LvItem.pszText = Tmp;
\r
1919 LvItem.pszText = GetFileExt(Name);
\r
1920 LvItem.iItem = SendMessage(hWnd, LVM_SETITEM, 0, (LPARAM)&LvItem);
\r
1922 if(hWnd == GetRemoteHwnd())
\r
1926 #if defined(HAVE_TANDEM)
\r
1927 if((InfoExist & FINFO_ATTR) && (AskHostType() != HTYPE_TANDEM))
\r
1929 if(InfoExist & FINFO_ATTR)
\r
1932 // AttrValue2String(Attr, Tmp);
\r
1933 AttrValue2String(Attr, Tmp, DispPermissionsNumber);
\r
1934 LvItem.mask = LVIF_TEXT;
\r
1935 LvItem.iItem = Pos;
\r
1936 LvItem.iSubItem = 4;
\r
1937 LvItem.pszText = Tmp;
\r
1938 LvItem.iItem = SendMessage(hWnd, LVM_SETITEM, 0, (LPARAM)&LvItem);
\r
1941 LvItem.mask = LVIF_TEXT;
\r
1942 LvItem.iItem = Pos;
\r
1943 LvItem.iSubItem = 5;
\r
1944 LvItem.pszText = Owner;
\r
1945 LvItem.iItem = SendMessage(hWnd, LVM_SETITEM, 0, (LPARAM)&LvItem);
\r
1951 /*----- ファイル名一覧ウインドウをソートし直す --------------------------------
\r
1954 * int Win : ウィンドウ番号 (WIN_xxxx)
\r
1958 *----------------------------------------------------------------------------*/
\r
1960 void ReSortDispList(int Win, int *CancelCheckWork)
\r
1962 if(Win == WIN_REMOTE)
\r
1963 GetRemoteDirForWnd(CACHE_LASTREAD, CancelCheckWork);
\r
1965 GetLocalDirForWnd();
\r
1970 /*----- ファイル一覧ウインドウのファイルを選択する ----------------------------
\r
1973 * HWND hWnd : ウインドウハンドル
\r
1974 * int Type : 選択方法 (SELECT_xxx)
\r
1978 *----------------------------------------------------------------------------*/
\r
1981 //void SelectFileInList(HWND hWnd, int Type)
\r
1982 void SelectFileInList(HWND hWnd, int Type, FILELIST *Base)
\r
1988 char RegExp[FMAX_PATH+1];
\r
1989 char Name[FMAX_PATH+1];
\r
1997 memset(&LvItem, 0, sizeof(LV_ITEM));
\r
1999 WinDst = WIN_REMOTE;
\r
2000 if(hWnd == GetRemoteHwnd())
\r
2003 WinDst = WIN_LOCAL;
\r
2006 Num = GetItemCount(Win);
\r
2011 if(GetSelectedCount(Win) <= 1)
\r
2012 LvItem.state = LVIS_SELECTED;
\r
2013 for(i = 0; i < Num; i++)
\r
2015 if(GetNodeType(Win, i) != NODE_DRIVE)
\r
2017 LvItem.mask = LVIF_STATE;
\r
2019 LvItem.stateMask = LVIS_SELECTED;
\r
2020 LvItem.iSubItem = 0;
\r
2021 SendMessage(hWnd, LVM_SETITEMSTATE, i, (LPARAM)&LvItem);
\r
2026 case SELECT_REGEXP :
\r
2027 if(((Win == WIN_LOCAL) &&
\r
2028 (DialogBox(GetFtpInst(), MAKEINTRESOURCE(sel_local_dlg), hWnd, SelectDialogCallBack) == YES)) ||
\r
2029 ((Win == WIN_REMOTE) &&
\r
2030 (DialogBox(GetFtpInst(), MAKEINTRESOURCE(sel_remote_dlg), hWnd, SelectDialogCallBack) == YES)))
\r
2032 strcpy(RegExp, FindStr);
\r
2033 // if(FindMode == 0)
\r
2034 // WildCard2RegExp(RegExp);
\r
2037 if((FindMode == 0) || (JreCompileStr(RegExp) == TRUE))
\r
2040 for(i = 0; i < Num; i++)
\r
2042 GetNodeName(Win, i, Name, FMAX_PATH);
\r
2043 Find = FindNameNode(WinDst, Name);
\r
2047 if(GetNodeType(Win, i) != NODE_DRIVE)
\r
2049 if(((FindMode == 0) && (CheckFname(Name, RegExp) == FFFTP_SUCCESS)) ||
\r
2050 ((FindMode != 0) && (JreGetStrMatchInfo(Name, 0) != NULL)))
\r
2052 LvItem.state = LVIS_SELECTED;
\r
2056 if(IgnoreExist == YES)
\r
2059 if((LvItem.state != 0) && (IgnoreNew == YES))
\r
2061 GetNodeTime(Win, i, &Time1);
\r
2062 GetNodeTime(WinDst, Find, &Time2);
\r
2063 if(CompareFileTime(&Time1, &Time2) > 0)
\r
2067 if((LvItem.state != 0) && (IgnoreOld == YES))
\r
2069 GetNodeTime(Win, i, &Time1);
\r
2070 GetNodeTime(WinDst, Find, &Time2);
\r
2071 if(CompareFileTime(&Time1, &Time2) < 0)
\r
2078 if((LvItem.state != 0) && (CsrPos == -1))
\r
2081 LvItem.mask = LVIF_STATE;
\r
2083 LvItem.stateMask = LVIS_SELECTED;
\r
2084 LvItem.iSubItem = 0;
\r
2085 SendMessage(hWnd, LVM_SETITEMSTATE, i, (LPARAM)&LvItem);
\r
2089 LvItem.mask = LVIF_STATE;
\r
2090 LvItem.iItem = CsrPos;
\r
2091 LvItem.state = LVIS_FOCUSED;
\r
2092 LvItem.stateMask = LVIS_FOCUSED;
\r
2093 LvItem.iSubItem = 0;
\r
2094 SendMessage(hWnd, LVM_SETITEMSTATE, CsrPos, (LPARAM)&LvItem);
\r
2095 SendMessage(hWnd, LVM_ENSUREVISIBLE, CsrPos, (LPARAM)TRUE);
\r
2102 case SELECT_LIST :
\r
2103 for(i = 0; i < Num; i++)
\r
2106 GetNodeName(Win, i, Name, FMAX_PATH);
\r
2107 if(SearchFileList(Name, Base, COMP_STRICT) != NULL)
\r
2108 LvItem.state = LVIS_SELECTED;
\r
2109 LvItem.mask = LVIF_STATE;
\r
2111 LvItem.stateMask = LVIS_SELECTED;
\r
2112 LvItem.iSubItem = 0;
\r
2113 SendMessage(hWnd, LVM_SETITEMSTATE, i, (LPARAM)&LvItem);
\r
2121 /*----- 選択ダイアログのコールバック ------------------------------------------
\r
2124 * HWND hDlg : ウインドウハンドル
\r
2125 * UINT message : メッセージ番号
\r
2126 * WPARAM wParam : メッセージの WPARAM 引数
\r
2127 * LPARAM lParam : メッセージの LPARAM 引数
\r
2131 *----------------------------------------------------------------------------*/
\r
2134 //static BOOL CALLBACK SelectDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam)
\r
2135 static INT_PTR CALLBACK SelectDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam)
\r
2139 case WM_INITDIALOG :
\r
2140 SendDlgItemMessage(hDlg, SEL_FNAME, EM_LIMITTEXT, 40, 0);
\r
2141 SendDlgItemMessage(hDlg, SEL_FNAME, WM_SETTEXT, 0, (LPARAM)FindStr);
\r
2142 SendDlgItemMessage(hDlg, SEL_REGEXP, BM_SETCHECK, FindMode, 0);
\r
2143 SendDlgItemMessage(hDlg, SEL_NOOLD, BM_SETCHECK, IgnoreOld, 0);
\r
2144 SendDlgItemMessage(hDlg, SEL_NONEW, BM_SETCHECK, IgnoreNew, 0);
\r
2145 SendDlgItemMessage(hDlg, SEL_NOEXIST, BM_SETCHECK, IgnoreExist, 0);
\r
2149 switch(GET_WM_COMMAND_ID(wParam, lParam))
\r
2152 SendDlgItemMessage(hDlg, SEL_FNAME, WM_GETTEXT, 40+1, (LPARAM)FindStr);
\r
2153 FindMode = SendDlgItemMessage(hDlg, SEL_REGEXP, BM_GETCHECK, 0, 0);
\r
2154 IgnoreOld = SendDlgItemMessage(hDlg, SEL_NOOLD, BM_GETCHECK, 0, 0);
\r
2155 IgnoreNew = SendDlgItemMessage(hDlg, SEL_NONEW, BM_GETCHECK, 0, 0);
\r
2156 IgnoreExist = SendDlgItemMessage(hDlg, SEL_NOEXIST, BM_GETCHECK, 0, 0);
\r
2157 EndDialog(hDlg, YES);
\r
2161 EndDialog(hDlg, NO);
\r
2165 hHelpWin = HtmlHelp(NULL, AskHelpFilePath(), HH_HELP_CONTEXT, IDH_HELP_TOPIC_0000061);
\r
2174 /*----- ファイル一覧ウインドウのファイルを検索する ----------------------------
\r
2177 * HWND hWnd : ウインドウハンドル
\r
2178 * int Type : 検索方法 (FIND_xxx)
\r
2182 *----------------------------------------------------------------------------*/
\r
2184 void FindFileInList(HWND hWnd, int Type)
\r
2189 static char RegExp[FMAX_PATH+1] = { "" };
\r
2190 char Name[FMAX_PATH+1];
\r
2195 memset(&LvItem, 0, sizeof(LV_ITEM));
\r
2197 Title = MSGJPN050;
\r
2198 if(hWnd == GetRemoteHwnd())
\r
2201 Title = MSGJPN051;
\r
2204 Num = GetItemCount(Win);
\r
2208 if(InputDialogBox(find_dlg, hWnd, Title, FindStr, 40+1, &FindMode, IDH_HELP_TOPIC_0000001) == YES)
\r
2210 strcpy(RegExp, FindStr);
\r
2211 // if(FindMode == 0)
\r
2212 // WildCard2RegExp(RegExp);
\r
2215 if((FindMode == 0) || (JreCompileStr(RegExp) == TRUE))
\r
2217 for(i = GetCurrentItem(Win)+1; i < Num; i++)
\r
2219 GetNodeName(Win, i, Name, FMAX_PATH);
\r
2223 if(((FindMode == 0) && (CheckFname(Name, RegExp) == FFFTP_SUCCESS)) ||
\r
2224 ((FindMode != 0) && (JreGetStrMatchInfo(Name, 0) != NULL)))
\r
2226 LvItem.mask = LVIF_STATE;
\r
2228 LvItem.state = LVIS_FOCUSED;
\r
2229 LvItem.stateMask = LVIS_FOCUSED;
\r
2230 LvItem.iSubItem = 0;
\r
2231 SendMessage(hWnd, LVM_SETITEMSTATE, i, (LPARAM)&LvItem);
\r
2232 SendMessage(hWnd, LVM_ENSUREVISIBLE, i, (LPARAM)TRUE);
\r
2241 for(i = GetCurrentItem(Win)+1; i < Num; i++)
\r
2243 GetNodeName(Win, i, Name, FMAX_PATH);
\r
2247 if(((FindMode == 0) && (CheckFname(Name, RegExp) == FFFTP_SUCCESS)) ||
\r
2248 ((FindMode != 0) && (JreGetStrMatchInfo(Name, 0) != NULL)))
\r
2250 LvItem.mask = LVIF_STATE;
\r
2252 LvItem.state = LVIS_FOCUSED;
\r
2253 LvItem.stateMask = LVIS_FOCUSED;
\r
2254 LvItem.iSubItem = 0;
\r
2255 SendMessage(hWnd, LVM_SETITEMSTATE, i, (LPARAM)&LvItem);
\r
2256 SendMessage(hWnd, LVM_ENSUREVISIBLE, i, (LPARAM)TRUE);
\r
2267 /*----- ワイルドカードを正規表現に変換する ------------------------------------
\r
2274 *----------------------------------------------------------------------------*/
\r
2276 void WildCard2RegExp(char *Str)
\r
2278 char Tmp[FMAX_PATH+1];
\r
2288 while(*Str != NUL)
\r
2290 if(Pos >= Tmp + FMAX_PATH - 3)
\r
2293 Ch = _mbsnextc(Str);
\r
2294 Str = _mbsinc(Str);
\r
2298 if(strchr("[]()^$.+", Ch) != NULL)
\r
2303 else if(Ch == '*')
\r
2308 else if(Ch == '?')
\r
2310 else if(Ch == '|')
\r
2319 _mbsnset(Pos, Ch, 1);
\r
2320 Pos = _mbsinc(Pos);
\r
2333 /*----- カーソル位置のアイテム番号を返す --------------------------------------
\r
2336 * int Win : ウィンドウ番号 (WIN_xxxx)
\r
2340 *----------------------------------------------------------------------------*/
\r
2342 int GetCurrentItem(int Win)
\r
2347 hWnd = GetLocalHwnd();
\r
2348 if(Win == WIN_REMOTE)
\r
2349 hWnd = GetRemoteHwnd();
\r
2351 if((Ret = SendMessage(hWnd, LVM_GETNEXTITEM, -1, MAKELPARAM(LVNI_ALL | LVNI_FOCUSED, 0))) == -1)
\r
2358 /*----- アイテム数を返す ------------------------------------------------------
\r
2361 * int Win : ウィンドウ番号 (WIN_xxxx)
\r
2365 *----------------------------------------------------------------------------*/
\r
2367 int GetItemCount(int Win)
\r
2371 hWnd = GetLocalHwnd();
\r
2372 if(Win == WIN_REMOTE)
\r
2373 hWnd = GetRemoteHwnd();
\r
2375 return(SendMessage(hWnd, LVM_GETITEMCOUNT, 0, 0));
\r
2379 /*----- 選択されているアイテム数を返す ----------------------------------------
\r
2382 * int Win : ウィンドウ番号 (WIN_xxxx)
\r
2385 * int 選択されているアイテム数
\r
2386 *----------------------------------------------------------------------------*/
\r
2388 int GetSelectedCount(int Win)
\r
2392 hWnd = GetLocalHwnd();
\r
2393 if(Win == WIN_REMOTE)
\r
2394 hWnd = GetRemoteHwnd();
\r
2396 return(SendMessage(hWnd, LVM_GETSELECTEDCOUNT, 0, 0));
\r
2400 /*----- 選択されている最初のアイテム番号を返す --------------------------------
\r
2403 * int Win : ウィンドウ番号 (WIN_xxxx)
\r
2404 * int All : 選ばれていないものを含める
\r
2409 *----------------------------------------------------------------------------*/
\r
2411 int GetFirstSelected(int Win, int All)
\r
2416 hWnd = GetLocalHwnd();
\r
2417 if(Win == WIN_REMOTE)
\r
2418 hWnd = GetRemoteHwnd();
\r
2420 Ope = LVNI_SELECTED;
\r
2424 return(SendMessage(hWnd, LVM_GETNEXTITEM, (WPARAM)-1, (LPARAM)MAKELPARAM(Ope, 0)));
\r
2428 /*----- 選択されている次のアイテム番号を返す ----------------------------------
\r
2431 * int Win : ウィンドウ番号 (WIN_xxxx)
\r
2432 * int Pos : 今のアイテム番号
\r
2433 * int All : 選ばれていないものも含める
\r
2438 *----------------------------------------------------------------------------*/
\r
2440 int GetNextSelected(int Win, int Pos, int All)
\r
2445 hWnd = GetLocalHwnd();
\r
2446 if(Win == WIN_REMOTE)
\r
2447 hWnd = GetRemoteHwnd();
\r
2449 Ope = LVNI_SELECTED;
\r
2453 return(SendMessage(hWnd, LVM_GETNEXTITEM, (WPARAM)Pos, (LPARAM)MAKELPARAM(Ope, 0)));
\r
2458 int GetHotSelected(int Win, char *Fname)
\r
2463 hWnd = GetLocalHwnd();
\r
2464 if(Win == WIN_REMOTE)
\r
2465 hWnd = GetRemoteHwnd();
\r
2467 Pos = SendMessage(hWnd, LVM_GETNEXTITEM, (WPARAM)-1, (LPARAM)MAKELPARAM(LVNI_FOCUSED, 0));
\r
2469 GetNodeName(Win, Pos, Fname, FMAX_PATH);
\r
2474 int SetHotSelected(int Win, char *Fname)
\r
2479 char Name[FMAX_PATH+1];
\r
2483 hWnd = GetLocalHwnd();
\r
2484 if(Win == WIN_REMOTE)
\r
2485 hWnd = GetRemoteHwnd();
\r
2487 Num = GetItemCount(Win);
\r
2488 memset(&LvItem, 0, sizeof(LV_ITEM));
\r
2490 for(i = 0; i < Num; i++)
\r
2493 GetNodeName(Win, i, Name, FMAX_PATH);
\r
2494 if(_mbscmp(Fname, Name) == 0)
\r
2497 LvItem.state = LVIS_FOCUSED;
\r
2499 LvItem.mask = LVIF_STATE;
\r
2501 LvItem.stateMask = LVIS_FOCUSED;
\r
2502 LvItem.iSubItem = 0;
\r
2503 SendMessage(hWnd, LVM_SETITEMSTATE, i, (LPARAM)&LvItem);
\r
2509 /*----- 指定された名前のアイテムを探す ----------------------------------------
\r
2512 * int Win : ウインドウ番号 (WIN_xxx)
\r
2518 *----------------------------------------------------------------------------*/
\r
2520 int FindNameNode(int Win, char *Name)
\r
2522 LV_FINDINFO FindInfo;
\r
2525 hWnd = GetLocalHwnd();
\r
2526 if(Win == WIN_REMOTE)
\r
2527 hWnd = GetRemoteHwnd();
\r
2530 memset(&FindInfo, 0, sizeof(LV_FINDINFO));
\r
2531 FindInfo.flags = LVFI_STRING;
\r
2532 FindInfo.psz = Name;
\r
2533 return(SendMessage(hWnd, LVM_FINDITEM, -1, (LPARAM)&FindInfo));
\r
2537 /*----- 指定位置のアイテムの名前を返す ----------------------------------------
\r
2540 * int Win : ウインドウ番号 (WIN_xxx)
\r
2542 * char *Buf : 名前を返すバッファ
\r
2543 * int Max : バッファのサイズ
\r
2547 *----------------------------------------------------------------------------*/
\r
2549 void GetNodeName(int Win, int Pos, char *Buf, int Max)
\r
2554 hWnd = GetLocalHwnd();
\r
2555 if(Win == WIN_REMOTE)
\r
2556 hWnd = GetRemoteHwnd();
\r
2559 memset(&LvItem, 0, sizeof(LV_ITEM));
\r
2560 LvItem.mask = LVIF_TEXT;
\r
2561 LvItem.iItem = Pos;
\r
2562 LvItem.iSubItem = 0;
\r
2563 LvItem.pszText = Buf;
\r
2564 LvItem.cchTextMax = Max;
\r
2565 SendMessage(hWnd, LVM_GETITEM, 0, (LPARAM)&LvItem);
\r
2570 /*----- 指定位置のアイテムの日付を返す ----------------------------------------
\r
2573 * int Win : ウインドウ番号 (WIN_xxx)
\r
2575 * FILETIME *Buf : 日付を返すバッファ
\r
2579 * YES/NO=日付情報がなかった
\r
2580 *----------------------------------------------------------------------------*/
\r
2582 int GetNodeTime(int Win, int Pos, FILETIME *Buf)
\r
2589 hWnd = GetLocalHwnd();
\r
2590 if(Win == WIN_REMOTE)
\r
2591 hWnd = GetRemoteHwnd();
\r
2594 memset(&LvItem, 0, sizeof(LV_ITEM));
\r
2595 LvItem.mask = LVIF_TEXT;
\r
2596 LvItem.iItem = Pos;
\r
2597 LvItem.iSubItem = 1;
\r
2598 LvItem.pszText = Tmp;
\r
2599 LvItem.cchTextMax = 20;
\r
2600 SendMessage(hWnd, LVM_GETITEM, 0, (LPARAM)&LvItem);
\r
2601 Ret = TimeString2FileTime(Tmp, Buf);
\r
2606 /*----- 指定位置のアイテムのサイズを返す --------------------------------------
\r
2609 * int Win : ウインドウ番号 (WIN_xxx)
\r
2611 * int *Buf : サイズを返すワーク
\r
2615 * YES/NO=サイズ情報がなかった
\r
2616 *----------------------------------------------------------------------------*/
\r
2618 int GetNodeSize(int Win, int Pos, LONGLONG *Buf)
\r
2625 hWnd = GetLocalHwnd();
\r
2626 if(Win == WIN_REMOTE)
\r
2627 hWnd = GetRemoteHwnd();
\r
2630 memset(&LvItem, 0, sizeof(LV_ITEM));
\r
2631 LvItem.mask = LVIF_TEXT;
\r
2632 LvItem.iItem = Pos;
\r
2633 LvItem.iSubItem = 2;
\r
2634 LvItem.pszText = Tmp;
\r
2635 LvItem.cchTextMax = 20;
\r
2636 SendMessage(hWnd, LVM_GETITEM, 0, (LPARAM)&LvItem);
\r
2639 #if defined(HAVE_TANDEM)
\r
2640 if(AskHostType() == HTYPE_TANDEM) {
\r
2642 *Buf = _atoi64(Tmp);
\r
2646 if(strlen(Tmp) > 0)
\r
2649 *Buf = _atoi64(Tmp);
\r
2656 /*----- 指定位置のアイテムの属性を返す ----------------------------------------
\r
2659 * int Win : ウインドウ番号 (WIN_xxx)
\r
2661 * int *Buf : 属性を返すワーク
\r
2665 * YES/NO=サイズ情報がなかった
\r
2666 *----------------------------------------------------------------------------*/
\r
2668 int GetNodeAttr(int Win, int Pos, int *Buf)
\r
2676 if(Win == WIN_REMOTE)
\r
2679 memset(&LvItem, 0, sizeof(LV_ITEM));
\r
2680 LvItem.mask = LVIF_TEXT;
\r
2681 LvItem.iItem = Pos;
\r
2682 #if defined(HAVE_TANDEM)
\r
2683 if(AskHostType() == HTYPE_TANDEM)
\r
2684 LvItem.iSubItem = 3;
\r
2687 LvItem.iSubItem = 4;
\r
2688 LvItem.pszText = Tmp;
\r
2689 LvItem.cchTextMax = 20;
\r
2690 SendMessage(GetRemoteHwnd(), LVM_GETITEM, 0, (LPARAM)&LvItem);
\r
2691 if(strlen(Tmp) > 0)
\r
2693 #if defined(HAVE_TANDEM)
\r
2694 if(AskHostType() == HTYPE_TANDEM)
\r
2698 *Buf = AttrString2Value(Tmp);
\r
2706 /*----- 指定位置のアイテムのタイプを返す --------------------------------------
\r
2709 * int Win : ウインドウ番号 (WIN_xxx)
\r
2713 * int タイプ (NODE_xxx)
\r
2714 *----------------------------------------------------------------------------*/
\r
2716 int GetNodeType(int Win, int Pos)
\r
2723 hWnd = GetLocalHwnd();
\r
2724 if(Win == WIN_REMOTE)
\r
2725 hWnd = GetRemoteHwnd();
\r
2728 memset(&LvItem, 0, sizeof(LV_ITEM));
\r
2729 LvItem.mask = LVIF_TEXT;
\r
2730 LvItem.iItem = Pos;
\r
2731 LvItem.iSubItem = 2;
\r
2732 LvItem.pszText = Tmp;
\r
2733 LvItem.cchTextMax = 20;
\r
2734 SendMessage(hWnd, LVM_GETITEM, 0, (LPARAM)&LvItem);
\r
2736 if(strcmp(Tmp, "<DIR>") == 0)
\r
2738 else if(strcmp(Tmp, "<DRIVE>") == 0)
\r
2747 /*----- 指定位置のアイテムのイメージ番号を返す ----------------------------------------
\r
2750 * int Win : ウインドウ番号 (WIN_xxx)
\r
2756 *----------------------------------------------------------------------------*/
\r
2757 static int GetImageIndex(int Win, int Pos)
\r
2762 hWnd = GetLocalHwnd();
\r
2763 if(Win == WIN_REMOTE)
\r
2764 hWnd = GetRemoteHwnd();
\r
2767 memset(&LvItem, 0, sizeof(LV_ITEM));
\r
2768 LvItem.mask = LVIF_IMAGE;
\r
2769 LvItem.iItem = Pos;
\r
2770 LvItem.iSubItem = 0;
\r
2771 SendMessage(hWnd, LVM_GETITEM, 0, (LPARAM)&LvItem);
\r
2772 return LvItem.iImage;
\r
2776 /*----- 指定位置のアイテムのオーナ名を返す ------------------------------------
\r
2779 * int Win : ウインドウ番号 (WIN_xxx)
\r
2781 * char *Buf : オーナ名を返すバッファ
\r
2782 * int Max : バッファのサイズ
\r
2786 *----------------------------------------------------------------------------*/
\r
2788 void GetNodeOwner(int Win, int Pos, char *Buf, int Max)
\r
2793 if(Win == WIN_REMOTE)
\r
2796 memset(&LvItem, 0, sizeof(LV_ITEM));
\r
2797 LvItem.mask = LVIF_TEXT;
\r
2798 LvItem.iItem = Pos;
\r
2799 LvItem.iSubItem = 5;
\r
2800 LvItem.pszText = Buf;
\r
2801 LvItem.cchTextMax = Max;
\r
2802 SendMessage(GetRemoteHwnd(), LVM_GETITEM, 0, (LPARAM)&LvItem);
\r
2808 /*----- ホスト側のファイル一覧ウインドウをクリア ------------------------------
\r
2815 *----------------------------------------------------------------------------*/
\r
2817 void EraseRemoteDirForWnd(void)
\r
2819 SendMessage(GetRemoteHwnd(), LVM_DELETEALLITEMS, 0, 0);
\r
2820 SendMessage(GetRemoteHistHwnd(), CB_RESETCONTENT, 0, 0);
\r
2825 /*----- 選択されているファイルの総サイズを返す --------------------------------
\r
2828 * int Win : ウインドウ番号 (WIN_xxx)
\r
2832 *----------------------------------------------------------------------------*/
\r
2834 double GetSelectedTotalSize(int Win)
\r
2841 if(GetSelectedCount(Win) > 0)
\r
2843 Pos = GetFirstSelected(Win, NO);
\r
2846 GetNodeSize(Win, Pos, &Size);
\r
2849 Pos = GetNextSelected(Win, Pos, NO);
\r
2857 /*===================================================================
\r
2859 ===================================================================*/
\r
2863 /*----- ファイル一覧で選ばれているファイルをリストに登録する ------------------
\r
2866 * int Win : ウインドウ番号 (WIN_xxx)
\r
2867 * int Expand : サブディレクトリを展開する (YES/NO)
\r
2868 * int All : 選ばれていないものもすべて登録する (YES/NO)
\r
2869 * FILELIST **Base : ファイルリストの先頭
\r
2873 *----------------------------------------------------------------------------*/
\r
2876 //void MakeSelectedFileList(int Win, int Expand, int All, FILELIST **Base, int *CancelCheckWork)
\r
2877 int MakeSelectedFileList(int Win, int Expand, int All, FILELIST **Base, int *CancelCheckWork)
\r
2882 char Name[FMAX_PATH+1];
\r
2883 char Cur[FMAX_PATH+1];
\r
2890 Sts = FFFTP_SUCCESS;
\r
2891 if((All == YES) || (GetSelectedCount(Win) > 0))
\r
2893 /*===== カレントディレクトリのファイル =====*/
\r
2895 Pos = GetFirstSelected(Win, All);
\r
2898 Node = GetNodeType(Win, Pos);
\r
2899 if((Node == NODE_FILE) ||
\r
2900 ((Expand == NO) && (Node == NODE_DIR)))
\r
2903 memset(&Pkt, 0, sizeof(FILELIST));
\r
2905 Pkt.InfoExist = 0;
\r
2906 GetNodeName(Win, Pos, Pkt.File, FMAX_PATH);
\r
2907 if(GetNodeSize(Win, Pos, &Pkt.Size) == YES)
\r
2908 Pkt.InfoExist |= FINFO_SIZE;
\r
2909 if(GetNodeAttr(Win, Pos, &Pkt.Attr) == YES)
\r
2910 Pkt.InfoExist |= FINFO_ATTR;
\r
2911 if(GetNodeTime(Win, Pos, &Pkt.Time) == YES)
\r
2912 Pkt.InfoExist |= (FINFO_TIME | FINFO_DATE);
\r
2916 if((DispIgnoreHide == YES) && (Win == WIN_LOCAL))
\r
2918 AskLocalCurDir(Cur, FMAX_PATH);
\r
2920 strcat(Cur, Pkt.File);
\r
2921 Attr = GetFileAttributes(Cur);
\r
2922 if((Attr != 0xFFFFFFFF) && (Attr & FILE_ATTRIBUTE_HIDDEN))
\r
2927 AddFileList(&Pkt, Base);
\r
2929 Pos = GetNextSelected(Win, Pos, All);
\r
2934 /*===== ディレクトリツリー =====*/
\r
2936 Pos = GetFirstSelected(Win, All);
\r
2939 if(GetNodeType(Win, Pos) == NODE_DIR)
\r
2942 memset(&Pkt, 0, sizeof(FILELIST));
\r
2944 GetNodeName(Win, Pos, Name, FMAX_PATH);
\r
2945 strcpy(Pkt.File, Name);
\r
2946 ReplaceAll(Pkt.File, '\\', '/');
\r
2950 if((DispIgnoreHide == YES) && (Win == WIN_LOCAL))
\r
2952 AskLocalCurDir(Cur, FMAX_PATH);
\r
2954 strcat(Cur, Pkt.File);
\r
2955 ReplaceAll(Cur, '/', '\\');
\r
2956 Attr = GetFileAttributes(Cur);
\r
2957 if((Attr != 0xFFFFFFFF) && (Attr & FILE_ATTRIBUTE_HIDDEN))
\r
2963 // Pkt.Node = NODE_DIR;
\r
2964 if(GetImageIndex(Win, Pos) == 4) // symlink
\r
2965 Pkt.Node = NODE_FILE;
\r
2967 Pkt.Node = NODE_DIR;
\r
2970 memset(&Pkt.Time, 0, sizeof(FILETIME));
\r
2971 AddFileList(&Pkt, Base);
\r
2973 // if(Win == WIN_LOCAL)
\r
2974 // MakeLocalTree(Name, Base);
\r
2977 // AskRemoteCurDir(Cur, FMAX_PATH);
\r
2979 // if((AskListCmdMode() == NO) &&
\r
2980 // (AskUseNLST_R() == YES))
\r
2981 // MakeRemoteTree1(Name, Cur, Base, CancelCheckWork);
\r
2983 // MakeRemoteTree2(Name, Cur, Base, CancelCheckWork);
\r
2985 if(GetImageIndex(Win, Pos) != 4) { // symlink
\r
2986 if(Win == WIN_LOCAL)
\r
2988 // MakeLocalTree(Name, Base);
\r
2990 if(MakeLocalTree(Name, Base) == FFFTP_FAIL)
\r
2995 AskRemoteCurDir(Cur, FMAX_PATH);
\r
2997 if((AskListCmdMode() == NO) &&
\r
2998 (AskUseNLST_R() == YES))
\r
3000 // MakeRemoteTree1(Name, Cur, Base, CancelCheckWork);
\r
3002 if(MakeRemoteTree1(Name, Cur, Base, CancelCheckWork) == FFFTP_FAIL)
\r
3007 // MakeRemoteTree2(Name, Cur, Base, CancelCheckWork);
\r
3009 if(MakeRemoteTree2(Name, Cur, Base, CancelCheckWork) == FFFTP_FAIL)
\r
3013 //DispListList(*Base, "LIST");
\r
3019 Pos = GetNextSelected(Win, Pos, All);
\r
3030 /* ファイルリストの内容を表示 */
\r
3031 static void DispListList(FILELIST *Pos, char *Title)
\r
3033 DoPrintf("############ %s ############", Title);
\r
3034 while(Pos != NULL)
\r
3036 DoPrintf("%d %s", Pos->Node, Pos->File);
\r
3039 DoPrintf("############ END ############");
\r
3044 /*----- Drag&Dropされたファイルをリストに登録する -----------------------------
\r
3047 * WPARAM wParam : ドロップされたファイルの情報
\r
3048 * char *Cur : カレントディレクトリを返すバッファ
\r
3049 * FILELIST **Base : ファイルリストの先頭
\r
3053 *----------------------------------------------------------------------------*/
\r
3055 void MakeDroppedFileList(WPARAM wParam, char *Cur, FILELIST **Base)
\r
3059 char Name[FMAX_PATH+1];
\r
3060 char Tmp[FMAX_PATH+1];
\r
3063 WIN32_FIND_DATA Find;
\r
3065 SYSTEMTIME TmpStime;
\r
3067 Max = DragQueryFile((HDROP)wParam, 0xFFFFFFFF, NULL, 0);
\r
3069 DragQueryFile((HDROP)wParam, 0, Cur, FMAX_PATH);
\r
3072 for(i = 0; i < Max; i++)
\r
3074 DragQueryFile((HDROP)wParam, i, Name, FMAX_PATH);
\r
3076 if((GetFileAttributes(Name) & FILE_ATTRIBUTE_DIRECTORY) == 0)
\r
3079 memset(&Pkt, 0, sizeof(FILELIST));
\r
3081 Pkt.Node = NODE_FILE;
\r
3082 strcpy(Pkt.File, GetFileName(Name));
\r
3084 memset(&Pkt.Time, 0, sizeof(FILETIME));
\r
3085 #if defined(HAVE_TANDEM)
\r
3086 /* Guardian スペースへのアップロードのためにサイズが必要 */
\r
3088 Pkt.InfoExist = 0;
\r
3090 if((fHnd = FindFirstFile(Name, &Find)) != INVALID_HANDLE_VALUE)
\r
3093 Pkt.Time = Find.ftLastWriteTime;
\r
3095 if(FileTimeToSystemTime(&Pkt.Time, &TmpStime))
\r
3097 if(DispTimeSeconds == NO)
\r
3098 TmpStime.wSecond = 0;
\r
3099 TmpStime.wMilliseconds = 0;
\r
3100 SystemTimeToFileTime(&TmpStime, &Pkt.Time);
\r
3103 memset(&Pkt.Time, 0, sizeof(FILETIME));
\r
3104 #if defined(HAVE_TANDEM)
\r
3105 Pkt.Size = MakeLongLong(Find.nFileSizeHigh, Find.nFileSizeLow);
\r
3106 Pkt.InfoExist |= (FINFO_TIME | FINFO_DATE | FINFO_SIZE);
\r
3109 AddFileList(&Pkt, Base);
\r
3113 GetCurrentDirectory(FMAX_PATH, Tmp);
\r
3114 SetCurrentDirectory(Cur);
\r
3115 for(i = 0; i < Max; i++)
\r
3117 DragQueryFile((HDROP)wParam, i, Name, FMAX_PATH);
\r
3119 if(GetFileAttributes(Name) & FILE_ATTRIBUTE_DIRECTORY)
\r
3122 memset(&Pkt, 0, sizeof(FILELIST));
\r
3124 Pkt.Node = NODE_DIR;
\r
3125 strcpy(Pkt.File, GetFileName(Name));
\r
3126 AddFileList(&Pkt, Base);
\r
3128 MakeLocalTree(Pkt.File, Base);
\r
3131 SetCurrentDirectory(Tmp);
\r
3133 DragFinish((HDROP)wParam);
\r
3139 /*----- Drag&Dropされたファイルがあるフォルダを取得する -----------------------
\r
3142 * WPARAM wParam : ドロップされたファイルの情報
\r
3143 * char *Cur : カレントディレクトリを返すバッファ
\r
3147 *----------------------------------------------------------------------------*/
\r
3149 void MakeDroppedDir(WPARAM wParam, char *Cur)
\r
3153 Max = DragQueryFile((HDROP)wParam, 0xFFFFFFFF, NULL, 0);
\r
3154 DragQueryFile((HDROP)wParam, 0, Cur, FMAX_PATH);
\r
3156 DragFinish((HDROP)wParam);
\r
3162 /*----- ホスト側のサブディレクトリ以下のファイルをリストに登録する(1)-------
\r
3165 * char *Path : パス名
\r
3166 * char *Cur : カレントディレクトリ
\r
3167 * FILELIST **Base : ファイルリストの先頭
\r
3174 *----------------------------------------------------------------------------*/
\r
3177 //static void MakeRemoteTree1(char *Path, char *Cur, FILELIST **Base, int *CancelCheckWork)
\r
3178 static int MakeRemoteTree1(char *Path, char *Cur, FILELIST **Base, int *CancelCheckWork)
\r
3186 if(DoCWD(Path, NO, NO, NO) == FTP_COMPLETE)
\r
3188 /* サブフォルダも含めたリストを取得 */
\r
3189 Sts = DoDirListCmdSkt("R", "", 999, CancelCheckWork); /* NLST -alLR*/
\r
3190 DoCWD(Cur, NO, NO, NO);
\r
3192 if(Sts == FTP_COMPLETE)
\r
3194 // AddRemoteTreeToFileList(999, Path, RDIR_NLST, Base);
\r
3196 AddRemoteTreeToFileList(999, Path, RDIR_NLST, Base);
\r
3197 Ret = FFFTP_SUCCESS;
\r
3206 /*----- ホスト側のサブディレクトリ以下のファイルをリストに登録する(2)-------
\r
3209 * char *Path : パス名
\r
3210 * char *Cur : カレントディレクトリ
\r
3211 * FILELIST **Base : ファイルリストの先頭
\r
3217 * 各フォルダに移動してリストを取得
\r
3218 *----------------------------------------------------------------------------*/
\r
3221 //static void MakeRemoteTree2(char *Path, char *Cur, FILELIST **Base, int *CancelCheckWork)
\r
3222 static int MakeRemoteTree2(char *Path, char *Cur, FILELIST **Base, int *CancelCheckWork)
\r
3227 FILELIST *CurList;
\r
3233 /* VAX VMS は CWD xxx/yyy という指定ができないので */
\r
3234 /* CWD xxx, Cwd yyy と複数に分ける */
\r
3235 if(AskHostType() != HTYPE_VMS)
\r
3236 Sts = DoCWD(Path, NO, NO, NO);
\r
3239 #if defined(HAVE_OPENVMS)
\r
3240 /* OpenVMSの場合、ディレクトリ移動時は"HOGE.DIR;1"を"HOGE"にする */
\r
3241 ReformVMSDirName(Path, TRUE);
\r
3243 Sts = DoCWDStepByStep(Path, Cur);
\r
3246 if(Sts == FTP_COMPLETE)
\r
3248 Sts = DoDirListCmdSkt("", "", 999, CancelCheckWork); /* NLST -alL*/
\r
3249 DoCWD(Cur, NO, NO, NO);
\r
3251 if(Sts == FTP_COMPLETE)
\r
3254 AddRemoteTreeToFileList(999, Path, RDIR_CWD, &CurList);
\r
3255 CopyTmpListToFileList(Base, CurList);
\r
3258 Ret = FFFTP_SUCCESS;
\r
3261 while(Pos != NULL)
\r
3263 if(Pos->Node == NODE_DIR)
\r
3266 memset(&Pkt, 0, sizeof(FILELIST));
\r
3268 /* まずディレクトリ名をセット */
\r
3269 strcpy(Pkt.File, Pos->File);
\r
3270 // Pkt.Node = NODE_DIR;
\r
3271 Pkt.Link = Pos->Link;
\r
3272 if(Pkt.Link == YES)
\r
3273 Pkt.Node = NODE_FILE;
\r
3275 Pkt.Node = NODE_DIR;
\r
3278 memset(&Pkt.Time, 0, sizeof(FILETIME));
\r
3279 AddFileList(&Pkt, Base);
\r
3281 /* そのディレクトリの中を検索 */
\r
3282 // MakeRemoteTree2(Pos->File, Cur, Base, CancelCheckWork);
\r
3283 if(Pkt.Link == NO)
\r
3285 // MakeRemoteTree2(Pos->File, Cur, Base, CancelCheckWork);
\r
3287 if(MakeRemoteTree2(Pos->File, Cur, Base, CancelCheckWork) == FFFTP_FAIL)
\r
3293 DeleteFileList(&CurList);
\r
3302 /*----- ファイルリストの内容を別のファイルリストにコピー ----------------------
\r
3305 * FILELIST **Base : コピー先
\r
3306 * FILELIST *List : コピー元
\r
3312 * コピーするのはファイルの情報だけ
\r
3313 * ディレクトリの情報はコピーしない
\r
3314 *----------------------------------------------------------------------------*/
\r
3316 static void CopyTmpListToFileList(FILELIST **Base, FILELIST *List)
\r
3318 while(List != NULL)
\r
3320 if(List->Node == NODE_FILE)
\r
3321 AddFileList(List, Base);
\r
3323 List = List->Next;
\r
3329 /*----- ホスト側のファイル情報をファイルリストに登録 --------------------------
\r
3332 * int Num : テンポラリファイルのファイル名番号 (_ffftp.???)
\r
3333 * char *Path : パス名
\r
3334 * int IncDir : 再帰検索の方法 (RDIR_xxx)
\r
3335 * FILELIST **Base : ファイルリストの先頭
\r
3339 *----------------------------------------------------------------------------*/
\r
3341 void AddRemoteTreeToFileList(int Num, char *Path, int IncDir, FILELIST **Base)
\r
3343 char Str[FMAX_PATH+1];
\r
3344 char Dir[FMAX_PATH+1];
\r
3345 char Name[FMAX_PATH+1];
\r
3353 char Owner[OWNER_NAME_LEN+1];
\r
3357 MakeCacheFileName(Num, Str);
\r
3358 if((fd = fopen(Str, "rb")) != NULL)
\r
3360 strcpy(Dir, Path);
\r
3362 ListType = LIST_UNKNOWN;
\r
3365 // while(GetListOneLine(Str, FMAX_PATH, fd) == FFFTP_SUCCESS)
\r
3366 while(GetListOneLine(Str, FMAX_PATH, fd, YES) == FFFTP_SUCCESS)
\r
3368 if((ListType = AnalyzeFileInfo(Str)) == LIST_UNKNOWN)
\r
3370 if(MakeDirPath(Str, ListType, Path, Dir) == FFFTP_SUCCESS)
\r
3372 if(IncDir == RDIR_NLST)
\r
3375 memset(&Pkt, 0, sizeof(FILELIST));
\r
3377 strcpy(Pkt.File, Dir);
\r
3378 Pkt.Node = NODE_DIR;
\r
3381 memset(&Pkt.Time, 0, sizeof(FILETIME));
\r
3382 AddFileList(&Pkt, Base);
\r
3388 Node = ResolveFileInfo(Str, ListType, Name, &Size, &Time, &Attr, Owner, &Link, &InfoExist);
\r
3390 if(AskFilterStr(Name, Node) == YES)
\r
3392 if((Node == NODE_FILE) ||
\r
3393 ((IncDir == RDIR_CWD) && (Node == NODE_DIR)))
\r
3396 memset(&Pkt, 0, sizeof(FILELIST));
\r
3398 strcpy(Pkt.File, Dir);
\r
3399 if(strlen(Pkt.File) > 0)
\r
3400 SetSlashTail(Pkt.File);
\r
3401 strcat(Pkt.File, Name);
\r
3407 Pkt.InfoExist = InfoExist;
\r
3408 AddFileList(&Pkt, Base);
\r
3419 /*----- ファイル一覧情報の1行を取得 ------------------------------------------
\r
3422 * char *Buf : 1行の情報をセットするバッファ
\r
3424 * FILE *Fd : ストリーム
\r
3427 * int ステータス (FFFTP_SUCCESS/FFFTP_FAIL)
\r
3430 * VAX VMS以外の時は fgets(Buf, Max, Fd) と同じ
\r
3431 * Vax VMSの時は、複数行のファイル情報を1行にまとめる
\r
3432 *----------------------------------------------------------------------------*/
\r
3435 //static int GetListOneLine(char *Buf, int Max, FILE *Fd)
\r
3436 static int GetListOneLine(char *Buf, int Max, FILE *Fd, int Convert)
\r
3438 char Tmp[FMAX_PATH+1];
\r
3442 while((Sts == FFFTP_FAIL) && (fgets(Buf, Max, Fd) != NULL))
\r
3444 Sts = FFFTP_SUCCESS;
\r
3446 if(Convert == YES)
\r
3447 ChangeFnameRemote2Local(Buf, Max);
\r
3448 RemoveReturnCode(Buf);
\r
3449 ReplaceAll(Buf, '\x08', ' ');
\r
3451 /* VAX VMSではファイル情報が複数行にわかれている */
\r
3453 if(AskHostType() == HTYPE_VMS)
\r
3455 if(strchr(Buf, ';') == NULL) /* ファイル名以外の行 */
\r
3459 Max -= strlen(Buf);
\r
3460 while(strchr(Buf, ')') == NULL)
\r
3462 if(fgets(Tmp, FMAX_PATH, Fd) != NULL)
\r
3464 RemoveReturnCode(Tmp);
\r
3465 ReplaceAll(Buf, '\x08', ' ');
\r
3466 if((int)strlen(Tmp) > Max)
\r
3468 Max -= strlen(Tmp);
\r
3478 // DoPrintf("List : %s", Buf);
\r
3484 /*----- サブディレクトリ情報の解析 --------------------------------------------
\r
3487 * char *Str : ファイル情報(1行)
\r
3488 * int ListType : リストのタイプ
\r
3489 * char *Path : 先頭からのパス名
\r
3490 * char *Dir : ディレクトリ名
\r
3494 * FFFTP_SUCCESS/FFFTP_FAIL=ディレクトリ情報でない
\r
3495 *----------------------------------------------------------------------------*/
\r
3497 static int MakeDirPath(char *Str, int ListType, char *Path, char *Dir)
\r
3505 case LIST_ACOS_4 :
\r
3509 if(*(Str + strlen(Str) - 1) == ':') /* 最後が : ならサブディレクトリ */
\r
3511 if(strcmp(Str, ".:") != 0)
\r
3513 if((strncmp(Str, "./", 2) == 0) ||
\r
3514 (strncmp(Str, ".\\", 2) == 0))
\r
3519 if(strlen(Str) > 1)
\r
3521 strcpy(Dir, Path);
\r
3522 SetSlashTail(Dir);
\r
3524 *(Dir + strlen(Dir) - 1) = NUL;
\r
3527 // ChangeFnameRemote2Local(Dir, FMAX_PATH);
\r
3529 ReplaceAll(Dir, '\\', '/');
\r
3532 Sts = FFFTP_SUCCESS;
\r
3540 /*----- ローカル側のサブディレクトリ以下のファイルをリストに登録する ----------
\r
3543 * char *Path : パス名
\r
3544 * FILELIST **Base : ファイルリストの先頭
\r
3548 *----------------------------------------------------------------------------*/
\r
3551 //static void MakeLocalTree(char *Path, FILELIST **Base)
\r
3552 static int MakeLocalTree(char *Path, FILELIST **Base)
\r
3556 char Src[FMAX_PATH+1];
\r
3558 WIN32_FIND_DATA FindBuf;
\r
3560 SYSTEMTIME TmpStime;
\r
3565 strcpy(Src, Path);
\r
3568 ReplaceAll(Src, '/', '\\');
\r
3570 if((fHnd = FindFirstFileAttr(Src, &FindBuf, DispIgnoreHide)) != INVALID_HANDLE_VALUE)
\r
3574 if((FindBuf.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == 0)
\r
3576 if(AskFilterStr(FindBuf.cFileName, NODE_FILE) == YES)
\r
3579 memset(&Pkt, 0, sizeof(FILELIST));
\r
3581 strcpy(Pkt.File, Path);
\r
3582 SetSlashTail(Pkt.File);
\r
3583 strcat(Pkt.File, FindBuf.cFileName);
\r
3584 ReplaceAll(Pkt.File, '\\', '/');
\r
3585 Pkt.Node = NODE_FILE;
\r
3586 Pkt.Size = MakeLongLong(FindBuf.nFileSizeHigh, FindBuf.nFileSizeLow);
\r
3588 Pkt.Time = FindBuf.ftLastWriteTime;
\r
3590 // FileTimeToSystemTime(&Pkt.Time, &TmpStime);
\r
3591 // TmpStime.wSecond = 0;
\r
3592 // SystemTimeToFileTime(&TmpStime, &Pkt.Time);
\r
3593 if(FileTimeToSystemTime(&Pkt.Time, &TmpStime))
\r
3595 if(DispTimeSeconds == NO)
\r
3596 TmpStime.wSecond = 0;
\r
3597 TmpStime.wMilliseconds = 0;
\r
3598 SystemTimeToFileTime(&TmpStime, &Pkt.Time);
\r
3601 memset(&Pkt.Time, 0, sizeof(FILETIME));
\r
3602 AddFileList(&Pkt, Base);
\r
3606 while(FindNextFileAttr(fHnd, &FindBuf, DispIgnoreHide) == TRUE);
\r
3610 if((fHnd = FindFirstFileAttr(Src, &FindBuf, DispIgnoreHide)) != INVALID_HANDLE_VALUE)
\r
3613 Sts = FFFTP_SUCCESS;
\r
3616 if((FindBuf.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) &&
\r
3617 (strcmp(FindBuf.cFileName, ".") != 0) &&
\r
3618 (strcmp(FindBuf.cFileName, "..") != 0))
\r
3621 memset(&Pkt, 0, sizeof(FILELIST));
\r
3623 strcpy(Src, Path);
\r
3625 strcat(Src, FindBuf.cFileName);
\r
3626 strcpy(Pkt.File, Src);
\r
3627 ReplaceAll(Pkt.File, '\\', '/');
\r
3628 Pkt.Node = NODE_DIR;
\r
3631 memset(&Pkt.Time, 0, sizeof(FILETIME));
\r
3632 AddFileList(&Pkt, Base);
\r
3635 // MakeLocalTree(Src, Base);
\r
3636 if(MakeLocalTree(Src, Base) == FFFTP_FAIL)
\r
3640 while(FindNextFileAttr(fHnd, &FindBuf, DispIgnoreHide) == TRUE);
\r
3649 /*----- ファイルリストに情報を登録する ----------------------------------------
\r
3652 * FILELIST *Pkt : 登録するファイル情報
\r
3653 * FILELIST **Base : ファイルリストの先頭
\r
3657 *----------------------------------------------------------------------------*/
\r
3659 static void AddFileList(FILELIST *Pkt, FILELIST **Base)
\r
3664 DoPrintf("FileList : NODE=%d : %s", Pkt->Node, Pkt->File);
\r
3668 while(Pos != NULL)
\r
3670 if(strcmp(Pkt->File, Pos->File) == 0)
\r
3672 DoPrintf(" --> Duplicate!!");
\r
3679 if(Pos == NULL) /* 重複していないので登録する */
\r
3681 if((Pos = malloc(sizeof(FILELIST))) != NULL)
\r
3683 memcpy(Pos, Pkt, sizeof(FILELIST));
\r
3696 /*----- ファイルリストをクリアする --------------------------------------------
\r
3699 * FILELIST **Base : ファイルリストの先頭
\r
3703 *----------------------------------------------------------------------------*/
\r
3705 void DeleteFileList(FILELIST **Base)
\r
3711 while(New != NULL)
\r
3722 /*----- ファイルリストに指定のファイルがあるかチェック ------------------------
\r
3725 * char *Fname : ファイル名
\r
3726 * FILELIST *Base : ファイルリストの先頭
\r
3727 * int Caps : 大文字/小文字の区別モード (COMP_xxx)
\r
3730 * FILELIST *見つかったファイルリストのデータ
\r
3732 *----------------------------------------------------------------------------*/
\r
3734 FILELIST *SearchFileList(char *Fname, FILELIST *Base, int Caps)
\r
3736 char Tmp[FMAX_PATH+1];
\r
3738 while(Base != NULL)
\r
3740 if(Caps == COMP_STRICT)
\r
3742 if(_mbscmp(Fname, Base->File) == 0)
\r
3747 if(_mbsicmp(Fname, Base->File) == 0)
\r
3749 if(Caps == COMP_IGNORE)
\r
3753 strcpy(Tmp, Base->File);
\r
3755 if(_mbscmp(Tmp, Base->File) == 0)
\r
3760 Base = Base->Next;
\r
3766 /*----- ファイル情報からリストタイプを求める ----------------------------------
\r
3769 * char *Str : ファイル情報(1行)
\r
3772 * int リストタイプ (LIST_xxx)
\r
3773 *----------------------------------------------------------------------------*/
\r
3775 static int AnalyzeFileInfo(char *Str)
\r
3778 char Tmp[FMAX_PATH+1];
\r
3785 //DoPrintf("LIST : %s", Str);
\r
3787 Ret = LIST_UNKNOWN;
\r
3788 Flag1 = AskHostType();
\r
3789 if(Flag1 == HTYPE_ACOS)
\r
3791 else if(Flag1 == HTYPE_ACOS_4)
\r
3792 Ret = LIST_ACOS_4;
\r
3793 else if(Flag1 == HTYPE_VMS)
\r
3795 else if(Flag1 == HTYPE_IRMX)
\r
3797 else if(Flag1 == HTYPE_STRATUS)
\r
3798 Ret = LIST_STRATUS;
\r
3799 else if(Flag1 == HTYPE_AGILENT)
\r
3800 Ret = LIST_AGILENT;
\r
3801 else if(Flag1 == HTYPE_SHIBASOKU)
\r
3802 Ret = LIST_SHIBASOKU;
\r
3806 if(FindField(Str, Tmp, 0, NO) == FFFTP_SUCCESS)
\r
3809 if(strstr(Tmp, "type=") != NULL)
\r
3811 if(FindField2(Str, Tmp, ';', 1, NO) == FFFTP_SUCCESS && FindField2(Str, Tmp, '=', 1, NO) == FFFTP_SUCCESS)
\r
3818 /* 以下のフォーマットをチェック */
\r
3819 /* LIST_UNIX_10, LIST_UNIX_20, LIST_UNIX_12, LIST_UNIX_22, LIST_UNIX_50, LIST_UNIX_60 */
\r
3823 // if(FindField(Str, Tmp, 0, NO) == FFFTP_SUCCESS)
\r
3824 if(Ret == LIST_UNKNOWN && FindField(Str, Tmp, 0, NO) == FFFTP_SUCCESS)
\r
3826 /* MELCOM80は "d rwxrwxrwx" のようにスペースが空いている */
\r
3828 if((strlen(Tmp) == 1) && (strchr("-dDlL", Tmp[0]) != NULL))
\r
3830 if(FindField(Str, Tmp, 1, NO) == FFFTP_SUCCESS)
\r
3832 if((strlen(Tmp) == 9) ||
\r
3833 ((strlen(Tmp) > 9) && (IsDigit(Tmp[9]) != 0)))
\r
3835 memmove(Str+1, Str+2, strlen(Str+2)+1);
\r
3836 FindField(Str, Tmp, 0, NO);
\r
3843 // if(strlen(Tmp) >= 10)
\r
3844 if((strlen(Tmp) >= 10) && (strchr("+-dfl", Tmp[0]) != NULL))
\r
3847 if((strlen(Tmp) > 10) && (IsDigit(Tmp[10]) != 0))
\r
3850 /* drwxr-xr-x1234 owner group 1024 Nov 6 14:21 Linux/ */
\r
3855 // LIST_UNIX_60 support
\r
3856 if(FindField(Str, Tmp, 7+Add1, NO) == FFFTP_SUCCESS)
\r
3858 GetMonth(Tmp, &Month, &Day);
\r
3861 Ret = CheckUnixType(Str, Tmp, Add1, 2, Day);
\r
3867 // LIST_UNIX_12 support
\r
3868 if((Ret == LIST_UNKNOWN) &&
\r
3869 (FindField(Str, Tmp, 6+Add1, NO) == FFFTP_SUCCESS))
\r
3871 GetMonth(Tmp, &Month, &Day);
\r
3874 Ret = CheckUnixType(Str, Tmp, Add1, 0, Day);
\r
3877 //////////////////
\r
3880 // LIST_UNIX_70 support
\r
3881 if((Ret == LIST_UNKNOWN) &&
\r
3882 (FindField(Str, Tmp, 6+Add1, NO) == FFFTP_SUCCESS))
\r
3884 GetMonth(Tmp, &Month, &Day);
\r
3887 Ret = CheckUnixType(Str, Tmp, Add1, 1, Day);
\r
3892 if((Ret == LIST_UNKNOWN) &&
\r
3893 (FindField(Str, Tmp, 5+Add1, NO) == FFFTP_SUCCESS))
\r
3895 GetMonth(Tmp, &Month, &Day);
\r
3898 Ret = CheckUnixType(Str, Tmp, Add1, 0, Day);
\r
3902 if((Ret == LIST_UNKNOWN) &&
\r
3903 (FindField(Str, Tmp, 4+Add1, NO) == FFFTP_SUCCESS))
\r
3905 GetMonth(Tmp, &Month, &Day);
\r
3908 Ret = CheckUnixType(Str, Tmp, Add1, -1, Day);
\r
3912 if((Ret == LIST_UNKNOWN) &&
\r
3913 (FindField(Str, Tmp, 3+Add1, NO) == FFFTP_SUCCESS))
\r
3915 GetMonth(Tmp, &Month, &Day);
\r
3918 Ret = CheckUnixType(Str, Tmp, Add1, -2, Day);
\r
3923 if((Ret == LIST_UNKNOWN) &&
\r
3924 (FindField(Str, Tmp, 7+Add1, NO) == FFFTP_SUCCESS))
\r
3926 if((FindField(Str, Tmp, 5, NO) == FFFTP_SUCCESS) &&
\r
3927 (CheckYYYYMMDDformat(Tmp, NUL) != 0))
\r
3929 if((FindField(Str, Tmp, 6, NO) == FFFTP_SUCCESS) &&
\r
3930 (CheckHHMMformat(Tmp) == YES))
\r
3932 Ret = LIST_UNIX_16;
\r
3937 if((Ret != LIST_UNKNOWN) && (Flag1 == YES))
\r
3938 Ret |= LIST_MELCOM;
\r
3941 if((Ret == LIST_UNKNOWN) &&
\r
3942 (FindField(Str, Tmp, 5+Add1, NO) == FFFTP_SUCCESS))
\r
3944 Ret = LIST_UNIX_17;
\r
3949 /* 以下のフォーマットをチェック */
\r
3952 if(Ret == LIST_UNKNOWN)
\r
3954 if((FindField(Str, Tmp, 2, NO) == FFFTP_SUCCESS) &&
\r
3955 (CheckYYMMDDformat(Tmp, NUL, NO) != 0))
\r
3957 if((FindField(Str, Tmp, 3, NO) == FFFTP_SUCCESS) &&
\r
3958 (CheckYYMMDDformat(Tmp, NUL, NO) != 0))
\r
3960 if((FindField(Str, Tmp, 1, NO) == FFFTP_SUCCESS) &&
\r
3961 (IsDigit(Tmp[0]) != 0))
\r
3963 if(FindField(Str, Tmp, 5, NO) == FFFTP_SUCCESS)
\r
3972 /* 以下のフォーマットをチェック */
\r
3975 if(Ret == LIST_UNKNOWN)
\r
3977 if((FindField(Str, Tmp, 5, NO) == FFFTP_SUCCESS) &&
\r
3978 (CheckYYMMDDformat(Tmp, '*', NO) != 0))
\r
3980 if((FindField(Str, Tmp, 2, NO) == FFFTP_SUCCESS) &&
\r
3981 ((IsDigit(Tmp[0]) != 0) || (StrAllSameChar(Tmp, '*') == YES)))
\r
3983 if((FindField(Str, Tmp, 3, NO) == FFFTP_SUCCESS) &&
\r
3984 ((IsDigit(Tmp[0]) != 0) || (StrAllSameChar(Tmp, '*') == YES)))
\r
3986 if((FindField(Str, Tmp, 0, NO) == FFFTP_SUCCESS) &&
\r
3987 (strlen(Tmp) == 4))
\r
3989 if(FindField(Str, Tmp, 6, NO) == FFFTP_SUCCESS)
\r
3999 /* 以下のフォーマットをチェック */
\r
4002 if(Ret == LIST_UNKNOWN)
\r
4004 if((FindField(Str, Tmp, 1, NO) == FFFTP_SUCCESS) &&
\r
4005 (CheckYYMMDDformat(Tmp, NUL, NO) != 0))
\r
4007 if((FindField(Str, Tmp, 2, NO) == FFFTP_SUCCESS) &&
\r
4008 (CheckYYMMDDformat(Tmp, NUL, NO) != 0))
\r
4010 if((FindField(Str, Tmp, 5, NO) == FFFTP_SUCCESS) &&
\r
4011 (IsDigit(Tmp[0]) != 0))
\r
4013 if(FindField(Str, Tmp, 6, NO) == FFFTP_SUCCESS)
\r
4015 Ret = LIST_GP6000;
\r
4022 /* 以下のフォーマットをチェック */
\r
4023 /* LIST_DOS_1, LIST_DOS_2 */
\r
4025 if(Ret == LIST_UNKNOWN)
\r
4027 if((FindField(Str, Tmp, 1, NO) == FFFTP_SUCCESS) &&
\r
4028 (CheckHHMMformat(Tmp) == YES))
\r
4030 if((FindField(Str, Tmp, 2, NO) == FFFTP_SUCCESS) &&
\r
4031 ((Tmp[0] == '<') || (IsDigit(Tmp[0]) != 0)))
\r
4033 if(FindField(Str, Tmp, 3, NO) == FFFTP_SUCCESS)
\r
4035 if((FindField(Str, Tmp, 0, NO) == FFFTP_SUCCESS) &&
\r
4036 (CheckYYMMDDformat(Tmp, NUL, YES) != 0))
\r
4038 TmpInt = atoi(Tmp);
\r
4039 if((TmpInt >= 1) && (TmpInt <= 12))
\r
4049 /* 以下のフォーマットをチェック */
\r
4052 if(Ret == LIST_UNKNOWN)
\r
4054 if((FindField(Str, Tmp, 3, NO) == FFFTP_SUCCESS) &&
\r
4055 (CheckHHMMformat(Tmp) == YES))
\r
4057 if((FindField(Str, Tmp, 1, NO) == FFFTP_SUCCESS) &&
\r
4058 ((Tmp[0] == '<') || (IsDigit(Tmp[0]) != 0)))
\r
4060 if((FindField(Str, Tmp, 2, NO) == FFFTP_SUCCESS) &&
\r
4061 (CheckYYMMDDformat(Tmp, NUL, YES) != 0))
\r
4069 /* 以下のフォーマットをチェック */
\r
4072 if(Ret == LIST_UNKNOWN)
\r
4074 if((FindField(Str, Tmp, 0, NO) == FFFTP_SUCCESS) &&
\r
4075 (CheckYYYYMMDDformat(Tmp, NUL) == YES))
\r
4077 if((FindField(Str, Tmp, 1, NO) == FFFTP_SUCCESS) &&
\r
4078 (CheckYYMMDDformat(Tmp, NUL, NO) != 0))
\r
4080 if((FindField(Str, Tmp, 2, NO) == FFFTP_SUCCESS) &&
\r
4081 ((Tmp[0] == '<') || (IsDigit(Tmp[0]) != 0)))
\r
4083 if(FindField(Str, Tmp, 3, NO) == FFFTP_SUCCESS)
\r
4092 // Windows Server 2008 R2
\r
4093 if(Ret == LIST_UNKNOWN)
\r
4095 if((FindField(Str, Tmp, 1, NO) == FFFTP_SUCCESS) &&
\r
4096 (CheckHHMMformat(Tmp) == YES))
\r
4098 if((FindField(Str, Tmp, 2, NO) == FFFTP_SUCCESS) &&
\r
4099 ((Tmp[0] == '<') || (IsDigit(Tmp[0]) != 0)))
\r
4101 if(FindField(Str, Tmp, 3, NO) == FFFTP_SUCCESS)
\r
4103 if((FindField(Str, Tmp, 0, NO) == FFFTP_SUCCESS) &&
\r
4104 (CheckMMDDYYYYformat(Tmp, NUL) != 0))
\r
4113 /* 以下のフォーマットをチェック */
\r
4114 /* LIST_CHAMELEON */
\r
4116 if(Ret == LIST_UNKNOWN)
\r
4118 if(FindField(Str, Tmp, 2, NO) == FFFTP_SUCCESS)
\r
4120 GetMonth(Tmp, &Month, &Day);
\r
4121 if((Month != 0) && (Day == 0))
\r
4123 if((FindField(Str, Tmp, 1, NO) == FFFTP_SUCCESS) &&
\r
4124 ((Tmp[0] == '<') || (IsDigit(Tmp[0]) != 0)))
\r
4126 if((FindField(Str, Tmp, 5, NO) == FFFTP_SUCCESS) &&
\r
4127 (CheckHHMMformat(Tmp) == YES))
\r
4129 Ret = LIST_CHAMELEON;
\r
4136 /* 以下のフォーマットをチェック */
\r
4139 if(Ret == LIST_UNKNOWN)
\r
4141 if((FindField(Str, Tmp, 3, NO) == FFFTP_SUCCESS) &&
\r
4142 (CheckHHMMformat(Tmp) == YES))
\r
4144 if((FindField(Str, Tmp, 0, NO) == FFFTP_SUCCESS) &&
\r
4145 (IsDigit(Tmp[0]) != 0))
\r
4147 if((FindField(Str, Tmp, 2, NO) == FFFTP_SUCCESS) &&
\r
4148 (CheckYYMMDDformat(Tmp, NUL, YES) != 0))
\r
4150 if(FindField(Str, Tmp, 4, NO) == FFFTP_SUCCESS)
\r
4159 /* 以下のフォーマットをチェック */
\r
4162 if(Ret == LIST_UNKNOWN)
\r
4164 if((FindField(Str, Tmp, 0, NO) == FFFTP_SUCCESS) &&
\r
4165 (strlen(Tmp) == 10))
\r
4167 if((FindField(Str, Tmp, 3, NO) == FFFTP_SUCCESS) &&
\r
4168 (CheckYYMMDDformat(Tmp, NUL, NO) != 0))
\r
4170 if((FindField(Str, Tmp, 4, NO) == FFFTP_SUCCESS) &&
\r
4171 (CheckYYMMDDformat(Tmp, NUL, NO) != 0))
\r
4173 if((FindField(Str, Tmp, 2, NO) == FFFTP_SUCCESS) &&
\r
4174 (IsDigit(Tmp[0]) != 0))
\r
4176 if(FindField(Str, Tmp, 5, NO) == FFFTP_SUCCESS)
\r
4183 else if((FindField(Str, Tmp, 1, NO) == FFFTP_SUCCESS) &&
\r
4184 (CheckYYMMDDformat(Tmp, NUL, NO) != 0))
\r
4186 if((FindField(Str, Tmp, 2, NO) == FFFTP_SUCCESS) &&
\r
4187 (CheckYYMMDDformat(Tmp, NUL, NO) != 0))
\r
4189 if(FindField(Str, Tmp, 3, NO) == FFFTP_SUCCESS)
\r
4198 /* 以下のフォーマットをチェック */
\r
4201 if(Ret == LIST_UNKNOWN)
\r
4203 if((FindField(Str, Tmp, 0, NO) == FFFTP_SUCCESS) &&
\r
4204 ((Tmp[0] == '<') || (IsDigit(Tmp[0]) != 0)))
\r
4206 if((FindField(Str, Tmp, 5, NO) == FFFTP_SUCCESS) &&
\r
4207 (CheckHHMMformat(Tmp) == YES))
\r
4209 if(FindField(Str, Tmp, 3, NO) == FFFTP_SUCCESS)
\r
4211 GetMonth(Tmp, &Month, &Day);
\r
4214 if((FindField(Str, Tmp, 6, NO) == FFFTP_SUCCESS) &&
\r
4215 (IsDigit(Tmp[0]) != 0))
\r
4217 Ret = LIST_ALLIED;
\r
4225 /* 以下のフォーマットをチェック */
\r
4228 if(Ret == LIST_UNKNOWN)
\r
4230 if((FindField(Str, Tmp, 1, NO) == FFFTP_SUCCESS) &&
\r
4231 (CheckYYMMDDformat(Tmp, NUL, NO) != 0))
\r
4233 if((FindField(Str, Tmp, 2, NO) == FFFTP_SUCCESS) &&
\r
4234 (IsDigit(Tmp[0]) != 0) && (strlen(Tmp) == 4))
\r
4236 if((FindField(Str, Tmp, 5, NO) == FFFTP_SUCCESS) &&
\r
4237 (IsDigit(Tmp[0]) != 0))
\r
4239 if(FindField(Str, Tmp, 6, NO) == FFFTP_SUCCESS)
\r
4248 /* 以下のフォーマットをチェック */
\r
4251 if(Ret == LIST_UNKNOWN)
\r
4253 if((FindField(Str, Tmp, 2, NO) == FFFTP_SUCCESS) &&
\r
4254 (CheckYYYYMMDDformat(Tmp, NUL) == YES))
\r
4256 if((FindField(Str, Tmp, 1, NO) == FFFTP_SUCCESS) && IsDigit(Tmp[0]))
\r
4258 if((FindField(Str, Tmp, 7, NO) == FFFTP_SUCCESS) && IsDigit(Tmp[0]))
\r
4260 if(FindField(Str, Tmp, 9, NO) == FFFTP_SUCCESS)
\r
4268 #if defined(HAVE_TANDEM)
\r
4269 /* 以下のフォーマットをチェック */
\r
4272 /* OSS の場合は自動判別可能のため Ret == LIST_UNKNOWN のチェックは後 */
\r
4273 if(AskRealHostType() == HTYPE_TANDEM) {
\r
4274 if(Ret == LIST_UNKNOWN) {
\r
4276 Ret = LIST_TANDEM;
\r
4285 DoPrintf("ListType=%d", Ret);
\r
4291 /*----- UNIX系リストタイプのチェックを行なう ----------------------------------
\r
4294 * char *Str : ファイル情報(1行)
\r
4295 * char *Tmp : 一時ワーク
\r
4296 * int Add1 : 加算パラメータ1
\r
4297 * int Add2 : 加算パラメータ2
\r
4298 * int Day : 日 (0=ここで取得する)
\r
4301 * int リストタイプ (LIST_xxx)
\r
4302 *----------------------------------------------------------------------------*/
\r
4304 static int CheckUnixType(char *Str, char *Tmp, int Add1, int Add2, int Day)
\r
4313 Ret = LIST_UNKNOWN;
\r
4323 ((FindField(Str, Tmp, 6+Add1+Add2+Add3, NO) == FFFTP_SUCCESS) &&
\r
4324 ((atoi(Tmp) >= 1) && (atoi(Tmp) <= 31))))
\r
4326 if((FindField(Str, Tmp, 7+Add1+Add2+Add3, NO) == FFFTP_SUCCESS) &&
\r
4327 ((atoi(Tmp) >= 1900) || (GetHourAndMinute(Tmp, &Hour, &Minute) == FFFTP_SUCCESS)))
\r
4329 if(FindField(Str, Tmp, 8+Add1+Add2+Add3, NO) == FFFTP_SUCCESS)
\r
4339 if((FindField(Str, Tmp, 7+Add1+Add2+Add3, NO) == FFFTP_SUCCESS) &&
\r
4340 ((atoi(Tmp) >= 1) && (atoi(Tmp) <= 31)))
\r
4342 if((FindField(Str, Tmp, 5+Add1+Add2+Add3, NO) == FFFTP_SUCCESS) &&
\r
4343 (atoi(Tmp) >= 1900))
\r
4345 if((FindField(Str, Tmp, 6+Add1+Add2+Add3, NO) == FFFTP_SUCCESS) &&
\r
4346 (((atoi(Tmp) >= 1) && (atoi(Tmp) <= 9) &&
\r
4347 ((unsigned char)Tmp[1] == 0xD4) &&
\r
4348 ((unsigned char)Tmp[2] == 0xC2)) ||
\r
4349 ((atoi(Tmp) >= 10) && (atoi(Tmp) <= 12) &&
\r
4350 ((unsigned char)Tmp[2] == 0xD4) &&
\r
4351 ((unsigned char)Tmp[3] == 0xC2))))
\r
4353 if(FindField(Str, Tmp, 8+Add1+Add2+Add3, NO) == FFFTP_SUCCESS)
\r
4366 Ret = LIST_UNIX_60;
\r
4368 Ret = LIST_UNIX_64;
\r
4370 Ret = LIST_UNIX_61;
\r
4374 Ret = LIST_UNIX_62;
\r
4376 Ret = LIST_UNIX_65;
\r
4378 Ret = LIST_UNIX_63;
\r
4381 else if(Add2 == 1)
\r
4383 Ret = LIST_UNIX_70;
\r
4385 Ret = LIST_UNIX_74;
\r
4387 Ret = LIST_UNIX_71;
\r
4391 Ret = LIST_UNIX_72;
\r
4393 Ret = LIST_UNIX_75;
\r
4395 Ret = LIST_UNIX_73;
\r
4398 else if(Add2 == 0)
\r
4400 Ret = LIST_UNIX_10;
\r
4402 Ret = LIST_UNIX_14;
\r
4404 Ret = LIST_UNIX_11;
\r
4408 Ret = LIST_UNIX_12;
\r
4410 Ret = LIST_UNIX_15;
\r
4412 Ret = LIST_UNIX_13;
\r
4415 else if(Add2 == -1)
\r
4417 Ret = LIST_UNIX_20;
\r
4419 Ret = LIST_UNIX_24;
\r
4421 Ret = LIST_UNIX_21;
\r
4425 Ret = LIST_UNIX_22;
\r
4427 Ret = LIST_UNIX_25;
\r
4429 Ret = LIST_UNIX_23;
\r
4434 Ret = LIST_UNIX_50;
\r
4436 Ret = LIST_UNIX_54;
\r
4438 Ret = LIST_UNIX_51;
\r
4445 /*----- HH:MM 形式の文字列かどうかをチェック ----------------------------------
\r
4451 * int ステータス (YES/NO)
\r
4456 * 後ろに余分な文字が付いていてもよい
\r
4457 *----------------------------------------------------------------------------*/
\r
4459 static int CheckHHMMformat(char *Str)
\r
4464 if((strlen(Str) >= 3) &&
\r
4465 (IsDigit(Str[0]) != 0))
\r
4467 if((Str = strchr(Str, ':')) != NULL)
\r
4469 if(IsDigit(*(Str+1)) != 0)
\r
4477 /*----- YY/MM/DD 形式の文字列かどうかをチェック -------------------------------
\r
4481 * char Sym : 数字の代わりに使える記号 (NUL=数字以外使えない)
\r
4482 * int Dig3 : 3桁の年を許可
\r
4487 * 1 = ??/??/??, ??/??/???
\r
4493 *----------------------------------------------------------------------------*/
\r
4495 static int CheckYYMMDDformat(char *Str, char Sym, int Dig3)
\r
4500 if((strlen(Str) == 8) &&
\r
4501 (IsDigitSym(Str[0], Sym) != 0) && (IsDigitSym(Str[1], Sym) != 0) &&
\r
4502 (IsDigit(Str[2]) == 0) &&
\r
4503 (IsDigitSym(Str[3], Sym) != 0) && (IsDigitSym(Str[4], Sym) != 0) &&
\r
4504 (IsDigit(Str[5]) == 0) &&
\r
4505 (IsDigitSym(Str[6], Sym) != 0) && (IsDigitSym(Str[7], Sym) != 0))
\r
4511 if((strlen(Str) == 9) &&
\r
4512 (IsDigitSym(Str[0], Sym) != 0) && (IsDigitSym(Str[1], Sym) != 0) && (IsDigitSym(Str[2], Sym) != 0) &&
\r
4513 (IsDigit(Str[3]) == 0) &&
\r
4514 (IsDigitSym(Str[4], Sym) != 0) && (IsDigitSym(Str[5], Sym) != 0) &&
\r
4515 (IsDigit(Str[6]) == 0) &&
\r
4516 (IsDigitSym(Str[7], Sym) != 0) && (IsDigitSym(Str[8], Sym) != 0))
\r
4520 else if((strlen(Str) == 9) &&
\r
4521 (IsDigitSym(Str[0], Sym) != 0) && (IsDigitSym(Str[1], Sym) != 0) &&
\r
4522 (IsDigit(Str[2]) == 0) &&
\r
4523 (IsDigitSym(Str[3], Sym) != 0) && (IsDigitSym(Str[4], Sym) != 0) &&
\r
4524 (IsDigit(Str[5]) == 0) &&
\r
4525 (IsDigitSym(Str[6], Sym) != 0) && (IsDigitSym(Str[7], Sym) != 0) && (IsDigitSym(Str[8], Sym) != 0))
\r
4534 /*----- YYYY/MM/DD 形式の文字列かどうかをチェック -----------------------------
\r
4538 * char Sym : 数字の代わりに使える記号 (NUL=数字以外使えない)
\r
4541 * int ステータス (YES/NO)
\r
4546 *----------------------------------------------------------------------------*/
\r
4548 static int CheckYYYYMMDDformat(char *Str, char Sym)
\r
4553 if((strlen(Str) == 10) &&
\r
4554 (IsDigitSym(Str[0], Sym) != 0) && (IsDigitSym(Str[1], Sym) != 0) &&
\r
4555 (IsDigitSym(Str[2], Sym) != 0) && (IsDigitSym(Str[3], Sym) != 0) &&
\r
4556 (IsDigit(Str[4]) == 0) &&
\r
4557 (IsDigitSym(Str[5], Sym) != 0) && (IsDigitSym(Str[6], Sym) != 0) &&
\r
4558 (IsDigit(Str[7]) == 0) &&
\r
4559 (IsDigitSym(Str[8], Sym) != 0) && (IsDigitSym(Str[9], Sym) != 0))
\r
4567 // Windows Server 2008 R2
\r
4568 static int CheckMMDDYYYYformat(char *Str, char Sym)
\r
4573 if((strlen(Str) == 10) &&
\r
4574 (IsDigitSym(Str[0], Sym) != 0) && (IsDigitSym(Str[1], Sym) != 0) &&
\r
4575 (IsDigit(Str[2]) == 0) &&
\r
4576 (IsDigitSym(Str[3], Sym) != 0) && (IsDigitSym(Str[4], Sym) != 0) &&
\r
4577 (IsDigit(Str[5]) == 0) &&
\r
4578 (IsDigitSym(Str[6], Sym) != 0) && (IsDigitSym(Str[7], Sym) != 0) &&
\r
4579 (IsDigitSym(Str[8], Sym) != 0) && (IsDigitSym(Str[9], Sym) != 0))
\r
4587 /*----- ファイル情報からファイル名、サイズなどを取り出す ----------------------
\r
4590 * char *Str : ファイル情報(1行)
\r
4591 * int ListType : リストのタイプ
\r
4592 * char *Name : ファイル名のコピー先
\r
4593 * LONGLONG *Size : サイズのコピー先
\r
4594 * FILETIME *Time : 日付のコピー先
\r
4595 * int *Attr : 属性のコピー先
\r
4596 * char *Owner : オーナ名
\r
4597 * int *Link : リンクかどうか (YES/NO)
\r
4598 * int *InfoExist : 時刻の情報があったかどうか (YES/NO)
\r
4601 * int 種類 (NODE_xxxx)
\r
4602 *----------------------------------------------------------------------------*/
\r
4604 static int ResolveFileInfo(char *Str, int ListType, char *Fname, LONGLONG *Size, FILETIME *Time, int *Attr, char *Owner, int *Link, int *InfoExist)
\r
4607 SYSTEMTIME sTimeNow;
\r
4608 char Buf[FMAX_PATH+1];
\r
4619 static const int DosPos[3][4] = { { 1, 0, 2, 3 }, { 1, 0, 2, 3 }, { 3, 2, 1, 0 } };
\r
4620 static const int DosDate[3][3][2] = { { {0, 0}, {3, 4}, {6, 7} }, { {6, 7}, {0, 0}, {3, 4} }, { {6, 7}, {0, 0}, {3, 4} } };
\r
4621 static const int DosLongFname[3] = { YES, YES, NO };
\r
4626 memset(Fname, NUL, FMAX_PATH+1);
\r
4630 memset(Owner, NUL, OWNER_NAME_LEN+1);
\r
4631 Time->dwLowDateTime = 0;
\r
4632 Time->dwHighDateTime = 0;
\r
4638 OrgListType = ListType;
\r
4639 ListType &= LIST_MASKFLG;
\r
4645 if(ListType == LIST_DOS_1)
\r
4647 else if(ListType == LIST_DOS_2)
\r
4652 *InfoExist |= (FINFO_DATE | FINFO_SIZE);
\r
4655 FindField(Str, Buf, DosPos[offs][0], NO);
\r
4656 if((Pos = strchr(Buf, ':')) != NULL)
\r
4658 *InfoExist |= FINFO_TIME;
\r
4659 sTime.wHour = atoi(Buf);
\r
4660 sTime.wMinute = atoi(Pos+1);
\r
4661 sTime.wSecond = 0;
\r
4662 sTime.wMilliseconds = 0;
\r
4664 if(strlen(Pos) >= 4)
\r
4666 if(tolower(Pos[3]) == 'a')
\r
4668 if(sTime.wHour == 12)
\r
4671 else if(tolower(Pos[3]) == 'p')
\r
4673 if(sTime.wHour != 12)
\r
4674 sTime.wHour += 12;
\r
4680 FindField(Str, Buf, DosPos[offs][1], NO);
\r
4681 if((offs2 = CheckYYMMDDformat(Buf, NUL, YES)) == 0)
\r
4684 sTime.wYear = Assume1900or2000(atoi(Buf + DosDate[offs][0][offs2]));
\r
4685 sTime.wMonth = atoi(Buf + DosDate[offs][1][offs2]);
\r
4686 sTime.wDay = atoi(Buf + DosDate[offs][2][offs2]);
\r
4687 SystemTimeToFileTime(&sTime, Time);
\r
4688 SpecificLocalFileTime2FileTime(Time, AskHostTimeZone());
\r
4691 FindField(Str, Buf, DosPos[offs][2], NO);
\r
4692 *Size = _atoi64(Buf);
\r
4695 if(FindField(Str, Fname, DosPos[offs][3], DosLongFname[offs]) == FFFTP_SUCCESS)
\r
4704 *InfoExist |= (FINFO_TIME | FINFO_DATE | FINFO_SIZE);
\r
4707 FindField(Str, Buf, 0, NO);
\r
4708 sTime.wYear = atoi(Buf);
\r
4709 sTime.wMonth = atoi(Buf+5);
\r
4710 sTime.wDay = atoi(Buf+8);
\r
4713 *InfoExist |= FINFO_TIME;
\r
4714 FindField(Str, Buf, 1, NO);
\r
4715 sTime.wHour = atoi(Buf);
\r
4716 sTime.wMinute = atoi(Buf+3);
\r
4717 sTime.wSecond = 0; // atoi(Buf+6);
\r
4718 sTime.wMilliseconds = 0;
\r
4719 SystemTimeToFileTime(&sTime, Time);
\r
4720 SpecificLocalFileTime2FileTime(Time, AskHostTimeZone());
\r
4723 FindField(Str, Buf, 2, NO);
\r
4724 *Size = _atoi64(Buf);
\r
4727 if(FindField(Str, Fname, 3, YES) == FFFTP_SUCCESS)
\r
4735 // Windows Server 2008 R2
\r
4737 *InfoExist |= (FINFO_TIME | FINFO_DATE | FINFO_SIZE);
\r
4740 FindField(Str, Buf, 0, NO);
\r
4741 sTime.wMonth = atoi(Buf);
\r
4742 sTime.wDay = atoi(Buf+3);
\r
4743 sTime.wYear = atoi(Buf+6);
\r
4746 FindField(Str, Buf, 1, NO);
\r
4747 sTime.wHour = atoi(Buf);
\r
4748 sTime.wMinute = atoi(Buf+3);
\r
4749 sTime.wSecond = 0;
\r
4750 sTime.wMilliseconds = 0;
\r
4751 if(_strnicmp(Buf+5, "AM", 2) == 0)
\r
4753 if(sTime.wHour == 12)
\r
4756 else if(_strnicmp(Buf+5, "PM", 2) == 0)
\r
4758 if(sTime.wHour != 12)
\r
4759 sTime.wHour += 12;
\r
4761 SystemTimeToFileTime(&sTime, Time);
\r
4762 SpecificLocalFileTime2FileTime(Time, AskHostTimeZone());
\r
4765 FindField(Str, Buf, 2, NO);
\r
4766 *Size = _atoi64(Buf);
\r
4769 if(FindField(Str, Fname, 3, YES) == FFFTP_SUCCESS)
\r
4778 *InfoExist |= (FINFO_DATE | FINFO_SIZE);
\r
4781 FindField(Str, Buf, 3, NO);
\r
4782 if((Pos = strchr(Buf, ':')) != NULL)
\r
4784 *InfoExist |= FINFO_TIME;
\r
4785 sTime.wHour = atoi(Buf);
\r
4786 sTime.wMinute = atoi(Pos+1);
\r
4787 sTime.wSecond = 0;
\r
4788 sTime.wMilliseconds = 0;
\r
4792 FindField(Str, Buf, 2, NO);
\r
4793 sTime.wYear = Assume1900or2000(atoi(Buf+6));
\r
4794 sTime.wMonth = atoi(Buf+0);
\r
4795 sTime.wDay = atoi(Buf+3);
\r
4796 SystemTimeToFileTime(&sTime, Time);
\r
4797 SpecificLocalFileTime2FileTime(Time, AskHostTimeZone());
\r
4800 FindField(Str, Buf, 0, NO);
\r
4801 *Size = _atoi64(Buf);
\r
4804 if(FindField(Str, Fname, 4, YES) == FFFTP_SUCCESS)
\r
4806 FindField(Str, Buf, 1, NO);
\r
4808 if(strstr(Buf, "DIR") != NULL)
\r
4813 case LIST_CHAMELEON :
\r
4814 *InfoExist |= (FINFO_TIME | FINFO_DATE | FINFO_SIZE | FINFO_ATTR);
\r
4817 FindField(Str, Buf, 6, NO);
\r
4818 strcat(Buf, "------");
\r
4819 *Attr = AttrString2Value(Buf+1);
\r
4822 FindField(Str, Buf, 2, NO);
\r
4823 GetMonth(Buf, &sTime.wMonth, &sTime.wDay); /* wDayは常に0 */
\r
4824 FindField(Str, Buf, 3, NO);
\r
4825 sTime.wDay = atoi(Buf);
\r
4826 FindField(Str, Buf, 4, NO);
\r
4827 sTime.wYear = atoi(Buf);
\r
4830 FindField(Str, Buf, 5, NO);
\r
4831 sTime.wHour = atoi(Buf);
\r
4832 sTime.wMinute = atoi(Buf+3);
\r
4833 sTime.wSecond = 0;
\r
4834 sTime.wMilliseconds = 0;
\r
4835 SystemTimeToFileTime(&sTime, Time);
\r
4836 SpecificLocalFileTime2FileTime(Time, AskHostTimeZone());
\r
4839 FindField(Str, Buf, 1, NO);
\r
4840 *Size = _atoi64(Buf);
\r
4843 if(FindField(Str, Fname, 0, NO) == FFFTP_SUCCESS)
\r
4852 *InfoExist |= (FINFO_TIME | FINFO_DATE | FINFO_SIZE);
\r
4855 FindField(Str, Buf, 0, NO);
\r
4856 strncpy(Owner, Buf, OWNER_NAME_LEN);
\r
4859 FindField(Str, Buf, 3, NO);
\r
4860 sTime.wHour = atoi(Buf);
\r
4861 sTime.wMinute = atoi(Buf+3);
\r
4862 sTime.wSecond = 0;
\r
4863 sTime.wMilliseconds = 0;
\r
4866 FindField(Str, Buf, 2, NO);
\r
4867 sTime.wYear = Assume1900or2000(atoi(Buf));
\r
4868 sTime.wMonth = atoi(Buf + 3);
\r
4869 sTime.wDay = atoi(Buf + 6);
\r
4870 SystemTimeToFileTime(&sTime, Time);
\r
4871 SpecificLocalFileTime2FileTime(Time, AskHostTimeZone());
\r
4874 FindField(Str, Buf, 1, NO);
\r
4875 *Size = _atoi64(Buf);
\r
4878 if(FindField(Str, Fname, 5, YES) == FFFTP_SUCCESS)
\r
4881 if((Pos = strchr(Fname, '/')) != NULL)
\r
4890 *InfoExist |= FINFO_ATTR;
\r
4893 FindField(Str, Buf, 0, NO);
\r
4894 strcat(Buf, "------");
\r
4895 *Attr = AttrString2Value(Buf+1);
\r
4898 Time->dwLowDateTime = 0;
\r
4899 Time->dwHighDateTime = 0;
\r
4900 FindField(Str, Buf, 5, NO);
\r
4903 *InfoExist |= FINFO_DATE;
\r
4905 sTime.wMinute = 0;
\r
4906 sTime.wSecond = 0;
\r
4907 sTime.wMilliseconds = 0;
\r
4909 sTime.wYear = Assume1900or2000(atoi(Buf));
\r
4910 sTime.wMonth = atoi(Buf + 3);
\r
4911 sTime.wDay = atoi(Buf + 6);
\r
4912 SystemTimeToFileTime(&sTime, Time);
\r
4913 SpecificLocalFileTime2FileTime(Time, AskHostTimeZone());
\r
4917 if(FindField(Str, Fname, 6, YES) == FFFTP_SUCCESS)
\r
4919 RemoveTailingSpaces(Fname);
\r
4921 if((Pos = strchr(Fname, '/')) != NULL)
\r
4929 case LIST_GP6000 :
\r
4930 *InfoExist |= (FINFO_TIME | FINFO_DATE | FINFO_SIZE | FINFO_ATTR);
\r
4933 FindField(Str, Buf, 3, NO);
\r
4934 strncpy(Owner, Buf, OWNER_NAME_LEN);
\r
4937 FindField(Str, Buf, 2, NO);
\r
4938 sTime.wHour = atoi(Buf);
\r
4939 sTime.wMinute = atoi(Buf+3);
\r
4940 sTime.wSecond = 0;
\r
4941 sTime.wMilliseconds = 0;
\r
4944 FindField(Str, Buf, 1, NO);
\r
4945 sTime.wYear = Assume1900or2000(atoi(Buf));
\r
4946 sTime.wMonth = atoi(Buf + 3);
\r
4947 sTime.wDay = atoi(Buf + 6);
\r
4948 SystemTimeToFileTime(&sTime, Time);
\r
4949 SpecificLocalFileTime2FileTime(Time, AskHostTimeZone());
\r
4952 FindField(Str, Buf, 5, NO);
\r
4953 *Size = _atoi64(Buf);
\r
4956 FindField(Str, Buf, 0, NO);
\r
4957 *Attr = AttrString2Value(Buf+1);
\r
4960 if(FindField(Str, Fname, 6, YES) == FFFTP_SUCCESS)
\r
4963 if(strchr("dl", Buf[0]) != NULL)
\r
4969 case LIST_ACOS_4 :
\r
4971 FindField(Str, Fname, 0, NO);
\r
4976 *InfoExist |= (FINFO_TIME | FINFO_DATE | FINFO_SIZE);
\r
4979 FindField(Str, Buf, 1, NO);
\r
4980 *Size = _atoi64(Buf) * BLOCK_SIZE;
\r
4983 FindField(Str, Buf, 2, NO);
\r
4984 GetVMSdate(Buf, &sTime.wYear, &sTime.wMonth, &sTime.wDay);
\r
4986 FindField(Str, Buf, 3, NO);
\r
4987 GetHourAndMinute(Buf, &sTime.wHour, &sTime.wMinute);
\r
4989 sTime.wSecond = 0;
\r
4990 sTime.wMilliseconds = 0;
\r
4991 SystemTimeToFileTime(&sTime, Time);
\r
4992 SpecificLocalFileTime2FileTime(Time, AskHostTimeZone());
\r
4995 FindField(Str, Fname, 0, NO);
\r
4998 if((Pos = strchr(Fname, '.')) != NULL)
\r
5000 if(_strnicmp(Pos, ".DIR;", 5) == 0)
\r
5002 /* OpenVMSの場合、ファイル/ディレクトリ削除時には".DIR;?"までないと
\r
5003 * 削除できないので、ここではつぶさない */
\r
5004 #if !defined(HAVE_OPENVMS)
\r
5013 *InfoExist |= FINFO_SIZE;
\r
5017 FindField(Str, Buf, 2, NO);
\r
5018 *Size = _atoi64(Buf);
\r
5022 *InfoExist |= (FINFO_TIME | FINFO_DATE | FINFO_ATTR);
\r
5025 FindField(Str, Buf, 1+offs, NO);
\r
5026 sTime.wYear = Assume1900or2000(atoi(Buf));
\r
5027 sTime.wMonth = atoi(Buf + 3);
\r
5028 sTime.wDay = atoi(Buf + 6);
\r
5031 FindField(Str, Buf, 2+offs, NO);
\r
5032 sTime.wHour = atoi(Buf);
\r
5033 sTime.wMinute = atoi(Buf+3);
\r
5034 sTime.wSecond = 0;
\r
5035 sTime.wMilliseconds = 0;
\r
5036 SystemTimeToFileTime(&sTime, Time);
\r
5037 SpecificLocalFileTime2FileTime(Time, AskHostTimeZone());
\r
5040 FindField(Str, Buf, 0, NO);
\r
5041 *Attr = AttrString2Value(Buf+1);
\r
5044 if(FindField(Str, Fname, 3+offs, YES) == FFFTP_SUCCESS)
\r
5046 RemoveTailingSpaces(Fname);
\r
5048 if(strchr("dl", Buf[0]) != NULL)
\r
5053 case LIST_STRATUS :
\r
5054 if(FindField(Str, Buf, 0, NO) != FFFTP_SUCCESS)
\r
5056 if(_strnicmp(Buf, "Files:", 6) == 0)
\r
5058 else if(_strnicmp(Buf, "Dirs:", 5) == 0)
\r
5060 else if(_strnicmp(Buf, "Links:", 6) == 0)
\r
5064 if(StratusMode == 0)
\r
5066 else if(StratusMode == 1)
\r
5071 *InfoExist |= (FINFO_TIME | FINFO_DATE);
\r
5074 if(FindField(Str, Buf, 2+offs, NO) != FFFTP_SUCCESS)
\r
5076 sTime.wYear = Assume1900or2000(atoi(Buf));
\r
5077 sTime.wMonth = atoi(Buf + 3);
\r
5078 sTime.wDay = atoi(Buf + 6);
\r
5081 if(FindField(Str, Buf, 3+offs, NO) != FFFTP_SUCCESS)
\r
5083 sTime.wHour = atoi(Buf);
\r
5084 sTime.wMinute = atoi(Buf+3);
\r
5085 sTime.wSecond = 0;
\r
5086 sTime.wMilliseconds = 0;
\r
5087 SystemTimeToFileTime(&sTime, Time);
\r
5088 SpecificLocalFileTime2FileTime(Time, AskHostTimeZone());
\r
5091 if(FindField(Str, Fname, 4+offs, YES) != FFFTP_SUCCESS)
\r
5094 if(StratusMode == 0)
\r
5096 *InfoExist |= FINFO_SIZE;
\r
5099 if(FindField(Str, Buf, 1, NO) != FFFTP_SUCCESS)
\r
5101 *Size = _atoi64(Buf) * 4096;
\r
5103 /* 種類(オーナ名のフィールドにいれる) */
\r
5104 if(FindField(Str, Buf, 2, NO) != FFFTP_SUCCESS)
\r
5106 strncpy(Owner, Buf, OWNER_NAME_LEN);
\r
5116 *InfoExist |= (FINFO_DATE | FINFO_SIZE);
\r
5119 for(offs = 11; offs > 7; offs--)
\r
5121 if((err = FindField(Str, Buf, offs, NO)) == FFFTP_SUCCESS)
\r
5124 if(err != FFFTP_SUCCESS)
\r
5126 if(IsDigit(*Buf) == 0)
\r
5128 sTime.wYear = Assume1900or2000(atoi(Buf));
\r
5129 if(FindField(Str, Buf, --offs, NO) != FFFTP_SUCCESS)
\r
5131 GetMonth(Buf, &sTime.wMonth, &sTime.wDay);
\r
5132 if(FindField(Str, Buf, --offs, NO) != FFFTP_SUCCESS)
\r
5134 if(IsDigit(*Buf) == 0)
\r
5136 sTime.wDay = atoi(Buf);
\r
5138 sTime.wMinute = 0;
\r
5139 sTime.wSecond = 0;
\r
5140 sTime.wMilliseconds = 0;
\r
5141 SystemTimeToFileTime(&sTime, Time);
\r
5142 SpecificLocalFileTime2FileTime(Time, AskHostTimeZone());
\r
5145 if(FindField(Str, Buf, --offs, NO) != FFFTP_SUCCESS)
\r
5147 strncpy(Owner, Buf, OWNER_NAME_LEN);
\r
5152 if((err = FindField(Str, Buf, --offs, NO)) != FFFTP_SUCCESS)
\r
5155 while(IsDigit(*Buf) == 0);
\r
5157 if((err = FindField(Str, Buf, --offs, NO)) != FFFTP_SUCCESS)
\r
5160 *Size = _atoi64(Buf);
\r
5161 if((err = FindField(Str, Buf, --offs, NO)) != FFFTP_SUCCESS)
\r
5163 if(IsDigit(*Buf) == 0)
\r
5166 if(FindField(Str, Fname, 0, NO) != FFFTP_SUCCESS)
\r
5173 if((FindField(Str, Buf, 1, NO) == FFFTP_SUCCESS) &&
\r
5174 (strcmp(Buf, "DR") == 0))
\r
5181 case LIST_ALLIED :
\r
5182 *InfoExist |= (FINFO_TIME | FINFO_DATE | FINFO_SIZE);
\r
5185 FindField(Str, Buf, 3, NO);
\r
5186 GetMonth(Buf, &sTime.wMonth, &sTime.wDay); /* wDayは常に0 */
\r
5187 FindField(Str, Buf, 4, NO);
\r
5188 sTime.wDay = atoi(Buf);
\r
5189 FindField(Str, Buf, 6, NO);
\r
5190 sTime.wYear = atoi(Buf);
\r
5193 FindField(Str, Buf, 5, NO);
\r
5194 sTime.wHour = atoi(Buf);
\r
5195 sTime.wMinute = atoi(Buf+3);
\r
5196 sTime.wSecond = 0;
\r
5197 sTime.wMilliseconds = 0;
\r
5198 SystemTimeToFileTime(&sTime, Time);
\r
5199 SpecificLocalFileTime2FileTime(Time, AskHostTimeZone());
\r
5202 FindField(Str, Buf, 0, NO);
\r
5203 *Size = _atoi64(Buf);
\r
5206 if(FindField(Str, Fname, 1, NO) == FFFTP_SUCCESS)
\r
5215 *InfoExist |= (FINFO_TIME | FINFO_DATE | FINFO_SIZE);
\r
5218 FindField(Str, Buf, 1, NO);
\r
5219 sTime.wYear = Assume1900or2000(atoi(Buf));
\r
5220 sTime.wMonth = atoi(Buf + 3);
\r
5221 sTime.wDay = atoi(Buf + 6);
\r
5222 SystemTimeToFileTime(&sTime, Time);
\r
5223 SpecificLocalFileTime2FileTime(Time, AskHostTimeZone());
\r
5226 FindField(Str, Buf, 2, NO);
\r
5227 sTime.wHour = atoi_n(Buf, 2);
\r
5228 sTime.wMinute = atoi(Buf+2);
\r
5229 sTime.wSecond = 0;
\r
5230 sTime.wMilliseconds = 0;
\r
5231 SystemTimeToFileTime(&sTime, Time);
\r
5232 SpecificLocalFileTime2FileTime(Time, AskHostTimeZone());
\r
5235 FindField(Str, Buf, 5, NO);
\r
5236 *Size = _atoi64(Buf);
\r
5239 FindField(Str, Buf, 0, NO);
\r
5240 strncpy(Owner, Buf, OWNER_NAME_LEN);
\r
5243 FindField(Str, Buf, 3, NO);
\r
5246 if(FindField(Str, Fname, 6, NO) == FFFTP_SUCCESS)
\r
5248 if((Buf[0] == 'd') || (Buf[0] == 'D'))
\r
5256 *InfoExist |= FINFO_DATE;
\r
5260 FindField(Str, Buf, 2, NO);
\r
5261 sTime.wYear = atoi(Buf);
\r
5262 sTime.wMonth = atoi(Buf + 5);
\r
5263 sTime.wDay = atoi(Buf + 8);
\r
5265 sTime.wMinute = 0;
\r
5266 sTime.wSecond = 0;
\r
5267 sTime.wMilliseconds = 0;
\r
5268 SystemTimeToFileTime(&sTime, Time);
\r
5269 SpecificLocalFileTime2FileTime(Time, AskHostTimeZone());
\r
5272 FindField(Str, Buf, 8, NO);
\r
5273 if(FindField(Str, Fname, 9, NO) == FFFTP_SUCCESS)
\r
5275 if(strcmp(Buf, "PO") == 0)
\r
5277 else if(strcmp(Buf, "PS") == 0)
\r
5282 case LIST_AGILENT :
\r
5283 *InfoExist |= (FINFO_SIZE | FINFO_ATTR);
\r
5286 FindField(Str, Buf, 2, NO);
\r
5287 strncpy(Owner, Buf, OWNER_NAME_LEN);
\r
5290 FindField(Str, Buf, 4, NO);
\r
5291 *Size = _atoi64(Buf);
\r
5294 FindField(Str, Buf, 0, NO);
\r
5295 *Attr = AttrString2Value(Buf+1);
\r
5298 if(FindField(Str, Fname, 5, YES) == FFFTP_SUCCESS)
\r
5301 if(strchr("dl", Buf[0]) != NULL)
\r
5306 case LIST_SHIBASOKU :
\r
5307 *InfoExist |= (FINFO_TIME | FINFO_DATE | FINFO_SIZE);
\r
5310 FindField(Str, Buf, 0, NO);
\r
5311 if(IsDigit(Buf[0]))
\r
5313 *Size = _atoi64(Buf);
\r
5316 FindField(Str, Buf, 1, NO);
\r
5318 GetMonth(Buf, &sTime.wMonth, &sTime.wDay);
\r
5319 sTime.wDay = atoi(Buf+4);
\r
5320 sTime.wYear = atoi(Buf+7);
\r
5323 FindField(Str, Buf, 2, NO);
\r
5324 sTime.wHour = atoi(Buf);
\r
5325 sTime.wMinute = atoi(Buf+3);
\r
5326 sTime.wSecond = 0;
\r
5327 sTime.wMilliseconds = 0;
\r
5328 SystemTimeToFileTime(&sTime, Time);
\r
5329 SpecificLocalFileTime2FileTime(Time, AskHostTimeZone());
\r
5332 FindField(Str, Fname, 3, NO);
\r
5336 if(FindField(Str, Buf, 4, NO) == FFFTP_SUCCESS)
\r
5338 if(strcmp(Buf, "<DIR>") == 0)
\r
5344 #if defined(HAVE_TANDEM)
\r
5345 case LIST_TANDEM :
\r
5346 *InfoExist |= (FINFO_TIME | FINFO_DATE | FINFO_SIZE | FINFO_ATTR);
\r
5347 /* Open 中だったらずらす */
\r
5348 if(FindField(Str, Buf, 1, NO) != FFFTP_SUCCESS)
\r
5350 if (!strncmp(Buf, "O", 1)) {
\r
5354 if(FindField(Str, Buf, 3 + offs, NO) != FFFTP_SUCCESS)
\r
5356 if (Buf[1] == '-') { /* 日付が 1桁 */
\r
5357 sTime.wYear = Assume1900or2000(atoi(Buf + 6));
\r
5359 GetMonth(Buf+2, &sTime.wMonth, &sTime.wDay); /* wDayは常に0 */
\r
5360 sTime.wDay = atoi(Buf);
\r
5361 sTime.wDayOfWeek = 0;
\r
5363 sTime.wYear = Assume1900or2000(atoi(Buf + 7));
\r
5365 GetMonth(Buf+3, &sTime.wMonth, &sTime.wDay); /* wDayは常に0 */
\r
5366 sTime.wDay = atoi(Buf);
\r
5367 sTime.wDayOfWeek = 0;
\r
5370 FindField(Str, Buf, 4 + offs, NO);
\r
5371 sTime.wHour = atoi(Buf);
\r
5372 sTime.wMinute = atoi(Buf+3);
\r
5373 sTime.wSecond = atoi(Buf+6);
\r
5374 sTime.wMilliseconds = 0;
\r
5375 SystemTimeToFileTime(&sTime, Time);
\r
5376 SpecificLocalFileTime2FileTime(Time, AskHostTimeZone());
\r
5378 /* 属性 セキュリティではなく FileCode を保存する */
\r
5379 FindField(Str, Buf, 1 + offs, NO);
\r
5380 *Attr = atoi(Buf);
\r
5382 FindField(Str, Buf, 2 + offs, NO);
\r
5383 *Size = _atoi64(Buf);
\r
5385 if(FindField(Str, Buf, 5 + offs, NO) == FFFTP_SUCCESS) {
\r
5386 if(strncmp(Buf, "Owner", sizeof("Owner"))) {
\r
5387 memset(Owner, NUL, OWNER_NAME_LEN+1);
\r
5388 strncpy(Owner, Buf, OWNER_NAME_LEN);
\r
5389 /* 通常は 255,255 だが、20, 33 などにも対応する */
\r
5390 /* 最後の文字が , だったら後ろとつなげる */
\r
5391 if (Buf[strlen(Buf)-1] == ',') {
\r
5392 FindField(Str, Buf, 6 + offs, NO);
\r
5393 strncat(Owner, Buf, OWNER_NAME_LEN - strlen(Buf));
\r
5396 if(FindField(Str, Fname, 0, NO) == FFFTP_SUCCESS) {
\r
5406 // fact1=value1;fact2=value2;fact3=value3; filename\r\n
\r
5407 // 不完全な実装のホストが存在するため以下の形式も許容
\r
5408 // fact1=value1;fact2=value2;fact3=value3 filename\r\n
\r
5409 // fact1=value1;fact2=value2;fact3=value3;filename\r\n
\r
5410 // SymlinkはRFC3659の7.7.4. A More Complex Exampleに
\r
5411 // よるとtype=OS.unix=slink:(target)だが
\r
5412 // ProFTPDはtype=OS.unix=symlink:(target)となる
\r
5416 char StrBuf[(FMAX_PATH * 2) + 1];
\r
5417 char Fact[FMAX_PATH + 1];
\r
5418 char Name[FMAX_PATH + 1];
\r
5419 char Value[FMAX_PATH + 1];
\r
5420 char Value2[FMAX_PATH + 1];
\r
5422 strncpy(StrBuf, Str, FMAX_PATH * 2);
\r
5423 StrBuf[FMAX_PATH * 2] = '\0';
\r
5424 if((pFileName = strstr(StrBuf, "; ")) != NULL)
\r
5426 *pFileName = '\0';
\r
5429 else if((pFileName = strchr(StrBuf, ' ')) != NULL)
\r
5431 *pFileName = '\0';
\r
5434 else if((pFileName = strrchr(StrBuf, ';')) != NULL)
\r
5436 *pFileName = '\0';
\r
5439 if(pFileName != NULL)
\r
5440 strcpy(Fname, pFileName);
\r
5441 while(FindField2(StrBuf, Fact, ';', i, NO) == FFFTP_SUCCESS)
\r
5443 if(FindField2(Fact, Name, '=', 0, NO) == FFFTP_SUCCESS && FindField2(Fact, Value, '=', 1, NO) == FFFTP_SUCCESS)
\r
5445 if(_stricmp(Name, "type") == 0)
\r
5447 if(_stricmp(Value, "dir") == 0)
\r
5449 else if(_stricmp(Value, "file") == 0)
\r
5451 else if(_stricmp(Value, "OS.unix") == 0)
\r
5452 if(FindField2(Fact, Value2, '=', 2, NO) == FFFTP_SUCCESS)
\r
5453 if(_stricmp(Value2, "symlink") == 0 || _stricmp(Value2, "slink") == 0) { // ProFTPD is symlink. A example of RFC3659 is slink.
\r
5458 else if(_stricmp(Name, "size") == 0)
\r
5460 *Size = _atoi64(Value);
\r
5461 *InfoExist |= FINFO_SIZE;
\r
5463 else if(_stricmp(Name, "modify") == 0)
\r
5465 sTime.wYear = atoi_n(Value, 4);
\r
5466 sTime.wMonth = atoi_n(Value + 4, 2);
\r
5467 sTime.wDay = atoi_n(Value + 6, 2);
\r
5468 sTime.wHour = atoi_n(Value + 8, 2);
\r
5469 sTime.wMinute = atoi_n(Value + 10, 2);
\r
5470 sTime.wSecond = atoi_n(Value + 12, 2);
\r
5471 sTime.wMilliseconds = 0;
\r
5472 SystemTimeToFileTime(&sTime, Time);
\r
5474 // SpecificLocalFileTime2FileTime(Time, AskHostTimeZone());
\r
5475 *InfoExist |= FINFO_DATE | FINFO_TIME;
\r
5477 else if(_stricmp(Name, "UNIX.mode") == 0)
\r
5479 *Attr = strtol(Value, NULL, 16);
\r
5480 *InfoExist |= FINFO_ATTR;
\r
5482 else if(_stricmp(Name, "UNIX.owner") == 0)
\r
5483 strcpy(Owner, Value);
\r
5490 case LIST_UNIX_10 :
\r
5491 case LIST_UNIX_11 :
\r
5492 case LIST_UNIX_12 :
\r
5493 case LIST_UNIX_13 :
\r
5494 case LIST_UNIX_14 :
\r
5495 case LIST_UNIX_15 :
\r
5496 case LIST_UNIX_20 :
\r
5497 case LIST_UNIX_21 :
\r
5498 case LIST_UNIX_22 :
\r
5499 case LIST_UNIX_23 :
\r
5500 case LIST_UNIX_24 :
\r
5501 case LIST_UNIX_25 :
\r
5502 case LIST_UNIX_50 :
\r
5503 case LIST_UNIX_51 :
\r
5504 case LIST_UNIX_54 :
\r
5505 case LIST_UNIX_60 :
\r
5506 case LIST_UNIX_61 :
\r
5507 case LIST_UNIX_62 :
\r
5508 case LIST_UNIX_63 :
\r
5509 case LIST_UNIX_64 :
\r
5510 case LIST_UNIX_65 :
\r
5511 case LIST_UNIX_70 :
\r
5512 case LIST_UNIX_71 :
\r
5513 case LIST_UNIX_72 :
\r
5514 case LIST_UNIX_73 :
\r
5515 case LIST_UNIX_74 :
\r
5516 case LIST_UNIX_75 :
\r
5517 // MELCOMはビットフラグになっている
\r
5518 // case LIST_MELCOM :
\r
5520 case LIST_UNIX_16 :
\r
5522 case LIST_UNIX_17 :
\r
5524 /* offsはサイズの位置, offs=0はカラム4 */
\r
5526 if((ListType == LIST_UNIX_12) ||
\r
5527 (ListType == LIST_UNIX_13) ||
\r
5528 (ListType == LIST_UNIX_15) ||
\r
5529 (ListType == LIST_UNIX_20) ||
\r
5530 (ListType == LIST_UNIX_21) ||
\r
5531 (ListType == LIST_UNIX_24))
\r
5534 if((ListType == LIST_UNIX_22) ||
\r
5535 (ListType == LIST_UNIX_23) ||
\r
5536 (ListType == LIST_UNIX_25) ||
\r
5537 (ListType == LIST_UNIX_50) ||
\r
5538 (ListType == LIST_UNIX_51) ||
\r
5539 (ListType == LIST_UNIX_54))
\r
5542 if((ListType == LIST_UNIX_60) ||
\r
5543 (ListType == LIST_UNIX_61) ||
\r
5544 (ListType == LIST_UNIX_64))
\r
5547 if((ListType == LIST_UNIX_62) ||
\r
5548 (ListType == LIST_UNIX_63) ||
\r
5549 (ListType == LIST_UNIX_65) ||
\r
5550 (ListType == LIST_UNIX_70) ||
\r
5551 (ListType == LIST_UNIX_71) ||
\r
5552 (ListType == LIST_UNIX_74))
\r
5555 /* offs2は時間(もしくは年)の位置 */
\r
5558 // if((ListType == LIST_UNIX_11) ||
\r
5559 // (ListType == LIST_UNIX_13) ||
\r
5560 // (ListType == LIST_UNIX_21) ||
\r
5561 // (ListType == LIST_UNIX_23) ||
\r
5562 // (ListType == LIST_UNIX_51) ||
\r
5563 // (ListType == LIST_UNIX_61) ||
\r
5564 // (ListType == LIST_UNIX_63) ||
\r
5565 // (ListType == LIST_UNIX_71) ||
\r
5566 // (ListType == LIST_UNIX_73))
\r
5567 if((ListType == LIST_UNIX_11) ||
\r
5568 (ListType == LIST_UNIX_13) ||
\r
5569 (ListType == LIST_UNIX_21) ||
\r
5570 (ListType == LIST_UNIX_23) ||
\r
5571 (ListType == LIST_UNIX_51) ||
\r
5572 (ListType == LIST_UNIX_61) ||
\r
5573 (ListType == LIST_UNIX_63) ||
\r
5574 (ListType == LIST_UNIX_71) ||
\r
5575 (ListType == LIST_UNIX_73) ||
\r
5576 (ListType == LIST_UNIX_16))
\r
5579 if(ListType == LIST_UNIX_17)
\r
5582 /* offs3はオーナ名の位置 */
\r
5584 if((ListType == LIST_UNIX_12) ||
\r
5585 (ListType == LIST_UNIX_13) ||
\r
5586 (ListType == LIST_UNIX_15) ||
\r
5587 (ListType == LIST_UNIX_22) ||
\r
5588 (ListType == LIST_UNIX_23) ||
\r
5589 (ListType == LIST_UNIX_25) ||
\r
5590 (ListType == LIST_UNIX_50) ||
\r
5591 (ListType == LIST_UNIX_51) ||
\r
5592 (ListType == LIST_UNIX_62) ||
\r
5593 (ListType == LIST_UNIX_63) ||
\r
5594 (ListType == LIST_UNIX_65) ||
\r
5595 (ListType == LIST_UNIX_72) ||
\r
5596 (ListType == LIST_UNIX_73) ||
\r
5597 (ListType == LIST_UNIX_75))
\r
5601 if((ListType == LIST_UNIX_14) ||
\r
5602 (ListType == LIST_UNIX_15) ||
\r
5603 (ListType == LIST_UNIX_24) ||
\r
5604 (ListType == LIST_UNIX_25) ||
\r
5605 (ListType == LIST_UNIX_54) ||
\r
5606 (ListType == LIST_UNIX_64) ||
\r
5607 (ListType == LIST_UNIX_65) ||
\r
5608 (ListType == LIST_UNIX_74) ||
\r
5609 (ListType == LIST_UNIX_75))
\r
5612 if(ListType == LIST_UNIX_17)
\r
5615 *InfoExist |= (FINFO_DATE | FINFO_SIZE | FINFO_ATTR);
\r
5618 FindField(Str, Buf, 0, NO);
\r
5619 *Attr = AttrString2Value(Buf+1);
\r
5622 FindField(Str, Buf, 2+offs3, NO);
\r
5623 strncpy(Owner, Buf, OWNER_NAME_LEN);
\r
5626 FindField(Str, Buf, 4+offs, NO);
\r
5628 if((*Pos != NUL) && (IsDigit(*Pos) == 0))
\r
5630 Pos = strchr(Pos, NUL) - 1;
\r
5631 for(; Pos > Buf; Pos--)
\r
5633 if(IsDigit(*Pos) == 0)
\r
5640 *Size = _atoi64(Pos);
\r
5645 GetLocalTime(&sTime);
\r
5646 memcpy(&sTimeNow, &sTime, sizeof(SYSTEMTIME));
\r
5647 sTime.wSecond = 0;
\r
5648 sTime.wMilliseconds = 0;
\r
5650 FindField(Str, Buf, 5+offs, NO);
\r
5651 /* 日付が yy/mm/dd の場合に対応 */
\r
5652 if(GetYearMonthDay(Buf, &sTime.wYear, &sTime.wMonth, &sTime.wDay) == FFFTP_SUCCESS)
\r
5654 sTime.wYear = Assume1900or2000(sTime.wYear);
\r
5656 FindField(Str, Buf, 7+offs+offs2, NO);
\r
5657 if(GetHourAndMinute(Buf, &sTime.wHour, &sTime.wMinute) == FFFTP_SUCCESS)
\r
5658 *InfoExist |= FINFO_TIME;
\r
5661 else if(CheckYYYYMMDDformat(Buf, NUL) != 0)
\r
5663 sTime.wYear = atoi(Buf);
\r
5664 sTime.wMonth = atoi(Buf+5);
\r
5665 sTime.wDay = atoi(Buf+8);
\r
5666 FindField(Str, Buf, 7+offs+offs2, NO);
\r
5667 if(GetHourAndMinute(Buf, &sTime.wHour, &sTime.wMinute) == FFFTP_SUCCESS)
\r
5668 *InfoExist |= FINFO_TIME;
\r
5672 GetMonth(Buf, &sTime.wMonth, &sTime.wDay);
\r
5675 FindField(Str, Buf, 6+offs, NO);
\r
5676 sTime.wDay = atoi(Buf);
\r
5679 FindField(Str, Buf, 7+offs+offs2, NO);
\r
5680 if(GetHourAndMinute(Buf, &sTime.wHour, &sTime.wMinute) == FFFTP_FAIL)
\r
5682 sTime.wYear = atoi(Buf);
\r
5686 *InfoExist |= FINFO_TIME;
\r
5690 // 恐らくホストとローカルの時刻が異なる場合の対処のようだがとりあえず無効にする
\r
5691 // if((sTimeNow.wMonth == 12) && (sTime.wMonth == 1))
\r
5693 // else if(sTimeNow.wMonth+1 == sTime.wMonth)
\r
5694 if(sTimeNow.wMonth+1 == sTime.wMonth)
\r
5696 else if(sTimeNow.wMonth < sTime.wMonth)
\r
5700 //#################
\r
5701 /* 今年の今日以降のファイルは、実は去年のファイル */
\r
5702 if((sTime.wYear == sTimeNow.wYear) &&
\r
5703 ((sTime.wMonth > sTimeNow.wMonth) ||
\r
5704 ((sTime.wMonth == sTimeNow.wMonth) && (sTime.wDay > sTimeNow.wDay))))
\r
5712 else if(Flag2 == -1)
\r
5714 *InfoExist &= ~(FINFO_DATE | FINFO_TIME);
\r
5718 /* LIST_UNIX_?4, LIST_UNIX_?5 の時 */
\r
5719 FindField(Str, Buf, 5+offs, NO);
\r
5720 sTime.wYear = atoi(Buf);
\r
5721 FindField(Str, Buf, 6+offs, NO);
\r
5722 sTime.wMonth = atoi(Buf);
\r
5723 FindField(Str, Buf, 7+offs, NO);
\r
5724 sTime.wDay = atoi(Buf);
\r
5726 sTime.wMinute = 0;
\r
5727 sTime.wSecond = 0;
\r
5728 sTime.wMilliseconds = 0;
\r
5730 SystemTimeToFileTime(&sTime, Time);
\r
5731 SpecificLocalFileTime2FileTime(Time, AskHostTimeZone());
\r
5734 if(FindField(Str, Fname, 8+offs+offs2, YES) == FFFTP_SUCCESS)
\r
5737 if(OrgListType & LIST_MELCOM)
\r
5741 RemoveTailingSpaces(Fname);
\r
5745 if((Pos = strstr(Fname, " -> ")) != NULL)
\r
5749 if(strchr("dl", *Str) != NULL)
\r
5751 // 0x5Cが含まれる文字列を扱えないバグ修正
\r
5752 // if((_mbscmp(_mbsninc(Fname, _mbslen(Fname) - 1), "/") == 0) ||
\r
5753 // (_mbscmp(_mbsninc(Fname, _mbslen(Fname) - 1), "\\") == 0))
\r
5755 // *(Fname + strlen(Fname) - 1) = NUL;
\r
5761 else if(strchr("-+f", *Str) != NULL)
\r
5764 if((Ret == NODE_FILE) && (Flag != 'B'))
\r
5771 // if((Ret != NODE_NONE) && (strlen(Fname) > 0))
\r
5772 if(!(OrgListType & LIST_RAW_NAME) && (Ret != NODE_NONE) && (strlen(Fname) > 0))
\r
5775 // if(CheckSpecialDirName(Fname) == YES)
\r
5776 // Ret = NODE_NONE;
\r
5778 // ChangeFnameRemote2Local(Fname, FMAX_PATH);
\r
5779 // UTF-8の冗長表現によるディレクトリトラバーサル対策
\r
5780 FixStringM(Fname, Fname);
\r
5781 // 0x5Cが含まれる文字列を扱えないバグ修正
\r
5782 if((_mbscmp(_mbsninc(Fname, _mbslen(Fname) - 1), "/") == 0)
\r
5783 || (_mbscmp(_mbsninc(Fname, _mbslen(Fname) - 1), "\\") == 0))
\r
5784 *(Fname + strlen(Fname) - 1) = NUL;
\r
5785 if(CheckSpecialDirName(Fname) == YES)
\r
5787 // 文字コードが正しくないために長さが0になったファイル名は表示しない
\r
5788 if(strlen(Fname) == 0)
\r
5795 /*----- 指定の番号のフィールドを求める ----------------------------------------
\r
5799 * char *Buf : 文字列のコピー先
\r
5800 * int Num : フィールド番号
\r
5801 * int ToLast : 文字列の最後までコピー (YES/NO)
\r
5805 * FFFTP_SUCCESS/FFFTP_FAIL
\r
5806 *----------------------------------------------------------------------------*/
\r
5808 static int FindField(char *Str, char *Buf, int Num, int ToLast)
\r
5817 while(*Str == ' ')
\r
5820 for(; Num > 0; Num--)
\r
5822 if((Str = strchr(Str, ' ')) != NULL)
\r
5824 while(*Str == ' ')
\r
5841 if((ToLast == YES) || ((Pos = strchr(Str, ' ')) == NULL))
\r
5845 strncpy(Buf, Str, Pos - Str);
\r
5846 *(Buf + (Pos - Str)) = NUL;
\r
5848 Sts = FFFTP_SUCCESS;
\r
5855 static int FindField2(char *Str, char *Buf, char Separator, int Num, int ToLast)
\r
5864 while(*Str == Separator)
\r
5867 for(; Num > 0; Num--)
\r
5869 if((Str = strchr(Str, Separator)) != NULL)
\r
5871 while(*Str == Separator)
\r
5888 if((ToLast == YES) || ((Pos = strchr(Str, Separator)) == NULL))
\r
5892 strncpy(Buf, Str, Pos - Str);
\r
5893 *(Buf + (Pos - Str)) = NUL;
\r
5895 Sts = FFFTP_SUCCESS;
\r
5901 /*----- 文字列から月を求める --------------------------------------------------
\r
5905 * WORD *Month : 月 (0=月を表す文字列ではない)
\r
5906 * WORD *Day : 日 (0=日は含まれていない)
\r
5910 *----------------------------------------------------------------------------*/
\r
5912 static void GetMonth(char *Str, WORD *Month, WORD *Day)
\r
5914 static const char DateStr[] = { "JanFebMarAprMayJunJulAugSepOctNovDec" };
\r
5920 if(IsDigit(*Str) == 0)
\r
5923 *Str = toupper(*Str);
\r
5924 if((Pos = strstr(DateStr, Str)) != NULL)
\r
5925 *Month = ((Pos - DateStr) / 3) + 1;
\r
5929 /* 「10月」のような日付を返すものがある */
\r
5930 /* 漢字がJISの時のみSJISに変換 */
\r
5931 ConvAutoToSJIS(Str, KANJI_NOCNV);
\r
5934 while(*Pos != NUL)
\r
5936 if(!IsDigit(*Pos))
\r
5939 // if((_mbsncmp(Pos, "月", 1) == 0) ||
\r
5940 // (memcmp(Pos, "\xB7\xEE", 2) == 0) || /* EUCの「月」 */
\r
5941 // (memcmp(Pos, "\xD4\xC2", 2) == 0)) /* GBコードの「月」 */
\r
5942 if(memcmp(Pos, "\xE6\x9C\x88", 3) == 0 || memcmp(Pos, "\x8C\x8E", 2) == 0 || memcmp(Pos, "\xB7\xEE", 2) == 0 || memcmp(Pos, "\xD4\xC2", 2) == 0)
\r
5945 *Month = atoi(Str);
\r
5946 if((*Month < 1) || (*Month > 12))
\r
5950 /* 「10月11日」のように日がくっついている事がある */
\r
5954 if((*Day < 1) || (*Day > 31))
\r
5959 else if(_mbsncmp(Pos, "/", 1) == 0)
\r
5961 /* 「10/」のような日付を返すものがある */
\r
5963 *Month = atoi(Str);
\r
5964 if((*Month < 1) || (*Month > 12))
\r
5968 /* 「10/11」のように日がくっついている事がある */
\r
5972 if((*Day < 1) || (*Day > 31))
\r
5986 /*----- 文字列から年月日を求める ----------------------------------------------
\r
5995 * int ステータス (FFFTP_SUCCESS/FFFTP_FAIL=日付を表す文字ではない)
\r
6000 * FFFTP_FAILを返す時は *Year = 0; *Month = 0; *Day = 0
\r
6001 *----------------------------------------------------------------------------*/
\r
6002 static int GetYearMonthDay(char *Str, WORD *Year, WORD *Month, WORD *Day)
\r
6007 if(strlen(Str) == 8)
\r
6009 if(IsDigit(Str[0]) && IsDigit(Str[1]) && !IsDigit(Str[2]) &&
\r
6010 IsDigit(Str[3]) && IsDigit(Str[4]) && !IsDigit(Str[5]) &&
\r
6011 IsDigit(Str[6]) && IsDigit(Str[7]))
\r
6013 *Year = atoi(&Str[0]);
\r
6014 *Month = atoi(&Str[3]);
\r
6015 *Day = atoi(&Str[6]);
\r
6016 Sts = FFFTP_SUCCESS;
\r
6023 /*----- 文字列から時刻を取り出す ----------------------------------------------
\r
6028 * WORD *Minute : 分
\r
6031 * int ステータス (FFFTP_SUCCESS/FFFTP_FAIL=時刻を表す文字ではない)
\r
6037 * FFFTP_FAILを返す時は *Hour = 0; *Minute = 0
\r
6038 *----------------------------------------------------------------------------*/
\r
6040 static int GetHourAndMinute(char *Str, WORD *Hour, WORD *Minute)
\r
6046 if((_mbslen(Str) >= 3) && (isdigit(Str[0]) != 0))
\r
6048 *Hour = atoi(Str);
\r
6051 if((Pos = _mbschr(Str, ':')) != NULL)
\r
6054 if(IsDigit(*Pos) != 0)
\r
6056 *Minute = atoi(Pos);
\r
6058 Ret = FFFTP_SUCCESS;
\r
6063 /* 漢字がJISの時のみSJISに変換 */
\r
6064 ConvAutoToSJIS(Str, KANJI_NOCNV);
\r
6067 while(*Pos != NUL)
\r
6069 if(IsDigit(*Pos) == 0)
\r
6072 // if((_mbsncmp(Pos, "時", 1) == 0) ||
\r
6073 // (memcmp(Pos, "\xBB\xFE", 2) == 0)) /* EUCの「時」 */
\r
6074 if(memcmp(Pos, "\xE6\x99\x82", 3) == 0 || memcmp(Pos, "\x8E\x9E", 2) == 0 || memcmp(Pos, "\xBB\xFE", 2) == 0)
\r
6079 *Minute = atoi(Pos);
\r
6081 Ret = FFFTP_SUCCESS;
\r
6091 else if((_stricmp(Str, "a:m") == 0) || (_stricmp(Str, "p:m") == 0))
\r
6095 Ret = FFFTP_SUCCESS;
\r
6098 if(Ret == FFFTP_FAIL)
\r
6107 /*----- VAX VMSの日付文字列から日付を取り出す ---------------------------------
\r
6116 * int ステータス (FFFTP_SUCCESS/FFFTP_FAIL=日付を表す文字ではない)
\r
6121 * FFFTP_FAILを返す時は *Year = 0; *Month = 0; *Day = 0
\r
6122 *----------------------------------------------------------------------------*/
\r
6124 static int GetVMSdate(char *Str, WORD *Year, WORD *Month, WORD *Day)
\r
6133 if((Pos = strchr(Str, '-')) != NULL)
\r
6136 strncpy(Buf, Pos, 3);
\r
6138 GetMonth(Buf, Month, &Tmp);
\r
6139 if((Pos = strchr(Pos, '-')) != NULL)
\r
6142 *Year = atoi(Pos);
\r
6143 Ret = FFFTP_SUCCESS;
\r
6147 if(Ret == FFFTP_FAIL)
\r
6157 /*----- 1900年代か2000年代かを決める ------------------------------------------
\r
6160 * int Year : 年(2桁)
\r
6164 *----------------------------------------------------------------------------*/
\r
6166 int Assume1900or2000(int Year)
\r
6177 /*----- "."や".."かどうかを返す -----------------------------------------------
\r
6180 * char *Fname : ファイル名
\r
6183 * int ステータス (YES="."か".."のどちらか/NO)
\r
6184 *----------------------------------------------------------------------------*/
\r
6186 static int CheckSpecialDirName(char *Fname)
\r
6191 if((strcmp(Fname, ".") == 0) || (strcmp(Fname, "..") == 0))
\r
6198 /*----- フィルタに指定されたファイル名かどうかを返す --------------------------
\r
6201 * char Fname : ファイル名
\r
6202 * int Type : ファイルのタイプ (NODE_xxx)
\r
6211 *----------------------------------------------------------------------------*/
\r
6213 static int AskFilterStr(char *Fname, int Type)
\r
6218 char Tmp[FILTER_EXT_LEN+1];
\r
6222 if((strlen(Tbl) > 0) && (Type == NODE_FILE))
\r
6225 while((Tbl != NULL) && (*Tbl != NUL))
\r
6227 while(*Tbl == ';')
\r
6233 if((Pos = strchr(Tmp, ';')) != NULL)
\r
6236 if(CheckFname(Fname, Tmp) == FFFTP_SUCCESS)
\r
6242 Tbl = strchr(Tbl, ';');
\r
6249 /*----- フィルタを設定する ----------------------------------------------------
\r
6256 *----------------------------------------------------------------------------*/
\r
6258 void SetFilter(int *CancelCheckWork)
\r
6260 if(DialogBox(GetFtpInst(), MAKEINTRESOURCE(filter_dlg), GetMainHwnd(), FilterWndProc) == YES)
\r
6262 DispWindowTitle();
\r
6263 GetLocalDirForWnd();
\r
6264 GetRemoteDirForWnd(CACHE_LASTREAD, CancelCheckWork);
\r
6270 /*----- フィルタ入力ダイアログのコールバック ----------------------------------
\r
6273 * HWND hDlg : ウインドウハンドル
\r
6274 * UINT message : メッセージ番号
\r
6275 * WPARAM wParam : メッセージの WPARAM 引数
\r
6276 * LPARAM lParam : メッセージの LPARAM 引数
\r
6280 *----------------------------------------------------------------------------*/
\r
6283 //static BOOL CALLBACK FilterWndProc(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam)
\r
6284 static INT_PTR CALLBACK FilterWndProc(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam)
\r
6288 case WM_INITDIALOG :
\r
6289 SendDlgItemMessage(hDlg, FILTER_STR, EM_LIMITTEXT, FILTER_EXT_LEN+1, 0);
\r
6290 SendDlgItemMessage(hDlg, FILTER_STR, WM_SETTEXT, 0, (LPARAM)FilterStr);
\r
6294 switch(GET_WM_COMMAND_ID(wParam, lParam))
\r
6297 SendDlgItemMessage(hDlg, FILTER_STR, WM_GETTEXT, FILTER_EXT_LEN, (LPARAM)FilterStr);
\r
6298 EndDialog(hDlg, YES);
\r
6302 EndDialog(hDlg, NO);
\r
6306 strcpy(FilterStr, "*");
\r
6307 EndDialog(hDlg, YES);
\r
6311 hHelpWin = HtmlHelp(NULL, AskHelpFilePath(), HH_HELP_CONTEXT, IDH_HELP_TOPIC_0000021);
\r
6323 static int atoi_n(const char *Str, int Len)
\r
6329 if((Tmp = malloc(Len+1)) != NULL)
\r
6331 memset(Tmp, 0, Len+1);
\r
6332 strncpy(Tmp, Str, Len);
\r
6343 // ファイル一覧から漢字コードを推測
\r
6344 // 優先度はUTF-8、Shift_JIS、EUC、JIS、UTF-8 HFS+の順
\r
6345 int AnalyzeNameKanjiCode(int Num)
\r
6347 char Str[FMAX_PATH+1];
\r
6348 char Name[FMAX_PATH+1];
\r
6355 char Owner[OWNER_NAME_LEN+1];
\r
6358 int NameKanjiCode;
\r
6364 int PointUTF8HFSX;
\r
6366 CODECONVINFO cInfo1;
\r
6367 CODECONVINFO cInfo2;
\r
6368 char Buf[FMAX_PATH+1];
\r
6370 NameKanjiCode = KANJI_AUTO;
\r
6376 PointUTF8HFSX = 0;
\r
6377 MakeCacheFileName(Num, Str);
\r
6378 if((fd = fopen(Str, "rb")) != NULL)
\r
6380 while(GetListOneLine(Str, FMAX_PATH, fd, NO) == FFFTP_SUCCESS)
\r
6382 if((ListType = AnalyzeFileInfo(Str)) != LIST_UNKNOWN)
\r
6385 Node = ResolveFileInfo(Str, ListType | LIST_RAW_NAME, Name, &Size, &Time, &Attr, Owner, &Link, &InfoExist);
\r
6399 if(!CheckStringM(Name))
\r
6401 InitCodeConvInfo(&cInfo1);
\r
6402 cInfo1.KanaCnv = NO;
\r
6403 cInfo1.Str = Name;
\r
6404 cInfo1.StrLen = strlen(Name);
\r
6406 cInfo1.BufSize = FMAX_PATH;
\r
6408 ConvUTF8NtoUTF8HFSX(&cInfo1);
\r
6409 ConvUTF8HFSXtoUTF8N(&cInfo2);
\r
6410 if(cInfo1.OutLen > (int)strlen(Name))
\r
6414 if(cInfo2.OutLen < (int)strlen(Name))
\r
6419 switch(CheckKanjiCode(Name, strlen(Name), KANJI_SJIS))
\r
6432 switch(CheckKanjiCode(Name, strlen(Name), KANJI_SJIS))
\r
6443 if(PointUTF8HFSX >= Point)
\r
6445 NameKanjiCode = KANJI_UTF8HFSX;
\r
6446 Point = PointUTF8HFSX;
\r
6448 if(PointJIS >= Point)
\r
6450 NameKanjiCode = KANJI_JIS;
\r
6453 if(PointEUC >= Point)
\r
6455 NameKanjiCode = KANJI_EUC;
\r
6458 if(PointSJIS >= Point)
\r
6460 NameKanjiCode = KANJI_SJIS;
\r
6461 Point = PointSJIS;
\r
6463 if(PointUTF8N >= Point)
\r
6465 NameKanjiCode = KANJI_UTF8N;
\r
6466 Point = PointUTF8N;
\r
6468 return NameKanjiCode;
\r