OSDN Git Service

Update OpenSSL to 1.0.2f.
[ffftp/ffftp.git] / filelist.c
index ce4d603..83b8ad2 100755 (executable)
@@ -91,19 +91,26 @@ static void AddListView(HWND hWnd, int Pos, char *Name, int Type, LONGLONG Size,
 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
@@ -129,6 +136,8 @@ extern HWND hHelpWin;
 extern int SuppressRefresh;\r
 // ローカル側自動更新\r
 extern HANDLE ChangeNotification;\r
+// 特定の操作を行うと異常終了するバグ修正\r
+extern int CancelFlg;\r
 \r
 /* 設定値 */\r
 extern int LocalWidth;\r
@@ -199,10 +208,16 @@ int MakeListWin(HWND hWnd, HINSTANCE hInst)
 \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
@@ -250,10 +265,16 @@ int MakeListWin(HWND hWnd, HINSTANCE hInst)
 \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
@@ -459,7 +480,8 @@ static BOOL CALLBACK doOleDlgProc(HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
 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
        // 環境依存の不具合対策\r
@@ -509,8 +531,6 @@ static void doTransferRemoteFile(void)
                remove(fn);\r
        }\r
 \r
-       // 同時接続対応\r
-       DisableUserOpe();\r
        // 外部アプリケーションへドロップ後にローカル側のファイル一覧に作業フォルダが表示されるバグ対策\r
        SuppressRefresh = 1;\r
 \r
@@ -548,8 +568,6 @@ static void doTransferRemoteFile(void)
        // 外部アプリケーションへドロップ後にローカル側のファイル一覧に作業フォルダが表示されるバグ対策\r
        SuppressRefresh = 0;\r
        GetLocalDirForWnd();\r
-       // 同時接続対応\r
-       EnableUserOpe();\r
 \r
        remoteFileListBase = FileListBase;  // あとでフリーすること\r
        remoteFileListBaseNoExpand = FileListBaseNoExpand;  // あとでフリーすること\r
@@ -894,10 +912,18 @@ static LRESULT FileListCommonWndProc(HWND hWnd, UINT message, WPARAM wParam, LPA
                                        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
@@ -912,9 +938,10 @@ static LRESULT FileListCommonWndProc(HWND hWnd, UINT message, WPARAM wParam, LPA
                                                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
@@ -937,6 +964,10 @@ static LRESULT FileListCommonWndProc(HWND hWnd, UINT message, WPARAM wParam, LPA
                                        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
@@ -947,7 +978,6 @@ static LRESULT FileListCommonWndProc(HWND hWnd, UINT message, WPARAM wParam, LPA
                                        }\r
                                        \r
                                        /* ファイル名の配列を作成する */\r
-                                       // TODO: GlobalAllocが返すのはメモリポインタではなくハンドルだが実際は同じ値\r
                                        FileNameList = (char **)GlobalAlloc(GPTR,sizeof(char *) * filenum);\r
                                        if(FileNameList == NULL){\r
                                                abort();\r
@@ -1301,9 +1331,9 @@ void GetRemoteDirForWnd(int Mode, int *CancelCheckWork)
 \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
@@ -2766,8 +2796,12 @@ double GetSelectedTotalSize(int Win)
 *              なし\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
@@ -2776,6 +2810,8 @@ void MakeSelectedFileList(int Win, int Expand, int All, FILELIST **Base, int *Ca
        DWORD Attr;\r
        int Ignore;\r
 \r
+       // ファイル一覧バグ修正\r
+       Sts = FFFTP_SUCCESS;\r
        if((All == YES) || (GetSelectedCount(Win) > 0))\r
        {\r
                /*===== カレントディレクトリのファイル =====*/\r
@@ -2872,16 +2908,31 @@ void MakeSelectedFileList(int Win, int Expand, int All, FILELIST **Base, int *Ca
 //                                             }\r
                                                if(GetImageIndex(Win, Pos) != 4) { // symlink\r
                                                        if(Win == WIN_LOCAL)\r
-                                                               MakeLocalTree(Name, Base);\r
+                                                       // ファイル一覧バグ修正\r
+//                                                             MakeLocalTree(Name, Base);\r
+                                                       {\r
+                                                               if(MakeLocalTree(Name, Base) == FFFTP_FAIL)\r
+                                                                       Sts = FFFTP_FAIL;\r
+                                                       }\r
                                                        else\r
                                                        {\r
                                                                AskRemoteCurDir(Cur, FMAX_PATH);\r
 \r
                                                                if((AskListCmdMode() == NO) &&\r
                                                                   (AskUseNLST_R() == YES))\r
-                                                                       MakeRemoteTree1(Name, Cur, Base, CancelCheckWork);\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
-                                                                       MakeRemoteTree2(Name, Cur, Base, CancelCheckWork);\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
@@ -2893,7 +2944,9 @@ void MakeSelectedFileList(int Win, int Expand, int All, FILELIST **Base, int *Ca
                        }\r
                }\r
        }\r
-       return;\r
+       // ファイル一覧バグ修正\r
+//     return;\r
+       return(Sts);\r
 }\r
 \r
 \r
@@ -3032,10 +3085,16 @@ void MakeDroppedDir(WPARAM wParam, char *Cur)
 *              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
@@ -3043,9 +3102,16 @@ static void MakeRemoteTree1(char *Path, char *Cur, FILELIST **Base, int *CancelC
                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
@@ -3063,13 +3129,19 @@ static void MakeRemoteTree1(char *Path, char *Cur, FILELIST **Base, int *CancelC
 *              各フォルダに移動してリストを取得\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
@@ -3094,6 +3166,9 @@ static void MakeRemoteTree2(char *Path, char *Cur, FILELIST **Base, int *CancelC
                        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
@@ -3118,14 +3193,21 @@ static void MakeRemoteTree2(char *Path, char *Cur, FILELIST **Base, int *CancelC
                                        /* そのディレクトリの中を検索 */\r
 //                                     MakeRemoteTree2(Pos->File, Cur, Base, CancelCheckWork);\r
                                        if(Pkt.Link == NO)\r
-                                               MakeRemoteTree2(Pos->File, Cur, Base, CancelCheckWork);\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
@@ -3193,7 +3275,7 @@ void AddRemoteTreeToFileList(int Num, char *Path, int IncDir, FILELIST **Base)
 \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
@@ -3213,7 +3295,7 @@ void AddRemoteTreeToFileList(int Num, char *Path, int IncDir, FILELIST **Base)
                        }\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
@@ -3369,14 +3451,21 @@ static int MakeDirPath(char *Str, int ListType, char *Path, char *Dir)
 *              なし\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
@@ -3402,7 +3491,10 @@ static void MakeLocalTree(char *Path, FILELIST **Base)
                                        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
@@ -3415,6 +3507,8 @@ static void MakeLocalTree(char *Path, FILELIST **Base)
 \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
@@ -3435,13 +3529,18 @@ static void MakeLocalTree(char *Path, FILELIST **Base)
                                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
@@ -3571,7 +3670,7 @@ FILELIST *SearchFileList(char *Fname, FILELIST *Base, int Caps)
 *              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
@@ -3602,11 +3701,15 @@ static int AnalizeFileInfo(char *Str)
        else\r
        {\r
                // MLSD対応\r
-               if(FindField(Str, Tmp, 0, NO) == FFFTP_SUCCESS && strstr(Tmp, "type=") != NULL)\r
+               if(FindField(Str, Tmp, 0, NO) == FFFTP_SUCCESS)\r
                {\r
-                       if(FindField2(Str, Tmp, ';', 1, NO) == FFFTP_SUCCESS && FindField2(Str, Tmp, '=', 1, NO) == FFFTP_SUCCESS)\r
+                       _strlwr(Tmp);\r
+                       if(strstr(Tmp, "type=") != NULL)\r
                        {\r
-                               Ret = LIST_MLSD;\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
@@ -3882,6 +3985,27 @@ static int AnalizeFileInfo(char *Str)
                        }\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
@@ -4336,6 +4460,26 @@ static int CheckYYYYMMDDformat(char *Str, char Sym)
 }\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
@@ -4353,7 +4497,7 @@ static int CheckYYYYMMDDformat(char *Str, char Sym)
 *              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
@@ -4484,6 +4628,48 @@ static int ResolvFileInfo(char *Str, int ListType, char *Fname, LONGLONG *Size,
                        }\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
@@ -6052,7 +6238,7 @@ static int atoi_n(const char *Str, int Len)
 \r
 // UTF-8対応\r
 // ファイル一覧から漢字コードを推測\r
-// 優先度はUTF-8、Shift_JIS、EUC、JISの順\r
+// å\84ªå\85\88度ã\81¯UTF-8ã\80\81Shift_JISã\80\81EUCã\80\81JISã\80\81UTF-8 HFS+ã\81®é \86\r
 int AnalyzeNameKanjiCode(int Num)\r
 {\r
        char Str[FMAX_PATH+1];\r
@@ -6072,7 +6258,11 @@ int AnalyzeNameKanjiCode(int Num)
        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
@@ -6080,15 +6270,16 @@ int AnalyzeNameKanjiCode(int Num)
        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 = AnalizeFileInfo(Str)) != LIST_UNKNOWN)\r
+                       if((ListType = AnalyzeFileInfo(Str)) != LIST_UNKNOWN)\r
                        {\r
                                strcpy(Name, "");\r
-                               Node = ResolvFileInfo(Str, ListType | LIST_RAW_NAME, Name, &Size, &Time, &Attr, Owner, &Link, &InfoExist);\r
+                               Node = ResolveFileInfo(Str, ListType | LIST_RAW_NAME, Name, &Size, &Time, &Attr, Owner, &Link, &InfoExist);\r
                                p = Name;\r
                                while(*p != '\0')\r
                                {\r
@@ -6101,28 +6292,56 @@ int AnalyzeNameKanjiCode(int Num)
                                }\r
                                if(!p)\r
                                {\r
+                                       // ASCII文字の範囲外\r
                                        if(!CheckStringM(Name))\r
-                                               PointUTF8N++;\r
-                                       else\r
                                        {\r
-                                               switch(CheckKanjiCode(Name, strlen(Name), KANJI_SJIS))\r
-                                               {\r
-                                               case KANJI_SJIS:\r
-                                                       PointSJIS++;\r
-                                                       break;\r
-                                               case KANJI_JIS:\r
-                                                       PointJIS++;\r
-                                                       break;\r
-                                               case KANJI_EUC:\r
-                                                       PointEUC++;\r
-                                                       break;\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