1 /*=============================================================================
\r
5 ===============================================================================
\r
6 / Copyright (C) 1997-2007 Sota. All rights reserved.
\r
8 / Redistribution and use in source and binary forms, with or without
\r
9 / modification, are permitted provided that the following conditions
\r
12 / 1. Redistributions of source code must retain the above copyright
\r
13 / notice, this list of conditions and the following disclaimer.
\r
14 / 2. Redistributions in binary form must reproduce the above copyright
\r
15 / notice, this list of conditions and the following disclaimer in the
\r
16 / documentation and/or other materials provided with the distribution.
\r
18 / THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
\r
19 / IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
\r
20 / OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
\r
21 / IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
\r
22 / INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
\r
23 / BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
\r
24 / USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
\r
25 / ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
\r
26 / (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
\r
27 / THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
\r
28 /============================================================================*/
\r
32 #include <winsock2.h>
\r
33 #include <windows.h>
\r
37 #include <mbstring.h>
\r
41 #include <windowsx.h>
\r
42 #include <commctrl.h>
\r
45 //#include <winsock.h>
\r
47 #include <shobjidl.h>
\r
50 #include "resource.h"
\r
55 #include <htmlhelp.h>
\r
59 #include "updater.h"
\r
62 #undef __MBSWRAPPER_H__
\r
63 #include "mbswrapper.h"
\r
66 #include "filehash.h"
\r
69 #define RESIZE_OFF 0 /* ウインドウの区切り位置変更していない */
\r
70 #define RESIZE_ON 1 /* ウインドウの区切り位置変更中 */
\r
71 #define RESIZE_PREPARE 2 /* ウインドウの区切り位置変更の準備 */
\r
73 #define RESIZE_HPOS 0 /* ローカル-ホスト間の区切り位置変更 */
\r
74 #define RESIZE_VPOS 1 /* リスト-タスク間の区切り位置の変更 */
\r
77 /*===== プロトタイプ =====*/
\r
79 static int InitApp(LPSTR lpszCmdLine, int cmdShow);
\r
80 static int MakeAllWindows(int cmdShow);
\r
81 static void DeleteAllObject(void);
\r
82 static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
\r
83 static void StartupProc(char *Cmd);
\r
84 static int AnalyzeComLine(char *Str, int *AutoConnect, int *CmdOption, char *unc, int Max);
\r
85 static int CheckIniFileName(char *Str, char *Ini);
\r
86 static int CheckMasterPassword(char *Str, char *Ini);
\r
87 static int GetTokenAfterOption(char *Str, char *Result, const char* Opt1, const char* Opt2 );
\r
88 static char *GetToken(char *Str, char *Buf);
\r
89 static void ExitProc(HWND hWnd);
\r
90 static void ChangeDir(int Win, char *Path);
\r
91 static void ResizeWindowProc(void);
\r
92 static void CalcWinSize(void);
\r
93 // static void AskWindowPos(HWND hWnd);
\r
94 static void CheckResizeFrame(WPARAM Keys, int x, int y);
\r
95 static void DispDirInfo(void);
\r
96 static void DeleteAlltempFile(void);
\r
98 //static BOOL CALLBACK AboutDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
\r
99 static INT_PTR CALLBACK AboutDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
\r
100 static int EnterMasterPasswordAndSet( int Res, HWND hWnd );
\r
102 /*===== ローカルなワーク =====*/
\r
104 static const char FtpClassStr[] = "FFFTPWin";
\r
106 static HINSTANCE hInstFtp;
\r
107 static HWND hWndFtp = NULL;
\r
108 static HWND hWndCurFocus = NULL;
\r
110 static HACCEL Accel;
\r
111 static HBRUSH RootColorBrush = NULL;
\r
113 static int Resizing = RESIZE_OFF;
\r
114 static int ResizePos;
\r
115 static HCURSOR hCursor;
\r
118 static int ClientHeight;
\r
123 static TEMPFILELIST *TempFiles = NULL;
\r
125 static int SaveExit = YES;
\r
126 static int AutoExit = NO;
\r
128 static char HelpPath[FMAX_PATH+1];
\r
129 static char IniPath[FMAX_PATH+1];
\r
130 static int ForceIni = NO;
\r
132 TRANSPACKET MainTransPkt; /* ファイル転送用パケット */
\r
133 /* これを使って転送を行うと、ツールバーの転送 */
\r
136 char TitleHostName[HOST_ADRS_LEN+1];
\r
137 char FilterStr[FILTER_EXT_LEN+1] = { "*" };
\r
138 // タイトルバーにユーザー名表示対応
\r
139 char TitleUserName[USER_NAME_LEN+1];
\r
143 // 外部アプリケーションへドロップ後にローカル側のファイル一覧に作業フォルダが表示されるバグ対策
\r
144 //static int SuppressRefresh = 0;
\r
145 int SuppressRefresh = 0;
\r
147 static DWORD dwCookie;
\r
150 static char SSLRootCAFilePath[FMAX_PATH+1];
\r
151 // マルチコアCPUの特定環境下でファイル通信中にクラッシュするバグ対策
\r
152 static DWORD MainThreadId;
\r
154 static char PortableFilePath[FMAX_PATH+1];
\r
155 static int PortableVersion;
\r
157 HANDLE ChangeNotification = INVALID_HANDLE_VALUE;
\r
159 static ITaskbarList3* pTaskbarList3;
\r
161 static int ToolWinHeight;
\r
163 static int ApplyUpdatesOnExit = NO;
\r
166 /*===== グローバルなワーク =====*/
\r
168 HWND hHelpWin = NULL;
\r
171 int WinPosX = CW_USEDEFAULT;
\r
174 // VGAサイズに収まるようになっていたのをSVGAサイズに引き上げ
\r
175 //int WinWidth = 630;
\r
176 //int WinHeight = 393;
\r
177 //int LocalWidth = 309;
\r
178 //int TaskHeight = 50;
\r
179 //int LocalTabWidth[4] = { 120, 90, 60, 37 };
\r
180 //int RemoteTabWidth[6] = { 120, 90, 60, 37, 60, 60 };
\r
181 int WinWidth = 790;
\r
182 int WinHeight = 513;
\r
183 int LocalWidth = 389;
\r
184 int TaskHeight = 100;
\r
185 int LocalTabWidth[4] = { 150, 120, 60, 37 };
\r
186 int RemoteTabWidth[6] = { 150, 120, 60, 37, 60, 60 };
\r
187 char UserMailAdrs[USER_MAIL_LEN+1] = { "who@example.com" };
\r
188 char ViewerName[VIEWERS][FMAX_PATH+1] = { { "notepad" }, { "" }, { "" } };
\r
189 HFONT ListFont = NULL;
\r
190 LOGFONT ListLogFont;
\r
191 int LocalFileSort = SORT_NAME;
\r
192 int LocalDirSort = SORT_NAME;
\r
193 int RemoteFileSort = SORT_NAME;
\r
194 int RemoteDirSort = SORT_NAME;
\r
195 int TransMode = TYPE_X;
\r
196 int ConnectOnStart = YES;
\r
197 int DebugConsole = NO;
\r
198 int SaveWinPos = NO;
\r
200 //char AsciiExt[ASCII_EXT_LEN+1] = { "*.txt\0*.html\0*.htm\0*.cgi\0*.pl\0" };
\r
201 char AsciiExt[ASCII_EXT_LEN+1] = { "*.txt\0*.html\0*.htm\0*.cgi\0*.pl\0*.js\0*.vbs\0*.css\0*.rss\0*.rdf\0*.xml\0*.xhtml\0*.xht\0*.shtml\0*.shtm\0*.sh\0*.py\0*.rb\0*.properties\0*.sql\0*.asp\0*.aspx\0*.php\0*.htaccess\0" };
\r
202 int RecvMode = TRANS_DLG;
\r
203 int SendMode = TRANS_DLG;
\r
204 int MoveMode = MOVE_DLG;
\r
205 int ListType = LVS_REPORT;
\r
206 // LISTのキャッシュを無効にする(リモートのディレクトリの表示が更新されないバグ対策)
\r
207 //int CacheEntry = 10;
\r
208 int CacheEntry = -10;
\r
209 int CacheSave = NO;
\r
210 char DefaultLocalPath[FMAX_PATH+1] = { "" };
\r
211 int SaveTimeStamp = YES;
\r
214 int DclickOpen = YES;
\r
215 int ConnectAndSet = YES;
\r
216 SOUNDFILE Sound[SOUND_TYPES] = { { NO, "" }, { NO, "" }, { NO, "" } };
\r
217 int FnameCnv = FNAME_NOCNV;
\r
220 int RegType = REGTYPE_REG;
\r
221 char FwallHost[HOST_ADRS_LEN+1] = { "" };
\r
222 char FwallUser[USER_NAME_LEN+1] = { "" };
\r
223 char FwallPass[PASSWORD_LEN+1] = { "" };
\r
224 int FwallPort = PORT_NOR;
\r
226 int FwallDefault = NO;
\r
227 int FwallSecurity = SECURITY_AUTO;
\r
228 int FwallResolve = NO;
\r
229 int FwallLower = NO;
\r
230 int FwallDelimiter = '@';
\r
232 //int PasvDefault = NO;
\r
233 int PasvDefault = YES;
\r
234 char MirrorNoTrn[MIRROR_LEN+1] = { "*.bak\0" };
\r
235 char MirrorNoDel[MIRROR_LEN+1] = { "" };
\r
236 int MirrorFnameCnv = NO;
\r
237 int SplitVertical = YES;
\r
239 int RasCloseNotify = YES;
\r
241 char DefAttrList[DEFATTRLIST_LEN+1] = { "" };
\r
242 SIZE HostDlgSize = { -1, -1 };
\r
243 SIZE BmarkDlgSize = { -1, -1 };
\r
244 SIZE MirrorDlgSize = { -1, -1 };
\r
245 int Sizing = SW_RESTORE;
\r
247 char TmpPath[FMAX_PATH+1];
\r
248 int QuickAnonymous = YES;
\r
249 int PassToHist = YES;
\r
250 int VaxSemicolon = NO;
\r
252 int NoRasControl = NO;
\r
253 int SuppressSave = NO;
\r
254 int DispIgnoreHide = NO;
\r
255 int DispDrives = NO;
\r
256 int MirUpDelNotify = YES;
\r
257 int MirDownDelNotify = YES;
\r
258 int FolderAttr = NO;
\r
259 int FolderAttrNum = 777;
\r
261 BYTE CertificateCacheHash[MAX_CERT_CACHE_HASH][20];
\r
262 BYTE SSLRootCAFileHash[20];
\r
264 int DispFileIcon = NO;
\r
266 int DispTimeSeconds = NO;
\r
268 int DispPermissionsNumber = NO;
\r
270 int MakeAllDir = YES;
\r
272 int LocalKanjiCode = KANJI_SJIS;
\r
274 int NoopEnable = NO;
\r
276 int UPnPEnabled = YES;
\r
277 time_t LastDataConnectionTime = 0;
\r
279 int EncryptAllSettings = NO;
\r
281 int AutoRefreshFileList = YES;
\r
283 int RemoveOldLog = NO;
\r
285 int ReadOnlySettings = NO;
\r
287 int AutoCheckForUpdates = YES;
\r
288 int AutoApplyUpdates = NO;
\r
289 int AutoCheckForUptatesInterval = 7;
\r
290 time_t LastAutoCheckForUpdates = 0;
\r
292 int AbortOnListError = YES;
\r
294 int MirrorNoTransferContents = NO;
\r
296 int FwallNoSaveUser = NO;
\r
302 /*----- メインルーチン --------------------------------------------------------
\r
305 * HINSTANCE hInstance : このアプリケーションのこのインスタンスのハンドル
\r
306 * HINSTANCE hPrevInstance : このアプリケーションの直前のインスタンスのハンドル
\r
307 * LPSTR lpszCmdLine : アプリケーションが起動したときのコマンドラインをさすロングポインタ
\r
308 * int cmdShow : 最初に表示するウインドウの形式。
\r
311 * int 最後のメッセージのwParam
\r
312 *----------------------------------------------------------------------------*/
\r
314 int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int cmdShow)
\r
321 DWORD ProtectLevel;
\r
322 char Option[FMAX_PATH+1];
\r
325 char PrivateKeyFile[FMAX_PATH+1];
\r
326 char Password[FMAX_PATH+1];
\r
327 char ServerPath[FMAX_PATH+1];
\r
328 char HashFile[FMAX_PATH+1];
\r
329 char ListFile[FMAX_PATH+1];
\r
330 char Description[FMAX_PATH+1];
\r
331 char UpdateDir[FMAX_PATH+1];
\r
332 char Buf[FMAX_PATH+1];
\r
333 char Path[FMAX_PATH+1];
\r
334 char Command[FMAX_PATH+1];
\r
337 #ifdef ENABLE_PROCESS_PROTECTION
\r
338 ProtectLevel = PROCESS_PROTECTION_NONE;
\r
339 pCommand = lpszCmdLine;
\r
340 while(pCommand = GetToken(pCommand, Option))
\r
342 if(Option[0] == '-')
\r
344 if(strcmp(&Option[1], "-protect") == 0)
\r
346 ProtectLevel = PROCESS_PROTECTION_DEFAULT;
\r
349 else if(strcmp(&Option[1], "-protect-high") == 0)
\r
351 ProtectLevel = PROCESS_PROTECTION_HIGH;
\r
354 else if(strcmp(&Option[1], "-protect-medium") == 0)
\r
356 ProtectLevel = PROCESS_PROTECTION_MEDIUM;
\r
359 else if(strcmp(&Option[1], "-protect-low") == 0)
\r
361 ProtectLevel = PROCESS_PROTECTION_LOW;
\r
366 if(ProtectLevel != PROCESS_PROTECTION_NONE)
\r
368 SetProcessProtectionLevel(ProtectLevel);
\r
369 if(!InitializeLoadLibraryHook())
\r
371 MessageBox(NULL, MSGJPN321, "FFFTP", MB_OK | MB_ICONERROR);
\r
375 if(IsDebuggerPresent())
\r
377 MessageBox(NULL, MSGJPN322, "FFFTP", MB_OK | MB_ICONERROR);
\r
381 if(!UnloadUntrustedModule())
\r
383 MessageBox(NULL, MSGJPN323, "FFFTP", MB_OK | MB_ICONERROR);
\r
387 if(RestartProtectedProcess(" --restart"))
\r
390 if(!EnableLoadLibraryHook(TRUE))
\r
392 MessageBox(NULL, MSGJPN324, "FFFTP", MB_OK | MB_ICONERROR);
\r
397 InitializeLoadLibraryHook();
\r
400 // マルチコアCPUの特定環境下でファイル通信中にクラッシュするバグ対策
\r
401 #ifdef DISABLE_MULTI_CPUS
\r
402 SetProcessAffinityMask(GetCurrentProcess(), 1);
\r
404 MainThreadId = GetCurrentThreadId();
\r
407 if(OleInitialize(NULL) != S_OK){
\r
408 MessageBox(NULL, MSGJPN298, "FFFTP", MB_OK | MB_ICONERROR);
\r
412 InitCommonControls();
\r
415 CoInitialize(NULL);
\r
418 LoadTaskbarList3();
\r
421 LoadUnicodeNormalizationDll();
\r
429 ImmediateExit = NO;
\r
430 pCommand = lpszCmdLine;
\r
431 while(pCommand = GetToken(pCommand, Option))
\r
433 if(Option[0] == '-')
\r
435 if(strcmp(&Option[1], "-build-software-update") == 0)
\r
437 if(pCommand = GetToken(pCommand, PrivateKeyFile))
\r
439 if(pCommand = GetToken(pCommand, Password))
\r
441 if(pCommand = GetToken(pCommand, ServerPath))
\r
443 if(pCommand = GetToken(pCommand, HashFile))
\r
445 if(pCommand = GetToken(pCommand, ListFile))
\r
447 if(pCommand = GetToken(pCommand, Description))
\r
449 DecodeLineFeed(Description);
\r
450 BuildUpdates(PrivateKeyFile, Password, ServerPath, HashFile, ListFile, RELEASE_VERSION_NUM, VER_STR, Description);
\r
457 ImmediateExit = YES;
\r
460 else if(strcmp(&Option[1], "-software-update") == 0)
\r
462 if(pCommand = GetToken(pCommand, UpdateDir))
\r
464 if(!RestartUpdateProcessAsAdministrator(lpszCmdLine, " --restart"))
\r
467 if(ApplyUpdates(UpdateDir, "updatebackup"))
\r
469 GetModuleFileName(NULL, Path, MAX_PATH);
\r
470 strcpy(GetFileName(Path), "updatebackup");
\r
471 sprintf(Buf, MSGJPN358, Path);
\r
472 MessageBox(NULL, Buf, "FFFTP", MB_OK);
\r
475 MessageBox(NULL, MSGJPN359, "FFFTP", MB_OK | MB_ICONERROR);
\r
478 ImmediateExit = YES;
\r
481 else if(strcmp(&Option[1], "-software-cleanup") == 0)
\r
483 if(pCommand = GetToken(pCommand, UpdateDir))
\r
484 CleanupUpdates(UpdateDir);
\r
492 hInstFtp = hInstance;
\r
494 // if(InitApp(lpszCmdLine, cmdShow) == FFFTP_SUCCESS)
\r
495 if(ImmediateExit == NO && InitApp(lpszCmdLine, cmdShow) == FFFTP_SUCCESS)
\r
499 Sts = GetMessage(&Msg, NULL, 0, 0);
\r
500 if((Sts == 0) || (Sts == -1))
\r
504 // if(!HtmlHelp(NULL, NULL, HH_PRETRANSLATEMESSAGE, (DWORD)&Msg))
\r
505 if(!HtmlHelp(NULL, NULL, HH_PRETRANSLATEMESSAGE, (DWORD_PTR)&Msg))
\r
507 /* ディレクトリ名の表示コンボボックスでBSやRETが効くように */
\r
508 /* コンボボックス内ではアクセラレータを無効にする */
\r
509 if((Msg.hwnd == GetLocalHistEditHwnd()) ||
\r
510 (Msg.hwnd == GetRemoteHistEditHwnd()) ||
\r
511 ((hHelpWin != NULL) && (GetAncestor(Msg.hwnd, GA_ROOT) == hHelpWin)) ||
\r
512 GetHideUI() == YES ||
\r
513 (TranslateAccelerator(hWndFtp, Accel, &Msg) == 0))
\r
515 TranslateMessage(&Msg);
\r
516 DispatchMessage(&Msg);
\r
522 UnregisterClass(FtpClassStr, hInstFtp);
\r
528 FreeTaskbarList3();
\r
534 if(ApplyUpdatesOnExit == YES)
\r
537 if(GetModuleFileName(NULL, UpdateDir, FMAX_PATH) > 0)
\r
539 if(p = strrchr(UpdateDir, '\\'))
\r
542 strcpy(Path, TmpPath);
\r
544 strcat(Path, "update");
\r
545 sprintf(Command, "-%s \"%s\"", "-software-update", UpdateDir);
\r
546 if(StartUpdateProcess(Path, Command))
\r
551 MessageBox(NULL, MSGJPN359, "FFFTP", MB_OK | MB_ICONERROR);
\r
557 /*----- アプリケーションの初期設定 --------------------------------------------
\r
560 * HINSTANCE hInstance : このアプリケーションのこのインスタンスのハンドル
\r
561 * HINSTANCE hPrevInstance : このアプリケーションの直前のインスタンスのハンドル
\r
562 * LPSTR lpszCmdLine : アプリケーションが起動したときのコマンドラインをさすロングポインタ
\r
563 * int cmdShow : 最初に表示するウインドウの形式。
\r
567 * FFFTP_SUCCESS/FFFTP_FAIL
\r
568 *----------------------------------------------------------------------------*/
\r
570 static int InitApp(LPSTR lpszCmdLine, int cmdShow)
\r
575 char PwdBuf[FMAX_PATH+1];
\r
576 int useDefautPassword = 0; /* 警告文表示用 */
\r
579 int ImportPortable;
\r
586 srand(GetTickCount());
\r
589 // HtmlHelp(NULL, NULL, HH_INITIALIZE, (DWORD)&dwCookie);
\r
590 HtmlHelp(NULL, NULL, HH_INITIALIZE, (DWORD_PTR)&dwCookie);
\r
592 SaveUpdateBellInfo();
\r
594 if((Err = WSAStartup((WORD)0x0202, &WSAData)) != 0)
\r
595 MessageBox(NULL, ReturnWSError(Err), "FFFTP - Startup", MB_OK);
\r
598 Accel = LoadAccelerators(hInstFtp, MAKEINTRESOURCE(ffftp_accel));
\r
601 // GetTempPath(FMAX_PATH, TmpPath);
\r
602 GetAppTempPath(TmpPath);
\r
604 SetYenTail(TmpPath);
\r
607 WinWidth = CalcPixelX(WinWidth);
\r
608 WinHeight = CalcPixelY(WinHeight);
\r
609 LocalWidth = CalcPixelX(LocalWidth);
\r
610 TaskHeight = CalcPixelY(TaskHeight);
\r
611 for(i = 0; i < sizeof(LocalTabWidth) / sizeof(int); i++)
\r
612 LocalTabWidth[i] = CalcPixelX(LocalTabWidth[i]);
\r
613 for(i = 0; i < sizeof(RemoteTabWidth) / sizeof(int); i++)
\r
614 RemoteTabWidth[i] = CalcPixelX(RemoteTabWidth[i]);
\r
616 GetModuleFileName(NULL, HelpPath, FMAX_PATH);
\r
617 strcpy(GetFileName(HelpPath), "ffftp.chm");
\r
619 if(CheckIniFileName(lpszCmdLine, IniPath) == 0)
\r
621 GetModuleFileName(NULL, IniPath, FMAX_PATH);
\r
622 strcpy(GetFileName(IniPath), "ffftp.ini");
\r
627 RegType = REGTYPE_INI;
\r
630 GetModuleFileName(NULL, PortableFilePath, FMAX_PATH);
\r
631 strcpy(GetFileName(PortableFilePath), "portable");
\r
632 CheckPortableVersion();
\r
633 ImportPortable = NO;
\r
634 if(PortableVersion == YES)
\r
637 RegType = REGTYPE_INI;
\r
638 if(IsRegAvailable() == YES && IsIniAvailable() == NO)
\r
640 if(DialogBox(GetFtpInst(), MAKEINTRESOURCE(ini_from_reg_dlg), GetMainHwnd(), ExeEscDialogProc) == YES)
\r
641 ImportPortable = YES;
\r
645 if(PortableVersion == NO)
\r
647 if(ReadSettingsVersion() > VER_NUM)
\r
649 if(IsRegAvailable() == YES && IsIniAvailable() == NO)
\r
651 switch(MessageBox(GetMainHwnd(), MSGJPN350, "FFFTP", MB_YESNOCANCEL | MB_DEFBUTTON2))
\r
654 ReadOnlySettings = YES;
\r
659 ImportPortable = YES;
\r
666 if(ImportPortable == YES)
\r
669 RegType = REGTYPE_REG;
\r
674 /* 2010.02.01 genta マスターパスワードを入力させる
\r
675 -z オプションがあるときは最初だけスキップ
\r
676 -z オプションがないときは,デフォルトパスワードをまず試す
\r
678 パスワードが不一致なら再入力するか尋ねる.
\r
681 if( CheckMasterPassword(lpszCmdLine, PwdBuf))
\r
683 SetMasterPassword( PwdBuf );
\r
684 useDefautPassword = 0;
\r
688 SetMasterPassword( NULL );
\r
689 /* この場では表示できないのでフラグだけ立てておく*/
\r
690 useDefautPassword = 2;
\r
693 /* パスワードチェックのみ実施 */
\r
695 while( ValidateMasterPassword() == YES &&
\r
696 GetMasterPasswordStatus() == PASSWORD_UNMATCH ){
\r
698 if( useDefautPassword != 2 ){
\r
700 if( MessageBox(NULL, MSGJPN304, "FFFTP", MB_YESNO | MB_ICONEXCLAMATION) == IDNO ){
\r
701 useDefautPassword = 0; /* 不一致なので,もはやデフォルトかどうかは分からない */
\r
707 masterpass = EnterMasterPasswordAndSet(masterpasswd_dlg, NULL);
\r
708 if( masterpass == 2 ){
\r
709 useDefautPassword = 1;
\r
711 else if( masterpass == 0 ){
\r
716 useDefautPassword = 0;
\r
720 if(masterpass != 0)
\r
723 ResetDefaultHost();
\r
728 if(ImportPortable == YES)
\r
731 RegType = REGTYPE_INI;
\r
735 SetSSLTimeoutCallback(TimeOut * 1000, SSLTimeoutCallback);
\r
736 SetSSLConfirmCallback(SSLConfirmCallback);
\r
737 GetModuleFileName(NULL, SSLRootCAFilePath, FMAX_PATH);
\r
738 strcpy(GetFileName(SSLRootCAFilePath), "ssl.pem");
\r
739 LoadSSLRootCAFile();
\r
742 if(NoRasControl == NO)
\r
747 timeBeginPeriod(1);
\r
749 CountPrevFfftpWindows();
\r
751 if(MakeAllWindows(cmdShow) == FFFTP_SUCCESS)
\r
753 hWndCurFocus = GetLocalHwnd();
\r
755 if(strlen(DefaultLocalPath) > 0)
\r
756 SetCurrentDirectory(DefaultLocalPath);
\r
758 SetSortTypeImm(LocalFileSort, LocalDirSort, RemoteFileSort, RemoteDirSort);
\r
759 SetTransferTypeImm(TransMode);
\r
760 DispTransferType();
\r
761 SetHostKanaCnvImm(YES);
\r
762 SetHostKanjiCodeImm(KANJI_NOCNV);
\r
764 SetLocalKanjiCodeImm(LocalKanjiCode);
\r
767 DispSyncMoveMode();
\r
769 MakeCacheBuf(CacheEntry);
\r
770 if(CacheSave == YES)
\r
773 if(MakeTransferThread() == FFFTP_SUCCESS)
\r
775 DoPrintf("DEBUG MESSAGE ON ! ##");
\r
778 // SourceForge.JPによるフォーク
\r
779 // SetTaskMsg("FFFTP Ver." VER_STR " Copyright(C) 1997-2010 Sota & cooperators.");
\r
780 SetTaskMsg("FFFTP Ver." VER_STR " Copyright(C) 1997-2010 Sota & cooperators.\r\nCopyright (C) 2011-2018 FFFTP Project (Hiromichi Matsushima, Suguru Kawamoto, IWAMOTO Kouichi, vitamin0x, unarist, Asami, fortran90, tomo1192, Yuji Tanaka, Moriguchi Hirokazu, Fu-sen, potato).");
\r
783 SetTaskMsg("%s%s", MSGJPN283, IniPath);
\r
785 if(IsFolderExist(TmpPath) == NO)
\r
787 SetTaskMsg(MSGJPN152, TmpPath);
\r
788 GetTempPath(FMAX_PATH, TmpPath);
\r
789 SetTaskMsg(MSGJPN153, TmpPath);
\r
792 DoPrintf("Tmp =%s", TmpPath);
\r
793 DoPrintf("Help=%s", HelpPath);
\r
795 DragAcceptFiles(GetRemoteHwnd(), TRUE);
\r
796 DragAcceptFiles(GetLocalHwnd(), TRUE);
\r
798 SetAllHistoryToMenu();
\r
799 GetLocalDirForWnd();
\r
800 MakeButtonsFocus();
\r
801 DispTransferFiles();
\r
804 if(AutoCheckForUpdates == YES && AutoCheckForUptatesInterval == 0)
\r
805 UpdateSoftware(YES, YES, AutoApplyUpdates);
\r
807 StartupProc(lpszCmdLine);
\r
808 sts = FFFTP_SUCCESS;
\r
811 if( useDefautPassword ){
\r
812 SetTaskMsg(MSGJPN300);
\r
815 /* パスワード不一致警告文の表示 */
\r
816 switch( GetMasterPasswordStatus() ){
\r
817 case PASSWORD_UNMATCH:
\r
818 SetTaskMsg(MSGJPN301);
\r
820 case BAD_PASSWORD_HASH:
\r
821 SetTaskMsg(MSGJPN302);
\r
833 if(IsOpenSSLLoaded())
\r
834 SetTaskMsg(MSGJPN318);
\r
836 SetTaskMsg(MSGJPN319);
\r
839 if(sts == FFFTP_FAIL)
\r
846 /*----- ウインドウを作成する --------------------------------------------------
\r
849 * int cmdShow : 最初に表示するウインドウの形式。
\r
853 * FFFTP_SUCCESS/FFFTP_FAIL
\r
854 *----------------------------------------------------------------------------*/
\r
856 static int MakeAllWindows(int cmdShow)
\r
869 /*===== メインウインドウ =====*/
\r
871 RootColorBrush = CreateSolidBrush(GetSysColor(COLOR_3DFACE));
\r
873 wClass.cbSize = sizeof(WNDCLASSEX);
\r
875 wClass.lpfnWndProc = FtpWndProc;
\r
876 wClass.cbClsExtra = 0;
\r
877 wClass.cbWndExtra = 0;
\r
878 wClass.hInstance = hInstFtp;
\r
879 wClass.hIcon = LoadIcon(hInstFtp, MAKEINTRESOURCE(ffftp));
\r
880 wClass.hCursor = NULL;
\r
881 wClass.hbrBackground = RootColorBrush;
\r
882 wClass.lpszMenuName = (LPSTR)MAKEINTRESOURCE(main_menu);
\r
883 wClass.lpszClassName = FtpClassStr;
\r
884 wClass.hIconSm = NULL;
\r
885 RegisterClassEx(&wClass);
\r
888 // ToolWinHeight = TOOLWIN_HEIGHT;
\r
889 ToolWinHeight = CalcPixelY(16) + 12;
\r
891 if(SaveWinPos == NO)
\r
893 WinPosX = CW_USEDEFAULT;
\r
896 hWndFtp = CreateWindow(FtpClassStr, "FFFTP",
\r
897 WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,
\r
898 WinPosX, WinPosY, WinWidth, WinHeight,
\r
899 HWND_DESKTOP, 0, hInstFtp, NULL);
\r
901 if(hWndFtp != NULL)
\r
903 SystemParametersInfo(SPI_GETWORKAREA, 0, &Rect1, 0);
\r
904 GetWindowRect(hWndFtp, &Rect2);
\r
905 if(Rect2.bottom > Rect1.bottom)
\r
907 Rect2.top = max1(0, Rect2.top - (Rect2.bottom - Rect1.bottom));
\r
908 MoveWindow(hWndFtp, Rect2.left, Rect2.top, WinWidth, WinHeight, FALSE);
\r
911 /*===== ステイタスバー =====*/
\r
913 StsSbar = MakeStatusBarWindow(hWndFtp, hInstFtp);
\r
917 /*===== ツールバー =====*/
\r
919 StsTbar = MakeToolBarWindow(hWndFtp, hInstFtp);
\r
921 /*===== ファイルリストウインドウ =====*/
\r
923 StsList = MakeListWin(hWndFtp, hInstFtp);
\r
925 /*==== タスクウインドウ ====*/
\r
927 StsTask = MakeTaskWindow(hWndFtp, hInstFtp);
\r
929 if((cmdShow != SW_MINIMIZE) && (cmdShow != SW_SHOWMINIMIZED) && (cmdShow != SW_SHOWMINNOACTIVE) &&
\r
930 (Sizing == SW_MAXIMIZE))
\r
931 cmdShow = SW_MAXIMIZE;
\r
933 ShowWindow(hWndFtp, cmdShow);
\r
935 /*==== ソケットウインドウ ====*/
\r
937 StsSocket = MakeSocketWin(hWndFtp, hInstFtp);
\r
939 StsLvtips = InitListViewTips(hWndFtp, hInstFtp);
\r
942 Sts = FFFTP_SUCCESS;
\r
943 if((hWndFtp == NULL) ||
\r
944 (StsTbar == FFFTP_FAIL) ||
\r
945 (StsList == FFFTP_FAIL) ||
\r
946 (StsSbar == FFFTP_FAIL) ||
\r
947 (StsTask == FFFTP_FAIL) ||
\r
948 (StsLvtips == FFFTP_FAIL) ||
\r
949 (StsSocket == FFFTP_FAIL))
\r
954 if(Sts == FFFTP_SUCCESS)
\r
961 /*----- ウインドウのタイトルを表示する ----------------------------------------
\r
968 *----------------------------------------------------------------------------*/
\r
970 void DispWindowTitle(void)
\r
972 char Tmp[HOST_ADRS_LEN+FILTER_EXT_LEN+20];
\r
974 if(AskConnecting() == YES)
\r
976 // タイトルバーにユーザー名表示対応
\r
977 // sprintf(Tmp, "%s (%s) - FFFTP", TitleHostName, FilterStr);
\r
979 switch(AskCryptMode())
\r
982 sprintf(Tmp, "%s@%s (%s) %s - FFFTP", TitleUserName, TitleHostName, FilterStr, MSGJPN351);
\r
985 sprintf(Tmp, "%s@%s (%s) %s - FFFTP", TitleUserName, TitleHostName, FilterStr, MSGJPN352);
\r
988 sprintf(Tmp, "%s@%s (%s) %s - FFFTP", TitleUserName, TitleHostName, FilterStr, MSGJPN353);
\r
991 sprintf(Tmp, "%s@%s (%s) %s - FFFTP", TitleUserName, TitleHostName, FilterStr, MSGJPN354);
\r
996 sprintf(Tmp, "FFFTP (%s)", FilterStr);
\r
998 SetWindowText(GetMainHwnd(), Tmp);
\r
1003 /*----- 全てのオブジェクトを削除 ----------------------------------------------
\r
1010 *----------------------------------------------------------------------------*/
\r
1012 static void DeleteAllObject(void)
\r
1016 //move to WM_DESTROY
\r
1020 // if(ListFont != NULL)
\r
1021 // DeleteObject(ListFont);
\r
1022 // if(RootColorBrush != NULL)
\r
1023 // DeleteObject(RootColorBrush);
\r
1026 // DeleteListViewTips();
\r
1027 // DeleteListWin();
\r
1028 // DeleteStatusBarWindow();
\r
1029 // DeleteTaskWindow();
\r
1030 // DeleteToolBarWindow();
\r
1031 // DeleteSocketWin();
\r
1033 //move to WM_DESTROY
\r
1034 if(hWndFtp != NULL)
\r
1035 DestroyWindow(hWndFtp);
\r
1039 ReleaseKernelLib();
\r
1045 /*----- メインウインドウのウインドウハンドルを返す ----------------------------
\r
1052 *----------------------------------------------------------------------------*/
\r
1054 HWND GetMainHwnd(void)
\r
1060 /*----- 現在フォーカスがあるウインドウのウインドウハンドルを返す --------------
\r
1067 *----------------------------------------------------------------------------*/
\r
1069 HWND GetFocusHwnd(void)
\r
1071 return(hWndCurFocus);
\r
1075 /*----- 現在フォーカスがあるウインドウのをセットする --------------------------
\r
1078 * HWND hWnd : ウインドウハンドル
\r
1082 *----------------------------------------------------------------------------*/
\r
1084 void SetFocusHwnd(HWND hWnd)
\r
1086 hWndCurFocus = hWnd;
\r
1091 /*----- プログラムのインスタンスを返す ----------------------------------------
\r
1097 * HINSTANCE インスタンス
\r
1098 *----------------------------------------------------------------------------*/
\r
1100 HINSTANCE GetFtpInst(void)
\r
1106 /*----- メインウインドウのメッセージ処理 --------------------------------------
\r
1109 * HWND hWnd : ウインドウハンドル
\r
1110 * UINT message : メッセージ番号
\r
1111 * WPARAM wParam : メッセージの WPARAM 引数
\r
1112 * LPARAM lParam : メッセージの LPARAM 引数
\r
1116 *----------------------------------------------------------------------------*/
\r
1118 static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
\r
1121 LPTOOLTIPTEXT lpttt;
\r
1123 LPTOOLTIPTEXTW wlpttt;
\r
1134 SetTimer(hWnd, 1, 1000, NULL);
\r
1135 SetTimer(hWnd, 2, 100, NULL);
\r
1136 SetTimer(hWnd, 3, 60000, NULL);
\r
1147 if(WaitForSingleObject(ChangeNotification, 0) == WAIT_OBJECT_0)
\r
1149 if(AskUserOpeDisabled() == NO)
\r
1151 FindNextChangeNotification(ChangeNotification);
\r
1152 if(AutoRefreshFileList == YES)
\r
1155 char Name[FMAX_PATH+1];
\r
1158 MakeSelectedFileList(WIN_LOCAL, NO, NO, &Base, &CancelFlg);
\r
1159 GetHotSelected(WIN_LOCAL, Name);
\r
1160 Pos = SendMessage(GetLocalHwnd(), LVM_GETTOPINDEX, 0, 0);
\r
1161 GetLocalDirForWnd();
\r
1162 SelectFileInList(GetLocalHwnd(), SELECT_LIST, Base);
\r
1163 SetHotSelected(WIN_LOCAL, Name);
\r
1164 SendMessage(GetLocalHwnd(), LVM_ENSUREVISIBLE, (WPARAM)(SendMessage(GetLocalHwnd(), LVM_GETITEMCOUNT, 0, 0) - 1), (LPARAM)TRUE);
\r
1165 SendMessage(GetLocalHwnd(), LVM_ENSUREVISIBLE, (WPARAM)Pos, (LPARAM)TRUE);
\r
1169 if(CancelFlg == YES)
\r
1170 AbortRecoveryProc();
\r
1171 if(NoopEnable == YES && AskNoopInterval() > 0 && time(NULL) - LastDataConnectionTime >= AskNoopInterval())
\r
1174 LastDataConnectionTime = time(NULL);
\r
1178 if(IsTaskbarList3Loaded() == YES)
\r
1179 UpdateTaskbarProgress();
\r
1182 if(AskUserOpeDisabled() == NO && AskTransferNow() == NO)
\r
1184 if(AutoCheckForUpdates == YES && AutoCheckForUptatesInterval > 0 && time(NULL) - LastAutoCheckForUpdates >= AutoCheckForUptatesInterval * 86400)
\r
1185 UpdateSoftware(YES, YES, AutoApplyUpdates);
\r
1193 // 中断後に受信バッファに応答が残っていると次のコマンドの応答が正しく処理できない
\r
1194 if(CancelFlg == YES)
\r
1195 AbortRecoveryProc();
\r
1196 switch(LOWORD(wParam))
\r
1198 case MENU_CONNECT :
\r
1201 ConnectProc(DLG_TYPE_CON, -1);
\r
1206 case MENU_CONNECT_NUM :
\r
1209 ConnectProc(DLG_TYPE_CON, (int)lParam);
\r
1212 if(AskConnecting() == YES)
\r
1214 if(HIWORD(wParam) & OPT_MIRROR)
\r
1216 if(HIWORD(wParam) & OPT_FORCE)
\r
1217 MirrorUploadProc(NO);
\r
1219 MirrorUploadProc(YES);
\r
1221 else if(HIWORD(wParam) & OPT_MIRRORDOWN)
\r
1223 if(HIWORD(wParam) & OPT_FORCE)
\r
1224 MirrorDownloadProc(NO);
\r
1226 MirrorDownloadProc(YES);
\r
1231 case MENU_SET_CONNECT :
\r
1234 ConnectProc(DLG_TYPE_SET, -1);
\r
1242 QuickConnectProc();
\r
1247 case MENU_DISCONNECT :
\r
1248 if(AskTryingConnect() == YES)
\r
1250 else if(AskConnecting() == YES)
\r
1253 SaveCurrentSetToHost();
\r
1258 case MENU_HIST_1 :
\r
1259 case MENU_HIST_2 :
\r
1260 case MENU_HIST_3 :
\r
1261 case MENU_HIST_4 :
\r
1262 case MENU_HIST_5 :
\r
1263 case MENU_HIST_6 :
\r
1264 case MENU_HIST_7 :
\r
1265 case MENU_HIST_8 :
\r
1266 case MENU_HIST_9 :
\r
1267 case MENU_HIST_10 :
\r
1268 case MENU_HIST_11 :
\r
1269 case MENU_HIST_12 :
\r
1270 case MENU_HIST_13 :
\r
1271 case MENU_HIST_14 :
\r
1272 case MENU_HIST_15 :
\r
1273 case MENU_HIST_16 :
\r
1274 case MENU_HIST_17 :
\r
1275 case MENU_HIST_18 :
\r
1276 case MENU_HIST_19 :
\r
1277 case MENU_HIST_20 :
\r
1280 HistoryConnectProc(LOWORD(wParam));
\r
1286 if(hWndCurFocus == GetLocalHwnd())
\r
1287 PostMessage(hWnd, WM_COMMAND, MAKEWPARAM(MENU_LOCAL_UPDIR, 0), 0);
\r
1289 PostMessage(hWnd, WM_COMMAND, MAKEWPARAM(MENU_REMOTE_UPDIR, 0), 0);
\r
1292 case MENU_DCLICK :
\r
1293 if(hWndCurFocus == GetLocalHwnd())
\r
1295 // DoubleClickProc(WIN_LOCAL, YES, -1);
\r
1296 DoubleClickProc(WIN_LOCAL, NO, -1);
\r
1299 SuppressRefresh = 1;
\r
1301 // DoubleClickProc(WIN_REMOTE, YES, -1);
\r
1302 DoubleClickProc(WIN_REMOTE, NO, -1);
\r
1303 SuppressRefresh = 0;
\r
1309 if(hWndCurFocus == GetLocalHwnd())
\r
1310 DoubleClickProc(WIN_LOCAL, YES, -1);
\r
1313 SuppressRefresh = 1;
\r
1314 DoubleClickProc(WIN_REMOTE, YES, -1);
\r
1315 SuppressRefresh = 0;
\r
1320 if(hWndCurFocus == GetLocalHwnd())
\r
1321 DoubleClickProc(WIN_LOCAL, YES, 0);
\r
1324 SuppressRefresh = 1;
\r
1325 DoubleClickProc(WIN_REMOTE, YES, 0);
\r
1326 SuppressRefresh = 0;
\r
1331 if(hWndCurFocus == GetLocalHwnd())
\r
1332 DoubleClickProc(WIN_LOCAL, YES, 1);
\r
1335 SuppressRefresh = 1;
\r
1336 DoubleClickProc(WIN_REMOTE, YES, 1);
\r
1337 SuppressRefresh = 0;
\r
1342 if(hWndCurFocus == GetLocalHwnd())
\r
1343 DoubleClickProc(WIN_LOCAL, YES, 2);
\r
1346 SuppressRefresh = 1;
\r
1347 DoubleClickProc(WIN_REMOTE, YES, 2);
\r
1348 SuppressRefresh = 0;
\r
1352 case MENU_REMOTE_UPDIR :
\r
1354 if(AskUserOpeDisabled() == YES)
\r
1356 SuppressRefresh = 1;
\r
1357 SetCurrentDirAsDirHist();
\r
1358 ChangeDir(WIN_REMOTE, "..");
\r
1359 SuppressRefresh = 0;
\r
1362 case MENU_LOCAL_UPDIR :
\r
1364 if(AskUserOpeDisabled() == YES)
\r
1366 SetCurrentDirAsDirHist();
\r
1367 ChangeDir(WIN_LOCAL, "..");
\r
1370 case MENU_REMOTE_CHDIR :
\r
1371 SuppressRefresh = 1;
\r
1372 SetCurrentDirAsDirHist();
\r
1373 ChangeDirDirectProc(WIN_REMOTE);
\r
1374 SuppressRefresh = 0;
\r
1377 case MENU_LOCAL_CHDIR :
\r
1378 SetCurrentDirAsDirHist();
\r
1379 ChangeDirDirectProc(WIN_LOCAL);
\r
1382 case MENU_DOWNLOAD :
\r
1383 SetCurrentDirAsDirHist();
\r
1384 DownloadProc(NO, NO, NO);
\r
1387 case MENU_DOWNLOAD_AS :
\r
1388 SetCurrentDirAsDirHist();
\r
1389 DownloadProc(YES, NO, NO);
\r
1392 case MENU_DOWNLOAD_AS_FILE :
\r
1393 SetCurrentDirAsDirHist();
\r
1394 DownloadProc(NO, YES, NO);
\r
1397 case MENU_DOWNLOAD_ALL :
\r
1398 SetCurrentDirAsDirHist();
\r
1399 DownloadProc(NO, NO, YES);
\r
1402 case MENU_DOWNLOAD_NAME :
\r
1403 SetCurrentDirAsDirHist();
\r
1404 InputDownloadProc();
\r
1407 case MENU_UPLOAD :
\r
1408 SetCurrentDirAsDirHist();
\r
1409 UploadListProc(NO, NO);
\r
1412 case MENU_UPLOAD_AS :
\r
1413 SetCurrentDirAsDirHist();
\r
1414 UploadListProc(YES, NO);
\r
1417 case MENU_UPLOAD_ALL :
\r
1418 SetCurrentDirAsDirHist();
\r
1419 UploadListProc(NO, YES);
\r
1422 case MENU_MIRROR_UPLOAD :
\r
1423 SetCurrentDirAsDirHist();
\r
1424 MirrorUploadProc(YES);
\r
1427 case MENU_MIRROR_DOWNLOAD :
\r
1428 SetCurrentDirAsDirHist();
\r
1429 MirrorDownloadProc(YES);
\r
1432 case MENU_FILESIZE :
\r
1433 SetCurrentDirAsDirHist();
\r
1434 CalcFileSizeProc();
\r
1437 case MENU_DELETE :
\r
1438 SuppressRefresh = 1;
\r
1439 SetCurrentDirAsDirHist();
\r
1441 SuppressRefresh = 0;
\r
1444 case MENU_RENAME :
\r
1445 SuppressRefresh = 1;
\r
1446 SetCurrentDirAsDirHist();
\r
1448 SuppressRefresh = 0;
\r
1452 SuppressRefresh = 1;
\r
1453 SetCurrentDirAsDirHist();
\r
1455 SuppressRefresh = 0;
\r
1459 SuppressRefresh = 1;
\r
1461 SuppressRefresh = 0;
\r
1464 case MENU_SOMECMD :
\r
1465 SuppressRefresh = 1;
\r
1467 SuppressRefresh = 0;
\r
1470 case MENU_OPTION :
\r
1472 if(ListFont != NULL)
\r
1474 SendMessage(GetLocalHwnd(), WM_SETFONT, (WPARAM)ListFont, MAKELPARAM(TRUE, 0));
\r
1475 SendMessage(GetRemoteHwnd(), WM_SETFONT, (WPARAM)ListFont, MAKELPARAM(TRUE, 0));
\r
1476 SendMessage(GetTaskWnd(), WM_SETFONT, (WPARAM)ListFont, MAKELPARAM(TRUE, 0));
\r
1478 GetLocalDirForWnd();
\r
1479 DispTransferType();
\r
1480 CheckHistoryNum(0);
\r
1481 SetAllHistoryToMenu();
\r
1483 SetSSLTimeoutCallback(TimeOut * 1000, SSLTimeoutCallback);
\r
1486 case MENU_FILTER :
\r
1489 SetFilter(&CancelFlg);
\r
1493 if(SortSetting() == YES)
\r
1497 LocalFileSort = AskSortType(ITEM_LFILE);
\r
1498 LocalDirSort = AskSortType(ITEM_LDIR);
\r
1499 RemoteFileSort = AskSortType(ITEM_RFILE);
\r
1500 RemoteDirSort = AskSortType(ITEM_RDIR);
\r
1501 ReSortDispList(WIN_LOCAL, &CancelFlg);
\r
1502 ReSortDispList(WIN_REMOTE, &CancelFlg);
\r
1507 PostMessage(hWnd, WM_CLOSE, 0, 0L);
\r
1510 case MENU_AUTO_EXIT :
\r
1511 if(AutoExit == YES)
\r
1512 PostMessage(hWnd, WM_CLOSE, 0, 0L);
\r
1516 DialogBox(hInstFtp, MAKEINTRESOURCE(about_dlg), hWnd, AboutDialogProc);
\r
1520 case MENU_BINARY :
\r
1522 SetTransferType(LOWORD(wParam));
\r
1523 DispTransferType();
\r
1526 case MENU_XFRMODE :
\r
1527 switch(AskTransferType())
\r
1530 TmpTransType = MENU_BINARY;
\r
1534 TmpTransType = MENU_AUTO;
\r
1538 TmpTransType = MENU_TEXT;
\r
1541 SetTransferType(TmpTransType);
\r
1542 DispTransferType();
\r
1546 case MENU_KNJ_SJIS :
\r
1547 case MENU_KNJ_EUC :
\r
1548 case MENU_KNJ_JIS :
\r
1549 case MENU_KNJ_UTF8N :
\r
1550 case MENU_KNJ_UTF8BOM :
\r
1551 case MENU_KNJ_NONE :
\r
1552 SetHostKanjiCode(LOWORD(wParam));
\r
1555 case MENU_L_KNJ_SJIS :
\r
1556 case MENU_L_KNJ_EUC :
\r
1557 case MENU_L_KNJ_JIS :
\r
1558 case MENU_L_KNJ_UTF8N :
\r
1559 case MENU_L_KNJ_UTF8BOM :
\r
1560 SetLocalKanjiCode(LOWORD(wParam));
\r
1563 case MENU_KANACNV :
\r
1567 case MENU_REFRESH :
\r
1569 if(AskUserOpeDisabled() == YES)
\r
1573 SuppressRefresh = 1;
\r
1574 GetLocalDirForWnd();
\r
1575 if(CheckClosedAndReconnect() == FFFTP_SUCCESS)
\r
1576 GetRemoteDirForWnd(CACHE_REFRESH, &CancelFlg);
\r
1577 SuppressRefresh = 0;
\r
1581 ListType = LVS_LIST;
\r
1583 SetListViewType();
\r
1586 case MENU_REPORT :
\r
1587 ListType = LVS_REPORT;
\r
1589 SetListViewType();
\r
1592 case REFRESH_LOCAL :
\r
1594 if(AskUserOpeDisabled() == YES)
\r
1596 GetLocalDirForWnd();
\r
1599 case REFRESH_REMOTE :
\r
1601 if(AskUserOpeDisabled() == YES)
\r
1605 SuppressRefresh = 1;
\r
1606 if(CheckClosedAndReconnect() == FFFTP_SUCCESS)
\r
1607 GetRemoteDirForWnd(CACHE_REFRESH, &CancelFlg);
\r
1608 SuppressRefresh = 0;
\r
1611 case COMBO_LOCAL :
\r
1612 case COMBO_REMOTE :
\r
1613 SuppressRefresh = 1;
\r
1614 if(HIWORD(wParam) == CBN_SELCHANGE)
\r
1616 SetCurrentDirAsDirHist();
\r
1617 ChangeDirComboProc((HWND)lParam);
\r
1619 else if(HIWORD(wParam) != CBN_CLOSEUP)
\r
1621 MakeButtonsFocus();
\r
1622 SuppressRefresh = 0;
\r
1625 SuppressRefresh = 0;
\r
1629 hHelpWin = HtmlHelp(NULL, AskHelpFilePath(), HH_HELP_CONTEXT, IDH_HELP_TOPIC_0000001);
\r
1632 case MENU_HELP_TROUBLE :
\r
1633 // 任意のコードが実行されるバグ修正
\r
1634 // ShellExecute(NULL, "open", MYWEB_URL, NULL, ".", SW_SHOW);
\r
1635 ShellExecute(NULL, "open", MYWEB_URL, NULL, NULL, SW_SHOW);
\r
1638 case MENU_BMARK_ADD :
\r
1639 AddCurDirToBookMark(WIN_REMOTE);
\r
1642 case MENU_BMARK_ADD_LOCAL :
\r
1643 AddCurDirToBookMark(WIN_LOCAL);
\r
1646 case MENU_BMARK_ADD_BOTH :
\r
1647 AddCurDirToBookMark(WIN_BOTH);
\r
1650 case MENU_BMARK_EDIT :
\r
1654 case MENU_SELECT_ALL :
\r
1656 // SelectFileInList(hWndCurFocus, SELECT_ALL);
\r
1657 SelectFileInList(hWndCurFocus, SELECT_ALL, NULL);
\r
1660 case MENU_SELECT :
\r
1662 // SelectFileInList(hWndCurFocus, SELECT_REGEXP);
\r
1663 SelectFileInList(hWndCurFocus, SELECT_REGEXP, NULL);
\r
1667 FindFileInList(hWndCurFocus, FIND_FIRST);
\r
1670 case MENU_FINDNEXT :
\r
1671 FindFileInList(hWndCurFocus, FIND_NEXT);
\r
1674 case MENU_DOTFILE :
\r
1676 if(AskUserOpeDisabled() == YES)
\r
1681 DispDotFileMode();
\r
1682 GetLocalDirForWnd();
\r
1683 GetRemoteDirForWnd(CACHE_LASTREAD, &CancelFlg);
\r
1687 ToggleSyncMoveMode();
\r
1690 case MENU_IMPORT_WS :
\r
1691 ImportFromWSFTP();
\r
1694 case MENU_REGSAVE :
\r
1695 GetListTabWidth();
\r
1697 SaveSettingsToFile();
\r
1700 case MENU_REGLOAD :
\r
1701 if(LoadSettingsFromFile() == YES)
\r
1703 MessageBox(hWnd, MSGJPN292, "FFFTP", MB_OK);
\r
1705 PostMessage(hWnd, WM_CLOSE, 0, 0L);
\r
1709 case MENU_REGINIT :
\r
1710 if(DialogBox(hInstFtp, MAKEINTRESOURCE(reginit_dlg), hWnd, ExeEscDialogProc) == YES)
\r
1716 PostMessage(hWnd, WM_CLOSE, 0, 0L);
\r
1719 case MENU_CHANGEPASSWD: /* 2010.01.31 genta */
\r
1720 if( GetMasterPasswordStatus() != PASSWORD_OK )
\r
1723 if( DialogBox(hInstFtp, MAKEINTRESOURCE(forcepasschange_dlg), hWnd, ExeEscDialogProc) != YES){
\r
1727 if(EnterMasterPasswordAndSet(newmasterpasswd_dlg, hWnd) != 0)
\r
1728 SetTaskMsg(MSGJPN303);
\r
1731 // if( EnterMasterPasswordAndSet( newmasterpasswd_dlg, hWnd ) != 0 ){
\r
1732 // SetTaskMsg( MSGJPN303 );
\r
1734 else if(GetMasterPasswordStatus() == PASSWORD_OK)
\r
1736 char Password[MAX_PASSWORD_LEN + 1];
\r
1737 GetMasterPassword(Password);
\r
1738 SetMasterPassword(NULL);
\r
1739 while(ValidateMasterPassword() == YES && GetMasterPasswordStatus() == PASSWORD_UNMATCH)
\r
1741 if(EnterMasterPasswordAndSet(masterpasswd_dlg, hWnd) == 0)
\r
1744 if(GetMasterPasswordStatus() == PASSWORD_OK && EnterMasterPasswordAndSet(newmasterpasswd_dlg, hWnd) != 0)
\r
1746 SetTaskMsg(MSGJPN303);
\r
1751 SetMasterPassword(Password);
\r
1752 ValidateMasterPassword();
\r
1757 case MENU_DIRINFO :
\r
1761 case MENU_TASKINFO :
\r
1767 if(AskTryingConnect() == NO)
\r
1768 MainTransPkt.Abort = ABORT_USER;
\r
1771 case MENU_OTPCALC :
\r
1776 case MENU_FW_FTP_FILTER :
\r
1777 TurnStatefulFTPFilter();
\r
1780 case MENU_URL_COPY :
\r
1781 CopyURLtoClipBoard();
\r
1784 case MENU_APPKEY :
\r
1785 EraseListViewTips();
\r
1786 if(hWndCurFocus == GetRemoteHwnd())
\r
1787 RemoteRbuttonMenu(1);
\r
1788 else if(hWndCurFocus == GetLocalHwnd())
\r
1789 LocalRbuttonMenu(1);
\r
1792 #if defined(HAVE_TANDEM)
\r
1793 case MENU_SWITCH_OSS :
\r
1799 case MENU_REMOTE_MOVE_UPDIR :
\r
1800 MoveRemoteFileProc(-1);
\r
1803 // FileZilla XML形式エクスポート対応
\r
1804 case MENU_EXPORT_FILEZILLA_XML :
\r
1805 // 平文で出力するためマスターパスワードを再確認
\r
1806 if(GetMasterPasswordStatus() == PASSWORD_OK)
\r
1808 char Password[MAX_PASSWORD_LEN + 1];
\r
1809 GetMasterPassword(Password);
\r
1810 SetMasterPassword(NULL);
\r
1811 while(ValidateMasterPassword() == YES && GetMasterPasswordStatus() == PASSWORD_UNMATCH)
\r
1813 if(EnterMasterPasswordAndSet(masterpasswd_dlg, hWnd) == 0)
\r
1816 if(GetMasterPasswordStatus() == PASSWORD_OK)
\r
1817 SaveSettingsToFileZillaXml();
\r
1820 SetMasterPassword(Password);
\r
1821 ValidateMasterPassword();
\r
1827 case MENU_UPDATES_CHECK :
\r
1828 UpdateSoftware(NO, NO, NO);
\r
1831 // WinSCP INI形式エクスポート対応
\r
1832 case MENU_EXPORT_WINSCP_INI :
\r
1833 // 平文で出力するためマスターパスワードを再確認
\r
1834 if(GetMasterPasswordStatus() == PASSWORD_OK)
\r
1836 char Password[MAX_PASSWORD_LEN + 1];
\r
1837 GetMasterPassword(Password);
\r
1838 SetMasterPassword(NULL);
\r
1839 while(ValidateMasterPassword() == YES && GetMasterPasswordStatus() == PASSWORD_UNMATCH)
\r
1841 if(EnterMasterPasswordAndSet(masterpasswd_dlg, hWnd) == 0)
\r
1844 if(GetMasterPasswordStatus() == PASSWORD_OK)
\r
1845 SaveSettingsToWinSCPIni();
\r
1848 SetMasterPassword(Password);
\r
1849 ValidateMasterPassword();
\r
1855 if((LOWORD(wParam) >= MENU_BMARK_TOP) &&
\r
1856 (LOWORD(wParam) < MENU_BMARK_TOP+100))
\r
1858 ChangeDirBmarkProc(LOWORD(wParam));
\r
1862 // 常にホストかローカルへフォーカスを移動
\r
1863 // SetFocus(hWndCurFocus);
\r
1864 MakeButtonsFocus();
\r
1868 switch(((LPNMHDR)lParam)->code)
\r
1870 /* ツールチップコントロールメッセージの処理 */
\r
1872 // case TTN_NEEDTEXT:
\r
1873 case TTN_NEEDTEXTW:
\r
1874 lpttt = (LPTOOLTIPTEXT)lParam;
\r
1877 wlpttt = (LPTOOLTIPTEXTW)lParam;
\r
1878 lpttt->hinst = hInstFtp;
\r
1879 switch(lpttt->hdr.idFrom)
\r
1881 case MENU_CONNECT :
\r
1882 lpttt->lpszText = MSGJPN154;
\r
1886 lpttt->lpszText = MSGJPN155;
\r
1889 case MENU_DISCONNECT :
\r
1890 lpttt->lpszText = MSGJPN156;
\r
1893 case MENU_DOWNLOAD :
\r
1894 lpttt->lpszText = MSGJPN157;
\r
1896 #if defined(HAVE_TANDEM)
\r
1897 case MENU_DOWNLOAD_AS :
\r
1898 lpttt->lpszText = MSGJPN065;
\r
1901 case MENU_UPLOAD_AS :
\r
1902 lpttt->lpszText = MSGJPN064;
\r
1905 case MENU_UPLOAD :
\r
1906 lpttt->lpszText = MSGJPN158;
\r
1909 case MENU_MIRROR_UPLOAD :
\r
1910 lpttt->lpszText = MSGJPN159;
\r
1913 case MENU_DELETE :
\r
1914 lpttt->lpszText = MSGJPN160;
\r
1917 case MENU_RENAME :
\r
1918 lpttt->lpszText = MSGJPN161;
\r
1922 lpttt->lpszText = MSGJPN162;
\r
1925 case MENU_LOCAL_UPDIR :
\r
1926 case MENU_REMOTE_UPDIR :
\r
1927 lpttt->lpszText = MSGJPN163;
\r
1930 case MENU_LOCAL_CHDIR :
\r
1931 case MENU_REMOTE_CHDIR :
\r
1932 lpttt->lpszText = MSGJPN164;
\r
1936 lpttt->lpszText = MSGJPN165;
\r
1939 case MENU_BINARY :
\r
1940 lpttt->lpszText = MSGJPN166;
\r
1944 lpttt->lpszText = MSGJPN167;
\r
1947 case MENU_REFRESH :
\r
1948 lpttt->lpszText = MSGJPN168;
\r
1952 lpttt->lpszText = MSGJPN169;
\r
1955 case MENU_REPORT :
\r
1956 lpttt->lpszText = MSGJPN170;
\r
1959 case MENU_KNJ_SJIS :
\r
1960 lpttt->lpszText = MSGJPN307;
\r
1963 case MENU_KNJ_EUC :
\r
1964 lpttt->lpszText = MSGJPN171;
\r
1967 case MENU_KNJ_JIS :
\r
1968 lpttt->lpszText = MSGJPN172;
\r
1971 case MENU_KNJ_UTF8N :
\r
1972 lpttt->lpszText = MSGJPN308;
\r
1975 case MENU_KNJ_UTF8BOM :
\r
1976 lpttt->lpszText = MSGJPN330;
\r
1979 case MENU_KNJ_NONE :
\r
1980 lpttt->lpszText = MSGJPN173;
\r
1983 case MENU_L_KNJ_SJIS :
\r
1984 lpttt->lpszText = MSGJPN309;
\r
1987 case MENU_L_KNJ_EUC :
\r
1988 lpttt->lpszText = MSGJPN310;
\r
1991 case MENU_L_KNJ_JIS :
\r
1992 lpttt->lpszText = MSGJPN311;
\r
1995 case MENU_L_KNJ_UTF8N :
\r
1996 lpttt->lpszText = MSGJPN312;
\r
1999 case MENU_L_KNJ_UTF8BOM :
\r
2000 lpttt->lpszText = MSGJPN331;
\r
2003 case MENU_KANACNV :
\r
2004 lpttt->lpszText = MSGJPN174;
\r
2008 lpttt->lpszText = MSGJPN175;
\r
2012 lpttt->lpszText = MSGJPN176;
\r
2016 // UTF-8からUTF-16 LEへ変換
\r
2018 static wchar_t StringBufferUTF16[1024];
\r
2019 if(lpttt->lpszText)
\r
2021 MtoW(StringBufferUTF16, sizeof(StringBufferUTF16)/ sizeof(wchar_t), lpttt->lpszText, -1);
\r
2022 wlpttt->lpszText = StringBufferUTF16;
\r
2027 case LVN_COLUMNCLICK :
\r
2028 if(((NMHDR *)lParam)->hwndFrom == GetLocalHwnd())
\r
2032 SetSortTypeByColumn(WIN_LOCAL, ((NM_LISTVIEW *)lParam)->iSubItem);
\r
2033 ReSortDispList(WIN_LOCAL, &CancelFlg);
\r
2035 else if(((NMHDR *)lParam)->hwndFrom == GetRemoteHwnd())
\r
2037 if(((NM_LISTVIEW *)lParam)->iSubItem != 4)
\r
2041 SetSortTypeByColumn(WIN_REMOTE, ((NM_LISTVIEW *)lParam)->iSubItem);
\r
2042 ReSortDispList(WIN_REMOTE, &CancelFlg);
\r
2045 SetFocus(hWndCurFocus);
\r
2048 case LVN_ITEMCHANGED :
\r
2049 DispSelectedSpace();
\r
2050 MakeButtonsFocus();
\r
2056 Sizing = SW_RESTORE;
\r
2057 if(wParam == SIZE_RESTORED)
\r
2059 ResizeWindowProc();
\r
2060 GetWindowRect(hWnd, &Rect);
\r
2061 WinPosX = Rect.left;
\r
2062 WinPosY = Rect.top;
\r
2064 else if(wParam == SIZE_MAXIMIZED)
\r
2066 Sizing = SW_MAXIMIZE;
\r
2067 ResizeWindowProc();
\r
2070 return(DefWindowProc(hWnd, message, wParam, lParam));
\r
2074 WinPosX = ((RECT *)lParam)->left;
\r
2075 WinPosY = ((RECT *)lParam)->top;
\r
2076 return(DefWindowProc(hWnd, message, wParam, lParam));
\r
2078 case WM_SETFOCUS :
\r
2079 SetFocus(hWndCurFocus);
\r
2082 case WM_LBUTTONDOWN :
\r
2083 case WM_LBUTTONUP :
\r
2084 case WM_MOUSEMOVE :
\r
2085 CheckResizeFrame(wParam, LOWORD(lParam), HIWORD(lParam));
\r
2088 case WM_CHANGE_COND :
\r
2089 DispTransferFiles();
\r
2092 case WM_REFRESH_LOCAL_FLG :
\r
2093 // 外部アプリケーションへドロップ後にローカル側のファイル一覧に作業フォルダが表示されるバグ対策
\r
2094 // PostMessage(hWnd, WM_COMMAND, MAKEWPARAM(REFRESH_LOCAL, 0), 0);
\r
2095 if(SuppressRefresh == 0)
\r
2096 PostMessage(hWnd, WM_COMMAND, MAKEWPARAM(REFRESH_LOCAL, 0), 0);
\r
2099 case WM_REFRESH_REMOTE_FLG :
\r
2100 if(SuppressRefresh == 0)
\r
2101 PostMessage(hWnd, WM_COMMAND, MAKEWPARAM(REFRESH_REMOTE, 0), 0);
\r
2105 case WM_ADDPORTMAPPING :
\r
2106 ((ADDPORTMAPPINGDATA*)lParam)->r = AddPortMapping(((ADDPORTMAPPINGDATA*)lParam)->Adrs, ((ADDPORTMAPPINGDATA*)lParam)->Port, ((ADDPORTMAPPINGDATA*)lParam)->ExtAdrs);
\r
2107 SetEvent(((ADDPORTMAPPINGDATA*)lParam)->h);
\r
2110 case WM_REMOVEPORTMAPPING :
\r
2111 ((REMOVEPORTMAPPINGDATA*)lParam)->r = RemovePortMapping(((REMOVEPORTMAPPINGDATA*)lParam)->Port);
\r
2112 SetEvent(((REMOVEPORTMAPPINGDATA*)lParam)->h);
\r
2116 case WM_RECONNECTSOCKET :
\r
2121 BeginPaint(hWnd, (LPPAINTSTRUCT) &ps);
\r
2122 EndPaint(hWnd, (LPPAINTSTRUCT) &ps);
\r
2127 KillTimer(hWnd, 1);
\r
2128 if(ChangeNotification != INVALID_HANDLE_VALUE)
\r
2129 FindCloseChangeNotification(ChangeNotification);
\r
2131 KillTimer(hWnd, 2);
\r
2133 KillTimer(hWnd, 3);
\r
2135 // DestroyWindow(hWndFtp);
\r
2136 PostQuitMessage(0);
\r
2139 case WM_QUERYENDSESSION :
\r
2144 if((AskTransferNow() == NO) ||
\r
2145 (DialogBox(hInstFtp, MAKEINTRESOURCE(exit_dlg), hWnd, ExeEscDialogProc) == YES))
\r
2148 return(DefWindowProc(hWnd, message, wParam, lParam));
\r
2153 return(DefWindowProc(hWnd, message, wParam, lParam));
\r
2159 /*----- プログラム開始時の処理 ------------------------------------------------
\r
2162 * char *Cmd : コマンドライン文字列
\r
2166 *----------------------------------------------------------------------------*/
\r
2168 static void StartupProc(char *Cmd)
\r
2177 char unc[FMAX_PATH+1];
\r
2179 Sts = AnalyzeComLine(Cmd, &AutoConnect, &CmdOption, unc, FMAX_PATH);
\r
2181 TrMode = TYPE_DEFAULT;
\r
2182 Kanji = KANJI_NOCNV;
\r
2183 FnameKanji = KANJI_NOCNV;
\r
2185 if(CmdOption & OPT_ASCII)
\r
2187 if(CmdOption & OPT_BINARY)
\r
2189 if(CmdOption & OPT_EUC)
\r
2190 Kanji = KANJI_EUC;
\r
2191 if(CmdOption & OPT_JIS)
\r
2192 Kanji = KANJI_JIS;
\r
2193 if(CmdOption & OPT_EUC_NAME)
\r
2194 FnameKanji = KANJI_EUC;
\r
2195 if(CmdOption & OPT_JIS_NAME)
\r
2196 FnameKanji = KANJI_JIS;
\r
2197 if(CmdOption & OPT_KANA)
\r
2200 if(CmdOption & OPT_QUIT)
\r
2203 if(CmdOption & OPT_SAVEOFF)
\r
2204 SuppressSave = YES;
\r
2205 if(CmdOption & OPT_SAVEON)
\r
2206 SuppressSave = NO;
\r
2209 if(CmdOption & OPT_SJIS)
\r
2210 Kanji = KANJI_SJIS;
\r
2211 if(CmdOption & OPT_UTF8N)
\r
2212 Kanji = KANJI_UTF8N;
\r
2213 if(CmdOption & OPT_UTF8BOM)
\r
2214 Kanji = KANJI_UTF8BOM;
\r
2215 if(CmdOption & OPT_SJIS_NAME)
\r
2216 FnameKanji = KANJI_SJIS;
\r
2217 if(CmdOption & OPT_UTF8N_NAME)
\r
2218 FnameKanji = KANJI_UTF8N;
\r
2222 if(ConnectOnStart == YES)
\r
2223 PostMessage(hWndFtp, WM_COMMAND, MAKEWPARAM(MENU_CONNECT, 0), 0);
\r
2227 DirectConnectProc(unc, Kanji, Kana, FnameKanji, TrMode);
\r
2231 PostMessage(hWndFtp, WM_COMMAND, MAKEWPARAM(MENU_CONNECT_NUM, CmdOption), (LPARAM)AutoConnect);
\r
2237 /*----- コマンドラインを解析 --------------------------------------------------
\r
2240 * char *Str : コマンドライン文字列
\r
2241 * int *AutoConnect : 接続ホスト番号を返すワーク
\r
2242 * int *CmdOption : オプションを返すワーク
\r
2243 * char *unc : uncを返すワーク
\r
2244 * int Max : uncの最大長
\r
2248 * 0=指定なし、1=URL指定、2=設定名指定、-1=エラー
\r
2265 * -n --ini (CheckIniFileNameで検索)
\r
2268 * -z --mpasswd (CheckMasterPasswordで検索) 2010.01.30 genta 追加
\r
2269 *----------------------------------------------------------------------------*/
\r
2271 static int AnalyzeComLine(char *Str, int *AutoConnect, int *CmdOption, char *unc, int Max)
\r
2274 char Tmp[FMAX_PATH+1];
\r
2278 *AutoConnect = -1;
\r
2282 memset(unc, NUL, Max+1);
\r
2284 while((Ret != -1) && ((Str = GetToken(Str, Tmp)) != NULL))
\r
2289 if((strcmp(&Tmp[1], "m") == 0) || (strcmp(&Tmp[1], "-mirror") == 0))
\r
2290 *CmdOption |= OPT_MIRROR;
\r
2291 else if((strcmp(&Tmp[1], "d") == 0) || (strcmp(&Tmp[1], "-mirrordown") == 0))
\r
2292 *CmdOption |= OPT_MIRRORDOWN;
\r
2294 // else if((strcmp(&Tmp[1], "e") == 0) || (strcmp(&Tmp[1], "-euc") == 0))
\r
2295 // *CmdOption |= OPT_EUC;
\r
2296 // else if((strcmp(&Tmp[1], "j") == 0) || (strcmp(&Tmp[1], "-jis") == 0))
\r
2297 // *CmdOption |= OPT_JIS;
\r
2298 else if((strcmp(&Tmp[1], "eu") == 0) || (strcmp(&Tmp[1], "e") == 0) || (strcmp(&Tmp[1], "-euc") == 0))
\r
2299 *CmdOption |= OPT_EUC;
\r
2300 else if((strcmp(&Tmp[1], "ji") == 0) || (strcmp(&Tmp[1], "j") == 0) || (strcmp(&Tmp[1], "-jis") == 0))
\r
2301 *CmdOption |= OPT_JIS;
\r
2302 else if((strcmp(&Tmp[1], "a") == 0) || (strcmp(&Tmp[1], "-ascii") == 0))
\r
2303 *CmdOption |= OPT_ASCII;
\r
2304 else if((strcmp(&Tmp[1], "b") == 0) || (strcmp(&Tmp[1], "-binary") == 0))
\r
2305 *CmdOption |= OPT_BINARY;
\r
2306 else if((strcmp(&Tmp[1], "x") == 0) || (strcmp(&Tmp[1], "-auto") == 0))
\r
2307 *CmdOption |= OPT_AUTO;
\r
2308 else if((strcmp(&Tmp[1], "f") == 0) || (strcmp(&Tmp[1], "-force") == 0))
\r
2309 *CmdOption |= OPT_FORCE;
\r
2310 else if((strcmp(&Tmp[1], "q") == 0) || (strcmp(&Tmp[1], "-quit") == 0))
\r
2311 *CmdOption |= OPT_QUIT;
\r
2312 else if((strcmp(&Tmp[1], "k") == 0) || (strcmp(&Tmp[1], "-kana") == 0))
\r
2313 *CmdOption |= OPT_KANA;
\r
2315 // else if((strcmp(&Tmp[1], "u") == 0) || (strcmp(&Tmp[1], "-eucname") == 0))
\r
2316 // *CmdOption |= OPT_EUC_NAME;
\r
2317 // else if((strcmp(&Tmp[1], "i") == 0) || (strcmp(&Tmp[1], "-jisname") == 0))
\r
2318 // *CmdOption |= OPT_JIS_NAME;
\r
2319 else if((strcmp(&Tmp[1], "eun") == 0) || (strcmp(&Tmp[1], "u") == 0) || (strcmp(&Tmp[1], "-eucname") == 0))
\r
2320 *CmdOption |= OPT_EUC_NAME;
\r
2321 else if((strcmp(&Tmp[1], "jin") == 0) || (strcmp(&Tmp[1], "i") == 0) || (strcmp(&Tmp[1], "-jisname") == 0))
\r
2322 *CmdOption |= OPT_JIS_NAME;
\r
2323 else if((strcmp(&Tmp[1], "n") == 0) || (strcmp(&Tmp[1], "-ini") == 0))
\r
2325 if((Str = GetToken(Str, Tmp)) == NULL)
\r
2327 SetTaskMsg(MSGJPN282);
\r
2331 else if(strcmp(&Tmp[1], "-saveoff") == 0)
\r
2332 *CmdOption |= OPT_SAVEOFF;
\r
2333 else if(strcmp(&Tmp[1], "-saveon") == 0)
\r
2334 *CmdOption |= OPT_SAVEON;
\r
2335 else if((strcmp(&Tmp[1], "z") == 0) || (strcmp(&Tmp[1], "-mpasswd") == 0))
\r
2336 { /* 2010.01.30 genta : Add master password option */
\r
2337 if((Str = GetToken(Str, Tmp)) == NULL)
\r
2339 SetTaskMsg(MSGJPN299);
\r
2343 else if((strcmp(&Tmp[1], "s") == 0) || (strcmp(&Tmp[1], "-set") == 0))
\r
2347 if((Str = GetToken(Str, Tmp)) != NULL)
\r
2349 if((*AutoConnect = SearchHostName(Tmp)) != -1)
\r
2353 SetTaskMsg(MSGJPN177, Tmp);
\r
2359 SetTaskMsg(MSGJPN178);
\r
2365 SetTaskMsg(MSGJPN179);
\r
2369 else if((strcmp(&Tmp[1], "h") == 0) || (strcmp(&Tmp[1], "-help") == 0))
\r
2371 hHelpWin = HtmlHelp(NULL, AskHelpFilePath(), HH_HELP_CONTEXT, IDH_HELP_TOPIC_0000024);
\r
2374 #ifdef ENABLE_PROCESS_PROTECTION
\r
2375 else if(strcmp(&Tmp[1], "-restart") == 0)
\r
2378 else if(strcmp(&Tmp[1], "-protect") == 0)
\r
2381 else if(strcmp(&Tmp[1], "-protect-high") == 0)
\r
2384 else if(strcmp(&Tmp[1], "-protect-medium") == 0)
\r
2387 else if(strcmp(&Tmp[1], "-protect-low") == 0)
\r
2392 else if((strcmp(&Tmp[1], "sj") == 0) || (strcmp(&Tmp[1], "-sjis") == 0))
\r
2393 *CmdOption |= OPT_SJIS;
\r
2394 else if((strcmp(&Tmp[1], "u8") == 0) || (strcmp(&Tmp[1], "-utf8") == 0))
\r
2395 *CmdOption |= OPT_UTF8N;
\r
2396 else if((strcmp(&Tmp[1], "8b") == 0) || (strcmp(&Tmp[1], "-utf8bom") == 0))
\r
2397 *CmdOption |= OPT_UTF8BOM;
\r
2398 else if((strcmp(&Tmp[1], "sjn") == 0) || (strcmp(&Tmp[1], "-sjisname") == 0))
\r
2399 *CmdOption |= OPT_SJIS_NAME;
\r
2400 else if((strcmp(&Tmp[1], "u8n") == 0) || (strcmp(&Tmp[1], "-utf8name") == 0))
\r
2401 *CmdOption |= OPT_UTF8N_NAME;
\r
2403 else if(strcmp(&Tmp[1], "-build-software-update") == 0)
\r
2405 for(i = 0; i < 6; i++)
\r
2407 if((Str = GetToken(Str, Tmp)) == NULL)
\r
2414 else if(strcmp(&Tmp[1], "-software-update") == 0)
\r
2416 if((Str = GetToken(Str, Tmp)) == NULL)
\r
2421 else if(strcmp(&Tmp[1], "-software-cleanup") == 0)
\r
2423 if((Str = GetToken(Str, Tmp)) == NULL)
\r
2430 SetTaskMsg(MSGJPN180, Tmp);
\r
2438 strncpy(unc, Tmp, Max);
\r
2443 SetTaskMsg(MSGJPN181);
\r
2452 /*----- INIファイルのパス名の指定をチェック ------------------------------------
\r
2455 * char *Str : コマンドライン文字列
\r
2456 * char *Ini : iniファイル名を返すワーク
\r
2464 *----------------------------------------------------------------------------*/
\r
2466 static int CheckIniFileName(char *Str, char *Ini)
\r
2468 return GetTokenAfterOption( Str, Ini, "n", "-ini" );
\r
2471 /* マスターパスワードの指定をチェック */
\r
2472 static int CheckMasterPassword(char *Str, char *Ini)
\r
2474 return GetTokenAfterOption( Str, Ini, "z", "-mpasswd" );
\r
2477 /*----- オプションの後ろのトークンを取り出す ------------------------------------
\r
2480 * char *Str : コマンドライン文字列
\r
2481 * char *Result : 取り出した文字列を格納するワーク
\r
2482 * const char* Opt1, *Opt2: オプション文字列(2つ)
\r
2489 * 2010.01.30 genta マスターパスワード取り出しのため共通化
\r
2490 *----------------------------------------------------------------------------*/
\r
2491 static int GetTokenAfterOption(char *Str, char *Result, const char* Opt1, const char* Opt2 )
\r
2494 char Tmp[FMAX_PATH+1];
\r
2497 while((Str = GetToken(Str, Tmp)) != NULL)
\r
2502 if((strcmp(&Tmp[1], Opt1) == 0) || (strcmp(&Tmp[1], Opt2) == 0))
\r
2504 if((Str = GetToken(Str, Result)) != NULL)
\r
2513 /*----- トークンを返す --------------------------------------------------------
\r
2517 * char *Buf : 文字列を返すバッファ
\r
2520 * char *返したトークンの末尾
\r
2522 *----------------------------------------------------------------------------*/
\r
2524 static char *GetToken(char *Str, char *Buf)
\r
2528 while(*Str != NUL)
\r
2530 if((*Str != ' ') && (*Str != '\t'))
\r
2538 while(*Str != NUL)
\r
2541 InQuote = !InQuote;
\r
2544 if(((*Str == ' ') || (*Str == '\t')) &&
\r
2563 /*----- プログラム終了時の処理 ------------------------------------------------
\r
2566 * HWND hWnd : ウインドウハンドル
\r
2570 *----------------------------------------------------------------------------*/
\r
2572 static void ExitProc(HWND hWnd)
\r
2575 char Tmp[FMAX_PATH+1];
\r
2582 CloseTransferThread();
\r
2584 if(SaveExit == YES)
\r
2587 SaveCurrentSetToHost();
\r
2589 DeleteAlltempFile();
\r
2591 // WSACancelBlockingCall();
\r
2593 // CloseTransferThread();
\r
2595 if(SaveExit == YES)
\r
2597 GetListTabWidth();
\r
2600 if(RegType == REGTYPE_REG)
\r
2603 if((CacheEntry > 0) && (CacheSave == YES))
\r
2612 GetAppTempPath(Tmp);
\r
2614 strcat(Tmp, "file");
\r
2616 GetAppTempPath(Tmp);
\r
2619 if(RasClose == YES)
\r
2621 DisconnectRas(RasCloseNotify);
\r
2623 DeleteAllObject();
\r
2624 HtmlHelp(NULL, NULL, HH_UNINITIALIZE, dwCookie);
\r
2629 /*----- ファイル名をダブルクリックしたときの処理 ------------------------------
\r
2632 * int Win : ウインドウ番号 (WIN_xxx)
\r
2633 * int Mode : 常に「開く」動作をするかどうか (YES/NO)
\r
2634 * int App : アプリケーション番号(-1=関連づけ優先)
\r
2638 *----------------------------------------------------------------------------*/
\r
2640 void DoubleClickProc(int Win, int Mode, int App)
\r
2644 char Local[FMAX_PATH+1];
\r
2645 char Remote[FMAX_PATH+1];
\r
2646 char Tmp[FMAX_PATH+1];
\r
2648 int UseDiffViewer;
\r
2650 if(AskUserOpeDisabled() == NO)
\r
2652 SetCurrentDirAsDirHist();
\r
2653 if(GetSelectedCount(Win) == 1)
\r
2655 if((Pos = GetFirstSelected(Win, NO)) != -1)
\r
2657 GetNodeName(Win, Pos, Tmp, FMAX_PATH);
\r
2658 Type = GetNodeType(Win, Pos);
\r
2660 if(Win == WIN_LOCAL)
\r
2663 // if((App != -1) || (Type == NODE_FILE))
\r
2664 if((App != -1) || (Type == NODE_FILE) || (Mode == YES))
\r
2666 if((DclickOpen == YES) || (Mode == YES))
\r
2668 AskLocalCurDir(Local, FMAX_PATH);
\r
2669 ReplaceAll(Local, '/', '\\');
\r
2670 SetYenTail(Local);
\r
2671 strcat(Local, Tmp);
\r
2672 ExecViewer(Local, App);
\r
2675 PostMessage(hWndFtp, WM_COMMAND, MAKEWPARAM(MENU_UPLOAD, 0), 0);
\r
2678 ChangeDir(WIN_LOCAL, Tmp);
\r
2680 else if(CheckClosedAndReconnect() == FFFTP_SUCCESS)
\r
2682 if((App != -1) || (Type == NODE_FILE))
\r
2684 if((DclickOpen == YES) || (Mode == YES))
\r
2686 // ビューワ2、3のパスが "d " で始まっていたら差分ビューア使用
\r
2687 if ((App == 1 || App == 2) && strncmp(ViewerName[App], "d ", 2) == 0)
\r
2688 UseDiffViewer = YES;
\r
2690 UseDiffViewer = NO;
\r
2692 strcpy(Remote, TmpPath);
\r
2693 SetYenTail(Remote);
\r
2695 strcat(Remote, "file");
\r
2697 SetYenTail(Remote);
\r
2698 if (UseDiffViewer == YES) {
\r
2699 strcat(Remote, "remote.");
\r
2701 strcat(Remote, Tmp);
\r
2703 if(AskTransferNow() == YES)
\r
2706 // MainTransPkt.ctrl_skt = AskCmdCtrlSkt();
\r
2707 strcpy(MainTransPkt.Cmd, "RETR ");
\r
2708 if(AskHostType() == HTYPE_ACOS)
\r
2710 strcpy(MainTransPkt.RemoteFile, "'");
\r
2711 strcat(MainTransPkt.RemoteFile, AskHostLsName());
\r
2712 strcat(MainTransPkt.RemoteFile, "(");
\r
2713 strcat(MainTransPkt.RemoteFile, Tmp);
\r
2714 strcat(MainTransPkt.RemoteFile, ")");
\r
2715 strcat(MainTransPkt.RemoteFile, "'");
\r
2717 else if(AskHostType() == HTYPE_ACOS_4)
\r
2719 strcpy(MainTransPkt.RemoteFile, Tmp);
\r
2723 strcpy(MainTransPkt.RemoteFile, Tmp);
\r
2725 strcpy(MainTransPkt.LocalFile, Remote);
\r
2726 MainTransPkt.Type = AskTransferTypeAssoc(MainTransPkt.RemoteFile, AskTransferType());
\r
2727 MainTransPkt.Size = 1;
\r
2728 MainTransPkt.KanjiCode = AskHostKanjiCode();
\r
2729 MainTransPkt.KanjiCodeDesired = AskLocalKanjiCode();
\r
2730 MainTransPkt.KanaCnv = AskHostKanaCnv();
\r
2731 MainTransPkt.Mode = EXIST_OVW;
\r
2733 MainTransPkt.NoTransfer = NO;
\r
2734 MainTransPkt.ExistSize = 0;
\r
2735 MainTransPkt.hWndTrans = NULL;
\r
2736 MainTransPkt.Next = NULL;
\r
2741 if(CheckPathViolation(&MainTransPkt) == NO)
\r
2743 // if((Sts = DoDownload(AskCmdCtrlSkt(), &MainTransPkt, NO)) == 429)
\r
2745 // ReConnectCmdSkt();
\r
2748 Sts = DoDownload(AskCmdCtrlSkt(), &MainTransPkt, NO, &CancelFlg);
\r
2754 AddTempFileList(Remote);
\r
2755 if(Sts/100 == FTP_COMPLETE) {
\r
2756 if (UseDiffViewer == YES) {
\r
2757 AskLocalCurDir(Local, FMAX_PATH);
\r
2758 ReplaceAll(Local, '/', '\\');
\r
2759 SetYenTail(Local);
\r
2760 strcat(Local, Tmp);
\r
2761 ExecViewer2(Local, Remote, App);
\r
2763 ExecViewer(Remote, App);
\r
2768 PostMessage(hWndFtp, WM_COMMAND, MAKEWPARAM(MENU_DOWNLOAD, 0), 0);
\r
2771 ChangeDir(WIN_REMOTE, Tmp);
\r
2775 MakeButtonsFocus();
\r
2781 /*----- フォルダの移動 --------------------------------------------------------
\r
2784 * int Win : ウインドウ番号 (WIN_xxx)
\r
2785 * char *Path : 移動先のパス名
\r
2792 *----------------------------------------------------------------------------*/
\r
2794 static void ChangeDir(int Win, char *Path)
\r
2797 char Local[FMAX_PATH+1];
\r
2798 char Remote[FMAX_PATH+1];
\r
2805 Sync = AskSyncMoveMode();
\r
2808 if(strcmp(Path, "..") == 0)
\r
2810 AskLocalCurDir(Local, FMAX_PATH);
\r
2811 AskRemoteCurDir(Remote, FMAX_PATH);
\r
2812 if(strcmp(GetFileName(Local), GetFileName(Remote)) != 0)
\r
2817 if((Win == WIN_LOCAL) || (Sync == YES))
\r
2819 if(DoLocalCWD(Path) == FFFTP_SUCCESS)
\r
2820 GetLocalDirForWnd();
\r
2823 if((Win == WIN_REMOTE) || (Sync == YES))
\r
2825 if(CheckClosedAndReconnect() == FFFTP_SUCCESS)
\r
2827 #if defined(HAVE_OPENVMS)
\r
2828 /* OpenVMSの場合、".DIR;?"を取る */
\r
2829 if (AskHostType() == HTYPE_VMS)
\r
2830 ReformVMSDirName(Path, TRUE);
\r
2832 if(DoCWD(Path, YES, NO, YES) < FTP_RETRY)
\r
2833 GetRemoteDirForWnd(CACHE_NORMAL, &CancelFlg);
\r
2842 /*----- ウインドウのサイズ変更の処理 ------------------------------------------
\r
2849 *----------------------------------------------------------------------------*/
\r
2851 static void ResizeWindowProc(void)
\r
2857 GetClientRect(hWndFtp, &Rect);
\r
2858 SendMessage(GetSbarWnd(), WM_SIZE, SIZE_RESTORED, MAKELPARAM(Rect.right, Rect.bottom));
\r
2861 SetWindowPos(GetMainTbarWnd(), 0, 0, 0, WinWidth, TOOLWIN_HEIGHT, SWP_NOACTIVATE | SWP_NOZORDER);
\r
2863 SetWindowPos(GetLocalTbarWnd(), 0, 0, TOOLWIN_HEIGHT, LocalWidth, TOOLWIN_HEIGHT, SWP_NOACTIVATE | SWP_NOZORDER);
\r
2864 SendMessage(GetLocalTbarWnd(), TB_GETITEMRECT, 3, (LPARAM)&Rect);
\r
2865 SetWindowPos(GetLocalHistHwnd(), 0, Rect.right, Rect.top, LocalWidth - Rect.right, 200, SWP_NOACTIVATE | SWP_NOZORDER);
\r
2866 SetWindowPos(GetLocalHwnd(), 0, 0, TOOLWIN_HEIGHT*2, LocalWidth, ListHeight, SWP_NOACTIVATE | SWP_NOZORDER);
\r
2868 RemotePosX = LocalWidth + SepaWidth;
\r
2869 if(SplitVertical == YES)
\r
2872 SetWindowPos(GetRemoteTbarWnd(), 0, RemotePosX, TOOLWIN_HEIGHT, RemoteWidth, TOOLWIN_HEIGHT, SWP_NOACTIVATE | SWP_NOZORDER);
\r
2873 SendMessage(GetRemoteTbarWnd(), TB_GETITEMRECT, 3, (LPARAM)&Rect);
\r
2874 SetWindowPos(GetRemoteHistHwnd(), 0, Rect.right, Rect.top, RemoteWidth - Rect.right, 200, SWP_NOACTIVATE | SWP_NOZORDER);
\r
2875 SetWindowPos(GetRemoteHwnd(), 0, RemotePosX, TOOLWIN_HEIGHT*2, RemoteWidth, ListHeight, SWP_NOACTIVATE | SWP_NOZORDER);
\r
2877 SetWindowPos(GetTaskWnd(), 0, 0, TOOLWIN_HEIGHT*2+ListHeight+SepaWidth, ClientWidth, TaskHeight, SWP_NOACTIVATE | SWP_NOZORDER);
\r
2881 GetClientRect(hWndFtp, &Rect);
\r
2882 SendMessage(GetSbarWnd(), WM_SIZE, SIZE_RESTORED, MAKELPARAM(Rect.right, Rect.bottom));
\r
2886 // SetWindowPos(GetMainTbarWnd(), 0, 0, 0, Rect.right, TOOLWIN_HEIGHT, SWP_NOACTIVATE | SWP_NOZORDER);
\r
2887 // SetWindowPos(GetLocalTbarWnd(), 0, 0, TOOLWIN_HEIGHT, LocalWidth, TOOLWIN_HEIGHT, SWP_NOACTIVATE | SWP_NOZORDER);
\r
2888 // SetWindowPos(GetRemoteTbarWnd(), 0, LocalWidth + SepaWidth, TOOLWIN_HEIGHT, RemoteWidth, TOOLWIN_HEIGHT, SWP_NOACTIVATE | SWP_NOZORDER);
\r
2889 SetWindowPos(GetMainTbarWnd(), 0, 0, 0, Rect.right, AskToolWinHeight(), SWP_NOACTIVATE | SWP_NOZORDER);
\r
2890 SetWindowPos(GetLocalTbarWnd(), 0, 0, AskToolWinHeight(), LocalWidth, AskToolWinHeight(), SWP_NOACTIVATE | SWP_NOZORDER);
\r
2891 SetWindowPos(GetRemoteTbarWnd(), 0, LocalWidth + SepaWidth, AskToolWinHeight(), RemoteWidth, AskToolWinHeight(), SWP_NOACTIVATE | SWP_NOZORDER);
\r
2892 SendMessage(GetLocalTbarWnd(), TB_GETITEMRECT, 3, (LPARAM)&Rect);
\r
2893 SetWindowPos(GetLocalHistHwnd(), 0, Rect.right, Rect.top, LocalWidth - Rect.right, 200, SWP_NOACTIVATE | SWP_NOZORDER);
\r
2894 SendMessage(GetRemoteTbarWnd(), TB_GETITEMRECT, 3, (LPARAM)&Rect);
\r
2895 SetWindowPos(GetRemoteHistHwnd(), 0, Rect.right, Rect.top, RemoteWidth - Rect.right, 200, SWP_NOACTIVATE | SWP_NOZORDER);
\r
2897 // SetWindowPos(GetLocalHwnd(), 0, 0, TOOLWIN_HEIGHT*2, LocalWidth, ListHeight, SWP_NOACTIVATE | SWP_NOZORDER);
\r
2898 // SetWindowPos(GetRemoteHwnd(), 0, LocalWidth + SepaWidth, TOOLWIN_HEIGHT*2, RemoteWidth, ListHeight, SWP_NOACTIVATE | SWP_NOZORDER);
\r
2899 // SetWindowPos(GetTaskWnd(), 0, 0, TOOLWIN_HEIGHT*2+ListHeight+SepaWidth, ClientWidth, TaskHeight, SWP_NOACTIVATE | SWP_NOZORDER);
\r
2900 SetWindowPos(GetLocalHwnd(), 0, 0, AskToolWinHeight()*2, LocalWidth, ListHeight, SWP_NOACTIVATE | SWP_NOZORDER);
\r
2901 SetWindowPos(GetRemoteHwnd(), 0, LocalWidth + SepaWidth, AskToolWinHeight()*2, RemoteWidth, ListHeight, SWP_NOACTIVATE | SWP_NOZORDER);
\r
2902 SetWindowPos(GetTaskWnd(), 0, 0, AskToolWinHeight()*2+ListHeight+SepaWidth, ClientWidth, TaskHeight, SWP_NOACTIVATE | SWP_NOZORDER);
\r
2909 /*----- ウインドウの各部分のサイズを計算する ----------------------------------
\r
2916 *----------------------------------------------------------------------------*/
\r
2918 static void CalcWinSize(void)
\r
2922 GetWindowRect(hWndFtp, &Rect);
\r
2924 if(Sizing != SW_MAXIMIZE)
\r
2926 WinWidth = Rect.right - Rect.left;
\r
2927 WinHeight = Rect.bottom - Rect.top;
\r
2930 GetClientRect(hWndFtp, &Rect);
\r
2932 ClientWidth = Rect.right;
\r
2933 ClientHeight = Rect.bottom;
\r
2936 LocalWidth = max1(0, min1(LocalWidth, ClientWidth - SepaWidth));
\r
2937 RemoteWidth = max1(0, ClientWidth - LocalWidth - SepaWidth);
\r
2938 // TaskHeight = min1(TaskHeight, max1(0, ClientHeight - TOOLWIN_HEIGHT * 2 - SepaWidth));
\r
2940 GetClientRect(GetSbarWnd(), &Rect);
\r
2943 // ListHeight = max1(0, ClientHeight - TOOLWIN_HEIGHT * 2 - TaskHeight - SepaWidth - Rect.bottom);
\r
2944 ListHeight = max1(0, ClientHeight - AskToolWinHeight() * 2 - TaskHeight - SepaWidth - Rect.bottom);
\r
2951 /*----- ウインドウの表示位置を取得する ----------------------------------------
\r
2954 * HWND hWnd : ウインドウハンドル
\r
2958 *----------------------------------------------------------------------------*/
\r
2960 static void AskWindowPos(HWND hWnd)
\r
2962 WINDOWPLACEMENT WinPlace;
\r
2964 WinPlace.length = sizeof(WINDOWPLACEMENT);
\r
2965 GetWindowPlacement(hWnd, &WinPlace);
\r
2966 WinPosX = WinPlace.rcNormalPosition.left;
\r
2967 WinPosY = WinPlace.rcNormalPosition.top;
\r
2974 /*----- ディレクトリリストとファイルリストの境界変更処理 ----------------------
\r
2977 * WPARAM Keys : WM_MOUSEMOVEなどのWPARAMの値
\r
2978 * int x : マウスカーソルのX座標
\r
2979 * int y : マウスカーソルのY座標
\r
2983 *----------------------------------------------------------------------------*/
\r
2985 static void CheckResizeFrame(WPARAM Keys, int x, int y)
\r
2990 if((Resizing == RESIZE_OFF) && (Keys == 0))
\r
2993 // if((x >= LocalWidth) && (x <= LocalWidth + SepaWidth) &&
\r
2994 // (y > TOOLWIN_HEIGHT) && (y < (TOOLWIN_HEIGHT * 2 + ListHeight)))
\r
2995 if((x >= LocalWidth) && (x <= LocalWidth + SepaWidth) &&
\r
2996 (y > AskToolWinHeight()) && (y < (AskToolWinHeight() * 2 + ListHeight)))
\r
2998 /* 境界位置変更用カーソルに変更 */
\r
2999 SetCapture(hWndFtp);
\r
3000 hCursor = LoadCursor(hInstFtp, MAKEINTRESOURCE(resize_lr_csr));
\r
3001 SetCursor(hCursor);
\r
3002 Resizing = RESIZE_PREPARE;
\r
3003 ResizePos = RESIZE_HPOS;
\r
3006 // else if((y >= TOOLWIN_HEIGHT*2+ListHeight) && (y <= TOOLWIN_HEIGHT*2+ListHeight+SepaWidth))
\r
3007 else if((y >= AskToolWinHeight()*2+ListHeight) && (y <= AskToolWinHeight()*2+ListHeight+SepaWidth))
\r
3009 /* 境界位置変更用カーソルに変更 */
\r
3010 SetCapture(hWndFtp);
\r
3011 hCursor = LoadCursor(hInstFtp, MAKEINTRESOURCE(resize_ud_csr));
\r
3012 SetCursor(hCursor);
\r
3013 Resizing = RESIZE_PREPARE;
\r
3014 ResizePos = RESIZE_VPOS;
\r
3017 else if(Resizing == RESIZE_PREPARE)
\r
3019 if(Keys & MK_LBUTTON)
\r
3022 Resizing = RESIZE_ON;
\r
3023 GetWindowRect(hWndFtp, &Rect);
\r
3024 GetClientRect(GetSbarWnd(), &Rect1);
\r
3025 Rect.left += GetSystemMetrics(SM_CXFRAME);
\r
3026 Rect.right -= GetSystemMetrics(SM_CXFRAME);
\r
3028 // Rect.top += TOOLWIN_HEIGHT*2 + GetSystemMetrics(SM_CYMENU) + GetSystemMetrics(SM_CYCAPTION) + GetSystemMetrics(SM_CYFRAME);
\r
3029 Rect.top += AskToolWinHeight()*2 + GetSystemMetrics(SM_CYMENU) + GetSystemMetrics(SM_CYCAPTION) + GetSystemMetrics(SM_CYFRAME);
\r
3030 Rect.bottom -= GetSystemMetrics(SM_CYFRAME) + Rect1.bottom;
\r
3031 ClipCursor(&Rect);
\r
3036 // if(((ResizePos == RESIZE_HPOS) &&
\r
3037 // ((x < LocalWidth) || (x > LocalWidth + SepaWidth) ||
\r
3038 // (y <= TOOLWIN_HEIGHT) || (y >= (TOOLWIN_HEIGHT * 2 + ListHeight)))) ||
\r
3039 // ((ResizePos == RESIZE_VPOS) &&
\r
3040 // ((y < TOOLWIN_HEIGHT*2+ListHeight) || (y > TOOLWIN_HEIGHT*2+ListHeight+SepaWidth))))
\r
3041 if(((ResizePos == RESIZE_HPOS) &&
\r
3042 ((x < LocalWidth) || (x > LocalWidth + SepaWidth) ||
\r
3043 (y <= AskToolWinHeight()) || (y >= (AskToolWinHeight() * 2 + ListHeight)))) ||
\r
3044 ((ResizePos == RESIZE_VPOS) &&
\r
3045 ((y < AskToolWinHeight()*2+ListHeight) || (y > AskToolWinHeight()*2+ListHeight+SepaWidth))))
\r
3049 hCursor = LoadCursor(NULL, IDC_ARROW);
\r
3050 SetCursor(hCursor);
\r
3051 Resizing = RESIZE_OFF;
\r
3055 else if(Resizing == RESIZE_ON)
\r
3057 if(ResizePos == RESIZE_HPOS)
\r
3061 GetClientRect(hWndFtp, &Rect);
\r
3062 GetClientRect(GetSbarWnd(), &Rect1);
\r
3063 TaskHeight = max1(0, Rect.bottom - y - Rect1.bottom);
\r
3065 ResizeWindowProc();
\r
3067 if((Keys & MK_LBUTTON) == 0)
\r
3072 hCursor = LoadCursor(NULL, IDC_ARROW);
\r
3073 SetCursor(hCursor);
\r
3074 Resizing = RESIZE_OFF;
\r
3081 /*----- ファイル一覧情報をビューワで表示 --------------------------------------
\r
3088 *----------------------------------------------------------------------------*/
\r
3090 static void DispDirInfo(void)
\r
3092 char Buf[FMAX_PATH+1];
\r
3094 MakeCacheFileName(AskCurrentFileListNum(), Buf);
\r
3095 ExecViewer(Buf, 0);
\r
3101 /*----- ビューワを起動 --------------------------------------------------------
\r
3104 * char Fname : ファイル名
\r
3105 * int App : アプリケーション番号(-1=関連づけ優先)
\r
3109 *----------------------------------------------------------------------------*/
\r
3111 void ExecViewer(char *Fname, int App)
\r
3113 PROCESS_INFORMATION Info;
\r
3114 STARTUPINFO Startup;
\r
3115 char AssocProg[FMAX_PATH+1];
\r
3116 char ComLine[FMAX_PATH*2+3+1];
\r
3117 char CurDir[FMAX_PATH+1];
\r
3118 // 任意のコードが実行されるバグ修正
\r
3119 char SysDir[FMAX_PATH+1];
\r
3121 /* FindExecutable()は関連付けられたプログラムのパス名にスペースが */
\r
3122 /* 含まれている時、間違ったパス名を返す事がある。 */
\r
3123 /* そこで、関連付けられたプログラムの起動はShellExecute()を使う。 */
\r
3125 AskLocalCurDir(CurDir, FMAX_PATH);
\r
3127 // 任意のコードが実行されるバグ修正
\r
3129 // if((App == -1) && (FindExecutable(Fname, NULL, AssocProg) > (HINSTANCE)32))
\r
3130 if((App == -1) && (strlen(GetFileExt(GetFileName(Fname))) > 0) && (FindExecutable(Fname, NULL, AssocProg) > (HINSTANCE)32))
\r
3132 DoPrintf("ShellExecute - %s", Fname);
\r
3133 ShellExecute(NULL, "open", Fname, NULL, CurDir, SW_SHOW);
\r
3136 else if((App == -1) && (GetFileAttributes(Fname) & FILE_ATTRIBUTE_DIRECTORY))
\r
3138 MakeDistinguishableFileName(ComLine, Fname);
\r
3139 DoPrintf("ShellExecute - %s", Fname);
\r
3140 ShellExecute(NULL, "open", ComLine, NULL, Fname, SW_SHOW);
\r
3144 App = max1(0, App);
\r
3145 strcpy(AssocProg, ViewerName[App]);
\r
3147 if(strchr(Fname, ' ') == NULL)
\r
3148 sprintf(ComLine, "%s %s", AssocProg, Fname);
\r
3150 sprintf(ComLine, "%s \"%s\"", AssocProg, Fname);
\r
3152 DoPrintf("FindExecutable - %s", ComLine);
\r
3154 memset(&Startup, NUL, sizeof(STARTUPINFO));
\r
3155 Startup.cb = sizeof(STARTUPINFO);
\r
3156 Startup.wShowWindow = SW_SHOW;
\r
3157 // 任意のコードが実行されるバグ修正
\r
3158 // if(CreateProcess(NULL, ComLine, NULL, NULL, FALSE, 0, NULL, NULL, &Startup, &Info) == FALSE)
\r
3160 // SetTaskMsg(MSGJPN182, GetLastError());
\r
3161 // SetTaskMsg(">>%s", ComLine);
\r
3163 if(GetCurrentDirectory(FMAX_PATH, CurDir) > 0)
\r
3165 if(GetSystemDirectory(SysDir, FMAX_PATH) > 0)
\r
3167 if(SetCurrentDirectory(SysDir))
\r
3169 if(CreateProcess(NULL, ComLine, NULL, NULL, FALSE, 0, NULL, NULL, &Startup, &Info) == FALSE)
\r
3171 SetTaskMsg(MSGJPN182, GetLastError());
\r
3172 SetTaskMsg(">>%s", ComLine);
\r
3174 SetCurrentDirectory(CurDir);
\r
3183 /*----- 差分表示ビューワを起動 ------------------------------------------------
\r
3186 * char Fname1 : ファイル名
\r
3187 * char Fname2 : ファイル名2
\r
3188 * int App : アプリケーション番号(2 or 3)
\r
3192 *----------------------------------------------------------------------------*/
\r
3194 void ExecViewer2(char *Fname1, char *Fname2, int App)
\r
3196 PROCESS_INFORMATION Info;
\r
3197 STARTUPINFO Startup;
\r
3198 char AssocProg[FMAX_PATH+1];
\r
3199 char ComLine[FMAX_PATH*2+3+1];
\r
3200 char CurDir[FMAX_PATH+1];
\r
3201 // 任意のコードが実行されるバグ修正
\r
3202 char SysDir[FMAX_PATH+1];
\r
3204 /* FindExecutable()は関連付けられたプログラムのパス名にスペースが */
\r
3205 /* 含まれている時、間違ったパス名を返す事がある。 */
\r
3206 /* そこで、関連付けられたプログラムの起動はShellExecute()を使う。 */
\r
3208 AskLocalCurDir(CurDir, FMAX_PATH);
\r
3210 strcpy(AssocProg, ViewerName[App] + 2); /* 先頭の "d " は読み飛ばす */
\r
3212 if(strchr(Fname1, ' ') == NULL && strchr(Fname2, ' ') == NULL)
\r
3213 sprintf(ComLine, "%s %s %s", AssocProg, Fname1, Fname2);
\r
3215 sprintf(ComLine, "%s \"%s\" \"%s\"", AssocProg, Fname1, Fname2);
\r
3217 DoPrintf("FindExecutable - %s", ComLine);
\r
3219 memset(&Startup, NUL, sizeof(STARTUPINFO));
\r
3220 Startup.cb = sizeof(STARTUPINFO);
\r
3221 Startup.wShowWindow = SW_SHOW;
\r
3222 // 任意のコードが実行されるバグ修正
\r
3223 // if(CreateProcess(NULL, ComLine, NULL, NULL, FALSE, 0, NULL, NULL, &Startup, &Info) == FALSE)
\r
3225 // SetTaskMsg(MSGJPN182, GetLastError());
\r
3226 // SetTaskMsg(">>%s", ComLine);
\r
3228 if(GetCurrentDirectory(FMAX_PATH, CurDir) > 0)
\r
3230 if(GetSystemDirectory(SysDir, FMAX_PATH) > 0)
\r
3232 if(SetCurrentDirectory(SysDir))
\r
3234 if(CreateProcess(NULL, ComLine, NULL, NULL, FALSE, 0, NULL, NULL, &Startup, &Info) == FALSE)
\r
3236 SetTaskMsg(MSGJPN182, GetLastError());
\r
3237 SetTaskMsg(">>%s", ComLine);
\r
3239 SetCurrentDirectory(CurDir);
\r
3248 /*----- テンポラリファイル名をテンポラリファイルリストに追加 ------------------
\r
3251 * char *Fname : テンポラリファイル名
\r
3255 *----------------------------------------------------------------------------*/
\r
3257 void AddTempFileList(char *Fname)
\r
3259 TEMPFILELIST *New;
\r
3261 if((New = malloc(sizeof(TEMPFILELIST))) != NULL)
\r
3263 if((New->Fname = malloc(strlen(Fname)+1)) != NULL)
\r
3265 strcpy(New->Fname, Fname);
\r
3266 if(TempFiles == NULL)
\r
3269 New->Next = TempFiles;
\r
3279 /*----- テンポラリファイルリストに登録されているファイルを全て削除 ------------
\r
3286 *----------------------------------------------------------------------------*/
\r
3288 static void DeleteAlltempFile(void)
\r
3290 TEMPFILELIST *Pos;
\r
3291 TEMPFILELIST *Next;
\r
3294 while(Pos != NULL)
\r
3296 DeleteFile(Pos->Fname);
\r
3304 // OLE D&Dのテンポラリを削除する (2007.9.11 yutaka)
\r
3305 doDeleteRemoteFile();
\r
3311 /*----- Aboutダイアログボックスのコールバック関数 ------------------------
\r
3314 * HWND hDlg : ウインドウハンドル
\r
3315 * UINT message : メッセージ番号
\r
3316 * WPARAM wParam : メッセージの WPARAM 引数
\r
3317 * LPARAM lParam : メッセージの LPARAM 引数
\r
3321 *----------------------------------------------------------------------------*/
\r
3324 //static BOOL CALLBACK AboutDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
\r
3325 static INT_PTR CALLBACK AboutDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
\r
3327 static char Tmp[80];
\r
3332 case WM_INITDIALOG :
\r
3333 Ver = GetJreVersion();
\r
3335 sprintf(Tmp, MSGJPN183);
\r
3337 sprintf(Tmp, MSGJPN184, Ver / 0x100, Ver % 0x100);
\r
3338 SendDlgItemMessage(hDlg, ABOUT_JRE, WM_SETTEXT, 0, (LPARAM)Tmp);
\r
3339 SendDlgItemMessage(hDlg, ABOUT_URL, EM_LIMITTEXT, 256, 0);
\r
3340 SendDlgItemMessage(hDlg, ABOUT_URL, WM_SETTEXT, 0, (LPARAM)MSGJPN284);
\r
3344 switch(GET_WM_COMMAND_ID(wParam, lParam))
\r
3348 EndDialog(hDlg, YES);
\r
3357 /*----- サウンドを鳴らす ------------------------------------------------------
\r
3360 * Int num : サウンドの種類 (SND_xxx)
\r
3364 *----------------------------------------------------------------------------*/
\r
3366 void SoundPlay(int Num)
\r
3368 if(Sound[Num].On == YES)
\r
3369 sndPlaySound(Sound[Num].Fname, SND_ASYNC | SND_NODEFAULT);
\r
3375 /*----- ヘルプファイルのパス名を返す ------------------------------------------
\r
3382 *----------------------------------------------------------------------------*/
\r
3384 char *AskHelpFilePath(void)
\r
3390 /*----- テンポラリファイルのパス名を返す --------------------------------------
\r
3397 *----------------------------------------------------------------------------*/
\r
3399 char *AskTmpFilePath(void)
\r
3405 /*----- INIファイルのパス名を返す ---------------------------------------------
\r
3412 *----------------------------------------------------------------------------*/
\r
3414 char *AskIniFilePath(void)
\r
3419 /*----- INIファイルのみを使うかどうかを返す -----------------------------------
\r
3425 * int ステータス : YES/NO
\r
3426 *----------------------------------------------------------------------------*/
\r
3428 int AskForceIni(void)
\r
3436 /*----- メッセージ処理 --------------------------------------------------------
\r
3442 * int 終了フラグ (YES=WM_CLOSEが来た/NO)
\r
3443 *----------------------------------------------------------------------------*/
\r
3445 int BackgrndMessageProc(void)
\r
3451 while(PeekMessage(&Msg, NULL, 0, 0, PM_REMOVE))
\r
3453 // マルチコアCPUの特定環境下でファイル通信中にクラッシュするバグ対策
\r
3454 // if(!HtmlHelp(NULL, NULL, HH_PRETRANSLATEMESSAGE, (DWORD)&Msg))
\r
3456 // if(!IsMainThread() || !HtmlHelp(NULL, NULL, HH_PRETRANSLATEMESSAGE, (DWORD)&Msg))
\r
3457 if(!IsMainThread() || !HtmlHelp(NULL, NULL, HH_PRETRANSLATEMESSAGE, (DWORD_PTR)&Msg))
\r
3459 /* ディレクトリ名の表示コンボボックスでBSやRETが効くように */
\r
3460 /* コンボボックス内ではアクセラレータを無効にする */
\r
3461 if((Msg.hwnd == GetLocalHistEditHwnd()) ||
\r
3462 (Msg.hwnd == GetRemoteHistEditHwnd()) ||
\r
3463 ((hHelpWin != NULL) && (Msg.hwnd == hHelpWin)) ||
\r
3464 GetHideUI() == YES ||
\r
3465 (TranslateAccelerator(GetMainHwnd(), Accel, &Msg) == 0))
\r
3467 if(Msg.message == WM_QUIT)
\r
3470 PostQuitMessage(0);
\r
3473 TranslateMessage(&Msg);
\r
3474 DispatchMessage(&Msg);
\r
3482 /*----- 自動終了フラグをクリアする --------------------------------------------
\r
3489 *----------------------------------------------------------------------------*/
\r
3491 void ResetAutoExitFlg(void)
\r
3498 /*----- 自動終了フラグを返す --------------------------------------------------
\r
3504 * int フラグ (YES/NO)
\r
3505 *----------------------------------------------------------------------------*/
\r
3507 int AskAutoExit(void)
\r
3512 /*----- ユーザにパスワードを入力させ,それを設定する -----------------------
\r
3518 * int : 0/ユーザキャンセル, 1/設定した, 2/デフォルト設定
\r
3519 *----------------------------------------------------------------------------*/
\r
3520 int EnterMasterPasswordAndSet( int Res, HWND hWnd )
\r
3522 char buf[MAX_PASSWORD_LEN + 1];
\r
3524 // 非表示にしたため新しいパスワードを2回入力させる
\r
3525 char buf1[MAX_PASSWORD_LEN + 1];
\r
3530 if( InputDialogBox(Res, hWnd, NULL, buf, MAX_PASSWORD_LEN + 1,
\r
3531 &Flag, IDH_HELP_TOPIC_0000064) == YES){
\r
3533 if(Res == newmasterpasswd_dlg)
\r
3536 if( InputDialogBox(Res, hWnd, NULL, buf1, MAX_PASSWORD_LEN + 1,
\r
3537 &Flag, IDH_HELP_TOPIC_0000064) != YES){
\r
3540 if(strcmp(buf, buf1) != 0)
\r
3542 MessageBox(hWnd, MSGJPN325, "FFFTP", MB_OK | MB_ICONERROR);
\r
3547 RemoveTailingSpaces(buf);
\r
3549 for( p = buf; *p == ' '; p++ )
\r
3552 if( p[0] != NUL ){
\r
3553 SetMasterPassword( p );
\r
3557 /* 空の場合はデフォルト値を設定 */
\r
3558 SetMasterPassword( NULL );
\r
3566 BOOL __stdcall SSLTimeoutCallback(BOOL* pbAborted)
\r
3569 if(BackgrndMessageProc() == YES)
\r
3571 if(*pbAborted == YES)
\r
3576 BOOL __stdcall SSLConfirmCallback(BOOL* pbAborted, BOOL bVerified, LPCSTR Certificate, LPCSTR CommonName)
\r
3584 sha_memory((char*)Certificate, (uint32)(strlen(Certificate) * sizeof(char)), (uint32*)&Hash);
\r
3585 // sha.cはビッグエンディアンのため
\r
3586 for(i = 0; i < 5; i++)
\r
3587 Hash[i] = _byteswap_ulong(Hash[i]);
\r
3589 while(i < MAX_CERT_CACHE_HASH)
\r
3591 if(memcmp(&CertificateCacheHash[i], &Hash, 20) == 0)
\r
3600 if(pm0 = AllocateStringM(strlen(Certificate) + 1024))
\r
3602 if(pm1 = AllocateStringM(strlen(Certificate) * 2 + 1024))
\r
3604 sprintf(pm0, MSGJPN326, IsHostNameMatched(AskHostAdrs(), CommonName) ? MSGJPN327 : MSGJPN328, bVerified ? MSGJPN327 : MSGJPN328, Certificate);
\r
3605 ReplaceAllStrings(pm1, pm0, "\n", "\r\n");
\r
3606 if(DialogBoxParam(GetFtpInst(), MAKEINTRESOURCE(ssl_confirm_dlg), GetMainHwnd(), ExeEscTextDialogProc, (LPARAM)pm1) == YES)
\r
3608 for(i = MAX_CERT_CACHE_HASH - 1; i >= 1; i--)
\r
3609 memcpy(&CertificateCacheHash[i], &CertificateCacheHash[i - 1], 20);
\r
3610 memcpy(&CertificateCacheHash[0], &Hash, 20);
\r
3613 FreeDuplicatedString(pm1);
\r
3615 FreeDuplicatedString(pm0);
\r
3623 BOOL LoadSSLRootCAFile()
\r
3632 if((hFile = CreateFile(SSLRootCAFilePath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL)) != INVALID_HANDLE_VALUE)
\r
3634 Size = GetFileSize(hFile, NULL);
\r
3635 if(pBuffer = (BYTE*)malloc(Size))
\r
3637 if(ReadFile(hFile, pBuffer, Size, &Size, NULL))
\r
3639 sha_memory((char*)pBuffer, (uint32)Size, (uint32*)&Hash);
\r
3640 // sha.cはビッグエンディアンのため
\r
3641 for(i = 0; i < 5; i++)
\r
3642 Hash[i] = _byteswap_ulong(Hash[i]);
\r
3643 if(memcmp(&Hash, &SSLRootCAFileHash, 20) == 0 || memcmp(&Hash, FILEHASH_SSL_PEM_SHA1, 20) == 0
\r
3644 || DialogBox(GetFtpInst(), MAKEINTRESOURCE(updatesslroot_dlg), GetMainHwnd(), ExeEscDialogProc) == YES)
\r
3646 memcpy(&SSLRootCAFileHash, &Hash, 20);
\r
3647 if(SetSSLRootCertificate(pBuffer, Size))
\r
3653 CloseHandle(hFile);
\r
3658 // マルチコアCPUの特定環境下でファイル通信中にクラッシュするバグ対策
\r
3659 BOOL IsMainThread()
\r
3661 if(GetCurrentThreadId() != MainThreadId)
\r
3667 void CheckPortableVersion()
\r
3670 if((hFile = CreateFile(PortableFilePath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL)) != INVALID_HANDLE_VALUE)
\r
3672 PortableVersion = YES;
\r
3673 CloseHandle(hFile);
\r
3676 PortableVersion = NO;
\r
3679 int AskPortableVersion(void)
\r
3681 return(PortableVersion);
\r
3688 char* CommandLine;
\r
3690 PROCESS_INFORMATION pi;
\r
3692 if(CommandLine = (char*)malloc(sizeof(char) * (strlen(GetCommandLine()) + 1)))
\r
3694 strcpy(CommandLine, GetCommandLine());
\r
3695 GetStartupInfo(&si);
\r
3696 if(CreateProcess(NULL, CommandLine, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))
\r
3698 CloseHandle(pi.hThread);
\r
3699 CloseHandle(pi.hProcess);
\r
3700 Sts = FFFTP_SUCCESS;
\r
3702 free(CommandLine);
\r
3713 int LoadTaskbarList3()
\r
3717 if(CoCreateInstance(&CLSID_TaskbarList, NULL, CLSCTX_ALL, &IID_ITaskbarList3, (void**)&pTaskbarList3) == S_OK)
\r
3719 Sts = FFFTP_SUCCESS;
\r
3724 void FreeTaskbarList3()
\r
3726 if(pTaskbarList3 != NULL)
\r
3727 pTaskbarList3->lpVtbl->Release(pTaskbarList3);
\r
3728 pTaskbarList3 = NULL;
\r
3731 int IsTaskbarList3Loaded()
\r
3735 if(pTaskbarList3 != NULL)
\r
3740 void UpdateTaskbarProgress()
\r
3742 if(AskTransferSizeTotal() > 0)
\r
3744 if(AskTransferErrorDisplay() > 0)
\r
3745 pTaskbarList3->lpVtbl->SetProgressState(pTaskbarList3, GetMainHwnd(), TBPF_ERROR);
\r
3747 pTaskbarList3->lpVtbl->SetProgressState(pTaskbarList3, GetMainHwnd(), TBPF_NORMAL);
\r
3748 pTaskbarList3->lpVtbl->SetProgressValue(pTaskbarList3, GetMainHwnd(), (ULONGLONG)(AskTransferSizeTotal() - AskTransferSizeLeft()), (ULONGLONG)AskTransferSizeTotal());
\r
3751 pTaskbarList3->lpVtbl->SetProgressState(pTaskbarList3, GetMainHwnd(), TBPF_NOPROGRESS);
\r
3755 int AskToolWinHeight(void)
\r
3757 return(ToolWinHeight);
\r
3765 } UPDATESOFTWAREDATA;
\r
3767 DWORD WINAPI UpdateSoftwareThreadProc(LPVOID lpParameter)
\r
3769 UPDATESOFTWAREDATA* pData;
\r
3770 pData = (UPDATESOFTWAREDATA*)lpParameter;
\r
3771 UpdateSoftware(NO, pData->NoError, pData->NoConfirm);
\r
3776 void UpdateSoftware(int Async, int NoError, int NoConfirm)
\r
3778 UPDATESOFTWAREDATA* pData;
\r
3780 char VersionString[32];
\r
3781 char Description[1024];
\r
3785 if(pData = malloc(sizeof(UPDATESOFTWAREDATA)))
\r
3787 pData->NoError = NoError;
\r
3788 pData->NoConfirm = NoConfirm;
\r
3789 CloseHandle(CreateThread(NULL, 0, UpdateSoftwareThreadProc, pData, 0, NULL));
\r
3794 // 念のためマスターパスワードの一致を確認
\r
3795 if(GetMasterPasswordStatus() == PASSWORD_OK)
\r
3797 Version = RELEASE_VERSION_NUM;
\r
3798 LastAutoCheckForUpdates = time(NULL);
\r
3799 if(CheckForUpdates(FALSE, NULL, &Version, VersionString, Description))
\r
3801 if(Version > RELEASE_VERSION_NUM)
\r
3803 sprintf(Tmp, MSGJPN361, VER_STR, VersionString, Description);
\r
3804 if(NoConfirm == YES || MessageBox(GetMainHwnd(), Tmp, "FFFTP", MB_YESNO) == IDYES)
\r
3806 strcpy(Tmp, TmpPath);
\r
3808 strcat(Tmp, "update");
\r
3810 if(CheckForUpdates(TRUE, Tmp, &Version, VersionString, Description))
\r
3812 MessageBox(GetMainHwnd(), MSGJPN364, "FFFTP", MB_OK);
\r
3813 ApplyUpdatesOnExit = YES;
\r
3815 else if(NoError == NO)
\r
3816 MessageBox(GetMainHwnd(), MSGJPN362, "FFFTP", MB_OK | MB_ICONERROR);
\r
3819 else if(NoError == NO)
\r
3820 MessageBox(GetMainHwnd(), MSGJPN363, "FFFTP", MB_OK);
\r
3822 else if(NoError == NO)
\r
3823 MessageBox(GetMainHwnd(), MSGJPN362, "FFFTP", MB_OK | MB_ICONERROR);
\r