OSDN Git Service

Add option to change default host settings.
[ffftp/ffftp.git] / filelist.c
index d5976f4..f1ea1b4 100755 (executable)
@@ -98,14 +98,14 @@ static int GetListOneLine(char *Buf, int Max, FILE *Fd);
 static int MakeDirPath(char *Str, int ListType, char *Path, char *Dir);\r
 static void 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
 // Windows Server 2008 R2\r
 static int CheckMMDDYYYYformat(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
+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
@@ -201,10 +201,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
@@ -252,10 +258,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
@@ -1303,9 +1315,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
@@ -3195,7 +3207,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
@@ -3215,7 +3227,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
@@ -3576,7 +3588,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
@@ -3607,11 +3619,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
@@ -4399,7 +4415,7 @@ static int CheckMMDDYYYYformat(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
@@ -4556,6 +4572,8 @@ static int ResolvFileInfo(char *Str, int ListType, char *Fname, LONGLONG *Size,
                                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
@@ -6138,7 +6156,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
@@ -6158,7 +6176,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
@@ -6166,15 +6188,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
@@ -6187,28 +6210,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