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
-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
\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
/*===== ホスト側のリストビュー =====*/\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
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
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
}\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
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
* 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
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
}\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
+// 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
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
// 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
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
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
}\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