X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=main.c;h=c731384ef50cf79e14af5688c91cc988a08d7b9b;hb=refs%2Fheads%2F1.98e;hp=3794252cc4bd4fedd17572f72167dfac2d315359;hpb=c77292a7a46ba795cbc2a728f1ecdfbbc39811bc;p=ffftp%2Fffftp.git diff --git a/main.c b/main.c index 3794252..c731384 100644 --- a/main.c +++ b/main.c @@ -1,6 +1,6 @@ -/*============================================================================= +/*============================================================================= * -* ‚e‚e‚e‚s‚o +* FFFTP * =============================================================================== / Copyright (C) 1997-2007 Sota. All rights reserved. @@ -28,6 +28,8 @@ /============================================================================*/ #define STRICT +// IPv6対応 +#include #include #include #include @@ -37,29 +39,32 @@ #include #include #include -#include +// IPv6対応 +//#include #include "common.h" #include "resource.h" #include "aes.h" +// 暗号化通信対応 +#include "sha.h" #include #include "helpid.h" -// UTF-8‘Ήž +// UTF-8対応 #undef __MBSWRAPPER_H__ #include "mbswrapper.h" -#define RESIZE_OFF 0 /* ƒEƒCƒ“ƒhƒE‚Ì‹æØ‚èˆÊ’u•ÏX‚µ‚Ä‚¢‚È‚¢ */ -#define RESIZE_ON 1 /* ƒEƒCƒ“ƒhƒE‚Ì‹æØ‚èˆÊ’u•ÏX’† */ -#define RESIZE_PREPARE 2 /* ƒEƒCƒ“ƒhƒE‚Ì‹æØ‚èˆÊ’u•ÏX‚̏€”õ */ +#define RESIZE_OFF 0 /* ウインドウの区切り位置変更していない */ +#define RESIZE_ON 1 /* ウインドウの区切り位置変更中 */ +#define RESIZE_PREPARE 2 /* ウインドウの区切り位置変更の準備 */ -#define RESIZE_HPOS 0 /* ƒ[ƒJƒ‹|ƒzƒXƒgŠÔ‚Ì‹æØ‚èˆÊ’u•ÏX */ -#define RESIZE_VPOS 1 /* ƒŠƒXƒg|ƒ^ƒXƒNŠÔ‚Ì‹æØ‚èˆÊ’u‚̕ύX */ +#define RESIZE_HPOS 0 /* ローカル-ホスト間の区切り位置変更 */ +#define RESIZE_VPOS 1 /* リスト-タスク間の区切り位置の変更 */ -/*===== ƒvƒƒgƒ^ƒCƒv =====*/ +/*===== プロトタイプ =====*/ static int InitApp(LPSTR lpszCmdLine, int cmdShow); static int MakeAllWindows(int cmdShow); @@ -79,10 +84,12 @@ 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 ); -/*===== ƒ[ƒJƒ‹‚ȃ[ƒN =====*/ +/*===== ローカルなワーク =====*/ static const char FtpClassStr[] = "FFFTPWin"; @@ -112,9 +119,9 @@ static char HelpPath[FMAX_PATH+1]; static char IniPath[FMAX_PATH+1]; static int ForceIni = NO; -TRANSPACKET MainTransPkt; /* ƒtƒ@ƒCƒ‹“]‘——pƒpƒPƒbƒg */ - /* ‚±‚ê‚ðŽg‚Á‚Ä“]‘—‚ðs‚¤‚ƁAƒc[ƒ‹ƒo[‚Ì“]‘— */ - /* ’†Ž~ƒ{ƒ^ƒ“‚Å’†Ž~‚Å‚«‚é */ +TRANSPACKET MainTransPkt; /* ファイル転送用パケット */ + /* これを使って転送を行うと、ツールバーの転送 */ + /* 中止ボタンで中止できる */ char TitleHostName[HOST_ADRS_LEN+1]; char FilterStr[FILTER_EXT_LEN+1] = { "*" }; @@ -125,20 +132,36 @@ static int SuppressRefresh = 0; static DWORD dwCookie; +// 暗号化通信対応 +static char SSLRootCAFilePath[FMAX_PATH+1]; +// マルチコアCPUの特定環境下でファイル通信中にクラッシュするバグ対策 +static DWORD MainThreadId; +// ポータブル版判定 +static char PortableFilePath[FMAX_PATH+1]; +int PortableVersion; -/*===== ƒOƒ[ƒoƒ‹‚ȃ[ƒN =====*/ + +/*===== グローバルなワーク =====*/ HWND hHelpWin = NULL; -/* Ý’è’l */ +/* 設定値 */ 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] = { 160, 110, 60, 37 }; +int RemoteTabWidth[6] = { 160, 110, 60, 37, 60, 60 }; char UserMailAdrs[USER_MAIL_LEN+1] = { "who@example.com" }; char ViewerName[VIEWERS][FMAX_PATH+1] = { { "notepad" }, { "" }, { "" } }; HFONT ListFont = NULL; @@ -156,7 +179,7 @@ int RecvMode = TRANS_DLG; int SendMode = TRANS_DLG; int MoveMode = MOVE_DLG; int ListType = LVS_REPORT; -// LIST‚̃LƒƒƒbƒVƒ…‚𖳌ø‚É‚·‚éiƒŠƒ‚[ƒg‚̃fƒBƒŒƒNƒgƒŠ‚Ì•\Ž¦‚ªXV‚³‚ê‚È‚¢ƒoƒO‘΍ôj +// LISTのキャッシュを無効にする(リモートのディレクトリの表示が更新されないバグ対策) //int CacheEntry = 10; int CacheEntry = -10; int CacheSave = NO; @@ -208,20 +231,28 @@ int MirUpDelNotify = YES; int MirDownDelNotify = YES; int FolderAttr = NO; int FolderAttrNum = 777; +// 暗号化通信対応 +BYTE CertificateCacheHash[MAX_CERT_CACHE_HASH][20]; +BYTE SSLRootCAFileHash[20]; +// ファイルアイコン表示対応 +int DispFileIcon = NO; +// ディレクトリ自動作成 +int MakeAllDir = YES; + -/*----- ƒƒCƒ“ƒ‹[ƒ`ƒ“ -------------------------------------------------------- +/*----- メインルーチン -------------------------------------------------------- * * Parameter -* HINSTANCE hInstance : ‚±‚̃AƒvƒŠƒP[ƒVƒ‡ƒ“‚Ì‚±‚̃Cƒ“ƒXƒ^ƒ“ƒX‚̃nƒ“ƒhƒ‹ -* HINSTANCE hPrevInstance : ‚±‚̃AƒvƒŠƒP[ƒVƒ‡ƒ“‚Ì’¼‘O‚̃Cƒ“ƒXƒ^ƒ“ƒX‚̃nƒ“ƒhƒ‹ -* LPSTR lpszCmdLine : ƒAƒvƒŠƒP[ƒVƒ‡ƒ“‚ª‹N“®‚µ‚½‚Æ‚«‚̃Rƒ}ƒ“ƒhƒ‰ƒCƒ“‚ð‚³‚·ƒƒ“ƒOƒ|ƒCƒ“ƒ^ -* int cmdShow : Å‰‚É•\Ž¦‚·‚éƒEƒCƒ“ƒhƒE‚ÌŒ`Ž®B +* HINSTANCE hInstance : このアプリケーションのこのインスタンスのハンドル +* HINSTANCE hPrevInstance : このアプリケーションの直前のインスタンスのハンドル +* LPSTR lpszCmdLine : アプリケーションが起動したときのコマンドラインをさすロングポインタ +* int cmdShow : 最初に表示するウインドウの形式。 * * Return Value -* int ÅŒã‚̃ƒbƒZ[ƒW‚ÌwParam +* int 最後のメッセージのwParam *----------------------------------------------------------------------------*/ int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int cmdShow) @@ -230,9 +261,77 @@ int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLi int Ret; BOOL Sts; + // プロセス保護 +#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) + { + 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()) + { + MessageBox(NULL, MSGJPN321, "FFFTP", MB_OK | MB_ICONERROR); + return 0; + } +#ifndef _DEBUG + 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; + } +#ifndef _DEBUG + if(RestartProtectedProcess(" --restart")) + return 0; +#endif + if(!EnableLoadLibraryHook(TRUE)) + { + MessageBox(NULL, MSGJPN324, "FFFTP", MB_OK | MB_ICONERROR); + return 0; + } + } + else + InitializeLoadLibraryHook(); + } +#endif + + // マルチコアCPUの特定環境下でファイル通信中にクラッシュするバグ対策 #ifdef DISABLE_MULTI_CPUS SetProcessAffinityMask(GetCurrentProcess(), 1); #endif + MainThreadId = GetCurrentThreadId(); // yutaka if(OleInitialize(NULL) != S_OK){ @@ -242,6 +341,7 @@ int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLi InitCommonControls(); + // FTPS対応 #ifdef USE_OPENSSL LoadOpenSSL(); #endif @@ -249,7 +349,7 @@ int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLi Ret = FALSE; hWndFtp = NULL; hInstFtp = hInstance; - if(InitApp(lpszCmdLine, cmdShow) == SUCCESS) + if(InitApp(lpszCmdLine, cmdShow) == FFFTP_SUCCESS) { for(;;) { @@ -257,10 +357,12 @@ 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)) { - /* ƒfƒBƒŒƒNƒgƒŠ–¼‚Ì•\Ž¦ƒRƒ“ƒ{ƒ{ƒbƒNƒX‚ÅBS‚âRET‚ªŒø‚­‚悤‚É */ - /* ƒRƒ“ƒ{ƒ{ƒbƒNƒX“à‚ł̓AƒNƒZƒ‰ƒŒ[ƒ^‚𖳌ø‚É‚·‚é */ + /* ディレクトリ名の表示コンボボックスでBSやRETが効くように */ + /* コンボボックス内ではアクセラレータを無効にする */ if((Msg.hwnd == GetLocalHistEditHwnd()) || (Msg.hwnd == GetRemoteHistEditHwnd()) || ((hHelpWin != NULL) && (GetAncestor(Msg.hwnd, GA_ROOT) == hHelpWin)) || @@ -275,6 +377,7 @@ int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLi Ret = Msg.wParam; } UnregisterClass(FtpClassStr, hInstFtp); + // FTPS対応 #ifdef USE_OPENSSL FreeOpenSSL(); #endif @@ -283,17 +386,17 @@ int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLi } -/*----- ƒAƒvƒŠƒP[ƒVƒ‡ƒ“‚̏‰ŠúÝ’è -------------------------------------------- +/*----- アプリケーションの初期設定 -------------------------------------------- * * Parameter -* HINSTANCE hInstance : ‚±‚̃AƒvƒŠƒP[ƒVƒ‡ƒ“‚Ì‚±‚̃Cƒ“ƒXƒ^ƒ“ƒX‚̃nƒ“ƒhƒ‹ -* HINSTANCE hPrevInstance : ‚±‚̃AƒvƒŠƒP[ƒVƒ‡ƒ“‚Ì’¼‘O‚̃Cƒ“ƒXƒ^ƒ“ƒX‚̃nƒ“ƒhƒ‹ -* LPSTR lpszCmdLine : ƒAƒvƒŠƒP[ƒVƒ‡ƒ“‚ª‹N“®‚µ‚½‚Æ‚«‚̃Rƒ}ƒ“ƒhƒ‰ƒCƒ“‚ð‚³‚·ƒƒ“ƒOƒ|ƒCƒ“ƒ^ -* int cmdShow : Å‰‚É•\Ž¦‚·‚éƒEƒCƒ“ƒhƒE‚ÌŒ`Ž®B +* HINSTANCE hInstance : このアプリケーションのこのインスタンスのハンドル +* HINSTANCE hPrevInstance : このアプリケーションの直前のインスタンスのハンドル +* LPSTR lpszCmdLine : アプリケーションが起動したときのコマンドラインをさすロングポインタ +* int cmdShow : 最初に表示するウインドウの形式。 * * Return Value -* int ƒXƒe[ƒ^ƒX -* SUCCESS/FAIL +* int ステータス +* FFFTP_SUCCESS/FFFTP_FAIL *----------------------------------------------------------------------------*/ static int InitApp(LPSTR lpszCmdLine, int cmdShow) @@ -302,15 +405,19 @@ static int InitApp(LPSTR lpszCmdLine, int cmdShow) int Err; WSADATA WSAData; char PwdBuf[FMAX_PATH+1]; - int useDefautPassword = 0; /* Œx•¶•\Ž¦—p */ + int useDefautPassword = 0; /* 警告文表示用 */ int masterpass; + // ポータブル版判定 + int ImportPortable; - sts = FAIL; + 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(); @@ -320,7 +427,11 @@ 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); GetModuleFileName(NULL, HelpPath, FMAX_PATH); strcpy(GetFileName(HelpPath), "ffftp.chm"); @@ -335,15 +446,34 @@ 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 ƒ}ƒXƒ^[ƒpƒXƒ[ƒh‚ð“ü—Í‚³‚¹‚é - -z ƒIƒvƒVƒ‡ƒ“‚ª‚ ‚é‚Æ‚«‚͍ŏ‰‚¾‚¯ƒXƒLƒbƒv - -z ƒIƒvƒVƒ‡ƒ“‚ª‚È‚¢‚Æ‚«‚́CƒfƒtƒHƒ‹ƒgƒpƒXƒ[ƒh‚ð‚Ü‚¸ŽŽ‚· - LoadRegistory()‚·‚é - ƒpƒXƒ[ƒh‚ª•sˆê’v‚È‚çÄ“ü—Í‚·‚é‚©q‚Ë‚éD - (”j‘¹‚µ‚Ä‚¢‚½ê‡‚Í‚³‚¹‚È‚¢) + /* 2010.02.01 genta マスターパスワードを入力させる + -z オプションがあるときは最初だけスキップ + -z オプションがないときは,デフォルトパスワードをまず試す + LoadRegistry()する + パスワードが不一致なら再入力するか尋ねる. + (破損していた場合はさせない) */ if( CheckMasterPassword(lpszCmdLine, PwdBuf)) { @@ -351,26 +481,26 @@ static int InitApp(LPSTR lpszCmdLine, int cmdShow) useDefautPassword = 0; } else { - /* ƒpƒXƒ[ƒhŽw’è–³‚µ */ + /* パスワード指定無し */ SetMasterPassword( NULL ); - /* ‚±‚̏ê‚Å‚Í•\Ž¦‚Å‚«‚È‚¢‚̂Ńtƒ‰ƒO‚¾‚¯—§‚Ä‚Ä‚¨‚­*/ + /* この場では表示できないのでフラグだけ立てておく*/ useDefautPassword = 2; } - /* ƒpƒXƒ[ƒhƒ`ƒFƒbƒN‚Ì‚ÝŽÀŽ{ */ + /* パスワードチェックのみ実施 */ masterpass = 1; while( ValidateMasterPassword() == YES && GetMasterPasswordStatus() == PASSWORD_UNMATCH ){ if( useDefautPassword != 2 ){ - /* Äƒgƒ‰ƒC‚·‚é‚©Šm”F */ + /* 再トライするか確認 */ if( MessageBox(NULL, MSGJPN304, "FFFTP", MB_YESNO | MB_ICONEXCLAMATION) == IDNO ){ - useDefautPassword = 0; /* •sˆê’v‚Ȃ̂ŁC‚à‚Í‚âƒfƒtƒHƒ‹ƒg‚©‚Ç‚¤‚©‚Í•ª‚©‚ç‚È‚¢ */ + useDefautPassword = 0; /* 不一致なので,もはやデフォルトかどうかは分からない */ break; } } - /* Ä“ü—Í‚³‚¹‚é*/ + /* 再入力させる*/ masterpass = EnterMasterPasswordAndSet(masterpasswd_dlg, NULL); if( masterpass == 2 ){ useDefautPassword = 1; @@ -386,22 +516,33 @@ static int InitApp(LPSTR lpszCmdLine, int cmdShow) if(masterpass != 0) { - LoadRegistory(); + LoadRegistry(); - // ˆÃ†‰»’ʐM‘Ήž + // ポータブル版判定 + 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) LoadRasLib(); LoadKernelLib(); - //ƒ^ƒCƒ}‚̐¸“x‚ð‰ü‘P + //タイマの精度を改善 timeBeginPeriod(1); CountPrevFfftpWindows(); - if(MakeAllWindows(cmdShow) == SUCCESS) + if(MakeAllWindows(cmdShow) == FFFTP_SUCCESS) { hWndCurFocus = GetLocalHwnd(); @@ -413,7 +554,7 @@ static int InitApp(LPSTR lpszCmdLine, int cmdShow) DispTransferType(); SetHostKanaCnvImm(YES); SetHostKanjiCodeImm(KANJI_NOCNV); - // –{“–‚̓[ƒJƒ‹‚̃fƒtƒHƒ‹ƒg‚ðUTF-8‚É‚µ‚½‚¢‚ª‹Œƒo[ƒWƒ‡ƒ“‚Ƃ̌݊·«‚Ì‚½‚ßShift_JIS‚ɐݒè + // 本当はローカルのデフォルトをUTF-8にしたいが旧バージョンとの互換性のためShift_JISに設定 // SetLocalKanjiCodeImm(KANJI_UTF8N); SetLocalKanjiCodeImm(KANJI_SJIS); DispListType(); @@ -424,14 +565,14 @@ static int InitApp(LPSTR lpszCmdLine, int cmdShow) if(CacheSave == YES) LoadCache(); - if(MakeTransferThread() == SUCCESS) + if(MakeTransferThread() == FFFTP_SUCCESS) { DoPrintf("DEBUG MESSAGE ON ! ##"); DispWindowTitle(); - // SourceForge.JP‚É‚æ‚éƒtƒH[ƒN + // 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-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); @@ -455,14 +596,14 @@ static int InitApp(LPSTR lpszCmdLine, int cmdShow) DispTransferFiles(); StartupProc(lpszCmdLine); - sts = SUCCESS; + sts = FFFTP_SUCCESS; - /* ƒZƒLƒ…ƒŠƒeƒBŒx•¶‚Ì•\Ž¦ */ + /* セキュリティ警告文の表示 */ if( useDefautPassword ){ SetTaskMsg(MSGJPN300); } - /* ƒpƒXƒ[ƒh•sˆê’vŒx•¶‚Ì•\Ž¦ */ + /* パスワード不一致警告文の表示 */ switch( GetMasterPasswordStatus() ){ case PASSWORD_UNMATCH: SetTaskMsg(MSGJPN301); @@ -478,7 +619,7 @@ static int InitApp(LPSTR lpszCmdLine, int cmdShow) } } - // ˆÃ†‰»’ʐM‘Ήž + // 暗号化通信対応 #ifdef USE_OPENSSL if(IsOpenSSLLoaded()) SetTaskMsg(MSGJPN318); @@ -486,21 +627,21 @@ static int InitApp(LPSTR lpszCmdLine, int cmdShow) SetTaskMsg(MSGJPN319); #endif - if(sts == FAIL) + if(sts == FFFTP_FAIL) DeleteAllObject(); return(sts); } -/*----- ƒEƒCƒ“ƒhƒE‚ðì¬‚·‚é -------------------------------------------------- +/*----- ウインドウを作成する -------------------------------------------------- * * Parameter -* int cmdShow : Å‰‚É•\Ž¦‚·‚éƒEƒCƒ“ƒhƒE‚ÌŒ`Ž®B +* int cmdShow : 最初に表示するウインドウの形式。 * * Return Value -* int ƒXƒe[ƒ^ƒX -* SUCCESS/FAIL +* int ステータス +* FFFTP_SUCCESS/FFFTP_FAIL *----------------------------------------------------------------------------*/ static int MakeAllWindows(int cmdShow) @@ -516,7 +657,7 @@ static int MakeAllWindows(int cmdShow) int StsLvtips; int StsSocket; - /*===== ƒƒCƒ“ƒEƒCƒ“ƒhƒE =====*/ + /*===== メインウインドウ =====*/ RootColorBrush = CreateSolidBrush(GetSysColor(COLOR_3DFACE)); @@ -539,13 +680,7 @@ static int MakeAllWindows(int cmdShow) WinPosX = CW_USEDEFAULT; WinPosY = 0; } - // UTF-8‘Ήž - // ƒ†[ƒU[’è‹`‚̃Nƒ‰ƒX‚̓fƒtƒHƒ‹ƒg‚ÌWNDPROC‚ªShift_JISê—p‚Ì‚½‚ß -// 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); @@ -560,21 +695,21 @@ static int MakeAllWindows(int cmdShow) MoveWindow(hWndFtp, Rect2.left, Rect2.top, WinWidth, WinHeight, FALSE); } - /*===== ƒXƒeƒCƒ^ƒXƒo[ =====*/ + /*===== ステイタスバー =====*/ StsSbar = MakeStatusBarWindow(hWndFtp, hInstFtp); CalcWinSize(); - /*===== ƒc[ƒ‹ƒo[ =====*/ + /*===== ツールバー =====*/ StsTbar = MakeToolBarWindow(hWndFtp, hInstFtp); - /*===== ƒtƒ@ƒCƒ‹ƒŠƒXƒgƒEƒCƒ“ƒhƒE =====*/ + /*===== ファイルリストウインドウ =====*/ StsList = MakeListWin(hWndFtp, hInstFtp); - /*==== ƒ^ƒXƒNƒEƒCƒ“ƒhƒE ====*/ + /*==== タスクウインドウ ====*/ StsTask = MakeTaskWindow(hWndFtp, hInstFtp); @@ -584,39 +719,39 @@ static int MakeAllWindows(int cmdShow) ShowWindow(hWndFtp, cmdShow); - /*==== ƒ\ƒPƒbƒgƒEƒCƒ“ƒhƒE ====*/ + /*==== ソケットウインドウ ====*/ StsSocket = MakeSocketWin(hWndFtp, hInstFtp); StsLvtips = InitListViewTips(hWndFtp, hInstFtp); } - Sts = SUCCESS; + Sts = FFFTP_SUCCESS; if((hWndFtp == NULL) || - (StsTbar == FAIL) || - (StsList == FAIL) || - (StsSbar == FAIL) || - (StsTask == FAIL) || - (StsLvtips == FAIL) || - (StsSocket == FAIL)) + (StsTbar == FFFTP_FAIL) || + (StsList == FFFTP_FAIL) || + (StsSbar == FFFTP_FAIL) || + (StsTask == FFFTP_FAIL) || + (StsLvtips == FFFTP_FAIL) || + (StsSocket == FFFTP_FAIL)) { - Sts = FAIL; + Sts = FFFTP_FAIL; } - if(Sts == SUCCESS) + if(Sts == FFFTP_SUCCESS) SetListViewType(); return(Sts); } -/*----- ƒEƒCƒ“ƒhƒE‚̃^ƒCƒgƒ‹‚ð•\Ž¦‚·‚é ---------------------------------------- +/*----- ウインドウのタイトルを表示する ---------------------------------------- * * Parameter -* ‚È‚µ +* なし * * Return Value -* ‚È‚µ +* なし *----------------------------------------------------------------------------*/ void DispWindowTitle(void) @@ -633,13 +768,13 @@ void DispWindowTitle(void) } -/*----- ‘S‚ẴIƒuƒWƒFƒNƒg‚ðíœ ---------------------------------------------- +/*----- 全てのオブジェクトを削除 ---------------------------------------------- * * Parameter -* ‚È‚µ +* なし * * Return Value -* ‚È‚µ +* なし *----------------------------------------------------------------------------*/ static void DeleteAllObject(void) @@ -649,13 +784,13 @@ static void DeleteAllObject(void) //move to WM_DESTROY WSACleanup(); -//test ƒVƒXƒeƒ€”C‚¹ +//test システム任せ // if(ListFont != NULL) // DeleteObject(ListFont); // if(RootColorBrush != NULL) // DeleteObject(RootColorBrush); -//test ƒVƒXƒeƒ€”C‚¹ +//test システム任せ // DeleteListViewTips(); // DeleteListWin(); // DeleteStatusBarWindow(); @@ -675,13 +810,13 @@ static void DeleteAllObject(void) } -/*----- ƒƒCƒ“ƒEƒCƒ“ƒhƒE‚̃EƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹‚ð•Ô‚· ---------------------------- +/*----- メインウインドウのウインドウハンドルを返す ---------------------------- * * Parameter -* ‚È‚µ +* なし * * Return Value -* HWND ƒEƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +* HWND ウインドウハンドル *----------------------------------------------------------------------------*/ HWND GetMainHwnd(void) @@ -690,13 +825,13 @@ HWND GetMainHwnd(void) } -/*----- Œ»ÝƒtƒH[ƒJƒX‚ª‚ ‚éƒEƒCƒ“ƒhƒE‚̃EƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹‚ð•Ô‚· -------------- +/*----- 現在フォーカスがあるウインドウのウインドウハンドルを返す -------------- * * Parameter -* ‚È‚µ +* なし * * Return Value -* HWND ƒEƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +* HWND ウインドウハンドル *----------------------------------------------------------------------------*/ HWND GetFocusHwnd(void) @@ -705,13 +840,13 @@ HWND GetFocusHwnd(void) } -/*----- Œ»ÝƒtƒH[ƒJƒX‚ª‚ ‚éƒEƒCƒ“ƒhƒE‚Ì‚ðƒZƒbƒg‚·‚é -------------------------- +/*----- 現在フォーカスがあるウインドウのをセットする -------------------------- * * Parameter -* HWND hWnd : ƒEƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +* HWND hWnd : ウインドウハンドル * * Return Value -* ‚È‚µ +* なし *----------------------------------------------------------------------------*/ void SetFocusHwnd(HWND hWnd) @@ -721,13 +856,13 @@ void SetFocusHwnd(HWND hWnd) } -/*----- ƒvƒƒOƒ‰ƒ€‚̃Cƒ“ƒXƒ^ƒ“ƒX‚ð•Ô‚· ---------------------------------------- +/*----- プログラムのインスタンスを返す ---------------------------------------- * * Parameter -* ‚È‚µ +* なし * * Return Value -* HINSTANCE ƒCƒ“ƒXƒ^ƒ“ƒX +* HINSTANCE インスタンス *----------------------------------------------------------------------------*/ HINSTANCE GetFtpInst(void) @@ -736,37 +871,59 @@ HINSTANCE GetFtpInst(void) } -/*----- ƒƒCƒ“ƒEƒCƒ“ƒhƒE‚̃ƒbƒZ[ƒWˆ— -------------------------------------- +/*----- メインウインドウのメッセージ処理 -------------------------------------- * * Parameter -* HWND hWnd : ƒEƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ -* UINT message : ƒƒbƒZ[ƒW”ԍ† -* WPARAM wParam : ƒƒbƒZ[ƒW‚Ì WPARAM ˆø” -* LPARAM lParam : ƒƒbƒZ[ƒW‚Ì LPARAM ˆø” +* HWND hWnd : ウインドウハンドル +* UINT message : メッセージ番号 +* WPARAM wParam : メッセージの WPARAM 引数 +* LPARAM lParam : メッセージの LPARAM 引数 * * Return Value -* ƒƒbƒZ[ƒW‚ɑΉž‚·‚é–ß‚è’l +* メッセージに対応する戻り値 *----------------------------------------------------------------------------*/ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { PAINTSTRUCT ps; LPTOOLTIPTEXT lpttt; + // UTF-8対応 + LPTOOLTIPTEXTW wlpttt; RECT Rect; int TmpTransType; switch (message) { + // 自動切断対策 + case WM_TIMER : + if(wParam == 1) + NoopProc(); + break; + case WM_COMMAND : + // 同時接続対応 + // 中断後に受信バッファに応答が残っていると次のコマンドの応答が正しく処理できない + if(CancelFlg == YES) + RemoveReceivedData(AskCmdCtrlSkt()); switch(LOWORD(wParam)) { case MENU_CONNECT : + // 自動切断対策 + KillTimer(hWnd, 1); ConnectProc(DLG_TYPE_CON, -1); + // 自動切断対策 + if(AskNoopInterval() > 0) + SetTimer(hWnd, 1, AskNoopInterval() * 1000, NULL); break; case MENU_CONNECT_NUM : + // 自動切断対策 + KillTimer(hWnd, 1); ConnectProc(DLG_TYPE_CON, (int)lParam); + // 自動切断対策 + if(AskNoopInterval() > 0) + SetTimer(hWnd, 1, AskNoopInterval() * 1000, NULL); if(AskConnecting() == YES) { if(HIWORD(wParam) & OPT_MIRROR) @@ -787,11 +944,21 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA break; case MENU_SET_CONNECT : + // 自動切断対策 + KillTimer(hWnd, 1); ConnectProc(DLG_TYPE_SET, -1); + // 自動切断対策 + if(AskNoopInterval() > 0) + SetTimer(hWnd, 1, AskNoopInterval() * 1000, NULL); break; case MENU_QUICK : + // 自動切断対策 + KillTimer(hWnd, 1); QuickConnectProc(); + // 自動切断対策 + if(AskNoopInterval() > 0) + SetTimer(hWnd, 1, AskNoopInterval() * 1000, NULL); break; case MENU_DISCONNECT : @@ -825,7 +992,12 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA case MENU_HIST_18 : case MENU_HIST_19 : case MENU_HIST_20 : + // 自動切断対策 + KillTimer(hWnd, 1); HistoryConnectProc(LOWORD(wParam)); + // 自動切断対策 + if(AskNoopInterval() > 0) + SetTimer(hWnd, 1, AskNoopInterval() * 1000, NULL); break; case MENU_UPDIR : @@ -837,6 +1009,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 { @@ -905,42 +1093,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 : @@ -1003,17 +1191,21 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA DispTransferType(); CheckHistoryNum(0); SetAllHistoryToMenu(); - // ˆÃ†‰»’ʐM‘Ήž + // 暗号化通信対応 SetSSLTimeoutCallback(TimeOut * 1000, SSLTimeoutCallback); 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); @@ -1062,11 +1254,12 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA DispTransferType(); break; - // UTF-8‘Ήž + // UTF-8対応 case MENU_KNJ_SJIS : case MENU_KNJ_EUC : case MENU_KNJ_JIS : case MENU_KNJ_UTF8N : + case MENU_KNJ_UTF8BOM : case MENU_KNJ_NONE : SetHostKanjiCode(LOWORD(wParam)); break; @@ -1075,6 +1268,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; @@ -1083,9 +1277,11 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA break; case MENU_REFRESH : + // 同時接続対応 + CancelFlg = NO; SuppressRefresh = 1; GetLocalDirForWnd(); - if(CheckClosedAndReconnect() == SUCCESS) + if(CheckClosedAndReconnect() == FFFTP_SUCCESS) GetRemoteDirForWnd(CACHE_REFRESH, &CancelFlg); SuppressRefresh = 0; break; @@ -1107,8 +1303,10 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA break; case REFRESH_REMOTE : + // 同時接続対応 + CancelFlg = NO; SuppressRefresh = 1; - if(CheckClosedAndReconnect() == SUCCESS) + if(CheckClosedAndReconnect() == FFFTP_SUCCESS) GetRemoteDirForWnd(CACHE_REFRESH, &CancelFlg); SuppressRefresh = 0; break; @@ -1135,7 +1333,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 : @@ -1171,6 +1371,8 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA break; case MENU_DOTFILE : + // 同時接続対応 + CancelFlg = NO; DotFile ^= 1; DispDotFileMode(); GetLocalDirForWnd(); @@ -1187,7 +1389,7 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA case MENU_REGSAVE : GetListTabWidth(); - SaveRegistory(); + SaveRegistry(); SaveSettingsToFile(); break; @@ -1203,7 +1405,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); } @@ -1211,7 +1415,7 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA case MENU_CHANGEPASSWD: /* 2010.01.31 genta */ if( GetMasterPasswordStatus() != PASSWORD_OK ) { - /* ‹­§“I‚ɐݒ肷‚é‚©Šm”F */ + /* 強制的に設定するか確認 */ if( DialogBox(hInstFtp, MAKEINTRESOURCE(forcepasschange_dlg), hWnd, ExeEscDialogProc) != YES){ break; } @@ -1251,6 +1455,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)) @@ -1259,7 +1469,7 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA } break; } -// í‚ɃzƒXƒg‚©ƒ[ƒJƒ‹‚ÖƒtƒH[ƒJƒX‚ðˆÚ“® +// 常にホストかローカルへフォーカスを移動 // SetFocus(hWndCurFocus); MakeButtonsFocus(); break; @@ -1267,9 +1477,14 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA case WM_NOTIFY : switch(((LPNMHDR)lParam)->code) { - /* ƒc[ƒ‹ƒ`ƒbƒvƒRƒ“ƒgƒ[ƒ‹ƒƒbƒZ[ƒW‚̏ˆ— */ - 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) { @@ -1288,7 +1503,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; @@ -1359,6 +1582,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; @@ -1379,6 +1606,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; @@ -1391,15 +1622,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; @@ -1407,6 +1637,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); } @@ -1414,6 +1646,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); } @@ -1505,13 +1739,13 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA } -/*----- ƒvƒƒOƒ‰ƒ€ŠJŽnŽž‚̏ˆ— ------------------------------------------------ +/*----- プログラム開始時の処理 ------------------------------------------------ * * Parameter -* char *Cmd : ƒRƒ}ƒ“ƒhƒ‰ƒCƒ“•¶Žš—ñ +* char *Cmd : コマンドライン文字列 * * Return Value -* ‚È‚µ +* なし *----------------------------------------------------------------------------*/ static void StartupProc(char *Cmd) @@ -1571,18 +1805,18 @@ static void StartupProc(char *Cmd) } -/*----- ƒRƒ}ƒ“ƒhƒ‰ƒCƒ“‚ð‰ðÍ -------------------------------------------------- +/*----- コマンドラインを解析 -------------------------------------------------- * * Parameter -* char *Str : ƒRƒ}ƒ“ƒhƒ‰ƒCƒ“•¶Žš—ñ -* int *AutoConnect : Ú‘±ƒzƒXƒg”ԍ†‚ð•Ô‚·ƒ[ƒN -* int *CmdOption : ƒIƒvƒVƒ‡ƒ“‚ð•Ô‚·ƒ[ƒN -* char *unc : unc‚ð•Ô‚·ƒ[ƒN -* int Max : unc‚̍ő咷 +* char *Str : コマンドライン文字列 +* int *AutoConnect : 接続ホスト番号を返すワーク +* int *CmdOption : オプションを返すワーク +* char *unc : uncを返すワーク +* int Max : uncの最大長 * * Return Value -* int ƒXƒe[ƒ^ƒX -* 0=Žw’è‚È‚µA1=URLŽw’èA2=Ý’è–¼Žw’èA-1=ƒGƒ‰[ +* int ステータス +* 0=指定なし、1=URL指定、2=設定名指定、-1=エラー * * Note * -m --mirror @@ -1599,10 +1833,10 @@ static void StartupProc(char *Cmd) * -k --kana * -u --eucname * -i --jisname -* -n --ini (CheckIniFileName‚ÅŒŸõ) +* -n --ini (CheckIniFileNameで検索) * --saveoff * --saveon -* -z --mpasswd (CheckMasterPassword‚ÅŒŸõ) 2010.01.30 genta ’ljÁ +* -z --mpasswd (CheckMasterPasswordで検索) 2010.01.30 genta 追加 *----------------------------------------------------------------------------*/ static int AnalyzeComLine(char *Str, int *AutoConnect, int *CmdOption, char *unc, int Max) @@ -1695,6 +1929,24 @@ static int AnalyzeComLine(char *Str, int *AutoConnect, int *CmdOption, char *unc { hHelpWin = HtmlHelp(NULL, AskHelpFilePath(), HH_HELP_CONTEXT, IDH_HELP_TOPIC_0000024); } + // プロセス保護 +#ifdef ENABLE_PROCESS_PROTECTION + else if(strcmp(Tmp, "--restart") == 0) + { + } + else if(strcmp(Tmp, "--protect") == 0) + { + } + else if(strcmp(Tmp, "--protect-high") == 0) + { + } + else if(strcmp(Tmp, "--protect-medium") == 0) + { + } + else if(strcmp(Tmp, "--protect-low") == 0) + { + } +#endif else { SetTaskMsg(MSGJPN180, Tmp); @@ -1719,15 +1971,15 @@ static int AnalyzeComLine(char *Str, int *AutoConnect, int *CmdOption, char *unc } -/*----- INIƒtƒ@ƒCƒ‹‚̃pƒX–¼‚ÌŽw’è‚ðƒ`ƒFƒbƒN ------------------------------------ +/*----- INIファイルのパス名の指定をチェック ------------------------------------ * * Parameter -* char *Str : ƒRƒ}ƒ“ƒhƒ‰ƒCƒ“•¶Žš—ñ -* char *Ini : iniƒtƒ@ƒCƒ‹–¼‚ð•Ô‚·ƒ[ƒN +* char *Str : コマンドライン文字列 +* char *Ini : iniファイル名を返すワーク * * Return Value -* int ƒXƒe[ƒ^ƒX -* 0=Žw’è‚È‚µA1=‚ ‚è +* int ステータス +* 0=指定なし、1=あり * * Note * -n --ini @@ -1738,25 +1990,25 @@ static int CheckIniFileName(char *Str, char *Ini) return GetTokenAfterOption( Str, Ini, "n", "-ini" ); } -/* ƒ}ƒXƒ^[ƒpƒXƒ[ƒh‚ÌŽw’è‚ðƒ`ƒFƒbƒN */ +/* マスターパスワードの指定をチェック */ static int CheckMasterPassword(char *Str, char *Ini) { return GetTokenAfterOption( Str, Ini, "z", "-mpasswd" ); } -/*----- ƒIƒvƒVƒ‡ƒ“‚ÌŒã‚ë‚̃g[ƒNƒ“‚ðŽæ‚èo‚· ------------------------------------ +/*----- オプションの後ろのトークンを取り出す ------------------------------------ * * Parameter -* char *Str : ƒRƒ}ƒ“ƒhƒ‰ƒCƒ“•¶Žš—ñ -* char *Result : Žæ‚èo‚µ‚½•¶Žš—ñ‚ðŠi”[‚·‚郏[ƒN -* const char* Opt1, *Opt2: ƒIƒvƒVƒ‡ƒ“•¶Žš—ñ(2‚Â) +* char *Str : コマンドライン文字列 +* char *Result : 取り出した文字列を格納するワーク +* const char* Opt1, *Opt2: オプション文字列(2つ) * * Return Value -* int ƒXƒe[ƒ^ƒX -* 0=Žw’è‚È‚µA1=‚ ‚è +* int ステータス +* 0=指定なし、1=あり * * Note -* 2010.01.30 genta ƒ}ƒXƒ^[ƒpƒXƒ[ƒhŽæ‚èo‚µ‚Ì‚½‚ß‹¤’ʉ» +* 2010.01.30 genta マスターパスワード取り出しのため共通化 *----------------------------------------------------------------------------*/ static int GetTokenAfterOption(char *Str, char *Result, const char* Opt1, const char* Opt2 ) { @@ -1780,15 +2032,15 @@ static int GetTokenAfterOption(char *Str, char *Result, const char* Opt1, const return(Ret); } -/*----- ƒg[ƒNƒ“‚ð•Ô‚· -------------------------------------------------------- +/*----- トークンを返す -------------------------------------------------------- * * Parameter -* char *Str : •¶Žš—ñ -* char *Buf : •¶Žš—ñ‚ð•Ô‚·ƒoƒbƒtƒ@ +* char *Str : 文字列 +* char *Buf : 文字列を返すバッファ * * Return Value -* char *•Ô‚µ‚½ƒg[ƒNƒ“‚Ì––”ö -* NULL=I‚í‚è +* char *返したトークンの末尾 +* NULL=終わり *----------------------------------------------------------------------------*/ static char *GetToken(char *Str, char *Buf) @@ -1830,17 +2082,20 @@ static char *GetToken(char *Str, char *Buf) } -/*----- ƒvƒƒOƒ‰ƒ€I—¹Žž‚̏ˆ— ------------------------------------------------ +/*----- プログラム終了時の処理 ------------------------------------------------ * * Parameter -* HWND hWnd : ƒEƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +* HWND hWnd : ウインドウハンドル * * Return Value -* ‚È‚µ +* なし *----------------------------------------------------------------------------*/ static void ExitProc(HWND hWnd) { + // 環境依存の不具合対策 + char Tmp[FMAX_PATH+1]; + CancelFlg = YES; CloseTransferThread(); @@ -1859,7 +2114,10 @@ static void ExitProc(HWND hWnd) if(SaveExit == YES) { GetListTabWidth(); - SaveRegistory(); + SaveRegistry(); + // ポータブル版判定 + if(RegType == REGTYPE_REG) + ClearIni(); if((CacheEntry > 0) && (CacheSave == YES)) SaveCache(); @@ -1869,6 +2127,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); @@ -1879,15 +2145,15 @@ static void ExitProc(HWND hWnd) } -/*----- ƒtƒ@ƒCƒ‹–¼‚ðƒ_ƒuƒ‹ƒNƒŠƒbƒN‚µ‚½‚Æ‚«‚̏ˆ— ------------------------------ +/*----- ファイル名をダブルクリックしたときの処理 ------------------------------ * * Parameter -* int Win : ƒEƒCƒ“ƒhƒE”ԍ† (WIN_xxx) -* int Mode : í‚ɁuŠJ‚­v“®ì‚ð‚·‚é‚©‚Ç‚¤‚© (YES/NO) -* int App : ƒAƒvƒŠƒP[ƒVƒ‡ƒ“”ԍ†i-1=ŠÖ˜A‚¯—Dæj +* int Win : ウインドウ番号 (WIN_xxx) +* int Mode : 常に「開く」動作をするかどうか (YES/NO) +* int App : アプリケーション番号(-1=関連づけ優先) * * Return Value -* ‚È‚µ +* なし *----------------------------------------------------------------------------*/ void DoubleClickProc(int Win, int Mode, int App) @@ -1912,7 +2178,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)) { @@ -1928,13 +2196,13 @@ void DoubleClickProc(int Win, int Mode, int App) else ChangeDir(WIN_LOCAL, Tmp); } - else if(CheckClosedAndReconnect() == SUCCESS) + else if(CheckClosedAndReconnect() == FFFTP_SUCCESS) { if((App != -1) || (Type == NODE_FILE)) { if((DclickOpen == YES) || (Mode == YES)) { - // ƒrƒ…[ƒ‚QA‚R‚̃pƒX‚ª "d " ‚ÅŽn‚Ü‚Á‚Ä‚¢‚½‚獷•ªƒrƒ…[ƒAŽg—p + // ビューワ2、3のパスが "d " で始まっていたら差分ビューア使用 if ((App == 1 || App == 2) && strncmp(ViewerName[App], "d ", 2) == 0) UseDiffViewer = YES; else @@ -1942,6 +2210,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."); } @@ -1982,13 +2254,15 @@ void DoubleClickProc(int Win, int Mode, int App) DisableUserOpe(); - /* •s³‚ȃpƒX‚ðŒŸo */ + /* 不正なパスを検出 */ 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); // } } @@ -2021,17 +2295,17 @@ void DoubleClickProc(int Win, int Mode, int App) } -/*----- ƒtƒHƒ‹ƒ_‚̈ړ® -------------------------------------------------------- +/*----- フォルダの移動 -------------------------------------------------------- * * Parameter -* int Win : ƒEƒCƒ“ƒhƒE”ԍ† (WIN_xxx) -* char *Path : ˆÚ“®æ‚̃pƒX–¼ +* int Win : ウインドウ番号 (WIN_xxx) +* char *Path : 移動先のパス名 * * Return Value -* ‚È‚µ +* なし * * Note -* ƒtƒHƒ‹ƒ_“¯ŽžˆÚ“®‚̏ˆ—‚às‚¤ +* フォルダ同時移動の処理も行う *----------------------------------------------------------------------------*/ static void ChangeDir(int Win, char *Path) @@ -2040,6 +2314,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) { @@ -2054,16 +2333,16 @@ static void ChangeDir(int Win, char *Path) if((Win == WIN_LOCAL) || (Sync == YES)) { - if(DoLocalCWD(Path) == SUCCESS) + if(DoLocalCWD(Path) == FFFTP_SUCCESS) GetLocalDirForWnd(); } if((Win == WIN_REMOTE) || (Sync == YES)) { - if(CheckClosedAndReconnect() == SUCCESS) + if(CheckClosedAndReconnect() == FFFTP_SUCCESS) { #if defined(HAVE_OPENVMS) - /* OpenVMS‚̏ꍇA".DIR;?"‚ðŽæ‚é */ + /* OpenVMSの場合、".DIR;?"を取る */ if (AskHostType() == HTYPE_VMS) ReformVMSDirName(Path, TRUE); #endif @@ -2071,17 +2350,19 @@ static void ChangeDir(int Win, char *Path) GetRemoteDirForWnd(CACHE_NORMAL, &CancelFlg); } } + // デッドロック対策 + EnableUserOpe(); return; } -/*----- ƒEƒCƒ“ƒhƒE‚̃TƒCƒY•ÏX‚̏ˆ— ------------------------------------------ +/*----- ウインドウのサイズ変更の処理 ------------------------------------------ * * Parameter -* ‚È‚µ +* なし * * Return Value -* ‚È‚µ +* なし *----------------------------------------------------------------------------*/ static void ResizeWindowProc(void) @@ -2134,13 +2415,13 @@ static void ResizeWindowProc(void) } -/*----- ƒEƒCƒ“ƒhƒE‚ÌŠe•”•ª‚̃TƒCƒY‚ðŒvŽZ‚·‚é ---------------------------------- +/*----- ウインドウの各部分のサイズを計算する ---------------------------------- * * Parameter -* ‚È‚µ +* なし * * Return Value -* ‚È‚µ +* なし *----------------------------------------------------------------------------*/ static void CalcWinSize(void) @@ -2174,13 +2455,13 @@ static void CalcWinSize(void) #if 0 -/*----- ƒEƒCƒ“ƒhƒE‚Ì•\Ž¦ˆÊ’u‚ðŽæ“¾‚·‚é ---------------------------------------- +/*----- ウインドウの表示位置を取得する ---------------------------------------- * * Parameter -* HWND hWnd : ƒEƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +* HWND hWnd : ウインドウハンドル * * Return Value -* ‚È‚µ +* なし *----------------------------------------------------------------------------*/ static void AskWindowPos(HWND hWnd) @@ -2197,15 +2478,15 @@ static void AskWindowPos(HWND hWnd) #endif -/*----- ƒfƒBƒŒƒNƒgƒŠƒŠƒXƒg‚ƃtƒ@ƒCƒ‹ƒŠƒXƒg‚Ì‹«ŠE•ÏXˆ— ---------------------- +/*----- ディレクトリリストとファイルリストの境界変更処理 ---------------------- * * Parameter -* WPARAM Keys : WM_MOUSEMOVE‚È‚Ç‚ÌWPARAM‚Ì’l -* int x : ƒ}ƒEƒXƒJ[ƒ\ƒ‹‚Ì‚wÀ•W -* int y : ƒ}ƒEƒXƒJ[ƒ\ƒ‹‚Ì‚xÀ•W +* WPARAM Keys : WM_MOUSEMOVEなどのWPARAMの値 +* int x : マウスカーソルのX座標 +* int y : マウスカーソルのY座標 * * Return Value -* ‚È‚µ +* なし *----------------------------------------------------------------------------*/ static void CheckResizeFrame(WPARAM Keys, int x, int y) @@ -2218,7 +2499,7 @@ static void CheckResizeFrame(WPARAM Keys, int x, int y) if((x >= LocalWidth) && (x <= LocalWidth + SepaWidth) && (y > TOOLWIN_HEIGHT) && (y < (TOOLWIN_HEIGHT * 2 + ListHeight))) { - /* ‹«ŠEˆÊ’u•ÏX—pƒJ[ƒ\ƒ‹‚ɕύX */ + /* 境界位置変更用カーソルに変更 */ SetCapture(hWndFtp); hCursor = LoadCursor(hInstFtp, MAKEINTRESOURCE(resize_lr_csr)); SetCursor(hCursor); @@ -2227,7 +2508,7 @@ static void CheckResizeFrame(WPARAM Keys, int x, int y) } else if((y >= TOOLWIN_HEIGHT*2+ListHeight) && (y <= TOOLWIN_HEIGHT*2+ListHeight+SepaWidth)) { - /* ‹«ŠEˆÊ’u•ÏX—pƒJ[ƒ\ƒ‹‚ɕύX */ + /* 境界位置変更用カーソルに変更 */ SetCapture(hWndFtp); hCursor = LoadCursor(hInstFtp, MAKEINTRESOURCE(resize_ud_csr)); SetCursor(hCursor); @@ -2239,7 +2520,7 @@ static void CheckResizeFrame(WPARAM Keys, int x, int y) { if(Keys & MK_LBUTTON) { - /* ‹«ŠEˆÊ’u•ÏXŠJŽn */ + /* 境界位置変更開始 */ Resizing = RESIZE_ON; GetWindowRect(hWndFtp, &Rect); GetClientRect(GetSbarWnd(), &Rect1); @@ -2257,7 +2538,7 @@ static void CheckResizeFrame(WPARAM Keys, int x, int y) ((ResizePos == RESIZE_VPOS) && ((y < TOOLWIN_HEIGHT*2+ListHeight) || (y > TOOLWIN_HEIGHT*2+ListHeight+SepaWidth)))) { - /* Œ³‚̃J[ƒ\ƒ‹‚É–ß‚· */ + /* 元のカーソルに戻す */ ReleaseCapture(); hCursor = LoadCursor(NULL, IDC_ARROW); SetCursor(hCursor); @@ -2279,7 +2560,7 @@ static void CheckResizeFrame(WPARAM Keys, int x, int y) if((Keys & MK_LBUTTON) == 0) { - /* ‹«ŠEˆÊ’u•ÏXI—¹ */ + /* 境界位置変更終了 */ ReleaseCapture(); ClipCursor(NULL); hCursor = LoadCursor(NULL, IDC_ARROW); @@ -2291,13 +2572,13 @@ static void CheckResizeFrame(WPARAM Keys, int x, int y) } -/*----- ƒtƒ@ƒCƒ‹ˆê——î•ñ‚ðƒrƒ…[ƒ‚Å•\Ž¦ -------------------------------------- +/*----- ファイル一覧情報をビューワで表示 -------------------------------------- * * Parameter -* ‚È‚µ +* なし * * Return Value -* ‚È‚µ +* なし *----------------------------------------------------------------------------*/ static void DispDirInfo(void) @@ -2311,14 +2592,14 @@ static void DispDirInfo(void) -/*----- ƒrƒ…[ƒ‚ð‹N“® -------------------------------------------------------- +/*----- ビューワを起動 -------------------------------------------------------- * * Parameter -* char Fname : ƒtƒ@ƒCƒ‹–¼ -* int App : ƒAƒvƒŠƒP[ƒVƒ‡ƒ“”ԍ†i-1=ŠÖ˜A‚¯—Dæj +* char Fname : ファイル名 +* int App : アプリケーション番号(-1=関連づけ優先) * * Return Value -* ‚È‚µ +* なし *----------------------------------------------------------------------------*/ void ExecViewer(char *Fname, int App) @@ -2328,18 +2609,30 @@ 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()‚ÍŠÖ˜A•t‚¯‚ç‚ꂽƒvƒƒOƒ‰ƒ€‚̃pƒX–¼‚ɃXƒy[ƒX‚ª */ - /* ŠÜ‚Ü‚ê‚Ä‚¢‚鎞AŠÔˆá‚Á‚½ƒpƒX–¼‚ð•Ô‚·Ž–‚ª‚ ‚éB */ - /* ‚»‚±‚ŁAŠÖ˜A•t‚¯‚ç‚ꂽƒvƒƒOƒ‰ƒ€‚Ì‹N“®‚ÍShellExecute()‚ðŽg‚¤B */ + /* FindExecutable()は関連付けられたプログラムのパス名にスペースが */ + /* 含まれている時、間違ったパス名を返す事がある。 */ + /* そこで、関連付けられたプログラムの起動はShellExecute()を使う。 */ 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); @@ -2355,25 +2648,41 @@ 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; } -/*----- ·•ª•\Ž¦ƒrƒ…[ƒ‚ð‹N“® ------------------------------------------------ +/*----- 差分表示ビューワを起動 ------------------------------------------------ * * Parameter -* char Fname1 : ƒtƒ@ƒCƒ‹–¼ -* char Fname2 : ƒtƒ@ƒCƒ‹–¼2 -* int App : ƒAƒvƒŠƒP[ƒVƒ‡ƒ“”ԍ†i2 or 3j +* char Fname1 : ファイル名 +* char Fname2 : ファイル名2 +* int App : アプリケーション番号(2 or 3) * * Return Value -* ‚È‚µ +* なし *----------------------------------------------------------------------------*/ void ExecViewer2(char *Fname1, char *Fname2, int App) @@ -2383,14 +2692,16 @@ 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()‚ÍŠÖ˜A•t‚¯‚ç‚ꂽƒvƒƒOƒ‰ƒ€‚̃pƒX–¼‚ɃXƒy[ƒX‚ª */ - /* ŠÜ‚Ü‚ê‚Ä‚¢‚鎞AŠÔˆá‚Á‚½ƒpƒX–¼‚ð•Ô‚·Ž–‚ª‚ ‚éB */ - /* ‚»‚±‚ŁAŠÖ˜A•t‚¯‚ç‚ꂽƒvƒƒOƒ‰ƒ€‚Ì‹N“®‚ÍShellExecute()‚ðŽg‚¤B */ + /* FindExecutable()は関連付けられたプログラムのパス名にスペースが */ + /* 含まれている時、間違ったパス名を返す事がある。 */ + /* そこで、関連付けられたプログラムの起動はShellExecute()を使う。 */ AskLocalCurDir(CurDir, FMAX_PATH); - strcpy(AssocProg, ViewerName[App] + 2); /* æ“ª‚Ì "d " ‚Í“Ç‚Ý”ò‚΂· */ + strcpy(AssocProg, ViewerName[App] + 2); /* 先頭の "d " は読み飛ばす */ if(strchr(Fname1, ' ') == NULL && strchr(Fname2, ' ') == NULL) sprintf(ComLine, "%s %s %s", AssocProg, Fname1, Fname2); @@ -2402,23 +2713,39 @@ 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; } -/*----- ƒeƒ“ƒ|ƒ‰ƒŠƒtƒ@ƒCƒ‹–¼‚ðƒeƒ“ƒ|ƒ‰ƒŠƒtƒ@ƒCƒ‹ƒŠƒXƒg‚ɒljÁ ------------------ +/*----- テンポラリファイル名をテンポラリファイルリストに追加 ------------------ * * Parameter -* char *Fname : ƒeƒ“ƒ|ƒ‰ƒŠƒtƒ@ƒCƒ‹–¼ +* char *Fname : テンポラリファイル名 * * Return Value -* ‚È‚µ +* なし *----------------------------------------------------------------------------*/ void AddTempFileList(char *Fname) @@ -2443,13 +2770,13 @@ void AddTempFileList(char *Fname) } -/*----- ƒeƒ“ƒ|ƒ‰ƒŠƒtƒ@ƒCƒ‹ƒŠƒXƒg‚É“o˜^‚³‚ê‚Ä‚¢‚éƒtƒ@ƒCƒ‹‚ð‘S‚č폜 ------------ +/*----- テンポラリファイルリストに登録されているファイルを全て削除 ------------ * * Parameter -* ‚È‚µ +* なし * * Return Value -* ‚È‚µ +* なし *----------------------------------------------------------------------------*/ static void DeleteAlltempFile(void) @@ -2468,26 +2795,28 @@ static void DeleteAlltempFile(void) Pos = Next; } - // OLE D&D‚̃eƒ“ƒ|ƒ‰ƒŠ‚ðíœ‚·‚é (2007.9.11 yutaka) + // OLE D&Dのテンポラリを削除する (2007.9.11 yutaka) doDeleteRemoteFile(); return; } -/*----- ‚`‚‚‚‚•‚”ƒ_ƒCƒAƒƒOƒ{ƒbƒNƒX‚̃R[ƒ‹ƒoƒbƒNŠÖ” ------------------------ +/*----- Aboutダイアログボックスのコールバック関数 ------------------------ * * Parameter -* HWND hDlg : ƒEƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ -* UINT message : ƒƒbƒZ[ƒW”ԍ† -* WPARAM wParam : ƒƒbƒZ[ƒW‚Ì WPARAM ˆø” -* LPARAM lParam : ƒƒbƒZ[ƒW‚Ì LPARAM ˆø” +* HWND hDlg : ウインドウハンドル +* UINT message : メッセージ番号 +* WPARAM wParam : メッセージの WPARAM 引数 +* LPARAM lParam : メッセージの LPARAM 引数 * * Return Value * 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; @@ -2519,13 +2848,13 @@ static BOOL CALLBACK AboutDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPA } -/*----- ƒTƒEƒ“ƒh‚ð–‚炷 ------------------------------------------------------ +/*----- サウンドを鳴らす ------------------------------------------------------ * * Parameter -* Int num : ƒTƒEƒ“ƒh‚ÌŽí—Þ (SND_xxx) +* Int num : サウンドの種類 (SND_xxx) * * Return Value -* ‚È‚µ +* なし *----------------------------------------------------------------------------*/ void SoundPlay(int Num) @@ -2537,13 +2866,13 @@ void SoundPlay(int Num) } -/*----- ƒwƒ‹ƒvƒtƒ@ƒCƒ‹‚̃pƒX–¼‚ð•Ô‚· ------------------------------------------ +/*----- ヘルプファイルのパス名を返す ------------------------------------------ * * Parameter -* ‚È‚µ +* なし * * Return Value -* char *ƒpƒX–¼ +* char *パス名 *----------------------------------------------------------------------------*/ char *AskHelpFilePath(void) @@ -2552,13 +2881,13 @@ char *AskHelpFilePath(void) } -/*----- ƒeƒ“ƒ|ƒ‰ƒŠƒtƒ@ƒCƒ‹‚̃pƒX–¼‚ð•Ô‚· -------------------------------------- +/*----- テンポラリファイルのパス名を返す -------------------------------------- * * Parameter -* ‚È‚µ +* なし * * Return Value -* char *ƒpƒX–¼ +* char *パス名 *----------------------------------------------------------------------------*/ char *AskTmpFilePath(void) @@ -2567,13 +2896,13 @@ char *AskTmpFilePath(void) } -/*----- INIƒtƒ@ƒCƒ‹‚̃pƒX–¼‚ð•Ô‚· --------------------------------------------- +/*----- INIファイルのパス名を返す --------------------------------------------- * * Parameter -* ‚È‚µ +* なし * * Return Value -* char *ƒpƒX–¼ +* char *パス名 *----------------------------------------------------------------------------*/ char *AskIniFilePath(void) @@ -2581,13 +2910,13 @@ char *AskIniFilePath(void) return(IniPath); } -/*----- INIƒtƒ@ƒCƒ‹‚Ì‚Ý‚ðŽg‚¤‚©‚Ç‚¤‚©‚ð•Ô‚· ----------------------------------- +/*----- INIファイルのみを使うかどうかを返す ----------------------------------- * * Parameter -* ‚È‚µ +* なし * * Return Value -* int ƒXƒe[ƒ^ƒX : YES/NO +* int ステータス : YES/NO *----------------------------------------------------------------------------*/ int AskForceIni(void) @@ -2598,13 +2927,13 @@ int AskForceIni(void) -/*----- ƒƒbƒZ[ƒWˆ— -------------------------------------------------------- +/*----- メッセージ処理 -------------------------------------------------------- * * Parameter -* ‚È‚µ +* なし * * Return Value -* int I—¹ƒtƒ‰ƒO (YES=WM_CLOSE‚ª—ˆ‚½/NO) +* int 終了フラグ (YES=WM_CLOSEが来た/NO) *----------------------------------------------------------------------------*/ int BackgrndMessageProc(void) @@ -2613,13 +2942,16 @@ int BackgrndMessageProc(void) int Ret; Ret = NO; - SendMessage(GetMainHwnd(), WM_NULL, 0, 0); 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)) { - /* ƒfƒBƒŒƒNƒgƒŠ–¼‚Ì•\Ž¦ƒRƒ“ƒ{ƒ{ƒbƒNƒX‚ÅBS‚âRET‚ªŒø‚­‚悤‚É */ - /* ƒRƒ“ƒ{ƒ{ƒbƒNƒX“à‚ł̓AƒNƒZƒ‰ƒŒ[ƒ^‚𖳌ø‚É‚·‚é */ + /* ディレクトリ名の表示コンボボックスでBSやRETが効くように */ + /* コンボボックス内ではアクセラレータを無効にする */ if((Msg.hwnd == GetLocalHistEditHwnd()) || (Msg.hwnd == GetRemoteHistEditHwnd()) || ((hHelpWin != NULL) && (Msg.hwnd == hHelpWin)) || @@ -2641,13 +2973,13 @@ int BackgrndMessageProc(void) } -/*----- Ž©“®I—¹ƒtƒ‰ƒO‚ðƒNƒŠƒA‚·‚é -------------------------------------------- +/*----- 自動終了フラグをクリアする -------------------------------------------- * * Parameter -* ‚È‚µ +* なし * * Return Value -* ‚È‚µ +* なし *----------------------------------------------------------------------------*/ void ResetAutoExitFlg(void) @@ -2657,13 +2989,13 @@ void ResetAutoExitFlg(void) } -/*----- Ž©“®I—¹ƒtƒ‰ƒO‚ð•Ô‚· -------------------------------------------------- +/*----- 自動終了フラグを返す -------------------------------------------------- * * Parameter -* ‚È‚µ +* なし * * Return Value -* int ƒtƒ‰ƒO (YES/NO) +* int フラグ (YES/NO) *----------------------------------------------------------------------------*/ int AskAutoExit(void) @@ -2671,26 +3003,43 @@ int AskAutoExit(void) return(AutoExit); } -/*----- ƒ†[ƒU‚ɃpƒXƒ[ƒh‚ð“ü—Í‚³‚¹C‚»‚ê‚ðÝ’è‚·‚é ----------------------- +/*----- ユーザにパスワードを入力させ,それを設定する ----------------------- * * Parameter -* ‚È‚µ +* なし * * Return Value -* int : 0/ƒ†[ƒUƒLƒƒƒ“ƒZƒ‹, 1/Ý’肵‚½, 2/ƒfƒtƒHƒ‹ƒgÝ’è +* int : 0/ユーザキャンセル, 1/設定した, 2/デフォルト設定 *----------------------------------------------------------------------------*/ 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); - /* æ“ª‚Ì‹ó”’‚ðíœ */ + /* 先頭の空白を削除 */ for( p = buf; *p == ' '; p++ ) ; @@ -2699,7 +3048,7 @@ int EnterMasterPasswordAndSet( int Res, HWND hWnd ) return 1; } else { - /* ‹ó‚̏ꍇ‚̓fƒtƒHƒ‹ƒg’l‚ðÝ’è */ + /* 空の場合はデフォルト値を設定 */ SetMasterPassword( NULL ); return 2; } @@ -2707,18 +3056,123 @@ int EnterMasterPasswordAndSet( int Res, HWND hWnd ) return 0; } -// ˆÃ†‰»’ʐM‘Ήž -BOOL __stdcall SSLTimeoutCallback() +// 暗号化通信対応 +BOOL __stdcall SSLTimeoutCallback(BOOL* pbAborted) { Sleep(1); if(BackgrndMessageProc() == YES) return TRUE; - // ”O‚Ì‚½‚߃c[ƒ‹ƒo[‚ÌMENU_ABORT‚àŠm”F -// 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, "\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); + if(SetSSLRootCertificate(pBuffer, Size)) + bResult = TRUE; + } + } + free(pBuffer); + } + CloseHandle(hFile); + } + return bResult; +} + +// マルチコアCPUの特定環境下でファイル通信中にクラッシュするバグ対策 +BOOL IsMainThread() +{ + if(GetCurrentThreadId() != MainThreadId) + return FALSE; + return TRUE; +} + +// ファイルアイコン表示対応 +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); +} +