OSDN Git Service

Add routines for automatic update of the local view.
authors_kawamoto <s_kawamoto@users.sourceforge.jp>
Fri, 15 Jun 2012 09:14:47 +0000 (18:14 +0900)
committers_kawamoto <s_kawamoto@users.sourceforge.jp>
Fri, 15 Jun 2012 09:14:47 +0000 (18:14 +0900)
FFFTP_Eng_Release/FFFTP.exe
Release/FFFTP.exe
common.h
filelist.c
main.c
mbswrapper.c
mbswrapper.h

index 0e8cb86..61c3414 100644 (file)
Binary files a/FFFTP_Eng_Release/FFFTP.exe and b/FFFTP_Eng_Release/FFFTP.exe differ
index ed42f7a..641ecf6 100644 (file)
Binary files a/Release/FFFTP.exe and b/Release/FFFTP.exe differ
index 2bf2d55..99e68fb 100644 (file)
--- a/common.h
+++ b/common.h
 \r
 #define SELECT_ALL             0               /* 全選択 */\r
 #define SELECT_REGEXP  1               /* 検索式を入力して選択 */\r
+// ローカル側自動更新\r
+#define SELECT_LIST            2               /* リストに含まれるファイルを選択 */\r
 \r
 /*===== 検索方法 =====*/\r
 \r
@@ -1352,7 +1354,9 @@ void SetListViewType(void);
 void GetRemoteDirForWnd(int Mode, int *CancelCheckWork);\r
 void GetLocalDirForWnd(void);\r
 void ReSortDispList(int Win, int *CancelCheckWork);\r
-void SelectFileInList(HWND hWnd, int Type);\r
+// ローカル側自動更新\r
+//void SelectFileInList(HWND hWnd, int Type);\r
+void SelectFileInList(HWND hWnd, int Type, FILELIST *Base);\r
 void FindFileInList(HWND hWnd, int Type);\r
 // void WildCard2RegExp(char *Str);\r
 int GetCurrentItem(int Win);\r
index 74d14bb..78bcb12 100644 (file)
@@ -126,6 +126,8 @@ extern char FilterStr[FILTER_EXT_LEN+1];
 extern HWND hHelpWin;\r
 // 外部アプリケーションへドロップ後にローカル側のファイル一覧に作業フォルダが表示されるバグ対策\r
 extern int SuppressRefresh;\r
+// ローカル側自動更新\r
+extern HANDLE ChangeNotification;\r
 \r
 /* 設定値 */\r
 extern int LocalWidth;\r
@@ -1385,7 +1387,7 @@ void RefreshIconImageList(FLISTANCHOR *Anchor)
                                SetYenTail(Cur);\r
                                strcat(Cur, Pos->File);\r
                        }\r
-                       if(SHGetFileInfoM(Cur, 0, &FileInfo, sizeof(SHFILEINFO), SHGFI_SMALLICON | SHGFI_ICON) != 0)\r
+                       if(SHGetFileInfo(Cur, 0, &FileInfo, sizeof(SHFILEINFO), SHGFI_SMALLICON | SHGFI_ICON) != 0)\r
                        {\r
                                if(ImageList_AddIcon(ListImgFileIcon, FileInfo.hIcon) >= 0)\r
                                {\r
@@ -1429,6 +1431,11 @@ void GetLocalDirForWnd(void)
        SetLocalDirHist(Scan);\r
        DispLocalFreeSpace(Scan);\r
 \r
+       // ローカル側自動更新\r
+       if(ChangeNotification != INVALID_HANDLE_VALUE)\r
+               FindCloseChangeNotification(ChangeNotification);\r
+       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);\r
+\r
        /* ディレクトリ/ファイル */\r
 \r
        SetYenTail(Scan);\r
@@ -1583,20 +1590,36 @@ static void AddDispFileList(FLISTANCHOR *Anchor, char *Name, FILETIME *Time, LON
                        }\r
                        else\r
                        {\r
+                               // 読みにくいのでリファクタリング\r
+//                             if((((Sort & SORT_MASK_ORD) == SORT_EXT) &&\r
+//                                     ((Cmp = _mbsicmp(GetFileExt(Name), GetFileExt(Pos->File))) > 0)) ||\r
+//#if defined(HAVE_TANDEM)\r
+//                                ((AskHostType() == HTYPE_TANDEM) &&\r
+//                                 ((Sort & SORT_MASK_ORD) == SORT_EXT) &&\r
+//                                     ((Cmp = Attr - Pos->Attr) > 0)) ||\r
+//#endif\r
+//                                (((Sort & SORT_MASK_ORD) == SORT_SIZE) &&\r
+//                                     ((Cmp = Size - Pos->Size) > 0)) ||\r
+//                                (((Sort & SORT_MASK_ORD) == SORT_DATE) &&\r
+//                                     ((Cmp = CompareFileTime(Time, &Pos->Time)) > 0)))\r
+//                             {\r
+//                                     break;\r
+//                             }\r
                                if((((Sort & SORT_MASK_ORD) == SORT_EXT) &&\r
-                                       ((Cmp = _mbsicmp(GetFileExt(Name), GetFileExt(Pos->File))) > 0)) ||\r
+                                       ((Cmp = _mbsicmp(GetFileExt(Name), GetFileExt(Pos->File))) > 0)))\r
+                                       break;\r
 #if defined(HAVE_TANDEM)\r
-                                  ((AskHostType() == HTYPE_TANDEM) &&\r
+                               if(((AskHostType() == HTYPE_TANDEM) &&\r
                                    ((Sort & SORT_MASK_ORD) == SORT_EXT) &&\r
-                                       ((Cmp = Attr - Pos->Attr) > 0)) ||\r
+                                       ((Cmp = Attr - Pos->Attr) > 0)))\r
+                                       break;\r
 #endif\r
-                                  (((Sort & SORT_MASK_ORD) == SORT_SIZE) &&\r
-                                       ((Cmp = Size - Pos->Size) > 0)) ||\r
-                                  (((Sort & SORT_MASK_ORD) == SORT_DATE) &&\r
-                                       ((Cmp = CompareFileTime(Time, &Pos->Time)) > 0)))\r
-                               {\r
+                               if(((Sort & SORT_MASK_ORD) == SORT_SIZE) &&\r
+                                       ((Cmp = Size - Pos->Size) > 0))\r
+                                       break;\r
+                               if(((Sort & SORT_MASK_ORD) == SORT_DATE) &&\r
+                                       ((Cmp = CompareFileTime(Time, &Pos->Time)) > 0))\r
                                        break;\r
-                               }\r
 \r
                                if(((Sort & SORT_MASK_ORD) == SORT_NAME) || (Cmp == 0))\r
                                {\r
@@ -1837,7 +1860,9 @@ void ReSortDispList(int Win, int *CancelCheckWork)
 *              なし\r
 *----------------------------------------------------------------------------*/\r
 \r
-void SelectFileInList(HWND hWnd, int Type)\r
+// ローカル側自動更新\r
+//void SelectFileInList(HWND hWnd, int Type)\r
+void SelectFileInList(HWND hWnd, int Type, FILELIST *Base)\r
 {\r
        int Win;\r
        int WinDst;\r
@@ -1955,6 +1980,22 @@ void SelectFileInList(HWND hWnd, int Type)
                                }\r
                        }\r
                        break;\r
+\r
+               // ローカル側自動更新\r
+               case SELECT_LIST :\r
+                       for(i = 0; i < Num; i++)\r
+                       {\r
+                               LvItem.state = 0;\r
+                               GetNodeName(Win, i, Name, FMAX_PATH);\r
+                               if(SearchFileList(Name, Base, COMP_STRICT) != NULL)\r
+                                       LvItem.state = LVIS_SELECTED;\r
+                               LvItem.mask = LVIF_STATE;\r
+                               LvItem.iItem = i;\r
+                               LvItem.stateMask = LVIS_SELECTED;\r
+                               LvItem.iSubItem = 0;\r
+                               SendMessage(hWnd, LVM_SETITEMSTATE, i, (LPARAM)&LvItem);\r
+                       }\r
+                       break;\r
        }\r
        return;\r
 }\r
diff --git a/main.c b/main.c
index bee2108..60ef005 100644 (file)
--- a/main.c
+++ b/main.c
@@ -140,7 +140,9 @@ static char SSLRootCAFilePath[FMAX_PATH+1];
 static DWORD MainThreadId;\r
 // ポータブル版判定\r
 static char PortableFilePath[FMAX_PATH+1];\r
-int PortableVersion;\r
+static int PortableVersion;\r
+// ローカル側自動更新\r
+HANDLE ChangeNotification = INVALID_HANDLE_VALUE;\r
 \r
 \r
 /*===== グローバルなワーク =====*/\r
@@ -901,10 +903,34 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA
 \r
        switch (message)\r
        {\r
+               // ローカル側自動更新\r
+               case WM_CREATE :\r
+                       SetTimer(hWnd, 1, 1000, NULL);\r
+                       break;\r
+\r
+               // ローカル側自動更新\r
                // 自動切断対策\r
                case WM_TIMER :\r
-                       if(wParam == 1)\r
+                       switch(wParam)\r
+                       {\r
+                       case 1:\r
+                               if(WaitForSingleObject(ChangeNotification, 0) == WAIT_OBJECT_0)\r
+                               {\r
+                                       if(AskUserOpeDisabled() == NO)\r
+                                       {\r
+                                               FILELIST* Base;\r
+                                               FindNextChangeNotification(ChangeNotification);\r
+                                               Base = NULL;\r
+                                               MakeSelectedFileList(WIN_LOCAL, NO, NO, &Base, &CancelFlg);\r
+                                               GetLocalDirForWnd();\r
+                                               SelectFileInList(GetLocalHwnd(), SELECT_LIST, Base);\r
+                                       }\r
+                               }\r
+                               break;\r
+                       case 2:\r
                                NoopProc();\r
+                               break;\r
+                       }\r
                        break;\r
 \r
                case WM_COMMAND :\r
@@ -916,20 +942,20 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA
                        {\r
                                case MENU_CONNECT :\r
                                        // 自動切断対策\r
-                                       KillTimer(hWnd, 1);\r
+                                       KillTimer(hWnd, 2);\r
                                        ConnectProc(DLG_TYPE_CON, -1);\r
                                        // 自動切断対策\r
                                        if(AskNoopInterval() > 0)\r
-                                               SetTimer(hWnd, 1, AskNoopInterval() * 1000, NULL);\r
+                                               SetTimer(hWnd, 2, AskNoopInterval() * 1000, NULL);\r
                                        break;\r
 \r
                                case MENU_CONNECT_NUM :\r
                                        // 自動切断対策\r
-                                       KillTimer(hWnd, 1);\r
+                                       KillTimer(hWnd, 2);\r
                                        ConnectProc(DLG_TYPE_CON, (int)lParam);\r
                                        // 自動切断対策\r
                                        if(AskNoopInterval() > 0)\r
-                                               SetTimer(hWnd, 1, AskNoopInterval() * 1000, NULL);\r
+                                               SetTimer(hWnd, 2, AskNoopInterval() * 1000, NULL);\r
                                        if(AskConnecting() == YES)\r
                                        {\r
                                                if(HIWORD(wParam) & OPT_MIRROR)\r
@@ -951,20 +977,20 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA
 \r
                                case MENU_SET_CONNECT :\r
                                        // 自動切断対策\r
-                                       KillTimer(hWnd, 1);\r
+                                       KillTimer(hWnd, 2);\r
                                        ConnectProc(DLG_TYPE_SET, -1);\r
                                        // 自動切断対策\r
                                        if(AskNoopInterval() > 0)\r
-                                               SetTimer(hWnd, 1, AskNoopInterval() * 1000, NULL);\r
+                                               SetTimer(hWnd, 2, AskNoopInterval() * 1000, NULL);\r
                                        break;\r
 \r
                                case MENU_QUICK :\r
                                        // 自動切断対策\r
-                                       KillTimer(hWnd, 1);\r
+                                       KillTimer(hWnd, 2);\r
                                        QuickConnectProc();\r
                                        // 自動切断対策\r
                                        if(AskNoopInterval() > 0)\r
-                                               SetTimer(hWnd, 1, AskNoopInterval() * 1000, NULL);\r
+                                               SetTimer(hWnd, 2, AskNoopInterval() * 1000, NULL);\r
                                        break;\r
 \r
                                case MENU_DISCONNECT :\r
@@ -999,11 +1025,11 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA
                                case MENU_HIST_19 :\r
                                case MENU_HIST_20 :\r
                                        // 自動切断対策\r
-                                       KillTimer(hWnd, 1);\r
+                                       KillTimer(hWnd, 2);\r
                                        HistoryConnectProc(LOWORD(wParam));\r
                                        // 自動切断対策\r
                                        if(AskNoopInterval() > 0)\r
-                                               SetTimer(hWnd, 1, AskNoopInterval() * 1000, NULL);\r
+                                               SetTimer(hWnd, 2, AskNoopInterval() * 1000, NULL);\r
                                        break;\r
 \r
                                case MENU_UPDIR :\r
@@ -1314,6 +1340,9 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA
                                        break;\r
 \r
                                case REFRESH_LOCAL :\r
+                                       // デッドロック対策\r
+                                       if(AskUserOpeDisabled() == YES)\r
+                                               break;\r
                                        GetLocalDirForWnd();\r
                                        break;\r
 \r
@@ -1373,11 +1402,15 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA
                                        break;\r
 \r
                                case MENU_SELECT_ALL :\r
-                                       SelectFileInList(hWndCurFocus, SELECT_ALL);\r
+                                       // ローカル側自動更新\r
+//                                     SelectFileInList(hWndCurFocus, SELECT_ALL);\r
+                                       SelectFileInList(hWndCurFocus, SELECT_ALL, NULL);\r
                                        break;\r
 \r
                                case MENU_SELECT :\r
-                                       SelectFileInList(hWndCurFocus, SELECT_REGEXP);\r
+                                       // ローカル側自動更新\r
+//                                     SelectFileInList(hWndCurFocus, SELECT_REGEXP);\r
+                                       SelectFileInList(hWndCurFocus, SELECT_REGEXP, NULL);\r
                                        break;\r
 \r
                                case MENU_FIND :\r
@@ -1763,6 +1796,10 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA
                        break;\r
 \r
                case WM_DESTROY :\r
+                       // ローカル側自動更新\r
+                       KillTimer(hWnd, 1);\r
+                       if(ChangeNotification != INVALID_HANDLE_VALUE)\r
+                               FindCloseChangeNotification(ChangeNotification);\r
 //                     WSACleanup();\r
 //                     DestroyWindow(hWndFtp);\r
                        PostQuitMessage(0);\r
index a051543..4bc022c 100644 (file)
@@ -894,6 +894,18 @@ END_ROUTINE
        return r;\r
 }\r
 \r
+HANDLE FindFirstChangeNotificationM(LPCSTR lpPathName, BOOL bWatchSubtree, DWORD dwNotifyFilter)\r
+{\r
+       HANDLE r = INVALID_HANDLE_VALUE;\r
+       wchar_t* pw0 = NULL;\r
+START_ROUTINE\r
+       pw0 = DuplicateMtoW(lpPathName, -1);\r
+       r = FindFirstChangeNotificationW(pw0, bWatchSubtree, dwNotifyFilter);\r
+END_ROUTINE\r
+       FreeDuplicatedString(pw0);\r
+       return r;\r
+}\r
+\r
 DWORD GetLogicalDriveStringsM(DWORD nBufferLength, LPSTR lpBuffer)\r
 {\r
        DWORD r = 0;\r
index 0fa455f..14fe3a5 100644 (file)
@@ -29,6 +29,9 @@ HANDLE FindFirstFileM(LPCSTR lpFileName, LPWIN32_FIND_DATAA lpFindFileData);
 #undef FindNextFile\r
 #define FindNextFile FindNextFileM\r
 BOOL FindNextFileM(HANDLE hFindFile, LPWIN32_FIND_DATAA lpFindFileData);\r
+#undef FindFirstChangeNotification\r
+#define FindFirstChangeNotification FindFirstChangeNotificationM\r
+HANDLE FindFirstChangeNotificationM(LPCSTR lpPathName, BOOL bWatchSubtree, DWORD dwNotifyFilter);\r
 #undef GetLogicalDriveStrings\r
 #define GetLogicalDriveStrings GetLogicalDriveStringsM\r
 DWORD GetLogicalDriveStringsM(DWORD nBufferLength, LPSTR lpBuffer);\r