OSDN Git Service

Add routines for automatic software updates.
authors_kawamoto <s_kawamoto@users.sourceforge.jp>
Sun, 8 Jun 2014 13:04:51 +0000 (22:04 +0900)
committers_kawamoto <s_kawamoto@users.sourceforge.jp>
Sun, 8 Jun 2014 13:04:51 +0000 (22:04 +0900)
Fix minor bugs.

18 files changed:
FFFTP_Eng_Release/FFFTP.exe
Release/FFFTP.exe
Resource/FFFTP.rc
Resource/resource.h
Resource_eng/FFFTP-eng.rc
Resource_eng/resource.h
common.h
main.c
mesg-eng.h
mesg-jpn.h
misc.c
option.c
putty/Release/PuTTY.dll
putty/dllinterface.c
registry.c
tool.c
updater.c
updater.h

index cf4e7e0..46f2a81 100644 (file)
Binary files a/FFFTP_Eng_Release/FFFTP.exe and b/FFFTP_Eng_Release/FFFTP.exe differ
index 9e33763..257fb42 100644 (file)
Binary files a/Release/FFFTP.exe and b/Release/FFFTP.exe differ
index d80d422..3234e02 100644 (file)
@@ -168,6 +168,8 @@ BEGIN
         MENUITEM "\96Ú\8e\9f(&C)\tF1",                  MENU_HELP\r
         MENUITEM "Q&&A\8fW(\83C\83\93\83^\81[\83l\83b\83g\82É\90Ú\91±\82µ\82Ü\82·)(T)",     MENU_HELP_TROUBLE\r
         MENUITEM SEPARATOR\r
+        MENUITEM "\83\\83t\83g\83E\83F\83A\82Ì\8dX\90V\82ð\8am\94F(&U)...",         MENU_UPDATES_CHECK\r
+        MENUITEM SEPARATOR\r
         MENUITEM "FFFTP\82É\82Â\82¢\82Ä(&A)...",            MENU_ABOUT\r
     END\r
 END\r
@@ -1465,6 +1467,18 @@ BEGIN
     CONTROL         "\8cÃ\82¢\8f\88\97\9d\93à\97e\82ð\95\\8e¦\82µ\82È\82¢(&L)",DISP2_REMOVE_OLD_LOG,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,35,196,10\r
 END\r
 \r
+opt_updates_dlg DIALOG  0, 0, 211, 155\r
+STYLE DS_SETFONT | WS_CHILD | WS_DISABLED | WS_CAPTION\r
+FONT 9, "MS Shell Dlg"\r
+BEGIN\r
+    CONTROL         "\8e©\93®\93I\82É\83\\83t\83g\83E\83F\83A\82Ì\8dX\90V\82ð\8am\94F\82·\82é(&C)",UPDATES_AUTO_CHECK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,7,196,10\r
+    CONTROL         "\8e©\93®\93I\82É\8dX\90V\82ð\93K\97p\82·\82é(&A)",UPDATES_AUTO_APPLY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,21,196,10\r
+    LTEXT           "\8dX\90V\82Ì\8am\94F\82Ì\8aÔ\8au(&I)",-1,7,35,196,8\r
+    EDITTEXT        UPDATES_INTERVAL,7,45,26,14,ES_AUTOHSCROLL | ES_NUMBER\r
+    CONTROL         "Spin1",UPDATES_INTERVAL_SPN,"msctls_updown32",UDS_SETBUDDYINT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS,33,45,9,14\r
+    LTEXT           "\81i0\81`999\93ú; 0=\96\88\89ñ\8bN\93®\8e\9e\82É\8am\94F\81j",-1,45,49,168,8\r
+END\r
+\r
 \r
 /////////////////////////////////////////////////////////////////////////////\r
 //\r
@@ -2144,6 +2158,14 @@ BEGIN
         TOPMARGIN, 7\r
         BOTTOMMARGIN, 148\r
     END\r
+\r
+    opt_updates_dlg, DIALOG\r
+    BEGIN\r
+        LEFTMARGIN, 7\r
+        RIGHTMARGIN, 204\r
+        TOPMARGIN, 7\r
+        BOTTOMMARGIN, 148\r
+    END\r
 END\r
 #endif    // APSTUDIO_INVOKED\r
 \r
index 47f1bc1..6f062d7 100644 (file)
 #define ini_from_reg_dlg                194\r
 #define opt_trmode4_dlg                 195\r
 #define opt_disp2_dlg                   196\r
+#define opt_updates_dlg                 197\r
 #define TRANS_TIME_BAR                  1002\r
 #define TRANS_TEXT                      1003\r
 #define TRANS_REMOTE                    1003\r
 #define TRMODE4_UTF8BOM_CNV             1219\r
 #define HSET_ERROR_RECONNECT            1220\r
 #define HSET_FN_UTF8HFSX_CNV            1221\r
+#define UPDATES_AUTO_CHECK              1222\r
+#define UPDATES_AUTO_APPLY              1223\r
+#define UPDATES_INTERVAL                1224\r
+#define UPDATES_INTERVAL_SPN            1225\r
 #define MENU_END                        40001\r
 #define MENU_EXIT                       40001\r
 #define MENU_CONNECT                    40003\r
 #define MENU_FW_FTP_FILTER              40178\r
 #define MENU_REMOTE_MOVE_UPDIR          40179\r
 #define MENU_EXPORT_FILEZILLA_XML       40180\r
+#define MENU_UPDATES_CHECK              40181\r
 #define FSNOTIFY_TITLE                  65535\r
 #define HOST_SIZEGRIP                   65535\r
 \r
 #ifdef APSTUDIO_INVOKED\r
 #ifndef APSTUDIO_READONLY_SYMBOLS\r
 #define _APS_NEXT_RESOURCE_VALUE        197\r
-#define _APS_NEXT_COMMAND_VALUE         40181\r
-#define _APS_NEXT_CONTROL_VALUE         1221\r
+#define _APS_NEXT_COMMAND_VALUE         40182\r
+#define _APS_NEXT_CONTROL_VALUE         1226\r
 #define _APS_NEXT_SYMED_VALUE           101\r
 #endif\r
 #endif\r
index f23bdaf..03abd22 100644 (file)
@@ -168,6 +168,8 @@ BEGIN
         MENUITEM "&Contents\tF1",               MENU_HELP\r
         MENUITEM "&Q&&A (Connect to Internet)", MENU_HELP_TROUBLE\r
         MENUITEM SEPARATOR\r
+        MENUITEM "Check for Software &Updates...", MENU_UPDATES_CHECK\r
+        MENUITEM SEPARATOR\r
         MENUITEM "&About FFFTP...",             MENU_ABOUT\r
     END\r
 END\r
@@ -176,7 +178,7 @@ dummy_menu MENU
 BEGIN\r
     POPUP "dummy"\r
     BEGIN\r
-        MENUITEM "Go up (host)",                MENU_REMOTE_UPDIR\r
+        MENUITEM "Go up (remote)",              MENU_REMOTE_UPDIR\r
         MENUITEM "Go up (local)",               MENU_LOCAL_UPDIR\r
         MENUITEM "Go up (both)",                MENU_UPDIR\r
         MENUITEM "COMBO_LOCAL",                 COMBO_LOCAL\r
@@ -1501,6 +1503,19 @@ BEGIN
     CONTROL         "Do not show old &logs",DISP2_REMOVE_OLD_LOG,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,35,196,10\r
 END\r
 \r
+opt_updates_dlg DIALOG  0, 0, 211, 155\r
+STYLE DS_SETFONT | WS_CHILD | WS_DISABLED | WS_CAPTION\r
+FONT 9, "MS Shell Dlg"\r
+BEGIN\r
+    CONTROL         "&Check for software updates automatically",UPDATES_AUTO_CHECK,\r
+                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,7,196,10\r
+    CONTROL         "&Apply updates automatically",UPDATES_AUTO_APPLY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,21,196,10\r
+    LTEXT           "&Interval of checking for updates",-1,7,35,196,8\r
+    EDITTEXT        UPDATES_INTERVAL,7,45,26,14,ES_AUTOHSCROLL | ES_NUMBER\r
+    CONTROL         "Spin1",UPDATES_INTERVAL_SPN,"msctls_updown32",UDS_SETBUDDYINT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS,33,45,9,14\r
+    LTEXT           "\81i0\81`999days; 0=Every time at startup\81j",-1,45,49,168,8\r
+END\r
+\r
 \r
 /////////////////////////////////////////////////////////////////////////////\r
 //\r
@@ -2177,6 +2192,14 @@ BEGIN
         TOPMARGIN, 7\r
         BOTTOMMARGIN, 148\r
     END\r
+\r
+    opt_updates_dlg, DIALOG\r
+    BEGIN\r
+        LEFTMARGIN, 7\r
+        RIGHTMARGIN, 204\r
+        TOPMARGIN, 7\r
+        BOTTOMMARGIN, 148\r
+    END\r
 END\r
 #endif    // APSTUDIO_INVOKED\r
 \r
index e549679..044ff82 100644 (file)
 #define ini_from_reg_dlg                194\r
 #define opt_trmode4_dlg                 195\r
 #define opt_disp2_dlg                   196\r
+#define opt_updates_dlg                 197\r
 #define TRANS_TIME_BAR                  1002\r
 #define TRANS_TEXT                      1003\r
 #define TRANS_REMOTE                    1003\r
 #define TRMODE4_UTF8BOM_CNV             1219\r
 #define HSET_ERROR_RECONNECT            1220\r
 #define HSET_FN_UTF8HFSX_CNV            1221\r
+#define UPDATES_AUTO_CHECK              1222\r
+#define UPDATES_AUTO_APPLY              1223\r
+#define UPDATES_INTERVAL                1224\r
+#define UPDATES_INTERVAL_SPN            1225\r
 #define MENU_END                        40001\r
 #define MENU_EXIT                       40001\r
 #define MENU_CONNECT                    40003\r
 #define MENU_FW_FTP_FILTER              40178\r
 #define MENU_REMOTE_MOVE_UPDIR          40179\r
 #define MENU_EXPORT_FILEZILLA_XML       40180\r
+#define MENU_UPDATES_CHECK              40181\r
 #define FSNOTIFY_TITLE                  65535\r
 #define HOST_SIZEGRIP                   65535\r
 \r
 #ifdef APSTUDIO_INVOKED\r
 #ifndef APSTUDIO_READONLY_SYMBOLS\r
 #define _APS_NEXT_RESOURCE_VALUE        197\r
-#define _APS_NEXT_COMMAND_VALUE         40181\r
-#define _APS_NEXT_CONTROL_VALUE         1221\r
+#define _APS_NEXT_COMMAND_VALUE         40182\r
+#define _APS_NEXT_CONTROL_VALUE         1226\r
 #define _APS_NEXT_SYMED_VALUE           101\r
 #endif\r
 #endif\r
index e526a9d..7d37076 100644 (file)
--- a/common.h
+++ b/common.h
@@ -1389,6 +1389,8 @@ int IsTaskbarList3Loaded();
 void UpdateTaskbarProgress();\r
 // 高DPI対応\r
 int AskToolWinHeight(void);\r
+// ソフトウェア自動更新\r
+void UpdateSoftware(int NoError, int NoConfirm);\r
 \r
 /*===== filelist.c =====*/\r
 \r
diff --git a/main.c b/main.c
index 5712cd6..7228645 100644 (file)
--- a/main.c
+++ b/main.c
@@ -153,7 +153,9 @@ HANDLE ChangeNotification = INVALID_HANDLE_VALUE;
 // タスクバー進捗表示\r
 static ITaskbarList3* pTaskbarList3;\r
 // 高DPI対応\r
-int ToolWinHeight;\r
+static int ToolWinHeight;\r
+// ソフトウェア自動更新\r
+static int ApplyUpdatesOnExit = NO;\r
 \r
 \r
 /*===== グローバルなワーク =====*/\r
@@ -276,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
@@ -300,6 +307,9 @@ int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLi
        BOOL Sts;\r
        // ソフトウェア自動更新\r
        char UpdateDir[FMAX_PATH+1];\r
+       char Path[FMAX_PATH+1];\r
+       char Command[FMAX_PATH+1];\r
+       char* p;\r
 \r
        // プロセス保護\r
 #ifdef ENABLE_PROCESS_PROTECTION\r
@@ -311,25 +321,28 @@ int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLi
                pCommand = lpszCmdLine;\r
                while(pCommand = GetToken(pCommand, Option))\r
                {\r
-                       if(strcmp(Option, "--protect") == 0)\r
-                       {\r
-                               ProtectLevel = PROCESS_PROTECTION_DEFAULT;\r
-                               break;\r
-                       }\r
-                       else if(strcmp(Option, "--protect-high") == 0)\r
-                       {\r
-                               ProtectLevel = PROCESS_PROTECTION_HIGH;\r
-                               break;\r
-                       }\r
-                       else if(strcmp(Option, "--protect-medium") == 0)\r
-                       {\r
-                               ProtectLevel = PROCESS_PROTECTION_MEDIUM;\r
-                               break;\r
-                       }\r
-                       else if(strcmp(Option, "--protect-low") == 0)\r
+                       if(Option[0] == '-')\r
                        {\r
-                               ProtectLevel = PROCESS_PROTECTION_LOW;\r
-                               break;\r
+                               if(strcmp(&Option[1], "-protect") == 0)\r
+                               {\r
+                                       ProtectLevel = PROCESS_PROTECTION_DEFAULT;\r
+                                       break;\r
+                               }\r
+                               else if(strcmp(&Option[1], "-protect-high") == 0)\r
+                               {\r
+                                       ProtectLevel = PROCESS_PROTECTION_HIGH;\r
+                                       break;\r
+                               }\r
+                               else if(strcmp(&Option[1], "-protect-medium") == 0)\r
+                               {\r
+                                       ProtectLevel = PROCESS_PROTECTION_MEDIUM;\r
+                                       break;\r
+                               }\r
+                               else if(strcmp(&Option[1], "-protect-low") == 0)\r
+                               {\r
+                                       ProtectLevel = PROCESS_PROTECTION_LOW;\r
+                                       break;\r
+                               }\r
                        }\r
                }\r
                if(ProtectLevel != PROCESS_PROTECTION_NONE)\r
@@ -368,18 +381,19 @@ int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLi
 #endif\r
 \r
        // ソフトウェア自動更新\r
-       if(GetTokenAfterOption(lpszCmdLine, UpdateDir, "--software-update", "--software-update"))\r
+       if(GetTokenAfterOption(lpszCmdLine, UpdateDir, "-software-update", "-software-update"))\r
        {\r
-               if(!StartUpdateProcessAsAdministrator(lpszCmdLine, " --restart"))\r
+               if(!RestartUpdateProcessAsAdministrator(lpszCmdLine, " --restart"))\r
                {\r
-                       if(ApplyUpdates(UpdateDir))\r
+                       Sleep(1000);\r
+                       if(ApplyUpdates(UpdateDir, "updatebackup"))\r
                                MessageBox(NULL, MSGJPN359, "FFFTP", MB_OK);\r
                        else\r
-                               MessageBox(NULL, MSGJPN360, "FFFTP", MB_OK);\r
+                               MessageBox(NULL, MSGJPN360, "FFFTP", MB_OK | MB_ICONERROR);\r
                }\r
                return 0;\r
        }\r
-       else if(GetTokenAfterOption(lpszCmdLine, UpdateDir, "--software-cleanup", "--software-cleanup"))\r
+       else if(GetTokenAfterOption(lpszCmdLine, UpdateDir, "-software-cleanup", "-software-cleanup"))\r
        {\r
                CleanupUpdates(UpdateDir);\r
        }\r
@@ -458,6 +472,26 @@ int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLi
        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, MSGJPN360, "FFFTP", MB_OK | MB_ICONERROR);\r
+       }\r
        return(Ret);\r
 }\r
 \r
@@ -702,6 +736,10 @@ static int InitApp(LPSTR lpszCmdLine, int cmdShow)
                                        MakeButtonsFocus();\r
                                        DispTransferFiles();\r
 \r
+                                       // ソフトウェア自動更新\r
+                                       if(AutoCheckForUptatesInterval == 0)\r
+                                               UpdateSoftware(YES, AutoApplyUpdates);\r
+\r
                                        StartupProc(lpszCmdLine);\r
                                        sts = FFFTP_SUCCESS;\r
 \r
@@ -1026,14 +1064,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
@@ -1070,6 +1111,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(AutoCheckForUptatesInterval > 0 && time(NULL) - LastAutoCheckForUpdates >= AutoCheckForUptatesInterval * 86400)\r
+                                               UpdateSoftware(YES, AutoApplyUpdates);\r
+                               }\r
+                               break;\r
                        }\r
                        break;\r
 \r
@@ -1623,7 +1671,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
@@ -1695,7 +1743,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)\r
@@ -1708,6 +1756,11 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA
                                        }\r
                                        break;\r
 \r
+                               // ソフトウェア自動更新\r
+                               case MENU_UPDATES_CHECK :\r
+                                       UpdateSoftware(NO, NO);\r
+                                       break;\r
+\r
                                default :\r
                                        if((LOWORD(wParam) >= MENU_BMARK_TOP) &&\r
                                           (LOWORD(wParam) < MENU_BMARK_TOP+100))\r
@@ -1970,6 +2023,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
@@ -2209,19 +2264,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
@@ -2237,14 +2292,14 @@ static int AnalyzeComLine(char *Str, int *AutoConnect, int *CmdOption, char *unc
                        else if((strcmp(&Tmp[1], "u8n") == 0) || (strcmp(&Tmp[1], "-utf8name") == 0))\r
                                *CmdOption |= OPT_UTF8N_NAME;\r
                        // ソフトウェア自動更新\r
-                       else if(strcmp(Tmp, "--software-update") == 0)\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, "--software-cleanup") == 0)\r
+                       else if(strcmp(&Tmp[1], "-software-cleanup") == 0)\r
                        {\r
                                if((Str = GetToken(Str, Tmp)) == NULL)\r
                                {\r
@@ -2363,7 +2418,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
@@ -3574,3 +3629,42 @@ int AskToolWinHeight(void)
        return(ToolWinHeight);\r
 }\r
 \r
+// ソフトウェア自動更新\r
+void UpdateSoftware(int NoError, int NoConfirm)\r
+{\r
+       DWORD Version;\r
+       char VersionString[32];\r
+       char Tmp[FMAX_PATH+1];\r
+       // 念のためマスターパスワードの一致を確認\r
+       if(GetMasterPasswordStatus() == PASSWORD_OK)\r
+       {\r
+               Version = RELEASE_VERSION_NUM;\r
+               LastAutoCheckForUpdates = time(NULL);\r
+               if(CheckForUpdates(FALSE, NULL, &Version, VersionString))\r
+               {\r
+                       if(Version > RELEASE_VERSION_NUM)\r
+                       {\r
+                               sprintf(Tmp, MSGJPN362, VER_STR, VersionString);\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))\r
+                                       {\r
+                                               MessageBox(GetMainHwnd(), MSGJPN365, "FFFTP", MB_OK);\r
+                                               ApplyUpdatesOnExit = YES;\r
+                                       }\r
+                                       else if(NoError == NO)\r
+                                               MessageBox(GetMainHwnd(), MSGJPN363, "FFFTP", MB_OK | MB_ICONERROR);\r
+                               }\r
+                       }\r
+                       else if(NoError == NO)\r
+                               MessageBox(GetMainHwnd(), MSGJPN364, "FFFTP", MB_OK);\r
+               }\r
+               else if(NoError == NO)\r
+                       MessageBox(GetMainHwnd(), MSGJPN363, "FFFTP", MB_OK | MB_ICONERROR);\r
+       }\r
+}\r
+\r
index 8d24c3e..4eef568 100644 (file)
@@ -4,16 +4,16 @@
 #define MSGJPN003              _Tu8("\r\nReconnect.\r\n", "\r\nReconnect.\r\n")\r
 #define MSGJPN004              _Tu8("Disconnect.", "Disconnect.")\r
 #define MSGJPN005              _Tu8("Connection was killed.", "Connection was killed.")\r
-#define MSGJPN006              _Tu8("Can't login to Firewall.", "Can't login to Firewall.")\r
-#define MSGJPN007              _Tu8("Can't connect to host %s.", "Can't connect to host %s.")\r
-#define MSGJPN008              _Tu8("Can't login.", "Can't login.")\r
-#define MSGJPN009              _Tu8("Can't connect.", "Can't connect.")\r
+#define MSGJPN006              _Tu8("Cannnot login to Firewall.", "Cannnot login to Firewall.")\r
+#define MSGJPN007              _Tu8("Cannnot connect to host %s.", "Cannnot connect to host %s.")\r
+#define MSGJPN008              _Tu8("Cannnot login.", "Cannnot login.")\r
+#define MSGJPN009              _Tu8("Cannnot connect.", "Cannnot connect.")\r
 #define MSGJPN010              _Tu8("Firewall host not specified.", "Firewall host not specified.")\r
 #define MSGJPN011              _Tu8("Host not specified.", "Host not specified.")\r
 #define MSGJPN012              _Tu8("MD5 used.", "MD5 used.")\r
 #define MSGJPN013              _Tu8("SHA-1 used.", "SHA-1 used.")\r
 #define MSGJPN014              _Tu8("MD4(S/KEY) used.", "MD4(S/KEY) used.")\r
-#define MSGJPN015              _Tu8("Can't process One-time Password.", "Can't process One-time Password.")\r
+#define MSGJPN015              _Tu8("Cannnot process One-time Password.", "Cannnot process One-time Password.")\r
 #define MSGJPN016              _Tu8("Searching host %s. (%s)", "Searching host %s. (%s)")\r
 #define MSGJPN017              _Tu8("Connecting %sto host %s (%s (%d)). (%s)", "Connecting %sto host %s (%s (%d)). (%s)")\r
 #define MSGJPN018              _Tu8("Connecting %sto host %s (%d). (%s)", "Connecting %sto host %s (%d). (%s)")\r
 #define MSGJPN020              _Tu8("Connecting %sto host %s (%d). (%s)", "Connecting %sto host %s (%d). (%s)")\r
 #define MSGJPN021              _Tu8("SOCKS server %s not found. (%s)", "SOCKS server %s not found. (%s)")\r
 #define MSGJPN022              _Tu8("Connecting to SOCKS server %s (%d). (%s)", "Connecting to SOCKS server %s (%d). (%s)")\r
-#define MSGJPN023              _Tu8("Can't connect to SOCKS server. (Err=%d) (%s)", "Can't connect to SOCKS server. (Err=%d) (%s)")\r
-#define MSGJPN024              _Tu8("Can't connect to SOCKS server. (Err=%d) (%s)", "Can't connect to SOCKS server. (Err=%d) (%s)")\r
+#define MSGJPN023              _Tu8("Cannnot connect to SOCKS server. (Err=%d) (%s)", "Cannnot connect to SOCKS server. (Err=%d) (%s)")\r
+#define MSGJPN024              _Tu8("Cannnot connect to SOCKS server. (Err=%d) (%s)", "Cannnot connect to SOCKS server. (Err=%d) (%s)")\r
 #define MSGJPN025              _Tu8("Connected. (%s)", "Connected. (%s)")\r
-#define MSGJPN026              _Tu8("Can't connected. (%s)", "Can't connected. (%s)")\r
-#define MSGJPN027              _Tu8("Can't create socket. (%s)", "Can't create socket. (%s)")\r
-#define MSGJPN028              _Tu8("Can't connect to SOCKS server. (Err=%d) (%s)", "Can't connect to SOCKS server. (Err=%d) (%s)")\r
-#define MSGJPN029              _Tu8("Can't connect to SOCKS server. (Err=%d) (%s)", "Can't connect to SOCKS server. (Err=%d) (%s)")\r
-#define MSGJPN030              _Tu8("Can't create listen socket. (%s)", "Can't create listen socket. (%s)")\r
+#define MSGJPN026              _Tu8("Cannnot connected. (%s)", "Cannnot connected. (%s)")\r
+#define MSGJPN027              _Tu8("Cannnot create socket. (%s)", "Cannnot create socket. (%s)")\r
+#define MSGJPN028              _Tu8("Cannnot connect to SOCKS server. (Err=%d) (%s)", "Cannnot connect to SOCKS server. (Err=%d) (%s)")\r
+#define MSGJPN029              _Tu8("Cannnot connect to SOCKS server. (Err=%d) (%s)", "Cannnot connect to SOCKS server. (Err=%d) (%s)")\r
+#define MSGJPN030              _Tu8("Cannnot create listen socket. (%s)", "Cannnot create listen socket. (%s)")\r
 #define MSGJPN031              _Tu8("PORT command not accepted. (%s)", "PORT command not accepted. (%s)")\r
 #define MSGJPN032              _Tu8("Connection is cancelled by user.", "Connection is cancelled by user.")\r
-#define MSGJPN033              _Tu8("Can't send SOCKS command. (Cmd = %04X)", "Can't send SOCKS command. (Cmd = %04X)")\r
-#define MSGJPN034              _Tu8("Can't receive SOCKS5 reply.", "Can't receive SOCKS5 reply.")\r
-#define MSGJPN035              _Tu8("Can't receive SOCKS4 reply.", "Can't receive SOCKS4 reply.")\r
+#define MSGJPN033              _Tu8("Cannnot send SOCKS command. (Cmd = %04X)", "Cannnot send SOCKS command. (Cmd = %04X)")\r
+#define MSGJPN034              _Tu8("Cannnot receive SOCKS5 reply.", "Cannnot receive SOCKS5 reply.")\r
+#define MSGJPN035              _Tu8("Cannnot receive SOCKS4 reply.", "Cannnot receive SOCKS4 reply.")\r
 #define MSGJPN036              _Tu8("SOCKS certification method not match.", "SOCKS certification method not match.")\r
 #define MSGJPN037              _Tu8("Certification failed by SOCKS server.", "Certification failed by SOCKS server.")\r
 #define MSGJPN038              _Tu8("Name", "Name")\r
@@ -46,7 +46,7 @@
 #define MSGJPN045              _Tu8("Ext", "Ext")\r
 #define MSGJPN046              _Tu8("Permissions", "Permissions")\r
 #define MSGJPN047              _Tu8("Owner", "Owner")\r
-#define MSGJPN048              _Tu8("Can't read temporary file.", "Can't read temporary file.")\r
+#define MSGJPN048              _Tu8("Cannnot read temporary file.", "Cannnot read temporary file.")\r
 #define MSGJPN049              _Tu8("Failed to getting file list.", "Failed to getting file list.")\r
 #define MSGJPN050              _Tu8("Find (Local)", "Find (Local)")\r
 #define MSGJPN051              _Tu8("Find (Host)", "Find (Host)")\r
@@ -83,7 +83,7 @@
 #define MSGJPN082              _Tu8("New Folder", "New Folder")\r
 #define MSGJPN083              _Tu8("Delete Folder", "Delete Folder")\r
 #define MSGJPN084              _Tu8("Delete File", "Delete File")\r
-#define MSGJPN085              _Tu8("Can't download named %s.", "Can't download named %s.")\r
+#define MSGJPN085              _Tu8("Cannnot download named %s.", "Cannnot download named %s.")\r
 #define MSGJPN086              _Tu8("Download", "Download")\r
 #define MSGJPN087              _Tu8("File List", "File List")\r
 #define MSGJPN088              _Tu8("Skip", "Skip")\r
@@ -91,9 +91,9 @@
 #define MSGJPN090              _Tu8("Command not accepted.", "Command not accepted.")\r
 #define MSGJPN091              _Tu8("for download ", "for download ")\r
 #define MSGJPN092              _Tu8("Command not accepted.", "Command not accepted.")\r
-#define MSGJPN093              _Tu8("Can't get address.", "Can't get address.")\r
+#define MSGJPN093              _Tu8("Cannnot get address.", "Cannnot get address.")\r
 #define MSGJPN094              _Tu8("Time out error.", "Time out error.")\r
-#define MSGJPN095              _Tu8("Can't create file %s.", "Can't create file %s.")\r
+#define MSGJPN095              _Tu8("Cannnot create file %s.", "Cannnot create file %s.")\r
 #define MSGJPN096              _Tu8("Disk full", "Disk full")\r
 #define MSGJPN097              _Tu8("Cancel to getting file list", "Cancel to getting file list")\r
 #define MSGJPN098              _Tu8("File List", "File List")\r
 #define MSGJPN102              _Tu8("Download successful. (%d Sec. %d B/S).", "Download successful. (%d Sec. %d B/S).")\r
 #define MSGJPN103              _Tu8("Download successful. (%d Bytes)", "Download successful. (%d Bytes)")\r
 #define MSGJPN104              _Tu8("Upload", "Upload")\r
-#define MSGJPN105              _Tu8("Can't read file %s.", "Can't read file %s.")\r
+#define MSGJPN105              _Tu8("Cannnot read file %s.", "Cannnot read file %s.")\r
 #define MSGJPN106              _Tu8("Skip", "Skip")\r
 #define MSGJPN107              _Tu8("File %s is skipped.", "File %s is skipped.")\r
 #define MSGJPN108              _Tu8("Command not accepted.", "Command not accepted.")\r
 #define MSGJPN109              _Tu8("for upload ", "for upload ")\r
 #define MSGJPN110              _Tu8("Command not accepted.", "Command not accepted.")\r
-#define MSGJPN111              _Tu8("Can't get address.", "Can't get address.")\r
-#define MSGJPN112              _Tu8("Can't open file %s.", "Can't open file %s.")\r
+#define MSGJPN111              _Tu8("Cannnot get address.", "Cannnot get address.")\r
+#define MSGJPN112              _Tu8("Cannnot open file %s.", "Cannnot open file %s.")\r
 #define MSGJPN113              _Tu8("Upload cancelled. (%d Sec. %d B/S).", "Upload cancelled. (%d Sec. %d B/S).")\r
 #define MSGJPN114              _Tu8("Upload cancelled.", "Upload cancelled.")\r
 #define MSGJPN115              _Tu8("Upload successful. (%d Sec. %d B/S).", "Upload successful. (%d Sec. %d B/S).")\r
 #define MSGJPN142              _Tu8("IRMX", "IRMX")\r
 #define MSGJPN143              _Tu8("ACOS-4", "ACOS-4")\r
 #define MSGJPN144              _Tu8("Stratus", "Stratus")\r
-#define MSGJPN145              _Tu8("Can't change folder.", "Can't change folder.")\r
-#define MSGJPN146              _Tu8("Can't create folder.", "Can't create folder.")\r
-#define MSGJPN147              _Tu8("Can't delete folder.", "Can't delete folder.")\r
-#define MSGJPN148              _Tu8("Can't delete folder.", "Can't delete folder.")\r
-#define MSGJPN149              _Tu8("Can't delete file.", "Can't delete file.")\r
-#define MSGJPN150              _Tu8("Can't delete file.", "Can't delete file.")\r
-#define MSGJPN151              _Tu8("Can't rename file.", "Can't rename file.")\r
+#define MSGJPN145              _Tu8("Cannnot change folder.", "Cannnot change folder.")\r
+#define MSGJPN146              _Tu8("Cannnot create folder.", "Cannnot create folder.")\r
+#define MSGJPN147              _Tu8("Cannnot delete folder.", "Cannnot delete folder.")\r
+#define MSGJPN148              _Tu8("Cannnot delete folder.", "Cannnot delete folder.")\r
+#define MSGJPN149              _Tu8("Cannnot delete file.", "Cannnot delete file.")\r
+#define MSGJPN150              _Tu8("Cannnot delete file.", "Cannnot delete file.")\r
+#define MSGJPN151              _Tu8("Cannnot rename file.", "Cannnot rename file.")\r
 #define MSGJPN152              _Tu8("Temporary folder '%s' not found.", "Temporary folder '%s' not found.")\r
 #define MSGJPN153              _Tu8("Folder '%s' is used.", "Folder '%s' is used.")\r
 #define MSGJPN154              _Tu8("Connect", "Connect")\r
 #define MSGJPN219              _Tu8("Wave file", "Wave file")\r
 #define MSGJPN220              _Tu8("Disconencting dialup.", "Disconencting dialup.")\r
 #define MSGJPN221              _Tu8("Connecting dialup.", "Connecting dialup.")\r
-#define MSGJPN222              _Tu8("Can't use dialup. (RasDialDlg)", "Can't use dialup. (RasDialDlg)")\r
+#define MSGJPN222              _Tu8("Cannnot use dialup. (RasDialDlg)", "Cannnot use dialup. (RasDialDlg)")\r
 #define MSGJPN223              _Tu8("Connecting to %s...", "Connecting to %s...")\r
 #define MSGJPN224              _Tu8("Unknown error", "Unknown error")\r
 #define MSGJPN225              _Tu8("Dialup connection", "Dialup connection")\r
 #define MSGJPN237              _Tu8("Connecting...", "Connecting...")\r
 #define MSGJPN238              _Tu8("Connecting to %s", "Connecting to %s")\r
 #define MSGJPN239              _Tu8("# Do not edit this file.\n", "# Do not edit this file.\n")\r
-#define MSGJPN240              _Tu8("Can't save to INI file", "Can't save to INI file")\r
+#define MSGJPN240              _Tu8("Cannnot save to INI file", "Cannnot save to INI file")\r
 #define MSGJPN241              _Tu8("Failed transmit cause of timeout", "Failed transmit cause of timeout")\r
 #define MSGJPN242              _Tu8("Failed receive cause of timeout", "Failed receive cause of timeout")\r
 #define MSGJPN243              _Tu8("Failed receive cause of timeout", "Failed receive cause of timeout")\r
 #define MSGJPN276              _Tu8("WS_FTP.INI\0ws_ftp.ini\0All file(*.*)\0*\0", "WS_FTP.INI\0ws_ftp.ini\0All file(*.*)\0*\0")\r
 #define MSGJPN277              _Tu8("Wave file\0*.wav\0All file\0*\0", "Wave file\0*.wav\0All file\0*\0")\r
 #define MSGJPN278              _Tu8("Reason: %s", "Reason: %s")\r
-#define MSGJPN279              _Tu8("Can't get Listen Socket", "Can't get Listen Socket")\r
-#define MSGJPN280              _Tu8("Can't get Data Socket", "Can't get Data Socket")\r
-#define MSGJPN281              _Tu8("Can't connect with PASV mode", "Can't connect with PASV mode")\r
+#define MSGJPN279              _Tu8("Cannnot get Listen Socket", "Cannnot get Listen Socket")\r
+#define MSGJPN280              _Tu8("Cannnot get Data Socket", "Cannnot get Data Socket")\r
+#define MSGJPN281              _Tu8("Cannnot connect with PASV mode", "Cannnot connect with PASV mode")\r
 #define MSGJPN282              _Tu8("INI filename is not specified", "INI filename is not specified")\r
 #define MSGJPN283              _Tu8("INI file: ", "INI file: ")\r
 #define MSGJPN284              _Tu8("http://sourceforge.jp/projects/ffftp/", "http://sourceforge.jp/projects/ffftp/")\r
 #define MSGJPN358              _Tu8("Failed to export the settings.\nPlease change saving path or format.", "Failed to export the settings.\nPlease change saving path or format.")\r
 #define MSGJPN359              _Tu8("Software update has been completed.", "Software update has been completed.")\r
 #define MSGJPN360              _Tu8("Failed to update the software.\nPlease get the latest version from our web site and update it manually.", "Failed to update the software.\nPlease get the latest version from our web site and update it manually.")\r
+#define MSGJPN361              _Tu8("Updates", "Updates")\r
+#define MSGJPN362              _Tu8("There is a new version.\n\nCurrent version: %s\nNew version: %s\n\nIt takes a few minutes to download the updates.\nDo you want to update now?\n", "There is a new version.\n\nCurrent version: %s\nNew version: %s\n\nIt takes a few minutes to download the updates.\nDo you want to update now?\n")\r
+#define MSGJPN363              _Tu8("Failed to update the software.\nCannot connect to the server or the data is corrupted.", "Failed to update the software.\nCannot connect to the server or the data is corrupted.")\r
+#define MSGJPN364              _Tu8("Your version is already up-to-date.", "Your version is already up-to-date.")\r
+#define MSGJPN365              _Tu8("Preparing for the software update has been completed.\nIt will be applied on exit.", "Preparing for the software update has been completed.\nIt will be applied on exit.")\r
 #if defined(HAVE_TANDEM)\r
 #define MSGJPN2000             _Tu8("NonStop Server", "NonStop Server")\r
 #define MSGJPN2001             _Tu8("OSS<->GUARDIAN Switch(&O)", "OSS<->GUARDIAN Switch(&O)")\r
index 7e9e3b2..74fdad7 100644 (file)
 #define MSGJPN297              _Tu8("%s は不正なファイル名です.\r\nこのファイルはダウンロードされません.", "%s \xE3\x81\xAF\xE4\xB8\x8D\xE6\xAD\xA3\xE3\x81\xAA\xE3\x83\x95\xE3\x82\xA1\xE3\x82\xA4\xE3\x83\xAB\xE5\x90\x8D\xE3\x81\xA7\xE3\x81\x99.\r\n\xE3\x81\x93\xE3\x81\xAE\xE3\x83\x95\xE3\x82\xA1\xE3\x82\xA4\xE3\x83\xAB\xE3\x81\xAF\xE3\x83\x80\xE3\x82\xA6\xE3\x83\xB3\xE3\x83\xAD\xE3\x83\xBC\xE3\x83\x89\xE3\x81\x95\xE3\x82\x8C\xE3\x81\xBE\xE3\x81\x9B\xE3\x82\x93.")\r
 #define MSGJPN298              _Tu8("OLEの初期化に失敗しました.", "OLE\xE3\x81\xAE\xE5\x88\x9D\xE6\x9C\x9F\xE5\x8C\x96\xE3\x81\xAB\xE5\xA4\xB1\xE6\x95\x97\xE3\x81\x97\xE3\x81\xBE\xE3\x81\x97\xE3\x81\x9F.")\r
 #define MSGJPN299              _Tu8("コマンドラインにマスターパスワードが指定されていません", "\xE3\x82\xB3\xE3\x83\x9E\xE3\x83\xB3\xE3\x83\x89\xE3\x83\xA9\xE3\x82\xA4\xE3\x83\xB3\xE3\x81\xAB\xE3\x83\x9E\xE3\x82\xB9\xE3\x82\xBF\xE3\x83\xBC\xE3\x83\x91\xE3\x82\xB9\xE3\x83\xAF\xE3\x83\xBC\xE3\x83\x89\xE3\x81\x8C\xE6\x8C\x87\xE5\xAE\x9A\xE3\x81\x95\xE3\x82\x8C\xE3\x81\xA6\xE3\x81\x84\xE3\x81\xBE\xE3\x81\x9B\xE3\x82\x93")\r
-#define MSGJPN300              _Tu8("デフォルトのマスターパスワードが使われます.\r\nマルウェアの攻撃を防ぐため,固有のマスターパスワードを設定することをおすすめします", "\xE3\x83\x87\xE3\x83\x95\xE3\x82\xA9\xE3\x83\xAB\xE3\x83\x88\xE3\x81\xAE\xE3\x83\x9E\xE3\x82\xB9\xE3\x82\xBF\xE3\x83\xBC\xE3\x83\x91\xE3\x82\xB9\xE3\x83\xAF\xE3\x83\xBC\xE3\x83\x89\xE3\x81\x8C\xE4\xBD\xBF\xE3\x82\x8F\xE3\x82\x8C\xE3\x81\xBE\xE3\x81\x99.\r\n\xE3\x83\x9E\xE3\x83\xAB\xE3\x82\xA6\xE3\x82\xA7\xE3\x82\xA2\xE3\x81\xAE\xE6\x94\xBB\xE6\x92\x83\xE3\x82\x92\xE9\x98\xB2\xE3\x81\x90\xE3\x81\x9F\xE3\x82\x81\xEF\xBC\x8C\xE5\x9B\xBA\xE6\x9C\x89\xE3\x81\xAE\xE3\x83\x9E\xE3\x82\xB9\xE3\x82\xBF\xE3\x83\xBC\xE3\x83\x91\xE3\x82\xB9\xE3\x83\xAF\xE3\x83\xBC\xE3\x83\x89\xE3\x82\x92\xE8\xA8\xAD\xE5\xAE\x9A\xE3\x81\x99\xE3\x82\x8B\xE3\x81\x93\xE3\x81\xA8\xE3\x82\x92\xE3\x81\x8A\xE3\x81\x99\xE3\x81\x99\xE3\x82\x81\xE3\x81\x97\xE3\x81\xBE\xE3\x81\x99")\r
+#define MSGJPN300              _Tu8("デフォルトのマスターパスワードが使われます.\r\nマルウェアの攻撃を防ぐため,固有のマスターパスワードを設定することをおすすめします", "\xE3\x83\x87\xE3\x83\x95\xE3\x82\xA9\xE3\x83\xAB\xE3\x83\x88\xE3\x81\xAE\xE3\x83\x9E\xE3\x82\xB9\xE3\x82\xBF\xE3\x83\xBC\xE3\x83\x91\xE3\x82\xB9\xE3\x83\xAF\xE3\x83\xBC\xE3\x83\x89\xE3\x81\x8C\xE4\xBD\xBF\xE3\x82\x8F\xE3\x82\x8C\xE3\x81\xBE\xE3\x81\x99.\r\n\xE3\x83\x9E\xE3\x83\xAB\xE3\x82\xA6\xE3\x82\xA7\xE3\x82\xA2\xE3\x81\xAE\xE6\x94\xBB\xE6\x92\x83\xE3\x82\x92\xE9\x98\xB2\xE3\x81\x90\xE3\x81\x9F\xE3\x82\x81,\xE5\x9B\xBA\xE6\x9C\x89\xE3\x81\xAE\xE3\x83\x9E\xE3\x82\xB9\xE3\x82\xBF\xE3\x83\xBC\xE3\x83\x91\xE3\x82\xB9\xE3\x83\xAF\xE3\x83\xBC\xE3\x83\x89\xE3\x82\x92\xE8\xA8\xAD\xE5\xAE\x9A\xE3\x81\x99\xE3\x82\x8B\xE3\x81\x93\xE3\x81\xA8\xE3\x82\x92\xE3\x81\x8A\xE3\x81\x99\xE3\x81\x99\xE3\x82\x81\xE3\x81\x97\xE3\x81\xBE\xE3\x81\x99")\r
 #define MSGJPN301              _Tu8("マスターパスワードが設定と一致しません.安全のため設定の保存を行いません.", "\xE3\x83\x9E\xE3\x82\xB9\xE3\x82\xBF\xE3\x83\xBC\xE3\x83\x91\xE3\x82\xB9\xE3\x83\xAF\xE3\x83\xBC\xE3\x83\x89\xE3\x81\x8C\xE8\xA8\xAD\xE5\xAE\x9A\xE3\x81\xA8\xE4\xB8\x80\xE8\x87\xB4\xE3\x81\x97\xE3\x81\xBE\xE3\x81\x9B\xE3\x82\x93.\xE5\xAE\x89\xE5\x85\xA8\xE3\x81\xAE\xE3\x81\x9F\xE3\x82\x81\xE8\xA8\xAD\xE5\xAE\x9A\xE3\x81\xAE\xE4\xBF\x9D\xE5\xAD\x98\xE3\x82\x92\xE8\xA1\x8C\xE3\x81\x84\xE3\x81\xBE\xE3\x81\x9B\xE3\x82\x93.")\r
-#define MSGJPN302              _Tu8("確認用データが壊れているため,マスターパスワードの正当性を確認できませんでした.", "\xE7\xA2\xBA\xE8\xAA\x8D\xE7\x94\xA8\xE3\x83\x87\xE3\x83\xBC\xE3\x82\xBF\xE3\x81\x8C\xE5\xA3\x8A\xE3\x82\x8C\xE3\x81\xA6\xE3\x81\x84\xE3\x82\x8B\xE3\x81\x9F\xE3\x82\x81\xEF\xBC\x8C\xE3\x83\x9E\xE3\x82\xB9\xE3\x82\xBF\xE3\x83\xBC\xE3\x83\x91\xE3\x82\xB9\xE3\x83\xAF\xE3\x83\xBC\xE3\x83\x89\xE3\x81\xAE\xE6\xAD\xA3\xE5\xBD\x93\xE6\x80\xA7\xE3\x82\x92\xE7\xA2\xBA\xE8\xAA\x8D\xE3\x81\xA7\xE3\x81\x8D\xE3\x81\xBE\xE3\x81\x9B\xE3\x82\x93\xE3\x81\xA7\xE3\x81\x97\xE3\x81\x9F.")\r
+#define MSGJPN302              _Tu8("確認用データが壊れているため,マスターパスワードの正当性を確認できませんでした.", "\xE7\xA2\xBA\xE8\xAA\x8D\xE7\x94\xA8\xE3\x83\x87\xE3\x83\xBC\xE3\x82\xBF\xE3\x81\x8C\xE5\xA3\x8A\xE3\x82\x8C\xE3\x81\xA6\xE3\x81\x84\xE3\x82\x8B\xE3\x81\x9F\xE3\x82\x81,\xE3\x83\x9E\xE3\x82\xB9\xE3\x82\xBF\xE3\x83\xBC\xE3\x83\x91\xE3\x82\xB9\xE3\x83\xAF\xE3\x83\xBC\xE3\x83\x89\xE3\x81\xAE\xE6\xAD\xA3\xE5\xBD\x93\xE6\x80\xA7\xE3\x82\x92\xE7\xA2\xBA\xE8\xAA\x8D\xE3\x81\xA7\xE3\x81\x8D\xE3\x81\xBE\xE3\x81\x9B\xE3\x82\x93\xE3\x81\xA7\xE3\x81\x97\xE3\x81\x9F.")\r
 #define MSGJPN303              _Tu8("マスターパスワードを変更しました", "\xE3\x83\x9E\xE3\x82\xB9\xE3\x82\xBF\xE3\x83\xBC\xE3\x83\x91\xE3\x82\xB9\xE3\x83\xAF\xE3\x83\xBC\xE3\x83\x89\xE3\x82\x92\xE5\xA4\x89\xE6\x9B\xB4\xE3\x81\x97\xE3\x81\xBE\xE3\x81\x97\xE3\x81\x9F")\r
 #define MSGJPN304              _Tu8("指定されたマスターパスワードが登録されたものと一致しません.\r\n再度入力しますか?\r\n「いいえ」を選ぶと記憶されたFTPパスワードは利用できません.", "\xE6\x8C\x87\xE5\xAE\x9A\xE3\x81\x95\xE3\x82\x8C\xE3\x81\x9F\xE3\x83\x9E\xE3\x82\xB9\xE3\x82\xBF\xE3\x83\xBC\xE3\x83\x91\xE3\x82\xB9\xE3\x83\xAF\xE3\x83\xBC\xE3\x83\x89\xE3\x81\x8C\xE7\x99\xBB\xE9\x8C\xB2\xE3\x81\x95\xE3\x82\x8C\xE3\x81\x9F\xE3\x82\x82\xE3\x81\xAE\xE3\x81\xA8\xE4\xB8\x80\xE8\x87\xB4\xE3\x81\x97\xE3\x81\xBE\xE3\x81\x9B\xE3\x82\x93.\r\n\xE5\x86\x8D\xE5\xBA\xA6\xE5\x85\xA5\xE5\x8A\x9B\xE3\x81\x97\xE3\x81\xBE\xE3\x81\x99\xE3\x81\x8B\xEF\xBC\x9F\r\n\xE3\x80\x8C\xE3\x81\x84\xE3\x81\x84\xE3\x81\x88\xE3\x80\x8D\xE3\x82\x92\xE9\x81\xB8\xE3\x81\xB6\xE3\x81\xA8\xE8\xA8\x98\xE6\x86\xB6\xE3\x81\x95\xE3\x82\x8C\xE3\x81\x9F\x46TP\xE3\x83\x91\xE3\x82\xB9\xE3\x83\xAF\xE3\x83\xBC\xE3\x83\x89\xE3\x81\xAF\xE5\x88\xA9\xE7\x94\xA8\xE3\x81\xA7\xE3\x81\x8D\xE3\x81\xBE\xE3\x81\x9B\xE3\x82\x93.")\r
 #define MSGJPN305              _Tu8("Shift_JIS", "Shift_JIS")\r
 #define MSGJPN348              _Tu8("EUC", "EUC")\r
 #define MSGJPN349              _Tu8("UTF-8", "UTF-8")\r
 #define MSGJPN350              _Tu8("UTF-8 HFS+", "UTF-8 HFS+")\r
-#define MSGJPN351              _Tu8("新しいバージョンの設定が検出されました.\nこのバージョンでは一部の設定が正しく読み込まれない、またはこのバージョンで設定を上書きすると設定が変化する可能性があります.\nこのバージョン用に設定を上書きして保存するには「はい」を選択してください.\n設定をレジストリではなくINIファイルに保存するには「いいえ」を選択してください.\n読み取り専用で設定を読み込むには「キャンセル」を選択してください.", "\xE6\x96\xB0\xE3\x81\x97\xE3\x81\x84\xE3\x83\x90\xE3\x83\xBC\xE3\x82\xB8\xE3\x83\xA7\xE3\x83\xB3\xE3\x81\xAE\xE8\xA8\xAD\xE5\xAE\x9A\xE3\x81\x8C\xE6\xA4\x9C\xE5\x87\xBA\xE3\x81\x95\xE3\x82\x8C\xE3\x81\xBE\xE3\x81\x97\xE3\x81\x9F.\n\xE3\x81\x93\xE3\x81\xAE\xE3\x83\x90\xE3\x83\xBC\xE3\x82\xB8\xE3\x83\xA7\xE3\x83\xB3\xE3\x81\xA7\xE3\x81\xAF\xE4\xB8\x80\xE9\x83\xA8\xE3\x81\xAE\xE8\xA8\xAD\xE5\xAE\x9A\xE3\x81\x8C\xE6\xAD\xA3\xE3\x81\x97\xE3\x81\x8F\xE8\xAA\xAD\xE3\x81\xBF\xE8\xBE\xBC\xE3\x81\xBE\xE3\x82\x8C\xE3\x81\xAA\xE3\x81\x84\xE3\x80\x81\xE3\x81\xBE\xE3\x81\x9F\xE3\x81\xAF\xE3\x81\x93\xE3\x81\xAE\xE3\x83\x90\xE3\x83\xBC\xE3\x82\xB8\xE3\x83\xA7\xE3\x83\xB3\xE3\x81\xA7\xE8\xA8\xAD\xE5\xAE\x9A\xE3\x82\x92\xE4\xB8\x8A\xE6\x9B\xB8\xE3\x81\x8D\xE3\x81\x99\xE3\x82\x8B\xE3\x81\xA8\xE8\xA8\xAD\xE5\xAE\x9A\xE3\x81\x8C\xE5\xA4\x89\xE5\x8C\x96\xE3\x81\x99\xE3\x82\x8B\xE5\x8F\xAF\xE8\x83\xBD\xE6\x80\xA7\xE3\x81\x8C\xE3\x81\x82\xE3\x82\x8A\xE3\x81\xBE\xE3\x81\x99.\n\xE3\x81\x93\xE3\x81\xAE\xE3\x83\x90\xE3\x83\xBC\xE3\x82\xB8\xE3\x83\xA7\xE3\x83\xB3\xE7\x94\xA8\xE3\x81\xAB\xE8\xA8\xAD\xE5\xAE\x9A\xE3\x82\x92\xE4\xB8\x8A\xE6\x9B\xB8\xE3\x81\x8D\xE3\x81\x97\xE3\x81\xA6\xE4\xBF\x9D\xE5\xAD\x98\xE3\x81\x99\xE3\x82\x8B\xE3\x81\xAB\xE3\x81\xAF\xE3\x80\x8C\xE3\x81\xAF\xE3\x81\x84\xE3\x80\x8D\xE3\x82\x92\xE9\x81\xB8\xE6\x8A\x9E\xE3\x81\x97\xE3\x81\xA6\xE3\x81\x8F\xE3\x81\xA0\xE3\x81\x95\xE3\x81\x84.\n\xE8\xA8\xAD\xE5\xAE\x9A\xE3\x82\x92\xE3\x83\xAC\xE3\x82\xB8\xE3\x82\xB9\xE3\x83\x88\xE3\x83\xAA\xE3\x81\xA7\xE3\x81\xAF\xE3\x81\xAA\xE3\x81\x8FINI\xE3\x83\x95\xE3\x82\xA1\xE3\x82\xA4\xE3\x83\xAB\xE3\x81\xAB\xE4\xBF\x9D\xE5\xAD\x98\xE3\x81\x99\xE3\x82\x8B\xE3\x81\xAB\xE3\x81\xAF\xE3\x80\x8C\xE3\x81\x84\xE3\x81\x84\xE3\x81\x88\xE3\x80\x8D\xE3\x82\x92\xE9\x81\xB8\xE6\x8A\x9E\xE3\x81\x97\xE3\x81\xA6\xE3\x81\x8F\xE3\x81\xA0\xE3\x81\x95\xE3\x81\x84.\n\xE8\xAA\xAD\xE3\x81\xBF\xE5\x8F\x96\xE3\x82\x8A\xE5\xB0\x82\xE7\x94\xA8\xE3\x81\xA7\xE8\xA8\xAD\xE5\xAE\x9A\xE3\x82\x92\xE8\xAA\xAD\xE3\x81\xBF\xE8\xBE\xBC\xE3\x82\x80\xE3\x81\xAB\xE3\x81\xAF\xE3\x80\x8C\xE3\x82\xAD\xE3\x83\xA3\xE3\x83\xB3\xE3\x82\xBB\xE3\x83\xAB\xE3\x80\x8D\xE3\x82\x92\xE9\x81\xB8\xE6\x8A\x9E\xE3\x81\x97\xE3\x81\xA6\xE3\x81\x8F\xE3\x81\xA0\xE3\x81\x95\xE3\x81\x84.")\r
+#define MSGJPN351              _Tu8("新しいバージョンの設定が検出されました.\nこのバージョンでは一部の設定が正しく読み込まれない,またはこのバージョンで設定を上書きすると設定が変化する可能性があります.\nこのバージョン用に設定を上書きして保存するには「はい」を選択してください.\n設定をレジストリではなくINIファイルに保存するには「いいえ」を選択してください.\n読み取り専用で設定を読み込むには「キャンセル」を選択してください.", "\xE6\x96\xB0\xE3\x81\x97\xE3\x81\x84\xE3\x83\x90\xE3\x83\xBC\xE3\x82\xB8\xE3\x83\xA7\xE3\x83\xB3\xE3\x81\xAE\xE8\xA8\xAD\xE5\xAE\x9A\xE3\x81\x8C\xE6\xA4\x9C\xE5\x87\xBA\xE3\x81\x95\xE3\x82\x8C\xE3\x81\xBE\xE3\x81\x97\xE3\x81\x9F.\n\xE3\x81\x93\xE3\x81\xAE\xE3\x83\x90\xE3\x83\xBC\xE3\x82\xB8\xE3\x83\xA7\xE3\x83\xB3\xE3\x81\xA7\xE3\x81\xAF\xE4\xB8\x80\xE9\x83\xA8\xE3\x81\xAE\xE8\xA8\xAD\xE5\xAE\x9A\xE3\x81\x8C\xE6\xAD\xA3\xE3\x81\x97\xE3\x81\x8F\xE8\xAA\xAD\xE3\x81\xBF\xE8\xBE\xBC\xE3\x81\xBE\xE3\x82\x8C\xE3\x81\xAA\xE3\x81\x84,\xE3\x81\xBE\xE3\x81\x9F\xE3\x81\xAF\xE3\x81\x93\xE3\x81\xAE\xE3\x83\x90\xE3\x83\xBC\xE3\x82\xB8\xE3\x83\xA7\xE3\x83\xB3\xE3\x81\xA7\xE8\xA8\xAD\xE5\xAE\x9A\xE3\x82\x92\xE4\xB8\x8A\xE6\x9B\xB8\xE3\x81\x8D\xE3\x81\x99\xE3\x82\x8B\xE3\x81\xA8\xE8\xA8\xAD\xE5\xAE\x9A\xE3\x81\x8C\xE5\xA4\x89\xE5\x8C\x96\xE3\x81\x99\xE3\x82\x8B\xE5\x8F\xAF\xE8\x83\xBD\xE6\x80\xA7\xE3\x81\x8C\xE3\x81\x82\xE3\x82\x8A\xE3\x81\xBE\xE3\x81\x99.\n\xE3\x81\x93\xE3\x81\xAE\xE3\x83\x90\xE3\x83\xBC\xE3\x82\xB8\xE3\x83\xA7\xE3\x83\xB3\xE7\x94\xA8\xE3\x81\xAB\xE8\xA8\xAD\xE5\xAE\x9A\xE3\x82\x92\xE4\xB8\x8A\xE6\x9B\xB8\xE3\x81\x8D\xE3\x81\x97\xE3\x81\xA6\xE4\xBF\x9D\xE5\xAD\x98\xE3\x81\x99\xE3\x82\x8B\xE3\x81\xAB\xE3\x81\xAF\xE3\x80\x8C\xE3\x81\xAF\xE3\x81\x84\xE3\x80\x8D\xE3\x82\x92\xE9\x81\xB8\xE6\x8A\x9E\xE3\x81\x97\xE3\x81\xA6\xE3\x81\x8F\xE3\x81\xA0\xE3\x81\x95\xE3\x81\x84.\n\xE8\xA8\xAD\xE5\xAE\x9A\xE3\x82\x92\xE3\x83\xAC\xE3\x82\xB8\xE3\x82\xB9\xE3\x83\x88\xE3\x83\xAA\xE3\x81\xA7\xE3\x81\xAF\xE3\x81\xAA\xE3\x81\x8FINI\xE3\x83\x95\xE3\x82\xA1\xE3\x82\xA4\xE3\x83\xAB\xE3\x81\xAB\xE4\xBF\x9D\xE5\xAD\x98\xE3\x81\x99\xE3\x82\x8B\xE3\x81\xAB\xE3\x81\xAF\xE3\x80\x8C\xE3\x81\x84\xE3\x81\x84\xE3\x81\x88\xE3\x80\x8D\xE3\x82\x92\xE9\x81\xB8\xE6\x8A\x9E\xE3\x81\x97\xE3\x81\xA6\xE3\x81\x8F\xE3\x81\xA0\xE3\x81\x95\xE3\x81\x84.\n\xE8\xAA\xAD\xE3\x81\xBF\xE5\x8F\x96\xE3\x82\x8A\xE5\xB0\x82\xE7\x94\xA8\xE3\x81\xA7\xE8\xA8\xAD\xE5\xAE\x9A\xE3\x82\x92\xE8\xAA\xAD\xE3\x81\xBF\xE8\xBE\xBC\xE3\x82\x80\xE3\x81\xAB\xE3\x81\xAF\xE3\x80\x8C\xE3\x82\xAD\xE3\x83\xA3\xE3\x83\xB3\xE3\x82\xBB\xE3\x83\xAB\xE3\x80\x8D\xE3\x82\x92\xE9\x81\xB8\xE6\x8A\x9E\xE3\x81\x97\xE3\x81\xA6\xE3\x81\x8F\xE3\x81\xA0\xE3\x81\x95\xE3\x81\x84.")\r
 #define MSGJPN352              _Tu8("警告: 暗号化されていません", "\xE8\xAD\xA6\xE5\x91\x8A: \xE6\x9A\x97\xE5\x8F\xB7\xE5\x8C\x96\xE3\x81\x95\xE3\x82\x8C\xE3\x81\xA6\xE3\x81\x84\xE3\x81\xBE\xE3\x81\x9B\xE3\x82\x93")\r
 #define MSGJPN353              _Tu8("暗号化されています: FTPES", "\xE6\x9A\x97\xE5\x8F\xB7\xE5\x8C\x96\xE3\x81\x95\xE3\x82\x8C\xE3\x81\xA6\xE3\x81\x84\xE3\x81\xBE\xE3\x81\x99: FTPES")\r
 #define MSGJPN354              _Tu8("暗号化されています: FTPIS", "\xE6\x9A\x97\xE5\x8F\xB7\xE5\x8C\x96\xE3\x81\x95\xE3\x82\x8C\xE3\x81\xA6\xE3\x81\x84\xE3\x81\xBE\xE3\x81\x99: FTPIS")\r
 #define MSGJPN358              _Tu8("設定のエクスポートに失敗しました.\n保存する場所や形式を変更してください.", "\xE8\xA8\xAD\xE5\xAE\x9A\xE3\x81\xAE\xE3\x82\xA8\xE3\x82\xAF\xE3\x82\xB9\xE3\x83\x9D\xE3\x83\xBC\xE3\x83\x88\xE3\x81\xAB\xE5\xA4\xB1\xE6\x95\x97\xE3\x81\x97\xE3\x81\xBE\xE3\x81\x97\xE3\x81\x9F.\n\xE4\xBF\x9D\xE5\xAD\x98\xE3\x81\x99\xE3\x82\x8B\xE5\xA0\xB4\xE6\x89\x80\xE3\x82\x84\xE5\xBD\xA2\xE5\xBC\x8F\xE3\x82\x92\xE5\xA4\x89\xE6\x9B\xB4\xE3\x81\x97\xE3\x81\xA6\xE3\x81\x8F\xE3\x81\xA0\xE3\x81\x95\xE3\x81\x84.")\r
 #define MSGJPN359              _Tu8("ソフトウェアの更新が完了しました.", "\xE3\x82\xBD\xE3\x83\x95\xE3\x83\x88\xE3\x82\xA6\xE3\x82\xA7\xE3\x82\xA2\xE3\x81\xAE\xE6\x9B\xB4\xE6\x96\xB0\xE3\x81\x8C\xE5\xAE\x8C\xE4\xBA\x86\xE3\x81\x97\xE3\x81\xBE\xE3\x81\x97\xE3\x81\x9F.")\r
 #define MSGJPN360              _Tu8("ソフトウェアの更新に失敗しました.\nWebサイトから最新版を入手して手動で更新してください.", "\xE3\x82\xBD\xE3\x83\x95\xE3\x83\x88\xE3\x82\xA6\xE3\x82\xA7\xE3\x82\xA2\xE3\x81\xAE\xE6\x9B\xB4\xE6\x96\xB0\xE3\x81\xAB\xE5\xA4\xB1\xE6\x95\x97\xE3\x81\x97\xE3\x81\xBE\xE3\x81\x97\xE3\x81\x9F.\nWeb\xE3\x82\xB5\xE3\x82\xA4\xE3\x83\x88\xE3\x81\x8B\xE3\x82\x89\xE6\x9C\x80\xE6\x96\xB0\xE7\x89\x88\xE3\x82\x92\xE5\x85\xA5\xE6\x89\x8B\xE3\x81\x97\xE3\x81\xA6\xE6\x89\x8B\xE5\x8B\x95\xE3\x81\xA7\xE6\x9B\xB4\xE6\x96\xB0\xE3\x81\x97\xE3\x81\xA6\xE3\x81\x8F\xE3\x81\xA0\xE3\x81\x95\xE3\x81\x84.")\r
+#define MSGJPN361              _Tu8("更新", "\xE6\x9B\xB4\xE6\x96\xB0")\r
+#define MSGJPN362              _Tu8("新しいバージョンがあります.\n\n現在のバージョン: %s\n新しいバージョン: %s\n\n更新のダウンロードには数分間かかります.\n今すぐ更新しますか.", "\xE6\x96\xB0\xE3\x81\x97\xE3\x81\x84\xE3\x83\x90\xE3\x83\xBC\xE3\x82\xB8\xE3\x83\xA7\xE3\x83\xB3\xE3\x81\x8C\xE3\x81\x82\xE3\x82\x8A\xE3\x81\xBE\xE3\x81\x99.\n\n\xE7\x8F\xBE\xE5\x9C\xA8\xE3\x81\xAE\xE3\x83\x90\xE3\x83\xBC\xE3\x82\xB8\xE3\x83\xA7\xE3\x83\xB3: %s\n\xE6\x96\xB0\xE3\x81\x97\xE3\x81\x84\xE3\x83\x90\xE3\x83\xBC\xE3\x82\xB8\xE3\x83\xA7\xE3\x83\xB3: %s\n\n\xE6\x9B\xB4\xE6\x96\xB0\xE3\x81\xAE\xE3\x83\x80\xE3\x82\xA6\xE3\x83\xB3\xE3\x83\xAD\xE3\x83\xBC\xE3\x83\x89\xE3\x81\xAB\xE3\x81\xAF\xE6\x95\xB0\xE5\x88\x86\xE9\x96\x93\xE3\x81\x8B\xE3\x81\x8B\xE3\x82\x8A\xE3\x81\xBE\xE3\x81\x99.\n\xE4\xBB\x8A\xE3\x81\x99\xE3\x81\x90\xE6\x9B\xB4\xE6\x96\xB0\xE3\x81\x97\xE3\x81\xBE\xE3\x81\x99\xE3\x81\x8B.")\r
+#define MSGJPN363              _Tu8("ソフトウェアの更新に失敗しました.\nサーバーに接続できないかデータが破損しています.", "\xE3\x82\xBD\xE3\x83\x95\xE3\x83\x88\xE3\x82\xA6\xE3\x82\xA7\xE3\x82\xA2\xE3\x81\xAE\xE6\x9B\xB4\xE6\x96\xB0\xE3\x81\xAB\xE5\xA4\xB1\xE6\x95\x97\xE3\x81\x97\xE3\x81\xBE\xE3\x81\x97\xE3\x81\x9F.\n\xE3\x82\xB5\xE3\x83\xBC\xE3\x83\x90\xE3\x83\xBC\xE3\x81\xAB\xE6\x8E\xA5\xE7\xB6\x9A\xE3\x81\xA7\xE3\x81\x8D\xE3\x81\xAA\xE3\x81\x84\xE3\x81\x8B\xE3\x83\x87\xE3\x83\xBC\xE3\x82\xBF\xE3\x81\x8C\xE7\xA0\xB4\xE6\x90\x8D\xE3\x81\x97\xE3\x81\xA6\xE3\x81\x84\xE3\x81\xBE\xE3\x81\x99.")\r
+#define MSGJPN364              _Tu8("お使いのバージョンはすでに最新です.", "\xE3\x81\x8A\xE4\xBD\xBF\xE3\x81\x84\xE3\x81\xAE\xE3\x83\x90\xE3\x83\xBC\xE3\x82\xB8\xE3\x83\xA7\xE3\x83\xB3\xE3\x81\xAF\xE3\x81\x99\xE3\x81\xA7\xE3\x81\xAB\xE6\x9C\x80\xE6\x96\xB0\xE3\x81\xA7\xE3\x81\x99.")\r
+#define MSGJPN365              _Tu8("ソフトウェアの更新の準備が完了しました.\nFFFTPの終了時に更新が適用されます.", "\xE3\x82\xBD\xE3\x83\x95\xE3\x83\x88\xE3\x82\xA6\xE3\x82\xA7\xE3\x82\xA2\xE3\x81\xAE\xE6\x9B\xB4\xE6\x96\xB0\xE3\x81\xAE\xE6\xBA\x96\xE5\x82\x99\xE3\x81\x8C\xE5\xAE\x8C\xE4\xBA\x86\xE3\x81\x97\xE3\x81\xBE\xE3\x81\x97\xE3\x81\x9F.\nFFFTP\xE3\x81\xAE\xE7\xB5\x82\xE4\xBA\x86\xE6\x99\x82\xE3\x81\xAB\xE6\x9B\xB4\xE6\x96\xB0\xE3\x81\x8C\xE9\x81\xA9\xE7\x94\xA8\xE3\x81\x95\xE3\x82\x8C\xE3\x81\xBE\xE3\x81\x99.")\r
 #if defined(HAVE_TANDEM)\r
 #define MSGJPN2000             _Tu8("NonStop Server", "NonStop Server")\r
 #define MSGJPN2001             _Tu8("OSS<->GUARDIAN 切り替え(&O)", "OSS<->GUARDIAN \xE5\x88\x87\xE3\x82\x8A\xE6\x9B\xBF\xE3\x81\x88(&O)")\r
diff --git a/misc.c b/misc.c
index 6a9e479..8cdc436 100644 (file)
--- a/misc.c
+++ b/misc.c
@@ -1422,7 +1422,7 @@ void FormatIniString(char *Str)
 \r
        while(*Str != NUL)\r
        {\r
-               if((*Str != 0x22) && (*Str != '\n'))\r
+               if((*Str != '\"') && (*Str != '\n'))\r
                        *Put++ = *Str;\r
                Str++;\r
        }\r
index fa7246a..9b22034 100644 (file)
--- a/option.c
+++ b/option.c
@@ -88,6 +88,8 @@ static INT_PTR CALLBACK ToolSettingProc(HWND hDlg, UINT message, WPARAM wParam,
 static INT_PTR CALLBACK SoundSettingProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);\r
 static INT_PTR CALLBACK MiscSettingProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);\r
 static INT_PTR CALLBACK SortSettingProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);\r
+// ソフトウェア自動更新\r
+static INT_PTR CALLBACK UpdatesSettingProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);\r
 // hostman.cで使用\r
 //static int GetDecimalText(HWND hDlg, int Ctrl);\r
 //static void SetDecimalText(HWND hDlg, int Ctrl, int Num);\r
@@ -186,6 +188,10 @@ extern int EncryptAllSettings;
 extern int AutoRefreshFileList;\r
 // 古い処理内容を消去\r
 extern int RemoveOldLog;\r
+// ソフトウェア自動更新\r
+extern int AutoCheckForUpdates;\r
+extern int AutoApplyUpdates;\r
+extern int AutoCheckForUptatesInterval;\r
 \r
 \r
 /*----- オプションのプロパティシート ------------------------------------------\r
@@ -201,7 +207,7 @@ void SetOption(int Start)
 {\r
        // UTF-8対応\r
 //     PROPSHEETPAGE psp[12];\r
-       PROPSHEETPAGE psp[14];\r
+       PROPSHEETPAGE psp[15];\r
        PROPSHEETHEADER psh;\r
 \r
        // 変数が未初期化のバグ修正\r
@@ -422,13 +428,23 @@ void SetOption(int Start)
        psp[13].dwSize = sizeof(PROPSHEETPAGE);\r
        psp[13].dwFlags = PSP_USETITLE | PSP_HASHELP;\r
        psp[13].hInstance = GetFtpInst();\r
-       psp[13].pszTemplate = MAKEINTRESOURCE(opt_misc_dlg);\r
+       psp[13].pszTemplate = MAKEINTRESOURCE(opt_updates_dlg);\r
        psp[13].pszIcon = NULL;\r
-       psp[13].pfnDlgProc = MiscSettingProc;\r
-       psp[13].pszTitle = MSGJPN197;\r
+       psp[13].pfnDlgProc = UpdatesSettingProc;\r
+       psp[13].pszTitle = MSGJPN361;\r
        psp[13].lParam = 0;\r
        psp[13].pfnCallback = NULL;\r
 \r
+       psp[14].dwSize = sizeof(PROPSHEETPAGE);\r
+       psp[14].dwFlags = PSP_USETITLE | PSP_HASHELP;\r
+       psp[14].hInstance = GetFtpInst();\r
+       psp[14].pszTemplate = MAKEINTRESOURCE(opt_misc_dlg);\r
+       psp[14].pszIcon = NULL;\r
+       psp[14].pfnDlgProc = MiscSettingProc;\r
+       psp[14].pszTitle = MSGJPN197;\r
+       psp[14].lParam = 0;\r
+       psp[14].pfnCallback = NULL;\r
+\r
        psh.dwSize = sizeof(PROPSHEETHEADER);\r
        psh.dwFlags = PSH_HASHELP | PSH_NOAPPLYNOW | PSH_PROPSHEETPAGE;\r
        psh.hwndParent = GetMainHwnd();\r
@@ -1932,6 +1948,76 @@ static INT_PTR CALLBACK SortSettingProc(HWND hDlg, UINT message, WPARAM wParam,
 }\r
 \r
 \r
+// ソフトウェア自動更新\r
+static INT_PTR CALLBACK UpdatesSettingProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)\r
+{\r
+       NMHDR *pnmhdr;\r
+\r
+       switch (message)\r
+       {\r
+               case WM_INITDIALOG :\r
+                       SendDlgItemMessage(hDlg, UPDATES_AUTO_CHECK, BM_SETCHECK, AutoCheckForUpdates, 0);\r
+                       SendDlgItemMessage(hDlg, UPDATES_AUTO_APPLY, BM_SETCHECK, AutoApplyUpdates, 0);\r
+                       SendDlgItemMessage(hDlg, UPDATES_INTERVAL, EM_LIMITTEXT, (WPARAM)3, 0);\r
+                       SetDecimalText(hDlg, UPDATES_INTERVAL, AutoCheckForUptatesInterval);\r
+                       SendDlgItemMessage(hDlg, UPDATES_INTERVAL_SPN, UDM_SETRANGE, 0, (LPARAM)MAKELONG(999, 0));\r
+                       if(AutoCheckForUpdates == YES)\r
+                       {\r
+                               EnableWindow(GetDlgItem(hDlg, UPDATES_AUTO_APPLY), TRUE);\r
+                               EnableWindow(GetDlgItem(hDlg, UPDATES_INTERVAL), TRUE);\r
+                               EnableWindow(GetDlgItem(hDlg, UPDATES_INTERVAL_SPN), TRUE);\r
+                       }\r
+                       else\r
+                       {\r
+                               EnableWindow(GetDlgItem(hDlg, UPDATES_AUTO_APPLY), FALSE);\r
+                               EnableWindow(GetDlgItem(hDlg, UPDATES_INTERVAL), FALSE);\r
+                               EnableWindow(GetDlgItem(hDlg, UPDATES_INTERVAL_SPN), FALSE);\r
+                       }\r
+                   return(TRUE);\r
+\r
+               case WM_NOTIFY:\r
+                       pnmhdr = (NMHDR FAR *)lParam;\r
+                       switch(pnmhdr->code)\r
+                       {\r
+                               case PSN_APPLY :\r
+                                       AutoCheckForUpdates = SendDlgItemMessage(hDlg, UPDATES_AUTO_CHECK, BM_GETCHECK, 0, 0);\r
+                                       AutoApplyUpdates = SendDlgItemMessage(hDlg, UPDATES_AUTO_APPLY, BM_GETCHECK, 0, 0);\r
+                                       AutoCheckForUptatesInterval = GetDecimalText(hDlg, UPDATES_INTERVAL);\r
+                                       CheckRange2(&AutoCheckForUptatesInterval, 999, 0);\r
+                                       break;\r
+\r
+                               case PSN_RESET :\r
+                                       break;\r
+\r
+                               case PSN_HELP :\r
+//                                     hHelpWin = HtmlHelp(NULL, AskHelpFilePath(), HH_HELP_CONTEXT, IDH_HELP_TOPIC_0000069);\r
+                                       break;\r
+                       }\r
+                       break;\r
+\r
+               case WM_COMMAND :\r
+                       switch(GET_WM_COMMAND_ID(wParam, lParam))\r
+                       {\r
+                               case UPDATES_AUTO_CHECK :\r
+                                       if(SendDlgItemMessage(hDlg, UPDATES_AUTO_CHECK, BM_GETCHECK, 0, 0) == 1)\r
+                                       {\r
+                                               EnableWindow(GetDlgItem(hDlg, UPDATES_AUTO_APPLY), TRUE);\r
+                                               EnableWindow(GetDlgItem(hDlg, UPDATES_INTERVAL), TRUE);\r
+                                               EnableWindow(GetDlgItem(hDlg, UPDATES_INTERVAL_SPN), TRUE);\r
+                                       }\r
+                                       else\r
+                                       {\r
+                                               EnableWindow(GetDlgItem(hDlg, UPDATES_AUTO_APPLY), FALSE);\r
+                                               EnableWindow(GetDlgItem(hDlg, UPDATES_INTERVAL), FALSE);\r
+                                               EnableWindow(GetDlgItem(hDlg, UPDATES_INTERVAL_SPN), FALSE);\r
+                                       }\r
+                                       break;\r
+                       }\r
+                       return(TRUE);\r
+       }\r
+    return(FALSE);\r
+}\r
+\r
 /*----- ダイアログのコントロールから10進数を取得 ----------------------------\r
 *\r
 *      Parameter\r
index 7b26139..65de637 100644 (file)
Binary files a/putty/Release/PuTTY.dll and b/putty/Release/PuTTY.dll differ
index ee808c4..23ff28d 100644 (file)
@@ -20,7 +20,7 @@ __declspec(dllexport) SFTPSTATUS* SFTP_Create()
                SFTP_InitializeIOBuffer(&p->DataInBuffer, 1048576);\r
                SFTP_InitializeIOBuffer(&p->DataOutBuffer, 1048576);\r
                memset(&p->FilePosition, 0, sizeof(LARGE_INTEGER));\r
-               CreateThread(NULL, 0, SFTP_ThreadProc, NULL, 0, &p->ThreadId);\r
+               CloseHandle(CreateThread(NULL, 0, SFTP_ThreadProc, NULL, 0, &p->ThreadId));\r
        }\r
        return p;\r
 }\r
index 7f03155..6e7b53d 100644 (file)
@@ -226,6 +226,11 @@ extern int AutoRefreshFileList;
 extern int RemoveOldLog;\r
 // バージョン確認\r
 extern int ReadOnlySettings;\r
+// ソフトウェア自動更新\r
+extern int AutoCheckForUpdates;\r
+extern int AutoApplyUpdates;\r
+extern int AutoCheckForUptatesInterval;\r
+extern time_t LastAutoCheckForUpdates;\r
 \r
 /*----- マスタパスワードの設定 ----------------------------------------------\r
 *\r
@@ -692,6 +697,11 @@ void SaveRegistry(void)
                                WriteIntValueToReg(hKey4, "ListRefresh", AutoRefreshFileList);\r
                                // 古い処理内容を消去\r
                                WriteIntValueToReg(hKey4, "OldLog", RemoveOldLog);\r
+                               // ソフトウェア自動更新\r
+                               WriteIntValueToReg(hKey4, "UpdCheck", AutoCheckForUpdates);\r
+                               WriteIntValueToReg(hKey4, "UpdApply", AutoApplyUpdates);\r
+                               WriteIntValueToReg(hKey4, "UpdInterval", AutoCheckForUptatesInterval);\r
+                               WriteBinaryToReg(hKey4, "UpdLastCheck", &LastAutoCheckForUpdates, sizeof(LastAutoCheckForUpdates));\r
                        }\r
                        CloseSubKey(hKey4);\r
                }\r
@@ -1174,6 +1184,11 @@ int LoadRegistry(void)
                        ReadIntValueFromReg(hKey4, "ListRefresh", &AutoRefreshFileList);\r
                        // 古い処理内容を消去\r
                        ReadIntValueFromReg(hKey4, "OldLog", &RemoveOldLog);\r
+                       // ソフトウェア自動更新\r
+                       ReadIntValueFromReg(hKey4, "UpdCheck", &AutoCheckForUpdates);\r
+                       ReadIntValueFromReg(hKey4, "UpdApply", &AutoApplyUpdates);\r
+                       ReadIntValueFromReg(hKey4, "UpdInterval", &AutoCheckForUptatesInterval);\r
+                       ReadBinaryFromReg(hKey4, "UpdLastCheck", &LastAutoCheckForUpdates, sizeof(LastAutoCheckForUpdates));\r
 \r
                        CloseSubKey(hKey4);\r
                }\r
@@ -1401,7 +1416,7 @@ void SaveSettingsToFile(void)
                                        {\r
                                                if(ShellExecute(NULL, "open", "regedit", Tmp, NULL, SW_SHOW) <= (HINSTANCE)32)\r
                                                {\r
-                                                       MessageBox(NULL, MSGJPN285, "FFFTP", MB_OK);\r
+                                                       MessageBox(GetMainHwnd(), MSGJPN285, "FFFTP", MB_OK | MB_ICONERROR);\r
                                                }\r
                                                SetCurrentDirectory(CurDir);\r
                                        }\r
@@ -1465,7 +1480,7 @@ int LoadSettingsFromFile(void)
                                        {\r
                                                if(ShellExecute(NULL, "open", "regedit", Tmp, NULL, SW_SHOW) <= (HINSTANCE)32)\r
                                                {\r
-                                                       MessageBox(NULL, MSGJPN285, "FFFTP", MB_OK);\r
+                                                       MessageBox(GetMainHwnd(), MSGJPN285, "FFFTP", MB_OK | MB_ICONERROR);\r
                                                }\r
                                                else\r
                                                {\r
@@ -1484,7 +1499,9 @@ int LoadSettingsFromFile(void)
                        Ret = YES;\r
                }\r
                else\r
-                       MessageBox(NULL, MSGJPN293, "FFFTP", MB_OK);\r
+                       // バグ修正\r
+//                     MessageBox(NULL, MSGJPN293, "FFFTP", MB_OK);\r
+                       MessageBox(GetMainHwnd(), MSGJPN293, "FFFTP", MB_OK | MB_ICONERROR);\r
        }\r
        return(Ret);\r
 }\r
@@ -2313,7 +2330,9 @@ static BOOL WriteOutRegToFile(REGDATATBL *Pos)
                Ret = TRUE;\r
        }\r
        else\r
-               MessageBox(NULL, MSGJPN240, "FFFTP", MB_OK);\r
+               // バグ修正\r
+//             MessageBox(NULL, MSGJPN240, "FFFTP", MB_OK);\r
+               MessageBox(GetMainHwnd(), MSGJPN240, "FFFTP", MB_OK | MB_ICONERROR);\r
 \r
        return(Ret);\r
 }\r
@@ -3682,7 +3701,7 @@ void SaveSettingsToFileZillaXml()
                        fclose(f);\r
                }\r
                else\r
-                       MessageBox(NULL, MSGJPN358, "FFFTP", MB_OK);\r
+                       MessageBox(GetMainHwnd(), MSGJPN358, "FFFTP", MB_OK | MB_ICONERROR);\r
        }\r
 }\r
 \r
diff --git a/tool.c b/tool.c
index 92a18ff..4c1cf62 100644 (file)
--- a/tool.c
+++ b/tool.c
@@ -180,7 +180,7 @@ void TurnStatefulFTPFilter()
                                {\r
                                        if(ShellExecute(NULL, "runas", "netsh", ID == IDYES ? "advfirewall set global statefulftp enable" : "advfirewall set global statefulftp disable", NULL, SW_SHOW) <= (HINSTANCE)32)\r
                                        {\r
-                                               MessageBox(NULL, MSGJPN342, "FFFTP", MB_OK);\r
+                                               MessageBox(GetMainHwnd(), MSGJPN342, "FFFTP", MB_OK | MB_ICONERROR);\r
                                        }\r
                                        SetCurrentDirectory(CurDir);\r
                                }\r
index 39cba78..66fd783 100644 (file)
--- a/updater.c
+++ b/updater.c
@@ -264,11 +264,12 @@ BOOL PrepareUpdates(void* pList, DWORD ListLength, LPCTSTR DownloadDir)
 }\r
 \r
 // FFFTPを更新\r
-BOOL ApplyUpdates(LPCTSTR DestinationDir)\r
+BOOL ApplyUpdates(LPCTSTR DestinationDir, LPCTSTR BackupDirName)\r
 {\r
        BOOL bResult;\r
        TCHAR Source[MAX_PATH];\r
        TCHAR Backup[MAX_PATH];\r
+       TCHAR DestinationBackup[MAX_PATH];\r
        TCHAR* p;\r
        bResult = FALSE;\r
        if(GetModuleFileName(NULL, Source, MAX_PATH) > 0)\r
@@ -276,19 +277,24 @@ BOOL ApplyUpdates(LPCTSTR DestinationDir)
                if(p = _tcsrchr(Source, _T('\\')))\r
                        *p = _T('\0');\r
                _tcscpy(Backup, Source);\r
-               _tcscat(Backup, _T("\\updatebackup"));\r
+               _tcscat(Backup, _T("\\"));\r
+               _tcscat(Backup, BackupDirName);\r
                DeleteDirectoryAndContents(Backup);\r
                if(CopyAllFilesInDirectory(DestinationDir, Backup))\r
                {\r
+                       _tcscpy(DestinationBackup, DestinationDir);\r
+                       _tcscat(DestinationBackup, _T("\\"));\r
+                       _tcscat(DestinationBackup, BackupDirName);\r
                        if(CopyAllFilesInDirectory(Source, DestinationDir))\r
                        {\r
+                               DeleteDirectoryAndContents(DestinationBackup);\r
                                bResult = TRUE;\r
-                               _tcscpy(Backup, DestinationDir);\r
-                               _tcscat(Backup, _T("\\updatebackup"));\r
-                               DeleteDirectoryAndContents(Backup);\r
                        }\r
                        else\r
+                       {\r
+                               DeleteDirectoryAndContents(DestinationBackup);\r
                                CopyAllFilesInDirectory(Backup, DestinationDir);\r
+                       }\r
                }\r
        }\r
        return bResult;\r
@@ -305,18 +311,31 @@ BOOL CleanupUpdates(LPCTSTR DownloadDir)
 }\r
 \r
 // 更新用のプロセスを起動\r
-BOOL StartUpdateProcess(LPCTSTR Path, LPCTSTR CommandLine)\r
+BOOL StartUpdateProcess(LPCTSTR DownloadDir, LPCTSTR CommandLine)\r
 {\r
        BOOL bResult;\r
+       TCHAR Name[MAX_PATH];\r
+       TCHAR* p;\r
+       TCHAR Path[MAX_PATH];\r
        bResult = FALSE;\r
-       if(ShellExecute(NULL, "open", Path, CommandLine, NULL, SW_SHOW) > (HINSTANCE)32)\r
-               bResult = TRUE;\r
+       if(GetModuleFileName(NULL, Name, MAX_PATH) > 0)\r
+       {\r
+               if(p = _tcsrchr(Name, _T('\\')))\r
+                       p++;\r
+               else\r
+                       p = Name;\r
+               _tcscpy(Path, DownloadDir);\r
+               _tcscat(Path, _T("\\"));\r
+               _tcscat(Path, p);\r
+               if(ShellExecute(NULL, _T("open"), Path, CommandLine, NULL, SW_SHOW) > (HINSTANCE)32)\r
+                       bResult = TRUE;\r
+       }\r
        return bResult;\r
 }\r
 \r
 // 更新用のプロセスを管理者権限で起動\r
 // Windows XP以前など起動できない場合は現在のプロセスで処理を続行\r
-BOOL StartUpdateProcessAsAdministrator(LPCTSTR CommandLine, LPCTSTR Keyword)\r
+BOOL RestartUpdateProcessAsAdministrator(LPCTSTR CommandLine, LPCTSTR Keyword)\r
 {\r
        BOOL bResult;\r
        TCHAR* NewCommandLine;\r
@@ -329,19 +348,21 @@ BOOL StartUpdateProcessAsAdministrator(LPCTSTR CommandLine, LPCTSTR Keyword)
                {\r
                        _tcscpy(NewCommandLine, CommandLine);\r
                        _tcscat(NewCommandLine, Keyword);\r
-                       GetModuleFileName(NULL, Path, MAX_PATH);\r
-                       memset(&Info, 0, sizeof(SHELLEXECUTEINFO));\r
-                       Info.cbSize = sizeof(SHELLEXECUTEINFO);\r
-                       Info.fMask = SEE_MASK_NOCLOSEPROCESS;\r
-                       Info.lpVerb = "runas";\r
-                       Info.lpFile = Path;\r
-                       Info.lpParameters = NewCommandLine;\r
-                       Info.nShow = SW_SHOW;\r
-                       if(ShellExecuteEx(&Info))\r
+                       if(GetModuleFileName(NULL, Path, MAX_PATH) > 0)\r
                        {\r
-                               WaitForSingleObject(Info.hProcess, INFINITE);\r
-                               CloseHandle(Info.hProcess);\r
-                               bResult = TRUE;\r
+                               memset(&Info, 0, sizeof(SHELLEXECUTEINFO));\r
+                               Info.cbSize = sizeof(SHELLEXECUTEINFO);\r
+                               Info.fMask = SEE_MASK_NOCLOSEPROCESS;\r
+                               Info.lpVerb = _T("runas");\r
+                               Info.lpFile = Path;\r
+                               Info.lpParameters = NewCommandLine;\r
+                               Info.nShow = SW_SHOW;\r
+                               if(ShellExecuteEx(&Info))\r
+                               {\r
+                                       WaitForSingleObject(Info.hProcess, INFINITE);\r
+                                       CloseHandle(Info.hProcess);\r
+                                       bResult = TRUE;\r
+                               }\r
                        }\r
                        free(NewCommandLine);\r
                }\r
index 24ffd11..291bc1b 100644 (file)
--- a/updater.h
+++ b/updater.h
 \r
 BOOL CheckForUpdates(BOOL bDownload, LPCTSTR DownloadDir, DWORD* pVersion, LPTSTR pVersionString);\r
 BOOL PrepareUpdates(void* pList, DWORD ListLength, LPCTSTR DownloadDir);\r
-BOOL ApplyUpdates(LPCTSTR DestinationDir);\r
+BOOL ApplyUpdates(LPCTSTR DestinationDir, LPCTSTR BackupDirName);\r
 BOOL CleanupUpdates(LPCTSTR DownloadDir);\r
-BOOL StartUpdateProcess(LPCTSTR CommandLine, LPCTSTR Keyword);\r
-BOOL StartUpdateProcessAsAdministrator(LPCTSTR CommandLine, LPCTSTR Keyword);\r
+BOOL StartUpdateProcess(LPCTSTR DownloadDir, LPCTSTR CommandLine);\r
+BOOL RestartUpdateProcessAsAdministrator(LPCTSTR CommandLine, LPCTSTR Keyword);\r
 \r
 #endif\r
 \r