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
31 #include <windows.h>
\r
35 #include <mbstring.h>
\r
37 #include <windowsx.h>
\r
38 #include <commctrl.h>
\r
40 #include <winsock.h>
\r
43 #include "resource.h"
\r
46 #include <htmlhelp.h>
\r
50 #undef __MBSWRAPPER_H__
\r
51 #include "mbswrapper.h"
\r
54 #define RESIZE_OFF 0 /* ウインドウの区切り位置変更していない */
\r
55 #define RESIZE_ON 1 /* ウインドウの区切り位置変更中 */
\r
56 #define RESIZE_PREPARE 2 /* ウインドウの区切り位置変更の準備 */
\r
58 #define RESIZE_HPOS 0 /* ローカル-ホスト間の区切り位置変更 */
\r
59 #define RESIZE_VPOS 1 /* リスト-タスク間の区切り位置の変更 */
\r
62 /*===== プロトタイプ =====*/
\r
64 static int InitApp(LPSTR lpszCmdLine, int cmdShow);
\r
65 static int MakeAllWindows(int cmdShow);
\r
66 static void DeleteAllObject(void);
\r
67 static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
\r
68 static void StartupProc(char *Cmd);
\r
69 static int AnalyzeComLine(char *Str, int *AutoConnect, int *CmdOption, char *unc, int Max);
\r
70 static int CheckIniFileName(char *Str, char *Ini);
\r
71 static int CheckMasterPassword(char *Str, char *Ini);
\r
72 static int GetTokenAfterOption(char *Str, char *Result, const char* Opt1, const char* Opt2 );
\r
73 static char *GetToken(char *Str, char *Buf);
\r
74 static void ExitProc(HWND hWnd);
\r
75 static void ChangeDir(int Win, char *Path);
\r
76 static void ResizeWindowProc(void);
\r
77 static void CalcWinSize(void);
\r
78 // static void AskWindowPos(HWND hWnd);
\r
79 static void CheckResizeFrame(WPARAM Keys, int x, int y);
\r
80 static void DispDirInfo(void);
\r
81 static void DeleteAlltempFile(void);
\r
82 static BOOL CALLBACK AboutDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
\r
83 static int EnterMasterPasswordAndSet( int Res, HWND hWnd );
\r
85 /*===== ローカルなワーク =====*/
\r
87 static const char FtpClassStr[] = "FFFTPWin";
\r
89 static HINSTANCE hInstFtp;
\r
90 static HWND hWndFtp = NULL;
\r
91 static HWND hWndCurFocus = NULL;
\r
93 static HACCEL Accel;
\r
94 static HBRUSH RootColorBrush = NULL;
\r
96 static int Resizing = RESIZE_OFF;
\r
97 static int ResizePos;
\r
98 static HCURSOR hCursor;
\r
101 static int ClientHeight;
\r
106 static TEMPFILELIST *TempFiles = NULL;
\r
108 static int SaveExit = YES;
\r
109 static int AutoExit = NO;
\r
111 static char HelpPath[FMAX_PATH+1];
\r
112 static char IniPath[FMAX_PATH+1];
\r
113 static int ForceIni = NO;
\r
115 TRANSPACKET MainTransPkt; /* ファイル転送用パケット */
\r
116 /* これを使って転送を行うと、ツールバーの転送 */
\r
119 char TitleHostName[HOST_ADRS_LEN+1];
\r
120 char FilterStr[FILTER_EXT_LEN+1] = { "*" };
\r
124 static int SuppressRefresh = 0;
\r
126 static DWORD dwCookie;
\r
129 /*===== グローバルなワーク =====*/
\r
131 HWND hHelpWin = NULL;
\r
134 int WinPosX = CW_USEDEFAULT;
\r
136 int WinWidth = 630;
\r
137 int WinHeight = 393;
\r
138 int LocalWidth = 309;
\r
139 int TaskHeight = 50;
\r
140 int LocalTabWidth[4] = { 120, 90, 60, 37 };
\r
141 int RemoteTabWidth[6] = { 120, 90, 60, 37, 60, 60 };
\r
142 char UserMailAdrs[USER_MAIL_LEN+1] = { "who@example.com" };
\r
143 char ViewerName[VIEWERS][FMAX_PATH+1] = { { "notepad" }, { "" }, { "" } };
\r
144 HFONT ListFont = NULL;
\r
145 LOGFONT ListLogFont;
\r
146 int LocalFileSort = SORT_NAME;
\r
147 int LocalDirSort = SORT_NAME;
\r
148 int RemoteFileSort = SORT_NAME;
\r
149 int RemoteDirSort = SORT_NAME;
\r
150 int TransMode = TYPE_X;
\r
151 int ConnectOnStart = YES;
\r
152 int DebugConsole = NO;
\r
153 int SaveWinPos = NO;
\r
154 char AsciiExt[ASCII_EXT_LEN+1] = { "*.txt\0*.html\0*.htm\0*.cgi\0*.pl\0" };
\r
155 int RecvMode = TRANS_DLG;
\r
156 int SendMode = TRANS_DLG;
\r
157 int MoveMode = MOVE_DLG;
\r
158 int ListType = LVS_REPORT;
\r
159 // LISTのキャッシュを無効にする(リモートのディレクトリの表示が更新されないバグ対策)
\r
160 //int CacheEntry = 10;
\r
161 int CacheEntry = -10;
\r
162 int CacheSave = NO;
\r
163 char DefaultLocalPath[FMAX_PATH+1] = { "" };
\r
164 int SaveTimeStamp = YES;
\r
167 int DclickOpen = YES;
\r
168 int ConnectAndSet = YES;
\r
169 SOUNDFILE Sound[SOUND_TYPES] = { { NO, "" }, { NO, "" }, { NO, "" } };
\r
170 int FnameCnv = FNAME_NOCNV;
\r
173 int RegType = REGTYPE_REG;
\r
174 char FwallHost[HOST_ADRS_LEN+1] = { "" };
\r
175 char FwallUser[USER_NAME_LEN+1] = { "" };
\r
176 char FwallPass[PASSWORD_LEN+1] = { "" };
\r
177 int FwallPort = PORT_NOR;
\r
179 int FwallDefault = NO;
\r
180 int FwallSecurity = SECURITY_AUTO;
\r
181 int FwallResolv = NO;
\r
182 int FwallLower = NO;
\r
183 int FwallDelimiter = '@';
\r
184 int PasvDefault = NO;
\r
185 char MirrorNoTrn[MIRROR_LEN+1] = { "*.bak\0" };
\r
186 char MirrorNoDel[MIRROR_LEN+1] = { "" };
\r
187 int MirrorFnameCnv = NO;
\r
188 int SplitVertical = YES;
\r
190 int RasCloseNotify = YES;
\r
192 char DefAttrList[DEFATTRLIST_LEN+1] = { "" };
\r
193 SIZE HostDlgSize = { -1, -1 };
\r
194 SIZE BmarkDlgSize = { -1, -1 };
\r
195 SIZE MirrorDlgSize = { -1, -1 };
\r
196 int Sizing = SW_RESTORE;
\r
198 char TmpPath[FMAX_PATH+1];
\r
199 int QuickAnonymous = YES;
\r
200 int PassToHist = YES;
\r
201 int VaxSemicolon = NO;
\r
203 int NoRasControl = NO;
\r
204 int SuppressSave = NO;
\r
205 int DispIgnoreHide = NO;
\r
206 int DispDrives = NO;
\r
207 int MirUpDelNotify = YES;
\r
208 int MirDownDelNotify = YES;
\r
209 int FolderAttr = NO;
\r
210 int FolderAttrNum = 777;
\r
212 int MaxThreadCount = 1;
\r
217 /*----- メインルーチン --------------------------------------------------------
\r
220 * HINSTANCE hInstance : このアプリケーションのこのインスタンスのハンドル
\r
221 * HINSTANCE hPrevInstance : このアプリケーションの直前のインスタンスのハンドル
\r
222 * LPSTR lpszCmdLine : アプリケーションが起動したときのコマンドラインをさすロングポインタ
\r
223 * int cmdShow : 最初に表示するウインドウの形式。
\r
226 * int 最後のメッセージのwParam
\r
227 *----------------------------------------------------------------------------*/
\r
229 int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int cmdShow)
\r
236 #ifdef ENABLE_PROCESS_PROTECTION
\r
239 char Option[FMAX_PATH+1];
\r
241 pCommand = lpszCmdLine;
\r
242 while(pCommand = GetToken(pCommand, Option))
\r
244 if(strcmp(Option, "--protect") == 0)
\r
252 if(!InitializeLoadLibraryHook())
\r
254 MessageBox(NULL, MSGJPN321, "FFFTP", MB_OK | MB_ICONERROR);
\r
258 if(IsDebuggerPresent())
\r
260 MessageBox(NULL, MSGJPN322, "FFFTP", MB_OK | MB_ICONERROR);
\r
264 if(!UnloadUntrustedModule())
\r
266 MessageBox(NULL, MSGJPN323, "FFFTP", MB_OK | MB_ICONERROR);
\r
270 if(RestartProtectedProcess(" --restart"))
\r
273 if(!EnableLoadLibraryHook(TRUE))
\r
275 MessageBox(NULL, MSGJPN324, "FFFTP", MB_OK | MB_ICONERROR);
\r
280 InitializeLoadLibraryHook();
\r
283 #ifdef DISABLE_MULTI_CPUS
\r
284 SetProcessAffinityMask(GetCurrentProcess(), 1);
\r
288 if(OleInitialize(NULL) != S_OK){
\r
289 MessageBox(NULL, MSGJPN298, "FFFTP", MB_OK | MB_ICONERROR);
\r
293 InitCommonControls();
\r
302 hInstFtp = hInstance;
\r
303 if(InitApp(lpszCmdLine, cmdShow) == FFFTP_SUCCESS)
\r
307 Sts = GetMessage(&Msg, NULL, 0, 0);
\r
308 if((Sts == 0) || (Sts == -1))
\r
311 if(!HtmlHelp(NULL, NULL, HH_PRETRANSLATEMESSAGE, (DWORD)&Msg))
\r
313 /* ディレクトリ名の表示コンボボックスでBSやRETが効くように */
\r
314 /* コンボボックス内ではアクセラレータを無効にする */
\r
315 if((Msg.hwnd == GetLocalHistEditHwnd()) ||
\r
316 (Msg.hwnd == GetRemoteHistEditHwnd()) ||
\r
317 ((hHelpWin != NULL) && (GetAncestor(Msg.hwnd, GA_ROOT) == hHelpWin)) ||
\r
318 GetHideUI() == YES ||
\r
319 (TranslateAccelerator(hWndFtp, Accel, &Msg) == 0))
\r
321 TranslateMessage(&Msg);
\r
322 DispatchMessage(&Msg);
\r
328 UnregisterClass(FtpClassStr, hInstFtp);
\r
338 /*----- アプリケーションの初期設定 --------------------------------------------
\r
341 * HINSTANCE hInstance : このアプリケーションのこのインスタンスのハンドル
\r
342 * HINSTANCE hPrevInstance : このアプリケーションの直前のインスタンスのハンドル
\r
343 * LPSTR lpszCmdLine : アプリケーションが起動したときのコマンドラインをさすロングポインタ
\r
344 * int cmdShow : 最初に表示するウインドウの形式。
\r
348 * FFFTP_SUCCESS/FFFTP_FAIL
\r
349 *----------------------------------------------------------------------------*/
\r
351 static int InitApp(LPSTR lpszCmdLine, int cmdShow)
\r
356 char PwdBuf[FMAX_PATH+1];
\r
357 int useDefautPassword = 0; /* 警告文表示用 */
\r
363 srand(GetTickCount());
\r
365 HtmlHelp(NULL, NULL, HH_INITIALIZE, (DWORD)&dwCookie);
\r
367 SaveUpdateBellInfo();
\r
369 if((Err = WSAStartup((WORD)0x0202, &WSAData)) != 0)
\r
370 MessageBox(NULL, ReturnWSError(Err), "FFFTP - Startup", MB_OK);
\r
373 Accel = LoadAccelerators(hInstFtp, MAKEINTRESOURCE(ffftp_accel));
\r
375 GetTempPath(FMAX_PATH, TmpPath);
\r
377 GetModuleFileName(NULL, HelpPath, FMAX_PATH);
\r
378 strcpy(GetFileName(HelpPath), "ffftp.chm");
\r
380 if(CheckIniFileName(lpszCmdLine, IniPath) == 0)
\r
382 GetModuleFileName(NULL, IniPath, FMAX_PATH);
\r
383 strcpy(GetFileName(IniPath), "ffftp.ini");
\r
388 RegType = REGTYPE_INI;
\r
393 /* 2010.02.01 genta マスターパスワードを入力させる
\r
394 -z オプションがあるときは最初だけスキップ
\r
395 -z オプションがないときは,デフォルトパスワードをまず試す
\r
397 パスワードが不一致なら再入力するか尋ねる.
\r
400 if( CheckMasterPassword(lpszCmdLine, PwdBuf))
\r
402 SetMasterPassword( PwdBuf );
\r
403 useDefautPassword = 0;
\r
407 SetMasterPassword( NULL );
\r
408 /* この場では表示できないのでフラグだけ立てておく*/
\r
409 useDefautPassword = 2;
\r
412 /* パスワードチェックのみ実施 */
\r
414 while( ValidateMasterPassword() == YES &&
\r
415 GetMasterPasswordStatus() == PASSWORD_UNMATCH ){
\r
417 if( useDefautPassword != 2 ){
\r
419 if( MessageBox(NULL, MSGJPN304, "FFFTP", MB_YESNO | MB_ICONEXCLAMATION) == IDNO ){
\r
420 useDefautPassword = 0; /* 不一致なので,もはやデフォルトかどうかは分からない */
\r
426 masterpass = EnterMasterPasswordAndSet(masterpasswd_dlg, NULL);
\r
427 if( masterpass == 2 ){
\r
428 useDefautPassword = 1;
\r
430 else if( masterpass == 0 ){
\r
435 useDefautPassword = 0;
\r
439 if(masterpass != 0)
\r
444 SetSSLTimeoutCallback(TimeOut * 1000, SSLTimeoutCallback);
\r
447 if(NoRasControl == NO)
\r
452 timeBeginPeriod(1);
\r
454 CountPrevFfftpWindows();
\r
456 if(MakeAllWindows(cmdShow) == FFFTP_SUCCESS)
\r
458 hWndCurFocus = GetLocalHwnd();
\r
460 if(strlen(DefaultLocalPath) > 0)
\r
461 SetCurrentDirectory(DefaultLocalPath);
\r
463 SetSortTypeImm(LocalFileSort, LocalDirSort, RemoteFileSort, RemoteDirSort);
\r
464 SetTransferTypeImm(TransMode);
\r
465 DispTransferType();
\r
466 SetHostKanaCnvImm(YES);
\r
467 SetHostKanjiCodeImm(KANJI_NOCNV);
\r
468 // 本当はローカルのデフォルトをUTF-8にしたいが旧バージョンとの互換性のためShift_JISに設定
\r
469 // SetLocalKanjiCodeImm(KANJI_UTF8N);
\r
470 SetLocalKanjiCodeImm(KANJI_SJIS);
\r
473 DispSyncMoveMode();
\r
475 MakeCacheBuf(CacheEntry);
\r
476 if(CacheSave == YES)
\r
479 if(MakeTransferThread() == FFFTP_SUCCESS)
\r
481 DoPrintf("DEBUG MESSAGE ON ! ##");
\r
484 // SourceForge.JPによるフォーク
\r
485 // SetTaskMsg("FFFTP Ver." VER_STR " Copyright(C) 1997-2010 Sota & cooperators.");
\r
486 SetTaskMsg("FFFTP Ver." VER_STR " Copyright(C) 1997-2010 Sota & cooperators.\r\nCopyright (C) 2011 Hiromichi Matsushima, Suguru Kawamoto.");
\r
489 SetTaskMsg("%s%s", MSGJPN283, IniPath);
\r
491 if(IsFolderExist(TmpPath) == NO)
\r
493 SetTaskMsg(MSGJPN152, TmpPath);
\r
494 GetTempPath(FMAX_PATH, TmpPath);
\r
495 SetTaskMsg(MSGJPN153, TmpPath);
\r
498 DoPrintf("Tmp =%s", TmpPath);
\r
499 DoPrintf("Help=%s", HelpPath);
\r
501 DragAcceptFiles(GetRemoteHwnd(), TRUE);
\r
502 DragAcceptFiles(GetLocalHwnd(), TRUE);
\r
504 SetAllHistoryToMenu();
\r
505 GetLocalDirForWnd();
\r
506 MakeButtonsFocus();
\r
507 DispTransferFiles();
\r
509 StartupProc(lpszCmdLine);
\r
510 sts = FFFTP_SUCCESS;
\r
513 if( useDefautPassword ){
\r
514 SetTaskMsg(MSGJPN300);
\r
517 /* パスワード不一致警告文の表示 */
\r
518 switch( GetMasterPasswordStatus() ){
\r
519 case PASSWORD_UNMATCH:
\r
520 SetTaskMsg(MSGJPN301);
\r
522 case BAD_PASSWORD_HASH:
\r
523 SetTaskMsg(MSGJPN302);
\r
535 if(IsOpenSSLLoaded())
\r
536 SetTaskMsg(MSGJPN318);
\r
538 SetTaskMsg(MSGJPN319);
\r
541 if(sts == FFFTP_FAIL)
\r
548 /*----- ウインドウを作成する --------------------------------------------------
\r
551 * int cmdShow : 最初に表示するウインドウの形式。
\r
555 * FFFTP_SUCCESS/FFFTP_FAIL
\r
556 *----------------------------------------------------------------------------*/
\r
558 static int MakeAllWindows(int cmdShow)
\r
571 /*===== メインウインドウ =====*/
\r
573 RootColorBrush = CreateSolidBrush(GetSysColor(COLOR_3DFACE));
\r
575 wClass.cbSize = sizeof(WNDCLASSEX);
\r
577 wClass.lpfnWndProc = FtpWndProc;
\r
578 wClass.cbClsExtra = 0;
\r
579 wClass.cbWndExtra = 0;
\r
580 wClass.hInstance = hInstFtp;
\r
581 wClass.hIcon = LoadIcon(hInstFtp, MAKEINTRESOURCE(ffftp));
\r
582 wClass.hCursor = NULL;
\r
583 wClass.hbrBackground = RootColorBrush;
\r
584 wClass.lpszMenuName = (LPSTR)MAKEINTRESOURCE(main_menu);
\r
585 wClass.lpszClassName = FtpClassStr;
\r
586 wClass.hIconSm = NULL;
\r
587 RegisterClassEx(&wClass);
\r
589 if(SaveWinPos == NO)
\r
591 WinPosX = CW_USEDEFAULT;
\r
595 // ユーザー定義のクラスはデフォルトのWNDPROCがShift_JIS専用のため
\r
596 // hWndFtp = CreateWindow(FtpClassStr, "FFFTP",
\r
597 // WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,
\r
598 // WinPosX, WinPosY, WinWidth, WinHeight,
\r
599 // HWND_DESKTOP, 0, hInstFtp, NULL);
\r
600 hWndFtp = CreateWindowA(FtpClassStr, "FFFTP",
\r
601 WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,
\r
602 WinPosX, WinPosY, WinWidth, WinHeight,
\r
603 HWND_DESKTOP, 0, hInstFtp, NULL);
\r
605 if(hWndFtp != NULL)
\r
607 SystemParametersInfo(SPI_GETWORKAREA, 0, &Rect1, 0);
\r
608 GetWindowRect(hWndFtp, &Rect2);
\r
609 if(Rect2.bottom > Rect1.bottom)
\r
611 Rect2.top = max1(0, Rect2.top - (Rect2.bottom - Rect1.bottom));
\r
612 MoveWindow(hWndFtp, Rect2.left, Rect2.top, WinWidth, WinHeight, FALSE);
\r
615 /*===== ステイタスバー =====*/
\r
617 StsSbar = MakeStatusBarWindow(hWndFtp, hInstFtp);
\r
621 /*===== ツールバー =====*/
\r
623 StsTbar = MakeToolBarWindow(hWndFtp, hInstFtp);
\r
625 /*===== ファイルリストウインドウ =====*/
\r
627 StsList = MakeListWin(hWndFtp, hInstFtp);
\r
629 /*==== タスクウインドウ ====*/
\r
631 StsTask = MakeTaskWindow(hWndFtp, hInstFtp);
\r
633 if((cmdShow != SW_MINIMIZE) && (cmdShow != SW_SHOWMINIMIZED) && (cmdShow != SW_SHOWMINNOACTIVE) &&
\r
634 (Sizing == SW_MAXIMIZE))
\r
635 cmdShow = SW_MAXIMIZE;
\r
637 ShowWindow(hWndFtp, cmdShow);
\r
639 /*==== ソケットウインドウ ====*/
\r
641 StsSocket = MakeSocketWin(hWndFtp, hInstFtp);
\r
643 StsLvtips = InitListViewTips(hWndFtp, hInstFtp);
\r
646 Sts = FFFTP_SUCCESS;
\r
647 if((hWndFtp == NULL) ||
\r
648 (StsTbar == FFFTP_FAIL) ||
\r
649 (StsList == FFFTP_FAIL) ||
\r
650 (StsSbar == FFFTP_FAIL) ||
\r
651 (StsTask == FFFTP_FAIL) ||
\r
652 (StsLvtips == FFFTP_FAIL) ||
\r
653 (StsSocket == FFFTP_FAIL))
\r
658 if(Sts == FFFTP_SUCCESS)
\r
665 /*----- ウインドウのタイトルを表示する ----------------------------------------
\r
672 *----------------------------------------------------------------------------*/
\r
674 void DispWindowTitle(void)
\r
676 char Tmp[HOST_ADRS_LEN+FILTER_EXT_LEN+20];
\r
678 if(AskConnecting() == YES)
\r
679 sprintf(Tmp, "%s (%s) - FFFTP", TitleHostName, FilterStr);
\r
681 sprintf(Tmp, "FFFTP (%s)", FilterStr);
\r
683 SetWindowText(GetMainHwnd(), Tmp);
\r
688 /*----- 全てのオブジェクトを削除 ----------------------------------------------
\r
695 *----------------------------------------------------------------------------*/
\r
697 static void DeleteAllObject(void)
\r
701 //move to WM_DESTROY
\r
705 // if(ListFont != NULL)
\r
706 // DeleteObject(ListFont);
\r
707 // if(RootColorBrush != NULL)
\r
708 // DeleteObject(RootColorBrush);
\r
711 // DeleteListViewTips();
\r
712 // DeleteListWin();
\r
713 // DeleteStatusBarWindow();
\r
714 // DeleteTaskWindow();
\r
715 // DeleteToolBarWindow();
\r
716 // DeleteSocketWin();
\r
718 //move to WM_DESTROY
\r
719 if(hWndFtp != NULL)
\r
720 DestroyWindow(hWndFtp);
\r
724 ReleaseKernelLib();
\r
730 /*----- メインウインドウのウインドウハンドルを返す ----------------------------
\r
737 *----------------------------------------------------------------------------*/
\r
739 HWND GetMainHwnd(void)
\r
745 /*----- 現在フォーカスがあるウインドウのウインドウハンドルを返す --------------
\r
752 *----------------------------------------------------------------------------*/
\r
754 HWND GetFocusHwnd(void)
\r
756 return(hWndCurFocus);
\r
760 /*----- 現在フォーカスがあるウインドウのをセットする --------------------------
\r
763 * HWND hWnd : ウインドウハンドル
\r
767 *----------------------------------------------------------------------------*/
\r
769 void SetFocusHwnd(HWND hWnd)
\r
771 hWndCurFocus = hWnd;
\r
776 /*----- プログラムのインスタンスを返す ----------------------------------------
\r
783 *----------------------------------------------------------------------------*/
\r
785 HINSTANCE GetFtpInst(void)
\r
791 /*----- メインウインドウのメッセージ処理 --------------------------------------
\r
794 * HWND hWnd : ウインドウハンドル
\r
795 * UINT message : メッセージ番号
\r
796 * WPARAM wParam : メッセージの WPARAM 引数
\r
797 * LPARAM lParam : メッセージの LPARAM 引数
\r
801 *----------------------------------------------------------------------------*/
\r
803 static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
\r
806 LPTOOLTIPTEXT lpttt;
\r
814 switch(LOWORD(wParam))
\r
816 case MENU_CONNECT :
\r
817 ConnectProc(DLG_TYPE_CON, -1);
\r
820 case MENU_CONNECT_NUM :
\r
821 ConnectProc(DLG_TYPE_CON, (int)lParam);
\r
822 if(AskConnecting() == YES)
\r
824 if(HIWORD(wParam) & OPT_MIRROR)
\r
826 if(HIWORD(wParam) & OPT_FORCE)
\r
827 MirrorUploadProc(NO);
\r
829 MirrorUploadProc(YES);
\r
831 else if(HIWORD(wParam) & OPT_MIRRORDOWN)
\r
833 if(HIWORD(wParam) & OPT_FORCE)
\r
834 MirrorDownloadProc(NO);
\r
836 MirrorDownloadProc(YES);
\r
841 case MENU_SET_CONNECT :
\r
842 ConnectProc(DLG_TYPE_SET, -1);
\r
846 QuickConnectProc();
\r
849 case MENU_DISCONNECT :
\r
850 if(AskTryingConnect() == YES)
\r
852 else if(AskConnecting() == YES)
\r
855 SaveCurrentSetToHost();
\r
869 case MENU_HIST_10 :
\r
870 case MENU_HIST_11 :
\r
871 case MENU_HIST_12 :
\r
872 case MENU_HIST_13 :
\r
873 case MENU_HIST_14 :
\r
874 case MENU_HIST_15 :
\r
875 case MENU_HIST_16 :
\r
876 case MENU_HIST_17 :
\r
877 case MENU_HIST_18 :
\r
878 case MENU_HIST_19 :
\r
879 case MENU_HIST_20 :
\r
880 HistoryConnectProc(LOWORD(wParam));
\r
884 if(hWndCurFocus == GetLocalHwnd())
\r
885 PostMessage(hWnd, WM_COMMAND, MAKEWPARAM(MENU_LOCAL_UPDIR, 0), 0);
\r
887 PostMessage(hWnd, WM_COMMAND, MAKEWPARAM(MENU_REMOTE_UPDIR, 0), 0);
\r
891 if(hWndCurFocus == GetLocalHwnd())
\r
892 DoubleClickProc(WIN_LOCAL, YES, -1);
\r
895 SuppressRefresh = 1;
\r
896 DoubleClickProc(WIN_REMOTE, YES, -1);
\r
897 SuppressRefresh = 0;
\r
902 if(hWndCurFocus == GetLocalHwnd())
\r
903 DoubleClickProc(WIN_LOCAL, YES, 0);
\r
906 SuppressRefresh = 1;
\r
907 DoubleClickProc(WIN_REMOTE, YES, 0);
\r
908 SuppressRefresh = 0;
\r
913 if(hWndCurFocus == GetLocalHwnd())
\r
914 DoubleClickProc(WIN_LOCAL, YES, 1);
\r
917 SuppressRefresh = 1;
\r
918 DoubleClickProc(WIN_REMOTE, YES, 1);
\r
919 SuppressRefresh = 0;
\r
924 if(hWndCurFocus == GetLocalHwnd())
\r
925 DoubleClickProc(WIN_LOCAL, YES, 2);
\r
928 SuppressRefresh = 1;
\r
929 DoubleClickProc(WIN_REMOTE, YES, 2);
\r
930 SuppressRefresh = 0;
\r
934 case MENU_REMOTE_UPDIR :
\r
935 SuppressRefresh = 1;
\r
936 SetCurrentDirAsDirHist();
\r
937 ChangeDir(WIN_REMOTE, "..");
\r
938 SuppressRefresh = 0;
\r
941 case MENU_LOCAL_UPDIR :
\r
942 SetCurrentDirAsDirHist();
\r
943 ChangeDir(WIN_LOCAL, "..");
\r
946 case MENU_REMOTE_CHDIR :
\r
947 SuppressRefresh = 1;
\r
948 SetCurrentDirAsDirHist();
\r
949 ChangeDirDirectProc(WIN_REMOTE);
\r
950 SuppressRefresh = 0;
\r
953 case MENU_LOCAL_CHDIR :
\r
954 SetCurrentDirAsDirHist();
\r
955 ChangeDirDirectProc(WIN_LOCAL);
\r
958 case MENU_DOWNLOAD :
\r
959 SetCurrentDirAsDirHist();
\r
960 DownLoadProc(NO, NO, NO);
\r
963 case MENU_DOWNLOAD_AS :
\r
964 SetCurrentDirAsDirHist();
\r
965 DownLoadProc(YES, NO, NO);
\r
968 case MENU_DOWNLOAD_AS_FILE :
\r
969 SetCurrentDirAsDirHist();
\r
970 DownLoadProc(NO, YES, NO);
\r
973 case MENU_DOWNLOAD_ALL :
\r
974 SetCurrentDirAsDirHist();
\r
975 DownLoadProc(NO, NO, YES);
\r
978 case MENU_DOWNLOAD_NAME :
\r
979 SetCurrentDirAsDirHist();
\r
980 InputDownLoadProc();
\r
984 SetCurrentDirAsDirHist();
\r
985 UpLoadListProc(NO, NO);
\r
988 case MENU_UPLOAD_AS :
\r
989 SetCurrentDirAsDirHist();
\r
990 UpLoadListProc(YES, NO);
\r
993 case MENU_UPLOAD_ALL :
\r
994 SetCurrentDirAsDirHist();
\r
995 UpLoadListProc(NO, YES);
\r
998 case MENU_MIRROR_UPLOAD :
\r
999 SetCurrentDirAsDirHist();
\r
1000 MirrorUploadProc(YES);
\r
1003 case MENU_MIRROR_DOWNLOAD :
\r
1004 SetCurrentDirAsDirHist();
\r
1005 MirrorDownloadProc(YES);
\r
1008 case MENU_FILESIZE :
\r
1009 SetCurrentDirAsDirHist();
\r
1010 CalcFileSizeProc();
\r
1013 case MENU_DELETE :
\r
1014 SuppressRefresh = 1;
\r
1015 SetCurrentDirAsDirHist();
\r
1017 SuppressRefresh = 0;
\r
1020 case MENU_RENAME :
\r
1021 SuppressRefresh = 1;
\r
1022 SetCurrentDirAsDirHist();
\r
1024 SuppressRefresh = 0;
\r
1028 SuppressRefresh = 1;
\r
1029 SetCurrentDirAsDirHist();
\r
1031 SuppressRefresh = 0;
\r
1035 SuppressRefresh = 1;
\r
1037 SuppressRefresh = 0;
\r
1040 case MENU_SOMECMD :
\r
1041 SuppressRefresh = 1;
\r
1043 SuppressRefresh = 0;
\r
1046 case MENU_OPTION :
\r
1048 if(ListFont != NULL)
\r
1050 SendMessage(GetLocalHwnd(), WM_SETFONT, (WPARAM)ListFont, MAKELPARAM(TRUE, 0));
\r
1051 SendMessage(GetRemoteHwnd(), WM_SETFONT, (WPARAM)ListFont, MAKELPARAM(TRUE, 0));
\r
1052 SendMessage(GetTaskWnd(), WM_SETFONT, (WPARAM)ListFont, MAKELPARAM(TRUE, 0));
\r
1054 GetLocalDirForWnd();
\r
1055 DispTransferType();
\r
1056 CheckHistoryNum(0);
\r
1057 SetAllHistoryToMenu();
\r
1059 SetSSLTimeoutCallback(TimeOut * 1000, SSLTimeoutCallback);
\r
1062 case MENU_FILTER :
\r
1063 SetFilter(&CancelFlg);
\r
1067 if(SortSetting() == YES)
\r
1069 LocalFileSort = AskSortType(ITEM_LFILE);
\r
1070 LocalDirSort = AskSortType(ITEM_LDIR);
\r
1071 RemoteFileSort = AskSortType(ITEM_RFILE);
\r
1072 RemoteDirSort = AskSortType(ITEM_RDIR);
\r
1073 ReSortDispList(WIN_LOCAL, &CancelFlg);
\r
1074 ReSortDispList(WIN_REMOTE, &CancelFlg);
\r
1079 PostMessage(hWnd, WM_CLOSE, 0, 0L);
\r
1082 case MENU_AUTO_EXIT :
\r
1083 if(AutoExit == YES)
\r
1084 PostMessage(hWnd, WM_CLOSE, 0, 0L);
\r
1088 DialogBox(hInstFtp, MAKEINTRESOURCE(about_dlg), hWnd, AboutDialogProc);
\r
1092 case MENU_BINARY :
\r
1094 SetTransferType(LOWORD(wParam));
\r
1095 DispTransferType();
\r
1098 case MENU_XFRMODE :
\r
1099 switch(AskTransferType())
\r
1102 TmpTransType = MENU_BINARY;
\r
1106 TmpTransType = MENU_AUTO;
\r
1110 TmpTransType = MENU_TEXT;
\r
1113 SetTransferType(TmpTransType);
\r
1114 DispTransferType();
\r
1118 case MENU_KNJ_SJIS :
\r
1119 case MENU_KNJ_EUC :
\r
1120 case MENU_KNJ_JIS :
\r
1121 case MENU_KNJ_UTF8N :
\r
1122 case MENU_KNJ_NONE :
\r
1123 SetHostKanjiCode(LOWORD(wParam));
\r
1126 case MENU_L_KNJ_SJIS :
\r
1127 case MENU_L_KNJ_EUC :
\r
1128 case MENU_L_KNJ_JIS :
\r
1129 case MENU_L_KNJ_UTF8N :
\r
1130 SetLocalKanjiCode(LOWORD(wParam));
\r
1133 case MENU_KANACNV :
\r
1137 case MENU_REFRESH :
\r
1138 SuppressRefresh = 1;
\r
1139 GetLocalDirForWnd();
\r
1140 if(CheckClosedAndReconnect() == FFFTP_SUCCESS)
\r
1141 GetRemoteDirForWnd(CACHE_REFRESH, &CancelFlg);
\r
1142 SuppressRefresh = 0;
\r
1146 ListType = LVS_LIST;
\r
1148 SetListViewType();
\r
1151 case MENU_REPORT :
\r
1152 ListType = LVS_REPORT;
\r
1154 SetListViewType();
\r
1157 case REFRESH_LOCAL :
\r
1158 GetLocalDirForWnd();
\r
1161 case REFRESH_REMOTE :
\r
1162 SuppressRefresh = 1;
\r
1163 if(CheckClosedAndReconnect() == FFFTP_SUCCESS)
\r
1164 GetRemoteDirForWnd(CACHE_REFRESH, &CancelFlg);
\r
1165 SuppressRefresh = 0;
\r
1168 case COMBO_LOCAL :
\r
1169 case COMBO_REMOTE :
\r
1170 SuppressRefresh = 1;
\r
1171 if(HIWORD(wParam) == CBN_SELCHANGE)
\r
1173 SetCurrentDirAsDirHist();
\r
1174 ChangeDirComboProc((HWND)lParam);
\r
1176 else if(HIWORD(wParam) != CBN_CLOSEUP)
\r
1178 MakeButtonsFocus();
\r
1179 SuppressRefresh = 0;
\r
1182 SuppressRefresh = 0;
\r
1186 hHelpWin = HtmlHelp(NULL, AskHelpFilePath(), HH_HELP_CONTEXT, IDH_HELP_TOPIC_0000001);
\r
1189 case MENU_HELP_TROUBLE :
\r
1190 ShellExecute(NULL, "open", MYWEB_URL, NULL, ".", SW_SHOW);
\r
1193 case MENU_BMARK_ADD :
\r
1194 AddCurDirToBookMark(WIN_REMOTE);
\r
1197 case MENU_BMARK_ADD_LOCAL :
\r
1198 AddCurDirToBookMark(WIN_LOCAL);
\r
1201 case MENU_BMARK_ADD_BOTH :
\r
1202 AddCurDirToBookMark(WIN_BOTH);
\r
1205 case MENU_BMARK_EDIT :
\r
1209 case MENU_SELECT_ALL :
\r
1210 SelectFileInList(hWndCurFocus, SELECT_ALL);
\r
1213 case MENU_SELECT :
\r
1214 SelectFileInList(hWndCurFocus, SELECT_REGEXP);
\r
1218 FindFileInList(hWndCurFocus, FIND_FIRST);
\r
1221 case MENU_FINDNEXT :
\r
1222 FindFileInList(hWndCurFocus, FIND_NEXT);
\r
1225 case MENU_DOTFILE :
\r
1227 DispDotFileMode();
\r
1228 GetLocalDirForWnd();
\r
1229 GetRemoteDirForWnd(CACHE_LASTREAD, &CancelFlg);
\r
1233 ToggleSyncMoveMode();
\r
1236 case MENU_IMPORT_WS :
\r
1237 ImportFromWSFTP();
\r
1240 case MENU_REGSAVE :
\r
1241 GetListTabWidth();
\r
1243 SaveSettingsToFile();
\r
1246 case MENU_REGLOAD :
\r
1247 if(LoadSettingsFromFile() == YES)
\r
1249 MessageBox(hWnd, MSGJPN292, "FFFTP", MB_OK);
\r
1251 PostMessage(hWnd, WM_CLOSE, 0, 0L);
\r
1255 case MENU_REGINIT :
\r
1256 if(DialogBox(hInstFtp, MAKEINTRESOURCE(reginit_dlg), hWnd, ExeEscDialogProc) == YES)
\r
1260 PostMessage(hWnd, WM_CLOSE, 0, 0L);
\r
1263 case MENU_CHANGEPASSWD: /* 2010.01.31 genta */
\r
1264 if( GetMasterPasswordStatus() != PASSWORD_OK )
\r
1267 if( DialogBox(hInstFtp, MAKEINTRESOURCE(forcepasschange_dlg), hWnd, ExeEscDialogProc) != YES){
\r
1271 if( EnterMasterPasswordAndSet( newmasterpasswd_dlg, hWnd ) != 0 ){
\r
1272 SetTaskMsg( MSGJPN303 );
\r
1276 case MENU_DIRINFO :
\r
1280 case MENU_TASKINFO :
\r
1286 if(AskTryingConnect() == NO)
\r
1287 MainTransPkt.Abort = ABORT_USER;
\r
1290 case MENU_OTPCALC :
\r
1294 case MENU_URL_COPY :
\r
1295 CopyURLtoClipBoard();
\r
1298 case MENU_APPKEY :
\r
1299 EraseListViewTips();
\r
1300 if(hWndCurFocus == GetRemoteHwnd())
\r
1301 RemoteRbuttonMenu(1);
\r
1302 else if(hWndCurFocus == GetLocalHwnd())
\r
1303 LocalRbuttonMenu(1);
\r
1307 if((LOWORD(wParam) >= MENU_BMARK_TOP) &&
\r
1308 (LOWORD(wParam) < MENU_BMARK_TOP+100))
\r
1310 ChangeDirBmarkProc(LOWORD(wParam));
\r
1314 // 常にホストかローカルへフォーカスを移動
\r
1315 // SetFocus(hWndCurFocus);
\r
1316 MakeButtonsFocus();
\r
1320 switch(((LPNMHDR)lParam)->code)
\r
1322 /* ツールチップコントロールメッセージの処理 */
\r
1323 case TTN_NEEDTEXT:
\r
1324 lpttt = (LPTOOLTIPTEXT)lParam;
\r
1325 lpttt->hinst = hInstFtp;
\r
1326 switch(lpttt->hdr.idFrom)
\r
1328 case MENU_CONNECT :
\r
1329 lpttt->lpszText = MSGJPN154;
\r
1333 lpttt->lpszText = MSGJPN155;
\r
1336 case MENU_DISCONNECT :
\r
1337 lpttt->lpszText = MSGJPN156;
\r
1340 case MENU_DOWNLOAD :
\r
1341 lpttt->lpszText = MSGJPN157;
\r
1344 case MENU_UPLOAD :
\r
1345 lpttt->lpszText = MSGJPN158;
\r
1348 case MENU_MIRROR_UPLOAD :
\r
1349 lpttt->lpszText = MSGJPN159;
\r
1352 case MENU_DELETE :
\r
1353 lpttt->lpszText = MSGJPN160;
\r
1356 case MENU_RENAME :
\r
1357 lpttt->lpszText = MSGJPN161;
\r
1361 lpttt->lpszText = MSGJPN162;
\r
1364 case MENU_LOCAL_UPDIR :
\r
1365 case MENU_REMOTE_UPDIR :
\r
1366 lpttt->lpszText = MSGJPN163;
\r
1369 case MENU_LOCAL_CHDIR :
\r
1370 case MENU_REMOTE_CHDIR :
\r
1371 lpttt->lpszText = MSGJPN164;
\r
1375 lpttt->lpszText = MSGJPN165;
\r
1378 case MENU_BINARY :
\r
1379 lpttt->lpszText = MSGJPN166;
\r
1383 lpttt->lpszText = MSGJPN167;
\r
1386 case MENU_REFRESH :
\r
1387 lpttt->lpszText = MSGJPN168;
\r
1391 lpttt->lpszText = MSGJPN169;
\r
1394 case MENU_REPORT :
\r
1395 lpttt->lpszText = MSGJPN170;
\r
1398 case MENU_KNJ_SJIS :
\r
1399 lpttt->lpszText = MSGJPN307;
\r
1402 case MENU_KNJ_EUC :
\r
1403 lpttt->lpszText = MSGJPN171;
\r
1406 case MENU_KNJ_JIS :
\r
1407 lpttt->lpszText = MSGJPN172;
\r
1410 case MENU_KNJ_UTF8N :
\r
1411 lpttt->lpszText = MSGJPN308;
\r
1414 case MENU_KNJ_NONE :
\r
1415 lpttt->lpszText = MSGJPN173;
\r
1418 case MENU_L_KNJ_SJIS :
\r
1419 lpttt->lpszText = MSGJPN309;
\r
1422 case MENU_L_KNJ_EUC :
\r
1423 lpttt->lpszText = MSGJPN310;
\r
1426 case MENU_L_KNJ_JIS :
\r
1427 lpttt->lpszText = MSGJPN311;
\r
1430 case MENU_L_KNJ_UTF8N :
\r
1431 lpttt->lpszText = MSGJPN312;
\r
1434 case MENU_KANACNV :
\r
1435 lpttt->lpszText = MSGJPN174;
\r
1439 lpttt->lpszText = MSGJPN175;
\r
1443 lpttt->lpszText = MSGJPN176;
\r
1446 // UTF-8からShift_JISへ変換
\r
1448 static wchar_t StringBufferUTF16[1024];
\r
1449 static char StringBufferSJIS[1024];
\r
1450 if(lpttt->lpszText)
\r
1452 MtoW(StringBufferUTF16, sizeof(StringBufferUTF16)/ sizeof(wchar_t), lpttt->lpszText, -1);
\r
1453 WtoA(StringBufferSJIS, sizeof(StringBufferSJIS)/ sizeof(char), StringBufferUTF16, -1);
\r
1454 lpttt->lpszText = StringBufferSJIS;
\r
1459 case LVN_COLUMNCLICK :
\r
1460 if(((NMHDR *)lParam)->hwndFrom == GetLocalHwnd())
\r
1462 SetSortTypeByColumn(WIN_LOCAL, ((NM_LISTVIEW *)lParam)->iSubItem);
\r
1463 ReSortDispList(WIN_LOCAL, &CancelFlg);
\r
1465 else if(((NMHDR *)lParam)->hwndFrom == GetRemoteHwnd())
\r
1467 if(((NM_LISTVIEW *)lParam)->iSubItem != 4)
\r
1469 SetSortTypeByColumn(WIN_REMOTE, ((NM_LISTVIEW *)lParam)->iSubItem);
\r
1470 ReSortDispList(WIN_REMOTE, &CancelFlg);
\r
1473 SetFocus(hWndCurFocus);
\r
1476 case LVN_ITEMCHANGED :
\r
1477 DispSelectedSpace();
\r
1478 MakeButtonsFocus();
\r
1484 Sizing = SW_RESTORE;
\r
1485 if(wParam == SIZE_RESTORED)
\r
1487 ResizeWindowProc();
\r
1488 GetWindowRect(hWnd, &Rect);
\r
1489 WinPosX = Rect.left;
\r
1490 WinPosY = Rect.top;
\r
1492 else if(wParam == SIZE_MAXIMIZED)
\r
1494 Sizing = SW_MAXIMIZE;
\r
1495 ResizeWindowProc();
\r
1498 return(DefWindowProc(hWnd, message, wParam, lParam));
\r
1502 WinPosX = ((RECT *)lParam)->left;
\r
1503 WinPosY = ((RECT *)lParam)->top;
\r
1504 return(DefWindowProc(hWnd, message, wParam, lParam));
\r
1506 case WM_SETFOCUS :
\r
1507 SetFocus(hWndCurFocus);
\r
1510 case WM_LBUTTONDOWN :
\r
1511 case WM_LBUTTONUP :
\r
1512 case WM_MOUSEMOVE :
\r
1513 CheckResizeFrame(wParam, LOWORD(lParam), HIWORD(lParam));
\r
1516 case WM_CHANGE_COND :
\r
1517 DispTransferFiles();
\r
1520 case WM_REFRESH_LOCAL_FLG :
\r
1521 PostMessage(hWnd, WM_COMMAND, MAKEWPARAM(REFRESH_LOCAL, 0), 0);
\r
1524 case WM_REFRESH_REMOTE_FLG :
\r
1525 if(SuppressRefresh == 0)
\r
1526 PostMessage(hWnd, WM_COMMAND, MAKEWPARAM(REFRESH_REMOTE, 0), 0);
\r
1530 BeginPaint(hWnd, (LPPAINTSTRUCT) &ps);
\r
1531 EndPaint(hWnd, (LPPAINTSTRUCT) &ps);
\r
1536 // DestroyWindow(hWndFtp);
\r
1537 PostQuitMessage(0);
\r
1540 case WM_QUERYENDSESSION :
\r
1545 if((AskTransferNow() == NO) ||
\r
1546 (DialogBox(hInstFtp, MAKEINTRESOURCE(exit_dlg), hWnd, ExeEscDialogProc) == YES))
\r
1549 return(DefWindowProc(hWnd, message, wParam, lParam));
\r
1554 return(DefWindowProc(hWnd, message, wParam, lParam));
\r
1560 /*----- プログラム開始時の処理 ------------------------------------------------
\r
1563 * char *Cmd : コマンドライン文字列
\r
1567 *----------------------------------------------------------------------------*/
\r
1569 static void StartupProc(char *Cmd)
\r
1578 char unc[FMAX_PATH+1];
\r
1580 Sts = AnalyzeComLine(Cmd, &AutoConnect, &CmdOption, unc, FMAX_PATH);
\r
1582 TrMode = TYPE_DEFAULT;
\r
1583 Kanji = KANJI_NOCNV;
\r
1584 FnameKanji = KANJI_NOCNV;
\r
1586 if(CmdOption & OPT_ASCII)
\r
1588 if(CmdOption & OPT_BINARY)
\r
1590 if(CmdOption & OPT_EUC)
\r
1591 Kanji = KANJI_EUC;
\r
1592 if(CmdOption & OPT_JIS)
\r
1593 Kanji = KANJI_JIS;
\r
1594 if(CmdOption & OPT_EUC_NAME)
\r
1595 FnameKanji = KANJI_EUC;
\r
1596 if(CmdOption & OPT_JIS_NAME)
\r
1597 FnameKanji = KANJI_JIS;
\r
1598 if(CmdOption & OPT_KANA)
\r
1601 if(CmdOption & OPT_QUIT)
\r
1604 if(CmdOption & OPT_SAVEOFF)
\r
1605 SuppressSave = YES;
\r
1606 if(CmdOption & OPT_SAVEON)
\r
1607 SuppressSave = NO;
\r
1611 if(ConnectOnStart == YES)
\r
1612 PostMessage(hWndFtp, WM_COMMAND, MAKEWPARAM(MENU_CONNECT, 0), 0);
\r
1616 DirectConnectProc(unc, Kanji, Kana, FnameKanji, TrMode);
\r
1620 PostMessage(hWndFtp, WM_COMMAND, MAKEWPARAM(MENU_CONNECT_NUM, CmdOption), (LPARAM)AutoConnect);
\r
1626 /*----- コマンドラインを解析 --------------------------------------------------
\r
1629 * char *Str : コマンドライン文字列
\r
1630 * int *AutoConnect : 接続ホスト番号を返すワーク
\r
1631 * int *CmdOption : オプションを返すワーク
\r
1632 * char *unc : uncを返すワーク
\r
1633 * int Max : uncの最大長
\r
1637 * 0=指定なし、1=URL指定、2=設定名指定、-1=エラー
\r
1654 * -n --ini (CheckIniFileNameで検索)
\r
1657 * -z --mpasswd (CheckMasterPasswordで検索) 2010.01.30 genta 追加
\r
1658 *----------------------------------------------------------------------------*/
\r
1660 static int AnalyzeComLine(char *Str, int *AutoConnect, int *CmdOption, char *unc, int Max)
\r
1663 char Tmp[FMAX_PATH+1];
\r
1665 *AutoConnect = -1;
\r
1669 memset(unc, NUL, Max+1);
\r
1671 while((Ret != -1) && ((Str = GetToken(Str, Tmp)) != NULL))
\r
1676 if((strcmp(&Tmp[1], "m") == 0) || (strcmp(&Tmp[1], "-mirror") == 0))
\r
1677 *CmdOption |= OPT_MIRROR;
\r
1678 else if((strcmp(&Tmp[1], "d") == 0) || (strcmp(&Tmp[1], "-mirrordown") == 0))
\r
1679 *CmdOption |= OPT_MIRRORDOWN;
\r
1680 else if((strcmp(&Tmp[1], "e") == 0) || (strcmp(&Tmp[1], "-euc") == 0))
\r
1681 *CmdOption |= OPT_EUC;
\r
1682 else if((strcmp(&Tmp[1], "j") == 0) || (strcmp(&Tmp[1], "-jis") == 0))
\r
1683 *CmdOption |= OPT_JIS;
\r
1684 else if((strcmp(&Tmp[1], "a") == 0) || (strcmp(&Tmp[1], "-ascii") == 0))
\r
1685 *CmdOption |= OPT_ASCII;
\r
1686 else if((strcmp(&Tmp[1], "b") == 0) || (strcmp(&Tmp[1], "-binary") == 0))
\r
1687 *CmdOption |= OPT_BINARY;
\r
1688 else if((strcmp(&Tmp[1], "x") == 0) || (strcmp(&Tmp[1], "-auto") == 0))
\r
1689 *CmdOption |= OPT_AUTO;
\r
1690 else if((strcmp(&Tmp[1], "f") == 0) || (strcmp(&Tmp[1], "-force") == 0))
\r
1691 *CmdOption |= OPT_FORCE;
\r
1692 else if((strcmp(&Tmp[1], "q") == 0) || (strcmp(&Tmp[1], "-quit") == 0))
\r
1693 *CmdOption |= OPT_QUIT;
\r
1694 else if((strcmp(&Tmp[1], "k") == 0) || (strcmp(&Tmp[1], "-kana") == 0))
\r
1695 *CmdOption |= OPT_KANA;
\r
1696 else if((strcmp(&Tmp[1], "u") == 0) || (strcmp(&Tmp[1], "-eucname") == 0))
\r
1697 *CmdOption |= OPT_EUC_NAME;
\r
1698 else if((strcmp(&Tmp[1], "i") == 0) || (strcmp(&Tmp[1], "-jisname") == 0))
\r
1699 *CmdOption |= OPT_JIS_NAME;
\r
1700 else if((strcmp(&Tmp[1], "n") == 0) || (strcmp(&Tmp[1], "-ini") == 0))
\r
1702 if((Str = GetToken(Str, Tmp)) == NULL)
\r
1704 SetTaskMsg(MSGJPN282);
\r
1708 else if(strcmp(&Tmp[1], "-saveoff") == 0)
\r
1709 *CmdOption |= OPT_SAVEOFF;
\r
1710 else if(strcmp(&Tmp[1], "-saveon") == 0)
\r
1711 *CmdOption |= OPT_SAVEON;
\r
1712 else if((strcmp(&Tmp[1], "z") == 0) || (strcmp(&Tmp[1], "-mpasswd") == 0))
\r
1713 { /* 2010.01.30 genta : Add master password option */
\r
1714 if((Str = GetToken(Str, Tmp)) == NULL)
\r
1716 SetTaskMsg(MSGJPN299);
\r
1720 else if((strcmp(&Tmp[1], "s") == 0) || (strcmp(&Tmp[1], "-set") == 0))
\r
1724 if((Str = GetToken(Str, Tmp)) != NULL)
\r
1726 if((*AutoConnect = SearchHostName(Tmp)) != -1)
\r
1730 SetTaskMsg(MSGJPN177, Tmp);
\r
1736 SetTaskMsg(MSGJPN178);
\r
1742 SetTaskMsg(MSGJPN179);
\r
1746 else if((strcmp(&Tmp[1], "h") == 0) || (strcmp(&Tmp[1], "-help") == 0))
\r
1748 hHelpWin = HtmlHelp(NULL, AskHelpFilePath(), HH_HELP_CONTEXT, IDH_HELP_TOPIC_0000024);
\r
1751 #ifdef ENABLE_PROCESS_PROTECTION
\r
1752 else if(strcmp(Tmp, "--restart") == 0)
\r
1755 else if(strcmp(Tmp, "--protect") == 0)
\r
1761 SetTaskMsg(MSGJPN180, Tmp);
\r
1769 strncpy(unc, Tmp, Max);
\r
1774 SetTaskMsg(MSGJPN181);
\r
1783 /*----- INIファイルのパス名の指定をチェック ------------------------------------
\r
1786 * char *Str : コマンドライン文字列
\r
1787 * char *Ini : iniファイル名を返すワーク
\r
1795 *----------------------------------------------------------------------------*/
\r
1797 static int CheckIniFileName(char *Str, char *Ini)
\r
1799 return GetTokenAfterOption( Str, Ini, "n", "-ini" );
\r
1802 /* マスターパスワードの指定をチェック */
\r
1803 static int CheckMasterPassword(char *Str, char *Ini)
\r
1805 return GetTokenAfterOption( Str, Ini, "z", "-mpasswd" );
\r
1808 /*----- オプションの後ろのトークンを取り出す ------------------------------------
\r
1811 * char *Str : コマンドライン文字列
\r
1812 * char *Result : 取り出した文字列を格納するワーク
\r
1813 * const char* Opt1, *Opt2: オプション文字列(2つ)
\r
1820 * 2010.01.30 genta マスターパスワード取り出しのため共通化
\r
1821 *----------------------------------------------------------------------------*/
\r
1822 static int GetTokenAfterOption(char *Str, char *Result, const char* Opt1, const char* Opt2 )
\r
1825 char Tmp[FMAX_PATH+1];
\r
1828 while((Str = GetToken(Str, Tmp)) != NULL)
\r
1833 if((strcmp(&Tmp[1], Opt1) == 0) || (strcmp(&Tmp[1], Opt2) == 0))
\r
1835 if((Str = GetToken(Str, Result)) != NULL)
\r
1844 /*----- トークンを返す --------------------------------------------------------
\r
1848 * char *Buf : 文字列を返すバッファ
\r
1851 * char *返したトークンの末尾
\r
1853 *----------------------------------------------------------------------------*/
\r
1855 static char *GetToken(char *Str, char *Buf)
\r
1859 while(*Str != NUL)
\r
1861 if((*Str != ' ') && (*Str != '\t'))
\r
1869 while(*Str != NUL)
\r
1872 InQuote = !InQuote;
\r
1875 if(((*Str == ' ') || (*Str == '\t')) &&
\r
1894 /*----- プログラム終了時の処理 ------------------------------------------------
\r
1897 * HWND hWnd : ウインドウハンドル
\r
1901 *----------------------------------------------------------------------------*/
\r
1903 static void ExitProc(HWND hWnd)
\r
1907 CloseTransferThread();
\r
1909 if(SaveExit == YES)
\r
1912 SaveCurrentSetToHost();
\r
1914 DeleteAlltempFile();
\r
1916 // WSACancelBlockingCall();
\r
1918 // CloseTransferThread();
\r
1920 if(SaveExit == YES)
\r
1922 GetListTabWidth();
\r
1925 if((CacheEntry > 0) && (CacheSave == YES))
\r
1933 if(RasClose == YES)
\r
1935 DisconnectRas(RasCloseNotify);
\r
1937 DeleteAllObject();
\r
1938 HtmlHelp(NULL, NULL, HH_UNINITIALIZE, dwCookie);
\r
1943 /*----- ファイル名をダブルクリックしたときの処理 ------------------------------
\r
1946 * int Win : ウインドウ番号 (WIN_xxx)
\r
1947 * int Mode : 常に「開く」動作をするかどうか (YES/NO)
\r
1948 * int App : アプリケーション番号(-1=関連づけ優先)
\r
1952 *----------------------------------------------------------------------------*/
\r
1954 void DoubleClickProc(int Win, int Mode, int App)
\r
1958 char Local[FMAX_PATH+1];
\r
1959 char Remote[FMAX_PATH+1];
\r
1960 char Tmp[FMAX_PATH+1];
\r
1962 int UseDiffViewer;
\r
1964 if(AskUserOpeDisabled() == NO)
\r
1966 SetCurrentDirAsDirHist();
\r
1967 if(GetSelectedCount(Win) == 1)
\r
1969 if((Pos = GetFirstSelected(Win, NO)) != -1)
\r
1971 GetNodeName(Win, Pos, Tmp, FMAX_PATH);
\r
1972 Type = GetNodeType(Win, Pos);
\r
1974 if(Win == WIN_LOCAL)
\r
1976 if((App != -1) || (Type == NODE_FILE))
\r
1978 if((DclickOpen == YES) || (Mode == YES))
\r
1980 AskLocalCurDir(Local, FMAX_PATH);
\r
1981 ReplaceAll(Local, '/', '\\');
\r
1982 SetYenTail(Local);
\r
1983 strcat(Local, Tmp);
\r
1984 ExecViewer(Local, App);
\r
1987 PostMessage(hWndFtp, WM_COMMAND, MAKEWPARAM(MENU_UPLOAD, 0), 0);
\r
1990 ChangeDir(WIN_LOCAL, Tmp);
\r
1992 else if(CheckClosedAndReconnect() == FFFTP_SUCCESS)
\r
1994 if((App != -1) || (Type == NODE_FILE))
\r
1996 if((DclickOpen == YES) || (Mode == YES))
\r
1998 // ビューワ2、3のパスが "d " で始まっていたら差分ビューア使用
\r
1999 if ((App == 1 || App == 2) && strncmp(ViewerName[App], "d ", 2) == 0)
\r
2000 UseDiffViewer = YES;
\r
2002 UseDiffViewer = NO;
\r
2004 strcpy(Remote, TmpPath);
\r
2005 SetYenTail(Remote);
\r
2006 if (UseDiffViewer == YES) {
\r
2007 strcat(Remote, "remote.");
\r
2009 strcat(Remote, Tmp);
\r
2011 if(AskTransferNow() == YES)
\r
2014 // MainTransPkt.ctrl_skt = AskCmdCtrlSkt();
\r
2015 strcpy(MainTransPkt.Cmd, "RETR ");
\r
2016 if(AskHostType() == HTYPE_ACOS)
\r
2018 strcpy(MainTransPkt.RemoteFile, "'");
\r
2019 strcat(MainTransPkt.RemoteFile, AskHostLsName());
\r
2020 strcat(MainTransPkt.RemoteFile, "(");
\r
2021 strcat(MainTransPkt.RemoteFile, Tmp);
\r
2022 strcat(MainTransPkt.RemoteFile, ")");
\r
2023 strcat(MainTransPkt.RemoteFile, "'");
\r
2025 else if(AskHostType() == HTYPE_ACOS_4)
\r
2027 strcpy(MainTransPkt.RemoteFile, Tmp);
\r
2031 strcpy(MainTransPkt.RemoteFile, Tmp);
\r
2033 strcpy(MainTransPkt.LocalFile, Remote);
\r
2034 MainTransPkt.Type = AskTransferTypeAssoc(MainTransPkt.RemoteFile, AskTransferType());
\r
2035 MainTransPkt.Size = 1;
\r
2036 MainTransPkt.KanjiCode = AskHostKanjiCode();
\r
2037 MainTransPkt.KanjiCodeDesired = AskLocalKanjiCode();
\r
2038 MainTransPkt.KanaCnv = AskHostKanaCnv();
\r
2039 MainTransPkt.Mode = EXIST_OVW;
\r
2040 MainTransPkt.ExistSize = 0;
\r
2041 MainTransPkt.hWndTrans = NULL;
\r
2042 MainTransPkt.Next = NULL;
\r
2047 if(CheckPathViolation(&MainTransPkt) == NO)
\r
2049 // if((Sts = DoDownLoad(AskCmdCtrlSkt(), &MainTransPkt, NO)) == 429)
\r
2051 // ReConnectCmdSkt();
\r
2052 Sts = DoDownLoad(AskCmdCtrlSkt(), &MainTransPkt, NO, &CancelFlg);
\r
2058 AddTempFileList(Remote);
\r
2059 if(Sts/100 == FTP_COMPLETE) {
\r
2060 if (UseDiffViewer == YES) {
\r
2061 AskLocalCurDir(Local, FMAX_PATH);
\r
2062 ReplaceAll(Local, '/', '\\');
\r
2063 SetYenTail(Local);
\r
2064 strcat(Local, Tmp);
\r
2065 ExecViewer2(Local, Remote, App);
\r
2067 ExecViewer(Remote, App);
\r
2072 PostMessage(hWndFtp, WM_COMMAND, MAKEWPARAM(MENU_DOWNLOAD, 0), 0);
\r
2075 ChangeDir(WIN_REMOTE, Tmp);
\r
2079 MakeButtonsFocus();
\r
2085 /*----- フォルダの移動 --------------------------------------------------------
\r
2088 * int Win : ウインドウ番号 (WIN_xxx)
\r
2089 * char *Path : 移動先のパス名
\r
2096 *----------------------------------------------------------------------------*/
\r
2098 static void ChangeDir(int Win, char *Path)
\r
2101 char Local[FMAX_PATH+1];
\r
2102 char Remote[FMAX_PATH+1];
\r
2104 Sync = AskSyncMoveMode();
\r
2107 if(strcmp(Path, "..") == 0)
\r
2109 AskLocalCurDir(Local, FMAX_PATH);
\r
2110 AskRemoteCurDir(Remote, FMAX_PATH);
\r
2111 if(strcmp(GetFileName(Local), GetFileName(Remote)) != 0)
\r
2116 if((Win == WIN_LOCAL) || (Sync == YES))
\r
2118 if(DoLocalCWD(Path) == FFFTP_SUCCESS)
\r
2119 GetLocalDirForWnd();
\r
2122 if((Win == WIN_REMOTE) || (Sync == YES))
\r
2124 if(CheckClosedAndReconnect() == FFFTP_SUCCESS)
\r
2126 #if defined(HAVE_OPENVMS)
\r
2127 /* OpenVMSの場合、".DIR;?"を取る */
\r
2128 if (AskHostType() == HTYPE_VMS)
\r
2129 ReformVMSDirName(Path, TRUE);
\r
2131 if(DoCWD(Path, YES, NO, YES) < FTP_RETRY)
\r
2132 GetRemoteDirForWnd(CACHE_NORMAL, &CancelFlg);
\r
2139 /*----- ウインドウのサイズ変更の処理 ------------------------------------------
\r
2146 *----------------------------------------------------------------------------*/
\r
2148 static void ResizeWindowProc(void)
\r
2154 GetClientRect(hWndFtp, &Rect);
\r
2155 SendMessage(GetSbarWnd(), WM_SIZE, SIZE_RESTORED, MAKELPARAM(Rect.right, Rect.bottom));
\r
2158 SetWindowPos(GetMainTbarWnd(), 0, 0, 0, WinWidth, TOOLWIN_HEIGHT, SWP_NOACTIVATE | SWP_NOZORDER);
\r
2160 SetWindowPos(GetLocalTbarWnd(), 0, 0, TOOLWIN_HEIGHT, LocalWidth, TOOLWIN_HEIGHT, SWP_NOACTIVATE | SWP_NOZORDER);
\r
2161 SendMessage(GetLocalTbarWnd(), TB_GETITEMRECT, 3, (LPARAM)&Rect);
\r
2162 SetWindowPos(GetLocalHistHwnd(), 0, Rect.right, Rect.top, LocalWidth - Rect.right, 200, SWP_NOACTIVATE | SWP_NOZORDER);
\r
2163 SetWindowPos(GetLocalHwnd(), 0, 0, TOOLWIN_HEIGHT*2, LocalWidth, ListHeight, SWP_NOACTIVATE | SWP_NOZORDER);
\r
2165 RemotePosX = LocalWidth + SepaWidth;
\r
2166 if(SplitVertical == YES)
\r
2169 SetWindowPos(GetRemoteTbarWnd(), 0, RemotePosX, TOOLWIN_HEIGHT, RemoteWidth, TOOLWIN_HEIGHT, SWP_NOACTIVATE | SWP_NOZORDER);
\r
2170 SendMessage(GetRemoteTbarWnd(), TB_GETITEMRECT, 3, (LPARAM)&Rect);
\r
2171 SetWindowPos(GetRemoteHistHwnd(), 0, Rect.right, Rect.top, RemoteWidth - Rect.right, 200, SWP_NOACTIVATE | SWP_NOZORDER);
\r
2172 SetWindowPos(GetRemoteHwnd(), 0, RemotePosX, TOOLWIN_HEIGHT*2, RemoteWidth, ListHeight, SWP_NOACTIVATE | SWP_NOZORDER);
\r
2174 SetWindowPos(GetTaskWnd(), 0, 0, TOOLWIN_HEIGHT*2+ListHeight+SepaWidth, ClientWidth, TaskHeight, SWP_NOACTIVATE | SWP_NOZORDER);
\r
2178 GetClientRect(hWndFtp, &Rect);
\r
2179 SendMessage(GetSbarWnd(), WM_SIZE, SIZE_RESTORED, MAKELPARAM(Rect.right, Rect.bottom));
\r
2182 SetWindowPos(GetMainTbarWnd(), 0, 0, 0, Rect.right, TOOLWIN_HEIGHT, SWP_NOACTIVATE | SWP_NOZORDER);
\r
2183 SetWindowPos(GetLocalTbarWnd(), 0, 0, TOOLWIN_HEIGHT, LocalWidth, TOOLWIN_HEIGHT, SWP_NOACTIVATE | SWP_NOZORDER);
\r
2184 SetWindowPos(GetRemoteTbarWnd(), 0, LocalWidth + SepaWidth, TOOLWIN_HEIGHT, RemoteWidth, TOOLWIN_HEIGHT, SWP_NOACTIVATE | SWP_NOZORDER);
\r
2185 SendMessage(GetLocalTbarWnd(), TB_GETITEMRECT, 3, (LPARAM)&Rect);
\r
2186 SetWindowPos(GetLocalHistHwnd(), 0, Rect.right, Rect.top, LocalWidth - Rect.right, 200, SWP_NOACTIVATE | SWP_NOZORDER);
\r
2187 SendMessage(GetRemoteTbarWnd(), TB_GETITEMRECT, 3, (LPARAM)&Rect);
\r
2188 SetWindowPos(GetRemoteHistHwnd(), 0, Rect.right, Rect.top, RemoteWidth - Rect.right, 200, SWP_NOACTIVATE | SWP_NOZORDER);
\r
2189 SetWindowPos(GetLocalHwnd(), 0, 0, TOOLWIN_HEIGHT*2, LocalWidth, ListHeight, SWP_NOACTIVATE | SWP_NOZORDER);
\r
2190 SetWindowPos(GetRemoteHwnd(), 0, LocalWidth + SepaWidth, TOOLWIN_HEIGHT*2, RemoteWidth, ListHeight, SWP_NOACTIVATE | SWP_NOZORDER);
\r
2191 SetWindowPos(GetTaskWnd(), 0, 0, TOOLWIN_HEIGHT*2+ListHeight+SepaWidth, ClientWidth, TaskHeight, SWP_NOACTIVATE | SWP_NOZORDER);
\r
2198 /*----- ウインドウの各部分のサイズを計算する ----------------------------------
\r
2205 *----------------------------------------------------------------------------*/
\r
2207 static void CalcWinSize(void)
\r
2211 GetWindowRect(hWndFtp, &Rect);
\r
2213 if(Sizing != SW_MAXIMIZE)
\r
2215 WinWidth = Rect.right - Rect.left;
\r
2216 WinHeight = Rect.bottom - Rect.top;
\r
2219 GetClientRect(hWndFtp, &Rect);
\r
2221 ClientWidth = Rect.right;
\r
2222 ClientHeight = Rect.bottom;
\r
2225 LocalWidth = max1(0, min1(LocalWidth, ClientWidth - SepaWidth));
\r
2226 RemoteWidth = max1(0, ClientWidth - LocalWidth - SepaWidth);
\r
2227 // TaskHeight = min1(TaskHeight, max1(0, ClientHeight - TOOLWIN_HEIGHT * 2 - SepaWidth));
\r
2229 GetClientRect(GetSbarWnd(), &Rect);
\r
2231 ListHeight = max1(0, ClientHeight - TOOLWIN_HEIGHT * 2 - TaskHeight - SepaWidth - Rect.bottom);
\r
2238 /*----- ウインドウの表示位置を取得する ----------------------------------------
\r
2241 * HWND hWnd : ウインドウハンドル
\r
2245 *----------------------------------------------------------------------------*/
\r
2247 static void AskWindowPos(HWND hWnd)
\r
2249 WINDOWPLACEMENT WinPlace;
\r
2251 WinPlace.length = sizeof(WINDOWPLACEMENT);
\r
2252 GetWindowPlacement(hWnd, &WinPlace);
\r
2253 WinPosX = WinPlace.rcNormalPosition.left;
\r
2254 WinPosY = WinPlace.rcNormalPosition.top;
\r
2261 /*----- ディレクトリリストとファイルリストの境界変更処理 ----------------------
\r
2264 * WPARAM Keys : WM_MOUSEMOVEなどのWPARAMの値
\r
2265 * int x : マウスカーソルのX座標
\r
2266 * int y : マウスカーソルのY座標
\r
2270 *----------------------------------------------------------------------------*/
\r
2272 static void CheckResizeFrame(WPARAM Keys, int x, int y)
\r
2277 if((Resizing == RESIZE_OFF) && (Keys == 0))
\r
2279 if((x >= LocalWidth) && (x <= LocalWidth + SepaWidth) &&
\r
2280 (y > TOOLWIN_HEIGHT) && (y < (TOOLWIN_HEIGHT * 2 + ListHeight)))
\r
2282 /* 境界位置変更用カーソルに変更 */
\r
2283 SetCapture(hWndFtp);
\r
2284 hCursor = LoadCursor(hInstFtp, MAKEINTRESOURCE(resize_lr_csr));
\r
2285 SetCursor(hCursor);
\r
2286 Resizing = RESIZE_PREPARE;
\r
2287 ResizePos = RESIZE_HPOS;
\r
2289 else if((y >= TOOLWIN_HEIGHT*2+ListHeight) && (y <= TOOLWIN_HEIGHT*2+ListHeight+SepaWidth))
\r
2291 /* 境界位置変更用カーソルに変更 */
\r
2292 SetCapture(hWndFtp);
\r
2293 hCursor = LoadCursor(hInstFtp, MAKEINTRESOURCE(resize_ud_csr));
\r
2294 SetCursor(hCursor);
\r
2295 Resizing = RESIZE_PREPARE;
\r
2296 ResizePos = RESIZE_VPOS;
\r
2299 else if(Resizing == RESIZE_PREPARE)
\r
2301 if(Keys & MK_LBUTTON)
\r
2304 Resizing = RESIZE_ON;
\r
2305 GetWindowRect(hWndFtp, &Rect);
\r
2306 GetClientRect(GetSbarWnd(), &Rect1);
\r
2307 Rect.left += GetSystemMetrics(SM_CXFRAME);
\r
2308 Rect.right -= GetSystemMetrics(SM_CXFRAME);
\r
2309 Rect.top += TOOLWIN_HEIGHT*2 + GetSystemMetrics(SM_CYMENU) + GetSystemMetrics(SM_CYCAPTION) + GetSystemMetrics(SM_CYFRAME);
\r
2310 Rect.bottom -= GetSystemMetrics(SM_CYFRAME) + Rect1.bottom;
\r
2311 ClipCursor(&Rect);
\r
2315 if(((ResizePos == RESIZE_HPOS) &&
\r
2316 ((x < LocalWidth) || (x > LocalWidth + SepaWidth) ||
\r
2317 (y <= TOOLWIN_HEIGHT) || (y >= (TOOLWIN_HEIGHT * 2 + ListHeight)))) ||
\r
2318 ((ResizePos == RESIZE_VPOS) &&
\r
2319 ((y < TOOLWIN_HEIGHT*2+ListHeight) || (y > TOOLWIN_HEIGHT*2+ListHeight+SepaWidth))))
\r
2323 hCursor = LoadCursor(NULL, IDC_ARROW);
\r
2324 SetCursor(hCursor);
\r
2325 Resizing = RESIZE_OFF;
\r
2329 else if(Resizing == RESIZE_ON)
\r
2331 if(ResizePos == RESIZE_HPOS)
\r
2335 GetClientRect(hWndFtp, &Rect);
\r
2336 GetClientRect(GetSbarWnd(), &Rect1);
\r
2337 TaskHeight = max1(0, Rect.bottom - y - Rect1.bottom);
\r
2339 ResizeWindowProc();
\r
2341 if((Keys & MK_LBUTTON) == 0)
\r
2346 hCursor = LoadCursor(NULL, IDC_ARROW);
\r
2347 SetCursor(hCursor);
\r
2348 Resizing = RESIZE_OFF;
\r
2355 /*----- ファイル一覧情報をビューワで表示 --------------------------------------
\r
2362 *----------------------------------------------------------------------------*/
\r
2364 static void DispDirInfo(void)
\r
2366 char Buf[FMAX_PATH+1];
\r
2368 MakeCacheFileName(AskCurrentFileListNum(), Buf);
\r
2369 ExecViewer(Buf, 0);
\r
2375 /*----- ビューワを起動 --------------------------------------------------------
\r
2378 * char Fname : ファイル名
\r
2379 * int App : アプリケーション番号(-1=関連づけ優先)
\r
2383 *----------------------------------------------------------------------------*/
\r
2385 void ExecViewer(char *Fname, int App)
\r
2387 PROCESS_INFORMATION Info;
\r
2388 STARTUPINFO Startup;
\r
2389 char AssocProg[FMAX_PATH+1];
\r
2390 char ComLine[FMAX_PATH*2+3+1];
\r
2391 char CurDir[FMAX_PATH+1];
\r
2393 /* FindExecutable()は関連付けられたプログラムのパス名にスペースが */
\r
2394 /* 含まれている時、間違ったパス名を返す事がある。 */
\r
2395 /* そこで、関連付けられたプログラムの起動はShellExecute()を使う。 */
\r
2397 AskLocalCurDir(CurDir, FMAX_PATH);
\r
2399 if((App == -1) && (FindExecutable(Fname, NULL, AssocProg) > (HINSTANCE)32))
\r
2401 DoPrintf("ShellExecute - %s", Fname);
\r
2402 ShellExecute(NULL, "open", Fname, NULL, CurDir, SW_SHOW);
\r
2406 App = max1(0, App);
\r
2407 strcpy(AssocProg, ViewerName[App]);
\r
2409 if(strchr(Fname, ' ') == NULL)
\r
2410 sprintf(ComLine, "%s %s", AssocProg, Fname);
\r
2412 sprintf(ComLine, "%s \"%s\"", AssocProg, Fname);
\r
2414 DoPrintf("FindExecutable - %s", ComLine);
\r
2416 memset(&Startup, NUL, sizeof(STARTUPINFO));
\r
2417 Startup.cb = sizeof(STARTUPINFO);
\r
2418 Startup.wShowWindow = SW_SHOW;
\r
2419 if(CreateProcess(NULL, ComLine, NULL, NULL, FALSE, 0, NULL, NULL, &Startup, &Info) == FALSE)
\r
2421 SetTaskMsg(MSGJPN182, GetLastError());
\r
2422 SetTaskMsg(">>%s", ComLine);
\r
2429 /*----- 差分表示ビューワを起動 ------------------------------------------------
\r
2432 * char Fname1 : ファイル名
\r
2433 * char Fname2 : ファイル名2
\r
2434 * int App : アプリケーション番号(2 or 3)
\r
2438 *----------------------------------------------------------------------------*/
\r
2440 void ExecViewer2(char *Fname1, char *Fname2, int App)
\r
2442 PROCESS_INFORMATION Info;
\r
2443 STARTUPINFO Startup;
\r
2444 char AssocProg[FMAX_PATH+1];
\r
2445 char ComLine[FMAX_PATH*2+3+1];
\r
2446 char CurDir[FMAX_PATH+1];
\r
2448 /* FindExecutable()は関連付けられたプログラムのパス名にスペースが */
\r
2449 /* 含まれている時、間違ったパス名を返す事がある。 */
\r
2450 /* そこで、関連付けられたプログラムの起動はShellExecute()を使う。 */
\r
2452 AskLocalCurDir(CurDir, FMAX_PATH);
\r
2454 strcpy(AssocProg, ViewerName[App] + 2); /* 先頭の "d " は読み飛ばす */
\r
2456 if(strchr(Fname1, ' ') == NULL && strchr(Fname2, ' ') == NULL)
\r
2457 sprintf(ComLine, "%s %s %s", AssocProg, Fname1, Fname2);
\r
2459 sprintf(ComLine, "%s \"%s\" \"%s\"", AssocProg, Fname1, Fname2);
\r
2461 DoPrintf("FindExecutable - %s", ComLine);
\r
2463 memset(&Startup, NUL, sizeof(STARTUPINFO));
\r
2464 Startup.cb = sizeof(STARTUPINFO);
\r
2465 Startup.wShowWindow = SW_SHOW;
\r
2466 if(CreateProcess(NULL, ComLine, NULL, NULL, FALSE, 0, NULL, NULL, &Startup, &Info) == FALSE)
\r
2468 SetTaskMsg(MSGJPN182, GetLastError());
\r
2469 SetTaskMsg(">>%s", ComLine);
\r
2476 /*----- テンポラリファイル名をテンポラリファイルリストに追加 ------------------
\r
2479 * char *Fname : テンポラリファイル名
\r
2483 *----------------------------------------------------------------------------*/
\r
2485 void AddTempFileList(char *Fname)
\r
2487 TEMPFILELIST *New;
\r
2489 if((New = malloc(sizeof(TEMPFILELIST))) != NULL)
\r
2491 if((New->Fname = malloc(strlen(Fname)+1)) != NULL)
\r
2493 strcpy(New->Fname, Fname);
\r
2494 if(TempFiles == NULL)
\r
2497 New->Next = TempFiles;
\r
2507 /*----- テンポラリファイルリストに登録されているファイルを全て削除 ------------
\r
2514 *----------------------------------------------------------------------------*/
\r
2516 static void DeleteAlltempFile(void)
\r
2518 TEMPFILELIST *Pos;
\r
2519 TEMPFILELIST *Next;
\r
2522 while(Pos != NULL)
\r
2524 DeleteFile(Pos->Fname);
\r
2532 // OLE D&Dのテンポラリを削除する (2007.9.11 yutaka)
\r
2533 doDeleteRemoteFile();
\r
2539 /*----- Aboutダイアログボックスのコールバック関数 ------------------------
\r
2542 * HWND hDlg : ウインドウハンドル
\r
2543 * UINT message : メッセージ番号
\r
2544 * WPARAM wParam : メッセージの WPARAM 引数
\r
2545 * LPARAM lParam : メッセージの LPARAM 引数
\r
2549 *----------------------------------------------------------------------------*/
\r
2551 static BOOL CALLBACK AboutDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
\r
2553 static char Tmp[80];
\r
2558 case WM_INITDIALOG :
\r
2559 Ver = GetJreVersion();
\r
2561 sprintf(Tmp, MSGJPN183);
\r
2563 sprintf(Tmp, MSGJPN184, Ver / 0x100, Ver % 0x100);
\r
2564 SendDlgItemMessage(hDlg, ABOUT_JRE, WM_SETTEXT, 0, (LPARAM)Tmp);
\r
2565 SendDlgItemMessage(hDlg, ABOUT_URL, EM_LIMITTEXT, 256, 0);
\r
2566 SendDlgItemMessage(hDlg, ABOUT_URL, WM_SETTEXT, 0, (LPARAM)MSGJPN284);
\r
2570 switch(GET_WM_COMMAND_ID(wParam, lParam))
\r
2574 EndDialog(hDlg, YES);
\r
2583 /*----- サウンドを鳴らす ------------------------------------------------------
\r
2586 * Int num : サウンドの種類 (SND_xxx)
\r
2590 *----------------------------------------------------------------------------*/
\r
2592 void SoundPlay(int Num)
\r
2594 if(Sound[Num].On == YES)
\r
2595 sndPlaySound(Sound[Num].Fname, SND_ASYNC | SND_NODEFAULT);
\r
2601 /*----- ヘルプファイルのパス名を返す ------------------------------------------
\r
2608 *----------------------------------------------------------------------------*/
\r
2610 char *AskHelpFilePath(void)
\r
2616 /*----- テンポラリファイルのパス名を返す --------------------------------------
\r
2623 *----------------------------------------------------------------------------*/
\r
2625 char *AskTmpFilePath(void)
\r
2631 /*----- INIファイルのパス名を返す ---------------------------------------------
\r
2638 *----------------------------------------------------------------------------*/
\r
2640 char *AskIniFilePath(void)
\r
2645 /*----- INIファイルのみを使うかどうかを返す -----------------------------------
\r
2651 * int ステータス : YES/NO
\r
2652 *----------------------------------------------------------------------------*/
\r
2654 int AskForceIni(void)
\r
2662 /*----- メッセージ処理 --------------------------------------------------------
\r
2668 * int 終了フラグ (YES=WM_CLOSEが来た/NO)
\r
2669 *----------------------------------------------------------------------------*/
\r
2671 int BackgrndMessageProc(void)
\r
2677 while(PeekMessage(&Msg, NULL, 0, 0, PM_REMOVE))
\r
2679 if(!HtmlHelp(NULL, NULL, HH_PRETRANSLATEMESSAGE, (DWORD)&Msg))
\r
2681 /* ディレクトリ名の表示コンボボックスでBSやRETが効くように */
\r
2682 /* コンボボックス内ではアクセラレータを無効にする */
\r
2683 if((Msg.hwnd == GetLocalHistEditHwnd()) ||
\r
2684 (Msg.hwnd == GetRemoteHistEditHwnd()) ||
\r
2685 ((hHelpWin != NULL) && (Msg.hwnd == hHelpWin)) ||
\r
2686 GetHideUI() == YES ||
\r
2687 (TranslateAccelerator(GetMainHwnd(), Accel, &Msg) == 0))
\r
2689 if(Msg.message == WM_QUIT)
\r
2692 PostQuitMessage(0);
\r
2695 TranslateMessage(&Msg);
\r
2696 DispatchMessage(&Msg);
\r
2704 /*----- 自動終了フラグをクリアする --------------------------------------------
\r
2711 *----------------------------------------------------------------------------*/
\r
2713 void ResetAutoExitFlg(void)
\r
2720 /*----- 自動終了フラグを返す --------------------------------------------------
\r
2726 * int フラグ (YES/NO)
\r
2727 *----------------------------------------------------------------------------*/
\r
2729 int AskAutoExit(void)
\r
2734 /*----- ユーザにパスワードを入力させ,それを設定する -----------------------
\r
2740 * int : 0/ユーザキャンセル, 1/設定した, 2/デフォルト設定
\r
2741 *----------------------------------------------------------------------------*/
\r
2742 int EnterMasterPasswordAndSet( int Res, HWND hWnd )
\r
2744 char buf[MAX_PASSWORD_LEN + 1];
\r
2749 if( InputDialogBox(Res, hWnd, NULL, buf, MAX_PASSWORD_LEN + 1,
\r
2750 &Flag, IDH_HELP_TOPIC_0000064) == YES){
\r
2752 RemoveTailingSpaces(buf);
\r
2754 for( p = buf; *p == ' '; p++ )
\r
2757 if( p[0] != NUL ){
\r
2758 SetMasterPassword( p );
\r
2762 /* 空の場合はデフォルト値を設定 */
\r
2763 SetMasterPassword( NULL );
\r
2771 BOOL __stdcall SSLTimeoutCallback()
\r
2774 if(BackgrndMessageProc() == YES)
\r
2776 // 念のためツールバーのMENU_ABORTも確認
\r
2777 // if(MainTransPkt.Abort != ABORT_NONE)
\r
2779 // MainTransPkt.Abort = ABORT_NONE;
\r