X-Git-Url: http://git.sourceforge.jp/view?p=ffftp%2Fffftp.git;a=blobdiff_plain;f=filelist.c;h=74d14bb663539a15de9e236eeab0cc3417af2952;hp=51da350bd0328dcb28d0591e091103545a8ae207;hb=2edde15bf5547440d7089c9cf7fd5098a42126b7;hpb=619b82a7a7f0c24da339c76ef9a102960ce928b0 diff --git a/filelist.c b/filelist.c index 51da350..74d14bb 100644 --- a/filelist.c +++ b/filelist.c @@ -83,8 +83,12 @@ static LRESULT FileListCommonWndProc(HWND hWnd, UINT message, WPARAM wParam, LPA static void AddDispFileList(FLISTANCHOR *Anchor, char *Name, FILETIME *Time, LONGLONG Size, int Attr, int Type, int Link, char *Owner, int InfoExist, int Win); static void EraseDispFileList(FLISTANCHOR *Anchor); static void DispFileList2View(HWND hWnd, FLISTANCHOR *Anchor); -static void AddListView(HWND hWnd, int Pos, char *Name, int Type, LONGLONG Size, FILETIME *Time, int Attr, char *Owner, int Link, int InfoExist); -static BOOL CALLBACK SelectDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam); +// ファイルアイコン表示対応 +//static void AddListView(HWND hWnd, int Pos, char *Name, int Type, LONGLONG Size, FILETIME *Time, int Attr, char *Owner, int Link, int InfoExist); +static void AddListView(HWND hWnd, int Pos, char *Name, int Type, LONGLONG Size, FILETIME *Time, int Attr, char *Owner, int Link, int InfoExist, int ImageId); +// 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 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); @@ -108,7 +112,9 @@ static int GetHourAndMinute(char *Str, WORD *Hour, WORD *Minute); static int GetVMSdate(char *Str, WORD *Year, WORD *Month, WORD *Day); static int CheckSpecialDirName(char *Fname); static int AskFilterStr(char *Fname, int Type); -static BOOL CALLBACK FilterWndProc(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam); +// 64ビット対応 +//static BOOL CALLBACK FilterWndProc(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam); +static INT_PTR CALLBACK FilterWndProc(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam); static int atoi_n(const char *Str, int Len); /*===== 外部参照 =====*/ @@ -118,6 +124,8 @@ extern int RemoteWidth; extern int ListHeight; extern char FilterStr[FILTER_EXT_LEN+1]; extern HWND hHelpWin; +// 外部アプリケーションへドロップ後にローカル側のファイル一覧に作業フォルダが表示されるバグ対策 +extern int SuppressRefresh; /* 設定値 */ extern int LocalWidth; @@ -141,6 +149,8 @@ static WNDPROC LocalProcPtr; static WNDPROC RemoteProcPtr; static HIMAGELIST ListImg = NULL; +// ファイルアイコン表示対応 +static HIMAGELIST ListImgFileIcon = NULL; static char FindStr[40+1] = { "*" }; /* 検索文字列 */ static int IgnoreNew = NO; @@ -175,6 +185,9 @@ int MakeListWin(HWND hWnd, HINSTANCE hInst) LV_COLUMN LvCol; long Tmp; + // 変数が未初期化のバグ修正 + memset(&LvCol, 0, sizeof(LV_COLUMN)); + /*===== ローカル側のリストビュー =====*/ hWndListLocal = CreateWindowEx(/*WS_EX_STATICEDGE*/WS_EX_CLIENTEDGE, @@ -187,7 +200,7 @@ int MakeListWin(HWND hWnd, HINSTANCE hInst) { // 64ビット対応 // LocalProcPtr = (WNDPROC)SetWindowLong(hWndListLocal, GWL_WNDPROC, (LONG)LocalWndProc); - LocalProcPtr = (WNDPROC)SetWindowLongPtr(hWndListLocal, GWL_WNDPROC, (LONG_PTR)LocalWndProc); + LocalProcPtr = (WNDPROC)SetWindowLongPtr(hWndListLocal, GWLP_WNDPROC, (LONG_PTR)LocalWndProc); Tmp = SendMessage(hWndListLocal, LVM_GETEXTENDEDLISTVIEWSTYLE, 0, 0); Tmp |= LVS_EX_FULLROWSELECT; @@ -238,7 +251,7 @@ int MakeListWin(HWND hWnd, HINSTANCE hInst) { // 64ビット対応 // RemoteProcPtr = (WNDPROC)SetWindowLong(hWndListRemote, GWL_WNDPROC, (LONG)RemoteWndProc); - RemoteProcPtr = (WNDPROC)SetWindowLongPtr(hWndListRemote, GWL_WNDPROC, (LONG_PTR)RemoteWndProc); + RemoteProcPtr = (WNDPROC)SetWindowLongPtr(hWndListRemote, GWLP_WNDPROC, (LONG_PTR)RemoteWndProc); Tmp = SendMessage(hWndListRemote, LVM_GETEXTENDEDLISTVIEWSTYLE, 0, 0); Tmp |= LVS_EX_FULLROWSELECT; @@ -440,9 +453,11 @@ static void doTransferRemoteFile(void) int CancelFlg = NO; char LocDir[FMAX_PATH+1]; char TmpDir[FMAX_PATH+1]; - char buf[32]; + // 環境依存の不具合対策 +// char buf[32]; int i; - DWORD pid; + // 環境依存の不具合対策 +// DWORD pid; // すでにリモートから転送済みなら何もしない。(2007.9.3 yutaka) if (remoteFileListBase != NULL) @@ -458,10 +473,15 @@ static void doTransferRemoteFile(void) // アプリを多重起動してもコンフリクトしないように、テンポラリフォルダ名にプロセスID // を付加する。(2007.9.13 yutaka) - GetTempPath(sizeof(TmpDir), TmpDir); - pid = GetCurrentProcessId(); - _snprintf_s(buf, sizeof(buf), _TRUNCATE, "ffftp%d", pid); - strncat_s(TmpDir, sizeof(TmpDir), buf, _TRUNCATE); + // 環境依存の不具合対策 +// GetTempPath(sizeof(TmpDir), TmpDir); +// pid = GetCurrentProcessId(); +// _snprintf_s(buf, sizeof(buf), _TRUNCATE, "ffftp%d", pid); +// strncat_s(TmpDir, sizeof(TmpDir), buf, _TRUNCATE); + GetAppTempPath(TmpDir); + _mkdir(TmpDir); + SetYenTail(TmpDir); + strcat(TmpDir, "file"); _mkdir(TmpDir); #if 0 if (TmpDir[strlen(TmpDir) - 1] == '\\') { @@ -480,6 +500,11 @@ static void doTransferRemoteFile(void) remove(fn); } + // 同時接続対応 + DisableUserOpe(); + // 外部アプリケーションへドロップ後にローカル側のファイル一覧に作業フォルダが表示されるバグ対策 + SuppressRefresh = 1; + // ダウンロード先をテンポラリに設定 SetLocalDirHist(TmpDir); @@ -511,6 +536,12 @@ static void doTransferRemoteFile(void) SetLocalDirHist(LocDir); SetCurrentDirAsDirHist(); + // 外部アプリケーションへドロップ後にローカル側のファイル一覧に作業フォルダが表示されるバグ対策 + SuppressRefresh = 0; + GetLocalDirForWnd(); + // 同時接続対応 + EnableUserOpe(); + remoteFileListBase = FileListBase; // あとでフリーすること remoteFileListBaseNoExpand = FileListBaseNoExpand; // あとでフリーすること strncpy_s(remoteFileDir, sizeof(remoteFileDir), TmpDir, _TRUNCATE); @@ -773,6 +804,9 @@ static LRESULT FileListCommonWndProc(HWND hWnd, UINT message, WPARAM wParam, LPA return(CallWindowProc(ProcPtr, hWnd, message, wParam, lParam)); case WM_DROPFILES : + // 同時接続対応 + if(AskUserOpeDisabled() == YES) + break; // ドラッグ中は処理しない。ドラッグ後にWM_LBUTTONDOWNが飛んでくるため、そこで処理する。 if (Dragging == YES) return (FALSE); @@ -780,7 +814,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) { @@ -805,6 +839,9 @@ static LRESULT FileListCommonWndProc(HWND hWnd, UINT message, WPARAM wParam, LPA hCsrDrg = LoadCursor(NULL, IDC_ARROW); SetCursor(hCsrDrg); + // 同時接続対応 + if(AskUserOpeDisabled() == YES) + break; Point.x = (long)(short)LOWORD(lParam); Point.y = (long)(short)HIWORD(lParam); ClientToScreen(hWnd, &Point); @@ -885,6 +922,11 @@ static LRESULT FileListCommonWndProc(HWND hWnd, UINT message, WPARAM wParam, LPA } +#if defined(HAVE_TANDEM) + if(FileListBaseNoExpand == NULL) + pf = FileListBase; + else +#endif pf = FileListBaseNoExpand; for (filenum = 0; pf ; filenum++) { pf = pf->Next; @@ -1099,6 +1141,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; @@ -1307,6 +1352,64 @@ void GetRemoteDirForWnd(int Mode, int *CancelCheckWork) * なし *----------------------------------------------------------------------------*/ +// ファイルアイコン表示対応 +void RefreshIconImageList(FLISTANCHOR *Anchor) +{ + HBITMAP hBitmap; + int ImageId; + FILELIST *Pos; + int i; + char Cur[FMAX_PATH+1]; + SHFILEINFO FileInfo; + if(AskDispFileIcon() == YES) + { + SendMessage(hWndListLocal, LVM_SETIMAGELIST, LVSIL_SMALL, (LPARAM)NULL); + ShowWindow(hWndListLocal, SW_SHOW); + SendMessage(hWndListRemote, LVM_SETIMAGELIST, LVSIL_SMALL, (LPARAM)NULL); + ShowWindow(hWndListRemote, SW_SHOW); + ImageList_Destroy(ListImgFileIcon); + ListImgFileIcon = ImageList_Create(16, 16, ILC_MASK | ILC_COLOR32, 0, 1); + hBitmap = LoadBitmap(GetFtpInst(), MAKEINTRESOURCE(dirattr16_bmp)); + ImageList_AddMasked(ListImgFileIcon, hBitmap, RGB(255, 0, 0)); + DeleteObject(hBitmap); + ImageId = 0; + Pos = Anchor->Top; + for(i = 0; i < Anchor->Files; i++) + { + Pos->ImageId = -1; + if(Pos->Node == NODE_DRIVE) + strcpy(Cur, Pos->File); + else + { + AskLocalCurDir(Cur, FMAX_PATH); + SetYenTail(Cur); + strcat(Cur, Pos->File); + } + if(SHGetFileInfoM(Cur, 0, &FileInfo, sizeof(SHFILEINFO), SHGFI_SMALLICON | SHGFI_ICON) != 0) + { + if(ImageList_AddIcon(ListImgFileIcon, FileInfo.hIcon) >= 0) + { + Pos->ImageId = ImageId; + ImageId++; + } + DestroyIcon(FileInfo.hIcon); + } + Pos = Pos->Next; + } + SendMessage(hWndListLocal, LVM_SETIMAGELIST, LVSIL_SMALL, (LPARAM)ListImgFileIcon); + ShowWindow(hWndListLocal, SW_SHOW); + SendMessage(hWndListRemote, LVM_SETIMAGELIST, LVSIL_SMALL, (LPARAM)ListImgFileIcon); + ShowWindow(hWndListRemote, SW_SHOW); + } + else + { + SendMessage(hWndListLocal, LVM_SETIMAGELIST, LVSIL_SMALL, (LPARAM)ListImg); + ShowWindow(hWndListLocal, SW_SHOW); + SendMessage(hWndListRemote, LVM_SETIMAGELIST, LVSIL_SMALL, (LPARAM)ListImg); + ShowWindow(hWndListRemote, SW_SHOW); + } +} + void GetLocalDirForWnd(void) { HANDLE fHnd; @@ -1359,7 +1462,7 @@ void GetLocalDirForWnd(void) if(DispDrives) { GetLogicalDriveStrings(FMAX_PATH, Scan); - NoDrives = LoadHideDriveListRegistory(); + NoDrives = LoadHideDriveListRegistry(); Pos = Scan; while(*Pos != NUL) @@ -1375,6 +1478,8 @@ void GetLocalDirForWnd(void) } } + // ファイルアイコン表示対応 + RefreshIconImageList(&Anchor); DispFileList2View(GetLocalHwnd(), &Anchor); EraseDispFileList(&Anchor); @@ -1439,15 +1544,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)) || - (((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_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) + if((AskHostType() == HTYPE_TANDEM) && + ((Sort & SORT_MASK_ORD) == SORT_EXT) && + ((Cmp = Attr - Pos->Attr) < 0)) + break; +#endif + 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)) { @@ -1459,6 +1585,11 @@ static void AddDispFileList(FLISTANCHOR *Anchor, char *Name, FILETIME *Time, LON { 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) && @@ -1554,7 +1685,9 @@ static void DispFileList2View(HWND hWnd, FLISTANCHOR *Anchor) Pos = Anchor->Top; for(i = 0; i < Anchor->Files; i++) { - AddListView(hWnd, -1, Pos->File, Pos->Node, Pos->Size, &Pos->Time, Pos->Attr, Pos->Owner, Pos->Link, Pos->InfoExist); + // ファイルアイコン表示対応 +// AddListView(hWnd, -1, Pos->File, Pos->Node, Pos->Size, &Pos->Time, Pos->Attr, Pos->Owner, Pos->Link, Pos->InfoExist); + AddListView(hWnd, -1, Pos->File, Pos->Node, Pos->Size, &Pos->Time, Pos->Attr, Pos->Owner, Pos->Link, Pos->InfoExist, Pos->ImageId); Pos = Pos->Next; } @@ -1584,7 +1717,9 @@ static void DispFileList2View(HWND hWnd, FLISTANCHOR *Anchor) * なし *----------------------------------------------------------------------------*/ -static void AddListView(HWND hWnd, int Pos, char *Name, int Type, LONGLONG Size, FILETIME *Time, int Attr, char *Owner, int Link, int InfoExist) +// ファイルアイコン表示対応 +//static void AddListView(HWND hWnd, int Pos, char *Name, int Type, LONGLONG Size, FILETIME *Time, int Attr, char *Owner, int Link, int InfoExist) +static void AddListView(HWND hWnd, int Pos, char *Name, int Type, LONGLONG Size, FILETIME *Time, int Attr, char *Owner, int Link, int InfoExist, int ImageId) { LV_ITEM LvItem; char Tmp[20]; @@ -1592,6 +1727,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; @@ -1603,6 +1740,9 @@ static void AddListView(HWND hWnd, int Pos, char *Name, int Type, LONGLONG Size, LvItem.iImage = Type; else LvItem.iImage = 4; + // ファイルアイコン表示対応 + if(AskDispFileIcon() == YES && hWnd == GetLocalHwnd()) + LvItem.iImage = ImageId + 5; LvItem.iItem = SendMessage(hWnd, LVM_INSERTITEM, 0, (LPARAM)&LvItem); /* 日付/時刻 */ @@ -1632,6 +1772,12 @@ static void AddListView(HWND hWnd, int Pos, char *Name, int Type, LONGLONG Size, LvItem.mask = LVIF_TEXT; LvItem.iItem = Pos; LvItem.iSubItem = 3; +#if defined(HAVE_TANDEM) + if (AskHostType() == HTYPE_TANDEM) { + _itoa_s(Attr, Tmp, sizeof(Tmp), 10); + LvItem.pszText = Tmp; + } else +#endif LvItem.pszText = GetFileExt(Name); LvItem.iItem = SendMessage(hWnd, LVM_SETITEM, 0, (LPARAM)&LvItem); @@ -1639,7 +1785,11 @@ static void AddListView(HWND hWnd, int Pos, char *Name, int Type, LONGLONG Size, { /* 属性 */ strcpy(Tmp, ""); +#if defined(HAVE_TANDEM) + if((InfoExist & FINFO_ATTR) && (AskHostType() != HTYPE_TANDEM)) +#else if(InfoExist & FINFO_ATTR) +#endif AttrValue2String(Attr, Tmp); LvItem.mask = LVIF_TEXT; LvItem.iItem = Pos; @@ -1701,6 +1851,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()) @@ -1820,7 +1972,9 @@ void SelectFileInList(HWND hWnd, int Type) * BOOL TRUE/FALSE *----------------------------------------------------------------------------*/ -static BOOL CALLBACK SelectDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam) +// 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) { switch (iMessage) { @@ -1879,6 +2033,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()) @@ -2160,6 +2316,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)); @@ -2187,6 +2345,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; @@ -2220,6 +2380,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; @@ -2254,6 +2416,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; @@ -2262,6 +2426,13 @@ int GetNodeSize(int Win, int Pos, LONGLONG *Buf) SendMessage(hWnd, LVM_GETITEM, 0, (LPARAM)&LvItem); *Buf = -1; Ret = NO; +#if defined(HAVE_TANDEM) + if(AskHostType() == HTYPE_TANDEM) { + RemoveComma(Tmp); + *Buf = _atoi64(Tmp); + Ret = YES; + } else +#endif if(strlen(Tmp) > 0) { RemoveComma(Tmp); @@ -2294,14 +2465,26 @@ 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) + if(AskHostType() == HTYPE_TANDEM) + LvItem.iSubItem = 3; + else +#endif LvItem.iSubItem = 4; LvItem.pszText = Tmp; LvItem.cchTextMax = 20; SendMessage(GetRemoteHwnd(), LVM_GETITEM, 0, (LPARAM)&LvItem); if(strlen(Tmp) > 0) { +#if defined(HAVE_TANDEM) + if(AskHostType() == HTYPE_TANDEM) + *Buf = atoi(Tmp); + else +#endif *Buf = AttrString2Value(Tmp); Ret = YES; } @@ -2331,6 +2514,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; @@ -2368,6 +2553,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; @@ -2467,6 +2654,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) @@ -2503,6 +2693,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, '\\', '/'); @@ -2600,14 +2793,26 @@ 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)); memset(&Pkt.Time, 0, sizeof(FILETIME)); +#if defined(HAVE_TANDEM) + /* Guardian スペースへのアップロードのためにサイズが必要 */ + Pkt.Size = 0; + Pkt.InfoExist = 0; +#endif if((fHnd = FindFirstFile(Name, &Find)) != INVALID_HANDLE_VALUE) { FindClose(fHnd); Pkt.Time = Find.ftLastWriteTime; +#if defined(HAVE_TANDEM) + Pkt.Size = MakeLongLong(Find.nFileSizeHigh, Find.nFileSizeLow); + Pkt.InfoExist |= (FINFO_TIME | FINFO_DATE | FINFO_SIZE); +#endif } AddFileList(&Pkt, Base); } @@ -2621,6 +2826,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); @@ -2740,6 +2948,9 @@ static void MakeRemoteTree2(char *Path, char *Cur, FILELIST **Base, int *CancelC { if(Pos->Node == NODE_DIR) { + // 変数が未初期化のバグ修正 + memset(&Pkt, 0, sizeof(FILELIST)); + /* まずディレクトリ名をセット */ strcpy(Pkt.File, Pos->File); Pkt.Node = NODE_DIR; @@ -2830,6 +3041,9 @@ void AddRemoteTreeToFileList(int Num, char *Path, int IncDir, FILELIST **Base) { if(IncDir == RDIR_NLST) { + // 変数が未初期化のバグ修正 + memset(&Pkt, 0, sizeof(FILELIST)); + strcpy(Pkt.File, Dir); Pkt.Node = NODE_DIR; Pkt.Size = 0; @@ -2848,6 +3062,9 @@ void AddRemoteTreeToFileList(int Num, char *Path, int IncDir, FILELIST **Base) 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); @@ -3015,6 +3232,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); @@ -3043,6 +3263,9 @@ static void MakeLocalTree(char *Path, FILELIST **Base) (strcmp(FindBuf.cFileName, ".") != 0) && (strcmp(FindBuf.cFileName, "..") != 0)) { + // 変数が未初期化のバグ修正 + memset(&Pkt, 0, sizeof(FILELIST)); + strcpy(Src, Path); SetYenTail(Src); strcat(Src, FindBuf.cFileName); @@ -3320,6 +3543,21 @@ static int AnalizeFileInfo(char *Str) } } + // linux-ftpd + if((Ret == LIST_UNKNOWN) && + (FindField(Str, Tmp, 7+Add1, NO) == FFFTP_SUCCESS)) + { + if((FindField(Str, Tmp, 5, NO) == FFFTP_SUCCESS) && + (CheckYYYYMMDDformat(Tmp, NUL) != 0)) + { + if((FindField(Str, Tmp, 6, NO) == FFFTP_SUCCESS) && + (CheckHHMMformat(Tmp) == YES)) + { + Ret = LIST_UNIX_16; + } + } + } + if((Ret != LIST_UNKNOWN) && (Flag1 == YES)) Ret |= LIST_MELCOM; } @@ -3623,6 +3861,20 @@ static int AnalizeFileInfo(char *Str) } } } +#if defined(HAVE_TANDEM) + /* 以下のフォーマットをチェック */ + /* LIST_TANDEM */ + + /* OSS の場合は自動判別可能のため Ret == LIST_UNKNOWN のチェックは後 */ + if(AskRealHostType() == HTYPE_TANDEM) { + if(Ret == LIST_UNKNOWN) { + SetOSS(NO); + Ret = LIST_TANDEM; + } else { + SetOSS(YES); + } + } +#endif // MLSD対応 if(Ret == LIST_UNKNOWN) @@ -3954,6 +4206,8 @@ static int ResolvFileInfo(char *Str, int ListType, char *Fname, LONGLONG *Size, /* まずクリアしておく */ Ret = NODE_NONE; + // バグ対策 + memset(Fname, NUL, FMAX_PATH+1); *Size = -1; *Attr = 0; *Link = NO; @@ -4629,6 +4883,142 @@ static int ResolvFileInfo(char *Str, int ListType, char *Fname, LONGLONG *Size, } break; +#if defined(HAVE_TANDEM) + case LIST_TANDEM : + *InfoExist |= (FINFO_TIME | FINFO_DATE | FINFO_SIZE | FINFO_ATTR); + /* Open 中だったらずらす */ + if(FindField(Str, Buf, 1, NO) != FFFTP_SUCCESS) + break; + if (!strncmp(Buf, "O", 1)) { + offs = 1; + } + /* 日付 */ + if(FindField(Str, Buf, 3 + offs, NO) != FFFTP_SUCCESS) + break; + if (Buf[1] == '-') { /* 日付が 1桁 */ + sTime.wYear = Assume1900or2000(atoi(Buf + 6)); + Buf[5] = 0; + GetMonth(Buf+2, &sTime.wMonth, &sTime.wDay); /* wDayは常に0 */ + sTime.wDay = atoi(Buf); + sTime.wDayOfWeek = 0; + } else { + sTime.wYear = Assume1900or2000(atoi(Buf + 7)); + Buf[6] = 0; + GetMonth(Buf+3, &sTime.wMonth, &sTime.wDay); /* wDayは常に0 */ + sTime.wDay = atoi(Buf); + sTime.wDayOfWeek = 0; + } + /* 時刻 */ + FindField(Str, Buf, 4 + offs, NO); + sTime.wHour = atoi(Buf); + sTime.wMinute = atoi(Buf+3); + sTime.wSecond = atoi(Buf+6); + sTime.wMilliseconds = 0; + SystemTimeToFileTime(&sTime, Time); + SpecificLocalFileTime2FileTime(Time, AskHostTimeZone()); + + /* 属性 セキュリティではなく FileCode を保存する */ + FindField(Str, Buf, 1 + offs, NO); + *Attr = atoi(Buf); + /* サイズ */ + FindField(Str, Buf, 2 + offs, NO); + *Size = _atoi64(Buf); + /* オーナ名 */ + if(FindField(Str, Buf, 5 + offs, NO) == FFFTP_SUCCESS) { + if(strncmp(Buf, "Owner", sizeof("Owner"))) { + memset(Owner, NUL, OWNER_NAME_LEN+1); + strncpy(Owner, Buf, OWNER_NAME_LEN); + /* 通常は 255,255 だが、20, 33 などにも対応する */ + /* 最後の文字が , だったら後ろとつなげる */ + if (Buf[strlen(Buf)-1] == ',') { + FindField(Str, Buf, 6 + offs, NO); + strncat(Owner, Buf, OWNER_NAME_LEN - strlen(Buf)); + } + /* ファイル名 */ + if(FindField(Str, Fname, 0, NO) == FFFTP_SUCCESS) { + Ret = NODE_FILE; + } + } + } + break; +#endif + + // MLSD対応 + // 以下の形式に対応 + // fact1=value1;fact2=value2;fact3=value3; filename\r\n + // 不完全な実装のホストが存在するため以下の形式も許容 + // fact1=value1;fact2=value2;fact3=value3 filename\r\n + // fact1=value1;fact2=value2;fact3=value3;filename\r\n + case LIST_MLSD: + { + int i = 0; + char StrBuf[(FMAX_PATH * 2) + 1]; + char Fact[FMAX_PATH + 1]; + char Name[FMAX_PATH + 1]; + char Value[FMAX_PATH + 1]; + char* pFileName; + strncpy(StrBuf, Str, FMAX_PATH * 2); + StrBuf[FMAX_PATH * 2] = '\0'; + if((pFileName = strstr(StrBuf, "; ")) != NULL) + { + *pFileName = '\0'; + pFileName += 2; + } + else if((pFileName = strchr(StrBuf, ' ')) != NULL) + { + *pFileName = '\0'; + pFileName++; + } + else if((pFileName = strrchr(StrBuf, ';')) != NULL) + { + *pFileName = '\0'; + pFileName++; + } + if(pFileName != NULL) + strcpy(Fname, pFileName); + while(FindField2(StrBuf, Fact, ';', i, NO) == FFFTP_SUCCESS) + { + if(FindField2(Fact, Name, '=', 0, NO) == FFFTP_SUCCESS && FindField2(Fact, Value, '=', 1, NO) == FFFTP_SUCCESS) + { + if(_stricmp(Name, "type") == 0) + { + if(_stricmp(Value, "dir") == 0) + Ret = NODE_DIR; + else if(_stricmp(Value, "file") == 0) + Ret = NODE_FILE; + } + else if(_stricmp(Name, "size") == 0) + { + *Size = _atoi64(Value); + *InfoExist |= FINFO_SIZE; + } + else if(_stricmp(Name, "modify") == 0) + { + sTime.wYear = atoi_n(Value, 4); + sTime.wMonth = atoi_n(Value + 4, 2); + sTime.wDay = atoi_n(Value + 6, 2); + sTime.wHour = atoi_n(Value + 8, 2); + sTime.wMinute = atoi_n(Value + 10, 2); + sTime.wSecond = atoi_n(Value + 12, 2); + sTime.wMilliseconds = 0; + SystemTimeToFileTime(&sTime, Time); + // 時刻はGMT +// SpecificLocalFileTime2FileTime(Time, AskHostTimeZone()); + *InfoExist |= FINFO_DATE | FINFO_TIME; + } + else if(_stricmp(Name, "UNIX.mode") == 0) + { + *Attr = strtol(Value, NULL, 16); + *InfoExist |= FINFO_ATTR; + } + else if(_stricmp(Name, "UNIX.owner") == 0) + strcpy(Owner, Value); + } + i++; + } + } + break; + case LIST_UNIX_10 : case LIST_UNIX_11 : case LIST_UNIX_12 : @@ -4658,6 +5048,8 @@ static int ResolvFileInfo(char *Str, int ListType, char *Fname, LONGLONG *Size, case LIST_UNIX_75 : // MELCOMはビットフラグになっている // case LIST_MELCOM : + // linux-ftpd + case LIST_UNIX_16 : default: /* offsはサイズの位置, offs=0はカラム4 */ offs = 0; @@ -4692,6 +5084,16 @@ static int ResolvFileInfo(char *Str, int ListType, char *Fname, LONGLONG *Size, /* offs2は時間(もしくは年)の位置 */ offs2 = 0; + // linux-ftpd +// if((ListType == LIST_UNIX_11) || +// (ListType == LIST_UNIX_13) || +// (ListType == LIST_UNIX_21) || +// (ListType == LIST_UNIX_23) || +// (ListType == LIST_UNIX_51) || +// (ListType == LIST_UNIX_61) || +// (ListType == LIST_UNIX_63) || +// (ListType == LIST_UNIX_71) || +// (ListType == LIST_UNIX_73)) if((ListType == LIST_UNIX_11) || (ListType == LIST_UNIX_13) || (ListType == LIST_UNIX_21) || @@ -4700,7 +5102,8 @@ static int ResolvFileInfo(char *Str, int ListType, char *Fname, LONGLONG *Size, (ListType == LIST_UNIX_61) || (ListType == LIST_UNIX_63) || (ListType == LIST_UNIX_71) || - (ListType == LIST_UNIX_73)) + (ListType == LIST_UNIX_73) || + (ListType == LIST_UNIX_16)) offs2 = -1; /* offs3はオーナ名の位置 */ @@ -4778,6 +5181,16 @@ static int ResolvFileInfo(char *Str, int ListType, char *Fname, LONGLONG *Size, if(GetHourAndMinute(Buf, &sTime.wHour, &sTime.wMinute) == FFFTP_SUCCESS) *InfoExist |= FINFO_TIME; } + // linux-ftpd + else if(CheckYYYYMMDDformat(Buf, NUL) != 0) + { + sTime.wYear = atoi(Buf); + sTime.wMonth = atoi(Buf+5); + sTime.wDay = atoi(Buf+8); + FindField(Str, Buf, 7+offs+offs2, NO); + if(GetHourAndMinute(Buf, &sTime.wHour, &sTime.wMinute) == FFFTP_SUCCESS) + *InfoExist |= FINFO_TIME; + } else { GetMonth(Buf, &sTime.wMonth, &sTime.wDay); @@ -4871,56 +5284,6 @@ static int ResolvFileInfo(char *Str, int ListType, char *Fname, LONGLONG *Size, Ret = NODE_NONE; } break; - - // MLSD対応 - case LIST_MLSD: - { - int i = 0; - char Tmp[FMAX_PATH + 1]; - char Name[FMAX_PATH + 1]; - char Value[FMAX_PATH + 1]; - while(FindField2(Str, Tmp, ';', i, NO) == FFFTP_SUCCESS) - { - if(i >= 1 && strncmp(Tmp, " ", 1) == 0) - strcpy(Fname, strstr(Str, "; ") + 2); - else if(FindField2(Tmp, Name, '=', 0, NO) == FFFTP_SUCCESS && FindField2(Tmp, Value, '=', 1, NO) == FFFTP_SUCCESS) - { - if(_stricmp(Name, "type") == 0) - { - if(_stricmp(Value, "dir") == 0) - Ret = NODE_DIR; - else if(_stricmp(Value, "file") == 0) - Ret = NODE_FILE; - } - else if(_stricmp(Name, "size") == 0) - { - *Size = _atoi64(Value); - *InfoExist |= FINFO_SIZE; - } - else if(_stricmp(Name, "modify") == 0) - { - sTime.wYear = atoi_n(Value, 4); - sTime.wMonth = atoi_n(Value + 4, 2); - sTime.wDay = atoi_n(Value + 6, 2); - sTime.wHour = atoi_n(Value + 8, 2); - sTime.wMinute = atoi_n(Value + 10, 2); - sTime.wSecond = atoi_n(Value + 12, 2); - SystemTimeToFileTime(&sTime, Time); -// SpecificLocalFileTime2FileTime(Time, AskHostTimeZone()); - *InfoExist |= FINFO_DATE | FINFO_TIME; - } - else if(_stricmp(Name, "UNIX.mode") == 0) - { - *Attr = strtol(Value, NULL, 16); - *InfoExist |= FINFO_ATTR; - } - else if(_stricmp(Name, "UNIX.owner") == 0) - strcpy(Owner, Value); - } - i++; - } - } - break; } // UTF-8対応 @@ -5436,7 +5799,9 @@ void SetFilter(int *CancelCheckWork) * BOOL TRUE/FALSE *----------------------------------------------------------------------------*/ -static BOOL CALLBACK FilterWndProc(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam) +// 64ビット対応 +//static BOOL CALLBACK FilterWndProc(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam) +static INT_PTR CALLBACK FilterWndProc(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam) { switch (iMessage) {