OSDN Git Service

Prepare for release of 1.98f.
[ffftp/ffftp.git] / main.c
diff --git a/main.c b/main.c
index 51d8b35..bee2108 100644 (file)
--- a/main.c
+++ b/main.c
@@ -128,7 +128,9 @@ char FilterStr[FILTER_EXT_LEN+1] = { "*" };
 \r
 int CancelFlg;\r
 \r
-static int SuppressRefresh = 0;\r
+// 外部アプリケーションへドロップ後にローカル側のファイル一覧に作業フォルダが表示されるバグ対策\r
+//static int SuppressRefresh = 0;\r
+int SuppressRefresh = 0;\r
 \r
 static DWORD dwCookie;\r
 \r
@@ -136,6 +138,9 @@ static DWORD dwCookie;
 static char SSLRootCAFilePath[FMAX_PATH+1];\r
 // マルチコアCPUの特定環境下でファイル通信中にクラッシュするバグ対策\r
 static DWORD MainThreadId;\r
+// ポータブル版判定\r
+static char PortableFilePath[FMAX_PATH+1];\r
+int PortableVersion;\r
 \r
 \r
 /*===== グローバルなワーク =====*/\r
@@ -171,7 +176,9 @@ int TransMode = TYPE_X;
 int ConnectOnStart = YES;\r
 int DebugConsole = NO;\r
 int SaveWinPos = NO;\r
-char AsciiExt[ASCII_EXT_LEN+1] = { "*.txt\0*.html\0*.htm\0*.cgi\0*.pl\0" };\r
+// アスキーモード判別の改良\r
+//char AsciiExt[ASCII_EXT_LEN+1] = { "*.txt\0*.html\0*.htm\0*.cgi\0*.pl\0" };\r
+char AsciiExt[ASCII_EXT_LEN+1] = { "*.txt\0*.html\0*.htm\0*.cgi\0*.pl\0*.js\0*.vbs\0*.css\0*.rss\0*.rdf\0*.xml\0*.xhtml\0*.xht\0*.shtml\0*.shtm\0*.sh\0*.py\0*.rb\0*.properties\0*.sql\0*.asp\0*.aspx\0*.php\0*.htaccess\0" };\r
 int RecvMode = TRANS_DLG;\r
 int SendMode = TRANS_DLG;\r
 int MoveMode = MOVE_DLG;\r
@@ -201,7 +208,9 @@ int FwallSecurity = SECURITY_AUTO;
 int FwallResolv = NO;\r
 int FwallLower = NO;\r
 int FwallDelimiter = '@';\r
-int PasvDefault = NO;\r
+// ルータ対策\r
+//int PasvDefault = NO;\r
+int PasvDefault = YES;\r
 char MirrorNoTrn[MIRROR_LEN+1] = { "*.bak\0" };\r
 char MirrorNoDel[MIRROR_LEN+1] = { "" };\r
 int MirrorFnameCnv = NO;\r
@@ -233,6 +242,8 @@ BYTE CertificateCacheHash[MAX_CERT_CACHE_HASH][20];
 BYTE SSLRootCAFileHash[20];\r
 // ファイルアイコン表示対応\r
 int DispFileIcon = NO;\r
+// ディレクトリ自動作成\r
+int MakeAllDir = YES;\r
 \r
 \r
 \r
@@ -258,66 +269,68 @@ int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLi
 \r
        // プロセス保護\r
 #ifdef ENABLE_PROCESS_PROTECTION\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
        {\r
-               if(strcmp(Option, "--protect") == 0)\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
                {\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
-               {\r
-                       ProtectLevel = PROCESS_PROTECTION_LOW;\r
-                       break;\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
+                       {\r
+                               ProtectLevel = PROCESS_PROTECTION_LOW;\r
+                               break;\r
+                       }\r
                }\r
-       }\r
-       if(ProtectLevel != PROCESS_PROTECTION_NONE)\r
-       {\r
-               SetProcessProtectionLevel(ProtectLevel);\r
-               if(!InitializeLoadLibraryHook())\r
+               if(ProtectLevel != PROCESS_PROTECTION_NONE)\r
                {\r
-                       MessageBox(NULL, MSGJPN321, "FFFTP", MB_OK | MB_ICONERROR);\r
-                       return 0;\r
-               }\r
+                       SetProcessProtectionLevel(ProtectLevel);\r
+                       if(!InitializeLoadLibraryHook())\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
+                       if(!EnableLoadLibraryHook(TRUE))\r
+                       {\r
+                               MessageBox(NULL, MSGJPN324, "FFFTP", MB_OK | MB_ICONERROR);\r
+                               return 0;\r
+                       }\r
                }\r
+               else\r
+                       InitializeLoadLibraryHook();\r
        }\r
-       else\r
-               InitializeLoadLibraryHook();\r
 #endif\r
 \r
        // マルチコアCPUの特定環境下でファイル通信中にクラッシュするバグ対策\r
@@ -339,9 +352,6 @@ int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLi
        LoadOpenSSL();\r
 #endif\r
 \r
-       // SFTP対応\r
-       LoadPuTTY();\r
-\r
        Ret = FALSE;\r
        hWndFtp = NULL;\r
        hInstFtp = hInstance;\r
@@ -377,8 +387,6 @@ int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLi
 #ifdef USE_OPENSSL\r
        FreeOpenSSL();\r
 #endif\r
-       // SFTP対応\r
-       FreePuTTY();\r
        OleUninitialize();\r
        return(Ret);\r
 }\r
@@ -405,6 +413,8 @@ static int InitApp(LPSTR lpszCmdLine, int cmdShow)
        char PwdBuf[FMAX_PATH+1];\r
        int useDefautPassword = 0; /* 警告文表示用 */\r
        int masterpass;\r
+       // ポータブル版判定\r
+       int ImportPortable;\r
 \r
        sts = FFFTP_FAIL;\r
 \r
@@ -442,13 +452,32 @@ static int InitApp(LPSTR lpszCmdLine, int cmdShow)
                        ForceIni = YES;\r
                        RegType = REGTYPE_INI;\r
                }\r
+               // ポータブル版判定\r
+               GetModuleFileName(NULL, PortableFilePath, FMAX_PATH);\r
+               strcpy(GetFileName(PortableFilePath), "portable");\r
+               CheckPortableVersion();\r
+               ImportPortable = NO;\r
+               if(PortableVersion == YES)\r
+               {\r
+                       ForceIni = YES;\r
+                       RegType = REGTYPE_INI;\r
+                       if(IsRegAvailable() == YES && IsIniAvailable() == NO)\r
+                       {\r
+                               if(DialogBox(GetFtpInst(), MAKEINTRESOURCE(ini_from_reg_dlg), GetMainHwnd(), ExeEscDialogProc) == YES)\r
+                               {\r
+                                       ImportPortable = YES;\r
+                                       ForceIni = NO;\r
+                                       RegType = REGTYPE_REG;\r
+                               }\r
+                       }\r
+               }\r
 \r
 //             AllocConsole();\r
 \r
                /* 2010.02.01 genta マスターパスワードを入力させる\r
                  -z オプションがあるときは最初だけスキップ\r
                  -z オプションがないときは,デフォルトパスワードをまず試す\r
-                 LoadRegistory()する\r
+                 LoadRegistry()する\r
                  パスワードが不一致なら再入力するか尋ねる.\r
                  (破損していた場合はさせない)\r
                */\r
@@ -493,7 +522,14 @@ static int InitApp(LPSTR lpszCmdLine, int cmdShow)
                \r
                if(masterpass != 0)\r
                {\r
-                       LoadRegistory();\r
+                       LoadRegistry();\r
+\r
+                       // ポータブル版判定\r
+                       if(ImportPortable == YES)\r
+                       {\r
+                               ForceIni = YES;\r
+                               RegType = REGTYPE_INI;\r
+                       }\r
 \r
                        // 暗号化通信対応\r
                        SetSSLTimeoutCallback(TimeOut * 1000, SSLTimeoutCallback);\r
@@ -542,7 +578,7 @@ static int InitApp(LPSTR lpszCmdLine, int cmdShow)
                                        DispWindowTitle();\r
                                        // SourceForge.JPによるフォーク\r
 //                                     SetTaskMsg("FFFTP Ver." VER_STR " Copyright(C) 1997-2010 Sota & cooperators.");\r
-                                       SetTaskMsg("FFFTP Ver." VER_STR " Copyright(C) 1997-2010 Sota & cooperators.\r\nCopyright (C) 2011 FFFTP Project (Hiromichi Matsushima, Suguru Kawamoto, IWAMOTO Kouichi, vitamin0x, unarist, Asami, fortran90, tomo1192, Yuji Tanaka).");\r
+                                       SetTaskMsg("FFFTP Ver." VER_STR " Copyright(C) 1997-2010 Sota & cooperators.\r\nCopyright (C) 2011-2012 FFFTP Project (Hiromichi Matsushima, Suguru Kawamoto, IWAMOTO Kouichi, vitamin0x, unarist, Asami, fortran90, tomo1192, Yuji Tanaka, Moriguchi Hirokazu).");\r
 \r
                                        if(ForceIni)\r
                                                SetTaskMsg("%s%s", MSGJPN283, IniPath);\r
@@ -979,6 +1015,22 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA
 \r
                                case MENU_DCLICK :\r
                                        if(hWndCurFocus == GetLocalHwnd())\r
+                                               // ローカルフォルダを開く\r
+//                                             DoubleClickProc(WIN_LOCAL, YES, -1);\r
+                                               DoubleClickProc(WIN_LOCAL, NO, -1);\r
+                                       else\r
+                                       {\r
+                                               SuppressRefresh = 1;\r
+                                               // ローカルフォルダを開く\r
+//                                             DoubleClickProc(WIN_REMOTE, YES, -1);\r
+                                               DoubleClickProc(WIN_REMOTE, NO, -1);\r
+                                               SuppressRefresh = 0;\r
+                                       }\r
+                                       break;\r
+\r
+                               // ローカルフォルダを開く\r
+                               case MENU_OPEN :\r
+                                       if(hWndCurFocus == GetLocalHwnd())\r
                                                DoubleClickProc(WIN_LOCAL, YES, -1);\r
                                        else\r
                                        {\r
@@ -1022,6 +1074,9 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA
                                        break;\r
 \r
                                case MENU_REMOTE_UPDIR :\r
+                                       // デッドロック対策\r
+                                       if(AskUserOpeDisabled() == YES)\r
+                                               break;\r
                                        SuppressRefresh = 1;\r
                                        SetCurrentDirAsDirHist();\r
                                        ChangeDir(WIN_REMOTE, "..");\r
@@ -1029,6 +1084,9 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA
                                        break;\r
 \r
                                case MENU_LOCAL_UPDIR :\r
+                                       // デッドロック対策\r
+                                       if(AskUserOpeDisabled() == YES)\r
+                                               break;\r
                                        SetCurrentDirAsDirHist();\r
                                        ChangeDir(WIN_LOCAL, "..");\r
                                        break;\r
@@ -1047,42 +1105,42 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA
 \r
                                case MENU_DOWNLOAD :\r
                                        SetCurrentDirAsDirHist();\r
-                                       DownLoadProc(NO, NO, NO);\r
+                                       DownloadProc(NO, NO, NO);\r
                                        break;\r
 \r
                                case MENU_DOWNLOAD_AS :\r
                                        SetCurrentDirAsDirHist();\r
-                                       DownLoadProc(YES, NO, NO);\r
+                                       DownloadProc(YES, NO, NO);\r
                                        break;\r
 \r
                                case MENU_DOWNLOAD_AS_FILE :\r
                                        SetCurrentDirAsDirHist();\r
-                                       DownLoadProc(NO, YES, NO);\r
+                                       DownloadProc(NO, YES, NO);\r
                                        break;\r
 \r
                                case MENU_DOWNLOAD_ALL :\r
                                        SetCurrentDirAsDirHist();\r
-                                       DownLoadProc(NO, NO, YES);\r
+                                       DownloadProc(NO, NO, YES);\r
                                        break;\r
 \r
                                case MENU_DOWNLOAD_NAME :\r
                                        SetCurrentDirAsDirHist();\r
-                                       InputDownLoadProc();\r
+                                       InputDownloadProc();\r
                                        break;\r
 \r
                                case MENU_UPLOAD :\r
                                        SetCurrentDirAsDirHist();\r
-                                       UpLoadListProc(NO, NO);\r
+                                       UploadListProc(NO, NO);\r
                                        break;\r
 \r
                                case MENU_UPLOAD_AS :\r
                                        SetCurrentDirAsDirHist();\r
-                                       UpLoadListProc(YES, NO);\r
+                                       UploadListProc(YES, NO);\r
                                        break;\r
 \r
                                case MENU_UPLOAD_ALL :\r
                                        SetCurrentDirAsDirHist();\r
-                                       UpLoadListProc(NO, YES);\r
+                                       UploadListProc(NO, YES);\r
                                        break;\r
 \r
                                case MENU_MIRROR_UPLOAD :\r
@@ -1231,6 +1289,9 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA
                                        break;\r
 \r
                                case MENU_REFRESH :\r
+                                       // デッドロック対策\r
+                                       if(AskUserOpeDisabled() == YES)\r
+                                               break;\r
                                        // 同時接続対応\r
                                        CancelFlg = NO;\r
                                        SuppressRefresh = 1;\r
@@ -1257,6 +1318,9 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA
                                        break;\r
 \r
                                case REFRESH_REMOTE :\r
+                                       // デッドロック対策\r
+                                       if(AskUserOpeDisabled() == YES)\r
+                                               break;\r
                                        // 同時接続対応\r
                                        CancelFlg = NO;\r
                                        SuppressRefresh = 1;\r
@@ -1325,6 +1389,9 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA
                                        break;\r
 \r
                                case MENU_DOTFILE :\r
+                                       // デッドロック対策\r
+                                       if(AskUserOpeDisabled() == YES)\r
+                                               break;\r
                                        // 同時接続対応\r
                                        CancelFlg = NO;\r
                                        DotFile ^= 1;\r
@@ -1343,7 +1410,7 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA
 \r
                                case MENU_REGSAVE :\r
                                        GetListTabWidth();\r
-                                       SaveRegistory();\r
+                                       SaveRegistry();\r
                                        SaveSettingsToFile();\r
                                        break;\r
 \r
@@ -1359,7 +1426,9 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA
                                case MENU_REGINIT :\r
                                        if(DialogBox(hInstFtp, MAKEINTRESOURCE(reginit_dlg), hWnd, ExeEscDialogProc) == YES)\r
                                        {\r
-                                               ClearRegistory();\r
+                                               ClearRegistry();\r
+                                               // ポータブル版判定\r
+                                               ClearIni();\r
                                                SaveExit = NO;\r
                                                PostMessage(hWnd, WM_CLOSE, 0, 0L);\r
                                        }\r
@@ -1371,9 +1440,34 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA
                                                if( DialogBox(hInstFtp, MAKEINTRESOURCE(forcepasschange_dlg), hWnd, ExeEscDialogProc) != YES){\r
                                                        break;\r
                                                }\r
+                                               // セキュリティ強化\r
+                                               if(EnterMasterPasswordAndSet(newmasterpasswd_dlg, hWnd) != 0)\r
+                                                       SetTaskMsg(MSGJPN303);\r
                                        }\r
-                                       if( EnterMasterPasswordAndSet( newmasterpasswd_dlg, hWnd ) != 0 ){\r
-                                               SetTaskMsg( MSGJPN303 );\r
+                                       // セキュリティ強化\r
+//                                     if( EnterMasterPasswordAndSet( newmasterpasswd_dlg, hWnd ) != 0 ){\r
+//                                             SetTaskMsg( MSGJPN303 );\r
+//                                     }\r
+                                       else 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, NULL) == 0)\r
+                                                               break;\r
+                                               }\r
+                                               if(GetMasterPasswordStatus() == PASSWORD_OK && EnterMasterPasswordAndSet(newmasterpasswd_dlg, hWnd) != 0)\r
+                                               {\r
+                                                       SetTaskMsg(MSGJPN303);\r
+                                                       SaveRegistry();\r
+                                               }\r
+                                               else\r
+                                               {\r
+                                                       SetMasterPassword(Password);\r
+                                                       ValidateMasterPassword();\r
+                                               }\r
                                        }\r
                                        break;\r
 \r
@@ -1652,7 +1746,10 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA
                        break;\r
 \r
                case WM_REFRESH_LOCAL_FLG :\r
-                       PostMessage(hWnd,  WM_COMMAND, MAKEWPARAM(REFRESH_LOCAL, 0), 0);\r
+                       // 外部アプリケーションへドロップ後にローカル側のファイル一覧に作業フォルダが表示されるバグ対策\r
+//                     PostMessage(hWnd,  WM_COMMAND, MAKEWPARAM(REFRESH_LOCAL, 0), 0);\r
+                       if(SuppressRefresh == 0)\r
+                               PostMessage(hWnd,  WM_COMMAND, MAKEWPARAM(REFRESH_LOCAL, 0), 0);\r
                        break;\r
 \r
                case WM_REFRESH_REMOTE_FLG :\r
@@ -1740,6 +1837,18 @@ static void StartupProc(char *Cmd)
        if(CmdOption & OPT_SAVEON)\r
                SuppressSave = NO;\r
 \r
+       // UTF-8対応\r
+       if(CmdOption & OPT_SJIS)\r
+               Kanji = KANJI_SJIS;\r
+       if(CmdOption & OPT_UTF8N)\r
+               Kanji = KANJI_UTF8N;\r
+       if(CmdOption & OPT_UTF8BOM)\r
+               Kanji = KANJI_UTF8BOM;\r
+       if(CmdOption & OPT_SJIS_NAME)\r
+               FnameKanji = KANJI_SJIS;\r
+       if(CmdOption & OPT_UTF8N_NAME)\r
+               FnameKanji = KANJI_UTF8N;\r
+\r
        if(Sts == 0)\r
        {\r
                if(ConnectOnStart == YES)\r
@@ -1811,9 +1920,14 @@ static int AnalyzeComLine(char *Str, int *AutoConnect, int *CmdOption, char *unc
                                *CmdOption |= OPT_MIRROR;\r
                        else if((strcmp(&Tmp[1], "d") == 0) || (strcmp(&Tmp[1], "-mirrordown") == 0))\r
                                *CmdOption |= OPT_MIRRORDOWN;\r
-                       else if((strcmp(&Tmp[1], "e") == 0) || (strcmp(&Tmp[1], "-euc") == 0))\r
+                       // 廃止予定\r
+//                     else if((strcmp(&Tmp[1], "e") == 0) || (strcmp(&Tmp[1], "-euc") == 0))\r
+//                             *CmdOption |= OPT_EUC;\r
+//                     else if((strcmp(&Tmp[1], "j") == 0) || (strcmp(&Tmp[1], "-jis") == 0))\r
+//                             *CmdOption |= OPT_JIS;\r
+                       else if((strcmp(&Tmp[1], "eu") == 0) || (strcmp(&Tmp[1], "e") == 0) || (strcmp(&Tmp[1], "-euc") == 0))\r
                                *CmdOption |= OPT_EUC;\r
-                       else if((strcmp(&Tmp[1], "j") == 0) || (strcmp(&Tmp[1], "-jis") == 0))\r
+                       else if((strcmp(&Tmp[1], "ji") == 0) || (strcmp(&Tmp[1], "j") == 0) || (strcmp(&Tmp[1], "-jis") == 0))\r
                                *CmdOption |= OPT_JIS;\r
                        else if((strcmp(&Tmp[1], "a") == 0) || (strcmp(&Tmp[1], "-ascii") == 0))\r
                                *CmdOption |= OPT_ASCII;\r
@@ -1827,9 +1941,14 @@ static int AnalyzeComLine(char *Str, int *AutoConnect, int *CmdOption, char *unc
                                *CmdOption |= OPT_QUIT;\r
                        else if((strcmp(&Tmp[1], "k") == 0) || (strcmp(&Tmp[1], "-kana") == 0))\r
                                *CmdOption |= OPT_KANA;\r
-                       else if((strcmp(&Tmp[1], "u") == 0) || (strcmp(&Tmp[1], "-eucname") == 0))\r
+                       // 廃止予定\r
+//                     else if((strcmp(&Tmp[1], "u") == 0) || (strcmp(&Tmp[1], "-eucname") == 0))\r
+//                             *CmdOption |= OPT_EUC_NAME;\r
+//                     else if((strcmp(&Tmp[1], "i") == 0) || (strcmp(&Tmp[1], "-jisname") == 0))\r
+//                             *CmdOption |= OPT_JIS_NAME;\r
+                       else if((strcmp(&Tmp[1], "eun") == 0) || (strcmp(&Tmp[1], "u") == 0) || (strcmp(&Tmp[1], "-eucname") == 0))\r
                                *CmdOption |= OPT_EUC_NAME;\r
-                       else if((strcmp(&Tmp[1], "i") == 0) || (strcmp(&Tmp[1], "-jisname") == 0))\r
+                       else if((strcmp(&Tmp[1], "jin") == 0) || (strcmp(&Tmp[1], "i") == 0) || (strcmp(&Tmp[1], "-jisname") == 0))\r
                                *CmdOption |= OPT_JIS_NAME;\r
                        else if((strcmp(&Tmp[1], "n") == 0) || (strcmp(&Tmp[1], "-ini") == 0))\r
                        {\r
@@ -1899,6 +2018,17 @@ static int AnalyzeComLine(char *Str, int *AutoConnect, int *CmdOption, char *unc
                        {\r
                        }\r
 #endif\r
+                       // UTF-8対応\r
+                       else if((strcmp(&Tmp[1], "sj") == 0) || (strcmp(&Tmp[1], "-sjis") == 0))\r
+                               *CmdOption |= OPT_SJIS;\r
+                       else if((strcmp(&Tmp[1], "u8") == 0) || (strcmp(&Tmp[1], "-utf8") == 0))\r
+                               *CmdOption |= OPT_UTF8N;\r
+                       else if((strcmp(&Tmp[1], "8b") == 0) || (strcmp(&Tmp[1], "-utf8bom") == 0))\r
+                               *CmdOption |= OPT_UTF8BOM;\r
+                       else if((strcmp(&Tmp[1], "sjn") == 0) || (strcmp(&Tmp[1], "-sjisname") == 0))\r
+                               *CmdOption |= OPT_SJIS_NAME;\r
+                       else if((strcmp(&Tmp[1], "u8n") == 0) || (strcmp(&Tmp[1], "-utf8name") == 0))\r
+                               *CmdOption |= OPT_UTF8N_NAME;\r
                        else\r
                        {\r
                                SetTaskMsg(MSGJPN180, Tmp);\r
@@ -2066,7 +2196,10 @@ static void ExitProc(HWND hWnd)
        if(SaveExit == YES)\r
        {\r
                GetListTabWidth();\r
-               SaveRegistory();\r
+               SaveRegistry();\r
+               // ポータブル版判定\r
+               if(RegType == REGTYPE_REG)\r
+                       ClearIni();\r
 \r
                if((CacheEntry > 0) && (CacheSave == YES))\r
                        SaveCache();\r
@@ -2127,7 +2260,9 @@ void DoubleClickProc(int Win, int Mode, int App)
 \r
                                if(Win == WIN_LOCAL)\r
                                {\r
-                                       if((App != -1) || (Type == NODE_FILE))\r
+                                       // ローカルフォルダを開く\r
+//                                     if((App != -1) || (Type == NODE_FILE))\r
+                                       if((App != -1) || (Type == NODE_FILE) || (Mode == YES))\r
                                        {\r
                                                if((DclickOpen == YES) || (Mode == YES))\r
                                                {\r
@@ -2204,12 +2339,12 @@ void DoubleClickProc(int Win, int Mode, int App)
                                                        /* 不正なパスを検出 */\r
                                                        if(CheckPathViolation(&MainTransPkt) == NO)\r
                                                        {\r
-//                                                             if((Sts = DoDownLoad(AskCmdCtrlSkt(), &MainTransPkt, NO)) == 429)\r
+//                                                             if((Sts = DoDownload(AskCmdCtrlSkt(), &MainTransPkt, NO)) == 429)\r
 //                                                             {\r
 //                                                                     ReConnectCmdSkt();\r
                                                                        // 同時接続対応\r
                                                                        CancelFlg = NO;\r
-                                                                       Sts = DoDownLoad(AskCmdCtrlSkt(), &MainTransPkt, NO, &CancelFlg);\r
+                                                                       Sts = DoDownload(AskCmdCtrlSkt(), &MainTransPkt, NO, &CancelFlg);\r
 //                                                             }\r
                                                        }\r
 \r
@@ -2573,6 +2708,13 @@ void ExecViewer(char *Fname, int App)
                DoPrintf("ShellExecute - %s", Fname);\r
                ShellExecute(NULL, "open", Fname, NULL, CurDir, SW_SHOW);\r
        }\r
+       // ローカルフォルダを開く\r
+       else if((App == -1) && (GetFileAttributes(Fname) & FILE_ATTRIBUTE_DIRECTORY))\r
+       {\r
+               MakeDistinguishableFileName(ComLine, Fname);\r
+               DoPrintf("ShellExecute - %s", Fname);\r
+               ShellExecute(NULL, "open", ComLine, NULL, Fname, SW_SHOW);\r
+       }\r
        else\r
        {\r
                App = max1(0, App);\r
@@ -3069,7 +3211,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, "\xF0\x1B\x48\x26\x67\x44\x3A\xFF\x0A\x16\xD3\xBB\x8A\x33\xEB\x70\x6D\x75\xA6\x0D", 20) == 0\r
+                               if(memcmp(&Hash, &SSLRootCAFileHash, 20) == 0 || memcmp(&Hash, "\x45\xBF\x6E\x22\xC1\x7C\xEC\x8D\xAB\x3D\x13\x7F\x2B\x93\x1C\x79\x04\x5B\x07\x0C", 20) == 0\r
                                        || DialogBox(GetFtpInst(), MAKEINTRESOURCE(updatesslroot_dlg), GetMainHwnd(), ExeEscDialogProc) == YES)\r
                                {\r
                                        memcpy(&SSLRootCAFileHash, &Hash, 20);\r
@@ -3098,3 +3240,21 @@ int AskDispFileIcon(void)
        return(DispFileIcon);\r
 }\r
 \r
+// ポータブル版判定\r
+void CheckPortableVersion()\r
+{\r
+       HANDLE hFile;\r
+       if((hFile = CreateFile(PortableFilePath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL)) != INVALID_HANDLE_VALUE)\r
+       {\r
+               PortableVersion = YES;\r
+               CloseHandle(hFile);\r
+       }\r
+       else\r
+               PortableVersion = NO;\r
+}\r
+\r
+int AskPortableVersion(void)\r
+{\r
+       return(PortableVersion);\r
+}\r
+\r