OSDN Git Service

Modify documents.
[ffftp/ffftp.git] / main.c
diff --git a/main.c b/main.c
index 22573d5..9706d52 100644 (file)
--- a/main.c
+++ b/main.c
@@ -35,6 +35,8 @@
 #include <stdlib.h>\r
 #include <string.h>\r
 #include <mbstring.h>\r
+// 自動切断対策\r
+#include <time.h>\r
 #include <malloc.h>\r
 #include <windowsx.h>\r
 #include <commctrl.h>\r
@@ -140,7 +142,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
@@ -162,8 +166,8 @@ int WinWidth = 790;
 int WinHeight = 513;\r
 int LocalWidth = 389;\r
 int TaskHeight = 100;\r
-int LocalTabWidth[4] = { 160, 110, 60, 37 };\r
-int RemoteTabWidth[6] = { 160, 110, 60, 37, 60, 60 };\r
+int LocalTabWidth[4] = { 150, 120, 60, 37 };\r
+int RemoteTabWidth[6] = { 150, 120, 60, 37, 60, 60 };\r
 char UserMailAdrs[USER_MAIL_LEN+1] = { "who@example.com" };\r
 char ViewerName[VIEWERS][FMAX_PATH+1] = { { "notepad" }, { "" }, { "" } };\r
 HFONT ListFont = NULL;\r
@@ -205,7 +209,7 @@ int FwallPort = PORT_NOR;
 int FwallType = 1;\r
 int FwallDefault = NO;\r
 int FwallSecurity = SECURITY_AUTO;\r
-int FwallResolv = NO;\r
+int FwallResolve = NO;\r
 int FwallLower = NO;\r
 int FwallDelimiter = '@';\r
 // ルータ対策\r
@@ -242,8 +246,25 @@ BYTE CertificateCacheHash[MAX_CERT_CACHE_HASH][20];
 BYTE SSLRootCAFileHash[20];\r
 // ファイルアイコン表示対応\r
 int DispFileIcon = NO;\r
+// タイムスタンプのバグ修正\r
+int DispTimeSeconds = NO;\r
+// ファイルの属性を数字で表示\r
+int DispPermissionsNumber = NO;\r
 // ディレクトリ自動作成\r
 int MakeAllDir = YES;\r
+// UTF-8対応\r
+int LocalKanjiCode = KANJI_SJIS;\r
+// 自動切断対策\r
+int NoopEnable = NO;\r
+// UPnP対応\r
+int UPnPEnabled = YES;\r
+time_t LastDataConnectionTime = 0;\r
+// 全設定暗号化対応\r
+int EncryptAllSettings = NO;\r
+// ローカル側自動更新\r
+int AutoRefreshFileList = YES;\r
+// 古い処理内容を消去\r
+int RemoveOldLog = NO;\r
 \r
 \r
 \r
@@ -347,6 +368,13 @@ int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLi
 \r
        InitCommonControls();\r
 \r
+       // UPnP対応\r
+       CoInitialize(NULL);\r
+       LoadUPnP();\r
+\r
+       // UTF-8対応\r
+       LoadUnicodeNormalizationDll();\r
+\r
        // FTPS対応\r
 #ifdef USE_OPENSSL\r
        LoadOpenSSL();\r
@@ -392,6 +420,9 @@ int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLi
 #endif\r
        // SFTP対応\r
        FreePuTTY();\r
+       // UPnP対応\r
+       FreeUPnP();\r
+       CoUninitialize();\r
        OleUninitialize();\r
        return(Ret);\r
 }\r
@@ -565,9 +596,8 @@ static int InitApp(LPSTR lpszCmdLine, int cmdShow)
                                DispTransferType();\r
                                SetHostKanaCnvImm(YES);\r
                                SetHostKanjiCodeImm(KANJI_NOCNV);\r
-                               // 本当はローカルのデフォルトをUTF-8にしたいが旧バージョンとの互換性のためShift_JISに設定\r
-//                             SetLocalKanjiCodeImm(KANJI_UTF8N);\r
-                               SetLocalKanjiCodeImm(KANJI_SJIS);\r
+                               // UTF-8対応\r
+                               SetLocalKanjiCodeImm(LocalKanjiCode);\r
                                DispListType();\r
                                DispDotFileMode();\r
                                DispSyncMoveMode();\r
@@ -583,7 +613,7 @@ static int InitApp(LPSTR lpszCmdLine, int cmdShow)
                                        DispWindowTitle();\r
                                        // SourceForge.JPによるフォーク\r
 //                                     SetTaskMsg("FFFTP Ver." VER_STR " Copyright(C) 1997-2010 Sota & cooperators.");\r
-                                       SetTaskMsg("FFFTP Ver." VER_STR " Copyright(C) 1997-2010 Sota & cooperators.\r\nCopyright (C) 2011-2012 FFFTP Project (Hiromichi Matsushima, Suguru Kawamoto, IWAMOTO Kouichi, vitamin0x, unarist, Asami, fortran90, tomo1192, Yuji Tanaka, Moriguchi Hirokazu).");\r
+                                       SetTaskMsg("FFFTP Ver." VER_STR " Copyright(C) 1997-2010 Sota & cooperators.\r\nCopyright (C) 2011-2014 FFFTP Project (Hiromichi Matsushima, Suguru Kawamoto, IWAMOTO Kouichi, vitamin0x, unarist, Asami, fortran90, tomo1192, Yuji Tanaka, Moriguchi Hirokazu, Fu-sen).");\r
 \r
                                        if(ForceIni)\r
                                                SetTaskMsg("%s%s", MSGJPN283, IniPath);\r
@@ -906,10 +936,46 @@ 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
-                               NoopProc();\r
+                       switch(wParam)\r
+                       {\r
+                       case 1:\r
+                               if(WaitForSingleObject(ChangeNotification, 0) == WAIT_OBJECT_0)\r
+                               {\r
+                                       if(AskUserOpeDisabled() == NO)\r
+                                       {\r
+                                               FindNextChangeNotification(ChangeNotification);\r
+                                               if(AutoRefreshFileList == YES)\r
+                                               {\r
+                                                       FILELIST* Base;\r
+                                                       char Name[FMAX_PATH+1];\r
+                                                       int Pos;\r
+                                                       Base = NULL;\r
+                                                       MakeSelectedFileList(WIN_LOCAL, NO, NO, &Base, &CancelFlg);\r
+                                                       GetHotSelected(WIN_LOCAL, Name);\r
+                                                       Pos = SendMessage(GetLocalHwnd(), LVM_GETTOPINDEX, 0, 0);\r
+                                                       GetLocalDirForWnd();\r
+                                                       SelectFileInList(GetLocalHwnd(), SELECT_LIST, Base);\r
+                                                       SetHotSelected(WIN_LOCAL, Name);\r
+                                                       SendMessage(GetLocalHwnd(), LVM_ENSUREVISIBLE, (WPARAM)(SendMessage(GetLocalHwnd(), LVM_GETITEMCOUNT, 0, 0) - 1), (LPARAM)TRUE);\r
+                                                       SendMessage(GetLocalHwnd(), LVM_ENSUREVISIBLE, (WPARAM)Pos, (LPARAM)TRUE);\r
+                                               }\r
+                                       }\r
+                               }\r
+                               if(NoopEnable == YES && AskNoopInterval() > 0 && time(NULL) - LastDataConnectionTime >= AskNoopInterval())\r
+                               {\r
+                                       NoopProc(NO);\r
+                                       LastDataConnectionTime = time(NULL);\r
+                               }\r
+                               break;\r
+                       }\r
                        break;\r
 \r
                case WM_COMMAND :\r
@@ -921,20 +987,18 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA
                        {\r
                                case MENU_CONNECT :\r
                                        // 自動切断対策\r
-                                       KillTimer(hWnd, 1);\r
+                                       NoopEnable = NO;\r
                                        ConnectProc(DLG_TYPE_CON, -1);\r
                                        // 自動切断対策\r
-                                       if(AskNoopInterval() > 0)\r
-                                               SetTimer(hWnd, 1, AskNoopInterval() * 1000, NULL);\r
+                                       NoopEnable = YES;\r
                                        break;\r
 \r
                                case MENU_CONNECT_NUM :\r
                                        // 自動切断対策\r
-                                       KillTimer(hWnd, 1);\r
+                                       NoopEnable = NO;\r
                                        ConnectProc(DLG_TYPE_CON, (int)lParam);\r
                                        // 自動切断対策\r
-                                       if(AskNoopInterval() > 0)\r
-                                               SetTimer(hWnd, 1, AskNoopInterval() * 1000, NULL);\r
+                                       NoopEnable = YES;\r
                                        if(AskConnecting() == YES)\r
                                        {\r
                                                if(HIWORD(wParam) & OPT_MIRROR)\r
@@ -956,20 +1020,18 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA
 \r
                                case MENU_SET_CONNECT :\r
                                        // 自動切断対策\r
-                                       KillTimer(hWnd, 1);\r
+                                       NoopEnable = NO;\r
                                        ConnectProc(DLG_TYPE_SET, -1);\r
                                        // 自動切断対策\r
-                                       if(AskNoopInterval() > 0)\r
-                                               SetTimer(hWnd, 1, AskNoopInterval() * 1000, NULL);\r
+                                       NoopEnable = YES;\r
                                        break;\r
 \r
                                case MENU_QUICK :\r
                                        // 自動切断対策\r
-                                       KillTimer(hWnd, 1);\r
+                                       NoopEnable = NO;\r
                                        QuickConnectProc();\r
                                        // 自動切断対策\r
-                                       if(AskNoopInterval() > 0)\r
-                                               SetTimer(hWnd, 1, AskNoopInterval() * 1000, NULL);\r
+                                       NoopEnable = YES;\r
                                        break;\r
 \r
                                case MENU_DISCONNECT :\r
@@ -1004,11 +1066,10 @@ 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
+                                       NoopEnable = NO;\r
                                        HistoryConnectProc(LOWORD(wParam));\r
                                        // 自動切断対策\r
-                                       if(AskNoopInterval() > 0)\r
-                                               SetTimer(hWnd, 1, AskNoopInterval() * 1000, NULL);\r
+                                       NoopEnable = YES;\r
                                        break;\r
 \r
                                case MENU_UPDIR :\r
@@ -1319,6 +1380,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
@@ -1378,11 +1442,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
@@ -1494,6 +1562,11 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA
                                        OtpCalcTool();\r
                                        break;\r
 \r
+                               // FTPS対応\r
+                               case MENU_FW_FTP_FILTER :\r
+                                       TurnStatefulFTPFilter();\r
+                                       break;\r
+\r
                                case MENU_URL_COPY :\r
                                        CopyURLtoClipBoard();\r
                                        break;\r
@@ -1768,6 +1841,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
@@ -3216,7 +3293,7 @@ BOOL LoadSSLRootCAFile()
                                for(i = 0; i < 5; i++)\r
                                        Hash[i] = _byteswap_ulong(Hash[i]);\r
                                // 同梱する"ssl.pem"に合わせてSHA1ハッシュ値を変更すること\r
-                               if(memcmp(&Hash, &SSLRootCAFileHash, 20) == 0 || memcmp(&Hash, "\x45\xBF\x6E\x22\xC1\x7C\xEC\x8D\xAB\x3D\x13\x7F\x2B\x93\x1C\x79\x04\x5B\x07\x0C", 20) == 0\r
+                               if(memcmp(&Hash, &SSLRootCAFileHash, 20) == 0 || memcmp(&Hash, "\xD8\x8A\x7B\x2F\xBF\x23\x57\x16\xDA\x02\x14\x2B\xD4\x2E\x09\x80\xA0\x4C\x72\x62", 20) == 0\r
                                        || DialogBox(GetFtpInst(), MAKEINTRESOURCE(updatesslroot_dlg), GetMainHwnd(), ExeEscDialogProc) == YES)\r
                                {\r
                                        memcpy(&SSLRootCAFileHash, &Hash, 20);\r
@@ -3239,12 +3316,6 @@ BOOL IsMainThread()
        return TRUE;\r
 }\r
 \r
-// ファイルアイコン表示対応\r
-int AskDispFileIcon(void)\r
-{\r
-       return(DispFileIcon);\r
-}\r
-\r
 // ポータブル版判定\r
 void CheckPortableVersion()\r
 {\r
@@ -3263,3 +3334,32 @@ int AskPortableVersion(void)
        return(PortableVersion);\r
 }\r
 \r
+// 全設定暗号化対応\r
+int Restart()\r
+{\r
+       int Sts;\r
+       char* CommandLine;\r
+       STARTUPINFO si;\r
+       PROCESS_INFORMATION pi;\r
+       Sts = FFFTP_FAIL;\r
+       if(CommandLine = (char*)malloc(sizeof(char) * (strlen(GetCommandLine())  + 1)))\r
+       {\r
+               strcpy(CommandLine, GetCommandLine());\r
+               GetStartupInfo(&si);\r
+               if(CreateProcess(NULL, CommandLine, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))\r
+               {\r
+                       CloseHandle(pi.hThread);\r
+                       CloseHandle(pi.hProcess);\r
+                       Sts = FFFTP_SUCCESS;\r
+               }\r
+               free(CommandLine);\r
+       }\r
+       return Sts;\r
+}\r
+\r
+void RestartAndTerminate()\r
+{\r
+       Restart();\r
+       exit(1);\r
+}\r
+\r