X-Git-Url: http://git.sourceforge.jp/view?p=ffftp%2Fffftp.git;a=blobdiff_plain;f=filelist.c;h=74d14bb663539a15de9e236eeab0cc3417af2952;hp=a55cb5583061e8b4bb9319503be7942b52e22964;hb=31ed1ad41a53d5c866a263d6a6d115990677a926;hpb=28c3554bd94b9b4f6dcc78175755e8fd24f8e237 diff --git a/filelist.c b/filelist.c index a55cb55..74d14bb 100644 --- a/filelist.c +++ b/filelist.c @@ -124,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; @@ -147,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; @@ -181,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, @@ -493,6 +500,11 @@ static void doTransferRemoteFile(void) remove(fn); } + // 同時接続対応 + DisableUserOpe(); + // 外部アプリケーションへドロップ後にローカル側のファイル一覧に作業フォルダが表示されるバグ対策 + SuppressRefresh = 1; + // ダウンロード先をテンポラリに設定 SetLocalDirHist(TmpDir); @@ -524,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); @@ -786,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); @@ -793,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) { @@ -818,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); @@ -1117,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; @@ -1334,22 +1361,22 @@ void RefreshIconImageList(FLISTANCHOR *Anchor) int i; char Cur[FMAX_PATH+1]; SHFILEINFO FileInfo; - 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(ListImg); - ListImg = ImageList_Create(16, 16, ILC_MASK | ILC_COLOR24, 0, 1); - hBitmap = LoadBitmap(GetFtpInst(), MAKEINTRESOURCE(dirattr_bmp)); - ImageList_AddMasked(ListImg, hBitmap, RGB(255,0,0)); - DeleteObject(hBitmap); - ImageId = 0; - Pos = Anchor->Top; - for(i = 0; i < Anchor->Files; i++) + if(AskDispFileIcon() == YES) { - Pos->ImageId = -1; - 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 @@ -1360,20 +1387,27 @@ void RefreshIconImageList(FLISTANCHOR *Anchor) } if(SHGetFileInfoM(Cur, 0, &FileInfo, sizeof(SHFILEINFO), SHGFI_SMALLICON | SHGFI_ICON) != 0) { - if(ImageList_AddIcon(ListImg, FileInfo.hIcon) >= 0) + if(ImageList_AddIcon(ListImgFileIcon, FileInfo.hIcon) >= 0) { Pos->ImageId = ImageId; ImageId++; } DestroyIcon(FileInfo.hIcon); } + Pos = Pos->Next; } - 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); } - 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) @@ -1428,7 +1462,7 @@ void GetLocalDirForWnd(void) if(DispDrives) { GetLogicalDriveStrings(FMAX_PATH, Scan); - NoDrives = LoadHideDriveListRegistory(); + NoDrives = LoadHideDriveListRegistry(); Pos = Scan; while(*Pos != NUL) @@ -1510,20 +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)) || + // 読みにくいのでリファクタリング +// 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)) { @@ -1677,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; @@ -1689,8 +1741,8 @@ static void AddListView(HWND hWnd, int Pos, char *Name, int Type, LONGLONG Size, else LvItem.iImage = 4; // ファイルアイコン表示対応 - if(hWnd == GetLocalHwnd() && ImageId >= 0) - LvItem.iImage = 5 + ImageId; + if(AskDispFileIcon() == YES && hWnd == GetLocalHwnd()) + LvItem.iImage = ImageId + 5; LvItem.iItem = SendMessage(hWnd, LVM_INSERTITEM, 0, (LPARAM)&LvItem); /* 日付/時刻 */ @@ -1799,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()) @@ -1979,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()) @@ -2260,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)); @@ -2287,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; @@ -2320,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; @@ -2354,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; @@ -2401,6 +2465,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) @@ -2448,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; @@ -2485,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; @@ -2584,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) @@ -2620,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, '\\', '/'); @@ -2717,6 +2793,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)); @@ -2747,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); @@ -2866,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; @@ -2956,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; @@ -2974,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); @@ -3141,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); @@ -3169,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); @@ -4905,6 +5002,7 @@ static int ResolvFileInfo(char *Str, int ListType, char *Fname, LONGLONG *Size, sTime.wSecond = atoi_n(Value + 12, 2); sTime.wMilliseconds = 0; SystemTimeToFileTime(&sTime, Time); + // 時刻はGMT // SpecificLocalFileTime2FileTime(Time, AskHostTimeZone()); *InfoExist |= FINFO_DATE | FINFO_TIME; }