X-Git-Url: http://git.sourceforge.jp/view?p=ffftp%2Fffftp.git;a=blobdiff_plain;f=main.c;h=d568d3442bd7a659125f1af7a1f411779ac0c508;hp=d01e229cb3c360b0d56e31749995e83f96bbfa4d;hb=31ed1ad41a53d5c866a263d6a6d115990677a926;hpb=e587af53be87fb0de7da2daf07813970b6e0bfad diff --git a/main.c b/main.c index d01e229..d568d34 100644 --- a/main.c +++ b/main.c @@ -128,7 +128,9 @@ char FilterStr[FILTER_EXT_LEN+1] = { "*" }; int CancelFlg; -static int SuppressRefresh = 0; +// 外部アプリケーションへドロップ後にローカル側のファイル一覧に作業フォルダが表示されるバグ対策 +//static int SuppressRefresh = 0; +int SuppressRefresh = 0; static DWORD dwCookie; @@ -136,6 +138,9 @@ static DWORD dwCookie; static char SSLRootCAFilePath[FMAX_PATH+1]; // マルチコアCPUの特定環境下でファイル通信中にクラッシュするバグ対策 static DWORD MainThreadId; +// ポータブル版判定 +static char PortableFilePath[FMAX_PATH+1]; +int PortableVersion; /*===== グローバルなワーク =====*/ @@ -171,7 +176,9 @@ int TransMode = TYPE_X; int ConnectOnStart = YES; int DebugConsole = NO; int SaveWinPos = NO; -char AsciiExt[ASCII_EXT_LEN+1] = { "*.txt\0*.html\0*.htm\0*.cgi\0*.pl\0" }; +// アスキーモード判別の改良 +//char AsciiExt[ASCII_EXT_LEN+1] = { "*.txt\0*.html\0*.htm\0*.cgi\0*.pl\0" }; +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" }; int RecvMode = TRANS_DLG; int SendMode = TRANS_DLG; int MoveMode = MOVE_DLG; @@ -201,7 +208,9 @@ int FwallSecurity = SECURITY_AUTO; int FwallResolv = NO; int FwallLower = NO; int FwallDelimiter = '@'; -int PasvDefault = NO; +// ルータ対策 +//int PasvDefault = NO; +int PasvDefault = YES; char MirrorNoTrn[MIRROR_LEN+1] = { "*.bak\0" }; char MirrorNoDel[MIRROR_LEN+1] = { "" }; int MirrorFnameCnv = NO; @@ -233,6 +242,8 @@ BYTE CertificateCacheHash[MAX_CERT_CACHE_HASH][20]; BYTE SSLRootCAFileHash[20]; // ファイルアイコン表示対応 int DispFileIcon = NO; +// ディレクトリ自動作成 +int MakeAllDir = YES; @@ -258,66 +269,68 @@ int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLi // プロセス保護 #ifdef ENABLE_PROCESS_PROTECTION - DWORD ProtectLevel; - char* pCommand; - char Option[FMAX_PATH+1]; - ProtectLevel = PROCESS_PROTECTION_NONE; - pCommand = lpszCmdLine; - while(pCommand = GetToken(pCommand, Option)) { - if(strcmp(Option, "--protect") == 0) + DWORD ProtectLevel; + char* pCommand; + char Option[FMAX_PATH+1]; + ProtectLevel = PROCESS_PROTECTION_NONE; + pCommand = lpszCmdLine; + while(pCommand = GetToken(pCommand, Option)) { - ProtectLevel = PROCESS_PROTECTION_DEFAULT; - break; - } - else if(strcmp(Option, "--protect-high") == 0) - { - ProtectLevel = PROCESS_PROTECTION_HIGH; - break; - } - else if(strcmp(Option, "--protect-medium") == 0) - { - ProtectLevel = PROCESS_PROTECTION_MEDIUM; - break; - } - else if(strcmp(Option, "--protect-low") == 0) - { - ProtectLevel = PROCESS_PROTECTION_LOW; - break; + if(strcmp(Option, "--protect") == 0) + { + ProtectLevel = PROCESS_PROTECTION_DEFAULT; + break; + } + else if(strcmp(Option, "--protect-high") == 0) + { + ProtectLevel = PROCESS_PROTECTION_HIGH; + break; + } + else if(strcmp(Option, "--protect-medium") == 0) + { + ProtectLevel = PROCESS_PROTECTION_MEDIUM; + break; + } + else if(strcmp(Option, "--protect-low") == 0) + { + ProtectLevel = PROCESS_PROTECTION_LOW; + break; + } } - } - if(ProtectLevel != PROCESS_PROTECTION_NONE) - { - SetProcessProtectionLevel(ProtectLevel); - if(!InitializeLoadLibraryHook()) + if(ProtectLevel != PROCESS_PROTECTION_NONE) { - MessageBox(NULL, MSGJPN321, "FFFTP", MB_OK | MB_ICONERROR); - return 0; - } + SetProcessProtectionLevel(ProtectLevel); + if(!InitializeLoadLibraryHook()) + { + MessageBox(NULL, MSGJPN321, "FFFTP", MB_OK | MB_ICONERROR); + return 0; + } #ifndef _DEBUG - if(IsDebuggerPresent()) - { - MessageBox(NULL, MSGJPN322, "FFFTP", MB_OK | MB_ICONERROR); - return 0; - } + if(IsDebuggerPresent()) + { + MessageBox(NULL, MSGJPN322, "FFFTP", MB_OK | MB_ICONERROR); + return 0; + } #endif - if(!UnloadUntrustedModule()) - { - MessageBox(NULL, MSGJPN323, "FFFTP", MB_OK | MB_ICONERROR); - return 0; - } + if(!UnloadUntrustedModule()) + { + MessageBox(NULL, MSGJPN323, "FFFTP", MB_OK | MB_ICONERROR); + return 0; + } #ifndef _DEBUG - if(RestartProtectedProcess(" --restart")) - return 0; + if(RestartProtectedProcess(" --restart")) + return 0; #endif - if(!EnableLoadLibraryHook(TRUE)) - { - MessageBox(NULL, MSGJPN324, "FFFTP", MB_OK | MB_ICONERROR); - return 0; + if(!EnableLoadLibraryHook(TRUE)) + { + MessageBox(NULL, MSGJPN324, "FFFTP", MB_OK | MB_ICONERROR); + return 0; + } } + else + InitializeLoadLibraryHook(); } - else - InitializeLoadLibraryHook(); #endif // マルチコアCPUの特定環境下でファイル通信中にクラッシュするバグ対策 @@ -339,6 +352,9 @@ int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLi LoadOpenSSL(); #endif + // SFTP対応 + LoadPuTTY(); + Ret = FALSE; hWndFtp = NULL; hInstFtp = hInstance; @@ -374,6 +390,8 @@ int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLi #ifdef USE_OPENSSL FreeOpenSSL(); #endif + // SFTP対応 + FreePuTTY(); OleUninitialize(); return(Ret); } @@ -400,6 +418,8 @@ static int InitApp(LPSTR lpszCmdLine, int cmdShow) char PwdBuf[FMAX_PATH+1]; int useDefautPassword = 0; /* 警告文表示用 */ int masterpass; + // ポータブル版判定 + int ImportPortable; sts = FFFTP_FAIL; @@ -437,13 +457,32 @@ static int InitApp(LPSTR lpszCmdLine, int cmdShow) ForceIni = YES; RegType = REGTYPE_INI; } + // ポータブル版判定 + GetModuleFileName(NULL, PortableFilePath, FMAX_PATH); + strcpy(GetFileName(PortableFilePath), "portable"); + CheckPortableVersion(); + ImportPortable = NO; + if(PortableVersion == YES) + { + ForceIni = YES; + RegType = REGTYPE_INI; + if(IsRegAvailable() == YES && IsIniAvailable() == NO) + { + if(DialogBox(GetFtpInst(), MAKEINTRESOURCE(ini_from_reg_dlg), GetMainHwnd(), ExeEscDialogProc) == YES) + { + ImportPortable = YES; + ForceIni = NO; + RegType = REGTYPE_REG; + } + } + } // AllocConsole(); /* 2010.02.01 genta マスターパスワードを入力させる -z オプションがあるときは最初だけスキップ -z オプションがないときは,デフォルトパスワードをまず試す - LoadRegistory()する + LoadRegistry()する パスワードが不一致なら再入力するか尋ねる. (破損していた場合はさせない) */ @@ -488,7 +527,14 @@ static int InitApp(LPSTR lpszCmdLine, int cmdShow) if(masterpass != 0) { - LoadRegistory(); + LoadRegistry(); + + // ポータブル版判定 + if(ImportPortable == YES) + { + ForceIni = YES; + RegType = REGTYPE_INI; + } // 暗号化通信対応 SetSSLTimeoutCallback(TimeOut * 1000, SSLTimeoutCallback); @@ -537,7 +583,7 @@ static int InitApp(LPSTR lpszCmdLine, int cmdShow) DispWindowTitle(); // SourceForge.JPによるフォーク // SetTaskMsg("FFFTP Ver." VER_STR " Copyright(C) 1997-2010 Sota & cooperators."); - 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)."); + 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)."); if(ForceIni) SetTaskMsg("%s%s", MSGJPN283, IniPath); @@ -974,6 +1020,22 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA case MENU_DCLICK : if(hWndCurFocus == GetLocalHwnd()) + // ローカルフォルダを開く +// DoubleClickProc(WIN_LOCAL, YES, -1); + DoubleClickProc(WIN_LOCAL, NO, -1); + else + { + SuppressRefresh = 1; + // ローカルフォルダを開く +// DoubleClickProc(WIN_REMOTE, YES, -1); + DoubleClickProc(WIN_REMOTE, NO, -1); + SuppressRefresh = 0; + } + break; + + // ローカルフォルダを開く + case MENU_OPEN : + if(hWndCurFocus == GetLocalHwnd()) DoubleClickProc(WIN_LOCAL, YES, -1); else { @@ -1017,6 +1079,9 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA break; case MENU_REMOTE_UPDIR : + // デッドロック対策 + if(AskUserOpeDisabled() == YES) + break; SuppressRefresh = 1; SetCurrentDirAsDirHist(); ChangeDir(WIN_REMOTE, ".."); @@ -1024,6 +1089,9 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA break; case MENU_LOCAL_UPDIR : + // デッドロック対策 + if(AskUserOpeDisabled() == YES) + break; SetCurrentDirAsDirHist(); ChangeDir(WIN_LOCAL, ".."); break; @@ -1042,42 +1110,42 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA case MENU_DOWNLOAD : SetCurrentDirAsDirHist(); - DownLoadProc(NO, NO, NO); + DownloadProc(NO, NO, NO); break; case MENU_DOWNLOAD_AS : SetCurrentDirAsDirHist(); - DownLoadProc(YES, NO, NO); + DownloadProc(YES, NO, NO); break; case MENU_DOWNLOAD_AS_FILE : SetCurrentDirAsDirHist(); - DownLoadProc(NO, YES, NO); + DownloadProc(NO, YES, NO); break; case MENU_DOWNLOAD_ALL : SetCurrentDirAsDirHist(); - DownLoadProc(NO, NO, YES); + DownloadProc(NO, NO, YES); break; case MENU_DOWNLOAD_NAME : SetCurrentDirAsDirHist(); - InputDownLoadProc(); + InputDownloadProc(); break; case MENU_UPLOAD : SetCurrentDirAsDirHist(); - UpLoadListProc(NO, NO); + UploadListProc(NO, NO); break; case MENU_UPLOAD_AS : SetCurrentDirAsDirHist(); - UpLoadListProc(YES, NO); + UploadListProc(YES, NO); break; case MENU_UPLOAD_ALL : SetCurrentDirAsDirHist(); - UpLoadListProc(NO, YES); + UploadListProc(NO, YES); break; case MENU_MIRROR_UPLOAD : @@ -1226,6 +1294,9 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA break; case MENU_REFRESH : + // デッドロック対策 + if(AskUserOpeDisabled() == YES) + break; // 同時接続対応 CancelFlg = NO; SuppressRefresh = 1; @@ -1252,6 +1323,9 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA break; case REFRESH_REMOTE : + // デッドロック対策 + if(AskUserOpeDisabled() == YES) + break; // 同時接続対応 CancelFlg = NO; SuppressRefresh = 1; @@ -1320,6 +1394,9 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA break; case MENU_DOTFILE : + // デッドロック対策 + if(AskUserOpeDisabled() == YES) + break; // 同時接続対応 CancelFlg = NO; DotFile ^= 1; @@ -1338,7 +1415,7 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA case MENU_REGSAVE : GetListTabWidth(); - SaveRegistory(); + SaveRegistry(); SaveSettingsToFile(); break; @@ -1354,7 +1431,9 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA case MENU_REGINIT : if(DialogBox(hInstFtp, MAKEINTRESOURCE(reginit_dlg), hWnd, ExeEscDialogProc) == YES) { - ClearRegistory(); + ClearRegistry(); + // ポータブル版判定 + ClearIni(); SaveExit = NO; PostMessage(hWnd, WM_CLOSE, 0, 0L); } @@ -1366,9 +1445,34 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA if( DialogBox(hInstFtp, MAKEINTRESOURCE(forcepasschange_dlg), hWnd, ExeEscDialogProc) != YES){ break; } + // セキュリティ強化 + if(EnterMasterPasswordAndSet(newmasterpasswd_dlg, hWnd) != 0) + SetTaskMsg(MSGJPN303); } - if( EnterMasterPasswordAndSet( newmasterpasswd_dlg, hWnd ) != 0 ){ - SetTaskMsg( MSGJPN303 ); + // セキュリティ強化 +// if( EnterMasterPasswordAndSet( newmasterpasswd_dlg, hWnd ) != 0 ){ +// SetTaskMsg( MSGJPN303 ); +// } + else if(GetMasterPasswordStatus() == PASSWORD_OK) + { + char Password[MAX_PASSWORD_LEN + 1]; + GetMasterPassword(Password); + SetMasterPassword(NULL); + while(ValidateMasterPassword() == YES && GetMasterPasswordStatus() == PASSWORD_UNMATCH) + { + if(EnterMasterPasswordAndSet(masterpasswd_dlg, NULL) == 0) + break; + } + if(GetMasterPasswordStatus() == PASSWORD_OK && EnterMasterPasswordAndSet(newmasterpasswd_dlg, hWnd) != 0) + { + SetTaskMsg(MSGJPN303); + SaveRegistry(); + } + else + { + SetMasterPassword(Password); + ValidateMasterPassword(); + } } break; @@ -1402,6 +1506,12 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA LocalRbuttonMenu(1); break; +#if defined(HAVE_TANDEM) + case MENU_SWITCH_OSS : + SwitchOSSProc(); + break; +#endif + default : if((LOWORD(wParam) >= MENU_BMARK_TOP) && (LOWORD(wParam) < MENU_BMARK_TOP+100)) @@ -1444,7 +1554,15 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA case MENU_DOWNLOAD : lpttt->lpszText = MSGJPN157; break; +#if defined(HAVE_TANDEM) + case MENU_DOWNLOAD_AS : + lpttt->lpszText = MSGJPN065; + break; + case MENU_UPLOAD_AS : + lpttt->lpszText = MSGJPN064; + break; +#endif case MENU_UPLOAD : lpttt->lpszText = MSGJPN158; break; @@ -1633,7 +1751,10 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA break; case WM_REFRESH_LOCAL_FLG : - PostMessage(hWnd, WM_COMMAND, MAKEWPARAM(REFRESH_LOCAL, 0), 0); + // 外部アプリケーションへドロップ後にローカル側のファイル一覧に作業フォルダが表示されるバグ対策 +// PostMessage(hWnd, WM_COMMAND, MAKEWPARAM(REFRESH_LOCAL, 0), 0); + if(SuppressRefresh == 0) + PostMessage(hWnd, WM_COMMAND, MAKEWPARAM(REFRESH_LOCAL, 0), 0); break; case WM_REFRESH_REMOTE_FLG : @@ -1721,6 +1842,18 @@ static void StartupProc(char *Cmd) if(CmdOption & OPT_SAVEON) SuppressSave = NO; + // UTF-8対応 + if(CmdOption & OPT_SJIS) + Kanji = KANJI_SJIS; + if(CmdOption & OPT_UTF8N) + Kanji = KANJI_UTF8N; + if(CmdOption & OPT_UTF8BOM) + Kanji = KANJI_UTF8BOM; + if(CmdOption & OPT_SJIS_NAME) + FnameKanji = KANJI_SJIS; + if(CmdOption & OPT_UTF8N_NAME) + FnameKanji = KANJI_UTF8N; + if(Sts == 0) { if(ConnectOnStart == YES) @@ -1792,9 +1925,14 @@ static int AnalyzeComLine(char *Str, int *AutoConnect, int *CmdOption, char *unc *CmdOption |= OPT_MIRROR; else if((strcmp(&Tmp[1], "d") == 0) || (strcmp(&Tmp[1], "-mirrordown") == 0)) *CmdOption |= OPT_MIRRORDOWN; - else if((strcmp(&Tmp[1], "e") == 0) || (strcmp(&Tmp[1], "-euc") == 0)) + // 廃止予定 +// else if((strcmp(&Tmp[1], "e") == 0) || (strcmp(&Tmp[1], "-euc") == 0)) +// *CmdOption |= OPT_EUC; +// else if((strcmp(&Tmp[1], "j") == 0) || (strcmp(&Tmp[1], "-jis") == 0)) +// *CmdOption |= OPT_JIS; + else if((strcmp(&Tmp[1], "eu") == 0) || (strcmp(&Tmp[1], "e") == 0) || (strcmp(&Tmp[1], "-euc") == 0)) *CmdOption |= OPT_EUC; - else if((strcmp(&Tmp[1], "j") == 0) || (strcmp(&Tmp[1], "-jis") == 0)) + else if((strcmp(&Tmp[1], "ji") == 0) || (strcmp(&Tmp[1], "j") == 0) || (strcmp(&Tmp[1], "-jis") == 0)) *CmdOption |= OPT_JIS; else if((strcmp(&Tmp[1], "a") == 0) || (strcmp(&Tmp[1], "-ascii") == 0)) *CmdOption |= OPT_ASCII; @@ -1808,9 +1946,14 @@ static int AnalyzeComLine(char *Str, int *AutoConnect, int *CmdOption, char *unc *CmdOption |= OPT_QUIT; else if((strcmp(&Tmp[1], "k") == 0) || (strcmp(&Tmp[1], "-kana") == 0)) *CmdOption |= OPT_KANA; - else if((strcmp(&Tmp[1], "u") == 0) || (strcmp(&Tmp[1], "-eucname") == 0)) + // 廃止予定 +// else if((strcmp(&Tmp[1], "u") == 0) || (strcmp(&Tmp[1], "-eucname") == 0)) +// *CmdOption |= OPT_EUC_NAME; +// else if((strcmp(&Tmp[1], "i") == 0) || (strcmp(&Tmp[1], "-jisname") == 0)) +// *CmdOption |= OPT_JIS_NAME; + else if((strcmp(&Tmp[1], "eun") == 0) || (strcmp(&Tmp[1], "u") == 0) || (strcmp(&Tmp[1], "-eucname") == 0)) *CmdOption |= OPT_EUC_NAME; - else if((strcmp(&Tmp[1], "i") == 0) || (strcmp(&Tmp[1], "-jisname") == 0)) + else if((strcmp(&Tmp[1], "jin") == 0) || (strcmp(&Tmp[1], "i") == 0) || (strcmp(&Tmp[1], "-jisname") == 0)) *CmdOption |= OPT_JIS_NAME; else if((strcmp(&Tmp[1], "n") == 0) || (strcmp(&Tmp[1], "-ini") == 0)) { @@ -1880,6 +2023,17 @@ static int AnalyzeComLine(char *Str, int *AutoConnect, int *CmdOption, char *unc { } #endif + // UTF-8対応 + else if((strcmp(&Tmp[1], "sj") == 0) || (strcmp(&Tmp[1], "-sjis") == 0)) + *CmdOption |= OPT_SJIS; + else if((strcmp(&Tmp[1], "u8") == 0) || (strcmp(&Tmp[1], "-utf8") == 0)) + *CmdOption |= OPT_UTF8N; + else if((strcmp(&Tmp[1], "8b") == 0) || (strcmp(&Tmp[1], "-utf8bom") == 0)) + *CmdOption |= OPT_UTF8BOM; + else if((strcmp(&Tmp[1], "sjn") == 0) || (strcmp(&Tmp[1], "-sjisname") == 0)) + *CmdOption |= OPT_SJIS_NAME; + else if((strcmp(&Tmp[1], "u8n") == 0) || (strcmp(&Tmp[1], "-utf8name") == 0)) + *CmdOption |= OPT_UTF8N_NAME; else { SetTaskMsg(MSGJPN180, Tmp); @@ -2047,7 +2201,10 @@ static void ExitProc(HWND hWnd) if(SaveExit == YES) { GetListTabWidth(); - SaveRegistory(); + SaveRegistry(); + // ポータブル版判定 + if(RegType == REGTYPE_REG) + ClearIni(); if((CacheEntry > 0) && (CacheSave == YES)) SaveCache(); @@ -2108,7 +2265,9 @@ void DoubleClickProc(int Win, int Mode, int App) if(Win == WIN_LOCAL) { - if((App != -1) || (Type == NODE_FILE)) + // ローカルフォルダを開く +// if((App != -1) || (Type == NODE_FILE)) + if((App != -1) || (Type == NODE_FILE) || (Mode == YES)) { if((DclickOpen == YES) || (Mode == YES)) { @@ -2185,12 +2344,12 @@ void DoubleClickProc(int Win, int Mode, int App) /* 不正なパスを検出 */ if(CheckPathViolation(&MainTransPkt) == NO) { -// if((Sts = DoDownLoad(AskCmdCtrlSkt(), &MainTransPkt, NO)) == 429) +// if((Sts = DoDownload(AskCmdCtrlSkt(), &MainTransPkt, NO)) == 429) // { // ReConnectCmdSkt(); // 同時接続対応 CancelFlg = NO; - Sts = DoDownLoad(AskCmdCtrlSkt(), &MainTransPkt, NO, &CancelFlg); + Sts = DoDownload(AskCmdCtrlSkt(), &MainTransPkt, NO, &CancelFlg); // } } @@ -2554,6 +2713,13 @@ void ExecViewer(char *Fname, int App) DoPrintf("ShellExecute - %s", Fname); ShellExecute(NULL, "open", Fname, NULL, CurDir, SW_SHOW); } + // ローカルフォルダを開く + else if((App == -1) && (GetFileAttributes(Fname) & FILE_ATTRIBUTE_DIRECTORY)) + { + MakeDistinguishableFileName(ComLine, Fname); + DoPrintf("ShellExecute - %s", Fname); + ShellExecute(NULL, "open", ComLine, NULL, Fname, SW_SHOW); + } else { App = max1(0, App); @@ -3050,7 +3216,7 @@ BOOL LoadSSLRootCAFile() for(i = 0; i < 5; i++) Hash[i] = _byteswap_ulong(Hash[i]); // 同梱する"ssl.pem"に合わせてSHA1ハッシュ値を変更すること - 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 + if(memcmp(&Hash, &SSLRootCAFileHash, 20) == 0 || memcmp(&Hash, "\x63\xAC\x6C\x43\xCE\xD6\x5B\xCF\x33\xB9\x45\x70\xC3\x9B\x8C\x91\x19\x0D\xEF\xE6", 20) == 0 || DialogBox(GetFtpInst(), MAKEINTRESOURCE(updatesslroot_dlg), GetMainHwnd(), ExeEscDialogProc) == YES) { memcpy(&SSLRootCAFileHash, &Hash, 20); @@ -3079,3 +3245,21 @@ int AskDispFileIcon(void) return(DispFileIcon); } +// ポータブル版判定 +void CheckPortableVersion() +{ + HANDLE hFile; + if((hFile = CreateFile(PortableFilePath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL)) != INVALID_HANDLE_VALUE) + { + PortableVersion = YES; + CloseHandle(hFile); + } + else + PortableVersion = NO; +} + +int AskPortableVersion(void) +{ + return(PortableVersion); +} +