X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=filelist.c;h=97da4302057e0bc6dea008f46ffb22b46b5612ee;hb=27179b11319a3068cbf7b1c0d0adae30eba505a0;hp=91e2c352a800efa3246a57b70e1cb1bd03962457;hpb=2bffe82de6811b380d280099f638dd7b4cbb3404;p=ffftp%2Fffftp.git diff --git a/filelist.c b/filelist.c old mode 100644 new mode 100755 index 91e2c35..97da430 --- a/filelist.c +++ b/filelist.c @@ -89,20 +89,28 @@ static void AddListView(HWND hWnd, int Pos, char *Name, int Type, LONGLONG Size, // 64ビット対応 //static BOOL CALLBACK SelectDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam); static INT_PTR CALLBACK SelectDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam); +static int GetImageIndex(int Win, int Pos); static void DispListList(FILELIST *Pos, char *Title); -static void MakeRemoteTree1(char *Path, char *Cur, FILELIST **Base, int *CancelCheckWork); -static void MakeRemoteTree2(char *Path, char *Cur, FILELIST **Base, int *CancelCheckWork); +// ファイル一覧バグ修正 +//static void MakeRemoteTree1(char *Path, char *Cur, FILELIST **Base, int *CancelCheckWork); +//static void MakeRemoteTree2(char *Path, char *Cur, FILELIST **Base, int *CancelCheckWork); +static int MakeRemoteTree1(char *Path, char *Cur, FILELIST **Base, int *CancelCheckWork); +static int MakeRemoteTree2(char *Path, char *Cur, FILELIST **Base, int *CancelCheckWork); static void CopyTmpListToFileList(FILELIST **Base, FILELIST *List); static int GetListOneLine(char *Buf, int Max, FILE *Fd); static int MakeDirPath(char *Str, int ListType, char *Path, char *Dir); -static void MakeLocalTree(char *Path, FILELIST **Base); +// ファイル一覧バグ修正 +//static void MakeLocalTree(char *Path, FILELIST **Base); +static int MakeLocalTree(char *Path, FILELIST **Base); static void AddFileList(FILELIST *Pkt, FILELIST **Base); -static int AnalizeFileInfo(char *Str); +static int AnalyzeFileInfo(char *Str); static int CheckUnixType(char *Str, char *Tmp, int Add1, int Add2, int Day); static int CheckHHMMformat(char *Str); static int CheckYYMMDDformat(char *Str, char Sym, int Dig3); static int CheckYYYYMMDDformat(char *Str, char Sym); -static int ResolvFileInfo(char *Str, int ListType, char *Fname, LONGLONG *Size, FILETIME *Time, int *Attr, char *Owner, int *Link, int *InfoExist); +// Windows Server 2008 R2 +static int CheckMMDDYYYYformat(char *Str, char Sym); +static int ResolveFileInfo(char *Str, int ListType, char *Fname, LONGLONG *Size, FILETIME *Time, int *Attr, char *Owner, int *Link, int *InfoExist); static int FindField(char *Str, char *Buf, int Num, int ToLast); // MLSD対応 static int FindField2(char *Str, char *Buf, char Separator, int Num, int ToLast); @@ -124,6 +132,10 @@ extern int RemoteWidth; extern int ListHeight; extern char FilterStr[FILTER_EXT_LEN+1]; extern HWND hHelpWin; +// 外部アプリケーションへドロップ後にローカル側のファイル一覧に作業フォルダが表示されるバグ対策 +extern int SuppressRefresh; +// ローカル側自動更新 +extern HANDLE ChangeNotification; /* 設定値 */ extern int LocalWidth; @@ -137,6 +149,12 @@ extern int DotFile; extern int DispIgnoreHide; extern int DispDrives; extern int MoveMode; +// ファイルアイコン表示対応 +extern int DispFileIcon; +// タイムスタンプのバグ修正 +extern int DispTimeSeconds; +// ファイルの属性を数字で表示 +extern int DispPermissionsNumber; /*===== ローカルなワーク =====*/ @@ -183,12 +201,21 @@ int MakeListWin(HWND hWnd, HINSTANCE hInst) LV_COLUMN LvCol; long Tmp; + // 変数が未初期化のバグ修正 + memset(&LvCol, 0, sizeof(LV_COLUMN)); + /*===== ローカル側のリストビュー =====*/ + // 高DPI対応 +// hWndListLocal = CreateWindowEx(/*WS_EX_STATICEDGE*/WS_EX_CLIENTEDGE, +// WC_LISTVIEWA, NULL, +// WS_CHILD | /*WS_BORDER | */LVS_REPORT | LVS_SHOWSELALWAYS, +// 0, TOOLWIN_HEIGHT*2, LocalWidth, ListHeight, +// GetMainHwnd(), (HMENU)1500, hInst, NULL); hWndListLocal = CreateWindowEx(/*WS_EX_STATICEDGE*/WS_EX_CLIENTEDGE, WC_LISTVIEWA, NULL, WS_CHILD | /*WS_BORDER | */LVS_REPORT | LVS_SHOWSELALWAYS, - 0, TOOLWIN_HEIGHT*2, LocalWidth, ListHeight, + 0, AskToolWinHeight()*2, LocalWidth, ListHeight, GetMainHwnd(), (HMENU)1500, hInst, NULL); if(hWndListLocal != NULL) @@ -236,10 +263,16 @@ int MakeListWin(HWND hWnd, HINSTANCE hInst) /*===== ホスト側のリストビュー =====*/ + // 高DPI対応 +// hWndListRemote = CreateWindowEx(/*WS_EX_STATICEDGE*/WS_EX_CLIENTEDGE, +// WC_LISTVIEWA, NULL, +// WS_CHILD | /*WS_BORDER | */LVS_REPORT | LVS_SHOWSELALWAYS, +// LocalWidth + SepaWidth, TOOLWIN_HEIGHT*2, RemoteWidth, ListHeight, +// GetMainHwnd(), (HMENU)1500, hInst, NULL); hWndListRemote = CreateWindowEx(/*WS_EX_STATICEDGE*/WS_EX_CLIENTEDGE, WC_LISTVIEWA, NULL, WS_CHILD | /*WS_BORDER | */LVS_REPORT | LVS_SHOWSELALWAYS, - LocalWidth + SepaWidth, TOOLWIN_HEIGHT*2, RemoteWidth, ListHeight, + LocalWidth + SepaWidth, AskToolWinHeight()*2, RemoteWidth, ListHeight, GetMainHwnd(), (HMENU)1500, hInst, NULL); if(hWndListRemote != NULL) @@ -495,6 +528,11 @@ static void doTransferRemoteFile(void) remove(fn); } + // 同時接続対応 + DisableUserOpe(); + // 外部アプリケーションへドロップ後にローカル側のファイル一覧に作業フォルダが表示されるバグ対策 + SuppressRefresh = 1; + // ダウンロード先をテンポラリに設定 SetLocalDirHist(TmpDir); @@ -526,6 +564,12 @@ static void doTransferRemoteFile(void) SetLocalDirHist(LocDir); SetCurrentDirAsDirHist(); + // 外部アプリケーションへドロップ後にローカル側のファイル一覧に作業フォルダが表示されるバグ対策 + SuppressRefresh = 0; + GetLocalDirForWnd(); + // 同時接続対応 + EnableUserOpe(); + remoteFileListBase = FileListBase; // あとでフリーすること remoteFileListBaseNoExpand = FileListBaseNoExpand; // あとでフリーすること strncpy_s(remoteFileDir, sizeof(remoteFileDir), TmpDir, _TRUNCATE); @@ -798,7 +842,7 @@ static LRESULT FileListCommonWndProc(HWND hWnd, UINT message, WPARAM wParam, LPA if(hWnd == hWndListRemote) { if(AskConnecting() == YES) - UpLoadDragProc(wParam); + UploadDragProc(wParam); } else if(hWnd == hWndListLocal) { @@ -1125,6 +1169,9 @@ void GetListTabWidth(void) LV_COLUMN LvCol; int i; + // 変数が未初期化のバグ修正 + memset(&LvCol, 0, sizeof(LV_COLUMN)); + for(i = 0; i <= 3; i++) { LvCol.mask = LVCF_WIDTH; @@ -1273,9 +1320,9 @@ void GetRemoteDirForWnd(int Mode, int *CancelCheckWork) while(GetListOneLine(Str, FMAX_PATH, fd) == FFFTP_SUCCESS) { - if((ListType = AnalizeFileInfo(Str)) != LIST_UNKNOWN) + if((ListType = AnalyzeFileInfo(Str)) != LIST_UNKNOWN) { - if((Type = ResolvFileInfo(Str, ListType, Buf, &Size, &Time, &Attr, Owner, &Link, &InfoExist)) != NODE_NONE) + if((Type = ResolveFileInfo(Str, ListType, Buf, &Size, &Time, &Attr, Owner, &Link, &InfoExist)) != NODE_NONE) { if(AskFilterStr(Buf, Type) == YES) { @@ -1342,7 +1389,7 @@ void RefreshIconImageList(FLISTANCHOR *Anchor) int i; char Cur[FMAX_PATH+1]; SHFILEINFO FileInfo; - if(AskDispFileIcon() == YES) + if(DispFileIcon == YES) { SendMessage(hWndListLocal, LVM_SETIMAGELIST, LVSIL_SMALL, (LPARAM)NULL); ShowWindow(hWndListLocal, SW_SHOW); @@ -1366,7 +1413,7 @@ void RefreshIconImageList(FLISTANCHOR *Anchor) SetYenTail(Cur); strcat(Cur, Pos->File); } - if(SHGetFileInfoM(Cur, 0, &FileInfo, sizeof(SHFILEINFO), SHGFI_SMALLICON | SHGFI_ICON) != 0) + if(SHGetFileInfo(Cur, 0, &FileInfo, sizeof(SHFILEINFO), SHGFI_SMALLICON | SHGFI_ICON) != 0) { if(ImageList_AddIcon(ListImgFileIcon, FileInfo.hIcon) >= 0) { @@ -1410,6 +1457,11 @@ void GetLocalDirForWnd(void) SetLocalDirHist(Scan); DispLocalFreeSpace(Scan); + // ローカル側自動更新 + if(ChangeNotification != INVALID_HANDLE_VALUE) + FindCloseChangeNotification(ChangeNotification); + ChangeNotification = FindFirstChangeNotification(Scan, FALSE, FILE_NOTIFY_CHANGE_FILE_NAME | FILE_NOTIFY_CHANGE_DIR_NAME | FILE_NOTIFY_CHANGE_ATTRIBUTES | FILE_NOTIFY_CHANGE_SIZE | FILE_NOTIFY_CHANGE_LAST_WRITE); + /* ディレクトリ/ファイル */ SetYenTail(Scan); @@ -1443,7 +1495,7 @@ void GetLocalDirForWnd(void) if(DispDrives) { GetLogicalDriveStrings(FMAX_PATH, Scan); - NoDrives = LoadHideDriveListRegistory(); + NoDrives = LoadHideDriveListRegistry(); Pos = Scan; while(*Pos != NUL) @@ -1525,20 +1577,36 @@ static void AddDispFileList(FLISTANCHOR *Anchor, char *Name, FILETIME *Time, LON if((Sort & SORT_GET_ORD) == SORT_ASCENT) { - if((((Sort & SORT_MASK_ORD) == SORT_EXT) && - ((Cmp = _mbsicmp(GetFileExt(Name), GetFileExt(Pos->File))) < 0)) || + // 読みにくいのでリファクタリング +// if((((Sort & SORT_MASK_ORD) == SORT_EXT) && +// ((Cmp = _mbsicmp(GetFileExt(Name), GetFileExt(Pos->File))) < 0)) || +//#if defined(HAVE_TANDEM) +// ((AskHostType() == HTYPE_TANDEM) && +// ((Sort & SORT_MASK_ORD) == SORT_EXT) && +// ((Cmp = Attr - Pos->Attr) < 0)) || +//#endif +// (((Sort & SORT_MASK_ORD) == SORT_SIZE) && +// ((Cmp = Size - Pos->Size) < 0)) || +// (((Sort & SORT_MASK_ORD) == SORT_DATE) && +// ((Cmp = CompareFileTime(Time, &Pos->Time)) < 0))) +// { +// break; +// } + if(((Sort & SORT_MASK_ORD) == SORT_EXT) && + ((Cmp = _mbsicmp(GetFileExt(Name), GetFileExt(Pos->File))) < 0)) + break; #if defined(HAVE_TANDEM) - ((AskHostType() == HTYPE_TANDEM) && - ((Sort & SORT_MASK_ORD) == SORT_EXT) && - ((Cmp = Attr - Pos->Attr) < 0)) || + if((AskHostType() == HTYPE_TANDEM) && + ((Sort & SORT_MASK_ORD) == SORT_EXT) && + ((Cmp = Attr - Pos->Attr) < 0)) + break; #endif - (((Sort & SORT_MASK_ORD) == SORT_SIZE) && - ((Cmp = Size - Pos->Size) < 0)) || - (((Sort & SORT_MASK_ORD) == SORT_DATE) && - ((Cmp = CompareFileTime(Time, &Pos->Time)) < 0))) - { + if(((Sort & SORT_MASK_ORD) == SORT_SIZE) && + ((Cmp = Size - Pos->Size) < 0)) + break; + if(((Sort & SORT_MASK_ORD) == SORT_DATE) && + ((Cmp = CompareFileTime(Time, &Pos->Time)) < 0)) break; - } if(((Sort & SORT_MASK_ORD) == SORT_NAME) || (Cmp == 0)) { @@ -1548,20 +1616,36 @@ static void AddDispFileList(FLISTANCHOR *Anchor, char *Name, FILETIME *Time, LON } else { + // 読みにくいのでリファクタリング +// if((((Sort & SORT_MASK_ORD) == SORT_EXT) && +// ((Cmp = _mbsicmp(GetFileExt(Name), GetFileExt(Pos->File))) > 0)) || +//#if defined(HAVE_TANDEM) +// ((AskHostType() == HTYPE_TANDEM) && +// ((Sort & SORT_MASK_ORD) == SORT_EXT) && +// ((Cmp = Attr - Pos->Attr) > 0)) || +//#endif +// (((Sort & SORT_MASK_ORD) == SORT_SIZE) && +// ((Cmp = Size - Pos->Size) > 0)) || +// (((Sort & SORT_MASK_ORD) == SORT_DATE) && +// ((Cmp = CompareFileTime(Time, &Pos->Time)) > 0))) +// { +// break; +// } if((((Sort & SORT_MASK_ORD) == SORT_EXT) && - ((Cmp = _mbsicmp(GetFileExt(Name), GetFileExt(Pos->File))) > 0)) || + ((Cmp = _mbsicmp(GetFileExt(Name), GetFileExt(Pos->File))) > 0))) + break; #if defined(HAVE_TANDEM) - ((AskHostType() == HTYPE_TANDEM) && + if(((AskHostType() == HTYPE_TANDEM) && ((Sort & SORT_MASK_ORD) == SORT_EXT) && - ((Cmp = Attr - Pos->Attr) > 0)) || + ((Cmp = Attr - Pos->Attr) > 0))) + break; #endif - (((Sort & SORT_MASK_ORD) == SORT_SIZE) && - ((Cmp = Size - Pos->Size) > 0)) || - (((Sort & SORT_MASK_ORD) == SORT_DATE) && - ((Cmp = CompareFileTime(Time, &Pos->Time)) > 0))) - { + if(((Sort & SORT_MASK_ORD) == SORT_SIZE) && + ((Cmp = Size - Pos->Size) > 0)) + break; + if(((Sort & SORT_MASK_ORD) == SORT_DATE) && + ((Cmp = CompareFileTime(Time, &Pos->Time)) > 0)) break; - } if(((Sort & SORT_MASK_ORD) == SORT_NAME) || (Cmp == 0)) { @@ -1692,6 +1776,8 @@ static void AddListView(HWND hWnd, int Pos, char *Name, int Type, LONGLONG Size, if(Pos == -1) Pos = SendMessage(hWnd, LVM_GETITEMCOUNT, 0, 0); + // 変数が未初期化のバグ修正 + memset(&LvItem, 0, sizeof(LV_ITEM)); /* アイコン/ファイル名 */ LvItem.mask = LVIF_TEXT | LVIF_IMAGE; LvItem.iItem = Pos; @@ -1704,12 +1790,14 @@ static void AddListView(HWND hWnd, int Pos, char *Name, int Type, LONGLONG Size, else LvItem.iImage = 4; // ファイルアイコン表示対応 - if(AskDispFileIcon() == YES && hWnd == GetLocalHwnd()) + if(DispFileIcon == YES && hWnd == GetLocalHwnd()) LvItem.iImage = ImageId + 5; LvItem.iItem = SendMessage(hWnd, LVM_INSERTITEM, 0, (LPARAM)&LvItem); /* 日付/時刻 */ - FileTime2TimeString(Time, Tmp, DISPFORM_LEGACY, InfoExist); + // タイムスタンプのバグ修正 +// FileTime2TimeString(Time, Tmp, DISPFORM_LEGACY, InfoExist); + FileTime2TimeString(Time, Tmp, DISPFORM_LEGACY, InfoExist, DispTimeSeconds); LvItem.mask = LVIF_TEXT; LvItem.iItem = Pos; LvItem.iSubItem = 1; @@ -1753,7 +1841,9 @@ static void AddListView(HWND hWnd, int Pos, char *Name, int Type, LONGLONG Size, #else if(InfoExist & FINFO_ATTR) #endif - AttrValue2String(Attr, Tmp); + // ファイルの属性を数字で表示 +// AttrValue2String(Attr, Tmp); + AttrValue2String(Attr, Tmp, DispPermissionsNumber); LvItem.mask = LVIF_TEXT; LvItem.iItem = Pos; LvItem.iSubItem = 4; @@ -1800,7 +1890,9 @@ void ReSortDispList(int Win, int *CancelCheckWork) * なし *----------------------------------------------------------------------------*/ -void SelectFileInList(HWND hWnd, int Type) +// ローカル側自動更新 +//void SelectFileInList(HWND hWnd, int Type) +void SelectFileInList(HWND hWnd, int Type, FILELIST *Base) { int Win; int WinDst; @@ -1814,6 +1906,8 @@ void SelectFileInList(HWND hWnd, int Type) FILETIME Time2; int Find; + // 変数が未初期化のバグ修正 + memset(&LvItem, 0, sizeof(LV_ITEM)); Win = WIN_LOCAL; WinDst = WIN_REMOTE; if(hWnd == GetRemoteHwnd()) @@ -1916,6 +2010,22 @@ void SelectFileInList(HWND hWnd, int Type) } } break; + + // ローカル側自動更新 + case SELECT_LIST : + for(i = 0; i < Num; i++) + { + LvItem.state = 0; + GetNodeName(Win, i, Name, FMAX_PATH); + if(SearchFileList(Name, Base, COMP_STRICT) != NULL) + LvItem.state = LVIS_SELECTED; + LvItem.mask = LVIF_STATE; + LvItem.iItem = i; + LvItem.stateMask = LVIS_SELECTED; + LvItem.iSubItem = 0; + SendMessage(hWnd, LVM_SETITEMSTATE, i, (LPARAM)&LvItem); + } + break; } return; } @@ -1994,6 +2104,8 @@ void FindFileInList(HWND hWnd, int Type) LV_ITEM LvItem; char *Title; + // 変数が未初期化のバグ修正 + memset(&LvItem, 0, sizeof(LV_ITEM)); Win = WIN_LOCAL; Title = MSGJPN050; if(hWnd == GetRemoteHwnd()) @@ -2255,6 +2367,58 @@ int GetNextSelected(int Win, int Pos, int All) } +// ローカル側自動更新 +int GetHotSelected(int Win, char *Fname) +{ + HWND hWnd; + int Pos; + + hWnd = GetLocalHwnd(); + if(Win == WIN_REMOTE) + hWnd = GetRemoteHwnd(); + + Pos = SendMessage(hWnd, LVM_GETNEXTITEM, (WPARAM)-1, (LPARAM)MAKELPARAM(LVNI_FOCUSED, 0)); + if(Pos != -1) + GetNodeName(Win, Pos, Fname, FMAX_PATH); + + return Pos; +} + +int SetHotSelected(int Win, char *Fname) +{ + HWND hWnd; + int i; + int Num; + char Name[FMAX_PATH+1]; + LV_ITEM LvItem; + int Pos; + + hWnd = GetLocalHwnd(); + if(Win == WIN_REMOTE) + hWnd = GetRemoteHwnd(); + + Num = GetItemCount(Win); + memset(&LvItem, 0, sizeof(LV_ITEM)); + Pos = -1; + for(i = 0; i < Num; i++) + { + LvItem.state = 0; + GetNodeName(Win, i, Name, FMAX_PATH); + if(_mbscmp(Fname, Name) == 0) + { + Pos = i; + LvItem.state = LVIS_FOCUSED; + } + LvItem.mask = LVIF_STATE; + LvItem.iItem = i; + LvItem.stateMask = LVIS_FOCUSED; + LvItem.iSubItem = 0; + SendMessage(hWnd, LVM_SETITEMSTATE, i, (LPARAM)&LvItem); + } + + return Pos; +} + /*----- 指定された名前のアイテムを探す ---------------------------------------- * * Parameter @@ -2275,6 +2439,8 @@ int FindNameNode(int Win, char *Name) if(Win == WIN_REMOTE) hWnd = GetRemoteHwnd(); + // 変数が未初期化のバグ修正 + memset(&FindInfo, 0, sizeof(LV_FINDINFO)); FindInfo.flags = LVFI_STRING; FindInfo.psz = Name; return(SendMessage(hWnd, LVM_FINDITEM, -1, (LPARAM)&FindInfo)); @@ -2302,6 +2468,8 @@ void GetNodeName(int Win, int Pos, char *Buf, int Max) if(Win == WIN_REMOTE) hWnd = GetRemoteHwnd(); + // 変数が未初期化のバグ修正 + memset(&LvItem, 0, sizeof(LV_ITEM)); LvItem.mask = LVIF_TEXT; LvItem.iItem = Pos; LvItem.iSubItem = 0; @@ -2335,6 +2503,8 @@ int GetNodeTime(int Win, int Pos, FILETIME *Buf) if(Win == WIN_REMOTE) hWnd = GetRemoteHwnd(); + // 変数が未初期化のバグ修正 + memset(&LvItem, 0, sizeof(LV_ITEM)); LvItem.mask = LVIF_TEXT; LvItem.iItem = Pos; LvItem.iSubItem = 1; @@ -2369,6 +2539,8 @@ int GetNodeSize(int Win, int Pos, LONGLONG *Buf) if(Win == WIN_REMOTE) hWnd = GetRemoteHwnd(); + // 変数が未初期化のバグ修正 + memset(&LvItem, 0, sizeof(LV_ITEM)); LvItem.mask = LVIF_TEXT; LvItem.iItem = Pos; LvItem.iSubItem = 2; @@ -2416,6 +2588,8 @@ int GetNodeAttr(int Win, int Pos, int *Buf) Ret = NO; if(Win == WIN_REMOTE) { + // 変数が未初期化のバグ修正 + memset(&LvItem, 0, sizeof(LV_ITEM)); LvItem.mask = LVIF_TEXT; LvItem.iItem = Pos; #if defined(HAVE_TANDEM) @@ -2463,6 +2637,8 @@ int GetNodeType(int Win, int Pos) if(Win == WIN_REMOTE) hWnd = GetRemoteHwnd(); + // 変数が未初期化のバグ修正 + memset(&LvItem, 0, sizeof(LV_ITEM)); LvItem.mask = LVIF_TEXT; LvItem.iItem = Pos; LvItem.iSubItem = 2; @@ -2481,6 +2657,35 @@ int GetNodeType(int Win, int Pos) } +/*----- 指定位置のアイテムのイメージ番号を返す ---------------------------------------- +* +* Parameter +* int Win : ウインドウ番号 (WIN_xxx) +* int Pos : 位置 +* +* Return Value +* int イメージ番号 +* 4 Symlink +*----------------------------------------------------------------------------*/ +static int GetImageIndex(int Win, int Pos) +{ + HWND hWnd; + LV_ITEM LvItem; + + hWnd = GetLocalHwnd(); + if(Win == WIN_REMOTE) + hWnd = GetRemoteHwnd(); + + // 変数が未初期化のバグ修正 + memset(&LvItem, 0, sizeof(LV_ITEM)); + LvItem.mask = LVIF_IMAGE; + LvItem.iItem = Pos; + LvItem.iSubItem = 0; + SendMessage(hWnd, LVM_GETITEM, 0, (LPARAM)&LvItem); + return LvItem.iImage; +} + + /*----- 指定位置のアイテムのオーナ名を返す ------------------------------------ * * Parameter @@ -2500,6 +2705,8 @@ void GetNodeOwner(int Win, int Pos, char *Buf, int Max) strcpy(Buf, ""); if(Win == WIN_REMOTE) { + // 変数が未初期化のバグ修正 + memset(&LvItem, 0, sizeof(LV_ITEM)); LvItem.mask = LVIF_TEXT; LvItem.iItem = Pos; LvItem.iSubItem = 5; @@ -2578,8 +2785,12 @@ double GetSelectedTotalSize(int Win) * なし *----------------------------------------------------------------------------*/ -void MakeSelectedFileList(int Win, int Expand, int All, FILELIST **Base, int *CancelCheckWork) +// ファイル一覧バグ修正 +//void MakeSelectedFileList(int Win, int Expand, int All, FILELIST **Base, int *CancelCheckWork) +int MakeSelectedFileList(int Win, int Expand, int All, FILELIST **Base, int *CancelCheckWork) { + // ファイル一覧バグ修正 + int Sts; int Pos; char Name[FMAX_PATH+1]; char Cur[FMAX_PATH+1]; @@ -2588,6 +2799,8 @@ void MakeSelectedFileList(int Win, int Expand, int All, FILELIST **Base, int *Ca DWORD Attr; int Ignore; + // ファイル一覧バグ修正 + Sts = FFFTP_SUCCESS; if((All == YES) || (GetSelectedCount(Win) > 0)) { /*===== カレントディレクトリのファイル =====*/ @@ -2599,6 +2812,9 @@ void MakeSelectedFileList(int Win, int Expand, int All, FILELIST **Base, int *Ca if((Node == NODE_FILE) || ((Expand == NO) && (Node == NODE_DIR))) { + // 変数が未初期化のバグ修正 + memset(&Pkt, 0, sizeof(FILELIST)); + Pkt.InfoExist = 0; GetNodeName(Win, Pos, Pkt.File, FMAX_PATH); if(GetNodeSize(Win, Pos, &Pkt.Size) == YES) @@ -2635,6 +2851,9 @@ void MakeSelectedFileList(int Win, int Expand, int All, FILELIST **Base, int *Ca { if(GetNodeType(Win, Pos) == NODE_DIR) { + // 変数が未初期化のバグ修正 + memset(&Pkt, 0, sizeof(FILELIST)); + GetNodeName(Win, Pos, Name, FMAX_PATH); strcpy(Pkt.File, Name); ReplaceAll(Pkt.File, '\\', '/'); @@ -2654,26 +2873,59 @@ void MakeSelectedFileList(int Win, int Expand, int All, FILELIST **Base, int *Ca if(Ignore == NO) { - Pkt.Node = NODE_DIR; +// Pkt.Node = NODE_DIR; + if(GetImageIndex(Win, Pos) == 4) // symlink + Pkt.Node = NODE_FILE; + else + Pkt.Node = NODE_DIR; Pkt.Attr = 0; Pkt.Size = 0; memset(&Pkt.Time, 0, sizeof(FILETIME)); AddFileList(&Pkt, Base); - if(Win == WIN_LOCAL) - MakeLocalTree(Name, Base); - else - { - AskRemoteCurDir(Cur, FMAX_PATH); - - if((AskListCmdMode() == NO) && - (AskUseNLST_R() == YES)) - MakeRemoteTree1(Name, Cur, Base, CancelCheckWork); +// if(Win == WIN_LOCAL) +// MakeLocalTree(Name, Base); +// else +// { +// AskRemoteCurDir(Cur, FMAX_PATH); +// +// if((AskListCmdMode() == NO) && +// (AskUseNLST_R() == YES)) +// MakeRemoteTree1(Name, Cur, Base, CancelCheckWork); +// else +// MakeRemoteTree2(Name, Cur, Base, CancelCheckWork); +// } + if(GetImageIndex(Win, Pos) != 4) { // symlink + if(Win == WIN_LOCAL) + // ファイル一覧バグ修正 +// MakeLocalTree(Name, Base); + { + if(MakeLocalTree(Name, Base) == FFFTP_FAIL) + Sts = FFFTP_FAIL; + } else - MakeRemoteTree2(Name, Cur, Base, CancelCheckWork); + { + AskRemoteCurDir(Cur, FMAX_PATH); + + if((AskListCmdMode() == NO) && + (AskUseNLST_R() == YES)) + // ファイル一覧バグ修正 +// MakeRemoteTree1(Name, Cur, Base, CancelCheckWork); + { + if(MakeRemoteTree1(Name, Cur, Base, CancelCheckWork) == FFFTP_FAIL) + Sts = FFFTP_FAIL; + } + else + // ファイル一覧バグ修正 +// MakeRemoteTree2(Name, Cur, Base, CancelCheckWork); + { + if(MakeRemoteTree2(Name, Cur, Base, CancelCheckWork) == FFFTP_FAIL) + Sts = FFFTP_FAIL; + } //DispListList(*Base, "LIST"); + } } } } @@ -2681,7 +2933,9 @@ void MakeSelectedFileList(int Win, int Expand, int All, FILELIST **Base, int *Ca } } } - return; + // ファイル一覧バグ修正 +// return; + return(Sts); } @@ -2732,6 +2986,9 @@ void MakeDroppedFileList(WPARAM wParam, char *Cur, FILELIST **Base) if((GetFileAttributes(Name) & FILE_ATTRIBUTE_DIRECTORY) == 0) { + // 変数が未初期化のバグ修正 + memset(&Pkt, 0, sizeof(FILELIST)); + Pkt.Node = NODE_FILE; strcpy(Pkt.File, GetFileName(Name)); @@ -2762,6 +3019,9 @@ void MakeDroppedFileList(WPARAM wParam, char *Cur, FILELIST **Base) if(GetFileAttributes(Name) & FILE_ATTRIBUTE_DIRECTORY) { + // 変数が未初期化のバグ修正 + memset(&Pkt, 0, sizeof(FILELIST)); + Pkt.Node = NODE_DIR; strcpy(Pkt.File, GetFileName(Name)); AddFileList(&Pkt, Base); @@ -2814,10 +3074,16 @@ void MakeDroppedDir(WPARAM wParam, char *Cur) * NLST -alLR を使う *----------------------------------------------------------------------------*/ -static void MakeRemoteTree1(char *Path, char *Cur, FILELIST **Base, int *CancelCheckWork) +// ファイル一覧バグ修正 +//static void MakeRemoteTree1(char *Path, char *Cur, FILELIST **Base, int *CancelCheckWork) +static int MakeRemoteTree1(char *Path, char *Cur, FILELIST **Base, int *CancelCheckWork) { + // ファイル一覧バグ修正 + int Ret; int Sts; + // ファイル一覧バグ修正 + Ret = FFFTP_FAIL; if(DoCWD(Path, NO, NO, NO) == FTP_COMPLETE) { /* サブフォルダも含めたリストを取得 */ @@ -2825,9 +3091,16 @@ static void MakeRemoteTree1(char *Path, char *Cur, FILELIST **Base, int *CancelC DoCWD(Cur, NO, NO, NO); if(Sts == FTP_COMPLETE) + // ファイル一覧バグ修正 +// AddRemoteTreeToFileList(999, Path, RDIR_NLST, Base); + { AddRemoteTreeToFileList(999, Path, RDIR_NLST, Base); + Ret = FFFTP_SUCCESS; + } } - return; + // ファイル一覧バグ修正 +// return; + return(Ret); } @@ -2845,13 +3118,19 @@ static void MakeRemoteTree1(char *Path, char *Cur, FILELIST **Base, int *CancelC * 各フォルダに移動してリストを取得 *----------------------------------------------------------------------------*/ -static void MakeRemoteTree2(char *Path, char *Cur, FILELIST **Base, int *CancelCheckWork) +// ファイル一覧バグ修正 +//static void MakeRemoteTree2(char *Path, char *Cur, FILELIST **Base, int *CancelCheckWork) +static int MakeRemoteTree2(char *Path, char *Cur, FILELIST **Base, int *CancelCheckWork) { + // ファイル一覧バグ修正 + int Ret; int Sts; FILELIST *CurList; FILELIST *Pos; FILELIST Pkt; + // ファイル一覧バグ修正 + Ret = FFFTP_FAIL; /* VAX VMS は CWD xxx/yyy という指定ができないので */ /* CWD xxx, Cwd yyy と複数に分ける */ if(AskHostType() != HTYPE_VMS) @@ -2876,28 +3155,48 @@ static void MakeRemoteTree2(char *Path, char *Cur, FILELIST **Base, int *CancelC AddRemoteTreeToFileList(999, Path, RDIR_CWD, &CurList); CopyTmpListToFileList(Base, CurList); + // ファイル一覧バグ修正 + Ret = FFFTP_SUCCESS; + Pos = CurList; while(Pos != NULL) { if(Pos->Node == NODE_DIR) { + // 変数が未初期化のバグ修正 + memset(&Pkt, 0, sizeof(FILELIST)); + /* まずディレクトリ名をセット */ strcpy(Pkt.File, Pos->File); - Pkt.Node = NODE_DIR; +// Pkt.Node = NODE_DIR; + Pkt.Link = Pos->Link; + if(Pkt.Link == YES) + Pkt.Node = NODE_FILE; + else + Pkt.Node = NODE_DIR; Pkt.Size = 0; Pkt.Attr = 0; memset(&Pkt.Time, 0, sizeof(FILETIME)); AddFileList(&Pkt, Base); /* そのディレクトリの中を検索 */ - MakeRemoteTree2(Pos->File, Cur, Base, CancelCheckWork); +// MakeRemoteTree2(Pos->File, Cur, Base, CancelCheckWork); + if(Pkt.Link == NO) + // ファイル一覧バグ修正 +// MakeRemoteTree2(Pos->File, Cur, Base, CancelCheckWork); + { + if(MakeRemoteTree2(Pos->File, Cur, Base, CancelCheckWork) == FFFTP_FAIL) + Ret = FFFTP_FAIL; + } } Pos = Pos->Next; } DeleteFileList(&CurList); } } - return; + // ファイル一覧バグ修正 +// return; + return(Ret); } @@ -2965,12 +3264,15 @@ void AddRemoteTreeToFileList(int Num, char *Path, int IncDir, FILELIST **Base) while(GetListOneLine(Str, FMAX_PATH, fd) == FFFTP_SUCCESS) { - if((ListType = AnalizeFileInfo(Str)) == LIST_UNKNOWN) + if((ListType = AnalyzeFileInfo(Str)) == LIST_UNKNOWN) { if(MakeDirPath(Str, ListType, Path, Dir) == FFFTP_SUCCESS) { if(IncDir == RDIR_NLST) { + // 変数が未初期化のバグ修正 + memset(&Pkt, 0, sizeof(FILELIST)); + strcpy(Pkt.File, Dir); Pkt.Node = NODE_DIR; Pkt.Size = 0; @@ -2982,13 +3284,16 @@ void AddRemoteTreeToFileList(int Num, char *Path, int IncDir, FILELIST **Base) } else { - Node = ResolvFileInfo(Str, ListType, Name, &Size, &Time, &Attr, Owner, &Link, &InfoExist); + Node = ResolveFileInfo(Str, ListType, Name, &Size, &Time, &Attr, Owner, &Link, &InfoExist); if(AskFilterStr(Name, Node) == YES) { if((Node == NODE_FILE) || ((IncDir == RDIR_CWD) && (Node == NODE_DIR))) { + // 変数が未初期化のバグ修正 + memset(&Pkt, 0, sizeof(FILELIST)); + strcpy(Pkt.File, Dir); if(strlen(Pkt.File) > 0) SetSlashTail(Pkt.File); @@ -3135,14 +3440,21 @@ static int MakeDirPath(char *Str, int ListType, char *Path, char *Dir) * なし *----------------------------------------------------------------------------*/ -static void MakeLocalTree(char *Path, FILELIST **Base) +// ファイル一覧バグ修正 +//static void MakeLocalTree(char *Path, FILELIST **Base) +static int MakeLocalTree(char *Path, FILELIST **Base) { + // ファイル一覧バグ修正 + int Sts; char Src[FMAX_PATH+1]; HANDLE fHnd; WIN32_FIND_DATA FindBuf; FILELIST Pkt; SYSTEMTIME TmpStime; + // ファイル一覧バグ修正 + Sts = FFFTP_FAIL; + strcpy(Src, Path); SetYenTail(Src); strcat(Src, "*"); @@ -3156,6 +3468,9 @@ static void MakeLocalTree(char *Path, FILELIST **Base) { if(AskFilterStr(FindBuf.cFileName, NODE_FILE) == YES) { + // 変数が未初期化のバグ修正 + memset(&Pkt, 0, sizeof(FILELIST)); + strcpy(Pkt.File, Path); SetSlashTail(Pkt.File); strcat(Pkt.File, FindBuf.cFileName); @@ -3165,7 +3480,10 @@ static void MakeLocalTree(char *Path, FILELIST **Base) Pkt.Attr = 0; Pkt.Time = FindBuf.ftLastWriteTime; FileTimeToSystemTime(&Pkt.Time, &TmpStime); - TmpStime.wSecond = 0; + // タイムスタンプのバグ修正 +// TmpStime.wSecond = 0; + if(DispTimeSeconds == NO) + TmpStime.wSecond = 0; TmpStime.wMilliseconds = 0; SystemTimeToFileTime(&TmpStime, &Pkt.Time); AddFileList(&Pkt, Base); @@ -3178,12 +3496,17 @@ static void MakeLocalTree(char *Path, FILELIST **Base) if((fHnd = FindFirstFileAttr(Src, &FindBuf, DispIgnoreHide)) != INVALID_HANDLE_VALUE) { + // ファイル一覧バグ修正 + Sts = FFFTP_SUCCESS; do { if((FindBuf.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) && (strcmp(FindBuf.cFileName, ".") != 0) && (strcmp(FindBuf.cFileName, "..") != 0)) { + // 変数が未初期化のバグ修正 + memset(&Pkt, 0, sizeof(FILELIST)); + strcpy(Src, Path); SetYenTail(Src); strcat(Src, FindBuf.cFileName); @@ -3195,13 +3518,18 @@ static void MakeLocalTree(char *Path, FILELIST **Base) memset(&Pkt.Time, 0, sizeof(FILETIME)); AddFileList(&Pkt, Base); - MakeLocalTree(Src, Base); + // ファイル一覧バグ修正 +// MakeLocalTree(Src, Base); + if(MakeLocalTree(Src, Base) == FFFTP_FAIL) + Sts = FFFTP_FAIL; } } while(FindNextFileAttr(fHnd, &FindBuf, DispIgnoreHide) == TRUE); FindClose(fHnd); } - return; + // ファイル一覧バグ修正 +// return; + return(Sts); } @@ -3331,7 +3659,7 @@ FILELIST *SearchFileList(char *Fname, FILELIST *Base, int Caps) * int リストタイプ (LIST_xxx) *----------------------------------------------------------------------------*/ -static int AnalizeFileInfo(char *Str) +static int AnalyzeFileInfo(char *Str) { int Ret; char Tmp[FMAX_PATH+1]; @@ -3361,11 +3689,26 @@ static int AnalizeFileInfo(char *Str) Ret = LIST_SHIBASOKU; else { + // MLSD対応 + if(FindField(Str, Tmp, 0, NO) == FFFTP_SUCCESS) + { + _strlwr(Tmp); + if(strstr(Tmp, "type=") != NULL) + { + if(FindField2(Str, Tmp, ';', 1, NO) == FFFTP_SUCCESS && FindField2(Str, Tmp, '=', 1, NO) == FFFTP_SUCCESS) + { + Ret = LIST_MLSD; + } + } + } + /* 以下のフォーマットをチェック */ /* LIST_UNIX_10, LIST_UNIX_20, LIST_UNIX_12, LIST_UNIX_22, LIST_UNIX_50, LIST_UNIX_60 */ /* MELCOM80 */ - if(FindField(Str, Tmp, 0, NO) == FFFTP_SUCCESS) + // MLSD対応 +// if(FindField(Str, Tmp, 0, NO) == FFFTP_SUCCESS) + if(Ret == LIST_UNKNOWN && FindField(Str, Tmp, 0, NO) == FFFTP_SUCCESS) { /* MELCOM80は "d rwxrwxrwx" のようにスペースが空いている */ Flag1 = NO; @@ -3478,6 +3821,13 @@ static int AnalizeFileInfo(char *Str) if((Ret != LIST_UNKNOWN) && (Flag1 == YES)) Ret |= LIST_MELCOM; + + // uClinux + if((Ret == LIST_UNKNOWN) && + (FindField(Str, Tmp, 5+Add1, NO) == FFFTP_SUCCESS)) + { + Ret = LIST_UNIX_17; + } } } @@ -3624,6 +3974,27 @@ static int AnalizeFileInfo(char *Str) } } + // Windows Server 2008 R2 + if(Ret == LIST_UNKNOWN) + { + if((FindField(Str, Tmp, 1, NO) == FFFTP_SUCCESS) && + (CheckHHMMformat(Tmp) == YES)) + { + if((FindField(Str, Tmp, 2, NO) == FFFTP_SUCCESS) && + ((Tmp[0] == '<') || (IsDigit(Tmp[0]) != 0))) + { + if(FindField(Str, Tmp, 3, NO) == FFFTP_SUCCESS) + { + if((FindField(Str, Tmp, 0, NO) == FFFTP_SUCCESS) && + (CheckMMDDYYYYformat(Tmp, NUL) != 0)) + { + Ret = LIST_DOS_5; + } + } + } + } + } + /* 以下のフォーマットをチェック */ /* LIST_CHAMELEON */ @@ -3794,14 +4165,6 @@ static int AnalizeFileInfo(char *Str) } #endif - // MLSD対応 - if(Ret == LIST_UNKNOWN) - { - if(FindField2(Str, Tmp, ';', 1, NO) == FFFTP_SUCCESS && FindField2(Str, Tmp, '=', 1, NO) == FFFTP_SUCCESS) - { - Ret = LIST_MLSD; - } - } } DoPrintf("ListType=%d", Ret); @@ -4086,6 +4449,26 @@ static int CheckYYYYMMDDformat(char *Str, char Sym) } +// Windows Server 2008 R2 +static int CheckMMDDYYYYformat(char *Str, char Sym) +{ + int Ret; + + Ret = NO; + if((strlen(Str) == 10) && + (IsDigitSym(Str[0], Sym) != 0) && (IsDigitSym(Str[1], Sym) != 0) && + (IsDigit(Str[2]) == 0) && + (IsDigitSym(Str[3], Sym) != 0) && (IsDigitSym(Str[4], Sym) != 0) && + (IsDigit(Str[5]) == 0) && + (IsDigitSym(Str[6], Sym) != 0) && (IsDigitSym(Str[7], Sym) != 0) && + (IsDigitSym(Str[8], Sym) != 0) && (IsDigitSym(Str[9], Sym) != 0)) + { + Ret = YES; + } + return(Ret); +} + + /*----- ファイル情報からファイル名、サイズなどを取り出す ---------------------- * * Parameter @@ -4103,7 +4486,7 @@ static int CheckYYYYMMDDformat(char *Str, char Sym) * int 種類 (NODE_xxxx) *----------------------------------------------------------------------------*/ -static int ResolvFileInfo(char *Str, int ListType, char *Fname, LONGLONG *Size, FILETIME *Time, int *Attr, char *Owner, int *Link, int *InfoExist) +static int ResolveFileInfo(char *Str, int ListType, char *Fname, LONGLONG *Size, FILETIME *Time, int *Attr, char *Owner, int *Link, int *InfoExist) { SYSTEMTIME sTime; SYSTEMTIME sTimeNow; @@ -4234,6 +4617,48 @@ static int ResolvFileInfo(char *Str, int ListType, char *Fname, LONGLONG *Size, } break; + // Windows Server 2008 R2 + case LIST_DOS_5 : + *InfoExist |= (FINFO_TIME | FINFO_DATE | FINFO_SIZE); + + /* 日付 */ + FindField(Str, Buf, 0, NO); + sTime.wMonth = atoi(Buf); + sTime.wDay = atoi(Buf+3); + sTime.wYear = atoi(Buf+6); + + /* 時刻 */ + FindField(Str, Buf, 1, NO); + sTime.wHour = atoi(Buf); + sTime.wMinute = atoi(Buf+3); + sTime.wSecond = 0; + sTime.wMilliseconds = 0; + if(_strnicmp(Buf+5, "AM", 2) == 0) + { + if(sTime.wHour == 12) + sTime.wHour = 0; + } + else if(_strnicmp(Buf+5, "PM", 2) == 0) + { + if(sTime.wHour != 12) + sTime.wHour += 12; + } + SystemTimeToFileTime(&sTime, Time); + SpecificLocalFileTime2FileTime(Time, AskHostTimeZone()); + + /* サイズ */ + FindField(Str, Buf, 2, NO); + *Size = _atoi64(Buf); + + /* 名前 */ + if(FindField(Str, Fname, 3, YES) == FFFTP_SUCCESS) + { + Ret = NODE_FILE; + if(Buf[0] == '<') + Ret = NODE_DIR; + } + break; + case LIST_OS2 : *InfoExist |= (FINFO_DATE | FINFO_SIZE); @@ -4867,6 +5292,9 @@ static int ResolvFileInfo(char *Str, int ListType, char *Fname, LONGLONG *Size, // 不完全な実装のホストが存在するため以下の形式も許容 // fact1=value1;fact2=value2;fact3=value3 filename\r\n // fact1=value1;fact2=value2;fact3=value3;filename\r\n + // SymlinkはRFC3659の7.7.4. A More Complex Exampleに + // よるとtype=OS.unix=slink:(target)だが + // ProFTPDはtype=OS.unix=symlink:(target)となる case LIST_MLSD: { int i = 0; @@ -4874,6 +5302,7 @@ static int ResolvFileInfo(char *Str, int ListType, char *Fname, LONGLONG *Size, char Fact[FMAX_PATH + 1]; char Name[FMAX_PATH + 1]; char Value[FMAX_PATH + 1]; + char Value2[FMAX_PATH + 1]; char* pFileName; strncpy(StrBuf, Str, FMAX_PATH * 2); StrBuf[FMAX_PATH * 2] = '\0'; @@ -4904,6 +5333,12 @@ static int ResolvFileInfo(char *Str, int ListType, char *Fname, LONGLONG *Size, Ret = NODE_DIR; else if(_stricmp(Value, "file") == 0) Ret = NODE_FILE; + else if(_stricmp(Value, "OS.unix") == 0) + if(FindField2(Fact, Value2, '=', 2, NO) == FFFTP_SUCCESS) + if(_stricmp(Value2, "symlink") == 0 || _stricmp(Value2, "slink") == 0) { // ProFTPD is symlink. A example of RFC3659 is slink. + Ret = NODE_DIR; + *Link = YES; + } } else if(_stricmp(Name, "size") == 0) { @@ -4968,6 +5403,8 @@ static int ResolvFileInfo(char *Str, int ListType, char *Fname, LONGLONG *Size, // case LIST_MELCOM : // linux-ftpd case LIST_UNIX_16 : + // uClinux + case LIST_UNIX_17 : default: /* offsはサイズの位置, offs=0はカラム4 */ offs = 0; @@ -5023,6 +5460,9 @@ static int ResolvFileInfo(char *Str, int ListType, char *Fname, LONGLONG *Size, (ListType == LIST_UNIX_73) || (ListType == LIST_UNIX_16)) offs2 = -1; + // uClinux + if(ListType == LIST_UNIX_17) + offs2 = -3; /* offs3はオーナ名の位置 */ offs3 = 0; @@ -5053,6 +5493,9 @@ static int ResolvFileInfo(char *Str, int ListType, char *Fname, LONGLONG *Size, (ListType == LIST_UNIX_74) || (ListType == LIST_UNIX_75)) Flag2 = 1; + // uClinux + if(ListType == LIST_UNIX_17) + Flag2 = -1; *InfoExist |= (FINFO_DATE | FINFO_SIZE | FINFO_ATTR); @@ -5150,6 +5593,11 @@ static int ResolvFileInfo(char *Str, int ListType, char *Fname, LONGLONG *Size, } } } + // uClinux + else if(Flag2 == -1) + { + *InfoExist &= ~(FINFO_DATE | FINFO_TIME); + } else { /* LIST_UNIX_?4, LIST_UNIX_?5 の時 */ @@ -5779,7 +6227,7 @@ static int atoi_n(const char *Str, int Len) // UTF-8対応 // ファイル一覧から漢字コードを推測 -// 優先度はUTF-8、Shift_JIS、EUC、JISの順 +// 優先度はUTF-8、Shift_JIS、EUC、JIS、UTF-8 HFS+の順 int AnalyzeNameKanjiCode(int Num) { char Str[FMAX_PATH+1]; @@ -5799,7 +6247,11 @@ int AnalyzeNameKanjiCode(int Num) int PointJIS; int PointEUC; int PointUTF8N; + int PointUTF8HFSX; char* p; + CODECONVINFO cInfo1; + CODECONVINFO cInfo2; + char Buf[FMAX_PATH+1]; NameKanjiCode = KANJI_AUTO; Point = 0; @@ -5807,15 +6259,16 @@ int AnalyzeNameKanjiCode(int Num) PointJIS = 0; PointEUC = 0; PointUTF8N = 0; + PointUTF8HFSX = 0; MakeCacheFileName(Num, Str); if((fd = fopen(Str, "rb")) != NULL) { while(GetListOneLine(Str, FMAX_PATH, fd) == FFFTP_SUCCESS) { - if((ListType = AnalizeFileInfo(Str)) != LIST_UNKNOWN) + if((ListType = AnalyzeFileInfo(Str)) != LIST_UNKNOWN) { strcpy(Name, ""); - Node = ResolvFileInfo(Str, ListType | LIST_RAW_NAME, Name, &Size, &Time, &Attr, Owner, &Link, &InfoExist); + Node = ResolveFileInfo(Str, ListType | LIST_RAW_NAME, Name, &Size, &Time, &Attr, Owner, &Link, &InfoExist); p = Name; while(*p != '\0') { @@ -5828,28 +6281,56 @@ int AnalyzeNameKanjiCode(int Num) } if(!p) { + // ASCII文字の範囲外 if(!CheckStringM(Name)) - PointUTF8N++; - else { - switch(CheckKanjiCode(Name, strlen(Name), KANJI_SJIS)) - { - case KANJI_SJIS: - PointSJIS++; - break; - case KANJI_JIS: - PointJIS++; - break; - case KANJI_EUC: - PointEUC++; - break; - } + InitCodeConvInfo(&cInfo1); + cInfo1.KanaCnv = NO; + cInfo1.Str = Name; + cInfo1.StrLen = strlen(Name); + cInfo1.Buf = Buf; + cInfo1.BufSize = FMAX_PATH; + cInfo2 = cInfo1; + ConvUTF8NtoUTF8HFSX(&cInfo1); + ConvUTF8HFSXtoUTF8N(&cInfo2); + if(cInfo1.OutLen > (int)strlen(Name)) + PointUTF8N++; + else + PointUTF8HFSX++; + if(cInfo2.OutLen < (int)strlen(Name)) + PointUTF8HFSX++; + else + PointUTF8N++; + } + switch(CheckKanjiCode(Name, strlen(Name), KANJI_SJIS)) + { + case KANJI_SJIS: + PointSJIS++; + break; + case KANJI_EUC: + PointEUC++; + break; + } + } + else + { + // ASCII文字の範囲内 + switch(CheckKanjiCode(Name, strlen(Name), KANJI_SJIS)) + { + case KANJI_JIS: + PointJIS++; + break; } } } } fclose(fd); } + if(PointUTF8HFSX >= Point) + { + NameKanjiCode = KANJI_UTF8HFSX; + Point = PointUTF8HFSX; + } if(PointJIS >= Point) { NameKanjiCode = KANJI_JIS;