OSDN Git Service

Fix bugs of simultaneous connection.
[ffftp/ffftp.git] / filelist.c
index 4b798fa..23d05cf 100644 (file)
@@ -31,6 +31,8 @@
 //#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
@@ -82,7 +84,9 @@ static void AddDispFileList(FLISTANCHOR *Anchor, char *Name, FILETIME *Time, LON
 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
+// 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 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
@@ -106,7 +110,9 @@ static int GetHourAndMinute(char *Str, WORD *Hour, WORD *Minute);
 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
@@ -183,7 +189,9 @@ int MakeListWin(HWND hWnd, HINSTANCE hInst)
 \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
@@ -232,7 +240,9 @@ int MakeListWin(HWND hWnd, HINSTANCE hInst)
 \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
@@ -1121,32 +1131,50 @@ void GetListTabWidth(void)
 \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
@@ -1796,7 +1824,9 @@ void SelectFileInList(HWND hWnd, int Type)
 *              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
@@ -4881,6 +4911,7 @@ static int ResolvFileInfo(char *Str, int ListType, char *Fname, LONGLONG *Size,
                                                        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
 //                                                     SpecificLocalFileTime2FileTime(Time, AskHostTimeZone());\r
                                                        *InfoExist |= FINFO_DATE | FINFO_TIME;\r
@@ -4899,16 +4930,27 @@ static int ResolvFileInfo(char *Str, int ListType, char *Fname, LONGLONG *Size,
                        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
-               if(CheckSpecialDirName(Fname) == YES)\r
-                       Ret = NODE_NONE;\r
-               else\r
-                       ChangeFnameRemote2Local(Fname, FMAX_PATH);\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
+               // 文字コードが正しくないために長さが0になったファイル名は表示しない\r
+               if(strlen(Fname) == 0)\r
+                       Ret = NODE_NONE;\r
        }\r
        return(Ret);\r
 }\r
@@ -5401,7 +5443,9 @@ void SetFilter(int *CancelCheckWork)
 *              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
@@ -5459,3 +5503,99 @@ static int atoi_n(const char *Str, int Len)
 \r
 \r
 \r
+// UTF-8対応\r
+// ファイル一覧から漢字コードを推測\r
+// 優先度はUTF-8、Shift_JIS、EUC、JISの順\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
+       char* p;\r
+\r
+       NameKanjiCode = KANJI_AUTO;\r
+       Point = 0;\r
+       PointSJIS = 0;\r
+       PointJIS = 0;\r
+       PointEUC = 0;\r
+       PointUTF8N = 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
+                       {\r
+                               strcpy(Name, "");\r
+                               Node = ResolvFileInfo(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
+                                       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
+                                       }\r
+                               }\r
+                       }\r
+               }\r
+               fclose(fd);\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