OSDN Git Service

Change the character code of windows into UTF-16 completely.
[ffftp/ffftp.git] / filelist.c
index 74d943c..51da350 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
@@ -183,7 +185,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, GWL_WNDPROC, (LONG_PTR)LocalWndProc);\r
 \r
            Tmp = SendMessage(hWndListLocal, LVM_GETEXTENDEDLISTVIEWSTYLE, 0, 0);\r
            Tmp |= LVS_EX_FULLROWSELECT;\r
@@ -232,7 +236,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, GWL_WNDPROC, (LONG_PTR)RemoteWndProc);\r
 \r
            Tmp = SendMessage(hWndListRemote, LVM_GETEXTENDEDLISTVIEWSTYLE, 0, 0);\r
            Tmp |= LVS_EX_FULLROWSELECT;\r
@@ -854,7 +860,10 @@ static LRESULT FileListCommonWndProc(HWND hWnd, UINT message, WPARAM wParam, LPA
                                                PathDir = LocDir;\r
  \r
                                                FileListBase = NULL;\r
-                                               MakeSelectedFileList(WIN_LOCAL, YES, NO, &FileListBase, &CancelFlg);                    \r
+                                               // ローカル側からアプリケーションにD&Dできないバグ修正\r
+//                                             MakeSelectedFileList(WIN_LOCAL, YES, NO, &FileListBase, &CancelFlg);                    \r
+                                               MakeSelectedFileList(WIN_LOCAL, NO, NO, &FileListBase, &CancelFlg);                     \r
+                                               FileListBaseNoExpand = FileListBase;\r
  \r
                                        } else if (hWndDragStart == hWndListRemote) {\r
                                                GetCursorPos(&Point);\r
@@ -1118,32 +1127,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
@@ -4771,9 +4798,11 @@ static int ResolvFileInfo(char *Str, int ListType, char *Fname, LONGLONG *Size,
 \r
                                                /* 年がない */\r
                                                /* 現在の日付から推定 */\r
-                                               if((sTimeNow.wMonth == 12) && (sTime.wMonth == 1))\r
-                                                       sTime.wYear++;\r
-                                               else if(sTimeNow.wMonth+1 == sTime.wMonth)\r
+                                               // 恐らくホストとローカルの時刻が異なる場合の対処のようだがとりあえず無効にする\r
+//                                             if((sTimeNow.wMonth == 12) && (sTime.wMonth == 1))\r
+//                                                     sTime.wYear++;\r
+//                                             else if(sTimeNow.wMonth+1 == sTime.wMonth)\r
+                                               if(sTimeNow.wMonth+1 == sTime.wMonth)\r
                                                        /* nothing */;\r
                                                else if(sTimeNow.wMonth < sTime.wMonth)\r
                                                        sTime.wYear--;\r
@@ -4825,11 +4854,12 @@ static int ResolvFileInfo(char *Str, int ListType, char *Fname, LONGLONG *Size,
 \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
@@ -4893,12 +4923,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
+               // 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
@@ -5449,3 +5494,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