X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=main.c;h=bebf19af4dc049bf2ec453d7fa56656f9977091d;hb=958645db907a83aeac5b3f888b1652c4720cf36d;hp=2f3eacbe542402545d24149beb9413dc444d4057;hpb=c30cc851b60a7c4006cd02b4718d9738a6c4049a;p=ffftp%2Fffftp.git diff --git a/main.c b/main.c index 2f3eacb..bebf19a 100644 --- a/main.c +++ b/main.c @@ -28,24 +28,36 @@ /============================================================================*/ #define STRICT +// IPv6対応 +#include #include #include #include #include #include +// 自動切断対策 +#include #include #include #include #include -#include +// IPv6対応 +//#include +// タスクバー進捗表示 +#include #include "common.h" #include "resource.h" #include "aes.h" +// 暗号化通信対応 +#include "sha.h" #include #include "helpid.h" +// ソフトウェア自動更新 +#include "updater.h" + // UTF-8対応 #undef __MBSWRAPPER_H__ #include "mbswrapper.h" @@ -79,7 +91,9 @@ static void CalcWinSize(void); static void CheckResizeFrame(WPARAM Keys, int x, int y); static void DispDirInfo(void); static void DeleteAlltempFile(void); -static BOOL CALLBACK AboutDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam); +// 64ビット対応 +//static BOOL CALLBACK AboutDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam); +static INT_PTR CALLBACK AboutDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam); static int EnterMasterPasswordAndSet( int Res, HWND hWnd ); /*===== ローカルなワーク =====*/ @@ -121,10 +135,28 @@ char FilterStr[FILTER_EXT_LEN+1] = { "*" }; int CancelFlg; -static int SuppressRefresh = 0; +// 外部アプリケーションへドロップ後にローカル側のファイル一覧に作業フォルダが表示されるバグ対策 +//static int SuppressRefresh = 0; +int SuppressRefresh = 0; static DWORD dwCookie; +// 暗号化通信対応 +static char SSLRootCAFilePath[FMAX_PATH+1]; +// マルチコアCPUの特定環境下でファイル通信中にクラッシュするバグ対策 +static DWORD MainThreadId; +// ポータブル版判定 +static char PortableFilePath[FMAX_PATH+1]; +static int PortableVersion; +// ローカル側自動更新 +HANDLE ChangeNotification = INVALID_HANDLE_VALUE; +// タスクバー進捗表示 +static ITaskbarList3* pTaskbarList3; +// 高DPI対応 +static int ToolWinHeight; +// ソフトウェア自動更新 +static int ApplyUpdatesOnExit = NO; + /*===== グローバルなワーク =====*/ @@ -133,12 +165,20 @@ HWND hHelpWin = NULL; /* 設定値 */ int WinPosX = CW_USEDEFAULT; int WinPosY = 0; -int WinWidth = 630; -int WinHeight = 393; -int LocalWidth = 309; -int TaskHeight = 50; -int LocalTabWidth[4] = { 120, 90, 60, 37 }; -int RemoteTabWidth[6] = { 120, 90, 60, 37, 60, 60 }; +// 機能が増えたためサイズ変更 +// VGAサイズに収まるようになっていたのをSVGAサイズに引き上げ +//int WinWidth = 630; +//int WinHeight = 393; +//int LocalWidth = 309; +//int TaskHeight = 50; +//int LocalTabWidth[4] = { 120, 90, 60, 37 }; +//int RemoteTabWidth[6] = { 120, 90, 60, 37, 60, 60 }; +int WinWidth = 790; +int WinHeight = 513; +int LocalWidth = 389; +int TaskHeight = 100; +int LocalTabWidth[4] = { 150, 120, 60, 37 }; +int RemoteTabWidth[6] = { 150, 120, 60, 37, 60, 60 }; char UserMailAdrs[USER_MAIL_LEN+1] = { "who@example.com" }; char ViewerName[VIEWERS][FMAX_PATH+1] = { { "notepad" }, { "" }, { "" } }; HFONT ListFont = NULL; @@ -151,7 +191,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; @@ -178,10 +220,12 @@ int FwallPort = PORT_NOR; int FwallType = 1; int FwallDefault = NO; int FwallSecurity = SECURITY_AUTO; -int FwallResolv = NO; +int FwallResolve = 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; @@ -208,8 +252,38 @@ int MirUpDelNotify = YES; int MirDownDelNotify = YES; int FolderAttr = NO; int FolderAttrNum = 777; -// 同時接続対応 -int MaxThreadCount = 1; +// 暗号化通信対応 +BYTE CertificateCacheHash[MAX_CERT_CACHE_HASH][20]; +BYTE SSLRootCAFileHash[20]; +// ファイルアイコン表示対応 +int DispFileIcon = NO; +// タイムスタンプのバグ修正 +int DispTimeSeconds = NO; +// ファイルの属性を数字で表示 +int DispPermissionsNumber = NO; +// ディレクトリ自動作成 +int MakeAllDir = YES; +// UTF-8対応 +int LocalKanjiCode = KANJI_SJIS; +// 自動切断対策 +int NoopEnable = NO; +// UPnP対応 +int UPnPEnabled = YES; +time_t LastDataConnectionTime = 0; +// 全設定暗号化対応 +int EncryptAllSettings = NO; +// ローカル側自動更新 +int AutoRefreshFileList = YES; +// 古い処理内容を消去 +int RemoveOldLog = NO; +// バージョン確認 +int ReadOnlySettings = NO; +// ソフトウェア自動更新 +int AutoCheckForUpdates = YES; +int AutoApplyUpdates = NO; +int AutoCheckForUptatesInterval = 7; +time_t LastAutoCheckForUpdates = 0; + @@ -231,24 +305,55 @@ int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLi MSG Msg; int Ret; BOOL Sts; - // プロセス保護 -#ifdef ENABLE_PROCESS_PROTECTION - BOOL bProtect; char* pCommand; + DWORD ProtectLevel; char Option[FMAX_PATH+1]; - bProtect = FALSE; + // ソフトウェア自動更新 + int ImmediateExit; + char PrivateKeyFile[FMAX_PATH+1]; + char Password[FMAX_PATH+1]; + char ServerPath[FMAX_PATH+1]; + char HashFile[FMAX_PATH+1]; + char ListFile[FMAX_PATH+1]; + char Description[FMAX_PATH+1]; + char UpdateDir[FMAX_PATH+1]; + char Path[FMAX_PATH+1]; + char Command[FMAX_PATH+1]; + char* p; + +#ifdef ENABLE_PROCESS_PROTECTION + ProtectLevel = PROCESS_PROTECTION_NONE; pCommand = lpszCmdLine; while(pCommand = GetToken(pCommand, Option)) { - if(strcmp(Option, "--protect") == 0) + if(Option[0] == '-') { - bProtect = TRUE; - break; + if(strcmp(&Option[1], "-protect") == 0) + { + ProtectLevel = PROCESS_PROTECTION_DEFAULT; + break; + } + else if(strcmp(&Option[1], "-protect-high") == 0) + { + ProtectLevel = PROCESS_PROTECTION_HIGH; + break; + } + else if(strcmp(&Option[1], "-protect-medium") == 0) + { + ProtectLevel = PROCESS_PROTECTION_MEDIUM; + break; + } + else if(strcmp(&Option[1], "-protect-low") == 0) + { + ProtectLevel = PROCESS_PROTECTION_LOW; + break; + } } } - if(bProtect) + if(ProtectLevel != PROCESS_PROTECTION_NONE) { + SetProcessProtectionLevel(ProtectLevel); if(!InitializeLoadLibraryHook()) { MessageBox(NULL, MSGJPN321, "FFFTP", MB_OK | MB_ICONERROR); @@ -280,9 +385,11 @@ int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLi InitializeLoadLibraryHook(); #endif + // マルチコアCPUの特定環境下でファイル通信中にクラッシュするバグ対策 #ifdef DISABLE_MULTI_CPUS SetProcessAffinityMask(GetCurrentProcess(), 1); #endif + MainThreadId = GetCurrentThreadId(); // yutaka if(OleInitialize(NULL) != S_OK){ @@ -292,15 +399,80 @@ int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLi InitCommonControls(); + // UPnP対応 + CoInitialize(NULL); + LoadUPnP(); + // タスクバー進捗表示 + LoadTaskbarList3(); + + // UTF-8対応 + LoadUnicodeNormalizationDll(); + // FTPS対応 #ifdef USE_OPENSSL LoadOpenSSL(); #endif + // ソフトウェア自動更新 + ImmediateExit = NO; + pCommand = lpszCmdLine; + while(pCommand = GetToken(pCommand, Option)) + { + if(Option[0] == '-') + { + if(strcmp(&Option[1], "-build-software-update") == 0) + { + if(pCommand = GetToken(pCommand, PrivateKeyFile)) + { + if(pCommand = GetToken(pCommand, Password)) + { + if(pCommand = GetToken(pCommand, ServerPath)) + { + if(pCommand = GetToken(pCommand, HashFile)) + { + if(pCommand = GetToken(pCommand, ListFile)) + { + if(pCommand = GetToken(pCommand, Description)) + BuildUpdates(PrivateKeyFile, Password, ServerPath, HashFile, ListFile, RELEASE_VERSION_NUM, VER_STR, Description); + } + } + } + } + } + ImmediateExit = YES; + break; + } + else if(strcmp(&Option[1], "-software-update") == 0) + { + if(pCommand = GetToken(pCommand, UpdateDir)) + { + if(!RestartUpdateProcessAsAdministrator(lpszCmdLine, " --restart")) + { + Sleep(1000); + if(ApplyUpdates(UpdateDir, "updatebackup")) + MessageBox(NULL, MSGJPN358, "FFFTP", MB_OK); + else + MessageBox(NULL, MSGJPN359, "FFFTP", MB_OK | MB_ICONERROR); + } + } + ImmediateExit = YES; + break; + } + else if(strcmp(&Option[1], "-software-cleanup") == 0) + { + if(pCommand = GetToken(pCommand, UpdateDir)) + CleanupUpdates(UpdateDir); + break; + } + } + } + Ret = FALSE; hWndFtp = NULL; hInstFtp = hInstance; - if(InitApp(lpszCmdLine, cmdShow) == FFFTP_SUCCESS) + // ソフトウェア自動更新 +// if(InitApp(lpszCmdLine, cmdShow) == FFFTP_SUCCESS) + if(ImmediateExit == NO && InitApp(lpszCmdLine, cmdShow) == FFFTP_SUCCESS) { for(;;) { @@ -308,7 +480,9 @@ int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLi if((Sts == 0) || (Sts == -1)) break; - if(!HtmlHelp(NULL, NULL, HH_PRETRANSLATEMESSAGE, (DWORD)&Msg)) + // 64ビット対応 +// if(!HtmlHelp(NULL, NULL, HH_PRETRANSLATEMESSAGE, (DWORD)&Msg)) + if(!HtmlHelp(NULL, NULL, HH_PRETRANSLATEMESSAGE, (DWORD_PTR)&Msg)) { /* ディレクトリ名の表示コンボボックスでBSやRETが効くように */ /* コンボボックス内ではアクセラレータを無効にする */ @@ -330,7 +504,32 @@ int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLi #ifdef USE_OPENSSL FreeOpenSSL(); #endif + // タスクバー進捗表示 + FreeTaskbarList3(); + // UPnP対応 + FreeUPnP(); + CoUninitialize(); OleUninitialize(); + // ソフトウェア自動更新 + if(ApplyUpdatesOnExit == YES) + { + Sts = FALSE; + if(GetModuleFileName(NULL, UpdateDir, FMAX_PATH) > 0) + { + if(p = strrchr(UpdateDir, '\\')) + { + *p = '\0'; + strcpy(Path, TmpPath); + SetYenTail(Path); + strcat(Path, "update"); + sprintf(Command, "-%s \"%s\"", "-software-update", UpdateDir); + if(StartUpdateProcess(Path, Command)) + Sts = TRUE; + } + } + if(!Sts) + MessageBox(NULL, MSGJPN359, "FFFTP", MB_OK | MB_ICONERROR); + } return(Ret); } @@ -356,13 +555,19 @@ static int InitApp(LPSTR lpszCmdLine, int cmdShow) char PwdBuf[FMAX_PATH+1]; int useDefautPassword = 0; /* 警告文表示用 */ int masterpass; + // ポータブル版判定 + int ImportPortable; + // 高DPI対応 + int i; sts = FFFTP_FAIL; aes_init(); srand(GetTickCount()); - HtmlHelp(NULL, NULL, HH_INITIALIZE, (DWORD)&dwCookie); + // 64ビット対応 +// HtmlHelp(NULL, NULL, HH_INITIALIZE, (DWORD)&dwCookie); + HtmlHelp(NULL, NULL, HH_INITIALIZE, (DWORD_PTR)&dwCookie); SaveUpdateBellInfo(); @@ -372,7 +577,21 @@ static int InitApp(LPSTR lpszCmdLine, int cmdShow) { Accel = LoadAccelerators(hInstFtp, MAKEINTRESOURCE(ffftp_accel)); - GetTempPath(FMAX_PATH, TmpPath); + // 環境依存の不具合対策 +// GetTempPath(FMAX_PATH, TmpPath); + GetAppTempPath(TmpPath); + _mkdir(TmpPath); + SetYenTail(TmpPath); + + // 高DPI対応 + WinWidth = CalcPixelX(WinWidth); + WinHeight = CalcPixelY(WinHeight); + LocalWidth = CalcPixelX(LocalWidth); + TaskHeight = CalcPixelY(TaskHeight); + for(i = 0; i < sizeof(LocalTabWidth) / sizeof(int); i++) + LocalTabWidth[i] = CalcPixelX(LocalTabWidth[i]); + for(i = 0; i < sizeof(RemoteTabWidth) / sizeof(int); i++) + RemoteTabWidth[i] = CalcPixelX(RemoteTabWidth[i]); GetModuleFileName(NULL, HelpPath, FMAX_PATH); strcpy(GetFileName(HelpPath), "ffftp.chm"); @@ -387,13 +606,52 @@ 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; + } + } + // バージョン確認 + if(ReadSettingsVersion() > VER_NUM) + { + if(IsRegAvailable() == YES && IsIniAvailable() == NO) + { + switch(MessageBox(GetMainHwnd(), MSGJPN350, "FFFTP", MB_YESNOCANCEL | MB_DEFBUTTON2)) + { + case IDCANCEL: + ReadOnlySettings = YES; + break; + case IDYES: + break; + case IDNO: + ImportPortable = YES; + break; + } + } + } + // ポータブル版判定 + if(ImportPortable == YES) + { + ForceIni = NO; + RegType = REGTYPE_REG; + } // AllocConsole(); /* 2010.02.01 genta マスターパスワードを入力させる -z オプションがあるときは最初だけスキップ -z オプションがないときは,デフォルトパスワードをまず試す - LoadRegistory()する + LoadRegistry()する パスワードが不一致なら再入力するか尋ねる. (破損していた場合はさせない) */ @@ -438,10 +696,24 @@ static int InitApp(LPSTR lpszCmdLine, int cmdShow) if(masterpass != 0) { - LoadRegistory(); + // ホスト共通設定機能 + ResetDefaultHost(); + + LoadRegistry(); + + // ポータブル版判定 + if(ImportPortable == YES) + { + ForceIni = YES; + RegType = REGTYPE_INI; + } // 暗号化通信対応 SetSSLTimeoutCallback(TimeOut * 1000, SSLTimeoutCallback); + SetSSLConfirmCallback(SSLConfirmCallback); + GetModuleFileName(NULL, SSLRootCAFilePath, FMAX_PATH); + strcpy(GetFileName(SSLRootCAFilePath), "ssl.pem"); + LoadSSLRootCAFile(); LoadJre(); if(NoRasControl == NO) @@ -465,9 +737,8 @@ static int InitApp(LPSTR lpszCmdLine, int cmdShow) DispTransferType(); SetHostKanaCnvImm(YES); SetHostKanjiCodeImm(KANJI_NOCNV); - // 本当はローカルのデフォルトをUTF-8にしたいが旧バージョンとの互換性のためShift_JISに設定 -// SetLocalKanjiCodeImm(KANJI_UTF8N); - SetLocalKanjiCodeImm(KANJI_SJIS); + // UTF-8対応 + SetLocalKanjiCodeImm(LocalKanjiCode); DispListType(); DispDotFileMode(); DispSyncMoveMode(); @@ -483,7 +754,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 Hiromichi Matsushima, Suguru Kawamoto."); + SetTaskMsg("FFFTP Ver." VER_STR " Copyright(C) 1997-2010 Sota & cooperators.\r\nCopyright (C) 2011-2014 FFFTP Project (Hiromichi Matsushima, Suguru Kawamoto, IWAMOTO Kouichi, vitamin0x, unarist, Asami, fortran90, tomo1192, Yuji Tanaka, Moriguchi Hirokazu, Fu-sen)."); if(ForceIni) SetTaskMsg("%s%s", MSGJPN283, IniPath); @@ -506,6 +777,10 @@ static int InitApp(LPSTR lpszCmdLine, int cmdShow) MakeButtonsFocus(); DispTransferFiles(); + // ソフトウェア自動更新 + if(AutoCheckForUpdates == YES && AutoCheckForUptatesInterval == 0) + UpdateSoftware(YES, YES, AutoApplyUpdates); + StartupProc(lpszCmdLine); sts = FFFTP_SUCCESS; @@ -586,18 +861,16 @@ static int MakeAllWindows(int cmdShow) wClass.hIconSm = NULL; RegisterClassEx(&wClass); + // 高DPI対応 +// ToolWinHeight = TOOLWIN_HEIGHT; + ToolWinHeight = CalcPixelY(16) + 12; + if(SaveWinPos == NO) { WinPosX = CW_USEDEFAULT; WinPosY = 0; } - // UTF-8対応 - // ユーザー定義のクラスはデフォルトのWNDPROCがShift_JIS専用のため -// hWndFtp = CreateWindow(FtpClassStr, "FFFTP", -// WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS, -// WinPosX, WinPosY, WinWidth, WinHeight, -// HWND_DESKTOP, 0, hInstFtp, NULL); - hWndFtp = CreateWindowA(FtpClassStr, "FFFTP", + hWndFtp = CreateWindow(FtpClassStr, "FFFTP", WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS, WinPosX, WinPosY, WinWidth, WinHeight, HWND_DESKTOP, 0, hInstFtp, NULL); @@ -676,7 +949,25 @@ void DispWindowTitle(void) char Tmp[HOST_ADRS_LEN+FILTER_EXT_LEN+20]; if(AskConnecting() == YES) - sprintf(Tmp, "%s (%s) - FFFTP", TitleHostName, FilterStr); + // 暗号化通信対応 +// sprintf(Tmp, "%s (%s) - FFFTP", TitleHostName, FilterStr); + { + switch(AskCryptMode()) + { + case CRYPT_NONE: + sprintf(Tmp, "%s (%s) %s - FFFTP", TitleHostName, FilterStr, MSGJPN351); + break; + case CRYPT_FTPES: + sprintf(Tmp, "%s (%s) %s - FFFTP", TitleHostName, FilterStr, MSGJPN352); + break; + case CRYPT_FTPIS: + sprintf(Tmp, "%s (%s) %s - FFFTP", TitleHostName, FilterStr, MSGJPN353); + break; + case CRYPT_SFTP: + sprintf(Tmp, "%s (%s) %s - FFFTP", TitleHostName, FilterStr, MSGJPN354); + break; + } + } else sprintf(Tmp, "FFFTP (%s)", FilterStr); @@ -804,21 +1095,94 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA { PAINTSTRUCT ps; LPTOOLTIPTEXT lpttt; + // UTF-8対応 + LPTOOLTIPTEXTW wlpttt; RECT Rect; int TmpTransType; switch (message) { + // ローカル側自動更新 + // タスクバー進捗表示 + // ソフトウェア自動更新 + case WM_CREATE : + SetTimer(hWnd, 1, 1000, NULL); + SetTimer(hWnd, 2, 100, NULL); + SetTimer(hWnd, 3, 60000, NULL); + break; + + // ローカル側自動更新 + // 自動切断対策 + // タスクバー進捗表示 + // ソフトウェア自動更新 + case WM_TIMER : + switch(wParam) + { + case 1: + if(WaitForSingleObject(ChangeNotification, 0) == WAIT_OBJECT_0) + { + if(AskUserOpeDisabled() == NO) + { + FindNextChangeNotification(ChangeNotification); + if(AutoRefreshFileList == YES) + { + FILELIST* Base; + char Name[FMAX_PATH+1]; + int Pos; + Base = NULL; + MakeSelectedFileList(WIN_LOCAL, NO, NO, &Base, &CancelFlg); + GetHotSelected(WIN_LOCAL, Name); + Pos = SendMessage(GetLocalHwnd(), LVM_GETTOPINDEX, 0, 0); + GetLocalDirForWnd(); + SelectFileInList(GetLocalHwnd(), SELECT_LIST, Base); + SetHotSelected(WIN_LOCAL, Name); + SendMessage(GetLocalHwnd(), LVM_ENSUREVISIBLE, (WPARAM)(SendMessage(GetLocalHwnd(), LVM_GETITEMCOUNT, 0, 0) - 1), (LPARAM)TRUE); + SendMessage(GetLocalHwnd(), LVM_ENSUREVISIBLE, (WPARAM)Pos, (LPARAM)TRUE); + } + } + } + if(NoopEnable == YES && AskNoopInterval() > 0 && time(NULL) - LastDataConnectionTime >= AskNoopInterval()) + { + NoopProc(NO); + LastDataConnectionTime = time(NULL); + } + break; + case 2: + if(IsTaskbarList3Loaded() == YES) + UpdateTaskbarProgress(); + break; + case 3: + if(AskUserOpeDisabled() == NO && AskTransferNow() == NO) + { + if(AutoCheckForUpdates == YES && AutoCheckForUptatesInterval > 0 && time(NULL) - LastAutoCheckForUpdates >= AutoCheckForUptatesInterval * 86400) + UpdateSoftware(YES, YES, AutoApplyUpdates); + } + break; + } + break; + case WM_COMMAND : + // 同時接続対応 + // 中断後に受信バッファに応答が残っていると次のコマンドの応答が正しく処理できない + if(CancelFlg == YES) + RemoveReceivedData(AskCmdCtrlSkt()); switch(LOWORD(wParam)) { case MENU_CONNECT : + // 自動切断対策 + NoopEnable = NO; ConnectProc(DLG_TYPE_CON, -1); + // 自動切断対策 + NoopEnable = YES; break; case MENU_CONNECT_NUM : + // 自動切断対策 + NoopEnable = NO; ConnectProc(DLG_TYPE_CON, (int)lParam); + // 自動切断対策 + NoopEnable = YES; if(AskConnecting() == YES) { if(HIWORD(wParam) & OPT_MIRROR) @@ -839,11 +1203,19 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA break; case MENU_SET_CONNECT : + // 自動切断対策 + NoopEnable = NO; ConnectProc(DLG_TYPE_SET, -1); + // 自動切断対策 + NoopEnable = YES; break; case MENU_QUICK : + // 自動切断対策 + NoopEnable = NO; QuickConnectProc(); + // 自動切断対策 + NoopEnable = YES; break; case MENU_DISCONNECT : @@ -877,7 +1249,11 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA case MENU_HIST_18 : case MENU_HIST_19 : case MENU_HIST_20 : + // 自動切断対策 + NoopEnable = NO; HistoryConnectProc(LOWORD(wParam)); + // 自動切断対策 + NoopEnable = YES; break; case MENU_UPDIR : @@ -889,6 +1265,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 { @@ -932,6 +1324,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, ".."); @@ -939,6 +1334,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; @@ -957,42 +1355,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 : @@ -1060,12 +1458,16 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA break; case MENU_FILTER : + // 同時接続対応 + CancelFlg = NO; SetFilter(&CancelFlg); break; case MENU_SORT : if(SortSetting() == YES) { + // 同時接続対応 + CancelFlg = NO; LocalFileSort = AskSortType(ITEM_LFILE); LocalDirSort = AskSortType(ITEM_LDIR); RemoteFileSort = AskSortType(ITEM_RFILE); @@ -1119,6 +1521,7 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA case MENU_KNJ_EUC : case MENU_KNJ_JIS : case MENU_KNJ_UTF8N : + case MENU_KNJ_UTF8BOM : case MENU_KNJ_NONE : SetHostKanjiCode(LOWORD(wParam)); break; @@ -1127,6 +1530,7 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA case MENU_L_KNJ_EUC : case MENU_L_KNJ_JIS : case MENU_L_KNJ_UTF8N : + case MENU_L_KNJ_UTF8BOM : SetLocalKanjiCode(LOWORD(wParam)); break; @@ -1135,6 +1539,11 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA break; case MENU_REFRESH : + // デッドロック対策 + if(AskUserOpeDisabled() == YES) + break; + // 同時接続対応 + CancelFlg = NO; SuppressRefresh = 1; GetLocalDirForWnd(); if(CheckClosedAndReconnect() == FFFTP_SUCCESS) @@ -1155,10 +1564,18 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA break; case REFRESH_LOCAL : + // デッドロック対策 + if(AskUserOpeDisabled() == YES) + break; GetLocalDirForWnd(); break; case REFRESH_REMOTE : + // デッドロック対策 + if(AskUserOpeDisabled() == YES) + break; + // 同時接続対応 + CancelFlg = NO; SuppressRefresh = 1; if(CheckClosedAndReconnect() == FFFTP_SUCCESS) GetRemoteDirForWnd(CACHE_REFRESH, &CancelFlg); @@ -1187,7 +1604,9 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA break; case MENU_HELP_TROUBLE : - ShellExecute(NULL, "open", MYWEB_URL, NULL, ".", SW_SHOW); + // 任意のコードが実行されるバグ修正 +// ShellExecute(NULL, "open", MYWEB_URL, NULL, ".", SW_SHOW); + ShellExecute(NULL, "open", MYWEB_URL, NULL, NULL, SW_SHOW); break; case MENU_BMARK_ADD : @@ -1207,11 +1626,15 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA break; case MENU_SELECT_ALL : - SelectFileInList(hWndCurFocus, SELECT_ALL); + // ローカル側自動更新 +// SelectFileInList(hWndCurFocus, SELECT_ALL); + SelectFileInList(hWndCurFocus, SELECT_ALL, NULL); break; case MENU_SELECT : - SelectFileInList(hWndCurFocus, SELECT_REGEXP); + // ローカル側自動更新 +// SelectFileInList(hWndCurFocus, SELECT_REGEXP); + SelectFileInList(hWndCurFocus, SELECT_REGEXP, NULL); break; case MENU_FIND : @@ -1223,6 +1646,11 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA break; case MENU_DOTFILE : + // デッドロック対策 + if(AskUserOpeDisabled() == YES) + break; + // 同時接続対応 + CancelFlg = NO; DotFile ^= 1; DispDotFileMode(); GetLocalDirForWnd(); @@ -1239,7 +1667,7 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA case MENU_REGSAVE : GetListTabWidth(); - SaveRegistory(); + SaveRegistry(); SaveSettingsToFile(); break; @@ -1255,7 +1683,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); } @@ -1267,9 +1697,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, hWnd) == 0) + break; + } + if(GetMasterPasswordStatus() == PASSWORD_OK && EnterMasterPasswordAndSet(newmasterpasswd_dlg, hWnd) != 0) + { + SetTaskMsg(MSGJPN303); + SaveRegistry(); + } + else + { + SetMasterPassword(Password); + ValidateMasterPassword(); + } } break; @@ -1291,6 +1746,11 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA OtpCalcTool(); break; + // FTPS対応 + case MENU_FW_FTP_FILTER : + TurnStatefulFTPFilter(); + break; + case MENU_URL_COPY : CopyURLtoClipBoard(); break; @@ -1303,6 +1763,45 @@ 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 + + // 上位のディレクトリへ移動対応 + case MENU_REMOTE_MOVE_UPDIR : + MoveRemoteFileProc(-1); + break; + + // FileZilla XML形式エクスポート対応 + case MENU_EXPORT_FILEZILLA_XML : + // 平文で出力するためマスターパスワードを再確認 + if(GetMasterPasswordStatus() == PASSWORD_OK) + { + char Password[MAX_PASSWORD_LEN + 1]; + GetMasterPassword(Password); + SetMasterPassword(NULL); + while(ValidateMasterPassword() == YES && GetMasterPasswordStatus() == PASSWORD_UNMATCH) + { + if(EnterMasterPasswordAndSet(masterpasswd_dlg, hWnd) == 0) + break; + } + if(GetMasterPasswordStatus() == PASSWORD_OK) + SaveSettingsToFileZillaXml(); + else + { + SetMasterPassword(Password); + ValidateMasterPassword(); + } + } + break; + + // ソフトウェア自動更新 + case MENU_UPDATES_CHECK : + UpdateSoftware(NO, NO, NO); + break; + default : if((LOWORD(wParam) >= MENU_BMARK_TOP) && (LOWORD(wParam) < MENU_BMARK_TOP+100)) @@ -1320,8 +1819,13 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA switch(((LPNMHDR)lParam)->code) { /* ツールチップコントロールメッセージの処理 */ - case TTN_NEEDTEXT: + // UTF-8対応 +// case TTN_NEEDTEXT: + case TTN_NEEDTEXTW: lpttt = (LPTOOLTIPTEXT)lParam; + // UTF-8対応 + // lptttは単なる警告回避用 + wlpttt = (LPTOOLTIPTEXTW)lParam; lpttt->hinst = hInstFtp; switch(lpttt->hdr.idFrom) { @@ -1340,7 +1844,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; @@ -1411,6 +1923,10 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA lpttt->lpszText = MSGJPN308; break; + case MENU_KNJ_UTF8BOM : + lpttt->lpszText = MSGJPN330; + break; + case MENU_KNJ_NONE : lpttt->lpszText = MSGJPN173; break; @@ -1431,6 +1947,10 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA lpttt->lpszText = MSGJPN312; break; + case MENU_L_KNJ_UTF8BOM : + lpttt->lpszText = MSGJPN331; + break; + case MENU_KANACNV : lpttt->lpszText = MSGJPN174; break; @@ -1443,15 +1963,14 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA lpttt->lpszText = MSGJPN176; break; } - // UTF-8からShift_JISへ変換 + // UTF-8対応 + // UTF-8からUTF-16 LEへ変換 { static wchar_t StringBufferUTF16[1024]; - static char StringBufferSJIS[1024]; if(lpttt->lpszText) { MtoW(StringBufferUTF16, sizeof(StringBufferUTF16)/ sizeof(wchar_t), lpttt->lpszText, -1); - WtoA(StringBufferSJIS, sizeof(StringBufferSJIS)/ sizeof(char), StringBufferUTF16, -1); - lpttt->lpszText = StringBufferSJIS; + wlpttt->lpszText = StringBufferUTF16; } } break; @@ -1459,6 +1978,8 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA case LVN_COLUMNCLICK : if(((NMHDR *)lParam)->hwndFrom == GetLocalHwnd()) { + // 同時接続対応 + CancelFlg = NO; SetSortTypeByColumn(WIN_LOCAL, ((NM_LISTVIEW *)lParam)->iSubItem); ReSortDispList(WIN_LOCAL, &CancelFlg); } @@ -1466,6 +1987,8 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA { if(((NM_LISTVIEW *)lParam)->iSubItem != 4) { + // 同時接続対応 + CancelFlg = NO; SetSortTypeByColumn(WIN_REMOTE, ((NM_LISTVIEW *)lParam)->iSubItem); ReSortDispList(WIN_REMOTE, &CancelFlg); } @@ -1518,7 +2041,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 : @@ -1532,6 +2058,14 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA break; case WM_DESTROY : + // ローカル側自動更新 + KillTimer(hWnd, 1); + if(ChangeNotification != INVALID_HANDLE_VALUE) + FindCloseChangeNotification(ChangeNotification); + // タスクバー進捗表示 + KillTimer(hWnd, 2); + // ソフトウェア自動更新 + KillTimer(hWnd, 3); // WSACleanup(); // DestroyWindow(hWndFtp); PostQuitMessage(0); @@ -1606,6 +2140,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) @@ -1661,6 +2207,8 @@ static int AnalyzeComLine(char *Str, int *AutoConnect, int *CmdOption, char *unc { int Ret; char Tmp[FMAX_PATH+1]; + // ソフトウェア自動更新 + int i; *AutoConnect = -1; *CmdOption = 0; @@ -1677,9 +2225,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; @@ -1693,9 +2246,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)) { @@ -1749,13 +2307,59 @@ static int AnalyzeComLine(char *Str, int *AutoConnect, int *CmdOption, char *unc } // プロセス保護 #ifdef ENABLE_PROCESS_PROTECTION - else if(strcmp(Tmp, "--restart") == 0) + else if(strcmp(&Tmp[1], "-restart") == 0) + { + } + else if(strcmp(&Tmp[1], "-protect") == 0) + { + } + else if(strcmp(&Tmp[1], "-protect-high") == 0) + { + } + else if(strcmp(&Tmp[1], "-protect-medium") == 0) { } - else if(strcmp(Tmp, "--protect") == 0) + else if(strcmp(&Tmp[1], "-protect-low") == 0) { } #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 if(strcmp(&Tmp[1], "-build-software-update") == 0) + { + for(i = 0; i < 6; i++) + { + if((Str = GetToken(Str, Tmp)) == NULL) + { + Ret = -1; + break; + } + } + } + else if(strcmp(&Tmp[1], "-software-update") == 0) + { + if((Str = GetToken(Str, Tmp)) == NULL) + { + Ret = -1; + } + } + else if(strcmp(&Tmp[1], "-software-cleanup") == 0) + { + if((Str = GetToken(Str, Tmp)) == NULL) + { + Ret = -1; + } + } else { SetTaskMsg(MSGJPN180, Tmp); @@ -1868,7 +2472,7 @@ static char *GetToken(char *Str, char *Buf) InQuote = 0; while(*Str != NUL) { - if(*Str == 0x22) + if(*Str == '\"') InQuote = !InQuote; else { @@ -1902,6 +2506,9 @@ static char *GetToken(char *Str, char *Buf) static void ExitProc(HWND hWnd) { + // 環境依存の不具合対策 + char Tmp[FMAX_PATH+1]; + CancelFlg = YES; CloseTransferThread(); @@ -1920,7 +2527,10 @@ static void ExitProc(HWND hWnd) if(SaveExit == YES) { GetListTabWidth(); - SaveRegistory(); + SaveRegistry(); + // ポータブル版判定 + if(RegType == REGTYPE_REG) + ClearIni(); if((CacheEntry > 0) && (CacheSave == YES)) SaveCache(); @@ -1930,6 +2540,14 @@ static void ExitProc(HWND hWnd) else DeleteCache(); + // 環境依存の不具合対策 + GetAppTempPath(Tmp); + SetYenTail(Tmp); + strcat(Tmp, "file"); + _rmdir(Tmp); + GetAppTempPath(Tmp); + _rmdir(Tmp); + if(RasClose == YES) { DisconnectRas(RasCloseNotify); @@ -1973,7 +2591,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)) { @@ -2003,6 +2623,10 @@ void DoubleClickProc(int Win, int Mode, int App) strcpy(Remote, TmpPath); SetYenTail(Remote); + // 環境依存の不具合対策 + strcat(Remote, "file"); + _mkdir(Remote); + SetYenTail(Remote); if (UseDiffViewer == YES) { strcat(Remote, "remote."); } @@ -2046,10 +2670,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(); - Sts = DoDownLoad(AskCmdCtrlSkt(), &MainTransPkt, NO, &CancelFlg); + // 同時接続対応 + CancelFlg = NO; + Sts = DoDownload(AskCmdCtrlSkt(), &MainTransPkt, NO, &CancelFlg); // } } @@ -2101,6 +2727,11 @@ static void ChangeDir(int Win, char *Path) char Local[FMAX_PATH+1]; char Remote[FMAX_PATH+1]; + // 同時接続対応 + CancelFlg = NO; + + // デッドロック対策 + DisableUserOpe(); Sync = AskSyncMoveMode(); if(Sync == YES) { @@ -2132,6 +2763,8 @@ static void ChangeDir(int Win, char *Path) GetRemoteDirForWnd(CACHE_NORMAL, &CancelFlg); } } + // デッドロック対策 + EnableUserOpe(); return; } @@ -2179,16 +2812,24 @@ static void ResizeWindowProc(void) SendMessage(GetSbarWnd(), WM_SIZE, SIZE_RESTORED, MAKELPARAM(Rect.right, Rect.bottom)); CalcWinSize(); - SetWindowPos(GetMainTbarWnd(), 0, 0, 0, Rect.right, TOOLWIN_HEIGHT, SWP_NOACTIVATE | SWP_NOZORDER); - SetWindowPos(GetLocalTbarWnd(), 0, 0, TOOLWIN_HEIGHT, LocalWidth, TOOLWIN_HEIGHT, SWP_NOACTIVATE | SWP_NOZORDER); - SetWindowPos(GetRemoteTbarWnd(), 0, LocalWidth + SepaWidth, TOOLWIN_HEIGHT, RemoteWidth, TOOLWIN_HEIGHT, SWP_NOACTIVATE | SWP_NOZORDER); + // 高DPI対応 +// SetWindowPos(GetMainTbarWnd(), 0, 0, 0, Rect.right, TOOLWIN_HEIGHT, SWP_NOACTIVATE | SWP_NOZORDER); +// SetWindowPos(GetLocalTbarWnd(), 0, 0, TOOLWIN_HEIGHT, LocalWidth, TOOLWIN_HEIGHT, SWP_NOACTIVATE | SWP_NOZORDER); +// SetWindowPos(GetRemoteTbarWnd(), 0, LocalWidth + SepaWidth, TOOLWIN_HEIGHT, RemoteWidth, TOOLWIN_HEIGHT, SWP_NOACTIVATE | SWP_NOZORDER); + SetWindowPos(GetMainTbarWnd(), 0, 0, 0, Rect.right, AskToolWinHeight(), SWP_NOACTIVATE | SWP_NOZORDER); + SetWindowPos(GetLocalTbarWnd(), 0, 0, AskToolWinHeight(), LocalWidth, AskToolWinHeight(), SWP_NOACTIVATE | SWP_NOZORDER); + SetWindowPos(GetRemoteTbarWnd(), 0, LocalWidth + SepaWidth, AskToolWinHeight(), RemoteWidth, AskToolWinHeight(), SWP_NOACTIVATE | SWP_NOZORDER); SendMessage(GetLocalTbarWnd(), TB_GETITEMRECT, 3, (LPARAM)&Rect); SetWindowPos(GetLocalHistHwnd(), 0, Rect.right, Rect.top, LocalWidth - Rect.right, 200, SWP_NOACTIVATE | SWP_NOZORDER); SendMessage(GetRemoteTbarWnd(), TB_GETITEMRECT, 3, (LPARAM)&Rect); SetWindowPos(GetRemoteHistHwnd(), 0, Rect.right, Rect.top, RemoteWidth - Rect.right, 200, SWP_NOACTIVATE | SWP_NOZORDER); - SetWindowPos(GetLocalHwnd(), 0, 0, TOOLWIN_HEIGHT*2, LocalWidth, ListHeight, SWP_NOACTIVATE | SWP_NOZORDER); - SetWindowPos(GetRemoteHwnd(), 0, LocalWidth + SepaWidth, TOOLWIN_HEIGHT*2, RemoteWidth, ListHeight, SWP_NOACTIVATE | SWP_NOZORDER); - SetWindowPos(GetTaskWnd(), 0, 0, TOOLWIN_HEIGHT*2+ListHeight+SepaWidth, ClientWidth, TaskHeight, SWP_NOACTIVATE | SWP_NOZORDER); + // 高DPI対応 +// SetWindowPos(GetLocalHwnd(), 0, 0, TOOLWIN_HEIGHT*2, LocalWidth, ListHeight, SWP_NOACTIVATE | SWP_NOZORDER); +// SetWindowPos(GetRemoteHwnd(), 0, LocalWidth + SepaWidth, TOOLWIN_HEIGHT*2, RemoteWidth, ListHeight, SWP_NOACTIVATE | SWP_NOZORDER); +// SetWindowPos(GetTaskWnd(), 0, 0, TOOLWIN_HEIGHT*2+ListHeight+SepaWidth, ClientWidth, TaskHeight, SWP_NOACTIVATE | SWP_NOZORDER); + SetWindowPos(GetLocalHwnd(), 0, 0, AskToolWinHeight()*2, LocalWidth, ListHeight, SWP_NOACTIVATE | SWP_NOZORDER); + SetWindowPos(GetRemoteHwnd(), 0, LocalWidth + SepaWidth, AskToolWinHeight()*2, RemoteWidth, ListHeight, SWP_NOACTIVATE | SWP_NOZORDER); + SetWindowPos(GetTaskWnd(), 0, 0, AskToolWinHeight()*2+ListHeight+SepaWidth, ClientWidth, TaskHeight, SWP_NOACTIVATE | SWP_NOZORDER); #endif return; @@ -2228,7 +2869,9 @@ static void CalcWinSize(void) GetClientRect(GetSbarWnd(), &Rect); - ListHeight = max1(0, ClientHeight - TOOLWIN_HEIGHT * 2 - TaskHeight - SepaWidth - Rect.bottom); + // 高DPI対応 +// ListHeight = max1(0, ClientHeight - TOOLWIN_HEIGHT * 2 - TaskHeight - SepaWidth - Rect.bottom); + ListHeight = max1(0, ClientHeight - AskToolWinHeight() * 2 - TaskHeight - SepaWidth - Rect.bottom); return; } @@ -2276,8 +2919,11 @@ static void CheckResizeFrame(WPARAM Keys, int x, int y) if((Resizing == RESIZE_OFF) && (Keys == 0)) { + // 高DPI対応 +// if((x >= LocalWidth) && (x <= LocalWidth + SepaWidth) && +// (y > TOOLWIN_HEIGHT) && (y < (TOOLWIN_HEIGHT * 2 + ListHeight))) if((x >= LocalWidth) && (x <= LocalWidth + SepaWidth) && - (y > TOOLWIN_HEIGHT) && (y < (TOOLWIN_HEIGHT * 2 + ListHeight))) + (y > AskToolWinHeight()) && (y < (AskToolWinHeight() * 2 + ListHeight))) { /* 境界位置変更用カーソルに変更 */ SetCapture(hWndFtp); @@ -2286,7 +2932,9 @@ static void CheckResizeFrame(WPARAM Keys, int x, int y) Resizing = RESIZE_PREPARE; ResizePos = RESIZE_HPOS; } - else if((y >= TOOLWIN_HEIGHT*2+ListHeight) && (y <= TOOLWIN_HEIGHT*2+ListHeight+SepaWidth)) + // 高DPI対応 +// else if((y >= TOOLWIN_HEIGHT*2+ListHeight) && (y <= TOOLWIN_HEIGHT*2+ListHeight+SepaWidth)) + else if((y >= AskToolWinHeight()*2+ListHeight) && (y <= AskToolWinHeight()*2+ListHeight+SepaWidth)) { /* 境界位置変更用カーソルに変更 */ SetCapture(hWndFtp); @@ -2306,17 +2954,25 @@ static void CheckResizeFrame(WPARAM Keys, int x, int y) GetClientRect(GetSbarWnd(), &Rect1); Rect.left += GetSystemMetrics(SM_CXFRAME); Rect.right -= GetSystemMetrics(SM_CXFRAME); - Rect.top += TOOLWIN_HEIGHT*2 + GetSystemMetrics(SM_CYMENU) + GetSystemMetrics(SM_CYCAPTION) + GetSystemMetrics(SM_CYFRAME); + // 高DPI対応 +// Rect.top += TOOLWIN_HEIGHT*2 + GetSystemMetrics(SM_CYMENU) + GetSystemMetrics(SM_CYCAPTION) + GetSystemMetrics(SM_CYFRAME); + Rect.top += AskToolWinHeight()*2 + GetSystemMetrics(SM_CYMENU) + GetSystemMetrics(SM_CYCAPTION) + GetSystemMetrics(SM_CYFRAME); Rect.bottom -= GetSystemMetrics(SM_CYFRAME) + Rect1.bottom; ClipCursor(&Rect); } else { + // 高DPI対応 +// if(((ResizePos == RESIZE_HPOS) && +// ((x < LocalWidth) || (x > LocalWidth + SepaWidth) || +// (y <= TOOLWIN_HEIGHT) || (y >= (TOOLWIN_HEIGHT * 2 + ListHeight)))) || +// ((ResizePos == RESIZE_VPOS) && +// ((y < TOOLWIN_HEIGHT*2+ListHeight) || (y > TOOLWIN_HEIGHT*2+ListHeight+SepaWidth)))) if(((ResizePos == RESIZE_HPOS) && ((x < LocalWidth) || (x > LocalWidth + SepaWidth) || - (y <= TOOLWIN_HEIGHT) || (y >= (TOOLWIN_HEIGHT * 2 + ListHeight)))) || + (y <= AskToolWinHeight()) || (y >= (AskToolWinHeight() * 2 + ListHeight)))) || ((ResizePos == RESIZE_VPOS) && - ((y < TOOLWIN_HEIGHT*2+ListHeight) || (y > TOOLWIN_HEIGHT*2+ListHeight+SepaWidth)))) + ((y < AskToolWinHeight()*2+ListHeight) || (y > AskToolWinHeight()*2+ListHeight+SepaWidth)))) { /* 元のカーソルに戻す */ ReleaseCapture(); @@ -2389,6 +3045,8 @@ void ExecViewer(char *Fname, int App) char AssocProg[FMAX_PATH+1]; char ComLine[FMAX_PATH*2+3+1]; char CurDir[FMAX_PATH+1]; + // 任意のコードが実行されるバグ修正 + char SysDir[FMAX_PATH+1]; /* FindExecutable()は関連付けられたプログラムのパス名にスペースが */ /* 含まれている時、間違ったパス名を返す事がある。 */ @@ -2396,11 +3054,21 @@ void ExecViewer(char *Fname, int App) AskLocalCurDir(CurDir, FMAX_PATH); - if((App == -1) && (FindExecutable(Fname, NULL, AssocProg) > (HINSTANCE)32)) + // 任意のコードが実行されるバグ修正 + // 拡張子が無いと補完されるため +// if((App == -1) && (FindExecutable(Fname, NULL, AssocProg) > (HINSTANCE)32)) + if((App == -1) && (strlen(GetFileExt(GetFileName(Fname))) > 0) && (FindExecutable(Fname, NULL, AssocProg) > (HINSTANCE)32)) { 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); @@ -2416,10 +3084,26 @@ void ExecViewer(char *Fname, int App) memset(&Startup, NUL, sizeof(STARTUPINFO)); Startup.cb = sizeof(STARTUPINFO); Startup.wShowWindow = SW_SHOW; - if(CreateProcess(NULL, ComLine, NULL, NULL, FALSE, 0, NULL, NULL, &Startup, &Info) == FALSE) + // 任意のコードが実行されるバグ修正 +// if(CreateProcess(NULL, ComLine, NULL, NULL, FALSE, 0, NULL, NULL, &Startup, &Info) == FALSE) +// { +// SetTaskMsg(MSGJPN182, GetLastError()); +// SetTaskMsg(">>%s", ComLine); +// } + if(GetCurrentDirectory(FMAX_PATH, CurDir) > 0) { - SetTaskMsg(MSGJPN182, GetLastError()); - SetTaskMsg(">>%s", ComLine); + if(GetSystemDirectory(SysDir, FMAX_PATH) > 0) + { + if(SetCurrentDirectory(SysDir)) + { + if(CreateProcess(NULL, ComLine, NULL, NULL, FALSE, 0, NULL, NULL, &Startup, &Info) == FALSE) + { + SetTaskMsg(MSGJPN182, GetLastError()); + SetTaskMsg(">>%s", ComLine); + } + SetCurrentDirectory(CurDir); + } + } } } return; @@ -2444,6 +3128,8 @@ void ExecViewer2(char *Fname1, char *Fname2, int App) char AssocProg[FMAX_PATH+1]; char ComLine[FMAX_PATH*2+3+1]; char CurDir[FMAX_PATH+1]; + // 任意のコードが実行されるバグ修正 + char SysDir[FMAX_PATH+1]; /* FindExecutable()は関連付けられたプログラムのパス名にスペースが */ /* 含まれている時、間違ったパス名を返す事がある。 */ @@ -2463,10 +3149,26 @@ void ExecViewer2(char *Fname1, char *Fname2, int App) memset(&Startup, NUL, sizeof(STARTUPINFO)); Startup.cb = sizeof(STARTUPINFO); Startup.wShowWindow = SW_SHOW; - if(CreateProcess(NULL, ComLine, NULL, NULL, FALSE, 0, NULL, NULL, &Startup, &Info) == FALSE) + // 任意のコードが実行されるバグ修正 +// if(CreateProcess(NULL, ComLine, NULL, NULL, FALSE, 0, NULL, NULL, &Startup, &Info) == FALSE) +// { +// SetTaskMsg(MSGJPN182, GetLastError()); +// SetTaskMsg(">>%s", ComLine); +// } + if(GetCurrentDirectory(FMAX_PATH, CurDir) > 0) { - SetTaskMsg(MSGJPN182, GetLastError()); - SetTaskMsg(">>%s", ComLine); + if(GetSystemDirectory(SysDir, FMAX_PATH) > 0) + { + if(SetCurrentDirectory(SysDir)) + { + if(CreateProcess(NULL, ComLine, NULL, NULL, FALSE, 0, NULL, NULL, &Startup, &Info) == FALSE) + { + SetTaskMsg(MSGJPN182, GetLastError()); + SetTaskMsg(">>%s", ComLine); + } + SetCurrentDirectory(CurDir); + } + } } return; @@ -2548,7 +3250,9 @@ static void DeleteAlltempFile(void) * BOOL TRUE/FALSE *----------------------------------------------------------------------------*/ -static BOOL CALLBACK AboutDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) +// 64ビット対応 +//static BOOL CALLBACK AboutDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) +static INT_PTR CALLBACK AboutDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { static char Tmp[80]; int Ver; @@ -2676,7 +3380,11 @@ int BackgrndMessageProc(void) Ret = NO; while(PeekMessage(&Msg, NULL, 0, 0, PM_REMOVE)) { - if(!HtmlHelp(NULL, NULL, HH_PRETRANSLATEMESSAGE, (DWORD)&Msg)) + // マルチコアCPUの特定環境下でファイル通信中にクラッシュするバグ対策 +// if(!HtmlHelp(NULL, NULL, HH_PRETRANSLATEMESSAGE, (DWORD)&Msg)) + // 64ビット対応 +// if(!IsMainThread() || !HtmlHelp(NULL, NULL, HH_PRETRANSLATEMESSAGE, (DWORD)&Msg)) + if(!IsMainThread() || !HtmlHelp(NULL, NULL, HH_PRETRANSLATEMESSAGE, (DWORD_PTR)&Msg)) { /* ディレクトリ名の表示コンボボックスでBSやRETが効くように */ /* コンボボックス内ではアクセラレータを無効にする */ @@ -2742,12 +3450,29 @@ int AskAutoExit(void) int EnterMasterPasswordAndSet( int Res, HWND hWnd ) { char buf[MAX_PASSWORD_LEN + 1]; + // パスワードの入力欄を非表示 + // 非表示にしたため新しいパスワードを2回入力させる + char buf1[MAX_PASSWORD_LEN + 1]; char *p; int Flag; buf[0] = NUL; if( InputDialogBox(Res, hWnd, NULL, buf, MAX_PASSWORD_LEN + 1, &Flag, IDH_HELP_TOPIC_0000064) == YES){ + // パスワードの入力欄を非表示 + if(Res == newmasterpasswd_dlg) + { + buf1[0] = NUL; + if( InputDialogBox(Res, hWnd, NULL, buf1, MAX_PASSWORD_LEN + 1, + &Flag, IDH_HELP_TOPIC_0000064) != YES){ + return 0; + } + if(strcmp(buf, buf1) != 0) + { + MessageBox(hWnd, MSGJPN325, "FFFTP", MB_OK | MB_ICONERROR); + return 0; + } + } /* 末尾の空白を削除 */ RemoveTailingSpaces(buf); /* 先頭の空白を削除 */ @@ -2768,17 +3493,260 @@ int EnterMasterPasswordAndSet( int Res, HWND hWnd ) } // 暗号化通信対応 -BOOL __stdcall SSLTimeoutCallback() +BOOL __stdcall SSLTimeoutCallback(BOOL* pbAborted) { Sleep(1); if(BackgrndMessageProc() == YES) return TRUE; - // 念のためツールバーのMENU_ABORTも確認 -// if(MainTransPkt.Abort != ABORT_NONE) -// { -// MainTransPkt.Abort = ABORT_NONE; -// return TRUE; -// } + if(*pbAborted == YES) + return TRUE; return FALSE; } +BOOL __stdcall SSLConfirmCallback(BOOL* pbAborted, BOOL bVerified, LPCSTR Certificate, LPCSTR CommonName) +{ + BOOL bResult; + uint32 Hash[5]; + int i; + char* pm0; + bResult = FALSE; + sha_memory((char*)Certificate, (uint32)(strlen(Certificate) * sizeof(char)), (uint32*)&Hash); + // sha.cはビッグエンディアンのため + for(i = 0; i < 5; i++) + Hash[i] = _byteswap_ulong(Hash[i]); + i = 0; + while(i < MAX_CERT_CACHE_HASH) + { + if(memcmp(&CertificateCacheHash[i], &Hash, 20) == 0) + { + bResult = TRUE; + break; + } + i++; + } + if(!bResult) + { + if(pm0 = AllocateStringM(strlen(Certificate) + 1024)) + { + sprintf(pm0, MSGJPN326, IsHostNameMatched(AskHostAdrs(), CommonName) ? MSGJPN327 : MSGJPN328, bVerified ? MSGJPN327 : MSGJPN328, Certificate); + if(MessageBox(GetMainHwnd(), pm0, "FFFTP", MB_YESNO) == IDYES) + { + for(i = MAX_CERT_CACHE_HASH - 1; i >= 1; i--) + memcpy(&CertificateCacheHash[i], &CertificateCacheHash[i - 1], 20); + memcpy(&CertificateCacheHash[0], &Hash, 20); + bResult = TRUE; + } + FreeDuplicatedString(pm0); + } + } + if(!bResult) + *pbAborted = YES; + return bResult; +} + +BOOL LoadSSLRootCAFile() +{ + BOOL bResult; + HANDLE hFile; + DWORD Size; + BYTE* pBuffer; + uint32 Hash[5]; + int i; + bResult = FALSE; + if((hFile = CreateFile(SSLRootCAFilePath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL)) != INVALID_HANDLE_VALUE) + { + Size = GetFileSize(hFile, NULL); + if(pBuffer = (BYTE*)malloc(Size)) + { + if(ReadFile(hFile, pBuffer, Size, &Size, NULL)) + { + sha_memory((char*)pBuffer, (uint32)Size, (uint32*)&Hash); + // sha.cはビッグエンディアンのため + for(i = 0; i < 5; i++) + Hash[i] = _byteswap_ulong(Hash[i]); + // 同梱する"ssl.pem"に合わせてSHA1ハッシュ値を変更すること + if(memcmp(&Hash, &SSLRootCAFileHash, 20) == 0 || memcmp(&Hash, "\xE8\xE7\x94\x39\x27\x66\xCC\xA1\x52\x88\x58\xA2\x29\xAC\x04\x6B\x0F\x5D\x58\x01", 20) == 0 + || DialogBox(GetFtpInst(), MAKEINTRESOURCE(updatesslroot_dlg), GetMainHwnd(), ExeEscDialogProc) == YES) + { + memcpy(&SSLRootCAFileHash, &Hash, 20); + if(SetSSLRootCertificate(pBuffer, Size)) + bResult = TRUE; + } + } + free(pBuffer); + } + CloseHandle(hFile); + } + return bResult; +} + +// マルチコアCPUの特定環境下でファイル通信中にクラッシュするバグ対策 +BOOL IsMainThread() +{ + if(GetCurrentThreadId() != MainThreadId) + return FALSE; + return TRUE; +} + +// ポータブル版判定 +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); +} + +// 全設定暗号化対応 +int Restart() +{ + int Sts; + char* CommandLine; + STARTUPINFO si; + PROCESS_INFORMATION pi; + Sts = FFFTP_FAIL; + if(CommandLine = (char*)malloc(sizeof(char) * (strlen(GetCommandLine()) + 1))) + { + strcpy(CommandLine, GetCommandLine()); + GetStartupInfo(&si); + if(CreateProcess(NULL, CommandLine, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) + { + CloseHandle(pi.hThread); + CloseHandle(pi.hProcess); + Sts = FFFTP_SUCCESS; + } + free(CommandLine); + } + return Sts; +} + +void Terminate() +{ + exit(1); +} + +// タスクバー進捗表示 +int LoadTaskbarList3() +{ + int Sts; + Sts = FFFTP_FAIL; + if(CoCreateInstance(&CLSID_TaskbarList, NULL, CLSCTX_ALL, &IID_ITaskbarList3, (void**)&pTaskbarList3) == S_OK) + { + Sts = FFFTP_SUCCESS; + } + return Sts; +} + +void FreeTaskbarList3() +{ + if(pTaskbarList3 != NULL) + pTaskbarList3->lpVtbl->Release(pTaskbarList3); + pTaskbarList3 = NULL; +} + +int IsTaskbarList3Loaded() +{ + int Sts; + Sts = NO; + if(pTaskbarList3 != NULL) + Sts = YES; + return Sts; +} + +void UpdateTaskbarProgress() +{ + if(AskTransferSizeTotal() > 0) + { + if(AskTransferErrorDisplay() > 0) + pTaskbarList3->lpVtbl->SetProgressState(pTaskbarList3, GetMainHwnd(), TBPF_ERROR); + else + pTaskbarList3->lpVtbl->SetProgressState(pTaskbarList3, GetMainHwnd(), TBPF_NORMAL); + pTaskbarList3->lpVtbl->SetProgressValue(pTaskbarList3, GetMainHwnd(), (ULONGLONG)(AskTransferSizeTotal() - AskTransferSizeLeft()), (ULONGLONG)AskTransferSizeTotal()); + } + else + pTaskbarList3->lpVtbl->SetProgressState(pTaskbarList3, GetMainHwnd(), TBPF_NOPROGRESS); +} + +// 高DPI対応 +int AskToolWinHeight(void) +{ + return(ToolWinHeight); +} + +// ソフトウェア自動更新 +typedef struct +{ + int NoError; + int NoConfirm; +} UPDATESOFTWAREDATA; + +DWORD WINAPI UpdateSoftwareThreadProc(LPVOID lpParameter) +{ + UPDATESOFTWAREDATA* pData; + pData = (UPDATESOFTWAREDATA*)lpParameter; + UpdateSoftware(NO, pData->NoError, pData->NoConfirm); + free(pData); + return 0; +} + +void UpdateSoftware(int Async, int NoError, int NoConfirm) +{ + UPDATESOFTWAREDATA* pData; + DWORD Version; + char VersionString[32]; + char Description[1024]; + char Tmp[2048]; + if(Async == YES) + { + if(pData = malloc(sizeof(UPDATESOFTWAREDATA))) + { + pData->NoError = NoError; + pData->NoConfirm = NoConfirm; + CloseHandle(CreateThread(NULL, 0, UpdateSoftwareThreadProc, pData, 0, NULL)); + } + } + else + { + // 念のためマスターパスワードの一致を確認 + if(GetMasterPasswordStatus() == PASSWORD_OK) + { + Version = RELEASE_VERSION_NUM; + LastAutoCheckForUpdates = time(NULL); + if(CheckForUpdates(FALSE, NULL, &Version, VersionString, Description)) + { + if(Version > RELEASE_VERSION_NUM) + { + sprintf(Tmp, MSGJPN361, VER_STR, VersionString, Description); + if(NoConfirm == YES || MessageBox(GetMainHwnd(), Tmp, "FFFTP", MB_YESNO) == IDYES) + { + strcpy(Tmp, TmpPath); + SetYenTail(Tmp); + strcat(Tmp, "update"); + _mkdir(Tmp); + if(CheckForUpdates(TRUE, Tmp, &Version, VersionString, Description)) + { + MessageBox(GetMainHwnd(), MSGJPN364, "FFFTP", MB_OK); + ApplyUpdatesOnExit = YES; + } + else if(NoError == NO) + MessageBox(GetMainHwnd(), MSGJPN362, "FFFTP", MB_OK | MB_ICONERROR); + } + } + else if(NoError == NO) + MessageBox(GetMainHwnd(), MSGJPN363, "FFFTP", MB_OK); + } + else if(NoError == NO) + MessageBox(GetMainHwnd(), MSGJPN362, "FFFTP", MB_OK | MB_ICONERROR); + } + } +} +