//#define _WIN32_WINNT 0x400\r
\r
#define STRICT\r
+// IPv6対応\r
+#include <winsock2.h>\r
#include <windows.h>\r
#include <stdio.h>\r
#include <stdlib.h>\r
static void AddDispFileList(FLISTANCHOR *Anchor, char *Name, FILETIME *Time, LONGLONG Size, int Attr, int Type, int Link, char *Owner, int InfoExist, int Win);\r
static void EraseDispFileList(FLISTANCHOR *Anchor);\r
static void DispFileList2View(HWND hWnd, FLISTANCHOR *Anchor);\r
-static void AddListView(HWND hWnd, int Pos, char *Name, int Type, LONGLONG Size, FILETIME *Time, int Attr, char *Owner, int Link, int InfoExist);\r
-static BOOL CALLBACK SelectDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);\r
+// ファイルアイコン表示対応\r
+//static void AddListView(HWND hWnd, int Pos, char *Name, int Type, LONGLONG Size, FILETIME *Time, int Attr, char *Owner, int Link, int InfoExist);\r
+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
+// 64ビット対応\r
+//static BOOL CALLBACK SelectDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);\r
+static INT_PTR CALLBACK SelectDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);\r
+static int GetImageIndex(int Win, int Pos);\r
static void DispListList(FILELIST *Pos, char *Title);\r
-static void MakeRemoteTree1(char *Path, char *Cur, FILELIST **Base, int *CancelCheckWork);\r
-static void MakeRemoteTree2(char *Path, char *Cur, FILELIST **Base, int *CancelCheckWork);\r
+// ファイル一覧バグ修正\r
+//static void MakeRemoteTree1(char *Path, char *Cur, FILELIST **Base, int *CancelCheckWork);\r
+//static void MakeRemoteTree2(char *Path, char *Cur, FILELIST **Base, int *CancelCheckWork);\r
+static int MakeRemoteTree1(char *Path, char *Cur, FILELIST **Base, int *CancelCheckWork);\r
+static int MakeRemoteTree2(char *Path, char *Cur, FILELIST **Base, int *CancelCheckWork);\r
static void CopyTmpListToFileList(FILELIST **Base, FILELIST *List);\r
static int GetListOneLine(char *Buf, int Max, FILE *Fd);\r
static int MakeDirPath(char *Str, int ListType, char *Path, char *Dir);\r
-static void MakeLocalTree(char *Path, FILELIST **Base);\r
+// ファイル一覧バグ修正\r
+//static void MakeLocalTree(char *Path, FILELIST **Base);\r
+static int MakeLocalTree(char *Path, FILELIST **Base);\r
static void AddFileList(FILELIST *Pkt, FILELIST **Base);\r
-static int AnalizeFileInfo(char *Str);\r
+static int AnalyzeFileInfo(char *Str);\r
static int CheckUnixType(char *Str, char *Tmp, int Add1, int Add2, int Day);\r
static int CheckHHMMformat(char *Str);\r
static int CheckYYMMDDformat(char *Str, char Sym, int Dig3);\r
static int CheckYYYYMMDDformat(char *Str, char Sym);\r
-static int ResolvFileInfo(char *Str, int ListType, char *Fname, LONGLONG *Size, FILETIME *Time, int *Attr, char *Owner, int *Link, int *InfoExist);\r
+// Windows Server 2008 R2\r
+static int CheckMMDDYYYYformat(char *Str, char Sym);\r
+static int ResolveFileInfo(char *Str, int ListType, char *Fname, LONGLONG *Size, FILETIME *Time, int *Attr, char *Owner, int *Link, int *InfoExist);\r
static int FindField(char *Str, char *Buf, int Num, int ToLast);\r
// MLSD対応\r
static int FindField2(char *Str, char *Buf, char Separator, int Num, int ToLast);\r
static int GetVMSdate(char *Str, WORD *Year, WORD *Month, WORD *Day);\r
static int CheckSpecialDirName(char *Fname);\r
static int AskFilterStr(char *Fname, int Type);\r
-static BOOL CALLBACK FilterWndProc(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);\r
+// 64ビット対応\r
+//static BOOL CALLBACK FilterWndProc(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);\r
+static INT_PTR CALLBACK FilterWndProc(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);\r
static int atoi_n(const char *Str, int Len);\r
\r
/*===== 外部参照 =====*/\r
extern int ListHeight;\r
extern char FilterStr[FILTER_EXT_LEN+1];\r
extern HWND hHelpWin;\r
+// 外部アプリケーションへドロップ後にローカル側のファイル一覧に作業フォルダが表示されるバグ対策\r
+extern int SuppressRefresh;\r
+// ローカル側自動更新\r
+extern HANDLE ChangeNotification;\r
+// 特定の操作を行うと異常終了するバグ修正\r
+extern int CancelFlg;\r
\r
/* 設定値 */\r
extern int LocalWidth;\r
extern int DispIgnoreHide;\r
extern int DispDrives;\r
extern int MoveMode;\r
+// ファイルアイコン表示対応\r
+extern int DispFileIcon;\r
+// タイムスタンプのバグ修正\r
+extern int DispTimeSeconds;\r
+// ファイルの属性を数字で表示\r
+extern int DispPermissionsNumber;\r
\r
/*===== ローカルなワーク =====*/\r
\r
static WNDPROC RemoteProcPtr;\r
\r
static HIMAGELIST ListImg = NULL;\r
+// ファイルアイコン表示対応\r
+static HIMAGELIST ListImgFileIcon = NULL;\r
\r
static char FindStr[40+1] = { "*" }; /* 検索文字列 */\r
static int IgnoreNew = NO;\r
LV_COLUMN LvCol;\r
long Tmp;\r
\r
+ // 変数が未初期化のバグ修正\r
+ memset(&LvCol, 0, sizeof(LV_COLUMN));\r
+\r
/*===== ローカル側のリストビュー =====*/\r
\r
+ // 高DPI対応\r
+// hWndListLocal = CreateWindowEx(/*WS_EX_STATICEDGE*/WS_EX_CLIENTEDGE,\r
+// WC_LISTVIEWA, NULL,\r
+// WS_CHILD | /*WS_BORDER | */LVS_REPORT | LVS_SHOWSELALWAYS,\r
+// 0, TOOLWIN_HEIGHT*2, LocalWidth, ListHeight,\r
+// GetMainHwnd(), (HMENU)1500, hInst, NULL);\r
hWndListLocal = CreateWindowEx(/*WS_EX_STATICEDGE*/WS_EX_CLIENTEDGE,\r
WC_LISTVIEWA, NULL,\r
WS_CHILD | /*WS_BORDER | */LVS_REPORT | LVS_SHOWSELALWAYS,\r
- 0, TOOLWIN_HEIGHT*2, LocalWidth, ListHeight,\r
+ 0, AskToolWinHeight()*2, LocalWidth, ListHeight,\r
GetMainHwnd(), (HMENU)1500, hInst, NULL);\r
\r
if(hWndListLocal != NULL)\r
{\r
- LocalProcPtr = (WNDPROC)SetWindowLong(hWndListLocal, GWL_WNDPROC, (LONG)LocalWndProc);\r
+ // 64ビット対応\r
+// LocalProcPtr = (WNDPROC)SetWindowLong(hWndListLocal, GWL_WNDPROC, (LONG)LocalWndProc);\r
+ LocalProcPtr = (WNDPROC)SetWindowLongPtr(hWndListLocal, GWLP_WNDPROC, (LONG_PTR)LocalWndProc);\r
\r
Tmp = SendMessage(hWndListLocal, LVM_GETEXTENDEDLISTVIEWSTYLE, 0, 0);\r
Tmp |= LVS_EX_FULLROWSELECT;\r
\r
/*===== ホスト側のリストビュー =====*/\r
\r
+ // 高DPI対応\r
+// hWndListRemote = CreateWindowEx(/*WS_EX_STATICEDGE*/WS_EX_CLIENTEDGE,\r
+// WC_LISTVIEWA, NULL,\r
+// WS_CHILD | /*WS_BORDER | */LVS_REPORT | LVS_SHOWSELALWAYS,\r
+// LocalWidth + SepaWidth, TOOLWIN_HEIGHT*2, RemoteWidth, ListHeight,\r
+// GetMainHwnd(), (HMENU)1500, hInst, NULL);\r
hWndListRemote = CreateWindowEx(/*WS_EX_STATICEDGE*/WS_EX_CLIENTEDGE,\r
WC_LISTVIEWA, NULL,\r
WS_CHILD | /*WS_BORDER | */LVS_REPORT | LVS_SHOWSELALWAYS,\r
- LocalWidth + SepaWidth, TOOLWIN_HEIGHT*2, RemoteWidth, ListHeight,\r
+ LocalWidth + SepaWidth, AskToolWinHeight()*2, RemoteWidth, ListHeight,\r
GetMainHwnd(), (HMENU)1500, hInst, NULL);\r
\r
if(hWndListRemote != NULL)\r
{\r
- RemoteProcPtr = (WNDPROC)SetWindowLong(hWndListRemote, GWL_WNDPROC, (LONG)RemoteWndProc);\r
+ // 64ビット対応\r
+// RemoteProcPtr = (WNDPROC)SetWindowLong(hWndListRemote, GWL_WNDPROC, (LONG)RemoteWndProc);\r
+ RemoteProcPtr = (WNDPROC)SetWindowLongPtr(hWndListRemote, GWLP_WNDPROC, (LONG_PTR)RemoteWndProc);\r
\r
Tmp = SendMessage(hWndListRemote, LVM_GETEXTENDEDLISTVIEWSTYLE, 0, 0);\r
Tmp |= LVS_EX_FULLROWSELECT;\r
static void doTransferRemoteFile(void)\r
{\r
FILELIST *FileListBase, *FileListBaseNoExpand, *pf;\r
- int CancelFlg = NO;\r
+ // 特定の操作を行うと異常終了するバグ修正\r
+// int CancelFlg = NO;\r
char LocDir[FMAX_PATH+1];\r
char TmpDir[FMAX_PATH+1];\r
- char buf[32];\r
+ // 環境依存の不具合対策\r
+// char buf[32];\r
int i;\r
- DWORD pid;\r
+ // 環境依存の不具合対策\r
+// DWORD pid;\r
\r
// すでにリモートから転送済みなら何もしない。(2007.9.3 yutaka)\r
if (remoteFileListBase != NULL)\r
\r
// アプリを多重起動してもコンフリクトしないように、テンポラリフォルダ名にプロセスID\r
// を付加する。(2007.9.13 yutaka)\r
- GetTempPath(sizeof(TmpDir), TmpDir);\r
- pid = GetCurrentProcessId();\r
- _snprintf_s(buf, sizeof(buf), _TRUNCATE, "ffftp%d", pid);\r
- strncat_s(TmpDir, sizeof(TmpDir), buf, _TRUNCATE);\r
+ // 環境依存の不具合対策\r
+// GetTempPath(sizeof(TmpDir), TmpDir);\r
+// pid = GetCurrentProcessId();\r
+// _snprintf_s(buf, sizeof(buf), _TRUNCATE, "ffftp%d", pid);\r
+// strncat_s(TmpDir, sizeof(TmpDir), buf, _TRUNCATE);\r
+ GetAppTempPath(TmpDir);\r
+ _mkdir(TmpDir);\r
+ SetYenTail(TmpDir);\r
+ strcat(TmpDir, "file");\r
_mkdir(TmpDir);\r
#if 0\r
if (TmpDir[strlen(TmpDir) - 1] == '\\') {\r
remove(fn);\r
}\r
\r
+ // 外部アプリケーションへドロップ後にローカル側のファイル一覧に作業フォルダが表示されるバグ対策\r
+ SuppressRefresh = 1;\r
+\r
// ダウンロード先をテンポラリに設定\r
SetLocalDirHist(TmpDir);\r
\r
SetLocalDirHist(LocDir);\r
SetCurrentDirAsDirHist();\r
\r
+ // 外部アプリケーションへドロップ後にローカル側のファイル一覧に作業フォルダが表示されるバグ対策\r
+ SuppressRefresh = 0;\r
+ GetLocalDirForWnd();\r
+\r
remoteFileListBase = FileListBase; // あとでフリーすること\r
remoteFileListBaseNoExpand = FileListBaseNoExpand; // あとでフリーすること\r
strncpy_s(remoteFileDir, sizeof(remoteFileDir), TmpDir, _TRUNCATE);\r
return(CallWindowProc(ProcPtr, hWnd, message, wParam, lParam));\r
\r
case WM_DROPFILES :\r
+ // 同時接続対応\r
+ if(AskUserOpeDisabled() == YES)\r
+ break;\r
// ドラッグ中は処理しない。ドラッグ後にWM_LBUTTONDOWNが飛んでくるため、そこで処理する。\r
if (Dragging == YES) \r
return (FALSE);\r
if(hWnd == hWndListRemote)\r
{\r
if(AskConnecting() == YES)\r
- UpLoadDragProc(wParam);\r
+ UploadDragProc(wParam);\r
}\r
else if(hWnd == hWndListLocal)\r
{\r
hCsrDrg = LoadCursor(NULL, IDC_ARROW);\r
SetCursor(hCsrDrg);\r
\r
+ // 同時接続対応\r
+ if(AskUserOpeDisabled() == YES)\r
+ break;\r
Point.x = (long)(short)LOWORD(lParam);\r
Point.y = (long)(short)HIWORD(lParam);\r
ClientToScreen(hWnd, &Point);\r
int i, j, filenum = 0;\r
\r
FILELIST *FileListBase, *FileListBaseNoExpand, *pf;\r
- int CancelFlg = NO;\r
+ // 特定の操作を行うと異常終了するバグ修正\r
+// int CancelFlg = NO;\r
char LocDir[FMAX_PATH+1];\r
char *PathDir;\r
- \r
+\r
+ // 特定の操作を行うと異常終了するバグ修正\r
+ GetCursorPos(&Point);\r
+ hWndPnt = WindowFromPoint(Point);\r
+ hWndParent = GetParent(hWndPnt);\r
+ DisableUserOpe();\r
+ CancelFlg = NO;\r
+\r
// 変数が未初期化のバグ修正\r
FileListBaseNoExpand = NULL;\r
// ローカル側で選ばれているファイルをFileListBaseに登録\r
FileListBaseNoExpand = FileListBase;\r
\r
} else if (hWndDragStart == hWndListRemote) {\r
- GetCursorPos(&Point);\r
- hWndPnt = WindowFromPoint(Point);\r
- hWndParent = GetParent(hWndPnt);\r
+ // 特定の操作を行うと異常終了するバグ修正\r
+// GetCursorPos(&Point);\r
+// hWndPnt = WindowFromPoint(Point);\r
+// hWndParent = GetParent(hWndPnt);\r
if (hWndPnt == hWndListRemote || hWndPnt == hWndListLocal ||\r
hWndParent == hWndListRemote || hWndParent == hWndListLocal) {\r
FileListBase = NULL;\r
\r
} \r
\r
+#if defined(HAVE_TANDEM)\r
+ if(FileListBaseNoExpand == NULL)\r
+ pf = FileListBase;\r
+ else\r
+#endif\r
pf = FileListBaseNoExpand;\r
+ // 特定の操作を行うと異常終了するバグ修正\r
+ if(pf != NULL)\r
+ Dragging = NO;\r
+ EnableUserOpe();\r
for (filenum = 0; pf ; filenum++) {\r
pf = pf->Next;\r
}\r
}\r
\r
/* ファイル名の配列を作成する */\r
- // TODO: GlobalAllocが返すのはメモリポインタではなくハンドルだが実際は同じ値\r
FileNameList = (char **)GlobalAlloc(GPTR,sizeof(char *) * filenum);\r
if(FileNameList == NULL){\r
abort();\r
LV_COLUMN LvCol;\r
int i;\r
\r
+ // 変数が未初期化のバグ修正\r
+ memset(&LvCol, 0, sizeof(LV_COLUMN));\r
+\r
for(i = 0; i <= 3; i++)\r
{\r
LvCol.mask = LVCF_WIDTH;\r
\r
void SetListViewType(void)\r
{\r
- long lStyle;\r
+ // 64ビット対応\r
+// long lStyle;\r
+ LONG_PTR lStyle;\r
\r
switch(ListType)\r
{\r
case LVS_LIST :\r
- lStyle = GetWindowLong(GetLocalHwnd(), GWL_STYLE);\r
+ // 64ビット対応\r
+// lStyle = GetWindowLong(GetLocalHwnd(), GWL_STYLE);\r
+ lStyle = GetWindowLongPtr(GetLocalHwnd(), GWL_STYLE);\r
lStyle &= ~(LVS_REPORT | LVS_LIST);\r
lStyle |= LVS_LIST;\r
- SetWindowLong(GetLocalHwnd(), GWL_STYLE, lStyle);\r
+ // 64ビット対応\r
+// SetWindowLong(GetLocalHwnd(), GWL_STYLE, lStyle);\r
+ SetWindowLongPtr(GetLocalHwnd(), GWL_STYLE, lStyle);\r
\r
- lStyle = GetWindowLong(GetRemoteHwnd(), GWL_STYLE);\r
+ // 64ビット対応\r
+// lStyle = GetWindowLong(GetRemoteHwnd(), GWL_STYLE);\r
+ lStyle = GetWindowLongPtr(GetRemoteHwnd(), GWL_STYLE);\r
lStyle &= ~(LVS_REPORT | LVS_LIST);\r
lStyle |= LVS_LIST;\r
- SetWindowLong(GetRemoteHwnd(), GWL_STYLE, lStyle);\r
+ // 64ビット対応\r
+// SetWindowLong(GetRemoteHwnd(), GWL_STYLE, lStyle);\r
+ SetWindowLongPtr(GetRemoteHwnd(), GWL_STYLE, lStyle);\r
break;\r
\r
default :\r
- lStyle = GetWindowLong(GetLocalHwnd(), GWL_STYLE);\r
+ // 64ビット対応\r
+// lStyle = GetWindowLong(GetLocalHwnd(), GWL_STYLE);\r
+ lStyle = GetWindowLongPtr(GetLocalHwnd(), GWL_STYLE);\r
lStyle &= ~(LVS_REPORT | LVS_LIST);\r
lStyle |= LVS_REPORT;\r
- SetWindowLong(GetLocalHwnd(), GWL_STYLE, lStyle);\r
+ // 64ビット対応\r
+// SetWindowLong(GetLocalHwnd(), GWL_STYLE, lStyle);\r
+ SetWindowLongPtr(GetLocalHwnd(), GWL_STYLE, lStyle);\r
\r
- lStyle = GetWindowLong(GetRemoteHwnd(), GWL_STYLE);\r
+ // 64ビット対応\r
+// lStyle = GetWindowLong(GetRemoteHwnd(), GWL_STYLE);\r
+ lStyle = GetWindowLongPtr(GetRemoteHwnd(), GWL_STYLE);\r
lStyle &= ~(LVS_REPORT | LVS_LIST);\r
lStyle |= LVS_REPORT;\r
- SetWindowLong(GetRemoteHwnd(), GWL_STYLE, lStyle);\r
+ // 64ビット対応\r
+// SetWindowLong(GetRemoteHwnd(), GWL_STYLE, lStyle);\r
+ SetWindowLongPtr(GetRemoteHwnd(), GWL_STYLE, lStyle);\r
break;\r
}\r
return;\r
\r
while(GetListOneLine(Str, FMAX_PATH, fd) == FFFTP_SUCCESS)\r
{\r
- if((ListType = AnalizeFileInfo(Str)) != LIST_UNKNOWN)\r
+ if((ListType = AnalyzeFileInfo(Str)) != LIST_UNKNOWN)\r
{\r
- if((Type = ResolvFileInfo(Str, ListType, Buf, &Size, &Time, &Attr, Owner, &Link, &InfoExist)) != NODE_NONE)\r
+ if((Type = ResolveFileInfo(Str, ListType, Buf, &Size, &Time, &Attr, Owner, &Link, &InfoExist)) != NODE_NONE)\r
{\r
if(AskFilterStr(Buf, Type) == YES)\r
{\r
* なし\r
*----------------------------------------------------------------------------*/\r
\r
+// ファイルアイコン表示対応\r
+void RefreshIconImageList(FLISTANCHOR *Anchor)\r
+{\r
+ HBITMAP hBitmap;\r
+ int ImageId;\r
+ FILELIST *Pos;\r
+ int i;\r
+ char Cur[FMAX_PATH+1];\r
+ SHFILEINFO FileInfo;\r
+ if(DispFileIcon == YES)\r
+ {\r
+ SendMessage(hWndListLocal, LVM_SETIMAGELIST, LVSIL_SMALL, (LPARAM)NULL);\r
+ ShowWindow(hWndListLocal, SW_SHOW);\r
+ SendMessage(hWndListRemote, LVM_SETIMAGELIST, LVSIL_SMALL, (LPARAM)NULL);\r
+ ShowWindow(hWndListRemote, SW_SHOW);\r
+ ImageList_Destroy(ListImgFileIcon);\r
+ ListImgFileIcon = ImageList_Create(16, 16, ILC_MASK | ILC_COLOR32, 0, 1);\r
+ hBitmap = LoadBitmap(GetFtpInst(), MAKEINTRESOURCE(dirattr16_bmp));\r
+ ImageList_AddMasked(ListImgFileIcon, hBitmap, RGB(255, 0, 0));\r
+ DeleteObject(hBitmap);\r
+ ImageId = 0;\r
+ Pos = Anchor->Top;\r
+ for(i = 0; i < Anchor->Files; i++)\r
+ {\r
+ Pos->ImageId = -1;\r
+ if(Pos->Node == NODE_DRIVE)\r
+ strcpy(Cur, Pos->File);\r
+ else\r
+ {\r
+ AskLocalCurDir(Cur, FMAX_PATH);\r
+ SetYenTail(Cur);\r
+ strcat(Cur, Pos->File);\r
+ }\r
+ if(SHGetFileInfo(Cur, 0, &FileInfo, sizeof(SHFILEINFO), SHGFI_SMALLICON | SHGFI_ICON) != 0)\r
+ {\r
+ if(ImageList_AddIcon(ListImgFileIcon, FileInfo.hIcon) >= 0)\r
+ {\r
+ Pos->ImageId = ImageId;\r
+ ImageId++;\r
+ }\r
+ DestroyIcon(FileInfo.hIcon);\r
+ }\r
+ Pos = Pos->Next;\r
+ }\r
+ SendMessage(hWndListLocal, LVM_SETIMAGELIST, LVSIL_SMALL, (LPARAM)ListImgFileIcon);\r
+ ShowWindow(hWndListLocal, SW_SHOW);\r
+ SendMessage(hWndListRemote, LVM_SETIMAGELIST, LVSIL_SMALL, (LPARAM)ListImgFileIcon);\r
+ ShowWindow(hWndListRemote, SW_SHOW);\r
+ }\r
+ else\r
+ {\r
+ SendMessage(hWndListLocal, LVM_SETIMAGELIST, LVSIL_SMALL, (LPARAM)ListImg);\r
+ ShowWindow(hWndListLocal, SW_SHOW);\r
+ SendMessage(hWndListRemote, LVM_SETIMAGELIST, LVSIL_SMALL, (LPARAM)ListImg);\r
+ ShowWindow(hWndListRemote, SW_SHOW);\r
+ }\r
+}\r
+\r
void GetLocalDirForWnd(void)\r
{\r
HANDLE fHnd;\r
SetLocalDirHist(Scan);\r
DispLocalFreeSpace(Scan);\r
\r
+ // ローカル側自動更新\r
+ if(ChangeNotification != INVALID_HANDLE_VALUE)\r
+ FindCloseChangeNotification(ChangeNotification);\r
+ 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
+\r
/* ディレクトリ/ファイル */\r
\r
SetYenTail(Scan);\r
if(DispDrives)\r
{\r
GetLogicalDriveStrings(FMAX_PATH, Scan);\r
- NoDrives = LoadHideDriveListRegistory();\r
+ NoDrives = LoadHideDriveListRegistry();\r
\r
Pos = Scan;\r
while(*Pos != NUL)\r
}\r
}\r
\r
+ // ファイルアイコン表示対応\r
+ RefreshIconImageList(&Anchor);\r
DispFileList2View(GetLocalHwnd(), &Anchor);\r
EraseDispFileList(&Anchor);\r
\r
\r
if((Sort & SORT_GET_ORD) == SORT_ASCENT)\r
{\r
- if((((Sort & SORT_MASK_ORD) == SORT_EXT) &&\r
- ((Cmp = _mbsicmp(GetFileExt(Name), GetFileExt(Pos->File))) < 0)) ||\r
- (((Sort & SORT_MASK_ORD) == SORT_SIZE) &&\r
- ((Cmp = Size - Pos->Size) < 0)) ||\r
- (((Sort & SORT_MASK_ORD) == SORT_DATE) &&\r
- ((Cmp = CompareFileTime(Time, &Pos->Time)) < 0)))\r
- {\r
+ // 読みにくいのでリファクタリング\r
+// if((((Sort & SORT_MASK_ORD) == SORT_EXT) &&\r
+// ((Cmp = _mbsicmp(GetFileExt(Name), GetFileExt(Pos->File))) < 0)) ||\r
+//#if defined(HAVE_TANDEM)\r
+// ((AskHostType() == HTYPE_TANDEM) &&\r
+// ((Sort & SORT_MASK_ORD) == SORT_EXT) &&\r
+// ((Cmp = Attr - Pos->Attr) < 0)) ||\r
+//#endif\r
+// (((Sort & SORT_MASK_ORD) == SORT_SIZE) &&\r
+// ((Cmp = Size - Pos->Size) < 0)) ||\r
+// (((Sort & SORT_MASK_ORD) == SORT_DATE) &&\r
+// ((Cmp = CompareFileTime(Time, &Pos->Time)) < 0)))\r
+// {\r
+// break;\r
+// }\r
+ if(((Sort & SORT_MASK_ORD) == SORT_EXT) &&\r
+ ((Cmp = _mbsicmp(GetFileExt(Name), GetFileExt(Pos->File))) < 0))\r
+ break;\r
+#if defined(HAVE_TANDEM)\r
+ if((AskHostType() == HTYPE_TANDEM) &&\r
+ ((Sort & SORT_MASK_ORD) == SORT_EXT) &&\r
+ ((Cmp = Attr - Pos->Attr) < 0))\r
+ break;\r
+#endif\r
+ if(((Sort & SORT_MASK_ORD) == SORT_SIZE) &&\r
+ ((Cmp = Size - Pos->Size) < 0))\r
+ break;\r
+ if(((Sort & SORT_MASK_ORD) == SORT_DATE) &&\r
+ ((Cmp = CompareFileTime(Time, &Pos->Time)) < 0))\r
break;\r
- }\r
\r
if(((Sort & SORT_MASK_ORD) == SORT_NAME) || (Cmp == 0))\r
{\r
}\r
else\r
{\r
+ // 読みにくいのでリファクタリング\r
+// if((((Sort & SORT_MASK_ORD) == SORT_EXT) &&\r
+// ((Cmp = _mbsicmp(GetFileExt(Name), GetFileExt(Pos->File))) > 0)) ||\r
+//#if defined(HAVE_TANDEM)\r
+// ((AskHostType() == HTYPE_TANDEM) &&\r
+// ((Sort & SORT_MASK_ORD) == SORT_EXT) &&\r
+// ((Cmp = Attr - Pos->Attr) > 0)) ||\r
+//#endif\r
+// (((Sort & SORT_MASK_ORD) == SORT_SIZE) &&\r
+// ((Cmp = Size - Pos->Size) > 0)) ||\r
+// (((Sort & SORT_MASK_ORD) == SORT_DATE) &&\r
+// ((Cmp = CompareFileTime(Time, &Pos->Time)) > 0)))\r
+// {\r
+// break;\r
+// }\r
if((((Sort & SORT_MASK_ORD) == SORT_EXT) &&\r
- ((Cmp = _mbsicmp(GetFileExt(Name), GetFileExt(Pos->File))) > 0)) ||\r
- (((Sort & SORT_MASK_ORD) == SORT_SIZE) &&\r
- ((Cmp = Size - Pos->Size) > 0)) ||\r
- (((Sort & SORT_MASK_ORD) == SORT_DATE) &&\r
- ((Cmp = CompareFileTime(Time, &Pos->Time)) > 0)))\r
- {\r
+ ((Cmp = _mbsicmp(GetFileExt(Name), GetFileExt(Pos->File))) > 0)))\r
+ break;\r
+#if defined(HAVE_TANDEM)\r
+ if(((AskHostType() == HTYPE_TANDEM) &&\r
+ ((Sort & SORT_MASK_ORD) == SORT_EXT) &&\r
+ ((Cmp = Attr - Pos->Attr) > 0)))\r
+ break;\r
+#endif\r
+ if(((Sort & SORT_MASK_ORD) == SORT_SIZE) &&\r
+ ((Cmp = Size - Pos->Size) > 0))\r
+ break;\r
+ if(((Sort & SORT_MASK_ORD) == SORT_DATE) &&\r
+ ((Cmp = CompareFileTime(Time, &Pos->Time)) > 0))\r
break;\r
- }\r
\r
if(((Sort & SORT_MASK_ORD) == SORT_NAME) || (Cmp == 0))\r
{\r
Pos = Anchor->Top;\r
for(i = 0; i < Anchor->Files; i++)\r
{\r
- AddListView(hWnd, -1, Pos->File, Pos->Node, Pos->Size, &Pos->Time, Pos->Attr, Pos->Owner, Pos->Link, Pos->InfoExist);\r
+ // ファイルアイコン表示対応\r
+// AddListView(hWnd, -1, Pos->File, Pos->Node, Pos->Size, &Pos->Time, Pos->Attr, Pos->Owner, Pos->Link, Pos->InfoExist);\r
+ AddListView(hWnd, -1, Pos->File, Pos->Node, Pos->Size, &Pos->Time, Pos->Attr, Pos->Owner, Pos->Link, Pos->InfoExist, Pos->ImageId);\r
Pos = Pos->Next;\r
}\r
\r
* なし\r
*----------------------------------------------------------------------------*/\r
\r
-static void AddListView(HWND hWnd, int Pos, char *Name, int Type, LONGLONG Size, FILETIME *Time, int Attr, char *Owner, int Link, int InfoExist)\r
+// ファイルアイコン表示対応\r
+//static void AddListView(HWND hWnd, int Pos, char *Name, int Type, LONGLONG Size, FILETIME *Time, int Attr, char *Owner, int Link, int InfoExist)\r
+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
{\r
LV_ITEM LvItem;\r
char Tmp[20];\r
if(Pos == -1)\r
Pos = SendMessage(hWnd, LVM_GETITEMCOUNT, 0, 0);\r
\r
+ // 変数が未初期化のバグ修正\r
+ memset(&LvItem, 0, sizeof(LV_ITEM));\r
/* アイコン/ファイル名 */\r
LvItem.mask = LVIF_TEXT | LVIF_IMAGE;\r
LvItem.iItem = Pos;\r
LvItem.iImage = Type;\r
else\r
LvItem.iImage = 4;\r
+ // ファイルアイコン表示対応\r
+ if(DispFileIcon == YES && hWnd == GetLocalHwnd())\r
+ LvItem.iImage = ImageId + 5;\r
LvItem.iItem = SendMessage(hWnd, LVM_INSERTITEM, 0, (LPARAM)&LvItem);\r
\r
/* 日付/時刻 */\r
- FileTime2TimeString(Time, Tmp, DISPFORM_LEGACY, InfoExist);\r
+ // タイムスタンプのバグ修正\r
+// FileTime2TimeString(Time, Tmp, DISPFORM_LEGACY, InfoExist);\r
+ FileTime2TimeString(Time, Tmp, DISPFORM_LEGACY, InfoExist, DispTimeSeconds);\r
LvItem.mask = LVIF_TEXT;\r
LvItem.iItem = Pos;\r
LvItem.iSubItem = 1;\r
LvItem.mask = LVIF_TEXT;\r
LvItem.iItem = Pos;\r
LvItem.iSubItem = 3;\r
+#if defined(HAVE_TANDEM)\r
+ if (AskHostType() == HTYPE_TANDEM) {\r
+ _itoa_s(Attr, Tmp, sizeof(Tmp), 10);\r
+ LvItem.pszText = Tmp;\r
+ } else\r
+#endif\r
LvItem.pszText = GetFileExt(Name);\r
LvItem.iItem = SendMessage(hWnd, LVM_SETITEM, 0, (LPARAM)&LvItem);\r
\r
{\r
/* 属性 */\r
strcpy(Tmp, "");\r
+#if defined(HAVE_TANDEM)\r
+ if((InfoExist & FINFO_ATTR) && (AskHostType() != HTYPE_TANDEM))\r
+#else\r
if(InfoExist & FINFO_ATTR)\r
- AttrValue2String(Attr, Tmp);\r
+#endif\r
+ // ファイルの属性を数字で表示\r
+// AttrValue2String(Attr, Tmp);\r
+ AttrValue2String(Attr, Tmp, DispPermissionsNumber);\r
LvItem.mask = LVIF_TEXT;\r
LvItem.iItem = Pos;\r
LvItem.iSubItem = 4;\r
* なし\r
*----------------------------------------------------------------------------*/\r
\r
-void SelectFileInList(HWND hWnd, int Type)\r
+// ローカル側自動更新\r
+//void SelectFileInList(HWND hWnd, int Type)\r
+void SelectFileInList(HWND hWnd, int Type, FILELIST *Base)\r
{\r
int Win;\r
int WinDst;\r
FILETIME Time2;\r
int Find;\r
\r
+ // 変数が未初期化のバグ修正\r
+ memset(&LvItem, 0, sizeof(LV_ITEM));\r
Win = WIN_LOCAL;\r
WinDst = WIN_REMOTE;\r
if(hWnd == GetRemoteHwnd())\r
}\r
}\r
break;\r
+\r
+ // ローカル側自動更新\r
+ case SELECT_LIST :\r
+ for(i = 0; i < Num; i++)\r
+ {\r
+ LvItem.state = 0;\r
+ GetNodeName(Win, i, Name, FMAX_PATH);\r
+ if(SearchFileList(Name, Base, COMP_STRICT) != NULL)\r
+ LvItem.state = LVIS_SELECTED;\r
+ LvItem.mask = LVIF_STATE;\r
+ LvItem.iItem = i;\r
+ LvItem.stateMask = LVIS_SELECTED;\r
+ LvItem.iSubItem = 0;\r
+ SendMessage(hWnd, LVM_SETITEMSTATE, i, (LPARAM)&LvItem);\r
+ }\r
+ break;\r
}\r
return;\r
}\r
* BOOL TRUE/FALSE\r
*----------------------------------------------------------------------------*/\r
\r
-static BOOL CALLBACK SelectDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam)\r
+// 64ビット対応\r
+//static BOOL CALLBACK SelectDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam)\r
+static INT_PTR CALLBACK SelectDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam)\r
{\r
switch (iMessage)\r
{\r
LV_ITEM LvItem;\r
char *Title;\r
\r
+ // 変数が未初期化のバグ修正\r
+ memset(&LvItem, 0, sizeof(LV_ITEM));\r
Win = WIN_LOCAL;\r
Title = MSGJPN050;\r
if(hWnd == GetRemoteHwnd())\r
}\r
\r
\r
+// ローカル側自動更新\r
+int GetHotSelected(int Win, char *Fname)\r
+{\r
+ HWND hWnd;\r
+ int Pos;\r
+\r
+ hWnd = GetLocalHwnd();\r
+ if(Win == WIN_REMOTE)\r
+ hWnd = GetRemoteHwnd();\r
+\r
+ Pos = SendMessage(hWnd, LVM_GETNEXTITEM, (WPARAM)-1, (LPARAM)MAKELPARAM(LVNI_FOCUSED, 0));\r
+ if(Pos != -1)\r
+ GetNodeName(Win, Pos, Fname, FMAX_PATH);\r
+\r
+ return Pos;\r
+}\r
+\r
+int SetHotSelected(int Win, char *Fname)\r
+{\r
+ HWND hWnd;\r
+ int i;\r
+ int Num;\r
+ char Name[FMAX_PATH+1];\r
+ LV_ITEM LvItem;\r
+ int Pos;\r
+\r
+ hWnd = GetLocalHwnd();\r
+ if(Win == WIN_REMOTE)\r
+ hWnd = GetRemoteHwnd();\r
+\r
+ Num = GetItemCount(Win);\r
+ memset(&LvItem, 0, sizeof(LV_ITEM));\r
+ Pos = -1;\r
+ for(i = 0; i < Num; i++)\r
+ {\r
+ LvItem.state = 0;\r
+ GetNodeName(Win, i, Name, FMAX_PATH);\r
+ if(_mbscmp(Fname, Name) == 0)\r
+ {\r
+ Pos = i;\r
+ LvItem.state = LVIS_FOCUSED;\r
+ }\r
+ LvItem.mask = LVIF_STATE;\r
+ LvItem.iItem = i;\r
+ LvItem.stateMask = LVIS_FOCUSED;\r
+ LvItem.iSubItem = 0;\r
+ SendMessage(hWnd, LVM_SETITEMSTATE, i, (LPARAM)&LvItem);\r
+ }\r
+\r
+ return Pos;\r
+}\r
+\r
/*----- 指定された名前のアイテムを探す ----------------------------------------\r
*\r
* Parameter\r
if(Win == WIN_REMOTE)\r
hWnd = GetRemoteHwnd();\r
\r
+ // 変数が未初期化のバグ修正\r
+ memset(&FindInfo, 0, sizeof(LV_FINDINFO));\r
FindInfo.flags = LVFI_STRING;\r
FindInfo.psz = Name;\r
return(SendMessage(hWnd, LVM_FINDITEM, -1, (LPARAM)&FindInfo));\r
if(Win == WIN_REMOTE)\r
hWnd = GetRemoteHwnd();\r
\r
+ // 変数が未初期化のバグ修正\r
+ memset(&LvItem, 0, sizeof(LV_ITEM));\r
LvItem.mask = LVIF_TEXT;\r
LvItem.iItem = Pos;\r
LvItem.iSubItem = 0;\r
if(Win == WIN_REMOTE)\r
hWnd = GetRemoteHwnd();\r
\r
+ // 変数が未初期化のバグ修正\r
+ memset(&LvItem, 0, sizeof(LV_ITEM));\r
LvItem.mask = LVIF_TEXT;\r
LvItem.iItem = Pos;\r
LvItem.iSubItem = 1;\r
if(Win == WIN_REMOTE)\r
hWnd = GetRemoteHwnd();\r
\r
+ // 変数が未初期化のバグ修正\r
+ memset(&LvItem, 0, sizeof(LV_ITEM));\r
LvItem.mask = LVIF_TEXT;\r
LvItem.iItem = Pos;\r
LvItem.iSubItem = 2;\r
SendMessage(hWnd, LVM_GETITEM, 0, (LPARAM)&LvItem);\r
*Buf = -1;\r
Ret = NO;\r
+#if defined(HAVE_TANDEM)\r
+ if(AskHostType() == HTYPE_TANDEM) {\r
+ RemoveComma(Tmp);\r
+ *Buf = _atoi64(Tmp);\r
+ Ret = YES;\r
+ } else\r
+#endif\r
if(strlen(Tmp) > 0)\r
{\r
RemoveComma(Tmp);\r
Ret = NO;\r
if(Win == WIN_REMOTE)\r
{\r
+ // 変数が未初期化のバグ修正\r
+ memset(&LvItem, 0, sizeof(LV_ITEM));\r
LvItem.mask = LVIF_TEXT;\r
LvItem.iItem = Pos;\r
+#if defined(HAVE_TANDEM)\r
+ if(AskHostType() == HTYPE_TANDEM)\r
+ LvItem.iSubItem = 3;\r
+ else\r
+#endif\r
LvItem.iSubItem = 4;\r
LvItem.pszText = Tmp;\r
LvItem.cchTextMax = 20;\r
SendMessage(GetRemoteHwnd(), LVM_GETITEM, 0, (LPARAM)&LvItem);\r
if(strlen(Tmp) > 0)\r
{\r
+#if defined(HAVE_TANDEM)\r
+ if(AskHostType() == HTYPE_TANDEM)\r
+ *Buf = atoi(Tmp);\r
+ else\r
+#endif\r
*Buf = AttrString2Value(Tmp);\r
Ret = YES;\r
}\r
if(Win == WIN_REMOTE)\r
hWnd = GetRemoteHwnd();\r
\r
+ // 変数が未初期化のバグ修正\r
+ memset(&LvItem, 0, sizeof(LV_ITEM));\r
LvItem.mask = LVIF_TEXT;\r
LvItem.iItem = Pos;\r
LvItem.iSubItem = 2;\r
}\r
\r
\r
+/*----- 指定位置のアイテムのイメージ番号を返す ----------------------------------------\r
+*\r
+* Parameter\r
+* int Win : ウインドウ番号 (WIN_xxx)\r
+* int Pos : 位置\r
+*\r
+* Return Value\r
+* int イメージ番号\r
+* 4 Symlink\r
+*----------------------------------------------------------------------------*/\r
+static int GetImageIndex(int Win, int Pos)\r
+{\r
+ HWND hWnd;\r
+ LV_ITEM LvItem;\r
+\r
+ hWnd = GetLocalHwnd();\r
+ if(Win == WIN_REMOTE)\r
+ hWnd = GetRemoteHwnd();\r
+\r
+ // 変数が未初期化のバグ修正\r
+ memset(&LvItem, 0, sizeof(LV_ITEM));\r
+ LvItem.mask = LVIF_IMAGE;\r
+ LvItem.iItem = Pos;\r
+ LvItem.iSubItem = 0;\r
+ SendMessage(hWnd, LVM_GETITEM, 0, (LPARAM)&LvItem);\r
+ return LvItem.iImage;\r
+}\r
+\r
+\r
/*----- 指定位置のアイテムのオーナ名を返す ------------------------------------\r
*\r
* Parameter\r
strcpy(Buf, "");\r
if(Win == WIN_REMOTE)\r
{\r
+ // 変数が未初期化のバグ修正\r
+ memset(&LvItem, 0, sizeof(LV_ITEM));\r
LvItem.mask = LVIF_TEXT;\r
LvItem.iItem = Pos;\r
LvItem.iSubItem = 5;\r
* なし\r
*----------------------------------------------------------------------------*/\r
\r
-void MakeSelectedFileList(int Win, int Expand, int All, FILELIST **Base, int *CancelCheckWork)\r
+// ファイル一覧バグ修正\r
+//void MakeSelectedFileList(int Win, int Expand, int All, FILELIST **Base, int *CancelCheckWork)\r
+int MakeSelectedFileList(int Win, int Expand, int All, FILELIST **Base, int *CancelCheckWork)\r
{\r
+ // ファイル一覧バグ修正\r
+ int Sts;\r
int Pos;\r
char Name[FMAX_PATH+1];\r
char Cur[FMAX_PATH+1];\r
DWORD Attr;\r
int Ignore;\r
\r
+ // ファイル一覧バグ修正\r
+ Sts = FFFTP_SUCCESS;\r
if((All == YES) || (GetSelectedCount(Win) > 0))\r
{\r
/*===== カレントディレクトリのファイル =====*/\r
if((Node == NODE_FILE) ||\r
((Expand == NO) && (Node == NODE_DIR)))\r
{\r
+ // 変数が未初期化のバグ修正\r
+ memset(&Pkt, 0, sizeof(FILELIST));\r
+\r
Pkt.InfoExist = 0;\r
GetNodeName(Win, Pos, Pkt.File, FMAX_PATH);\r
if(GetNodeSize(Win, Pos, &Pkt.Size) == YES)\r
{\r
if(GetNodeType(Win, Pos) == NODE_DIR)\r
{\r
+ // 変数が未初期化のバグ修正\r
+ memset(&Pkt, 0, sizeof(FILELIST));\r
+\r
GetNodeName(Win, Pos, Name, FMAX_PATH);\r
strcpy(Pkt.File, Name);\r
ReplaceAll(Pkt.File, '\\', '/');\r
\r
if(Ignore == NO)\r
{\r
- Pkt.Node = NODE_DIR;\r
+// Pkt.Node = NODE_DIR;\r
+ if(GetImageIndex(Win, Pos) == 4) // symlink\r
+ Pkt.Node = NODE_FILE;\r
+ else\r
+ Pkt.Node = NODE_DIR;\r
Pkt.Attr = 0;\r
Pkt.Size = 0;\r
memset(&Pkt.Time, 0, sizeof(FILETIME));\r
AddFileList(&Pkt, Base);\r
\r
- if(Win == WIN_LOCAL)\r
- MakeLocalTree(Name, Base);\r
- else\r
- {\r
- AskRemoteCurDir(Cur, FMAX_PATH);\r
-\r
- if((AskListCmdMode() == NO) &&\r
- (AskUseNLST_R() == YES))\r
- MakeRemoteTree1(Name, Cur, Base, CancelCheckWork);\r
+// if(Win == WIN_LOCAL)\r
+// MakeLocalTree(Name, Base);\r
+// else\r
+// {\r
+// AskRemoteCurDir(Cur, FMAX_PATH);\r
+//\r
+// if((AskListCmdMode() == NO) &&\r
+// (AskUseNLST_R() == YES))\r
+// MakeRemoteTree1(Name, Cur, Base, CancelCheckWork);\r
+// else\r
+// MakeRemoteTree2(Name, Cur, Base, CancelCheckWork);\r
+// }\r
+ if(GetImageIndex(Win, Pos) != 4) { // symlink\r
+ if(Win == WIN_LOCAL)\r
+ // ファイル一覧バグ修正\r
+// MakeLocalTree(Name, Base);\r
+ {\r
+ if(MakeLocalTree(Name, Base) == FFFTP_FAIL)\r
+ Sts = FFFTP_FAIL;\r
+ }\r
else\r
- MakeRemoteTree2(Name, Cur, Base, CancelCheckWork);\r
+ {\r
+ AskRemoteCurDir(Cur, FMAX_PATH);\r
+\r
+ if((AskListCmdMode() == NO) &&\r
+ (AskUseNLST_R() == YES))\r
+ // ファイル一覧バグ修正\r
+// MakeRemoteTree1(Name, Cur, Base, CancelCheckWork);\r
+ {\r
+ if(MakeRemoteTree1(Name, Cur, Base, CancelCheckWork) == FFFTP_FAIL)\r
+ Sts = FFFTP_FAIL;\r
+ }\r
+ else\r
+ // ファイル一覧バグ修正\r
+// MakeRemoteTree2(Name, Cur, Base, CancelCheckWork);\r
+ {\r
+ if(MakeRemoteTree2(Name, Cur, Base, CancelCheckWork) == FFFTP_FAIL)\r
+ Sts = FFFTP_FAIL;\r
+ }\r
\r
//DispListList(*Base, "LIST");\r
\r
+ }\r
}\r
}\r
}\r
}\r
}\r
}\r
- return;\r
+ // ファイル一覧バグ修正\r
+// return;\r
+ return(Sts);\r
}\r
\r
\r
\r
if((GetFileAttributes(Name) & FILE_ATTRIBUTE_DIRECTORY) == 0)\r
{\r
+ // 変数が未初期化のバグ修正\r
+ memset(&Pkt, 0, sizeof(FILELIST));\r
+\r
Pkt.Node = NODE_FILE;\r
strcpy(Pkt.File, GetFileName(Name));\r
\r
memset(&Pkt.Time, 0, sizeof(FILETIME));\r
+#if defined(HAVE_TANDEM)\r
+ /* Guardian スペースへのアップロードのためにサイズが必要 */\r
+ Pkt.Size = 0;\r
+ Pkt.InfoExist = 0;\r
+#endif\r
if((fHnd = FindFirstFile(Name, &Find)) != INVALID_HANDLE_VALUE)\r
{\r
FindClose(fHnd);\r
Pkt.Time = Find.ftLastWriteTime;\r
+#if defined(HAVE_TANDEM)\r
+ Pkt.Size = MakeLongLong(Find.nFileSizeHigh, Find.nFileSizeLow);\r
+ Pkt.InfoExist |= (FINFO_TIME | FINFO_DATE | FINFO_SIZE);\r
+#endif\r
}\r
AddFileList(&Pkt, Base);\r
}\r
\r
if(GetFileAttributes(Name) & FILE_ATTRIBUTE_DIRECTORY)\r
{\r
+ // 変数が未初期化のバグ修正\r
+ memset(&Pkt, 0, sizeof(FILELIST));\r
+\r
Pkt.Node = NODE_DIR;\r
strcpy(Pkt.File, GetFileName(Name));\r
AddFileList(&Pkt, Base);\r
* NLST -alLR を使う\r
*----------------------------------------------------------------------------*/\r
\r
-static void MakeRemoteTree1(char *Path, char *Cur, FILELIST **Base, int *CancelCheckWork)\r
+// ファイル一覧バグ修正\r
+//static void MakeRemoteTree1(char *Path, char *Cur, FILELIST **Base, int *CancelCheckWork)\r
+static int MakeRemoteTree1(char *Path, char *Cur, FILELIST **Base, int *CancelCheckWork)\r
{\r
+ // ファイル一覧バグ修正\r
+ int Ret;\r
int Sts;\r
\r
+ // ファイル一覧バグ修正\r
+ Ret = FFFTP_FAIL;\r
if(DoCWD(Path, NO, NO, NO) == FTP_COMPLETE)\r
{\r
/* サブフォルダも含めたリストを取得 */\r
DoCWD(Cur, NO, NO, NO);\r
\r
if(Sts == FTP_COMPLETE)\r
+ // ファイル一覧バグ修正\r
+// AddRemoteTreeToFileList(999, Path, RDIR_NLST, Base);\r
+ {\r
AddRemoteTreeToFileList(999, Path, RDIR_NLST, Base);\r
+ Ret = FFFTP_SUCCESS;\r
+ }\r
}\r
- return;\r
+ // ファイル一覧バグ修正\r
+// return;\r
+ return(Ret);\r
}\r
\r
\r
* 各フォルダに移動してリストを取得\r
*----------------------------------------------------------------------------*/\r
\r
-static void MakeRemoteTree2(char *Path, char *Cur, FILELIST **Base, int *CancelCheckWork)\r
+// ファイル一覧バグ修正\r
+//static void MakeRemoteTree2(char *Path, char *Cur, FILELIST **Base, int *CancelCheckWork)\r
+static int MakeRemoteTree2(char *Path, char *Cur, FILELIST **Base, int *CancelCheckWork)\r
{\r
+ // ファイル一覧バグ修正\r
+ int Ret;\r
int Sts;\r
FILELIST *CurList;\r
FILELIST *Pos;\r
FILELIST Pkt;\r
\r
+ // ファイル一覧バグ修正\r
+ Ret = FFFTP_FAIL;\r
/* VAX VMS は CWD xxx/yyy という指定ができないので */\r
/* CWD xxx, Cwd yyy と複数に分ける */\r
if(AskHostType() != HTYPE_VMS)\r
AddRemoteTreeToFileList(999, Path, RDIR_CWD, &CurList);\r
CopyTmpListToFileList(Base, CurList);\r
\r
+ // ファイル一覧バグ修正\r
+ Ret = FFFTP_SUCCESS;\r
+\r
Pos = CurList;\r
while(Pos != NULL)\r
{\r
if(Pos->Node == NODE_DIR)\r
{\r
+ // 変数が未初期化のバグ修正\r
+ memset(&Pkt, 0, sizeof(FILELIST));\r
+\r
/* まずディレクトリ名をセット */\r
strcpy(Pkt.File, Pos->File);\r
- Pkt.Node = NODE_DIR;\r
+// Pkt.Node = NODE_DIR;\r
+ Pkt.Link = Pos->Link;\r
+ if(Pkt.Link == YES)\r
+ Pkt.Node = NODE_FILE;\r
+ else\r
+ Pkt.Node = NODE_DIR;\r
Pkt.Size = 0;\r
Pkt.Attr = 0;\r
memset(&Pkt.Time, 0, sizeof(FILETIME));\r
AddFileList(&Pkt, Base);\r
\r
/* そのディレクトリの中を検索 */\r
- MakeRemoteTree2(Pos->File, Cur, Base, CancelCheckWork);\r
+// MakeRemoteTree2(Pos->File, Cur, Base, CancelCheckWork);\r
+ if(Pkt.Link == NO)\r
+ // ファイル一覧バグ修正\r
+// MakeRemoteTree2(Pos->File, Cur, Base, CancelCheckWork);\r
+ {\r
+ if(MakeRemoteTree2(Pos->File, Cur, Base, CancelCheckWork) == FFFTP_FAIL)\r
+ Ret = FFFTP_FAIL;\r
+ }\r
}\r
Pos = Pos->Next;\r
}\r
DeleteFileList(&CurList);\r
}\r
}\r
- return;\r
+ // ファイル一覧バグ修正\r
+// return;\r
+ return(Ret);\r
}\r
\r
\r
\r
while(GetListOneLine(Str, FMAX_PATH, fd) == FFFTP_SUCCESS)\r
{\r
- if((ListType = AnalizeFileInfo(Str)) == LIST_UNKNOWN)\r
+ if((ListType = AnalyzeFileInfo(Str)) == LIST_UNKNOWN)\r
{\r
if(MakeDirPath(Str, ListType, Path, Dir) == FFFTP_SUCCESS)\r
{\r
if(IncDir == RDIR_NLST)\r
{\r
+ // 変数が未初期化のバグ修正\r
+ memset(&Pkt, 0, sizeof(FILELIST));\r
+\r
strcpy(Pkt.File, Dir);\r
Pkt.Node = NODE_DIR;\r
Pkt.Size = 0;\r
}\r
else\r
{\r
- Node = ResolvFileInfo(Str, ListType, Name, &Size, &Time, &Attr, Owner, &Link, &InfoExist);\r
+ Node = ResolveFileInfo(Str, ListType, Name, &Size, &Time, &Attr, Owner, &Link, &InfoExist);\r
\r
if(AskFilterStr(Name, Node) == YES)\r
{\r
if((Node == NODE_FILE) ||\r
((IncDir == RDIR_CWD) && (Node == NODE_DIR)))\r
{\r
+ // 変数が未初期化のバグ修正\r
+ memset(&Pkt, 0, sizeof(FILELIST));\r
+\r
strcpy(Pkt.File, Dir);\r
if(strlen(Pkt.File) > 0)\r
SetSlashTail(Pkt.File);\r
* なし\r
*----------------------------------------------------------------------------*/\r
\r
-static void MakeLocalTree(char *Path, FILELIST **Base)\r
+// ファイル一覧バグ修正\r
+//static void MakeLocalTree(char *Path, FILELIST **Base)\r
+static int MakeLocalTree(char *Path, FILELIST **Base)\r
{\r
+ // ファイル一覧バグ修正\r
+ int Sts;\r
char Src[FMAX_PATH+1];\r
HANDLE fHnd;\r
WIN32_FIND_DATA FindBuf;\r
FILELIST Pkt;\r
SYSTEMTIME TmpStime;\r
\r
+ // ファイル一覧バグ修正\r
+ Sts = FFFTP_FAIL;\r
+\r
strcpy(Src, Path);\r
SetYenTail(Src);\r
strcat(Src, "*");\r
{\r
if(AskFilterStr(FindBuf.cFileName, NODE_FILE) == YES)\r
{\r
+ // 変数が未初期化のバグ修正\r
+ memset(&Pkt, 0, sizeof(FILELIST));\r
+\r
strcpy(Pkt.File, Path);\r
SetSlashTail(Pkt.File);\r
strcat(Pkt.File, FindBuf.cFileName);\r
Pkt.Attr = 0;\r
Pkt.Time = FindBuf.ftLastWriteTime;\r
FileTimeToSystemTime(&Pkt.Time, &TmpStime);\r
- TmpStime.wSecond = 0;\r
+ // タイムスタンプのバグ修正\r
+// TmpStime.wSecond = 0;\r
+ if(DispTimeSeconds == NO)\r
+ TmpStime.wSecond = 0;\r
TmpStime.wMilliseconds = 0;\r
SystemTimeToFileTime(&TmpStime, &Pkt.Time);\r
AddFileList(&Pkt, Base);\r
\r
if((fHnd = FindFirstFileAttr(Src, &FindBuf, DispIgnoreHide)) != INVALID_HANDLE_VALUE)\r
{\r
+ // ファイル一覧バグ修正\r
+ Sts = FFFTP_SUCCESS;\r
do\r
{\r
if((FindBuf.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) &&\r
(strcmp(FindBuf.cFileName, ".") != 0) &&\r
(strcmp(FindBuf.cFileName, "..") != 0))\r
{\r
+ // 変数が未初期化のバグ修正\r
+ memset(&Pkt, 0, sizeof(FILELIST));\r
+\r
strcpy(Src, Path);\r
SetYenTail(Src);\r
strcat(Src, FindBuf.cFileName);\r
memset(&Pkt.Time, 0, sizeof(FILETIME));\r
AddFileList(&Pkt, Base);\r
\r
- MakeLocalTree(Src, Base);\r
+ // ファイル一覧バグ修正\r
+// MakeLocalTree(Src, Base);\r
+ if(MakeLocalTree(Src, Base) == FFFTP_FAIL)\r
+ Sts = FFFTP_FAIL;\r
}\r
}\r
while(FindNextFileAttr(fHnd, &FindBuf, DispIgnoreHide) == TRUE);\r
FindClose(fHnd);\r
}\r
- return;\r
+ // ファイル一覧バグ修正\r
+// return;\r
+ return(Sts);\r
}\r
\r
\r
* int リストタイプ (LIST_xxx)\r
*----------------------------------------------------------------------------*/\r
\r
-static int AnalizeFileInfo(char *Str)\r
+static int AnalyzeFileInfo(char *Str)\r
{\r
int Ret;\r
char Tmp[FMAX_PATH+1];\r
Ret = LIST_SHIBASOKU;\r
else\r
{\r
+ // MLSD対応\r
+ if(FindField(Str, Tmp, 0, NO) == FFFTP_SUCCESS)\r
+ {\r
+ _strlwr(Tmp);\r
+ if(strstr(Tmp, "type=") != NULL)\r
+ {\r
+ if(FindField2(Str, Tmp, ';', 1, NO) == FFFTP_SUCCESS && FindField2(Str, Tmp, '=', 1, NO) == FFFTP_SUCCESS)\r
+ {\r
+ Ret = LIST_MLSD;\r
+ }\r
+ }\r
+ }\r
+\r
/* 以下のフォーマットをチェック */\r
/* LIST_UNIX_10, LIST_UNIX_20, LIST_UNIX_12, LIST_UNIX_22, LIST_UNIX_50, LIST_UNIX_60 */\r
/* MELCOM80 */\r
\r
- if(FindField(Str, Tmp, 0, NO) == FFFTP_SUCCESS)\r
+ // MLSD対応\r
+// if(FindField(Str, Tmp, 0, NO) == FFFTP_SUCCESS)\r
+ if(Ret == LIST_UNKNOWN && FindField(Str, Tmp, 0, NO) == FFFTP_SUCCESS)\r
{\r
/* MELCOM80は "d rwxrwxrwx" のようにスペースが空いている */\r
Flag1 = NO;\r
}\r
}\r
\r
+ // linux-ftpd\r
+ if((Ret == LIST_UNKNOWN) &&\r
+ (FindField(Str, Tmp, 7+Add1, NO) == FFFTP_SUCCESS))\r
+ {\r
+ if((FindField(Str, Tmp, 5, NO) == FFFTP_SUCCESS) &&\r
+ (CheckYYYYMMDDformat(Tmp, NUL) != 0))\r
+ {\r
+ if((FindField(Str, Tmp, 6, NO) == FFFTP_SUCCESS) &&\r
+ (CheckHHMMformat(Tmp) == YES))\r
+ {\r
+ Ret = LIST_UNIX_16;\r
+ }\r
+ }\r
+ }\r
+\r
if((Ret != LIST_UNKNOWN) && (Flag1 == YES))\r
Ret |= LIST_MELCOM;\r
+\r
+ // uClinux\r
+ if((Ret == LIST_UNKNOWN) &&\r
+ (FindField(Str, Tmp, 5+Add1, NO) == FFFTP_SUCCESS))\r
+ {\r
+ Ret = LIST_UNIX_17;\r
+ }\r
}\r
}\r
\r
}\r
}\r
\r
+ // Windows Server 2008 R2\r
+ if(Ret == LIST_UNKNOWN)\r
+ {\r
+ if((FindField(Str, Tmp, 1, NO) == FFFTP_SUCCESS) &&\r
+ (CheckHHMMformat(Tmp) == YES))\r
+ {\r
+ if((FindField(Str, Tmp, 2, NO) == FFFTP_SUCCESS) &&\r
+ ((Tmp[0] == '<') || (IsDigit(Tmp[0]) != 0)))\r
+ {\r
+ if(FindField(Str, Tmp, 3, NO) == FFFTP_SUCCESS)\r
+ {\r
+ if((FindField(Str, Tmp, 0, NO) == FFFTP_SUCCESS) &&\r
+ (CheckMMDDYYYYformat(Tmp, NUL) != 0))\r
+ {\r
+ Ret = LIST_DOS_5;\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
/* 以下のフォーマットをチェック */\r
/* LIST_CHAMELEON */\r
\r
}\r
}\r
}\r
+#if defined(HAVE_TANDEM)\r
+ /* 以下のフォーマットをチェック */\r
+ /* LIST_TANDEM */\r
\r
- // MLSD対応\r
- if(Ret == LIST_UNKNOWN)\r
- {\r
- if(FindField2(Str, Tmp, ';', 1, NO) == FFFTP_SUCCESS && FindField2(Str, Tmp, '=', 1, NO) == FFFTP_SUCCESS)\r
- {\r
- Ret = LIST_MLSD;\r
+ /* OSS の場合は自動判別可能のため Ret == LIST_UNKNOWN のチェックは後 */\r
+ if(AskRealHostType() == HTYPE_TANDEM) {\r
+ if(Ret == LIST_UNKNOWN) {\r
+ SetOSS(NO);\r
+ Ret = LIST_TANDEM;\r
+ } else {\r
+ SetOSS(YES);\r
}\r
}\r
+#endif\r
+\r
}\r
\r
DoPrintf("ListType=%d", Ret);\r
}\r
\r
\r
+// Windows Server 2008 R2\r
+static int CheckMMDDYYYYformat(char *Str, char Sym)\r
+{\r
+ int Ret;\r
+\r
+ Ret = NO;\r
+ if((strlen(Str) == 10) &&\r
+ (IsDigitSym(Str[0], Sym) != 0) && (IsDigitSym(Str[1], Sym) != 0) &&\r
+ (IsDigit(Str[2]) == 0) &&\r
+ (IsDigitSym(Str[3], Sym) != 0) && (IsDigitSym(Str[4], Sym) != 0) &&\r
+ (IsDigit(Str[5]) == 0) &&\r
+ (IsDigitSym(Str[6], Sym) != 0) && (IsDigitSym(Str[7], Sym) != 0) &&\r
+ (IsDigitSym(Str[8], Sym) != 0) && (IsDigitSym(Str[9], Sym) != 0))\r
+ {\r
+ Ret = YES; \r
+ }\r
+ return(Ret);\r
+}\r
+\r
+\r
/*----- ファイル情報からファイル名、サイズなどを取り出す ----------------------\r
*\r
* Parameter\r
* int 種類 (NODE_xxxx)\r
*----------------------------------------------------------------------------*/\r
\r
-static int ResolvFileInfo(char *Str, int ListType, char *Fname, LONGLONG *Size, FILETIME *Time, int *Attr, char *Owner, int *Link, int *InfoExist)\r
+static int ResolveFileInfo(char *Str, int ListType, char *Fname, LONGLONG *Size, FILETIME *Time, int *Attr, char *Owner, int *Link, int *InfoExist)\r
{\r
SYSTEMTIME sTime;\r
SYSTEMTIME sTimeNow;\r
\r
/* まずクリアしておく */\r
Ret = NODE_NONE;\r
+ // バグ対策\r
+ memset(Fname, NUL, FMAX_PATH+1);\r
*Size = -1;\r
*Attr = 0;\r
*Link = NO;\r
}\r
break;\r
\r
+ // Windows Server 2008 R2\r
+ case LIST_DOS_5 :\r
+ *InfoExist |= (FINFO_TIME | FINFO_DATE | FINFO_SIZE);\r
+\r
+ /* 日付 */\r
+ FindField(Str, Buf, 0, NO);\r
+ sTime.wMonth = atoi(Buf);\r
+ sTime.wDay = atoi(Buf+3);\r
+ sTime.wYear = atoi(Buf+6);\r
+\r
+ /* 時刻 */\r
+ FindField(Str, Buf, 1, NO);\r
+ sTime.wHour = atoi(Buf);\r
+ sTime.wMinute = atoi(Buf+3);\r
+ sTime.wSecond = 0;\r
+ sTime.wMilliseconds = 0;\r
+ if(_strnicmp(Buf+5, "AM", 2) == 0)\r
+ {\r
+ if(sTime.wHour == 12)\r
+ sTime.wHour = 0;\r
+ }\r
+ else if(_strnicmp(Buf+5, "PM", 2) == 0)\r
+ {\r
+ if(sTime.wHour != 12)\r
+ sTime.wHour += 12;\r
+ }\r
+ SystemTimeToFileTime(&sTime, Time);\r
+ SpecificLocalFileTime2FileTime(Time, AskHostTimeZone());\r
+\r
+ /* サイズ */\r
+ FindField(Str, Buf, 2, NO);\r
+ *Size = _atoi64(Buf);\r
+\r
+ /* 名前 */\r
+ if(FindField(Str, Fname, 3, YES) == FFFTP_SUCCESS)\r
+ {\r
+ Ret = NODE_FILE;\r
+ if(Buf[0] == '<')\r
+ Ret = NODE_DIR;\r
+ }\r
+ break;\r
+\r
case LIST_OS2 :\r
*InfoExist |= (FINFO_DATE | FINFO_SIZE);\r
\r
}\r
break;\r
\r
+#if defined(HAVE_TANDEM)\r
+ case LIST_TANDEM :\r
+ *InfoExist |= (FINFO_TIME | FINFO_DATE | FINFO_SIZE | FINFO_ATTR);\r
+ /* Open 中だったらずらす */\r
+ if(FindField(Str, Buf, 1, NO) != FFFTP_SUCCESS)\r
+ break;\r
+ if (!strncmp(Buf, "O", 1)) {\r
+ offs = 1;\r
+ }\r
+ /* 日付 */\r
+ if(FindField(Str, Buf, 3 + offs, NO) != FFFTP_SUCCESS)\r
+ break;\r
+ if (Buf[1] == '-') { /* 日付が 1桁 */\r
+ sTime.wYear = Assume1900or2000(atoi(Buf + 6));\r
+ Buf[5] = 0;\r
+ GetMonth(Buf+2, &sTime.wMonth, &sTime.wDay); /* wDayは常に0 */\r
+ sTime.wDay = atoi(Buf);\r
+ sTime.wDayOfWeek = 0;\r
+ } else {\r
+ sTime.wYear = Assume1900or2000(atoi(Buf + 7));\r
+ Buf[6] = 0;\r
+ GetMonth(Buf+3, &sTime.wMonth, &sTime.wDay); /* wDayは常に0 */\r
+ sTime.wDay = atoi(Buf);\r
+ sTime.wDayOfWeek = 0;\r
+ }\r
+ /* 時刻 */\r
+ FindField(Str, Buf, 4 + offs, NO);\r
+ sTime.wHour = atoi(Buf);\r
+ sTime.wMinute = atoi(Buf+3);\r
+ sTime.wSecond = atoi(Buf+6);\r
+ sTime.wMilliseconds = 0;\r
+ SystemTimeToFileTime(&sTime, Time);\r
+ SpecificLocalFileTime2FileTime(Time, AskHostTimeZone());\r
+\r
+ /* 属性 セキュリティではなく FileCode を保存する */\r
+ FindField(Str, Buf, 1 + offs, NO);\r
+ *Attr = atoi(Buf);\r
+ /* サイズ */\r
+ FindField(Str, Buf, 2 + offs, NO);\r
+ *Size = _atoi64(Buf);\r
+ /* オーナ名 */\r
+ if(FindField(Str, Buf, 5 + offs, NO) == FFFTP_SUCCESS) {\r
+ if(strncmp(Buf, "Owner", sizeof("Owner"))) {\r
+ memset(Owner, NUL, OWNER_NAME_LEN+1);\r
+ strncpy(Owner, Buf, OWNER_NAME_LEN);\r
+ /* 通常は 255,255 だが、20, 33 などにも対応する */\r
+ /* 最後の文字が , だったら後ろとつなげる */\r
+ if (Buf[strlen(Buf)-1] == ',') {\r
+ FindField(Str, Buf, 6 + offs, NO);\r
+ strncat(Owner, Buf, OWNER_NAME_LEN - strlen(Buf));\r
+ }\r
+ /* ファイル名 */\r
+ if(FindField(Str, Fname, 0, NO) == FFFTP_SUCCESS) {\r
+ Ret = NODE_FILE;\r
+ }\r
+ }\r
+ }\r
+ break;\r
+#endif\r
+\r
+ // MLSD対応\r
+ // 以下の形式に対応\r
+ // fact1=value1;fact2=value2;fact3=value3; filename\r\n\r
+ // 不完全な実装のホストが存在するため以下の形式も許容\r
+ // fact1=value1;fact2=value2;fact3=value3 filename\r\n\r
+ // fact1=value1;fact2=value2;fact3=value3;filename\r\n\r
+ // SymlinkはRFC3659の7.7.4. A More Complex Exampleに\r
+ // よるとtype=OS.unix=slink:(target)だが\r
+ // ProFTPDはtype=OS.unix=symlink:(target)となる\r
+ case LIST_MLSD:\r
+ {\r
+ int i = 0;\r
+ char StrBuf[(FMAX_PATH * 2) + 1];\r
+ char Fact[FMAX_PATH + 1];\r
+ char Name[FMAX_PATH + 1];\r
+ char Value[FMAX_PATH + 1];\r
+ char Value2[FMAX_PATH + 1];\r
+ char* pFileName;\r
+ strncpy(StrBuf, Str, FMAX_PATH * 2);\r
+ StrBuf[FMAX_PATH * 2] = '\0';\r
+ if((pFileName = strstr(StrBuf, "; ")) != NULL)\r
+ {\r
+ *pFileName = '\0';\r
+ pFileName += 2;\r
+ }\r
+ else if((pFileName = strchr(StrBuf, ' ')) != NULL)\r
+ {\r
+ *pFileName = '\0';\r
+ pFileName++;\r
+ }\r
+ else if((pFileName = strrchr(StrBuf, ';')) != NULL)\r
+ {\r
+ *pFileName = '\0';\r
+ pFileName++;\r
+ }\r
+ if(pFileName != NULL)\r
+ strcpy(Fname, pFileName);\r
+ while(FindField2(StrBuf, Fact, ';', i, NO) == FFFTP_SUCCESS)\r
+ {\r
+ if(FindField2(Fact, Name, '=', 0, NO) == FFFTP_SUCCESS && FindField2(Fact, Value, '=', 1, NO) == FFFTP_SUCCESS)\r
+ {\r
+ if(_stricmp(Name, "type") == 0)\r
+ {\r
+ if(_stricmp(Value, "dir") == 0)\r
+ Ret = NODE_DIR;\r
+ else if(_stricmp(Value, "file") == 0)\r
+ Ret = NODE_FILE;\r
+ else if(_stricmp(Value, "OS.unix") == 0)\r
+ if(FindField2(Fact, Value2, '=', 2, NO) == FFFTP_SUCCESS)\r
+ if(_stricmp(Value2, "symlink") == 0 || _stricmp(Value2, "slink") == 0) { // ProFTPD is symlink. A example of RFC3659 is slink.\r
+ Ret = NODE_DIR;\r
+ *Link = YES;\r
+ }\r
+ }\r
+ else if(_stricmp(Name, "size") == 0)\r
+ {\r
+ *Size = _atoi64(Value);\r
+ *InfoExist |= FINFO_SIZE;\r
+ }\r
+ else if(_stricmp(Name, "modify") == 0)\r
+ {\r
+ sTime.wYear = atoi_n(Value, 4);\r
+ sTime.wMonth = atoi_n(Value + 4, 2);\r
+ sTime.wDay = atoi_n(Value + 6, 2);\r
+ sTime.wHour = atoi_n(Value + 8, 2);\r
+ sTime.wMinute = atoi_n(Value + 10, 2);\r
+ sTime.wSecond = atoi_n(Value + 12, 2);\r
+ sTime.wMilliseconds = 0;\r
+ SystemTimeToFileTime(&sTime, Time);\r
+ // 時刻はGMT\r
+// SpecificLocalFileTime2FileTime(Time, AskHostTimeZone());\r
+ *InfoExist |= FINFO_DATE | FINFO_TIME;\r
+ }\r
+ else if(_stricmp(Name, "UNIX.mode") == 0)\r
+ {\r
+ *Attr = strtol(Value, NULL, 16);\r
+ *InfoExist |= FINFO_ATTR;\r
+ }\r
+ else if(_stricmp(Name, "UNIX.owner") == 0)\r
+ strcpy(Owner, Value);\r
+ }\r
+ i++;\r
+ }\r
+ }\r
+ break;\r
+\r
case LIST_UNIX_10 :\r
case LIST_UNIX_11 :\r
case LIST_UNIX_12 :\r
case LIST_UNIX_75 :\r
// MELCOMはビットフラグになっている\r
// case LIST_MELCOM :\r
+ // linux-ftpd\r
+ case LIST_UNIX_16 :\r
+ // uClinux\r
+ case LIST_UNIX_17 :\r
default:\r
/* offsはサイズの位置, offs=0はカラム4 */\r
offs = 0;\r
\r
/* offs2は時間(もしくは年)の位置 */\r
offs2 = 0;\r
+ // linux-ftpd\r
+// if((ListType == LIST_UNIX_11) ||\r
+// (ListType == LIST_UNIX_13) ||\r
+// (ListType == LIST_UNIX_21) ||\r
+// (ListType == LIST_UNIX_23) ||\r
+// (ListType == LIST_UNIX_51) ||\r
+// (ListType == LIST_UNIX_61) ||\r
+// (ListType == LIST_UNIX_63) ||\r
+// (ListType == LIST_UNIX_71) ||\r
+// (ListType == LIST_UNIX_73))\r
if((ListType == LIST_UNIX_11) ||\r
(ListType == LIST_UNIX_13) ||\r
(ListType == LIST_UNIX_21) ||\r
(ListType == LIST_UNIX_61) ||\r
(ListType == LIST_UNIX_63) ||\r
(ListType == LIST_UNIX_71) ||\r
- (ListType == LIST_UNIX_73))\r
+ (ListType == LIST_UNIX_73) ||\r
+ (ListType == LIST_UNIX_16))\r
offs2 = -1;\r
+ // uClinux\r
+ if(ListType == LIST_UNIX_17)\r
+ offs2 = -3;\r
\r
/* offs3はオーナ名の位置 */\r
offs3 = 0;\r
(ListType == LIST_UNIX_74) ||\r
(ListType == LIST_UNIX_75))\r
Flag2 = 1;\r
+ // uClinux\r
+ if(ListType == LIST_UNIX_17)\r
+ Flag2 = -1;\r
\r
*InfoExist |= (FINFO_DATE | FINFO_SIZE | FINFO_ATTR);\r
\r
if(GetHourAndMinute(Buf, &sTime.wHour, &sTime.wMinute) == FFFTP_SUCCESS)\r
*InfoExist |= FINFO_TIME;\r
}\r
+ // linux-ftpd\r
+ else if(CheckYYYYMMDDformat(Buf, NUL) != 0)\r
+ {\r
+ sTime.wYear = atoi(Buf);\r
+ sTime.wMonth = atoi(Buf+5);\r
+ sTime.wDay = atoi(Buf+8);\r
+ FindField(Str, Buf, 7+offs+offs2, NO);\r
+ if(GetHourAndMinute(Buf, &sTime.wHour, &sTime.wMinute) == FFFTP_SUCCESS)\r
+ *InfoExist |= FINFO_TIME;\r
+ }\r
else\r
{\r
GetMonth(Buf, &sTime.wMonth, &sTime.wDay);\r
}\r
}\r
}\r
+ // uClinux\r
+ else if(Flag2 == -1)\r
+ {\r
+ *InfoExist &= ~(FINFO_DATE | FINFO_TIME);\r
+ }\r
else\r
{\r
/* LIST_UNIX_?4, LIST_UNIX_?5 の時 */\r
\r
if(strchr("dl", *Str) != NULL)\r
{\r
- if((_mbscmp(_mbsninc(Fname, _mbslen(Fname) - 1), "/") == 0) ||\r
- (_mbscmp(_mbsninc(Fname, _mbslen(Fname) - 1), "\\") == 0))\r
- {\r
- *(Fname + strlen(Fname) - 1) = NUL;\r
- }\r
+ // 0x5Cが含まれる文字列を扱えないバグ修正\r
+// if((_mbscmp(_mbsninc(Fname, _mbslen(Fname) - 1), "/") == 0) ||\r
+// (_mbscmp(_mbsninc(Fname, _mbslen(Fname) - 1), "\\") == 0))\r
+// {\r
+// *(Fname + strlen(Fname) - 1) = NUL;\r
+// }\r
Ret = NODE_DIR;\r
if(*Str == 'l')\r
*Link = YES;\r
Ret = NODE_NONE;\r
}\r
break;\r
-\r
- // MLSD対応\r
- case LIST_MLSD:\r
- {\r
- int i = 0;\r
- char Tmp[FMAX_PATH + 1];\r
- char Name[FMAX_PATH + 1];\r
- char Value[FMAX_PATH + 1];\r
- while(FindField2(Str, Tmp, ';', i, NO) == FFFTP_SUCCESS)\r
- {\r
- if(i >= 1 && strncmp(Tmp, " ", 1) == 0)\r
- strcpy(Fname, strstr(Str, "; ") + 2);\r
- else if(FindField2(Tmp, Name, '=', 0, NO) == FFFTP_SUCCESS && FindField2(Tmp, Value, '=', 1, NO) == FFFTP_SUCCESS)\r
- {\r
- if(_stricmp(Name, "type") == 0)\r
- {\r
- if(_stricmp(Value, "dir") == 0)\r
- Ret = NODE_DIR;\r
- else if(_stricmp(Value, "file") == 0)\r
- Ret = NODE_FILE;\r
- }\r
- else if(_stricmp(Name, "size") == 0)\r
- {\r
- *Size = _atoi64(Value);\r
- *InfoExist |= FINFO_SIZE;\r
- }\r
- else if(_stricmp(Name, "modify") == 0)\r
- {\r
- sTime.wYear = atoi_n(Value, 4);\r
- sTime.wMonth = atoi_n(Value + 4, 2);\r
- sTime.wDay = atoi_n(Value + 6, 2);\r
- sTime.wHour = atoi_n(Value + 8, 2);\r
- sTime.wMinute = atoi_n(Value + 10, 2);\r
- sTime.wSecond = atoi_n(Value + 12, 2);\r
- SystemTimeToFileTime(&sTime, Time);\r
-// SpecificLocalFileTime2FileTime(Time, AskHostTimeZone());\r
- *InfoExist |= FINFO_DATE | FINFO_TIME;\r
- }\r
- else if(_stricmp(Name, "UNIX.mode") == 0)\r
- {\r
- *Attr = strtol(Value, NULL, 16);\r
- *InfoExist |= FINFO_ATTR;\r
- }\r
- else if(_stricmp(Name, "UNIX.owner") == 0)\r
- strcpy(Owner, Value);\r
- }\r
- i++;\r
- }\r
- }\r
- break;\r
}\r
\r
- if((Ret != NODE_NONE) && (strlen(Fname) > 0))\r
+ // UTF-8対応\r
+// if((Ret != NODE_NONE) && (strlen(Fname) > 0))\r
+ if(!(OrgListType & LIST_RAW_NAME) && (Ret != NODE_NONE) && (strlen(Fname) > 0))\r
{\r
+ // UTF-8対応\r
+// if(CheckSpecialDirName(Fname) == YES)\r
+// Ret = NODE_NONE;\r
+// else\r
+// ChangeFnameRemote2Local(Fname, FMAX_PATH);\r
+ ChangeFnameRemote2Local(Fname, FMAX_PATH);\r
+ // UTF-8の冗長表現によるディレクトリトラバーサル対策\r
+ FixStringM(Fname, Fname);\r
+ // 0x5Cが含まれる文字列を扱えないバグ修正\r
+ if((_mbscmp(_mbsninc(Fname, _mbslen(Fname) - 1), "/") == 0)\r
+ || (_mbscmp(_mbsninc(Fname, _mbslen(Fname) - 1), "\\") == 0))\r
+ *(Fname + strlen(Fname) - 1) = NUL;\r
if(CheckSpecialDirName(Fname) == YES)\r
Ret = NODE_NONE;\r
- else\r
- ChangeFnameRemote2Local(Fname, FMAX_PATH);\r
+ // 文字コードが正しくないために長さが0になったファイル名は表示しない\r
+ if(strlen(Fname) == 0)\r
+ Ret = NODE_NONE;\r
}\r
return(Ret);\r
}\r
* BOOL TRUE/FALSE\r
*----------------------------------------------------------------------------*/\r
\r
-static BOOL CALLBACK FilterWndProc(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam)\r
+// 64ビット対応\r
+//static BOOL CALLBACK FilterWndProc(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam)\r
+static INT_PTR CALLBACK FilterWndProc(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam)\r
{\r
switch (iMessage)\r
{\r
\r
\r
\r
+// UTF-8対応\r
+// ファイル一覧から漢字コードを推測\r
+// 優先度はUTF-8、Shift_JIS、EUC、JIS、UTF-8 HFS+の順\r
+int AnalyzeNameKanjiCode(int Num)\r
+{\r
+ char Str[FMAX_PATH+1];\r
+ char Name[FMAX_PATH+1];\r
+ LONGLONG Size;\r
+ FILETIME Time;\r
+ int Attr;\r
+ FILE *fd;\r
+ int Node;\r
+ int ListType;\r
+ char Owner[OWNER_NAME_LEN+1];\r
+ int Link;\r
+ int InfoExist;\r
+ int NameKanjiCode;\r
+ int Point;\r
+ int PointSJIS;\r
+ int PointJIS;\r
+ int PointEUC;\r
+ int PointUTF8N;\r
+ int PointUTF8HFSX;\r
+ char* p;\r
+ CODECONVINFO cInfo1;\r
+ CODECONVINFO cInfo2;\r
+ char Buf[FMAX_PATH+1];\r
+\r
+ NameKanjiCode = KANJI_AUTO;\r
+ Point = 0;\r
+ PointSJIS = 0;\r
+ PointJIS = 0;\r
+ PointEUC = 0;\r
+ PointUTF8N = 0;\r
+ PointUTF8HFSX = 0;\r
+ MakeCacheFileName(Num, Str);\r
+ if((fd = fopen(Str, "rb")) != NULL)\r
+ {\r
+ while(GetListOneLine(Str, FMAX_PATH, fd) == FFFTP_SUCCESS)\r
+ {\r
+ if((ListType = AnalyzeFileInfo(Str)) != LIST_UNKNOWN)\r
+ {\r
+ strcpy(Name, "");\r
+ Node = ResolveFileInfo(Str, ListType | LIST_RAW_NAME, Name, &Size, &Time, &Attr, Owner, &Link, &InfoExist);\r
+ p = Name;\r
+ while(*p != '\0')\r
+ {\r
+ if(*p & 0x80)\r
+ {\r
+ p = NULL;\r
+ break;\r
+ }\r
+ p++;\r
+ }\r
+ if(!p)\r
+ {\r
+ // ASCII文字の範囲外\r
+ if(!CheckStringM(Name))\r
+ {\r
+ InitCodeConvInfo(&cInfo1);\r
+ cInfo1.KanaCnv = NO;\r
+ cInfo1.Str = Name;\r
+ cInfo1.StrLen = strlen(Name);\r
+ cInfo1.Buf = Buf;\r
+ cInfo1.BufSize = FMAX_PATH;\r
+ cInfo2 = cInfo1;\r
+ ConvUTF8NtoUTF8HFSX(&cInfo1);\r
+ ConvUTF8HFSXtoUTF8N(&cInfo2);\r
+ if(cInfo1.OutLen > (int)strlen(Name))\r
+ PointUTF8N++;\r
+ else\r
+ PointUTF8HFSX++;\r
+ if(cInfo2.OutLen < (int)strlen(Name))\r
+ PointUTF8HFSX++;\r
+ else\r
+ PointUTF8N++;\r
+ }\r
+ switch(CheckKanjiCode(Name, strlen(Name), KANJI_SJIS))\r
+ {\r
+ case KANJI_SJIS:\r
+ PointSJIS++;\r
+ break;\r
+ case KANJI_EUC:\r
+ PointEUC++;\r
+ break;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ // ASCII文字の範囲内\r
+ switch(CheckKanjiCode(Name, strlen(Name), KANJI_SJIS))\r
+ {\r
+ case KANJI_JIS:\r
+ PointJIS++;\r
+ break;\r
+ }\r
+ }\r
+ }\r
+ }\r
+ fclose(fd);\r
+ }\r
+ if(PointUTF8HFSX >= Point)\r
+ {\r
+ NameKanjiCode = KANJI_UTF8HFSX;\r
+ Point = PointUTF8HFSX;\r
+ }\r
+ if(PointJIS >= Point)\r
+ {\r
+ NameKanjiCode = KANJI_JIS;\r
+ Point = PointJIS;\r
+ }\r
+ if(PointEUC >= Point)\r
+ {\r
+ NameKanjiCode = KANJI_EUC;\r
+ Point = PointEUC;\r
+ }\r
+ if(PointSJIS >= Point)\r
+ {\r
+ NameKanjiCode = KANJI_SJIS;\r
+ Point = PointSJIS;\r
+ }\r
+ if(PointUTF8N >= Point)\r
+ {\r
+ NameKanjiCode = KANJI_UTF8N;\r
+ Point = PointUTF8N;\r
+ }\r
+ return NameKanjiCode;\r
+}\r
+\r