OSDN Git Service

Add option to change default host settings.
[ffftp/ffftp.git] / main.c
diff --git a/main.c b/main.c
index db8f722..bebf19a 100644 (file)
--- a/main.c
+++ b/main.c
@@ -55,6 +55,9 @@
 #include <htmlhelp.h>\r
 #include "helpid.h"\r
 \r
+// ソフトウェア自動更新\r
+#include "updater.h"\r
+\r
 // UTF-8対応\r
 #undef __MBSWRAPPER_H__\r
 #include "mbswrapper.h"\r
@@ -149,6 +152,10 @@ static int PortableVersion;
 HANDLE ChangeNotification = INVALID_HANDLE_VALUE;\r
 // タスクバー進捗表示\r
 static ITaskbarList3* pTaskbarList3;\r
+// 高DPI対応\r
+static int ToolWinHeight;\r
+// ソフトウェア自動更新\r
+static int ApplyUpdatesOnExit = NO;\r
 \r
 \r
 /*===== グローバルなワーク =====*/\r
@@ -271,6 +278,11 @@ int AutoRefreshFileList = YES;
 int RemoveOldLog = NO;\r
 // バージョン確認\r
 int ReadOnlySettings = NO;\r
+// ソフトウェア自動更新\r
+int AutoCheckForUpdates = YES;\r
+int AutoApplyUpdates = NO;\r
+int AutoCheckForUptatesInterval = 7;\r
+time_t LastAutoCheckForUpdates = 0;\r
 \r
 \r
 \r
@@ -293,71 +305,84 @@ int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLi
     MSG Msg;\r
        int Ret;\r
        BOOL Sts;\r
-\r
        // プロセス保護\r
+       char* pCommand;\r
+       DWORD ProtectLevel;\r
+       char Option[FMAX_PATH+1];\r
+       // ソフトウェア自動更新\r
+       int ImmediateExit;\r
+       char PrivateKeyFile[FMAX_PATH+1];\r
+       char Password[FMAX_PATH+1];\r
+       char ServerPath[FMAX_PATH+1];\r
+       char HashFile[FMAX_PATH+1];\r
+       char ListFile[FMAX_PATH+1];\r
+       char Description[FMAX_PATH+1];\r
+       char UpdateDir[FMAX_PATH+1];\r
+       char Path[FMAX_PATH+1];\r
+       char Command[FMAX_PATH+1];\r
+       char* p;\r
+\r
 #ifdef ENABLE_PROCESS_PROTECTION\r
+       ProtectLevel = PROCESS_PROTECTION_NONE;\r
+       pCommand = lpszCmdLine;\r
+       while(pCommand = GetToken(pCommand, Option))\r
        {\r
-               DWORD ProtectLevel;\r
-               char* pCommand;\r
-               char Option[FMAX_PATH+1];\r
-               ProtectLevel = PROCESS_PROTECTION_NONE;\r
-               pCommand = lpszCmdLine;\r
-               while(pCommand = GetToken(pCommand, Option))\r
+               if(Option[0] == '-')\r
                {\r
-                       if(strcmp(Option, "--protect") == 0)\r
+                       if(strcmp(&Option[1], "-protect") == 0)\r
                        {\r
                                ProtectLevel = PROCESS_PROTECTION_DEFAULT;\r
                                break;\r
                        }\r
-                       else if(strcmp(Option, "--protect-high") == 0)\r
+                       else if(strcmp(&Option[1], "-protect-high") == 0)\r
                        {\r
                                ProtectLevel = PROCESS_PROTECTION_HIGH;\r
                                break;\r
                        }\r
-                       else if(strcmp(Option, "--protect-medium") == 0)\r
+                       else if(strcmp(&Option[1], "-protect-medium") == 0)\r
                        {\r
                                ProtectLevel = PROCESS_PROTECTION_MEDIUM;\r
                                break;\r
                        }\r
-                       else if(strcmp(Option, "--protect-low") == 0)\r
+                       else if(strcmp(&Option[1], "-protect-low") == 0)\r
                        {\r
                                ProtectLevel = PROCESS_PROTECTION_LOW;\r
                                break;\r
                        }\r
                }\r
-               if(ProtectLevel != PROCESS_PROTECTION_NONE)\r
+       }\r
+       if(ProtectLevel != PROCESS_PROTECTION_NONE)\r
+       {\r
+               SetProcessProtectionLevel(ProtectLevel);\r
+               if(!InitializeLoadLibraryHook())\r
                {\r
-                       SetProcessProtectionLevel(ProtectLevel);\r
-                       if(!InitializeLoadLibraryHook())\r
-                       {\r
-                               MessageBox(NULL, MSGJPN321, "FFFTP", MB_OK | MB_ICONERROR);\r
-                               return 0;\r
-                       }\r
+                       MessageBox(NULL, MSGJPN321, "FFFTP", MB_OK | MB_ICONERROR);\r
+                       return 0;\r
+               }\r
 #ifndef _DEBUG\r
-                       if(IsDebuggerPresent())\r
-                       {\r
-                               MessageBox(NULL, MSGJPN322, "FFFTP", MB_OK | MB_ICONERROR);\r
-                               return 0;\r
-                       }\r
+               if(IsDebuggerPresent())\r
+               {\r
+                       MessageBox(NULL, MSGJPN322, "FFFTP", MB_OK | MB_ICONERROR);\r
+                       return 0;\r
+               }\r
 #endif\r
-                       if(!UnloadUntrustedModule())\r
-                       {\r
-                               MessageBox(NULL, MSGJPN323, "FFFTP", MB_OK | MB_ICONERROR);\r
-                               return 0;\r
-                       }\r
+               if(!UnloadUntrustedModule())\r
+               {\r
+                       MessageBox(NULL, MSGJPN323, "FFFTP", MB_OK | MB_ICONERROR);\r
+                       return 0;\r
+               }\r
 #ifndef _DEBUG\r
-                       if(RestartProtectedProcess(" --restart"))\r
-                               return 0;\r
+               if(RestartProtectedProcess(" --restart"))\r
+                       return 0;\r
 #endif\r
-                       if(!EnableLoadLibraryHook(TRUE))\r
-                       {\r
-                               MessageBox(NULL, MSGJPN324, "FFFTP", MB_OK | MB_ICONERROR);\r
-                               return 0;\r
-                       }\r
+               if(!EnableLoadLibraryHook(TRUE))\r
+               {\r
+                       MessageBox(NULL, MSGJPN324, "FFFTP", MB_OK | MB_ICONERROR);\r
+                       return 0;\r
                }\r
-               else\r
-                       InitializeLoadLibraryHook();\r
        }\r
+       else\r
+               InitializeLoadLibraryHook();\r
 #endif\r
 \r
        // マルチコアCPUの特定環境下でファイル通信中にクラッシュするバグ対策\r
@@ -388,13 +413,66 @@ int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLi
        LoadOpenSSL();\r
 #endif\r
 \r
-       // SFTP対応\r
-       LoadPuTTY();\r
+       // ソフトウェア自動更新\r
+       ImmediateExit = NO;\r
+       pCommand = lpszCmdLine;\r
+       while(pCommand = GetToken(pCommand, Option))\r
+       {\r
+               if(Option[0] == '-')\r
+               {\r
+                       if(strcmp(&Option[1], "-build-software-update") == 0)\r
+                       {\r
+                               if(pCommand = GetToken(pCommand, PrivateKeyFile))\r
+                               {\r
+                                       if(pCommand = GetToken(pCommand, Password))\r
+                                       {\r
+                                               if(pCommand = GetToken(pCommand, ServerPath))\r
+                                               {\r
+                                                       if(pCommand = GetToken(pCommand, HashFile))\r
+                                                       {\r
+                                                               if(pCommand = GetToken(pCommand, ListFile))\r
+                                                               {\r
+                                                                       if(pCommand = GetToken(pCommand, Description))\r
+                                                                               BuildUpdates(PrivateKeyFile, Password, ServerPath, HashFile, ListFile, RELEASE_VERSION_NUM, VER_STR, Description);\r
+                                                               }\r
+                                                       }\r
+                                               }\r
+                                       }\r
+                               }\r
+                               ImmediateExit = YES;\r
+                               break;\r
+                       }\r
+                       else if(strcmp(&Option[1], "-software-update") == 0)\r
+                       {\r
+                               if(pCommand = GetToken(pCommand, UpdateDir))\r
+                               {\r
+                                       if(!RestartUpdateProcessAsAdministrator(lpszCmdLine, " --restart"))\r
+                                       {\r
+                                               Sleep(1000);\r
+                                               if(ApplyUpdates(UpdateDir, "updatebackup"))\r
+                                                       MessageBox(NULL, MSGJPN358, "FFFTP", MB_OK);\r
+                                               else\r
+                                                       MessageBox(NULL, MSGJPN359, "FFFTP", MB_OK | MB_ICONERROR);\r
+                                       }\r
+                               }\r
+                               ImmediateExit = YES;\r
+                               break;\r
+                       }\r
+                       else if(strcmp(&Option[1], "-software-cleanup") == 0)\r
+                       {\r
+                               if(pCommand = GetToken(pCommand, UpdateDir))\r
+                                       CleanupUpdates(UpdateDir);\r
+                               break;\r
+                       }\r
+               }\r
+       }\r
 \r
        Ret = FALSE;\r
        hWndFtp = NULL;\r
        hInstFtp = hInstance;\r
-       if(InitApp(lpszCmdLine, cmdShow) == FFFTP_SUCCESS)\r
+       // ソフトウェア自動更新\r
+//     if(InitApp(lpszCmdLine, cmdShow) == FFFTP_SUCCESS)\r
+       if(ImmediateExit == NO && InitApp(lpszCmdLine, cmdShow) == FFFTP_SUCCESS)\r
        {\r
                for(;;)\r
                {\r
@@ -426,14 +504,32 @@ int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLi
 #ifdef USE_OPENSSL\r
        FreeOpenSSL();\r
 #endif\r
-       // SFTP対応\r
-       FreePuTTY();\r
        // タスクバー進捗表示\r
        FreeTaskbarList3();\r
        // UPnP対応\r
        FreeUPnP();\r
        CoUninitialize();\r
        OleUninitialize();\r
+       // ソフトウェア自動更新\r
+       if(ApplyUpdatesOnExit == YES)\r
+       {\r
+               Sts = FALSE;\r
+               if(GetModuleFileName(NULL, UpdateDir, FMAX_PATH) > 0)\r
+               {\r
+                       if(p = strrchr(UpdateDir, '\\'))\r
+                       {\r
+                               *p = '\0';\r
+                               strcpy(Path, TmpPath);\r
+                               SetYenTail(Path);\r
+                               strcat(Path, "update");\r
+                               sprintf(Command, "-%s \"%s\"", "-software-update", UpdateDir);\r
+                               if(StartUpdateProcess(Path, Command))\r
+                                       Sts = TRUE;\r
+                       }\r
+               }\r
+               if(!Sts)\r
+                       MessageBox(NULL, MSGJPN359, "FFFTP", MB_OK | MB_ICONERROR);\r
+       }\r
        return(Ret);\r
 }\r
 \r
@@ -461,6 +557,8 @@ static int InitApp(LPSTR lpszCmdLine, int cmdShow)
        int masterpass;\r
        // ポータブル版判定\r
        int ImportPortable;\r
+       // 高DPI対応\r
+       int i;\r
 \r
        sts = FFFTP_FAIL;\r
 \r
@@ -485,6 +583,16 @@ static int InitApp(LPSTR lpszCmdLine, int cmdShow)
                _mkdir(TmpPath);\r
                SetYenTail(TmpPath);\r
 \r
+               // 高DPI対応\r
+               WinWidth = CalcPixelX(WinWidth);\r
+               WinHeight = CalcPixelY(WinHeight);\r
+               LocalWidth = CalcPixelX(LocalWidth);\r
+               TaskHeight = CalcPixelY(TaskHeight);\r
+               for(i = 0; i < sizeof(LocalTabWidth) / sizeof(int); i++)\r
+                       LocalTabWidth[i] = CalcPixelX(LocalTabWidth[i]);\r
+               for(i = 0; i < sizeof(RemoteTabWidth) / sizeof(int); i++)\r
+                       RemoteTabWidth[i] = CalcPixelX(RemoteTabWidth[i]);\r
+\r
                GetModuleFileName(NULL, HelpPath, FMAX_PATH);\r
                strcpy(GetFileName(HelpPath), "ffftp.chm");\r
 \r
@@ -518,7 +626,7 @@ static int InitApp(LPSTR lpszCmdLine, int cmdShow)
                {\r
                        if(IsRegAvailable() == YES && IsIniAvailable() == NO)\r
                        {\r
-                               switch(MessageBox(GetMainHwnd(), MSGJPN351, "FFFTP", MB_YESNOCANCEL | MB_DEFBUTTON2))\r
+                               switch(MessageBox(GetMainHwnd(), MSGJPN350, "FFFTP", MB_YESNOCANCEL | MB_DEFBUTTON2))\r
                                {\r
                                        case IDCANCEL:\r
                                                ReadOnlySettings = YES;\r
@@ -588,6 +696,9 @@ static int InitApp(LPSTR lpszCmdLine, int cmdShow)
                \r
                if(masterpass != 0)\r
                {\r
+                       // ホスト共通設定機能\r
+                       ResetDefaultHost();\r
+\r
                        LoadRegistry();\r
 \r
                        // ポータブル版判定\r
@@ -666,6 +777,10 @@ static int InitApp(LPSTR lpszCmdLine, int cmdShow)
                                        MakeButtonsFocus();\r
                                        DispTransferFiles();\r
 \r
+                                       // ソフトウェア自動更新\r
+                                       if(AutoCheckForUpdates == YES && AutoCheckForUptatesInterval == 0)\r
+                                               UpdateSoftware(YES, YES, AutoApplyUpdates);\r
+\r
                                        StartupProc(lpszCmdLine);\r
                                        sts = FFFTP_SUCCESS;\r
 \r
@@ -746,6 +861,10 @@ static int MakeAllWindows(int cmdShow)
        wClass.hIconSm       = NULL;\r
        RegisterClassEx(&wClass);\r
 \r
+       // 高DPI対応\r
+//     ToolWinHeight = TOOLWIN_HEIGHT;\r
+       ToolWinHeight = CalcPixelY(16) + 12;\r
+\r
        if(SaveWinPos == NO)\r
        {\r
                WinPosX = CW_USEDEFAULT;\r
@@ -836,16 +955,16 @@ void DispWindowTitle(void)
                switch(AskCryptMode())\r
                {\r
                case CRYPT_NONE:\r
-                       sprintf(Tmp, "%s (%s) %s - FFFTP", TitleHostName, FilterStr, MSGJPN352);\r
+                       sprintf(Tmp, "%s (%s) %s - FFFTP", TitleHostName, FilterStr, MSGJPN351);\r
                        break;\r
                case CRYPT_FTPES:\r
-                       sprintf(Tmp, "%s (%s) %s - FFFTP", TitleHostName, FilterStr, MSGJPN353);\r
+                       sprintf(Tmp, "%s (%s) %s - FFFTP", TitleHostName, FilterStr, MSGJPN352);\r
                        break;\r
                case CRYPT_FTPIS:\r
-                       sprintf(Tmp, "%s (%s) %s - FFFTP", TitleHostName, FilterStr, MSGJPN354);\r
+                       sprintf(Tmp, "%s (%s) %s - FFFTP", TitleHostName, FilterStr, MSGJPN353);\r
                        break;\r
                case CRYPT_SFTP:\r
-                       sprintf(Tmp, "%s (%s) %s - FFFTP", TitleHostName, FilterStr, MSGJPN355);\r
+                       sprintf(Tmp, "%s (%s) %s - FFFTP", TitleHostName, FilterStr, MSGJPN354);\r
                        break;\r
                }\r
        }\r
@@ -986,14 +1105,17 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA
        {\r
                // ローカル側自動更新\r
                // タスクバー進捗表示\r
+               // ソフトウェア自動更新\r
                case WM_CREATE :\r
                        SetTimer(hWnd, 1, 1000, NULL);\r
                        SetTimer(hWnd, 2, 100, NULL);\r
+                       SetTimer(hWnd, 3, 60000, NULL);\r
                        break;\r
 \r
                // ローカル側自動更新\r
                // 自動切断対策\r
                // タスクバー進捗表示\r
+               // ソフトウェア自動更新\r
                case WM_TIMER :\r
                        switch(wParam)\r
                        {\r
@@ -1030,6 +1152,13 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA
                                if(IsTaskbarList3Loaded() == YES)\r
                                        UpdateTaskbarProgress();\r
                                break;\r
+                       case 3:\r
+                               if(AskUserOpeDisabled() == NO && AskTransferNow() == NO)\r
+                               {\r
+                                       if(AutoCheckForUpdates == YES && AutoCheckForUptatesInterval > 0 && time(NULL) - LastAutoCheckForUpdates >= AutoCheckForUptatesInterval * 86400)\r
+                                               UpdateSoftware(YES, YES, AutoApplyUpdates);\r
+                               }\r
+                               break;\r
                        }\r
                        break;\r
 \r
@@ -1583,7 +1712,7 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA
                                                SetMasterPassword(NULL);\r
                                                while(ValidateMasterPassword() == YES && GetMasterPasswordStatus() == PASSWORD_UNMATCH)\r
                                                {\r
-                                                       if(EnterMasterPasswordAndSet(masterpasswd_dlg, NULL) == 0)\r
+                                                       if(EnterMasterPasswordAndSet(masterpasswd_dlg, hWnd) == 0)\r
                                                                break;\r
                                                }\r
                                                if(GetMasterPasswordStatus() == PASSWORD_OK && EnterMasterPasswordAndSet(newmasterpasswd_dlg, hWnd) != 0)\r
@@ -1640,6 +1769,39 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA
                                        break;\r
 #endif\r
 \r
+                               // 上位のディレクトリへ移動対応\r
+                               case MENU_REMOTE_MOVE_UPDIR :\r
+                                       MoveRemoteFileProc(-1);\r
+                                       break;\r
+\r
+                               // FileZilla XML形式エクスポート対応\r
+                               case MENU_EXPORT_FILEZILLA_XML :\r
+                                       // 平文で出力するためマスターパスワードを再確認\r
+                                       if(GetMasterPasswordStatus() == PASSWORD_OK)\r
+                                       {\r
+                                               char Password[MAX_PASSWORD_LEN + 1];\r
+                                               GetMasterPassword(Password);\r
+                                               SetMasterPassword(NULL);\r
+                                               while(ValidateMasterPassword() == YES && GetMasterPasswordStatus() == PASSWORD_UNMATCH)\r
+                                               {\r
+                                                       if(EnterMasterPasswordAndSet(masterpasswd_dlg, hWnd) == 0)\r
+                                                               break;\r
+                                               }\r
+                                               if(GetMasterPasswordStatus() == PASSWORD_OK)\r
+                                                       SaveSettingsToFileZillaXml();\r
+                                               else\r
+                                               {\r
+                                                       SetMasterPassword(Password);\r
+                                                       ValidateMasterPassword();\r
+                                               }\r
+                                       }\r
+                                       break;\r
+\r
+                               // ソフトウェア自動更新\r
+                               case MENU_UPDATES_CHECK :\r
+                                       UpdateSoftware(NO, NO, NO);\r
+                                       break;\r
+\r
                                default :\r
                                        if((LOWORD(wParam) >= MENU_BMARK_TOP) &&\r
                                           (LOWORD(wParam) < MENU_BMARK_TOP+100))\r
@@ -1902,6 +2064,8 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA
                                FindCloseChangeNotification(ChangeNotification);\r
                        // タスクバー進捗表示\r
                        KillTimer(hWnd, 2);\r
+                       // ソフトウェア自動更新\r
+                       KillTimer(hWnd, 3);\r
 //                     WSACleanup();\r
 //                     DestroyWindow(hWndFtp);\r
                        PostQuitMessage(0);\r
@@ -2043,6 +2207,8 @@ static int AnalyzeComLine(char *Str, int *AutoConnect, int *CmdOption, char *unc
 {\r
        int Ret;\r
        char Tmp[FMAX_PATH+1];\r
+       // ソフトウェア自動更新\r
+       int i;\r
 \r
        *AutoConnect = -1;\r
        *CmdOption = 0;\r
@@ -2141,19 +2307,19 @@ static int AnalyzeComLine(char *Str, int *AutoConnect, int *CmdOption, char *unc
                        }\r
                        // プロセス保護\r
 #ifdef ENABLE_PROCESS_PROTECTION\r
-                       else if(strcmp(Tmp, "--restart") == 0)\r
+                       else if(strcmp(&Tmp[1], "-restart") == 0)\r
                        {\r
                        }\r
-                       else if(strcmp(Tmp, "--protect") == 0)\r
+                       else if(strcmp(&Tmp[1], "-protect") == 0)\r
                        {\r
                        }\r
-                       else if(strcmp(Tmp, "--protect-high") == 0)\r
+                       else if(strcmp(&Tmp[1], "-protect-high") == 0)\r
                        {\r
                        }\r
-                       else if(strcmp(Tmp, "--protect-medium") == 0)\r
+                       else if(strcmp(&Tmp[1], "-protect-medium") == 0)\r
                        {\r
                        }\r
-                       else if(strcmp(Tmp, "--protect-low") == 0)\r
+                       else if(strcmp(&Tmp[1], "-protect-low") == 0)\r
                        {\r
                        }\r
 #endif\r
@@ -2168,6 +2334,32 @@ static int AnalyzeComLine(char *Str, int *AutoConnect, int *CmdOption, char *unc
                                *CmdOption |= OPT_SJIS_NAME;\r
                        else if((strcmp(&Tmp[1], "u8n") == 0) || (strcmp(&Tmp[1], "-utf8name") == 0))\r
                                *CmdOption |= OPT_UTF8N_NAME;\r
+                       // ソフトウェア自動更新\r
+                       else if(strcmp(&Tmp[1], "-build-software-update") == 0)\r
+                       {\r
+                               for(i = 0; i < 6; i++)\r
+                               {\r
+                                       if((Str = GetToken(Str, Tmp)) == NULL)\r
+                                       {\r
+                                               Ret = -1;\r
+                                               break;\r
+                                       }\r
+                               }\r
+                       }\r
+                       else if(strcmp(&Tmp[1], "-software-update") == 0)\r
+                       {\r
+                               if((Str = GetToken(Str, Tmp)) == NULL)\r
+                               {\r
+                                       Ret = -1;\r
+                               }\r
+                       }\r
+                       else if(strcmp(&Tmp[1], "-software-cleanup") == 0)\r
+                       {\r
+                               if((Str = GetToken(Str, Tmp)) == NULL)\r
+                               {\r
+                                       Ret = -1;\r
+                               }\r
+                       }\r
                        else\r
                        {\r
                                SetTaskMsg(MSGJPN180, Tmp);\r
@@ -2280,7 +2472,7 @@ static char *GetToken(char *Str, char *Buf)
                InQuote = 0;\r
                while(*Str != NUL)\r
                {\r
-                       if(*Str == 0x22)\r
+                       if(*Str == '\"')\r
                                InQuote = !InQuote;\r
                        else\r
                        {\r
@@ -2620,16 +2812,24 @@ static void ResizeWindowProc(void)
        SendMessage(GetSbarWnd(), WM_SIZE, SIZE_RESTORED, MAKELPARAM(Rect.right, Rect.bottom));\r
 \r
        CalcWinSize();\r
-       SetWindowPos(GetMainTbarWnd(), 0, 0, 0, Rect.right, TOOLWIN_HEIGHT, SWP_NOACTIVATE | SWP_NOZORDER);\r
-       SetWindowPos(GetLocalTbarWnd(), 0, 0, TOOLWIN_HEIGHT, LocalWidth, TOOLWIN_HEIGHT, SWP_NOACTIVATE | SWP_NOZORDER);\r
-       SetWindowPos(GetRemoteTbarWnd(), 0, LocalWidth + SepaWidth, TOOLWIN_HEIGHT, RemoteWidth, TOOLWIN_HEIGHT, SWP_NOACTIVATE | SWP_NOZORDER);\r
+       // 高DPI対応\r
+//     SetWindowPos(GetMainTbarWnd(), 0, 0, 0, Rect.right, TOOLWIN_HEIGHT, SWP_NOACTIVATE | SWP_NOZORDER);\r
+//     SetWindowPos(GetLocalTbarWnd(), 0, 0, TOOLWIN_HEIGHT, LocalWidth, TOOLWIN_HEIGHT, SWP_NOACTIVATE | SWP_NOZORDER);\r
+//     SetWindowPos(GetRemoteTbarWnd(), 0, LocalWidth + SepaWidth, TOOLWIN_HEIGHT, RemoteWidth, TOOLWIN_HEIGHT, SWP_NOACTIVATE | SWP_NOZORDER);\r
+       SetWindowPos(GetMainTbarWnd(), 0, 0, 0, Rect.right, AskToolWinHeight(), SWP_NOACTIVATE | SWP_NOZORDER);\r
+       SetWindowPos(GetLocalTbarWnd(), 0, 0, AskToolWinHeight(), LocalWidth, AskToolWinHeight(), SWP_NOACTIVATE | SWP_NOZORDER);\r
+       SetWindowPos(GetRemoteTbarWnd(), 0, LocalWidth + SepaWidth, AskToolWinHeight(), RemoteWidth, AskToolWinHeight(), SWP_NOACTIVATE | SWP_NOZORDER);\r
        SendMessage(GetLocalTbarWnd(), TB_GETITEMRECT, 3, (LPARAM)&Rect);\r
        SetWindowPos(GetLocalHistHwnd(), 0, Rect.right, Rect.top, LocalWidth - Rect.right, 200, SWP_NOACTIVATE | SWP_NOZORDER);\r
        SendMessage(GetRemoteTbarWnd(), TB_GETITEMRECT, 3, (LPARAM)&Rect);\r
        SetWindowPos(GetRemoteHistHwnd(), 0, Rect.right, Rect.top, RemoteWidth - Rect.right, 200, SWP_NOACTIVATE | SWP_NOZORDER);\r
-       SetWindowPos(GetLocalHwnd(), 0, 0, TOOLWIN_HEIGHT*2, LocalWidth, ListHeight, SWP_NOACTIVATE | SWP_NOZORDER);\r
-       SetWindowPos(GetRemoteHwnd(), 0, LocalWidth + SepaWidth, TOOLWIN_HEIGHT*2, RemoteWidth, ListHeight, SWP_NOACTIVATE | SWP_NOZORDER);\r
-       SetWindowPos(GetTaskWnd(), 0, 0, TOOLWIN_HEIGHT*2+ListHeight+SepaWidth, ClientWidth, TaskHeight, SWP_NOACTIVATE | SWP_NOZORDER);\r
+       // 高DPI対応\r
+//     SetWindowPos(GetLocalHwnd(), 0, 0, TOOLWIN_HEIGHT*2, LocalWidth, ListHeight, SWP_NOACTIVATE | SWP_NOZORDER);\r
+//     SetWindowPos(GetRemoteHwnd(), 0, LocalWidth + SepaWidth, TOOLWIN_HEIGHT*2, RemoteWidth, ListHeight, SWP_NOACTIVATE | SWP_NOZORDER);\r
+//     SetWindowPos(GetTaskWnd(), 0, 0, TOOLWIN_HEIGHT*2+ListHeight+SepaWidth, ClientWidth, TaskHeight, SWP_NOACTIVATE | SWP_NOZORDER);\r
+       SetWindowPos(GetLocalHwnd(), 0, 0, AskToolWinHeight()*2, LocalWidth, ListHeight, SWP_NOACTIVATE | SWP_NOZORDER);\r
+       SetWindowPos(GetRemoteHwnd(), 0, LocalWidth + SepaWidth, AskToolWinHeight()*2, RemoteWidth, ListHeight, SWP_NOACTIVATE | SWP_NOZORDER);\r
+       SetWindowPos(GetTaskWnd(), 0, 0, AskToolWinHeight()*2+ListHeight+SepaWidth, ClientWidth, TaskHeight, SWP_NOACTIVATE | SWP_NOZORDER);\r
 #endif\r
 \r
        return;\r
@@ -2669,7 +2869,9 @@ static void CalcWinSize(void)
 \r
        GetClientRect(GetSbarWnd(), &Rect);\r
 \r
-       ListHeight = max1(0, ClientHeight - TOOLWIN_HEIGHT * 2 - TaskHeight - SepaWidth - Rect.bottom);\r
+       // 高DPI対応\r
+//     ListHeight = max1(0, ClientHeight - TOOLWIN_HEIGHT * 2 - TaskHeight - SepaWidth - Rect.bottom);\r
+       ListHeight = max1(0, ClientHeight - AskToolWinHeight() * 2 - TaskHeight - SepaWidth - Rect.bottom);\r
 \r
        return;\r
 }\r
@@ -2717,8 +2919,11 @@ static void CheckResizeFrame(WPARAM Keys, int x, int y)
 \r
        if((Resizing == RESIZE_OFF) && (Keys == 0))\r
        {\r
+               // 高DPI対応\r
+//             if((x >= LocalWidth) && (x <= LocalWidth + SepaWidth) &&\r
+//                (y > TOOLWIN_HEIGHT) && (y < (TOOLWIN_HEIGHT * 2 + ListHeight)))\r
                if((x >= LocalWidth) && (x <= LocalWidth + SepaWidth) &&\r
-                  (y > TOOLWIN_HEIGHT) && (y < (TOOLWIN_HEIGHT * 2 + ListHeight)))\r
+                  (y > AskToolWinHeight()) && (y < (AskToolWinHeight() * 2 + ListHeight)))\r
                {\r
                        /* 境界位置変更用カーソルに変更 */\r
                        SetCapture(hWndFtp);\r
@@ -2727,7 +2932,9 @@ static void CheckResizeFrame(WPARAM Keys, int x, int y)
                        Resizing = RESIZE_PREPARE;\r
                        ResizePos = RESIZE_HPOS;\r
                }\r
-               else if((y >= TOOLWIN_HEIGHT*2+ListHeight) && (y <= TOOLWIN_HEIGHT*2+ListHeight+SepaWidth))\r
+               // 高DPI対応\r
+//             else if((y >= TOOLWIN_HEIGHT*2+ListHeight) && (y <= TOOLWIN_HEIGHT*2+ListHeight+SepaWidth))\r
+               else if((y >= AskToolWinHeight()*2+ListHeight) && (y <= AskToolWinHeight()*2+ListHeight+SepaWidth))\r
                {\r
                        /* 境界位置変更用カーソルに変更 */\r
                        SetCapture(hWndFtp);\r
@@ -2747,17 +2954,25 @@ static void CheckResizeFrame(WPARAM Keys, int x, int y)
                        GetClientRect(GetSbarWnd(), &Rect1);\r
                        Rect.left += GetSystemMetrics(SM_CXFRAME);\r
                        Rect.right -= GetSystemMetrics(SM_CXFRAME);\r
-                       Rect.top += TOOLWIN_HEIGHT*2 + GetSystemMetrics(SM_CYMENU) + GetSystemMetrics(SM_CYCAPTION) + GetSystemMetrics(SM_CYFRAME);\r
+                       // 高DPI対応\r
+//                     Rect.top += TOOLWIN_HEIGHT*2 + GetSystemMetrics(SM_CYMENU) + GetSystemMetrics(SM_CYCAPTION) + GetSystemMetrics(SM_CYFRAME);\r
+                       Rect.top += AskToolWinHeight()*2 + GetSystemMetrics(SM_CYMENU) + GetSystemMetrics(SM_CYCAPTION) + GetSystemMetrics(SM_CYFRAME);\r
                        Rect.bottom -= GetSystemMetrics(SM_CYFRAME) + Rect1.bottom;\r
                        ClipCursor(&Rect);\r
                }\r
                else\r
                {\r
+                       // 高DPI対応\r
+//                     if(((ResizePos == RESIZE_HPOS) &&\r
+//                             ((x < LocalWidth) || (x > LocalWidth + SepaWidth) ||\r
+//                              (y <= TOOLWIN_HEIGHT) || (y >= (TOOLWIN_HEIGHT * 2 + ListHeight)))) ||\r
+//                        ((ResizePos == RESIZE_VPOS) &&\r
+//                             ((y < TOOLWIN_HEIGHT*2+ListHeight) || (y > TOOLWIN_HEIGHT*2+ListHeight+SepaWidth))))\r
                        if(((ResizePos == RESIZE_HPOS) &&\r
                                ((x < LocalWidth) || (x > LocalWidth + SepaWidth) ||\r
-                                (y <= TOOLWIN_HEIGHT) || (y >= (TOOLWIN_HEIGHT * 2 + ListHeight)))) ||\r
+                                (y <= AskToolWinHeight()) || (y >= (AskToolWinHeight() * 2 + ListHeight)))) ||\r
                           ((ResizePos == RESIZE_VPOS) &&\r
-                               ((y < TOOLWIN_HEIGHT*2+ListHeight) || (y > TOOLWIN_HEIGHT*2+ListHeight+SepaWidth))))\r
+                               ((y < AskToolWinHeight()*2+ListHeight) || (y > AskToolWinHeight()*2+ListHeight+SepaWidth))))\r
                        {\r
                                /* 元のカーソルに戻す */\r
                                ReleaseCapture();\r
@@ -3350,7 +3565,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, "\xCD\xD3\xB3\xB8\x9B\x42\x85\x25\x73\xD8\xD4\xBC\xCB\x0B\xA2\x8A\x20\x38\xF4\x6C", 20) == 0\r
+                               if(memcmp(&Hash, &SSLRootCAFileHash, 20) == 0 || memcmp(&Hash, "\xE8\xE7\x94\x39\x27\x66\xCC\xA1\x52\x88\x58\xA2\x29\xAC\x04\x6B\x0F\x5D\x58\x01", 20) == 0\r
                                        || DialogBox(GetFtpInst(), MAKEINTRESOURCE(updatesslroot_dlg), GetMainHwnd(), ExeEscDialogProc) == YES)\r
                                {\r
                                        memcpy(&SSLRootCAFileHash, &Hash, 20);\r
@@ -3414,9 +3629,8 @@ int Restart()
        return Sts;\r
 }\r
 \r
-void RestartAndTerminate()\r
+void Terminate()\r
 {\r
-       Restart();\r
        exit(1);\r
 }\r
 \r
@@ -3462,3 +3676,77 @@ void UpdateTaskbarProgress()
                pTaskbarList3->lpVtbl->SetProgressState(pTaskbarList3, GetMainHwnd(), TBPF_NOPROGRESS);\r
 }\r
 \r
+// 高DPI対応\r
+int AskToolWinHeight(void)\r
+{\r
+       return(ToolWinHeight);\r
+}\r
+\r
+// ソフトウェア自動更新\r
+typedef struct\r
+{\r
+       int NoError;\r
+       int NoConfirm;\r
+} UPDATESOFTWAREDATA;\r
+\r
+DWORD WINAPI UpdateSoftwareThreadProc(LPVOID lpParameter)\r
+{\r
+       UPDATESOFTWAREDATA* pData;\r
+       pData = (UPDATESOFTWAREDATA*)lpParameter;\r
+       UpdateSoftware(NO, pData->NoError, pData->NoConfirm);\r
+       free(pData);\r
+       return 0;\r
+}\r
+\r
+void UpdateSoftware(int Async, int NoError, int NoConfirm)\r
+{\r
+       UPDATESOFTWAREDATA* pData;\r
+       DWORD Version;\r
+       char VersionString[32];\r
+       char Description[1024];\r
+       char Tmp[2048];\r
+       if(Async == YES)\r
+       {\r
+               if(pData = malloc(sizeof(UPDATESOFTWAREDATA)))\r
+               {\r
+                       pData->NoError = NoError;\r
+                       pData->NoConfirm = NoConfirm;\r
+                       CloseHandle(CreateThread(NULL, 0, UpdateSoftwareThreadProc, pData, 0, NULL));\r
+               }\r
+       }\r
+       else\r
+       {\r
+               // 念のためマスターパスワードの一致を確認\r
+               if(GetMasterPasswordStatus() == PASSWORD_OK)\r
+               {\r
+                       Version = RELEASE_VERSION_NUM;\r
+                       LastAutoCheckForUpdates = time(NULL);\r
+                       if(CheckForUpdates(FALSE, NULL, &Version, VersionString, Description))\r
+                       {\r
+                               if(Version > RELEASE_VERSION_NUM)\r
+                               {\r
+                                       sprintf(Tmp, MSGJPN361, VER_STR, VersionString, Description);\r
+                                       if(NoConfirm == YES || MessageBox(GetMainHwnd(), Tmp, "FFFTP", MB_YESNO) == IDYES)\r
+                                       {\r
+                                               strcpy(Tmp, TmpPath);\r
+                                               SetYenTail(Tmp);\r
+                                               strcat(Tmp, "update");\r
+                                               _mkdir(Tmp);\r
+                                               if(CheckForUpdates(TRUE, Tmp, &Version, VersionString, Description))\r
+                                               {\r
+                                                       MessageBox(GetMainHwnd(), MSGJPN364, "FFFTP", MB_OK);\r
+                                                       ApplyUpdatesOnExit = YES;\r
+                                               }\r
+                                               else if(NoError == NO)\r
+                                                       MessageBox(GetMainHwnd(), MSGJPN362, "FFFTP", MB_OK | MB_ICONERROR);\r
+                                       }\r
+                               }\r
+                               else if(NoError == NO)\r
+                                       MessageBox(GetMainHwnd(), MSGJPN363, "FFFTP", MB_OK);\r
+                       }\r
+                       else if(NoError == NO)\r
+                               MessageBox(GetMainHwnd(), MSGJPN362, "FFFTP", MB_OK | MB_ICONERROR);\r
+               }\r
+       }\r
+}\r
+\r