OSDN Git Service

9db97b07ce9ea25dcb12e85e4c4ffc85844eb044
[ffftp/ffftp.git] / main.c
1 /*=============================================================================\r
2 *\r
3 *                                                                       FFFTP\r
4 *\r
5 ===============================================================================\r
6 / Copyright (C) 1997-2007 Sota. All rights reserved.\r
7 /\r
8 / Redistribution and use in source and binary forms, with or without \r
9 / modification, are permitted provided that the following conditions \r
10 / are met:\r
11 /\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
17 /\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
29 \r
30 #define  STRICT\r
31 // IPv6対応\r
32 #include <winsock2.h>\r
33 #include <windows.h>\r
34 #include <stdio.h>\r
35 #include <stdlib.h>\r
36 #include <string.h>\r
37 #include <mbstring.h>\r
38 // 自動切断対策\r
39 #include <time.h>\r
40 #include <malloc.h>\r
41 #include <windowsx.h>\r
42 #include <commctrl.h>\r
43 #include <stdarg.h>\r
44 // IPv6対応\r
45 //#include <winsock.h>\r
46 // タスクバー進捗表示\r
47 #include <shobjidl.h>\r
48 \r
49 #include "common.h"\r
50 #include "resource.h"\r
51 #include "aes.h"\r
52 // 暗号化通信対応\r
53 #include "sha.h"\r
54 \r
55 #include <htmlhelp.h>\r
56 #include "helpid.h"\r
57 \r
58 // ソフトウェア自動更新\r
59 #include "updater.h"\r
60 \r
61 // UTF-8対応\r
62 #undef __MBSWRAPPER_H__\r
63 #include "mbswrapper.h"\r
64 \r
65 \r
66 #define RESIZE_OFF              0               /* ウインドウの区切り位置変更していない */\r
67 #define RESIZE_ON               1               /* ウインドウの区切り位置変更中 */\r
68 #define RESIZE_PREPARE  2               /* ウインドウの区切り位置変更の準備 */\r
69 \r
70 #define RESIZE_HPOS             0               /* ローカル-ホスト間の区切り位置変更 */\r
71 #define RESIZE_VPOS             1               /* リスト-タスク間の区切り位置の変更 */\r
72 \r
73 \r
74 /*===== プロトタイプ =====*/\r
75 \r
76 static int InitApp(LPSTR lpszCmdLine, int cmdShow);\r
77 static int MakeAllWindows(int cmdShow);\r
78 static void DeleteAllObject(void);\r
79 static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);\r
80 static void StartupProc(char *Cmd);\r
81 static int AnalyzeComLine(char *Str, int *AutoConnect, int *CmdOption, char *unc, int Max);\r
82 static int CheckIniFileName(char *Str, char *Ini);\r
83 static int CheckMasterPassword(char *Str, char *Ini);\r
84 static int GetTokenAfterOption(char *Str, char *Result, const char* Opt1, const char* Opt2 );\r
85 static char *GetToken(char *Str, char *Buf);\r
86 static void ExitProc(HWND hWnd);\r
87 static void ChangeDir(int Win, char *Path);\r
88 static void ResizeWindowProc(void);\r
89 static void CalcWinSize(void);\r
90 // static void AskWindowPos(HWND hWnd);\r
91 static void CheckResizeFrame(WPARAM Keys, int x, int y);\r
92 static void DispDirInfo(void);\r
93 static void DeleteAlltempFile(void);\r
94 // 64ビット対応\r
95 //static BOOL CALLBACK AboutDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);\r
96 static INT_PTR CALLBACK AboutDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);\r
97 static int EnterMasterPasswordAndSet( int Res, HWND hWnd );\r
98 \r
99 /*===== ローカルなワーク =====*/\r
100 \r
101 static const char FtpClassStr[] = "FFFTPWin";\r
102 \r
103 static HINSTANCE hInstFtp;\r
104 static HWND hWndFtp = NULL;\r
105 static HWND hWndCurFocus = NULL;\r
106 \r
107 static HACCEL Accel;\r
108 static HBRUSH RootColorBrush = NULL;\r
109 \r
110 static int Resizing = RESIZE_OFF;\r
111 static int ResizePos;\r
112 static HCURSOR hCursor;\r
113 \r
114 int ClientWidth;\r
115 static int ClientHeight;\r
116 int SepaWidth;\r
117 int RemoteWidth;\r
118 int ListHeight;\r
119 \r
120 static TEMPFILELIST *TempFiles = NULL;\r
121 \r
122 static int SaveExit = YES;\r
123 static int AutoExit = NO;\r
124 \r
125 static char HelpPath[FMAX_PATH+1];\r
126 static char IniPath[FMAX_PATH+1];\r
127 static int ForceIni = NO;\r
128 \r
129 TRANSPACKET MainTransPkt;               /* ファイル転送用パケット */\r
130                                                                 /* これを使って転送を行うと、ツールバーの転送 */\r
131                                                                 /* 中止ボタンで中止できる */\r
132 \r
133 char TitleHostName[HOST_ADRS_LEN+1];\r
134 char FilterStr[FILTER_EXT_LEN+1] = { "*" };\r
135 \r
136 int CancelFlg;\r
137 \r
138 // 外部アプリケーションへドロップ後にローカル側のファイル一覧に作業フォルダが表示されるバグ対策\r
139 //static int SuppressRefresh = 0;\r
140 int SuppressRefresh = 0;\r
141 \r
142 static DWORD dwCookie;\r
143 \r
144 // 暗号化通信対応\r
145 static char SSLRootCAFilePath[FMAX_PATH+1];\r
146 // マルチコアCPUの特定環境下でファイル通信中にクラッシュするバグ対策\r
147 static DWORD MainThreadId;\r
148 // ポータブル版判定\r
149 static char PortableFilePath[FMAX_PATH+1];\r
150 static int PortableVersion;\r
151 // ローカル側自動更新\r
152 HANDLE ChangeNotification = INVALID_HANDLE_VALUE;\r
153 // タスクバー進捗表示\r
154 static ITaskbarList3* pTaskbarList3;\r
155 // 高DPI対応\r
156 int ToolWinHeight;\r
157 \r
158 \r
159 /*===== グローバルなワーク =====*/\r
160 \r
161 HWND hHelpWin = NULL;\r
162 \r
163 /* 設定値 */\r
164 int WinPosX = CW_USEDEFAULT;\r
165 int WinPosY = 0;\r
166 // 機能が増えたためサイズ変更\r
167 // VGAサイズに収まるようになっていたのをSVGAサイズに引き上げ\r
168 //int WinWidth = 630;\r
169 //int WinHeight = 393;\r
170 //int LocalWidth = 309;\r
171 //int TaskHeight = 50;\r
172 //int LocalTabWidth[4] = { 120, 90, 60, 37 };\r
173 //int RemoteTabWidth[6] = { 120, 90, 60, 37, 60, 60 };\r
174 int WinWidth = 790;\r
175 int WinHeight = 513;\r
176 int LocalWidth = 389;\r
177 int TaskHeight = 100;\r
178 int LocalTabWidth[4] = { 150, 120, 60, 37 };\r
179 int RemoteTabWidth[6] = { 150, 120, 60, 37, 60, 60 };\r
180 char UserMailAdrs[USER_MAIL_LEN+1] = { "who@example.com" };\r
181 char ViewerName[VIEWERS][FMAX_PATH+1] = { { "notepad" }, { "" }, { "" } };\r
182 HFONT ListFont = NULL;\r
183 LOGFONT ListLogFont;\r
184 int LocalFileSort = SORT_NAME;\r
185 int LocalDirSort = SORT_NAME;\r
186 int RemoteFileSort = SORT_NAME;\r
187 int RemoteDirSort = SORT_NAME;\r
188 int TransMode = TYPE_X;\r
189 int ConnectOnStart = YES;\r
190 int DebugConsole = NO;\r
191 int SaveWinPos = NO;\r
192 // アスキーモード判別の改良\r
193 //char AsciiExt[ASCII_EXT_LEN+1] = { "*.txt\0*.html\0*.htm\0*.cgi\0*.pl\0" };\r
194 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
195 int RecvMode = TRANS_DLG;\r
196 int SendMode = TRANS_DLG;\r
197 int MoveMode = MOVE_DLG;\r
198 int ListType = LVS_REPORT;\r
199 // LISTのキャッシュを無効にする(リモートのディレクトリの表示が更新されないバグ対策)\r
200 //int CacheEntry = 10;\r
201 int CacheEntry = -10;\r
202 int CacheSave = NO;\r
203 char DefaultLocalPath[FMAX_PATH+1] = { "" };\r
204 int SaveTimeStamp = YES;\r
205 int FindMode = 0;\r
206 int DotFile = YES;\r
207 int DclickOpen = YES;\r
208 int ConnectAndSet = YES;\r
209 SOUNDFILE Sound[SOUND_TYPES] = { { NO, "" }, { NO, "" }, { NO, "" } };\r
210 int FnameCnv = FNAME_NOCNV;\r
211 int TimeOut = 90;\r
212 int RmEOF = NO;\r
213 int RegType = REGTYPE_REG;\r
214 char FwallHost[HOST_ADRS_LEN+1] = { "" };\r
215 char FwallUser[USER_NAME_LEN+1] = { "" };\r
216 char FwallPass[PASSWORD_LEN+1] = { "" };\r
217 int FwallPort = PORT_NOR;\r
218 int FwallType = 1;\r
219 int FwallDefault = NO;\r
220 int FwallSecurity = SECURITY_AUTO;\r
221 int FwallResolve = NO;\r
222 int FwallLower = NO;\r
223 int FwallDelimiter = '@';\r
224 // ルータ対策\r
225 //int PasvDefault = NO;\r
226 int PasvDefault = YES;\r
227 char MirrorNoTrn[MIRROR_LEN+1] = { "*.bak\0" };\r
228 char MirrorNoDel[MIRROR_LEN+1] = { "" };\r
229 int MirrorFnameCnv = NO;\r
230 int SplitVertical = YES;\r
231 int RasClose = NO;\r
232 int RasCloseNotify = YES;\r
233 int FileHist = 5;\r
234 char DefAttrList[DEFATTRLIST_LEN+1] = { "" };\r
235 SIZE HostDlgSize = { -1, -1 };\r
236 SIZE BmarkDlgSize = { -1, -1 };\r
237 SIZE MirrorDlgSize = { -1, -1 };\r
238 int Sizing = SW_RESTORE;\r
239 int SortSave = NO;\r
240 char TmpPath[FMAX_PATH+1];\r
241 int QuickAnonymous = YES;\r
242 int PassToHist = YES;\r
243 int VaxSemicolon = NO;\r
244 int SendQuit = NO;\r
245 int NoRasControl = NO;\r
246 int SuppressSave = NO;\r
247 int DispIgnoreHide = NO;\r
248 int DispDrives = NO;\r
249 int MirUpDelNotify = YES; \r
250 int MirDownDelNotify = YES; \r
251 int FolderAttr = NO;\r
252 int FolderAttrNum = 777;\r
253 // 暗号化通信対応\r
254 BYTE CertificateCacheHash[MAX_CERT_CACHE_HASH][20];\r
255 BYTE SSLRootCAFileHash[20];\r
256 // ファイルアイコン表示対応\r
257 int DispFileIcon = NO;\r
258 // タイムスタンプのバグ修正\r
259 int DispTimeSeconds = NO;\r
260 // ファイルの属性を数字で表示\r
261 int DispPermissionsNumber = NO;\r
262 // ディレクトリ自動作成\r
263 int MakeAllDir = YES;\r
264 // UTF-8対応\r
265 int LocalKanjiCode = KANJI_SJIS;\r
266 // 自動切断対策\r
267 int NoopEnable = NO;\r
268 // UPnP対応\r
269 int UPnPEnabled = YES;\r
270 time_t LastDataConnectionTime = 0;\r
271 // 全設定暗号化対応\r
272 int EncryptAllSettings = NO;\r
273 // ローカル側自動更新\r
274 int AutoRefreshFileList = YES;\r
275 // 古い処理内容を消去\r
276 int RemoveOldLog = NO;\r
277 // バージョン確認\r
278 int ReadOnlySettings = NO;\r
279 \r
280 \r
281 \r
282 \r
283 \r
284 /*----- メインルーチン --------------------------------------------------------\r
285 *\r
286 *       Parameter\r
287 *               HINSTANCE hInstance : このアプリケーションのこのインスタンスのハンドル\r
288 *               HINSTANCE hPrevInstance : このアプリケーションの直前のインスタンスのハンドル\r
289 *               LPSTR lpszCmdLine : アプリケーションが起動したときのコマンドラインをさすロングポインタ\r
290 *               int cmdShow : 最初に表示するウインドウの形式。\r
291 *\r
292 *       Return Value\r
293 *               int 最後のメッセージのwParam\r
294 *----------------------------------------------------------------------------*/\r
295 \r
296 int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int cmdShow)\r
297 {\r
298     MSG Msg;\r
299         int Ret;\r
300         BOOL Sts;\r
301         // ソフトウェア自動更新\r
302         char UpdateDir[FMAX_PATH+1];\r
303 \r
304         // プロセス保護\r
305 #ifdef ENABLE_PROCESS_PROTECTION\r
306         {\r
307                 DWORD ProtectLevel;\r
308                 char* pCommand;\r
309                 char Option[FMAX_PATH+1];\r
310                 ProtectLevel = PROCESS_PROTECTION_NONE;\r
311                 pCommand = lpszCmdLine;\r
312                 while(pCommand = GetToken(pCommand, Option))\r
313                 {\r
314                         if(strcmp(Option, "--protect") == 0)\r
315                         {\r
316                                 ProtectLevel = PROCESS_PROTECTION_DEFAULT;\r
317                                 break;\r
318                         }\r
319                         else if(strcmp(Option, "--protect-high") == 0)\r
320                         {\r
321                                 ProtectLevel = PROCESS_PROTECTION_HIGH;\r
322                                 break;\r
323                         }\r
324                         else if(strcmp(Option, "--protect-medium") == 0)\r
325                         {\r
326                                 ProtectLevel = PROCESS_PROTECTION_MEDIUM;\r
327                                 break;\r
328                         }\r
329                         else if(strcmp(Option, "--protect-low") == 0)\r
330                         {\r
331                                 ProtectLevel = PROCESS_PROTECTION_LOW;\r
332                                 break;\r
333                         }\r
334                 }\r
335                 if(ProtectLevel != PROCESS_PROTECTION_NONE)\r
336                 {\r
337                         SetProcessProtectionLevel(ProtectLevel);\r
338                         if(!InitializeLoadLibraryHook())\r
339                         {\r
340                                 MessageBox(NULL, MSGJPN321, "FFFTP", MB_OK | MB_ICONERROR);\r
341                                 return 0;\r
342                         }\r
343 #ifndef _DEBUG\r
344                         if(IsDebuggerPresent())\r
345                         {\r
346                                 MessageBox(NULL, MSGJPN322, "FFFTP", MB_OK | MB_ICONERROR);\r
347                                 return 0;\r
348                         }\r
349 #endif\r
350                         if(!UnloadUntrustedModule())\r
351                         {\r
352                                 MessageBox(NULL, MSGJPN323, "FFFTP", MB_OK | MB_ICONERROR);\r
353                                 return 0;\r
354                         }\r
355 #ifndef _DEBUG\r
356                         if(RestartProtectedProcess(" --restart"))\r
357                                 return 0;\r
358 #endif\r
359                         if(!EnableLoadLibraryHook(TRUE))\r
360                         {\r
361                                 MessageBox(NULL, MSGJPN324, "FFFTP", MB_OK | MB_ICONERROR);\r
362                                 return 0;\r
363                         }\r
364                 }\r
365                 else\r
366                         InitializeLoadLibraryHook();\r
367         }\r
368 #endif\r
369 \r
370         // ソフトウェア自動更新\r
371         if(GetTokenAfterOption(lpszCmdLine, UpdateDir, "--software-update", "--software-update"))\r
372         {\r
373                 if(!StartUpdateProcessAsAdministrator(lpszCmdLine, " --restart"))\r
374                 {\r
375                         ApplyUpdates(UpdateDir);\r
376                 }\r
377                 return 0;\r
378         }\r
379         else if(GetTokenAfterOption(lpszCmdLine, UpdateDir, "--software-cleanup", "--software-cleanup"))\r
380         {\r
381                 // TODO: ダウンロードした更新ファイルを削除\r
382         }\r
383 \r
384         // マルチコアCPUの特定環境下でファイル通信中にクラッシュするバグ対策\r
385 #ifdef DISABLE_MULTI_CPUS\r
386         SetProcessAffinityMask(GetCurrentProcess(), 1);\r
387 #endif\r
388         MainThreadId = GetCurrentThreadId();\r
389 \r
390         // yutaka\r
391         if(OleInitialize(NULL) != S_OK){\r
392                 MessageBox(NULL, MSGJPN298, "FFFTP", MB_OK | MB_ICONERROR);\r
393                 return 0;\r
394         }\r
395 \r
396         InitCommonControls();\r
397 \r
398         // UPnP対応\r
399         CoInitialize(NULL);\r
400         LoadUPnP();\r
401         // タスクバー進捗表示\r
402         LoadTaskbarList3();\r
403 \r
404         // UTF-8対応\r
405         LoadUnicodeNormalizationDll();\r
406 \r
407         // FTPS対応\r
408 #ifdef USE_OPENSSL\r
409         LoadOpenSSL();\r
410 #endif\r
411 \r
412         // SFTP対応\r
413         LoadPuTTY();\r
414 \r
415         Ret = FALSE;\r
416         hWndFtp = NULL;\r
417         hInstFtp = hInstance;\r
418         if(InitApp(lpszCmdLine, cmdShow) == FFFTP_SUCCESS)\r
419         {\r
420                 for(;;)\r
421                 {\r
422                         Sts = GetMessage(&Msg, NULL, 0, 0);\r
423                         if((Sts == 0) || (Sts == -1))\r
424                                 break;\r
425 \r
426                         // 64ビット対応\r
427 //                      if(!HtmlHelp(NULL, NULL, HH_PRETRANSLATEMESSAGE, (DWORD)&Msg))\r
428                         if(!HtmlHelp(NULL, NULL, HH_PRETRANSLATEMESSAGE, (DWORD_PTR)&Msg))\r
429                         { \r
430                                 /* ディレクトリ名の表示コンボボックスでBSやRETが効くように */\r
431                                 /* コンボボックス内ではアクセラレータを無効にする */\r
432                                 if((Msg.hwnd == GetLocalHistEditHwnd()) ||\r
433                                    (Msg.hwnd == GetRemoteHistEditHwnd()) ||\r
434                                    ((hHelpWin != NULL) && (GetAncestor(Msg.hwnd, GA_ROOT) == hHelpWin)) ||\r
435                                    GetHideUI() == YES ||\r
436                                    (TranslateAccelerator(hWndFtp, Accel, &Msg) == 0))\r
437                                 {\r
438                                         TranslateMessage(&Msg);\r
439                                         DispatchMessage(&Msg);\r
440                                 }\r
441                         }\r
442                 }\r
443                 Ret = Msg.wParam;\r
444         }\r
445     UnregisterClass(FtpClassStr, hInstFtp);\r
446         // FTPS対応\r
447 #ifdef USE_OPENSSL\r
448         FreeOpenSSL();\r
449 #endif\r
450         // SFTP対応\r
451         FreePuTTY();\r
452         // タスクバー進捗表示\r
453         FreeTaskbarList3();\r
454         // UPnP対応\r
455         FreeUPnP();\r
456         CoUninitialize();\r
457         OleUninitialize();\r
458         return(Ret);\r
459 }\r
460 \r
461 \r
462 /*----- アプリケーションの初期設定 --------------------------------------------\r
463 *\r
464 *       Parameter\r
465 *               HINSTANCE hInstance : このアプリケーションのこのインスタンスのハンドル\r
466 *               HINSTANCE hPrevInstance : このアプリケーションの直前のインスタンスのハンドル\r
467 *               LPSTR lpszCmdLine : アプリケーションが起動したときのコマンドラインをさすロングポインタ\r
468 *               int cmdShow : 最初に表示するウインドウの形式。\r
469 *\r
470 *       Return Value\r
471 *               int ステータス\r
472 *                       FFFTP_SUCCESS/FFFTP_FAIL\r
473 *----------------------------------------------------------------------------*/\r
474 \r
475 static int InitApp(LPSTR lpszCmdLine, int cmdShow)\r
476 {\r
477         int sts;\r
478         int Err;\r
479         WSADATA WSAData;\r
480         char PwdBuf[FMAX_PATH+1];\r
481         int useDefautPassword = 0; /* 警告文表示用 */\r
482         int masterpass;\r
483         // ポータブル版判定\r
484         int ImportPortable;\r
485         // 高DPI対応\r
486         int i;\r
487 \r
488         sts = FFFTP_FAIL;\r
489 \r
490         aes_init();\r
491         srand(GetTickCount());\r
492         \r
493         // 64ビット対応\r
494 //      HtmlHelp(NULL, NULL, HH_INITIALIZE, (DWORD)&dwCookie);\r
495         HtmlHelp(NULL, NULL, HH_INITIALIZE, (DWORD_PTR)&dwCookie);\r
496 \r
497         SaveUpdateBellInfo();\r
498 \r
499         if((Err = WSAStartup((WORD)0x0202, &WSAData)) != 0)\r
500                 MessageBox(NULL, ReturnWSError(Err), "FFFTP - Startup", MB_OK);\r
501         else\r
502         {\r
503                 Accel = LoadAccelerators(hInstFtp, MAKEINTRESOURCE(ffftp_accel));\r
504 \r
505                 // 環境依存の不具合対策\r
506 //              GetTempPath(FMAX_PATH, TmpPath);\r
507                 GetAppTempPath(TmpPath);\r
508                 _mkdir(TmpPath);\r
509                 SetYenTail(TmpPath);\r
510 \r
511                 // 高DPI対応\r
512                 WinWidth = CalcPixelX(WinWidth);\r
513                 WinHeight = CalcPixelY(WinHeight);\r
514                 LocalWidth = CalcPixelX(LocalWidth);\r
515                 TaskHeight = CalcPixelY(TaskHeight);\r
516                 for(i = 0; i < sizeof(LocalTabWidth) / sizeof(int); i++)\r
517                         LocalTabWidth[i] = CalcPixelX(LocalTabWidth[i]);\r
518                 for(i = 0; i < sizeof(RemoteTabWidth) / sizeof(int); i++)\r
519                         RemoteTabWidth[i] = CalcPixelX(RemoteTabWidth[i]);\r
520 \r
521                 GetModuleFileName(NULL, HelpPath, FMAX_PATH);\r
522                 strcpy(GetFileName(HelpPath), "ffftp.chm");\r
523 \r
524                 if(CheckIniFileName(lpszCmdLine, IniPath) == 0)\r
525                 {\r
526                         GetModuleFileName(NULL, IniPath, FMAX_PATH);\r
527                         strcpy(GetFileName(IniPath), "ffftp.ini");\r
528                 }\r
529                 else\r
530                 {\r
531                         ForceIni = YES;\r
532                         RegType = REGTYPE_INI;\r
533                 }\r
534                 // ポータブル版判定\r
535                 GetModuleFileName(NULL, PortableFilePath, FMAX_PATH);\r
536                 strcpy(GetFileName(PortableFilePath), "portable");\r
537                 CheckPortableVersion();\r
538                 ImportPortable = NO;\r
539                 if(PortableVersion == YES)\r
540                 {\r
541                         ForceIni = YES;\r
542                         RegType = REGTYPE_INI;\r
543                         if(IsRegAvailable() == YES && IsIniAvailable() == NO)\r
544                         {\r
545                                 if(DialogBox(GetFtpInst(), MAKEINTRESOURCE(ini_from_reg_dlg), GetMainHwnd(), ExeEscDialogProc) == YES)\r
546                                         ImportPortable = YES;\r
547                         }\r
548                 }\r
549                 // バージョン確認\r
550                 if(ReadSettingsVersion() > VER_NUM)\r
551                 {\r
552                         if(IsRegAvailable() == YES && IsIniAvailable() == NO)\r
553                         {\r
554                                 switch(MessageBox(GetMainHwnd(), MSGJPN351, "FFFTP", MB_YESNOCANCEL | MB_DEFBUTTON2))\r
555                                 {\r
556                                         case IDCANCEL:\r
557                                                 ReadOnlySettings = YES;\r
558                                                 break;\r
559                                         case IDYES:\r
560                                                 break;\r
561                                         case IDNO:\r
562                                                 ImportPortable = YES;\r
563                                                 break;\r
564                                 }\r
565                         }\r
566                 }\r
567                 // ポータブル版判定\r
568                 if(ImportPortable == YES)\r
569                 {\r
570                         ForceIni = NO;\r
571                         RegType = REGTYPE_REG;\r
572                 }\r
573 \r
574 //              AllocConsole();\r
575 \r
576                 /* 2010.02.01 genta マスターパスワードを入力させる\r
577                   -z オプションがあるときは最初だけスキップ\r
578                   -z オプションがないときは,デフォルトパスワードをまず試す\r
579                   LoadRegistry()する\r
580                   パスワードが不一致なら再入力するか尋ねる.\r
581                   (破損していた場合はさせない)\r
582                 */\r
583                 if( CheckMasterPassword(lpszCmdLine, PwdBuf))\r
584                 {\r
585                         SetMasterPassword( PwdBuf );\r
586                         useDefautPassword = 0;\r
587                 }\r
588                 else {\r
589                         /* パスワード指定無し */\r
590                         SetMasterPassword( NULL );\r
591                         /* この場では表示できないのでフラグだけ立てておく*/\r
592                         useDefautPassword = 2;\r
593                 }\r
594 \r
595                 /* パスワードチェックのみ実施 */\r
596                 masterpass = 1;\r
597                 while( ValidateMasterPassword() == YES &&\r
598                                 GetMasterPasswordStatus() == PASSWORD_UNMATCH ){\r
599                         \r
600                         if( useDefautPassword != 2 ){\r
601                                 /* 再トライするか確認 */\r
602                                 if( MessageBox(NULL, MSGJPN304, "FFFTP", MB_YESNO | MB_ICONEXCLAMATION) == IDNO ){\r
603                                         useDefautPassword = 0; /* 不一致なので,もはやデフォルトかどうかは分からない */\r
604                                         break;\r
605                                 }\r
606                         }\r
607                         \r
608                         /* 再入力させる*/\r
609                         masterpass = EnterMasterPasswordAndSet(masterpasswd_dlg, NULL);\r
610                         if( masterpass == 2 ){\r
611                                 useDefautPassword = 1;\r
612                         }\r
613                         else if( masterpass == 0 ){\r
614                                 SaveExit = NO;\r
615                                 break;\r
616                         }\r
617                         else {\r
618                                 useDefautPassword = 0;\r
619                         }\r
620                 }\r
621                 \r
622                 if(masterpass != 0)\r
623                 {\r
624                         LoadRegistry();\r
625 \r
626                         // ポータブル版判定\r
627                         if(ImportPortable == YES)\r
628                         {\r
629                                 ForceIni = YES;\r
630                                 RegType = REGTYPE_INI;\r
631                         }\r
632 \r
633                         // 暗号化通信対応\r
634                         SetSSLTimeoutCallback(TimeOut * 1000, SSLTimeoutCallback);\r
635                         SetSSLConfirmCallback(SSLConfirmCallback);\r
636                         GetModuleFileName(NULL, SSLRootCAFilePath, FMAX_PATH);\r
637                         strcpy(GetFileName(SSLRootCAFilePath), "ssl.pem");\r
638                         LoadSSLRootCAFile();\r
639 \r
640                         LoadJre();\r
641                         if(NoRasControl == NO)\r
642                                 LoadRasLib();\r
643                         LoadKernelLib();\r
644 \r
645                         //タイマの精度を改善\r
646                         timeBeginPeriod(1);\r
647 \r
648                         CountPrevFfftpWindows();\r
649 \r
650                         if(MakeAllWindows(cmdShow) == FFFTP_SUCCESS)\r
651                         {\r
652                                 hWndCurFocus = GetLocalHwnd();\r
653 \r
654                                 if(strlen(DefaultLocalPath) > 0)\r
655                                         SetCurrentDirectory(DefaultLocalPath);\r
656 \r
657                                 SetSortTypeImm(LocalFileSort, LocalDirSort, RemoteFileSort, RemoteDirSort);\r
658                                 SetTransferTypeImm(TransMode);\r
659                                 DispTransferType();\r
660                                 SetHostKanaCnvImm(YES);\r
661                                 SetHostKanjiCodeImm(KANJI_NOCNV);\r
662                                 // UTF-8対応\r
663                                 SetLocalKanjiCodeImm(LocalKanjiCode);\r
664                                 DispListType();\r
665                                 DispDotFileMode();\r
666                                 DispSyncMoveMode();\r
667 \r
668                                 MakeCacheBuf(CacheEntry);\r
669                                 if(CacheSave == YES)\r
670                                         LoadCache();\r
671 \r
672                                 if(MakeTransferThread() == FFFTP_SUCCESS)\r
673                                 {\r
674                                         DoPrintf("DEBUG MESSAGE ON ! ##");\r
675 \r
676                                         DispWindowTitle();\r
677                                         // SourceForge.JPによるフォーク\r
678 //                                      SetTaskMsg("FFFTP Ver." VER_STR " Copyright(C) 1997-2010 Sota & cooperators.");\r
679                                         SetTaskMsg("FFFTP Ver." VER_STR " Copyright(C) 1997-2010 Sota & cooperators.\r\nCopyright (C) 2011-2014 FFFTP Project (Hiromichi Matsushima, Suguru Kawamoto, IWAMOTO Kouichi, vitamin0x, unarist, Asami, fortran90, tomo1192, Yuji Tanaka, Moriguchi Hirokazu, Fu-sen).");\r
680 \r
681                                         if(ForceIni)\r
682                                                 SetTaskMsg("%s%s", MSGJPN283, IniPath);\r
683 \r
684                                         if(IsFolderExist(TmpPath) == NO)\r
685                                         {\r
686                                                 SetTaskMsg(MSGJPN152, TmpPath);\r
687                                                 GetTempPath(FMAX_PATH, TmpPath);\r
688                                                 SetTaskMsg(MSGJPN153, TmpPath);\r
689                                         }\r
690 \r
691                                         DoPrintf("Tmp =%s", TmpPath);\r
692                                         DoPrintf("Help=%s", HelpPath);\r
693 \r
694                                         DragAcceptFiles(GetRemoteHwnd(), TRUE);\r
695                                         DragAcceptFiles(GetLocalHwnd(), TRUE);\r
696 \r
697                                         SetAllHistoryToMenu();\r
698                                         GetLocalDirForWnd();\r
699                                         MakeButtonsFocus();\r
700                                         DispTransferFiles();\r
701 \r
702                                         StartupProc(lpszCmdLine);\r
703                                         sts = FFFTP_SUCCESS;\r
704 \r
705                                         /* セキュリティ警告文の表示 */\r
706                                         if( useDefautPassword ){\r
707                                                 SetTaskMsg(MSGJPN300);\r
708                                         }\r
709                                         \r
710                                         /* パスワード不一致警告文の表示 */\r
711                                         switch( GetMasterPasswordStatus() ){\r
712                                         case PASSWORD_UNMATCH:\r
713                                                 SetTaskMsg(MSGJPN301);\r
714                                                 break;\r
715                                         case BAD_PASSWORD_HASH:\r
716                                                 SetTaskMsg(MSGJPN302);\r
717                                                 break;\r
718                                         default:\r
719                                                 break;\r
720                                         }\r
721                                 }\r
722                         }\r
723                 }\r
724         }\r
725 \r
726         // 暗号化通信対応\r
727 #ifdef USE_OPENSSL\r
728         if(IsOpenSSLLoaded())\r
729                 SetTaskMsg(MSGJPN318);\r
730         else\r
731                 SetTaskMsg(MSGJPN319);\r
732 #endif\r
733 \r
734         if(sts == FFFTP_FAIL)\r
735                 DeleteAllObject();\r
736 \r
737         return(sts);\r
738 }\r
739 \r
740 \r
741 /*----- ウインドウを作成する --------------------------------------------------\r
742 *\r
743 *       Parameter\r
744 *               int cmdShow : 最初に表示するウインドウの形式。\r
745 *\r
746 *       Return Value\r
747 *               int ステータス\r
748 *                       FFFTP_SUCCESS/FFFTP_FAIL\r
749 *----------------------------------------------------------------------------*/\r
750 \r
751 static int MakeAllWindows(int cmdShow)\r
752 {\r
753         RECT Rect1;\r
754         RECT Rect2;\r
755         WNDCLASSEX wClass;\r
756         int Sts;\r
757         int StsTask;\r
758         int StsSbar;\r
759         int StsTbar;\r
760         int StsList;\r
761         int StsLvtips;\r
762         int StsSocket;\r
763 \r
764         /*===== メインウインドウ =====*/\r
765 \r
766         RootColorBrush = CreateSolidBrush(GetSysColor(COLOR_3DFACE));\r
767 \r
768         wClass.cbSize = sizeof(WNDCLASSEX);\r
769         wClass.style         = 0;\r
770         wClass.lpfnWndProc   = FtpWndProc;\r
771         wClass.cbClsExtra    = 0;\r
772         wClass.cbWndExtra    = 0;\r
773         wClass.hInstance     = hInstFtp;\r
774         wClass.hIcon         = LoadIcon(hInstFtp, MAKEINTRESOURCE(ffftp));\r
775         wClass.hCursor       = NULL;\r
776         wClass.hbrBackground = RootColorBrush;\r
777         wClass.lpszMenuName  = (LPSTR)MAKEINTRESOURCE(main_menu);\r
778         wClass.lpszClassName = FtpClassStr;\r
779         wClass.hIconSm       = NULL;\r
780         RegisterClassEx(&wClass);\r
781 \r
782         // 高DPI対応\r
783 //      ToolWinHeight = TOOLWIN_HEIGHT;\r
784         ToolWinHeight = CalcPixelY(16) + 12;\r
785 \r
786         if(SaveWinPos == NO)\r
787         {\r
788                 WinPosX = CW_USEDEFAULT;\r
789                 WinPosY = 0;\r
790         }\r
791         hWndFtp = CreateWindow(FtpClassStr, "FFFTP",\r
792                                 WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,\r
793                                 WinPosX, WinPosY, WinWidth, WinHeight,\r
794                                 HWND_DESKTOP, 0, hInstFtp, NULL);\r
795 \r
796         if(hWndFtp != NULL)\r
797         {\r
798                 SystemParametersInfo(SPI_GETWORKAREA, 0, &Rect1, 0);\r
799                 GetWindowRect(hWndFtp, &Rect2);\r
800                 if(Rect2.bottom > Rect1.bottom)\r
801                 {\r
802                         Rect2.top = max1(0, Rect2.top - (Rect2.bottom - Rect1.bottom));\r
803                         MoveWindow(hWndFtp, Rect2.left, Rect2.top, WinWidth, WinHeight, FALSE);\r
804                 }\r
805 \r
806                 /*===== ステイタスバー =====*/\r
807 \r
808                 StsSbar = MakeStatusBarWindow(hWndFtp, hInstFtp);\r
809 \r
810                 CalcWinSize();\r
811 \r
812                 /*===== ツールバー =====*/\r
813 \r
814                 StsTbar = MakeToolBarWindow(hWndFtp, hInstFtp);\r
815 \r
816                 /*===== ファイルリストウインドウ =====*/\r
817 \r
818                 StsList = MakeListWin(hWndFtp, hInstFtp);\r
819 \r
820                 /*==== タスクウインドウ ====*/\r
821 \r
822                 StsTask = MakeTaskWindow(hWndFtp, hInstFtp);\r
823 \r
824                 if((cmdShow != SW_MINIMIZE) && (cmdShow != SW_SHOWMINIMIZED) && (cmdShow != SW_SHOWMINNOACTIVE) &&\r
825                    (Sizing == SW_MAXIMIZE))\r
826                         cmdShow = SW_MAXIMIZE;\r
827 \r
828                 ShowWindow(hWndFtp, cmdShow);\r
829 \r
830                 /*==== ソケットウインドウ ====*/\r
831 \r
832                 StsSocket = MakeSocketWin(hWndFtp, hInstFtp);\r
833 \r
834                 StsLvtips = InitListViewTips(hWndFtp, hInstFtp);\r
835         }\r
836 \r
837         Sts = FFFTP_SUCCESS;\r
838         if((hWndFtp == NULL) ||\r
839            (StsTbar == FFFTP_FAIL) ||\r
840            (StsList == FFFTP_FAIL) ||\r
841            (StsSbar == FFFTP_FAIL) ||\r
842            (StsTask == FFFTP_FAIL) ||\r
843            (StsLvtips == FFFTP_FAIL) ||\r
844            (StsSocket == FFFTP_FAIL))\r
845         {\r
846                 Sts = FFFTP_FAIL;\r
847         }\r
848 \r
849         if(Sts == FFFTP_SUCCESS)\r
850                 SetListViewType();\r
851 \r
852         return(Sts);\r
853 }\r
854 \r
855 \r
856 /*----- ウインドウのタイトルを表示する ----------------------------------------\r
857 *\r
858 *       Parameter\r
859 *               なし\r
860 *\r
861 *       Return Value\r
862 *               なし\r
863 *----------------------------------------------------------------------------*/\r
864 \r
865 void DispWindowTitle(void)\r
866 {\r
867         char Tmp[HOST_ADRS_LEN+FILTER_EXT_LEN+20];\r
868 \r
869         if(AskConnecting() == YES)\r
870         // 暗号化通信対応\r
871 //              sprintf(Tmp, "%s (%s) - FFFTP", TitleHostName, FilterStr);\r
872         {\r
873                 switch(AskCryptMode())\r
874                 {\r
875                 case CRYPT_NONE:\r
876                         sprintf(Tmp, "%s (%s) %s - FFFTP", TitleHostName, FilterStr, MSGJPN352);\r
877                         break;\r
878                 case CRYPT_FTPES:\r
879                         sprintf(Tmp, "%s (%s) %s - FFFTP", TitleHostName, FilterStr, MSGJPN353);\r
880                         break;\r
881                 case CRYPT_FTPIS:\r
882                         sprintf(Tmp, "%s (%s) %s - FFFTP", TitleHostName, FilterStr, MSGJPN354);\r
883                         break;\r
884                 case CRYPT_SFTP:\r
885                         sprintf(Tmp, "%s (%s) %s - FFFTP", TitleHostName, FilterStr, MSGJPN355);\r
886                         break;\r
887                 }\r
888         }\r
889         else\r
890                 sprintf(Tmp, "FFFTP (%s)", FilterStr);\r
891 \r
892         SetWindowText(GetMainHwnd(), Tmp);\r
893         return;\r
894 }\r
895 \r
896 \r
897 /*----- 全てのオブジェクトを削除 ----------------------------------------------\r
898 *\r
899 *       Parameter\r
900 *               なし\r
901 *\r
902 *       Return Value\r
903 *               なし\r
904 *----------------------------------------------------------------------------*/\r
905 \r
906 static void DeleteAllObject(void)\r
907 {\r
908         DeleteCacheBuf();\r
909 \r
910 //move to WM_DESTROY\r
911         WSACleanup();\r
912 \r
913 //test システム任せ\r
914 //      if(ListFont != NULL)\r
915 //              DeleteObject(ListFont);\r
916 //      if(RootColorBrush != NULL)\r
917 //              DeleteObject(RootColorBrush);\r
918 \r
919 //test システム任せ\r
920 //      DeleteListViewTips();\r
921 //      DeleteListWin();\r
922 //      DeleteStatusBarWindow();\r
923 //      DeleteTaskWindow();\r
924 //      DeleteToolBarWindow();\r
925 //      DeleteSocketWin();\r
926 \r
927 //move to WM_DESTROY\r
928         if(hWndFtp != NULL)\r
929                 DestroyWindow(hWndFtp);\r
930 \r
931         ReleaseJre();\r
932         ReleaseRasLib();\r
933         ReleaseKernelLib();\r
934 \r
935         return;\r
936 }\r
937 \r
938 \r
939 /*----- メインウインドウのウインドウハンドルを返す ----------------------------\r
940 *\r
941 *       Parameter\r
942 *               なし\r
943 *\r
944 *       Return Value\r
945 *               HWND ウインドウハンドル\r
946 *----------------------------------------------------------------------------*/\r
947 \r
948 HWND GetMainHwnd(void)\r
949 {\r
950         return(hWndFtp);\r
951 }\r
952 \r
953 \r
954 /*----- 現在フォーカスがあるウインドウのウインドウハンドルを返す --------------\r
955 *\r
956 *       Parameter\r
957 *               なし\r
958 *\r
959 *       Return Value\r
960 *               HWND ウインドウハンドル\r
961 *----------------------------------------------------------------------------*/\r
962 \r
963 HWND GetFocusHwnd(void)\r
964 {\r
965         return(hWndCurFocus);\r
966 }\r
967 \r
968 \r
969 /*----- 現在フォーカスがあるウインドウのをセットする --------------------------\r
970 *\r
971 *       Parameter\r
972 *               HWND hWnd : ウインドウハンドル\r
973 *\r
974 *       Return Value\r
975 *               なし\r
976 *----------------------------------------------------------------------------*/\r
977 \r
978 void SetFocusHwnd(HWND hWnd)\r
979 {\r
980         hWndCurFocus = hWnd;\r
981         return;\r
982 }\r
983 \r
984 \r
985 /*----- プログラムのインスタンスを返す ----------------------------------------\r
986 *\r
987 *       Parameter\r
988 *               なし\r
989 *\r
990 *       Return Value\r
991 *               HINSTANCE インスタンス\r
992 *----------------------------------------------------------------------------*/\r
993 \r
994 HINSTANCE GetFtpInst(void)\r
995 {\r
996         return(hInstFtp);\r
997 }\r
998 \r
999 \r
1000 /*----- メインウインドウのメッセージ処理 --------------------------------------\r
1001 *\r
1002 *       Parameter\r
1003 *               HWND hWnd : ウインドウハンドル\r
1004 *               UINT message  : メッセージ番号\r
1005 *               WPARAM wParam : メッセージの WPARAM 引数\r
1006 *               LPARAM lParam : メッセージの LPARAM 引数\r
1007 *\r
1008 *       Return Value\r
1009 *               メッセージに対応する戻り値\r
1010 *----------------------------------------------------------------------------*/\r
1011 \r
1012 static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)\r
1013 {\r
1014         PAINTSTRUCT ps;\r
1015         LPTOOLTIPTEXT lpttt;\r
1016         // UTF-8対応\r
1017         LPTOOLTIPTEXTW wlpttt;\r
1018         RECT Rect;\r
1019 \r
1020         int TmpTransType;\r
1021 \r
1022         switch (message)\r
1023         {\r
1024                 // ローカル側自動更新\r
1025                 // タスクバー進捗表示\r
1026                 case WM_CREATE :\r
1027                         SetTimer(hWnd, 1, 1000, NULL);\r
1028                         SetTimer(hWnd, 2, 100, NULL);\r
1029                         break;\r
1030 \r
1031                 // ローカル側自動更新\r
1032                 // 自動切断対策\r
1033                 // タスクバー進捗表示\r
1034                 case WM_TIMER :\r
1035                         switch(wParam)\r
1036                         {\r
1037                         case 1:\r
1038                                 if(WaitForSingleObject(ChangeNotification, 0) == WAIT_OBJECT_0)\r
1039                                 {\r
1040                                         if(AskUserOpeDisabled() == NO)\r
1041                                         {\r
1042                                                 FindNextChangeNotification(ChangeNotification);\r
1043                                                 if(AutoRefreshFileList == YES)\r
1044                                                 {\r
1045                                                         FILELIST* Base;\r
1046                                                         char Name[FMAX_PATH+1];\r
1047                                                         int Pos;\r
1048                                                         Base = NULL;\r
1049                                                         MakeSelectedFileList(WIN_LOCAL, NO, NO, &Base, &CancelFlg);\r
1050                                                         GetHotSelected(WIN_LOCAL, Name);\r
1051                                                         Pos = SendMessage(GetLocalHwnd(), LVM_GETTOPINDEX, 0, 0);\r
1052                                                         GetLocalDirForWnd();\r
1053                                                         SelectFileInList(GetLocalHwnd(), SELECT_LIST, Base);\r
1054                                                         SetHotSelected(WIN_LOCAL, Name);\r
1055                                                         SendMessage(GetLocalHwnd(), LVM_ENSUREVISIBLE, (WPARAM)(SendMessage(GetLocalHwnd(), LVM_GETITEMCOUNT, 0, 0) - 1), (LPARAM)TRUE);\r
1056                                                         SendMessage(GetLocalHwnd(), LVM_ENSUREVISIBLE, (WPARAM)Pos, (LPARAM)TRUE);\r
1057                                                 }\r
1058                                         }\r
1059                                 }\r
1060                                 if(NoopEnable == YES && AskNoopInterval() > 0 && time(NULL) - LastDataConnectionTime >= AskNoopInterval())\r
1061                                 {\r
1062                                         NoopProc(NO);\r
1063                                         LastDataConnectionTime = time(NULL);\r
1064                                 }\r
1065                                 break;\r
1066                         case 2:\r
1067                                 if(IsTaskbarList3Loaded() == YES)\r
1068                                         UpdateTaskbarProgress();\r
1069                                 break;\r
1070                         }\r
1071                         break;\r
1072 \r
1073                 case WM_COMMAND :\r
1074                         // 同時接続対応\r
1075                         // 中断後に受信バッファに応答が残っていると次のコマンドの応答が正しく処理できない\r
1076                         if(CancelFlg == YES)\r
1077                                 RemoveReceivedData(AskCmdCtrlSkt());\r
1078                         switch(LOWORD(wParam))\r
1079                         {\r
1080                                 case MENU_CONNECT :\r
1081                                         // 自動切断対策\r
1082                                         NoopEnable = NO;\r
1083                                         ConnectProc(DLG_TYPE_CON, -1);\r
1084                                         // 自動切断対策\r
1085                                         NoopEnable = YES;\r
1086                                         break;\r
1087 \r
1088                                 case MENU_CONNECT_NUM :\r
1089                                         // 自動切断対策\r
1090                                         NoopEnable = NO;\r
1091                                         ConnectProc(DLG_TYPE_CON, (int)lParam);\r
1092                                         // 自動切断対策\r
1093                                         NoopEnable = YES;\r
1094                                         if(AskConnecting() == YES)\r
1095                                         {\r
1096                                                 if(HIWORD(wParam) & OPT_MIRROR)\r
1097                                                 {\r
1098                                                         if(HIWORD(wParam) & OPT_FORCE)\r
1099                                                                 MirrorUploadProc(NO);\r
1100                                                         else\r
1101                                                                 MirrorUploadProc(YES);\r
1102                                                 }\r
1103                                                 else if(HIWORD(wParam) & OPT_MIRRORDOWN)\r
1104                                                 {\r
1105                                                         if(HIWORD(wParam) & OPT_FORCE)\r
1106                                                                 MirrorDownloadProc(NO);\r
1107                                                         else\r
1108                                                                 MirrorDownloadProc(YES);\r
1109                                                 }\r
1110                                         }\r
1111                                         break;\r
1112 \r
1113                                 case MENU_SET_CONNECT :\r
1114                                         // 自動切断対策\r
1115                                         NoopEnable = NO;\r
1116                                         ConnectProc(DLG_TYPE_SET, -1);\r
1117                                         // 自動切断対策\r
1118                                         NoopEnable = YES;\r
1119                                         break;\r
1120 \r
1121                                 case MENU_QUICK :\r
1122                                         // 自動切断対策\r
1123                                         NoopEnable = NO;\r
1124                                         QuickConnectProc();\r
1125                                         // 自動切断対策\r
1126                                         NoopEnable = YES;\r
1127                                         break;\r
1128 \r
1129                                 case MENU_DISCONNECT :\r
1130                                         if(AskTryingConnect() == YES)\r
1131                                                 CancelFlg = YES;\r
1132                                         else if(AskConnecting() == YES)\r
1133                                         {\r
1134                                                 SaveBookMark();\r
1135                                                 SaveCurrentSetToHost();\r
1136                                                 DisconnectProc();\r
1137                                         }\r
1138                                         break;\r
1139 \r
1140                                 case MENU_HIST_1 :\r
1141                                 case MENU_HIST_2 :\r
1142                                 case MENU_HIST_3 :\r
1143                                 case MENU_HIST_4 :\r
1144                                 case MENU_HIST_5 :\r
1145                                 case MENU_HIST_6 :\r
1146                                 case MENU_HIST_7 :\r
1147                                 case MENU_HIST_8 :\r
1148                                 case MENU_HIST_9 :\r
1149                                 case MENU_HIST_10 :\r
1150                                 case MENU_HIST_11 :\r
1151                                 case MENU_HIST_12 :\r
1152                                 case MENU_HIST_13 :\r
1153                                 case MENU_HIST_14 :\r
1154                                 case MENU_HIST_15 :\r
1155                                 case MENU_HIST_16 :\r
1156                                 case MENU_HIST_17 :\r
1157                                 case MENU_HIST_18 :\r
1158                                 case MENU_HIST_19 :\r
1159                                 case MENU_HIST_20 :\r
1160                                         // 自動切断対策\r
1161                                         NoopEnable = NO;\r
1162                                         HistoryConnectProc(LOWORD(wParam));\r
1163                                         // 自動切断対策\r
1164                                         NoopEnable = YES;\r
1165                                         break;\r
1166 \r
1167                                 case MENU_UPDIR :\r
1168                                         if(hWndCurFocus == GetLocalHwnd())\r
1169                                                 PostMessage(hWnd, WM_COMMAND, MAKEWPARAM(MENU_LOCAL_UPDIR, 0), 0);\r
1170                                         else\r
1171                                                 PostMessage(hWnd, WM_COMMAND, MAKEWPARAM(MENU_REMOTE_UPDIR, 0), 0);\r
1172                                         break;\r
1173 \r
1174                                 case MENU_DCLICK :\r
1175                                         if(hWndCurFocus == GetLocalHwnd())\r
1176                                                 // ローカルフォルダを開く\r
1177 //                                              DoubleClickProc(WIN_LOCAL, YES, -1);\r
1178                                                 DoubleClickProc(WIN_LOCAL, NO, -1);\r
1179                                         else\r
1180                                         {\r
1181                                                 SuppressRefresh = 1;\r
1182                                                 // ローカルフォルダを開く\r
1183 //                                              DoubleClickProc(WIN_REMOTE, YES, -1);\r
1184                                                 DoubleClickProc(WIN_REMOTE, NO, -1);\r
1185                                                 SuppressRefresh = 0;\r
1186                                         }\r
1187                                         break;\r
1188 \r
1189                                 // ローカルフォルダを開く\r
1190                                 case MENU_OPEN :\r
1191                                         if(hWndCurFocus == GetLocalHwnd())\r
1192                                                 DoubleClickProc(WIN_LOCAL, YES, -1);\r
1193                                         else\r
1194                                         {\r
1195                                                 SuppressRefresh = 1;\r
1196                                                 DoubleClickProc(WIN_REMOTE, YES, -1);\r
1197                                                 SuppressRefresh = 0;\r
1198                                         }\r
1199                                         break;\r
1200 \r
1201                                 case MENU_OPEN1 :\r
1202                                         if(hWndCurFocus == GetLocalHwnd())\r
1203                                                 DoubleClickProc(WIN_LOCAL, YES, 0);\r
1204                                         else\r
1205                                         {\r
1206                                                 SuppressRefresh = 1;\r
1207                                                 DoubleClickProc(WIN_REMOTE, YES, 0);\r
1208                                                 SuppressRefresh = 0;\r
1209                                         }\r
1210                                         break;\r
1211 \r
1212                                 case MENU_OPEN2 :\r
1213                                         if(hWndCurFocus == GetLocalHwnd())\r
1214                                                 DoubleClickProc(WIN_LOCAL, YES, 1);\r
1215                                         else\r
1216                                         {\r
1217                                                 SuppressRefresh = 1;\r
1218                                                 DoubleClickProc(WIN_REMOTE, YES, 1);\r
1219                                                 SuppressRefresh = 0;\r
1220                                         }\r
1221                                         break;\r
1222 \r
1223                                 case MENU_OPEN3 :\r
1224                                         if(hWndCurFocus == GetLocalHwnd())\r
1225                                                 DoubleClickProc(WIN_LOCAL, YES, 2);\r
1226                                         else\r
1227                                         {\r
1228                                                 SuppressRefresh = 1;\r
1229                                                 DoubleClickProc(WIN_REMOTE, YES, 2);\r
1230                                                 SuppressRefresh = 0;\r
1231                                         }\r
1232                                         break;\r
1233 \r
1234                                 case MENU_REMOTE_UPDIR :\r
1235                                         // デッドロック対策\r
1236                                         if(AskUserOpeDisabled() == YES)\r
1237                                                 break;\r
1238                                         SuppressRefresh = 1;\r
1239                                         SetCurrentDirAsDirHist();\r
1240                                         ChangeDir(WIN_REMOTE, "..");\r
1241                                         SuppressRefresh = 0;\r
1242                                         break;\r
1243 \r
1244                                 case MENU_LOCAL_UPDIR :\r
1245                                         // デッドロック対策\r
1246                                         if(AskUserOpeDisabled() == YES)\r
1247                                                 break;\r
1248                                         SetCurrentDirAsDirHist();\r
1249                                         ChangeDir(WIN_LOCAL, "..");\r
1250                                         break;\r
1251 \r
1252                                 case MENU_REMOTE_CHDIR :\r
1253                                         SuppressRefresh = 1;\r
1254                                         SetCurrentDirAsDirHist();\r
1255                                         ChangeDirDirectProc(WIN_REMOTE);\r
1256                                         SuppressRefresh = 0;\r
1257                                         break;\r
1258 \r
1259                                 case MENU_LOCAL_CHDIR :\r
1260                                         SetCurrentDirAsDirHist();\r
1261                                         ChangeDirDirectProc(WIN_LOCAL);\r
1262                                         break;\r
1263 \r
1264                                 case MENU_DOWNLOAD :\r
1265                                         SetCurrentDirAsDirHist();\r
1266                                         DownloadProc(NO, NO, NO);\r
1267                                         break;\r
1268 \r
1269                                 case MENU_DOWNLOAD_AS :\r
1270                                         SetCurrentDirAsDirHist();\r
1271                                         DownloadProc(YES, NO, NO);\r
1272                                         break;\r
1273 \r
1274                                 case MENU_DOWNLOAD_AS_FILE :\r
1275                                         SetCurrentDirAsDirHist();\r
1276                                         DownloadProc(NO, YES, NO);\r
1277                                         break;\r
1278 \r
1279                                 case MENU_DOWNLOAD_ALL :\r
1280                                         SetCurrentDirAsDirHist();\r
1281                                         DownloadProc(NO, NO, YES);\r
1282                                         break;\r
1283 \r
1284                                 case MENU_DOWNLOAD_NAME :\r
1285                                         SetCurrentDirAsDirHist();\r
1286                                         InputDownloadProc();\r
1287                                         break;\r
1288 \r
1289                                 case MENU_UPLOAD :\r
1290                                         SetCurrentDirAsDirHist();\r
1291                                         UploadListProc(NO, NO);\r
1292                                         break;\r
1293 \r
1294                                 case MENU_UPLOAD_AS :\r
1295                                         SetCurrentDirAsDirHist();\r
1296                                         UploadListProc(YES, NO);\r
1297                                         break;\r
1298 \r
1299                                 case MENU_UPLOAD_ALL :\r
1300                                         SetCurrentDirAsDirHist();\r
1301                                         UploadListProc(NO, YES);\r
1302                                         break;\r
1303 \r
1304                                 case MENU_MIRROR_UPLOAD :\r
1305                                         SetCurrentDirAsDirHist();\r
1306                                         MirrorUploadProc(YES);\r
1307                                         break;\r
1308 \r
1309                                 case MENU_MIRROR_DOWNLOAD :\r
1310                                         SetCurrentDirAsDirHist();\r
1311                                         MirrorDownloadProc(YES);\r
1312                                         break;\r
1313 \r
1314                                 case MENU_FILESIZE :\r
1315                                         SetCurrentDirAsDirHist();\r
1316                                         CalcFileSizeProc();\r
1317                                         break;\r
1318 \r
1319                                 case MENU_DELETE :\r
1320                                         SuppressRefresh = 1;\r
1321                                         SetCurrentDirAsDirHist();\r
1322                                         DeleteProc();\r
1323                                         SuppressRefresh = 0;\r
1324                                         break;\r
1325 \r
1326                                 case MENU_RENAME :\r
1327                                         SuppressRefresh = 1;\r
1328                                         SetCurrentDirAsDirHist();\r
1329                                         RenameProc();\r
1330                                         SuppressRefresh = 0;\r
1331                                         break;\r
1332 \r
1333                                 case MENU_MKDIR :\r
1334                                         SuppressRefresh = 1;\r
1335                                         SetCurrentDirAsDirHist();\r
1336                                         MkdirProc();\r
1337                                         SuppressRefresh = 0;\r
1338                                         break;\r
1339 \r
1340                                 case MENU_CHMOD :\r
1341                                         SuppressRefresh = 1;\r
1342                                         ChmodProc();\r
1343                                         SuppressRefresh = 0;\r
1344                                         break;\r
1345 \r
1346                                 case MENU_SOMECMD :\r
1347                                         SuppressRefresh = 1;\r
1348                                         SomeCmdProc();\r
1349                                         SuppressRefresh = 0;\r
1350                                         break;\r
1351 \r
1352                                 case MENU_OPTION :\r
1353                                         SetOption(0);\r
1354                                         if(ListFont != NULL)\r
1355                                         {\r
1356                                                 SendMessage(GetLocalHwnd(), WM_SETFONT, (WPARAM)ListFont, MAKELPARAM(TRUE, 0));\r
1357                                                 SendMessage(GetRemoteHwnd(), WM_SETFONT, (WPARAM)ListFont, MAKELPARAM(TRUE, 0));\r
1358                                                 SendMessage(GetTaskWnd(), WM_SETFONT, (WPARAM)ListFont, MAKELPARAM(TRUE, 0));\r
1359                                         }\r
1360                                         GetLocalDirForWnd();\r
1361                                         DispTransferType();\r
1362                                         CheckHistoryNum(0);\r
1363                                         SetAllHistoryToMenu();\r
1364                                         // 暗号化通信対応\r
1365                                         SetSSLTimeoutCallback(TimeOut * 1000, SSLTimeoutCallback);\r
1366                                         break;\r
1367 \r
1368                                 case MENU_FILTER :\r
1369                                         // 同時接続対応\r
1370                                         CancelFlg = NO;\r
1371                                         SetFilter(&CancelFlg);\r
1372                                         break;\r
1373 \r
1374                                 case MENU_SORT :\r
1375                                         if(SortSetting() == YES)\r
1376                                         {\r
1377                                                 // 同時接続対応\r
1378                                                 CancelFlg = NO;\r
1379                                                 LocalFileSort = AskSortType(ITEM_LFILE);\r
1380                                                 LocalDirSort = AskSortType(ITEM_LDIR);\r
1381                                                 RemoteFileSort = AskSortType(ITEM_RFILE);\r
1382                                                 RemoteDirSort = AskSortType(ITEM_RDIR);\r
1383                                                 ReSortDispList(WIN_LOCAL, &CancelFlg);\r
1384                                                 ReSortDispList(WIN_REMOTE, &CancelFlg);\r
1385                                         }\r
1386                                         break;\r
1387 \r
1388                                 case MENU_EXIT :\r
1389                                         PostMessage(hWnd, WM_CLOSE, 0, 0L);\r
1390                                         break;\r
1391 \r
1392                                 case MENU_AUTO_EXIT :\r
1393                                         if(AutoExit == YES)\r
1394                                                 PostMessage(hWnd, WM_CLOSE, 0, 0L);\r
1395                                         break;\r
1396 \r
1397                                 case MENU_ABOUT :\r
1398                                         DialogBox(hInstFtp, MAKEINTRESOURCE(about_dlg), hWnd, AboutDialogProc);\r
1399                                         break;\r
1400 \r
1401                                 case MENU_TEXT :\r
1402                                 case MENU_BINARY :\r
1403                                 case MENU_AUTO :\r
1404                                         SetTransferType(LOWORD(wParam));\r
1405                                         DispTransferType();\r
1406                                         break;\r
1407 \r
1408                                 case MENU_XFRMODE :\r
1409                                         switch(AskTransferType())\r
1410                                         {\r
1411                                                 case TYPE_A :\r
1412                                                         TmpTransType = MENU_BINARY;\r
1413                                                         break;\r
1414 \r
1415                                                 case TYPE_I :\r
1416                                                         TmpTransType = MENU_AUTO;\r
1417                                                         break;\r
1418 \r
1419                                                 default :\r
1420                                                         TmpTransType = MENU_TEXT;\r
1421                                                         break;\r
1422                                         }\r
1423                                         SetTransferType(TmpTransType);\r
1424                                         DispTransferType();\r
1425                                         break;\r
1426 \r
1427                                 // UTF-8対応\r
1428                                 case MENU_KNJ_SJIS :\r
1429                                 case MENU_KNJ_EUC :\r
1430                                 case MENU_KNJ_JIS :\r
1431                                 case MENU_KNJ_UTF8N :\r
1432                                 case MENU_KNJ_UTF8BOM :\r
1433                                 case MENU_KNJ_NONE :\r
1434                                         SetHostKanjiCode(LOWORD(wParam));\r
1435                                         break;\r
1436 \r
1437                                 case MENU_L_KNJ_SJIS :\r
1438                                 case MENU_L_KNJ_EUC :\r
1439                                 case MENU_L_KNJ_JIS :\r
1440                                 case MENU_L_KNJ_UTF8N :\r
1441                                 case MENU_L_KNJ_UTF8BOM :\r
1442                                         SetLocalKanjiCode(LOWORD(wParam));\r
1443                                         break;\r
1444 \r
1445                                 case MENU_KANACNV :\r
1446                                         SetHostKanaCnv();\r
1447                                         break;\r
1448 \r
1449                                 case MENU_REFRESH :\r
1450                                         // デッドロック対策\r
1451                                         if(AskUserOpeDisabled() == YES)\r
1452                                                 break;\r
1453                                         // 同時接続対応\r
1454                                         CancelFlg = NO;\r
1455                                         SuppressRefresh = 1;\r
1456                                         GetLocalDirForWnd();\r
1457                                         if(CheckClosedAndReconnect() == FFFTP_SUCCESS)\r
1458                                                 GetRemoteDirForWnd(CACHE_REFRESH, &CancelFlg);\r
1459                                         SuppressRefresh = 0;\r
1460                                         break;\r
1461 \r
1462                                 case MENU_LIST :\r
1463                                         ListType = LVS_LIST;\r
1464                                         DispListType();\r
1465                                         SetListViewType();\r
1466                                         break;\r
1467 \r
1468                                 case MENU_REPORT :\r
1469                                         ListType = LVS_REPORT;\r
1470                                         DispListType();\r
1471                                         SetListViewType();\r
1472                                         break;\r
1473 \r
1474                                 case REFRESH_LOCAL :\r
1475                                         // デッドロック対策\r
1476                                         if(AskUserOpeDisabled() == YES)\r
1477                                                 break;\r
1478                                         GetLocalDirForWnd();\r
1479                                         break;\r
1480 \r
1481                                 case REFRESH_REMOTE :\r
1482                                         // デッドロック対策\r
1483                                         if(AskUserOpeDisabled() == YES)\r
1484                                                 break;\r
1485                                         // 同時接続対応\r
1486                                         CancelFlg = NO;\r
1487                                         SuppressRefresh = 1;\r
1488                                         if(CheckClosedAndReconnect() == FFFTP_SUCCESS)\r
1489                                                 GetRemoteDirForWnd(CACHE_REFRESH, &CancelFlg);\r
1490                                         SuppressRefresh = 0;\r
1491                                         break;\r
1492 \r
1493                                 case COMBO_LOCAL :\r
1494                                 case COMBO_REMOTE :\r
1495                                         SuppressRefresh = 1;\r
1496                                         if(HIWORD(wParam) == CBN_SELCHANGE)\r
1497                                         {\r
1498                                                 SetCurrentDirAsDirHist();\r
1499                                                 ChangeDirComboProc((HWND)lParam);\r
1500                                         }\r
1501                                         else if(HIWORD(wParam) != CBN_CLOSEUP)\r
1502                                         {\r
1503                                                 MakeButtonsFocus();\r
1504                                                 SuppressRefresh = 0;\r
1505                                                 return(0);\r
1506                                         }\r
1507                                         SuppressRefresh = 0;\r
1508                                         break;\r
1509 \r
1510                                 case MENU_HELP :\r
1511                                         hHelpWin = HtmlHelp(NULL, AskHelpFilePath(), HH_HELP_CONTEXT, IDH_HELP_TOPIC_0000001);\r
1512                                         break;\r
1513 \r
1514                                 case MENU_HELP_TROUBLE :\r
1515                                         // 任意のコードが実行されるバグ修正\r
1516 //                                      ShellExecute(NULL, "open", MYWEB_URL, NULL, ".", SW_SHOW);\r
1517                                         ShellExecute(NULL, "open", MYWEB_URL, NULL, NULL, SW_SHOW);\r
1518                                         break;\r
1519 \r
1520                                 case MENU_BMARK_ADD :\r
1521                                         AddCurDirToBookMark(WIN_REMOTE);\r
1522                                         break;\r
1523 \r
1524                                 case MENU_BMARK_ADD_LOCAL :\r
1525                                         AddCurDirToBookMark(WIN_LOCAL);\r
1526                                         break;\r
1527 \r
1528                                 case MENU_BMARK_ADD_BOTH :\r
1529                                         AddCurDirToBookMark(WIN_BOTH);\r
1530                                         break;\r
1531 \r
1532                                 case MENU_BMARK_EDIT :\r
1533                                         EditBookMark();\r
1534                                         break;\r
1535 \r
1536                                 case MENU_SELECT_ALL :\r
1537                                         // ローカル側自動更新\r
1538 //                                      SelectFileInList(hWndCurFocus, SELECT_ALL);\r
1539                                         SelectFileInList(hWndCurFocus, SELECT_ALL, NULL);\r
1540                                         break;\r
1541 \r
1542                                 case MENU_SELECT :\r
1543                                         // ローカル側自動更新\r
1544 //                                      SelectFileInList(hWndCurFocus, SELECT_REGEXP);\r
1545                                         SelectFileInList(hWndCurFocus, SELECT_REGEXP, NULL);\r
1546                                         break;\r
1547 \r
1548                                 case MENU_FIND :\r
1549                                         FindFileInList(hWndCurFocus, FIND_FIRST);\r
1550                                         break;\r
1551 \r
1552                                 case MENU_FINDNEXT :\r
1553                                         FindFileInList(hWndCurFocus, FIND_NEXT);\r
1554                                         break;\r
1555 \r
1556                                 case MENU_DOTFILE :\r
1557                                         // デッドロック対策\r
1558                                         if(AskUserOpeDisabled() == YES)\r
1559                                                 break;\r
1560                                         // 同時接続対応\r
1561                                         CancelFlg = NO;\r
1562                                         DotFile ^= 1;\r
1563                                         DispDotFileMode();\r
1564                                         GetLocalDirForWnd();\r
1565                                         GetRemoteDirForWnd(CACHE_LASTREAD, &CancelFlg);\r
1566                                         break;\r
1567 \r
1568                                 case MENU_SYNC :\r
1569                                         ToggleSyncMoveMode();\r
1570                                         break;\r
1571 \r
1572                                 case MENU_IMPORT_WS :\r
1573                                         ImportFromWSFTP();\r
1574                                         break;\r
1575 \r
1576                                 case MENU_REGSAVE :\r
1577                                         GetListTabWidth();\r
1578                                         SaveRegistry();\r
1579                                         SaveSettingsToFile();\r
1580                                         break;\r
1581 \r
1582                                 case MENU_REGLOAD :\r
1583                                         if(LoadSettingsFromFile() == YES)\r
1584                                         {\r
1585                                                 MessageBox(hWnd, MSGJPN292, "FFFTP", MB_OK);\r
1586                                                 SaveExit = NO;\r
1587                                                 PostMessage(hWnd, WM_CLOSE, 0, 0L);\r
1588                                         }\r
1589                                         break;\r
1590 \r
1591                                 case MENU_REGINIT :\r
1592                                         if(DialogBox(hInstFtp, MAKEINTRESOURCE(reginit_dlg), hWnd, ExeEscDialogProc) == YES)\r
1593                                         {\r
1594                                                 ClearRegistry();\r
1595                                                 // ポータブル版判定\r
1596                                                 ClearIni();\r
1597                                                 SaveExit = NO;\r
1598                                                 PostMessage(hWnd, WM_CLOSE, 0, 0L);\r
1599                                         }\r
1600                                         break;\r
1601                                 case MENU_CHANGEPASSWD: /* 2010.01.31 genta */\r
1602                                         if( GetMasterPasswordStatus() != PASSWORD_OK )\r
1603                                         {\r
1604                                                 /* 強制的に設定するか確認 */\r
1605                                                 if( DialogBox(hInstFtp, MAKEINTRESOURCE(forcepasschange_dlg), hWnd, ExeEscDialogProc) != YES){\r
1606                                                         break;\r
1607                                                 }\r
1608                                                 // セキュリティ強化\r
1609                                                 if(EnterMasterPasswordAndSet(newmasterpasswd_dlg, hWnd) != 0)\r
1610                                                         SetTaskMsg(MSGJPN303);\r
1611                                         }\r
1612                                         // セキュリティ強化\r
1613 //                                      if( EnterMasterPasswordAndSet( newmasterpasswd_dlg, hWnd ) != 0 ){\r
1614 //                                              SetTaskMsg( MSGJPN303 );\r
1615 //                                      }\r
1616                                         else if(GetMasterPasswordStatus() == PASSWORD_OK)\r
1617                                         {\r
1618                                                 char Password[MAX_PASSWORD_LEN + 1];\r
1619                                                 GetMasterPassword(Password);\r
1620                                                 SetMasterPassword(NULL);\r
1621                                                 while(ValidateMasterPassword() == YES && GetMasterPasswordStatus() == PASSWORD_UNMATCH)\r
1622                                                 {\r
1623                                                         if(EnterMasterPasswordAndSet(masterpasswd_dlg, NULL) == 0)\r
1624                                                                 break;\r
1625                                                 }\r
1626                                                 if(GetMasterPasswordStatus() == PASSWORD_OK && EnterMasterPasswordAndSet(newmasterpasswd_dlg, hWnd) != 0)\r
1627                                                 {\r
1628                                                         SetTaskMsg(MSGJPN303);\r
1629                                                         SaveRegistry();\r
1630                                                 }\r
1631                                                 else\r
1632                                                 {\r
1633                                                         SetMasterPassword(Password);\r
1634                                                         ValidateMasterPassword();\r
1635                                                 }\r
1636                                         }\r
1637                                         break;\r
1638 \r
1639                                 case MENU_DIRINFO :\r
1640                                         DispDirInfo();\r
1641                                         break;\r
1642 \r
1643                                 case MENU_TASKINFO :\r
1644                                         DispTaskMsg();\r
1645                                         break;\r
1646 \r
1647                                 case MENU_ABORT :\r
1648                                         CancelFlg = YES;\r
1649                                         if(AskTryingConnect() == NO)\r
1650                                                 MainTransPkt.Abort = ABORT_USER;\r
1651                                         break;\r
1652 \r
1653                                 case MENU_OTPCALC :\r
1654                                         OtpCalcTool();\r
1655                                         break;\r
1656 \r
1657                                 // FTPS対応\r
1658                                 case MENU_FW_FTP_FILTER :\r
1659                                         TurnStatefulFTPFilter();\r
1660                                         break;\r
1661 \r
1662                                 case MENU_URL_COPY :\r
1663                                         CopyURLtoClipBoard();\r
1664                                         break;\r
1665 \r
1666                                 case MENU_APPKEY :\r
1667                                         EraseListViewTips();\r
1668                                         if(hWndCurFocus == GetRemoteHwnd())\r
1669                                                 RemoteRbuttonMenu(1);\r
1670                                         else if(hWndCurFocus == GetLocalHwnd())\r
1671                                                 LocalRbuttonMenu(1);\r
1672                                         break;\r
1673 \r
1674 #if defined(HAVE_TANDEM)\r
1675                                 case MENU_SWITCH_OSS :\r
1676                                         SwitchOSSProc();\r
1677                                         break;\r
1678 #endif\r
1679 \r
1680                                 // 上位のディレクトリへ移動対応\r
1681                                 case MENU_REMOTE_MOVE_UPDIR :\r
1682                                         MoveRemoteFileProc(-1);\r
1683                                         break;\r
1684 \r
1685                                 default :\r
1686                                         if((LOWORD(wParam) >= MENU_BMARK_TOP) &&\r
1687                                            (LOWORD(wParam) < MENU_BMARK_TOP+100))\r
1688                                         {\r
1689                                                 ChangeDirBmarkProc(LOWORD(wParam));\r
1690                                         }\r
1691                                         break;\r
1692                         }\r
1693 // 常にホストかローカルへフォーカスを移動\r
1694 //                      SetFocus(hWndCurFocus);\r
1695                         MakeButtonsFocus();\r
1696                         break;\r
1697 \r
1698                 case WM_NOTIFY :\r
1699                         switch(((LPNMHDR)lParam)->code)\r
1700                         {\r
1701                                 /* ツールチップコントロールメッセージの処理 */\r
1702                                 // UTF-8対応\r
1703 //                              case TTN_NEEDTEXT:\r
1704                                 case TTN_NEEDTEXTW:\r
1705                                         lpttt = (LPTOOLTIPTEXT)lParam;\r
1706                                         // UTF-8対応\r
1707                                         // lptttは単なる警告回避用\r
1708                                         wlpttt = (LPTOOLTIPTEXTW)lParam;\r
1709                                         lpttt->hinst = hInstFtp;\r
1710                                         switch(lpttt->hdr.idFrom)\r
1711                                         {\r
1712                                                 case MENU_CONNECT :\r
1713                                                         lpttt->lpszText = MSGJPN154;\r
1714                                                         break;\r
1715 \r
1716                                                 case MENU_QUICK :\r
1717                                                         lpttt->lpszText = MSGJPN155;\r
1718                                                         break;\r
1719 \r
1720                                                 case MENU_DISCONNECT :\r
1721                                                         lpttt->lpszText = MSGJPN156;\r
1722                                                         break;\r
1723 \r
1724                                                 case MENU_DOWNLOAD :\r
1725                                                         lpttt->lpszText = MSGJPN157;\r
1726                                                         break;\r
1727 #if defined(HAVE_TANDEM)\r
1728                                                 case MENU_DOWNLOAD_AS :\r
1729                                                         lpttt->lpszText = MSGJPN065;\r
1730                                                         break;\r
1731 \r
1732                                                 case MENU_UPLOAD_AS :\r
1733                                                         lpttt->lpszText = MSGJPN064;\r
1734                                                         break;\r
1735 #endif\r
1736                                                 case MENU_UPLOAD :\r
1737                                                         lpttt->lpszText = MSGJPN158;\r
1738                                                         break;\r
1739 \r
1740                                                 case MENU_MIRROR_UPLOAD :\r
1741                                                         lpttt->lpszText = MSGJPN159;\r
1742                                                         break;\r
1743 \r
1744                                                 case MENU_DELETE :\r
1745                                                         lpttt->lpszText = MSGJPN160;\r
1746                                                         break;\r
1747 \r
1748                                                 case MENU_RENAME :\r
1749                                                         lpttt->lpszText = MSGJPN161;\r
1750                                                         break;\r
1751 \r
1752                                                 case MENU_MKDIR :\r
1753                                                         lpttt->lpszText = MSGJPN162;\r
1754                                                         break;\r
1755 \r
1756                                                 case MENU_LOCAL_UPDIR :\r
1757                                                 case MENU_REMOTE_UPDIR :\r
1758                                                         lpttt->lpszText = MSGJPN163;\r
1759                                                         break;\r
1760 \r
1761                                                 case MENU_LOCAL_CHDIR :\r
1762                                                 case MENU_REMOTE_CHDIR :\r
1763                                                         lpttt->lpszText = MSGJPN164;\r
1764                                                         break;\r
1765 \r
1766                                                 case MENU_TEXT :\r
1767                                                         lpttt->lpszText = MSGJPN165;\r
1768                                                         break;\r
1769 \r
1770                                                 case MENU_BINARY :\r
1771                                                         lpttt->lpszText = MSGJPN166;\r
1772                                                         break;\r
1773 \r
1774                                                 case MENU_AUTO :\r
1775                                                         lpttt->lpszText = MSGJPN167;\r
1776                                                         break;\r
1777 \r
1778                                                 case MENU_REFRESH :\r
1779                                                         lpttt->lpszText = MSGJPN168;\r
1780                                                         break;\r
1781 \r
1782                                                 case MENU_LIST :\r
1783                                                         lpttt->lpszText = MSGJPN169;\r
1784                                                         break;\r
1785 \r
1786                                                 case MENU_REPORT :\r
1787                                                         lpttt->lpszText = MSGJPN170;\r
1788                                                         break;\r
1789 \r
1790                                                 case MENU_KNJ_SJIS :\r
1791                                                         lpttt->lpszText = MSGJPN307;\r
1792                                                         break;\r
1793 \r
1794                                                 case MENU_KNJ_EUC :\r
1795                                                         lpttt->lpszText = MSGJPN171;\r
1796                                                         break;\r
1797 \r
1798                                                 case MENU_KNJ_JIS :\r
1799                                                         lpttt->lpszText = MSGJPN172;\r
1800                                                         break;\r
1801 \r
1802                                                 case MENU_KNJ_UTF8N :\r
1803                                                         lpttt->lpszText = MSGJPN308;\r
1804                                                         break;\r
1805 \r
1806                                                 case MENU_KNJ_UTF8BOM :\r
1807                                                         lpttt->lpszText = MSGJPN330;\r
1808                                                         break;\r
1809 \r
1810                                                 case MENU_KNJ_NONE :\r
1811                                                         lpttt->lpszText = MSGJPN173;\r
1812                                                         break;\r
1813 \r
1814                                                 case MENU_L_KNJ_SJIS :\r
1815                                                         lpttt->lpszText = MSGJPN309;\r
1816                                                         break;\r
1817 \r
1818                                                 case MENU_L_KNJ_EUC :\r
1819                                                         lpttt->lpszText = MSGJPN310;\r
1820                                                         break;\r
1821 \r
1822                                                 case MENU_L_KNJ_JIS :\r
1823                                                         lpttt->lpszText = MSGJPN311;\r
1824                                                         break;\r
1825 \r
1826                                                 case MENU_L_KNJ_UTF8N :\r
1827                                                         lpttt->lpszText = MSGJPN312;\r
1828                                                         break;\r
1829 \r
1830                                                 case MENU_L_KNJ_UTF8BOM :\r
1831                                                         lpttt->lpszText = MSGJPN331;\r
1832                                                         break;\r
1833 \r
1834                                                 case MENU_KANACNV :\r
1835                                                         lpttt->lpszText = MSGJPN174;\r
1836                                                         break;\r
1837 \r
1838                                                 case MENU_SYNC :\r
1839                                                         lpttt->lpszText = MSGJPN175;\r
1840                                                         break;\r
1841 \r
1842                                                 case MENU_ABORT :\r
1843                                                         lpttt->lpszText = MSGJPN176;\r
1844                                                         break;\r
1845                                         }\r
1846                                         // UTF-8対応\r
1847                                         // UTF-8からUTF-16 LEへ変換\r
1848                                         {\r
1849                                                 static wchar_t StringBufferUTF16[1024];\r
1850                                                 if(lpttt->lpszText)\r
1851                                                 {\r
1852                                                         MtoW(StringBufferUTF16, sizeof(StringBufferUTF16)/ sizeof(wchar_t), lpttt->lpszText, -1);\r
1853                                                         wlpttt->lpszText = StringBufferUTF16;\r
1854                                                 }\r
1855                                         }\r
1856                                         break;\r
1857 \r
1858                                 case LVN_COLUMNCLICK :\r
1859                                         if(((NMHDR *)lParam)->hwndFrom == GetLocalHwnd())\r
1860                                         {\r
1861                                                 // 同時接続対応\r
1862                                                 CancelFlg = NO;\r
1863                                                 SetSortTypeByColumn(WIN_LOCAL, ((NM_LISTVIEW *)lParam)->iSubItem);\r
1864                                                 ReSortDispList(WIN_LOCAL, &CancelFlg);\r
1865                                         }\r
1866                                         else if(((NMHDR *)lParam)->hwndFrom == GetRemoteHwnd())\r
1867                                         {\r
1868                                                 if(((NM_LISTVIEW *)lParam)->iSubItem != 4)\r
1869                                                 {\r
1870                                                         // 同時接続対応\r
1871                                                         CancelFlg = NO;\r
1872                                                         SetSortTypeByColumn(WIN_REMOTE, ((NM_LISTVIEW *)lParam)->iSubItem);\r
1873                                                         ReSortDispList(WIN_REMOTE, &CancelFlg);\r
1874                                                 }\r
1875                                         }\r
1876                                         SetFocus(hWndCurFocus);\r
1877                                         break;\r
1878 \r
1879                                 case LVN_ITEMCHANGED :\r
1880                                         DispSelectedSpace();\r
1881                                         MakeButtonsFocus();\r
1882                                         break;\r
1883                         }\r
1884                         break;\r
1885 \r
1886                 case WM_SIZE :\r
1887                         Sizing = SW_RESTORE;\r
1888                         if(wParam == SIZE_RESTORED)\r
1889                         {\r
1890                                 ResizeWindowProc();\r
1891                                 GetWindowRect(hWnd, &Rect);\r
1892                                 WinPosX = Rect.left;\r
1893                                 WinPosY = Rect.top;\r
1894                         }\r
1895                         else if(wParam == SIZE_MAXIMIZED)\r
1896                         {\r
1897                                 Sizing = SW_MAXIMIZE;\r
1898                                 ResizeWindowProc();\r
1899                         }\r
1900                         else\r
1901                                 return(DefWindowProc(hWnd, message, wParam, lParam));\r
1902                         break;\r
1903 \r
1904                 case WM_MOVING :\r
1905                         WinPosX = ((RECT *)lParam)->left;\r
1906                         WinPosY = ((RECT *)lParam)->top;\r
1907                         return(DefWindowProc(hWnd, message, wParam, lParam));\r
1908 \r
1909                 case WM_SETFOCUS :\r
1910                         SetFocus(hWndCurFocus);\r
1911                         break;\r
1912 \r
1913                 case WM_LBUTTONDOWN :\r
1914                 case WM_LBUTTONUP :\r
1915                 case WM_MOUSEMOVE :\r
1916                         CheckResizeFrame(wParam, LOWORD(lParam), HIWORD(lParam));\r
1917                         break;\r
1918 \r
1919                 case WM_CHANGE_COND :\r
1920                         DispTransferFiles();\r
1921                         break;\r
1922 \r
1923                 case WM_REFRESH_LOCAL_FLG :\r
1924                         // 外部アプリケーションへドロップ後にローカル側のファイル一覧に作業フォルダが表示されるバグ対策\r
1925 //                      PostMessage(hWnd,  WM_COMMAND, MAKEWPARAM(REFRESH_LOCAL, 0), 0);\r
1926                         if(SuppressRefresh == 0)\r
1927                                 PostMessage(hWnd,  WM_COMMAND, MAKEWPARAM(REFRESH_LOCAL, 0), 0);\r
1928                         break;\r
1929 \r
1930                 case WM_REFRESH_REMOTE_FLG :\r
1931                         if(SuppressRefresh == 0)\r
1932                                 PostMessage(hWnd,  WM_COMMAND, MAKEWPARAM(REFRESH_REMOTE, 0), 0);\r
1933                         break;\r
1934 \r
1935                 case WM_PAINT :\r
1936                     BeginPaint(hWnd, (LPPAINTSTRUCT) &ps);\r
1937                     EndPaint(hWnd, (LPPAINTSTRUCT) &ps);\r
1938                         break;\r
1939 \r
1940                 case WM_DESTROY :\r
1941                         // ローカル側自動更新\r
1942                         KillTimer(hWnd, 1);\r
1943                         if(ChangeNotification != INVALID_HANDLE_VALUE)\r
1944                                 FindCloseChangeNotification(ChangeNotification);\r
1945                         // タスクバー進捗表示\r
1946                         KillTimer(hWnd, 2);\r
1947 //                      WSACleanup();\r
1948 //                      DestroyWindow(hWndFtp);\r
1949                         PostQuitMessage(0);\r
1950                         break;\r
1951 \r
1952                 case WM_QUERYENDSESSION :\r
1953                         ExitProc(hWnd);\r
1954                         return(TRUE);\r
1955 \r
1956                 case WM_CLOSE :\r
1957                         if((AskTransferNow() == NO) ||\r
1958                            (DialogBox(hInstFtp, MAKEINTRESOURCE(exit_dlg), hWnd, ExeEscDialogProc) == YES))\r
1959                         {\r
1960                                 ExitProc(hWnd);\r
1961                                 return(DefWindowProc(hWnd, message, wParam, lParam));\r
1962                         }\r
1963                         break;\r
1964 \r
1965                 default :\r
1966                         return(DefWindowProc(hWnd, message, wParam, lParam));\r
1967         }\r
1968     return(0L);\r
1969 }\r
1970 \r
1971 \r
1972 /*----- プログラム開始時の処理 ------------------------------------------------\r
1973 *\r
1974 *       Parameter\r
1975 *               char *Cmd : コマンドライン文字列\r
1976 *\r
1977 *       Return Value\r
1978 *               なし\r
1979 *----------------------------------------------------------------------------*/\r
1980 \r
1981 static void StartupProc(char *Cmd)\r
1982 {\r
1983         int Sts;\r
1984         int AutoConnect;\r
1985         int CmdOption;\r
1986         int Kanji;\r
1987         int Kana;\r
1988         int FnameKanji;\r
1989         int TrMode;\r
1990         char unc[FMAX_PATH+1];\r
1991 \r
1992         Sts = AnalyzeComLine(Cmd, &AutoConnect, &CmdOption, unc, FMAX_PATH);\r
1993 \r
1994         TrMode = TYPE_DEFAULT;\r
1995         Kanji = KANJI_NOCNV;\r
1996         FnameKanji = KANJI_NOCNV;\r
1997         Kana = YES;\r
1998         if(CmdOption & OPT_ASCII)\r
1999                 TrMode = TYPE_A;\r
2000         if(CmdOption & OPT_BINARY)\r
2001                 TrMode = TYPE_I;\r
2002         if(CmdOption & OPT_EUC)\r
2003                 Kanji = KANJI_EUC;\r
2004         if(CmdOption & OPT_JIS)\r
2005                 Kanji = KANJI_JIS;\r
2006         if(CmdOption & OPT_EUC_NAME)\r
2007                 FnameKanji = KANJI_EUC;\r
2008         if(CmdOption & OPT_JIS_NAME)\r
2009                 FnameKanji = KANJI_JIS;\r
2010         if(CmdOption & OPT_KANA)\r
2011                 Kana = NO;\r
2012 \r
2013         if(CmdOption & OPT_QUIT)\r
2014                 AutoExit = YES;\r
2015 \r
2016         if(CmdOption & OPT_SAVEOFF)\r
2017                 SuppressSave = YES;\r
2018         if(CmdOption & OPT_SAVEON)\r
2019                 SuppressSave = NO;\r
2020 \r
2021         // UTF-8対応\r
2022         if(CmdOption & OPT_SJIS)\r
2023                 Kanji = KANJI_SJIS;\r
2024         if(CmdOption & OPT_UTF8N)\r
2025                 Kanji = KANJI_UTF8N;\r
2026         if(CmdOption & OPT_UTF8BOM)\r
2027                 Kanji = KANJI_UTF8BOM;\r
2028         if(CmdOption & OPT_SJIS_NAME)\r
2029                 FnameKanji = KANJI_SJIS;\r
2030         if(CmdOption & OPT_UTF8N_NAME)\r
2031                 FnameKanji = KANJI_UTF8N;\r
2032 \r
2033         if(Sts == 0)\r
2034         {\r
2035                 if(ConnectOnStart == YES)\r
2036                         PostMessage(hWndFtp, WM_COMMAND, MAKEWPARAM(MENU_CONNECT, 0), 0);\r
2037         }\r
2038         else if(Sts == 1)\r
2039         {\r
2040                 DirectConnectProc(unc, Kanji, Kana, FnameKanji, TrMode);\r
2041         }\r
2042         else if(Sts == 2)\r
2043         {\r
2044                 PostMessage(hWndFtp, WM_COMMAND, MAKEWPARAM(MENU_CONNECT_NUM, CmdOption), (LPARAM)AutoConnect);\r
2045         }\r
2046         return;\r
2047 }\r
2048 \r
2049 \r
2050 /*----- コマンドラインを解析 --------------------------------------------------\r
2051 *\r
2052 *       Parameter\r
2053 *               char *Str : コマンドライン文字列\r
2054 *               int *AutoConnect : 接続ホスト番号を返すワーク\r
2055 *               int *CmdOption : オプションを返すワーク\r
2056 *               char *unc : uncを返すワーク\r
2057 *               int Max : uncの最大長\r
2058 *\r
2059 *       Return Value\r
2060 *               int ステータス\r
2061 *                       0=指定なし、1=URL指定、2=設定名指定、-1=エラー\r
2062 *\r
2063 *       Note\r
2064 *               -m      --mirror\r
2065 *               -d      --mirrordown\r
2066 *               -f      --force\r
2067 *               -q      --quit\r
2068 *               -s      --set\r
2069 *               -h      --help\r
2070 *               -e      --euc\r
2071 *               -j      --jis\r
2072 *               -a      --ascii\r
2073 *               -b      --binary\r
2074 *               -x      --auto\r
2075 *               -k      --kana\r
2076 *               -u      --eucname\r
2077 *               -i      --jisname\r
2078 *               -n  --ini               (CheckIniFileNameで検索)\r
2079 *                       --saveoff\r
2080 *                       --saveon\r
2081 *               -z      --mpasswd       (CheckMasterPasswordで検索)  2010.01.30 genta 追加\r
2082 *----------------------------------------------------------------------------*/\r
2083 \r
2084 static int AnalyzeComLine(char *Str, int *AutoConnect, int *CmdOption, char *unc, int Max)\r
2085 {\r
2086         int Ret;\r
2087         char Tmp[FMAX_PATH+1];\r
2088 \r
2089         *AutoConnect = -1;\r
2090         *CmdOption = 0;\r
2091 \r
2092         Ret = 0;\r
2093         memset(unc, NUL, Max+1);\r
2094 \r
2095         while((Ret != -1) && ((Str = GetToken(Str, Tmp)) != NULL))\r
2096         {\r
2097                 if(Tmp[0] == '-')\r
2098                 {\r
2099                         _strlwr(Tmp);\r
2100                         if((strcmp(&Tmp[1], "m") == 0) || (strcmp(&Tmp[1], "-mirror") == 0))\r
2101                                 *CmdOption |= OPT_MIRROR;\r
2102                         else if((strcmp(&Tmp[1], "d") == 0) || (strcmp(&Tmp[1], "-mirrordown") == 0))\r
2103                                 *CmdOption |= OPT_MIRRORDOWN;\r
2104                         // 廃止予定\r
2105 //                      else if((strcmp(&Tmp[1], "e") == 0) || (strcmp(&Tmp[1], "-euc") == 0))\r
2106 //                              *CmdOption |= OPT_EUC;\r
2107 //                      else if((strcmp(&Tmp[1], "j") == 0) || (strcmp(&Tmp[1], "-jis") == 0))\r
2108 //                              *CmdOption |= OPT_JIS;\r
2109                         else if((strcmp(&Tmp[1], "eu") == 0) || (strcmp(&Tmp[1], "e") == 0) || (strcmp(&Tmp[1], "-euc") == 0))\r
2110                                 *CmdOption |= OPT_EUC;\r
2111                         else if((strcmp(&Tmp[1], "ji") == 0) || (strcmp(&Tmp[1], "j") == 0) || (strcmp(&Tmp[1], "-jis") == 0))\r
2112                                 *CmdOption |= OPT_JIS;\r
2113                         else if((strcmp(&Tmp[1], "a") == 0) || (strcmp(&Tmp[1], "-ascii") == 0))\r
2114                                 *CmdOption |= OPT_ASCII;\r
2115                         else if((strcmp(&Tmp[1], "b") == 0) || (strcmp(&Tmp[1], "-binary") == 0))\r
2116                                 *CmdOption |= OPT_BINARY;\r
2117                         else if((strcmp(&Tmp[1], "x") == 0) || (strcmp(&Tmp[1], "-auto") == 0))\r
2118                                 *CmdOption |= OPT_AUTO;\r
2119                         else if((strcmp(&Tmp[1], "f") == 0) || (strcmp(&Tmp[1], "-force") == 0))\r
2120                                 *CmdOption |= OPT_FORCE;\r
2121                         else if((strcmp(&Tmp[1], "q") == 0) || (strcmp(&Tmp[1], "-quit") == 0))\r
2122                                 *CmdOption |= OPT_QUIT;\r
2123                         else if((strcmp(&Tmp[1], "k") == 0) || (strcmp(&Tmp[1], "-kana") == 0))\r
2124                                 *CmdOption |= OPT_KANA;\r
2125                         // 廃止予定\r
2126 //                      else if((strcmp(&Tmp[1], "u") == 0) || (strcmp(&Tmp[1], "-eucname") == 0))\r
2127 //                              *CmdOption |= OPT_EUC_NAME;\r
2128 //                      else if((strcmp(&Tmp[1], "i") == 0) || (strcmp(&Tmp[1], "-jisname") == 0))\r
2129 //                              *CmdOption |= OPT_JIS_NAME;\r
2130                         else if((strcmp(&Tmp[1], "eun") == 0) || (strcmp(&Tmp[1], "u") == 0) || (strcmp(&Tmp[1], "-eucname") == 0))\r
2131                                 *CmdOption |= OPT_EUC_NAME;\r
2132                         else if((strcmp(&Tmp[1], "jin") == 0) || (strcmp(&Tmp[1], "i") == 0) || (strcmp(&Tmp[1], "-jisname") == 0))\r
2133                                 *CmdOption |= OPT_JIS_NAME;\r
2134                         else if((strcmp(&Tmp[1], "n") == 0) || (strcmp(&Tmp[1], "-ini") == 0))\r
2135                         {\r
2136                                 if((Str = GetToken(Str, Tmp)) == NULL)\r
2137                                 {\r
2138                                         SetTaskMsg(MSGJPN282);\r
2139                                         Ret = -1;\r
2140                                 }\r
2141                         }\r
2142                         else if(strcmp(&Tmp[1], "-saveoff") == 0)\r
2143                                 *CmdOption |= OPT_SAVEOFF;\r
2144                         else if(strcmp(&Tmp[1], "-saveon") == 0)\r
2145                                 *CmdOption |= OPT_SAVEON;\r
2146                         else if((strcmp(&Tmp[1], "z") == 0) || (strcmp(&Tmp[1], "-mpasswd") == 0))\r
2147                         {       /* 2010.01.30 genta : Add master password option */\r
2148                                 if((Str = GetToken(Str, Tmp)) == NULL)\r
2149                                 {\r
2150                                         SetTaskMsg(MSGJPN299);\r
2151                                         Ret = -1;\r
2152                                 }\r
2153                         }\r
2154                         else if((strcmp(&Tmp[1], "s") == 0) || (strcmp(&Tmp[1], "-set") == 0))\r
2155                         {\r
2156                                 if(Ret == 0)\r
2157                                 {\r
2158                                         if((Str = GetToken(Str, Tmp)) != NULL)\r
2159                                         {\r
2160                                                 if((*AutoConnect = SearchHostName(Tmp)) != -1)\r
2161                                                         Ret = 2;\r
2162                                                 else\r
2163                                                 {\r
2164                                                         SetTaskMsg(MSGJPN177, Tmp);\r
2165                                                         Ret = -1;\r
2166                                                 }\r
2167                                         }\r
2168                                         else\r
2169                                         {\r
2170                                                 SetTaskMsg(MSGJPN178);\r
2171                                                 Ret = -1;\r
2172                                         }\r
2173                                 }\r
2174                                 else\r
2175                                 {\r
2176                                         SetTaskMsg(MSGJPN179);\r
2177                                         Ret = -1;\r
2178                                 }\r
2179                         }\r
2180                         else if((strcmp(&Tmp[1], "h") == 0) || (strcmp(&Tmp[1], "-help") == 0))\r
2181                         {\r
2182                                 hHelpWin = HtmlHelp(NULL, AskHelpFilePath(), HH_HELP_CONTEXT, IDH_HELP_TOPIC_0000024);\r
2183                         }\r
2184                         // プロセス保護\r
2185 #ifdef ENABLE_PROCESS_PROTECTION\r
2186                         else if(strcmp(Tmp, "--restart") == 0)\r
2187                         {\r
2188                         }\r
2189                         else if(strcmp(Tmp, "--protect") == 0)\r
2190                         {\r
2191                         }\r
2192                         else if(strcmp(Tmp, "--protect-high") == 0)\r
2193                         {\r
2194                         }\r
2195                         else if(strcmp(Tmp, "--protect-medium") == 0)\r
2196                         {\r
2197                         }\r
2198                         else if(strcmp(Tmp, "--protect-low") == 0)\r
2199                         {\r
2200                         }\r
2201 #endif\r
2202                         // UTF-8対応\r
2203                         else if((strcmp(&Tmp[1], "sj") == 0) || (strcmp(&Tmp[1], "-sjis") == 0))\r
2204                                 *CmdOption |= OPT_SJIS;\r
2205                         else if((strcmp(&Tmp[1], "u8") == 0) || (strcmp(&Tmp[1], "-utf8") == 0))\r
2206                                 *CmdOption |= OPT_UTF8N;\r
2207                         else if((strcmp(&Tmp[1], "8b") == 0) || (strcmp(&Tmp[1], "-utf8bom") == 0))\r
2208                                 *CmdOption |= OPT_UTF8BOM;\r
2209                         else if((strcmp(&Tmp[1], "sjn") == 0) || (strcmp(&Tmp[1], "-sjisname") == 0))\r
2210                                 *CmdOption |= OPT_SJIS_NAME;\r
2211                         else if((strcmp(&Tmp[1], "u8n") == 0) || (strcmp(&Tmp[1], "-utf8name") == 0))\r
2212                                 *CmdOption |= OPT_UTF8N_NAME;\r
2213                         // ソフトウェア自動更新\r
2214                         else if(strcmp(Tmp, "--software-update") == 0)\r
2215                         {\r
2216                                 if((Str = GetToken(Str, Tmp)) == NULL)\r
2217                                 {\r
2218                                         Ret = -1;\r
2219                                 }\r
2220                         }\r
2221                         else if(strcmp(Tmp, "--software-cleanup") == 0)\r
2222                         {\r
2223                                 if((Str = GetToken(Str, Tmp)) == NULL)\r
2224                                 {\r
2225                                         Ret = -1;\r
2226                                 }\r
2227                         }\r
2228                         else\r
2229                         {\r
2230                                 SetTaskMsg(MSGJPN180, Tmp);\r
2231                                 Ret = -1;\r
2232                         }\r
2233                 }\r
2234                 else\r
2235                 {\r
2236                         if(Ret == 0)\r
2237                         {\r
2238                                 strncpy(unc, Tmp, Max);\r
2239                                 Ret = 1;\r
2240                         }\r
2241                         else\r
2242                         {\r
2243                                 SetTaskMsg(MSGJPN181);\r
2244                                 Ret = -1;\r
2245                         }\r
2246                 }\r
2247         }\r
2248         return(Ret);\r
2249 }\r
2250 \r
2251 \r
2252 /*----- INIファイルのパス名の指定をチェック ------------------------------------\r
2253 *\r
2254 *       Parameter\r
2255 *               char *Str : コマンドライン文字列\r
2256 *               char *Ini : iniファイル名を返すワーク\r
2257 *\r
2258 *       Return Value\r
2259 *               int ステータス\r
2260 *                       0=指定なし、1=あり\r
2261 *\r
2262 *       Note\r
2263 *               -n  --ini\r
2264 *----------------------------------------------------------------------------*/\r
2265 \r
2266 static int CheckIniFileName(char *Str, char *Ini)\r
2267 {\r
2268         return GetTokenAfterOption( Str, Ini, "n", "-ini" );\r
2269 }\r
2270 \r
2271 /* マスターパスワードの指定をチェック */\r
2272 static int CheckMasterPassword(char *Str, char *Ini)\r
2273 {\r
2274         return GetTokenAfterOption( Str, Ini, "z", "-mpasswd" );\r
2275 }\r
2276 \r
2277 /*----- オプションの後ろのトークンを取り出す ------------------------------------\r
2278 *\r
2279 *       Parameter\r
2280 *               char *Str : コマンドライン文字列\r
2281 *               char *Result : 取り出した文字列を格納するワーク\r
2282 *               const char* Opt1, *Opt2: オプション文字列(2つ)\r
2283 *\r
2284 *       Return Value\r
2285 *               int ステータス\r
2286 *                       0=指定なし、1=あり\r
2287 *\r
2288 *       Note\r
2289 *               2010.01.30 genta マスターパスワード取り出しのため共通化\r
2290 *----------------------------------------------------------------------------*/\r
2291 static int GetTokenAfterOption(char *Str, char *Result, const char* Opt1, const char* Opt2 )\r
2292 {\r
2293         int Ret = 0;\r
2294         char Tmp[FMAX_PATH+1];\r
2295 \r
2296         Result[0] = NUL;\r
2297         while((Str = GetToken(Str, Tmp)) != NULL)\r
2298         {\r
2299                 if(Tmp[0] == '-')\r
2300                 {\r
2301                         _strlwr(Tmp);\r
2302                         if((strcmp(&Tmp[1], Opt1) == 0) || (strcmp(&Tmp[1], Opt2) == 0))\r
2303                         {\r
2304                                 if((Str = GetToken(Str, Result)) != NULL)\r
2305                                         Ret = 1;\r
2306                                 break;\r
2307                         }\r
2308                 }\r
2309         }\r
2310         return(Ret);\r
2311 }\r
2312 \r
2313 /*----- トークンを返す --------------------------------------------------------\r
2314 *\r
2315 *       Parameter\r
2316 *               char *Str : 文字列\r
2317 *               char *Buf : 文字列を返すバッファ\r
2318 *\r
2319 *       Return Value\r
2320 *               char *返したトークンの末尾\r
2321 *                       NULL=終わり\r
2322 *----------------------------------------------------------------------------*/\r
2323 \r
2324 static char *GetToken(char *Str, char *Buf)\r
2325 {\r
2326         int InQuote;\r
2327 \r
2328         while(*Str != NUL)\r
2329         {\r
2330                 if((*Str != ' ') && (*Str != '\t'))\r
2331                         break;\r
2332                 Str++;\r
2333         }\r
2334 \r
2335         if(*Str != NUL)\r
2336         {\r
2337                 InQuote = 0;\r
2338                 while(*Str != NUL)\r
2339                 {\r
2340                         if(*Str == 0x22)\r
2341                                 InQuote = !InQuote;\r
2342                         else\r
2343                         {\r
2344                                 if(((*Str == ' ') || (*Str == '\t')) &&\r
2345                                    (InQuote == 0))\r
2346                                 {\r
2347                                         break;\r
2348                                 }\r
2349                                 *Buf++ = *Str;\r
2350                         }\r
2351                         Str++;\r
2352                 }\r
2353         }\r
2354         else\r
2355                 Str = NULL;\r
2356 \r
2357         *Buf = NUL;\r
2358 \r
2359         return(Str);\r
2360 }\r
2361 \r
2362 \r
2363 /*----- プログラム終了時の処理 ------------------------------------------------\r
2364 *\r
2365 *       Parameter\r
2366 *               HWND hWnd : ウインドウハンドル\r
2367 *\r
2368 *       Return Value\r
2369 *               なし\r
2370 *----------------------------------------------------------------------------*/\r
2371 \r
2372 static void ExitProc(HWND hWnd)\r
2373 {\r
2374         // 環境依存の不具合対策\r
2375         char Tmp[FMAX_PATH+1];\r
2376 \r
2377         CancelFlg = YES;\r
2378 \r
2379         CloseTransferThread();\r
2380 \r
2381         if(SaveExit == YES)\r
2382         {\r
2383                 SaveBookMark();\r
2384                 SaveCurrentSetToHost();\r
2385         }\r
2386         DeleteAlltempFile();\r
2387 \r
2388 //      WSACancelBlockingCall();\r
2389         DisconnectProc();\r
2390 //      CloseTransferThread();\r
2391 \r
2392         if(SaveExit == YES)\r
2393         {\r
2394                 GetListTabWidth();\r
2395                 SaveRegistry();\r
2396                 // ポータブル版判定\r
2397                 if(RegType == REGTYPE_REG)\r
2398                         ClearIni();\r
2399 \r
2400                 if((CacheEntry > 0) && (CacheSave == YES))\r
2401                         SaveCache();\r
2402                 else\r
2403                         DeleteCache();\r
2404         }\r
2405         else\r
2406                 DeleteCache();\r
2407 \r
2408         // 環境依存の不具合対策\r
2409         GetAppTempPath(Tmp);\r
2410         SetYenTail(Tmp);\r
2411         strcat(Tmp, "file");\r
2412         _rmdir(Tmp);\r
2413         GetAppTempPath(Tmp);\r
2414         _rmdir(Tmp);\r
2415 \r
2416         if(RasClose == YES)\r
2417         {\r
2418                 DisconnectRas(RasCloseNotify);\r
2419         }\r
2420         DeleteAllObject();\r
2421         HtmlHelp(NULL, NULL, HH_UNINITIALIZE, dwCookie); \r
2422         return;\r
2423 }\r
2424 \r
2425 \r
2426 /*----- ファイル名をダブルクリックしたときの処理 ------------------------------\r
2427 *\r
2428 *       Parameter\r
2429 *               int Win : ウインドウ番号 (WIN_xxx)\r
2430 *               int Mode : 常に「開く」動作をするかどうか (YES/NO)\r
2431 *               int App : アプリケーション番号(-1=関連づけ優先)\r
2432 *\r
2433 *       Return Value\r
2434 *               なし\r
2435 *----------------------------------------------------------------------------*/\r
2436 \r
2437 void DoubleClickProc(int Win, int Mode, int App)\r
2438 {\r
2439         int Pos;\r
2440         int Type;\r
2441         char Local[FMAX_PATH+1];\r
2442         char Remote[FMAX_PATH+1];\r
2443         char Tmp[FMAX_PATH+1];\r
2444         int Sts;\r
2445         int UseDiffViewer;\r
2446 \r
2447         if(AskUserOpeDisabled() == NO)\r
2448         {\r
2449                 SetCurrentDirAsDirHist();\r
2450                 if(GetSelectedCount(Win) == 1)\r
2451                 {\r
2452                         if((Pos = GetFirstSelected(Win, NO)) != -1)\r
2453                         {\r
2454                                 GetNodeName(Win, Pos, Tmp, FMAX_PATH);\r
2455                                 Type = GetNodeType(Win, Pos);\r
2456 \r
2457                                 if(Win == WIN_LOCAL)\r
2458                                 {\r
2459                                         // ローカルフォルダを開く\r
2460 //                                      if((App != -1) || (Type == NODE_FILE))\r
2461                                         if((App != -1) || (Type == NODE_FILE) || (Mode == YES))\r
2462                                         {\r
2463                                                 if((DclickOpen == YES) || (Mode == YES))\r
2464                                                 {\r
2465                                                         AskLocalCurDir(Local, FMAX_PATH);\r
2466                                                         ReplaceAll(Local, '/', '\\');\r
2467                                                         SetYenTail(Local);\r
2468                                                         strcat(Local, Tmp);\r
2469                                                         ExecViewer(Local, App);\r
2470                                                 }\r
2471                                                 else\r
2472                                                         PostMessage(hWndFtp, WM_COMMAND, MAKEWPARAM(MENU_UPLOAD, 0), 0);\r
2473                                         }\r
2474                                         else\r
2475                                                 ChangeDir(WIN_LOCAL, Tmp);\r
2476                                 }\r
2477                                 else if(CheckClosedAndReconnect() == FFFTP_SUCCESS)\r
2478                                 {\r
2479                                         if((App != -1) || (Type == NODE_FILE))\r
2480                                         {\r
2481                                                 if((DclickOpen == YES) || (Mode == YES))\r
2482                                                 {\r
2483                                                         // ビューワ2、3のパスが "d " で始まっていたら差分ビューア使用\r
2484                                                         if ((App == 1 || App == 2) && strncmp(ViewerName[App], "d ", 2) == 0)\r
2485                                                                 UseDiffViewer = YES;\r
2486                                                         else\r
2487                                                                 UseDiffViewer = NO;\r
2488 \r
2489                                                         strcpy(Remote, TmpPath);\r
2490                                                         SetYenTail(Remote);\r
2491                                                         // 環境依存の不具合対策\r
2492                                                         strcat(Remote, "file");\r
2493                                                         _mkdir(Remote);\r
2494                                                         SetYenTail(Remote);\r
2495                                                         if (UseDiffViewer == YES) {\r
2496                                                                 strcat(Remote, "remote.");\r
2497                                                         }\r
2498                                                         strcat(Remote, Tmp);\r
2499 \r
2500                                                         if(AskTransferNow() == YES)\r
2501                                                                 SktShareProh();\r
2502 \r
2503         //                                              MainTransPkt.ctrl_skt = AskCmdCtrlSkt();\r
2504                                                         strcpy(MainTransPkt.Cmd, "RETR ");\r
2505                                                         if(AskHostType() == HTYPE_ACOS)\r
2506                                                         {\r
2507                                                                 strcpy(MainTransPkt.RemoteFile, "'");\r
2508                                                                 strcat(MainTransPkt.RemoteFile, AskHostLsName());\r
2509                                                                 strcat(MainTransPkt.RemoteFile, "(");\r
2510                                                                 strcat(MainTransPkt.RemoteFile, Tmp);\r
2511                                                                 strcat(MainTransPkt.RemoteFile, ")");\r
2512                                                                 strcat(MainTransPkt.RemoteFile, "'");\r
2513                                                         }\r
2514                                                         else if(AskHostType() == HTYPE_ACOS_4)\r
2515                                                         {\r
2516                                                                 strcpy(MainTransPkt.RemoteFile, Tmp);\r
2517                                                         }\r
2518                                                         else\r
2519                                                         {\r
2520                                                                 strcpy(MainTransPkt.RemoteFile, Tmp);\r
2521                                                         }\r
2522                                                         strcpy(MainTransPkt.LocalFile, Remote);\r
2523                                                         MainTransPkt.Type = AskTransferTypeAssoc(MainTransPkt.RemoteFile, AskTransferType());\r
2524                                                         MainTransPkt.Size = 1;\r
2525                                                         MainTransPkt.KanjiCode = AskHostKanjiCode();\r
2526                                                         MainTransPkt.KanjiCodeDesired = AskLocalKanjiCode();\r
2527                                                         MainTransPkt.KanaCnv = AskHostKanaCnv();\r
2528                                                         MainTransPkt.Mode = EXIST_OVW;\r
2529                                                         MainTransPkt.ExistSize = 0;\r
2530                                                         MainTransPkt.hWndTrans = NULL;\r
2531                                                         MainTransPkt.Next = NULL;\r
2532 \r
2533                                                         DisableUserOpe();\r
2534 \r
2535                                                         /* 不正なパスを検出 */\r
2536                                                         if(CheckPathViolation(&MainTransPkt) == NO)\r
2537                                                         {\r
2538 //                                                              if((Sts = DoDownload(AskCmdCtrlSkt(), &MainTransPkt, NO)) == 429)\r
2539 //                                                              {\r
2540 //                                                                      ReConnectCmdSkt();\r
2541                                                                         // 同時接続対応\r
2542                                                                         CancelFlg = NO;\r
2543                                                                         Sts = DoDownload(AskCmdCtrlSkt(), &MainTransPkt, NO, &CancelFlg);\r
2544 //                                                              }\r
2545                                                         }\r
2546 \r
2547                                                         EnableUserOpe();\r
2548 \r
2549                                                         AddTempFileList(Remote);\r
2550                                                         if(Sts/100 == FTP_COMPLETE) {\r
2551                                                                 if (UseDiffViewer == YES) {\r
2552                                                                         AskLocalCurDir(Local, FMAX_PATH);\r
2553                                                                         ReplaceAll(Local, '/', '\\');\r
2554                                                                         SetYenTail(Local);\r
2555                                                                         strcat(Local, Tmp);\r
2556                                                                         ExecViewer2(Local, Remote, App);\r
2557                                                                 } else {\r
2558                                                                         ExecViewer(Remote, App);\r
2559                                                                 }\r
2560                                                         }\r
2561                                                 }\r
2562                                                 else\r
2563                                                         PostMessage(hWndFtp, WM_COMMAND, MAKEWPARAM(MENU_DOWNLOAD, 0), 0);\r
2564                                         }\r
2565                                         else\r
2566                                                 ChangeDir(WIN_REMOTE, Tmp);\r
2567                                 }\r
2568                         }\r
2569                 }\r
2570                 MakeButtonsFocus();\r
2571         }\r
2572         return;\r
2573 }\r
2574 \r
2575 \r
2576 /*----- フォルダの移動 --------------------------------------------------------\r
2577 *\r
2578 *       Parameter\r
2579 *               int Win : ウインドウ番号 (WIN_xxx)\r
2580 *               char *Path : 移動先のパス名\r
2581 *\r
2582 *       Return Value\r
2583 *               なし\r
2584 *\r
2585 *       Note\r
2586 *               フォルダ同時移動の処理も行う\r
2587 *----------------------------------------------------------------------------*/\r
2588 \r
2589 static void ChangeDir(int Win, char *Path)\r
2590 {\r
2591         int Sync;\r
2592         char Local[FMAX_PATH+1];\r
2593         char Remote[FMAX_PATH+1];\r
2594 \r
2595         // 同時接続対応\r
2596         CancelFlg = NO;\r
2597 \r
2598         // デッドロック対策\r
2599         DisableUserOpe();\r
2600         Sync = AskSyncMoveMode();\r
2601         if(Sync == YES)\r
2602         {\r
2603                 if(strcmp(Path, "..") == 0)\r
2604                 {\r
2605                         AskLocalCurDir(Local, FMAX_PATH);\r
2606                         AskRemoteCurDir(Remote, FMAX_PATH);\r
2607                         if(strcmp(GetFileName(Local), GetFileName(Remote)) != 0)\r
2608                                 Sync = NO;\r
2609                 }\r
2610         }\r
2611 \r
2612         if((Win == WIN_LOCAL) || (Sync == YES))\r
2613         {\r
2614                 if(DoLocalCWD(Path) == FFFTP_SUCCESS)\r
2615                         GetLocalDirForWnd();\r
2616         }\r
2617 \r
2618         if((Win == WIN_REMOTE) || (Sync == YES))\r
2619         {\r
2620                 if(CheckClosedAndReconnect() == FFFTP_SUCCESS)\r
2621                 {\r
2622 #if defined(HAVE_OPENVMS)\r
2623                         /* OpenVMSの場合、".DIR;?"を取る */\r
2624                         if (AskHostType() == HTYPE_VMS)\r
2625                                 ReformVMSDirName(Path, TRUE);\r
2626 #endif\r
2627                         if(DoCWD(Path, YES, NO, YES) < FTP_RETRY)\r
2628                                 GetRemoteDirForWnd(CACHE_NORMAL, &CancelFlg);\r
2629                 }\r
2630         }\r
2631         // デッドロック対策\r
2632         EnableUserOpe();\r
2633         return;\r
2634 }\r
2635 \r
2636 \r
2637 /*----- ウインドウのサイズ変更の処理 ------------------------------------------\r
2638 *\r
2639 *       Parameter\r
2640 *               なし\r
2641 *\r
2642 *       Return Value\r
2643 *               なし\r
2644 *----------------------------------------------------------------------------*/\r
2645 \r
2646 static void ResizeWindowProc(void)\r
2647 {\r
2648 #if 0\r
2649         RECT Rect;\r
2650         int RemotePosX;\r
2651 \r
2652         GetClientRect(hWndFtp, &Rect);\r
2653         SendMessage(GetSbarWnd(), WM_SIZE, SIZE_RESTORED, MAKELPARAM(Rect.right, Rect.bottom));\r
2654 \r
2655         CalcWinSize();\r
2656         SetWindowPos(GetMainTbarWnd(), 0, 0, 0, WinWidth, TOOLWIN_HEIGHT, SWP_NOACTIVATE | SWP_NOZORDER);\r
2657 \r
2658         SetWindowPos(GetLocalTbarWnd(), 0, 0, TOOLWIN_HEIGHT, LocalWidth, TOOLWIN_HEIGHT, SWP_NOACTIVATE | SWP_NOZORDER);\r
2659         SendMessage(GetLocalTbarWnd(), TB_GETITEMRECT, 3, (LPARAM)&Rect);\r
2660         SetWindowPos(GetLocalHistHwnd(), 0, Rect.right, Rect.top, LocalWidth - Rect.right, 200, SWP_NOACTIVATE | SWP_NOZORDER);\r
2661         SetWindowPos(GetLocalHwnd(), 0, 0, TOOLWIN_HEIGHT*2, LocalWidth, ListHeight, SWP_NOACTIVATE | SWP_NOZORDER);\r
2662 \r
2663         RemotePosX = LocalWidth + SepaWidth;\r
2664         if(SplitVertical == YES)\r
2665                 RemotePosX = 0;\r
2666 \r
2667         SetWindowPos(GetRemoteTbarWnd(), 0, RemotePosX, TOOLWIN_HEIGHT, RemoteWidth, TOOLWIN_HEIGHT, SWP_NOACTIVATE | SWP_NOZORDER);\r
2668         SendMessage(GetRemoteTbarWnd(), TB_GETITEMRECT, 3, (LPARAM)&Rect);\r
2669         SetWindowPos(GetRemoteHistHwnd(), 0, Rect.right, Rect.top, RemoteWidth - Rect.right, 200, SWP_NOACTIVATE | SWP_NOZORDER);\r
2670         SetWindowPos(GetRemoteHwnd(), 0, RemotePosX, TOOLWIN_HEIGHT*2, RemoteWidth, ListHeight, SWP_NOACTIVATE | SWP_NOZORDER);\r
2671 \r
2672         SetWindowPos(GetTaskWnd(), 0, 0, TOOLWIN_HEIGHT*2+ListHeight+SepaWidth, ClientWidth, TaskHeight, SWP_NOACTIVATE | SWP_NOZORDER);\r
2673 #else\r
2674         RECT Rect;\r
2675 \r
2676         GetClientRect(hWndFtp, &Rect);\r
2677         SendMessage(GetSbarWnd(), WM_SIZE, SIZE_RESTORED, MAKELPARAM(Rect.right, Rect.bottom));\r
2678 \r
2679         CalcWinSize();\r
2680         // 高DPI対応\r
2681 //      SetWindowPos(GetMainTbarWnd(), 0, 0, 0, Rect.right, TOOLWIN_HEIGHT, SWP_NOACTIVATE | SWP_NOZORDER);\r
2682 //      SetWindowPos(GetLocalTbarWnd(), 0, 0, TOOLWIN_HEIGHT, LocalWidth, TOOLWIN_HEIGHT, SWP_NOACTIVATE | SWP_NOZORDER);\r
2683 //      SetWindowPos(GetRemoteTbarWnd(), 0, LocalWidth + SepaWidth, TOOLWIN_HEIGHT, RemoteWidth, TOOLWIN_HEIGHT, SWP_NOACTIVATE | SWP_NOZORDER);\r
2684         SetWindowPos(GetMainTbarWnd(), 0, 0, 0, Rect.right, AskToolWinHeight(), SWP_NOACTIVATE | SWP_NOZORDER);\r
2685         SetWindowPos(GetLocalTbarWnd(), 0, 0, AskToolWinHeight(), LocalWidth, AskToolWinHeight(), SWP_NOACTIVATE | SWP_NOZORDER);\r
2686         SetWindowPos(GetRemoteTbarWnd(), 0, LocalWidth + SepaWidth, AskToolWinHeight(), RemoteWidth, AskToolWinHeight(), SWP_NOACTIVATE | SWP_NOZORDER);\r
2687         SendMessage(GetLocalTbarWnd(), TB_GETITEMRECT, 3, (LPARAM)&Rect);\r
2688         SetWindowPos(GetLocalHistHwnd(), 0, Rect.right, Rect.top, LocalWidth - Rect.right, 200, SWP_NOACTIVATE | SWP_NOZORDER);\r
2689         SendMessage(GetRemoteTbarWnd(), TB_GETITEMRECT, 3, (LPARAM)&Rect);\r
2690         SetWindowPos(GetRemoteHistHwnd(), 0, Rect.right, Rect.top, RemoteWidth - Rect.right, 200, SWP_NOACTIVATE | SWP_NOZORDER);\r
2691         // 高DPI対応\r
2692 //      SetWindowPos(GetLocalHwnd(), 0, 0, TOOLWIN_HEIGHT*2, LocalWidth, ListHeight, SWP_NOACTIVATE | SWP_NOZORDER);\r
2693 //      SetWindowPos(GetRemoteHwnd(), 0, LocalWidth + SepaWidth, TOOLWIN_HEIGHT*2, RemoteWidth, ListHeight, SWP_NOACTIVATE | SWP_NOZORDER);\r
2694 //      SetWindowPos(GetTaskWnd(), 0, 0, TOOLWIN_HEIGHT*2+ListHeight+SepaWidth, ClientWidth, TaskHeight, SWP_NOACTIVATE | SWP_NOZORDER);\r
2695         SetWindowPos(GetLocalHwnd(), 0, 0, AskToolWinHeight()*2, LocalWidth, ListHeight, SWP_NOACTIVATE | SWP_NOZORDER);\r
2696         SetWindowPos(GetRemoteHwnd(), 0, LocalWidth + SepaWidth, AskToolWinHeight()*2, RemoteWidth, ListHeight, SWP_NOACTIVATE | SWP_NOZORDER);\r
2697         SetWindowPos(GetTaskWnd(), 0, 0, AskToolWinHeight()*2+ListHeight+SepaWidth, ClientWidth, TaskHeight, SWP_NOACTIVATE | SWP_NOZORDER);\r
2698 #endif\r
2699 \r
2700         return;\r
2701 }\r
2702 \r
2703 \r
2704 /*----- ウインドウの各部分のサイズを計算する ----------------------------------\r
2705 *\r
2706 *       Parameter\r
2707 *               なし\r
2708 *\r
2709 *       Return Value\r
2710 *               なし\r
2711 *----------------------------------------------------------------------------*/\r
2712 \r
2713 static void CalcWinSize(void)\r
2714 {\r
2715         RECT Rect;\r
2716 \r
2717         GetWindowRect(hWndFtp, &Rect);\r
2718 \r
2719         if(Sizing != SW_MAXIMIZE)\r
2720         {\r
2721                 WinWidth = Rect.right - Rect.left;\r
2722                 WinHeight = Rect.bottom - Rect.top;\r
2723         }\r
2724 \r
2725         GetClientRect(hWndFtp, &Rect);\r
2726 \r
2727         ClientWidth = Rect.right;\r
2728         ClientHeight = Rect.bottom;\r
2729 \r
2730         SepaWidth = 4;\r
2731         LocalWidth = max1(0, min1(LocalWidth, ClientWidth - SepaWidth));\r
2732         RemoteWidth = max1(0, ClientWidth - LocalWidth - SepaWidth);\r
2733 //      TaskHeight = min1(TaskHeight, max1(0, ClientHeight - TOOLWIN_HEIGHT * 2 - SepaWidth));\r
2734 \r
2735         GetClientRect(GetSbarWnd(), &Rect);\r
2736 \r
2737         // 高DPI対応\r
2738 //      ListHeight = max1(0, ClientHeight - TOOLWIN_HEIGHT * 2 - TaskHeight - SepaWidth - Rect.bottom);\r
2739         ListHeight = max1(0, ClientHeight - AskToolWinHeight() * 2 - TaskHeight - SepaWidth - Rect.bottom);\r
2740 \r
2741         return;\r
2742 }\r
2743 \r
2744 \r
2745 #if 0\r
2746 /*----- ウインドウの表示位置を取得する ----------------------------------------\r
2747 *\r
2748 *       Parameter\r
2749 *               HWND hWnd : ウインドウハンドル\r
2750 *\r
2751 *       Return Value\r
2752 *               なし\r
2753 *----------------------------------------------------------------------------*/\r
2754 \r
2755 static void AskWindowPos(HWND hWnd)\r
2756 {\r
2757         WINDOWPLACEMENT WinPlace;\r
2758 \r
2759         WinPlace.length = sizeof(WINDOWPLACEMENT);\r
2760         GetWindowPlacement(hWnd, &WinPlace);\r
2761         WinPosX = WinPlace.rcNormalPosition.left;\r
2762         WinPosY = WinPlace.rcNormalPosition.top;\r
2763 \r
2764         return;\r
2765 }\r
2766 #endif\r
2767 \r
2768 \r
2769 /*----- ディレクトリリストとファイルリストの境界変更処理 ----------------------\r
2770 *\r
2771 *       Parameter\r
2772 *               WPARAM Keys : WM_MOUSEMOVEなどのWPARAMの値\r
2773 *               int x : マウスカーソルのX座標\r
2774 *               int y : マウスカーソルのY座標\r
2775 *\r
2776 *       Return Value\r
2777 *               なし\r
2778 *----------------------------------------------------------------------------*/\r
2779 \r
2780 static void CheckResizeFrame(WPARAM Keys, int x, int y)\r
2781 {\r
2782         RECT Rect;\r
2783         RECT Rect1;\r
2784 \r
2785         if((Resizing == RESIZE_OFF) && (Keys == 0))\r
2786         {\r
2787                 // 高DPI対応\r
2788 //              if((x >= LocalWidth) && (x <= LocalWidth + SepaWidth) &&\r
2789 //                 (y > TOOLWIN_HEIGHT) && (y < (TOOLWIN_HEIGHT * 2 + ListHeight)))\r
2790                 if((x >= LocalWidth) && (x <= LocalWidth + SepaWidth) &&\r
2791                    (y > AskToolWinHeight()) && (y < (AskToolWinHeight() * 2 + ListHeight)))\r
2792                 {\r
2793                         /* 境界位置変更用カーソルに変更 */\r
2794                         SetCapture(hWndFtp);\r
2795                         hCursor = LoadCursor(hInstFtp, MAKEINTRESOURCE(resize_lr_csr));\r
2796                         SetCursor(hCursor);\r
2797                         Resizing = RESIZE_PREPARE;\r
2798                         ResizePos = RESIZE_HPOS;\r
2799                 }\r
2800                 // 高DPI対応\r
2801 //              else if((y >= TOOLWIN_HEIGHT*2+ListHeight) && (y <= TOOLWIN_HEIGHT*2+ListHeight+SepaWidth))\r
2802                 else if((y >= AskToolWinHeight()*2+ListHeight) && (y <= AskToolWinHeight()*2+ListHeight+SepaWidth))\r
2803                 {\r
2804                         /* 境界位置変更用カーソルに変更 */\r
2805                         SetCapture(hWndFtp);\r
2806                         hCursor = LoadCursor(hInstFtp, MAKEINTRESOURCE(resize_ud_csr));\r
2807                         SetCursor(hCursor);\r
2808                         Resizing = RESIZE_PREPARE;\r
2809                         ResizePos = RESIZE_VPOS;\r
2810                 }\r
2811         }\r
2812         else if(Resizing == RESIZE_PREPARE)\r
2813         {\r
2814                 if(Keys & MK_LBUTTON)\r
2815                 {\r
2816                         /* 境界位置変更開始 */\r
2817                         Resizing = RESIZE_ON;\r
2818                         GetWindowRect(hWndFtp, &Rect);\r
2819                         GetClientRect(GetSbarWnd(), &Rect1);\r
2820                         Rect.left += GetSystemMetrics(SM_CXFRAME);\r
2821                         Rect.right -= GetSystemMetrics(SM_CXFRAME);\r
2822                         // 高DPI対応\r
2823 //                      Rect.top += TOOLWIN_HEIGHT*2 + GetSystemMetrics(SM_CYMENU) + GetSystemMetrics(SM_CYCAPTION) + GetSystemMetrics(SM_CYFRAME);\r
2824                         Rect.top += AskToolWinHeight()*2 + GetSystemMetrics(SM_CYMENU) + GetSystemMetrics(SM_CYCAPTION) + GetSystemMetrics(SM_CYFRAME);\r
2825                         Rect.bottom -= GetSystemMetrics(SM_CYFRAME) + Rect1.bottom;\r
2826                         ClipCursor(&Rect);\r
2827                 }\r
2828                 else\r
2829                 {\r
2830                         // 高DPI対応\r
2831 //                      if(((ResizePos == RESIZE_HPOS) &&\r
2832 //                              ((x < LocalWidth) || (x > LocalWidth + SepaWidth) ||\r
2833 //                               (y <= TOOLWIN_HEIGHT) || (y >= (TOOLWIN_HEIGHT * 2 + ListHeight)))) ||\r
2834 //                         ((ResizePos == RESIZE_VPOS) &&\r
2835 //                              ((y < TOOLWIN_HEIGHT*2+ListHeight) || (y > TOOLWIN_HEIGHT*2+ListHeight+SepaWidth))))\r
2836                         if(((ResizePos == RESIZE_HPOS) &&\r
2837                                 ((x < LocalWidth) || (x > LocalWidth + SepaWidth) ||\r
2838                                  (y <= AskToolWinHeight()) || (y >= (AskToolWinHeight() * 2 + ListHeight)))) ||\r
2839                            ((ResizePos == RESIZE_VPOS) &&\r
2840                                 ((y < AskToolWinHeight()*2+ListHeight) || (y > AskToolWinHeight()*2+ListHeight+SepaWidth))))\r
2841                         {\r
2842                                 /* 元のカーソルに戻す */\r
2843                                 ReleaseCapture();\r
2844                                 hCursor = LoadCursor(NULL, IDC_ARROW);\r
2845                                 SetCursor(hCursor);\r
2846                                 Resizing = RESIZE_OFF;\r
2847                         }\r
2848                 }\r
2849         }\r
2850         else if(Resizing == RESIZE_ON)\r
2851         {\r
2852                 if(ResizePos == RESIZE_HPOS)\r
2853                         LocalWidth = x;\r
2854                 else\r
2855                 {\r
2856                         GetClientRect(hWndFtp, &Rect);\r
2857                         GetClientRect(GetSbarWnd(), &Rect1);\r
2858                         TaskHeight = max1(0, Rect.bottom - y - Rect1.bottom);\r
2859                 }\r
2860                 ResizeWindowProc();\r
2861 \r
2862                 if((Keys & MK_LBUTTON) == 0)\r
2863                 {\r
2864                         /* 境界位置変更終了 */\r
2865                         ReleaseCapture();\r
2866                         ClipCursor(NULL);\r
2867                         hCursor = LoadCursor(NULL, IDC_ARROW);\r
2868                         SetCursor(hCursor);\r
2869                         Resizing = RESIZE_OFF;\r
2870                 }\r
2871         }\r
2872         return;\r
2873 }\r
2874 \r
2875 \r
2876 /*----- ファイル一覧情報をビューワで表示 --------------------------------------\r
2877 *\r
2878 *       Parameter\r
2879 *               なし\r
2880 *\r
2881 *       Return Value\r
2882 *               なし\r
2883 *----------------------------------------------------------------------------*/\r
2884 \r
2885 static void DispDirInfo(void)\r
2886 {\r
2887         char Buf[FMAX_PATH+1];\r
2888 \r
2889         MakeCacheFileName(AskCurrentFileListNum(), Buf);\r
2890         ExecViewer(Buf, 0);\r
2891         return;\r
2892 }\r
2893 \r
2894 \r
2895 \r
2896 /*----- ビューワを起動 --------------------------------------------------------\r
2897 *\r
2898 *       Parameter\r
2899 *               char Fname : ファイル名\r
2900 *               int App : アプリケーション番号(-1=関連づけ優先)\r
2901 *\r
2902 *       Return Value\r
2903 *               なし\r
2904 *----------------------------------------------------------------------------*/\r
2905 \r
2906 void ExecViewer(char *Fname, int App)\r
2907 {\r
2908         PROCESS_INFORMATION Info;\r
2909         STARTUPINFO Startup;\r
2910         char AssocProg[FMAX_PATH+1];\r
2911         char ComLine[FMAX_PATH*2+3+1];\r
2912         char CurDir[FMAX_PATH+1];\r
2913         // 任意のコードが実行されるバグ修正\r
2914         char SysDir[FMAX_PATH+1];\r
2915 \r
2916         /* FindExecutable()は関連付けられたプログラムのパス名にスペースが        */\r
2917         /* 含まれている時、間違ったパス名を返す事がある。                                        */\r
2918         /* そこで、関連付けられたプログラムの起動はShellExecute()を使う。       */\r
2919 \r
2920         AskLocalCurDir(CurDir, FMAX_PATH);\r
2921 \r
2922         // 任意のコードが実行されるバグ修正\r
2923         // 拡張子が無いと補完されるため\r
2924 //      if((App == -1) && (FindExecutable(Fname, NULL, AssocProg) > (HINSTANCE)32))\r
2925         if((App == -1) && (strlen(GetFileExt(GetFileName(Fname))) > 0) && (FindExecutable(Fname, NULL, AssocProg) > (HINSTANCE)32))\r
2926         {\r
2927                 DoPrintf("ShellExecute - %s", Fname);\r
2928                 ShellExecute(NULL, "open", Fname, NULL, CurDir, SW_SHOW);\r
2929         }\r
2930         // ローカルフォルダを開く\r
2931         else if((App == -1) && (GetFileAttributes(Fname) & FILE_ATTRIBUTE_DIRECTORY))\r
2932         {\r
2933                 MakeDistinguishableFileName(ComLine, Fname);\r
2934                 DoPrintf("ShellExecute - %s", Fname);\r
2935                 ShellExecute(NULL, "open", ComLine, NULL, Fname, SW_SHOW);\r
2936         }\r
2937         else\r
2938         {\r
2939                 App = max1(0, App);\r
2940                 strcpy(AssocProg, ViewerName[App]);\r
2941 \r
2942                 if(strchr(Fname, ' ') == NULL)\r
2943                         sprintf(ComLine, "%s %s", AssocProg, Fname);\r
2944                 else\r
2945                         sprintf(ComLine, "%s \"%s\"", AssocProg, Fname);\r
2946 \r
2947                 DoPrintf("FindExecutable - %s", ComLine);\r
2948 \r
2949                 memset(&Startup, NUL, sizeof(STARTUPINFO));\r
2950                 Startup.cb = sizeof(STARTUPINFO);\r
2951                 Startup.wShowWindow = SW_SHOW;\r
2952                 // 任意のコードが実行されるバグ修正\r
2953 //              if(CreateProcess(NULL, ComLine, NULL, NULL, FALSE, 0, NULL, NULL, &Startup, &Info) == FALSE)\r
2954 //              {\r
2955 //                      SetTaskMsg(MSGJPN182, GetLastError());\r
2956 //                      SetTaskMsg(">>%s", ComLine);\r
2957 //              }\r
2958                 if(GetCurrentDirectory(FMAX_PATH, CurDir) > 0)\r
2959                 {\r
2960                         if(GetSystemDirectory(SysDir, FMAX_PATH) > 0)\r
2961                         {\r
2962                                 if(SetCurrentDirectory(SysDir))\r
2963                                 {\r
2964                                         if(CreateProcess(NULL, ComLine, NULL, NULL, FALSE, 0, NULL, NULL, &Startup, &Info) == FALSE)\r
2965                                         {\r
2966                                                 SetTaskMsg(MSGJPN182, GetLastError());\r
2967                                                 SetTaskMsg(">>%s", ComLine);\r
2968                                         }\r
2969                                         SetCurrentDirectory(CurDir);\r
2970                                 }\r
2971                         }\r
2972                 }\r
2973         }\r
2974         return;\r
2975 }\r
2976 \r
2977 \r
2978 /*----- 差分表示ビューワを起動 ------------------------------------------------\r
2979 *\r
2980 *       Parameter\r
2981 *               char Fname1 : ファイル名\r
2982 *               char Fname2 : ファイル名2\r
2983 *               int App : アプリケーション番号(2 or 3)\r
2984 *\r
2985 *       Return Value\r
2986 *               なし\r
2987 *----------------------------------------------------------------------------*/\r
2988 \r
2989 void ExecViewer2(char *Fname1, char *Fname2, int App)\r
2990 {\r
2991         PROCESS_INFORMATION Info;\r
2992         STARTUPINFO Startup;\r
2993         char AssocProg[FMAX_PATH+1];\r
2994         char ComLine[FMAX_PATH*2+3+1];\r
2995         char CurDir[FMAX_PATH+1];\r
2996         // 任意のコードが実行されるバグ修正\r
2997         char SysDir[FMAX_PATH+1];\r
2998 \r
2999         /* FindExecutable()は関連付けられたプログラムのパス名にスペースが        */\r
3000         /* 含まれている時、間違ったパス名を返す事がある。                                        */\r
3001         /* そこで、関連付けられたプログラムの起動はShellExecute()を使う。       */\r
3002 \r
3003         AskLocalCurDir(CurDir, FMAX_PATH);\r
3004 \r
3005         strcpy(AssocProg, ViewerName[App] + 2); /* 先頭の "d " は読み飛ばす */\r
3006 \r
3007         if(strchr(Fname1, ' ') == NULL && strchr(Fname2, ' ') == NULL)\r
3008                 sprintf(ComLine, "%s %s %s", AssocProg, Fname1, Fname2);\r
3009         else\r
3010                 sprintf(ComLine, "%s \"%s\" \"%s\"", AssocProg, Fname1, Fname2);\r
3011 \r
3012         DoPrintf("FindExecutable - %s", ComLine);\r
3013 \r
3014         memset(&Startup, NUL, sizeof(STARTUPINFO));\r
3015         Startup.cb = sizeof(STARTUPINFO);\r
3016         Startup.wShowWindow = SW_SHOW;\r
3017         // 任意のコードが実行されるバグ修正\r
3018 //      if(CreateProcess(NULL, ComLine, NULL, NULL, FALSE, 0, NULL, NULL, &Startup, &Info) == FALSE)\r
3019 //      {\r
3020 //              SetTaskMsg(MSGJPN182, GetLastError());\r
3021 //              SetTaskMsg(">>%s", ComLine);\r
3022 //      }\r
3023         if(GetCurrentDirectory(FMAX_PATH, CurDir) > 0)\r
3024         {\r
3025                 if(GetSystemDirectory(SysDir, FMAX_PATH) > 0)\r
3026                 {\r
3027                         if(SetCurrentDirectory(SysDir))\r
3028                         {\r
3029                                 if(CreateProcess(NULL, ComLine, NULL, NULL, FALSE, 0, NULL, NULL, &Startup, &Info) == FALSE)\r
3030                                 {\r
3031                                         SetTaskMsg(MSGJPN182, GetLastError());\r
3032                                         SetTaskMsg(">>%s", ComLine);\r
3033                                 }\r
3034                                 SetCurrentDirectory(CurDir);\r
3035                         }\r
3036                 }\r
3037         }\r
3038 \r
3039         return;\r
3040 }\r
3041 \r
3042 \r
3043 /*----- テンポラリファイル名をテンポラリファイルリストに追加 ------------------\r
3044 *\r
3045 *       Parameter\r
3046 *               char *Fname : テンポラリファイル名\r
3047 *\r
3048 *       Return Value\r
3049 *               なし\r
3050 *----------------------------------------------------------------------------*/\r
3051 \r
3052 void AddTempFileList(char *Fname)\r
3053 {\r
3054         TEMPFILELIST *New;\r
3055 \r
3056         if((New = malloc(sizeof(TEMPFILELIST))) != NULL)\r
3057         {\r
3058                 if((New->Fname = malloc(strlen(Fname)+1)) != NULL)\r
3059                 {\r
3060                         strcpy(New->Fname, Fname);\r
3061                         if(TempFiles == NULL)\r
3062                                 New->Next = NULL;\r
3063                         else\r
3064                                 New->Next = TempFiles;\r
3065                         TempFiles = New;\r
3066                 }\r
3067                 else\r
3068                         free(New);\r
3069         }\r
3070         return;\r
3071 }\r
3072 \r
3073 \r
3074 /*----- テンポラリファイルリストに登録されているファイルを全て削除 ------------\r
3075 *\r
3076 *       Parameter\r
3077 *               なし\r
3078 *\r
3079 *       Return Value\r
3080 *               なし\r
3081 *----------------------------------------------------------------------------*/\r
3082 \r
3083 static void DeleteAlltempFile(void)\r
3084 {\r
3085         TEMPFILELIST *Pos;\r
3086         TEMPFILELIST *Next;\r
3087 \r
3088         Pos = TempFiles;\r
3089         while(Pos != NULL)\r
3090         {\r
3091                 DeleteFile(Pos->Fname);\r
3092 \r
3093                 Next = Pos->Next;\r
3094                 free(Pos->Fname);\r
3095                 free(Pos);\r
3096                 Pos = Next;\r
3097         }\r
3098 \r
3099         // OLE D&Dのテンポラリを削除する (2007.9.11 yutaka)\r
3100         doDeleteRemoteFile();\r
3101 \r
3102         return;\r
3103 }\r
3104 \r
3105 \r
3106 /*----- Aboutダイアログボックスのコールバック関数 ------------------------\r
3107 *\r
3108 *       Parameter\r
3109 *               HWND hDlg : ウインドウハンドル\r
3110 *               UINT message : メッセージ番号\r
3111 *               WPARAM wParam : メッセージの WPARAM 引数\r
3112 *               LPARAM lParam : メッセージの LPARAM 引数\r
3113 *\r
3114 *       Return Value\r
3115 *               BOOL TRUE/FALSE\r
3116 *----------------------------------------------------------------------------*/\r
3117 \r
3118 // 64ビット対応\r
3119 //static BOOL CALLBACK AboutDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)\r
3120 static INT_PTR CALLBACK AboutDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)\r
3121 {\r
3122         static char Tmp[80];\r
3123         int Ver;\r
3124 \r
3125         switch (message)\r
3126         {\r
3127                 case WM_INITDIALOG :\r
3128                         Ver = GetJreVersion();\r
3129                         if(Ver == -1)\r
3130                                 sprintf(Tmp, MSGJPN183);\r
3131                         else\r
3132                                 sprintf(Tmp, MSGJPN184, Ver / 0x100, Ver % 0x100);\r
3133                         SendDlgItemMessage(hDlg, ABOUT_JRE, WM_SETTEXT, 0, (LPARAM)Tmp);\r
3134                         SendDlgItemMessage(hDlg, ABOUT_URL, EM_LIMITTEXT, 256, 0);\r
3135                         SendDlgItemMessage(hDlg, ABOUT_URL, WM_SETTEXT, 0, (LPARAM)MSGJPN284);\r
3136                         return(TRUE);\r
3137 \r
3138                 case WM_COMMAND :\r
3139                         switch(GET_WM_COMMAND_ID(wParam, lParam))\r
3140                         {\r
3141                                 case IDOK :\r
3142                                 case IDCANCEL :\r
3143                                         EndDialog(hDlg, YES);\r
3144                                         break;\r
3145                         }\r
3146                         return(TRUE);\r
3147         }\r
3148     return(FALSE);\r
3149 }\r
3150 \r
3151 \r
3152 /*----- サウンドを鳴らす ------------------------------------------------------\r
3153 *\r
3154 *       Parameter\r
3155 *               Int num : サウンドの種類 (SND_xxx)\r
3156 *\r
3157 *       Return Value\r
3158 *               なし\r
3159 *----------------------------------------------------------------------------*/\r
3160 \r
3161 void SoundPlay(int Num)\r
3162 {\r
3163         if(Sound[Num].On == YES)\r
3164                 sndPlaySound(Sound[Num].Fname, SND_ASYNC | SND_NODEFAULT);\r
3165 \r
3166         return;\r
3167 }\r
3168 \r
3169 \r
3170 /*----- ヘルプファイルのパス名を返す ------------------------------------------\r
3171 *\r
3172 *       Parameter\r
3173 *               なし\r
3174 *\r
3175 *       Return Value\r
3176 *               char *パス名\r
3177 *----------------------------------------------------------------------------*/\r
3178 \r
3179 char *AskHelpFilePath(void)\r
3180 {\r
3181         return(HelpPath);\r
3182 }\r
3183 \r
3184 \r
3185 /*----- テンポラリファイルのパス名を返す --------------------------------------\r
3186 *\r
3187 *       Parameter\r
3188 *               なし\r
3189 *\r
3190 *       Return Value\r
3191 *               char *パス名\r
3192 *----------------------------------------------------------------------------*/\r
3193 \r
3194 char *AskTmpFilePath(void)\r
3195 {\r
3196         return(TmpPath);\r
3197 }\r
3198 \r
3199 \r
3200 /*----- INIファイルのパス名を返す ---------------------------------------------\r
3201 *\r
3202 *       Parameter\r
3203 *               なし\r
3204 *\r
3205 *       Return Value\r
3206 *               char *パス名\r
3207 *----------------------------------------------------------------------------*/\r
3208 \r
3209 char *AskIniFilePath(void)\r
3210 {\r
3211         return(IniPath);\r
3212 }\r
3213 \r
3214 /*----- INIファイルのみを使うかどうかを返す -----------------------------------\r
3215 *\r
3216 *       Parameter\r
3217 *               なし\r
3218 *\r
3219 *       Return Value\r
3220 *               int ステータス : YES/NO\r
3221 *----------------------------------------------------------------------------*/\r
3222 \r
3223 int AskForceIni(void)\r
3224 {\r
3225         return(ForceIni);\r
3226 }\r
3227 \r
3228 \r
3229 \r
3230 \r
3231 /*----- メッセージ処理 --------------------------------------------------------\r
3232 *\r
3233 *       Parameter\r
3234 *               なし\r
3235 *\r
3236 *       Return Value\r
3237 *               int 終了フラグ (YES=WM_CLOSEが来た/NO)\r
3238 *----------------------------------------------------------------------------*/\r
3239 \r
3240 int BackgrndMessageProc(void)\r
3241 {\r
3242     MSG Msg;\r
3243         int Ret;\r
3244 \r
3245         Ret = NO;\r
3246         while(PeekMessage(&Msg, NULL, 0, 0, PM_REMOVE))\r
3247         {\r
3248                 // マルチコアCPUの特定環境下でファイル通信中にクラッシュするバグ対策\r
3249 //              if(!HtmlHelp(NULL, NULL, HH_PRETRANSLATEMESSAGE, (DWORD)&Msg))\r
3250                 // 64ビット対応\r
3251 //              if(!IsMainThread() || !HtmlHelp(NULL, NULL, HH_PRETRANSLATEMESSAGE, (DWORD)&Msg))\r
3252                 if(!IsMainThread() || !HtmlHelp(NULL, NULL, HH_PRETRANSLATEMESSAGE, (DWORD_PTR)&Msg))\r
3253                 {\r
3254                         /* ディレクトリ名の表示コンボボックスでBSやRETが効くように */\r
3255                         /* コンボボックス内ではアクセラレータを無効にする */\r
3256                         if((Msg.hwnd == GetLocalHistEditHwnd()) ||\r
3257                            (Msg.hwnd == GetRemoteHistEditHwnd()) ||\r
3258                            ((hHelpWin != NULL) && (Msg.hwnd == hHelpWin)) ||\r
3259                            GetHideUI() == YES ||\r
3260                            (TranslateAccelerator(GetMainHwnd(), Accel, &Msg) == 0))\r
3261                         {\r
3262                                 if(Msg.message == WM_QUIT)\r
3263                                 {\r
3264                                         Ret = YES;\r
3265                                         PostQuitMessage(0);\r
3266                                         break;\r
3267                                 }\r
3268                                 TranslateMessage(&Msg);\r
3269                                 DispatchMessage(&Msg);\r
3270                         }\r
3271                 }\r
3272         }\r
3273         return(Ret);\r
3274 }\r
3275 \r
3276 \r
3277 /*----- 自動終了フラグをクリアする --------------------------------------------\r
3278 *\r
3279 *       Parameter\r
3280 *               なし\r
3281 *\r
3282 *       Return Value\r
3283 *               なし\r
3284 *----------------------------------------------------------------------------*/\r
3285 \r
3286 void ResetAutoExitFlg(void)\r
3287 {\r
3288         AutoExit = NO;\r
3289         return;\r
3290 }\r
3291 \r
3292 \r
3293 /*----- 自動終了フラグを返す --------------------------------------------------\r
3294 *\r
3295 *       Parameter\r
3296 *               なし\r
3297 *\r
3298 *       Return Value\r
3299 *               int フラグ (YES/NO)\r
3300 *----------------------------------------------------------------------------*/\r
3301 \r
3302 int AskAutoExit(void)\r
3303 {\r
3304         return(AutoExit);\r
3305 }\r
3306 \r
3307 /*----- ユーザにパスワードを入力させ,それを設定する -----------------------\r
3308 *\r
3309 *       Parameter\r
3310 *               なし\r
3311 *\r
3312 *       Return Value\r
3313 *               int : 0/ユーザキャンセル, 1/設定した, 2/デフォルト設定\r
3314 *----------------------------------------------------------------------------*/\r
3315 int EnterMasterPasswordAndSet( int Res, HWND hWnd )\r
3316 {\r
3317         char buf[MAX_PASSWORD_LEN + 1];\r
3318         // パスワードの入力欄を非表示\r
3319         // 非表示にしたため新しいパスワードを2回入力させる\r
3320         char buf1[MAX_PASSWORD_LEN + 1];\r
3321         char *p;\r
3322         int Flag;\r
3323 \r
3324         buf[0] = NUL;\r
3325         if( InputDialogBox(Res, hWnd, NULL, buf, MAX_PASSWORD_LEN + 1,\r
3326                 &Flag, IDH_HELP_TOPIC_0000064) == YES){\r
3327                 // パスワードの入力欄を非表示\r
3328                 if(Res == newmasterpasswd_dlg)\r
3329                 {\r
3330                         buf1[0] = NUL;\r
3331                         if( InputDialogBox(Res, hWnd, NULL, buf1, MAX_PASSWORD_LEN + 1,\r
3332                                 &Flag, IDH_HELP_TOPIC_0000064) != YES){\r
3333                                 return 0;\r
3334                         }\r
3335                         if(strcmp(buf, buf1) != 0)\r
3336                         {\r
3337                                 MessageBox(hWnd, MSGJPN325, "FFFTP", MB_OK | MB_ICONERROR);\r
3338                                 return 0;\r
3339                         }\r
3340                 }\r
3341                 /* 末尾の空白を削除 */\r
3342                 RemoveTailingSpaces(buf);\r
3343                 /* 先頭の空白を削除 */\r
3344                 for( p = buf; *p == ' '; p++ )\r
3345                         ;\r
3346                 \r
3347                 if( p[0] != NUL ){\r
3348                         SetMasterPassword( p );\r
3349                         return 1;\r
3350                 }\r
3351                 else {\r
3352                         /* 空の場合はデフォルト値を設定 */\r
3353                         SetMasterPassword( NULL );\r
3354                         return 2;\r
3355                 }\r
3356         }\r
3357         return 0;\r
3358 }\r
3359 \r
3360 // 暗号化通信対応\r
3361 BOOL __stdcall SSLTimeoutCallback(BOOL* pbAborted)\r
3362 {\r
3363         Sleep(1);\r
3364         if(BackgrndMessageProc() == YES)\r
3365                 return TRUE;\r
3366         if(*pbAborted == YES)\r
3367                 return TRUE;\r
3368         return FALSE;\r
3369 }\r
3370 \r
3371 BOOL __stdcall SSLConfirmCallback(BOOL* pbAborted, BOOL bVerified, LPCSTR Certificate, LPCSTR CommonName)\r
3372 {\r
3373         BOOL bResult;\r
3374         uint32 Hash[5];\r
3375         int i;\r
3376         char* pm0;\r
3377         bResult = FALSE;\r
3378         sha_memory((char*)Certificate, (uint32)(strlen(Certificate) * sizeof(char)), (uint32*)&Hash);\r
3379         // sha.cはビッグエンディアンのため\r
3380         for(i = 0; i < 5; i++)\r
3381                 Hash[i] = _byteswap_ulong(Hash[i]);\r
3382         i = 0;\r
3383         while(i < MAX_CERT_CACHE_HASH)\r
3384         {\r
3385                 if(memcmp(&CertificateCacheHash[i], &Hash, 20) == 0)\r
3386                 {\r
3387                         bResult = TRUE;\r
3388                         break;\r
3389                 }\r
3390                 i++;\r
3391         }\r
3392         if(!bResult)\r
3393         {\r
3394                 if(pm0 = AllocateStringM(strlen(Certificate) + 1024))\r
3395                 {\r
3396                         sprintf(pm0, MSGJPN326, IsHostNameMatched(AskHostAdrs(), CommonName) ? MSGJPN327 : MSGJPN328, bVerified ? MSGJPN327 : MSGJPN328, Certificate);\r
3397                         if(MessageBox(GetMainHwnd(), pm0, "FFFTP", MB_YESNO) == IDYES)\r
3398                         {\r
3399                                 for(i = MAX_CERT_CACHE_HASH - 1; i >= 1; i--)\r
3400                                         memcpy(&CertificateCacheHash[i], &CertificateCacheHash[i - 1], 20);\r
3401                                 memcpy(&CertificateCacheHash[0], &Hash, 20);\r
3402                                 bResult = TRUE;\r
3403                         }\r
3404                         FreeDuplicatedString(pm0);\r
3405                 }\r
3406         }\r
3407         if(!bResult)\r
3408                 *pbAborted = YES;\r
3409         return bResult;\r
3410 }\r
3411 \r
3412 BOOL LoadSSLRootCAFile()\r
3413 {\r
3414         BOOL bResult;\r
3415         HANDLE hFile;\r
3416         DWORD Size;\r
3417         BYTE* pBuffer;\r
3418         uint32 Hash[5];\r
3419         int i;\r
3420         bResult = FALSE;\r
3421         if((hFile = CreateFile(SSLRootCAFilePath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL)) != INVALID_HANDLE_VALUE)\r
3422         {\r
3423                 Size = GetFileSize(hFile, NULL);\r
3424                 if(pBuffer = (BYTE*)malloc(Size))\r
3425                 {\r
3426                         if(ReadFile(hFile, pBuffer, Size, &Size, NULL))\r
3427                         {\r
3428                                 sha_memory((char*)pBuffer, (uint32)Size, (uint32*)&Hash);\r
3429                                 // sha.cはビッグエンディアンのため\r
3430                                 for(i = 0; i < 5; i++)\r
3431                                         Hash[i] = _byteswap_ulong(Hash[i]);\r
3432                                 // 同梱する"ssl.pem"に合わせてSHA1ハッシュ値を変更すること\r
3433                                 if(memcmp(&Hash, &SSLRootCAFileHash, 20) == 0 || memcmp(&Hash, "\x57\x50\x4F\xF9\x95\xFC\x41\x2F\x10\x2B\x36\xFA\x92\xAB\x08\xBB\xC3\x7F\x9A\xDB", 20) == 0\r
3434                                         || DialogBox(GetFtpInst(), MAKEINTRESOURCE(updatesslroot_dlg), GetMainHwnd(), ExeEscDialogProc) == YES)\r
3435                                 {\r
3436                                         memcpy(&SSLRootCAFileHash, &Hash, 20);\r
3437                                         if(SetSSLRootCertificate(pBuffer, Size))\r
3438                                                 bResult = TRUE;\r
3439                                 }\r
3440                         }\r
3441                         free(pBuffer);\r
3442                 }\r
3443                 CloseHandle(hFile);\r
3444         }\r
3445         return bResult;\r
3446 }\r
3447 \r
3448 // マルチコアCPUの特定環境下でファイル通信中にクラッシュするバグ対策\r
3449 BOOL IsMainThread()\r
3450 {\r
3451         if(GetCurrentThreadId() != MainThreadId)\r
3452                 return FALSE;\r
3453         return TRUE;\r
3454 }\r
3455 \r
3456 // ポータブル版判定\r
3457 void CheckPortableVersion()\r
3458 {\r
3459         HANDLE hFile;\r
3460         if((hFile = CreateFile(PortableFilePath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL)) != INVALID_HANDLE_VALUE)\r
3461         {\r
3462                 PortableVersion = YES;\r
3463                 CloseHandle(hFile);\r
3464         }\r
3465         else\r
3466                 PortableVersion = NO;\r
3467 }\r
3468 \r
3469 int AskPortableVersion(void)\r
3470 {\r
3471         return(PortableVersion);\r
3472 }\r
3473 \r
3474 // 全設定暗号化対応\r
3475 int Restart()\r
3476 {\r
3477         int Sts;\r
3478         char* CommandLine;\r
3479         STARTUPINFO si;\r
3480         PROCESS_INFORMATION pi;\r
3481         Sts = FFFTP_FAIL;\r
3482         if(CommandLine = (char*)malloc(sizeof(char) * (strlen(GetCommandLine())  + 1)))\r
3483         {\r
3484                 strcpy(CommandLine, GetCommandLine());\r
3485                 GetStartupInfo(&si);\r
3486                 if(CreateProcess(NULL, CommandLine, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))\r
3487                 {\r
3488                         CloseHandle(pi.hThread);\r
3489                         CloseHandle(pi.hProcess);\r
3490                         Sts = FFFTP_SUCCESS;\r
3491                 }\r
3492                 free(CommandLine);\r
3493         }\r
3494         return Sts;\r
3495 }\r
3496 \r
3497 void RestartAndTerminate()\r
3498 {\r
3499         Restart();\r
3500         exit(1);\r
3501 }\r
3502 \r
3503 // タスクバー進捗表示\r
3504 int LoadTaskbarList3()\r
3505 {\r
3506         int Sts;\r
3507         Sts = FFFTP_FAIL;\r
3508         if(CoCreateInstance(&CLSID_TaskbarList, NULL, CLSCTX_ALL, &IID_ITaskbarList3, (void**)&pTaskbarList3) == S_OK)\r
3509         {\r
3510                 Sts = FFFTP_SUCCESS;\r
3511         }\r
3512         return Sts;\r
3513 }\r
3514 \r
3515 void FreeTaskbarList3()\r
3516 {\r
3517         if(pTaskbarList3 != NULL)\r
3518                 pTaskbarList3->lpVtbl->Release(pTaskbarList3);\r
3519         pTaskbarList3 = NULL;\r
3520 }\r
3521 \r
3522 int IsTaskbarList3Loaded()\r
3523 {\r
3524         int Sts;\r
3525         Sts = NO;\r
3526         if(pTaskbarList3 != NULL)\r
3527                 Sts = YES;\r
3528         return Sts;\r
3529 }\r
3530 \r
3531 void UpdateTaskbarProgress()\r
3532 {\r
3533         if(AskTransferSizeTotal() > 0)\r
3534         {\r
3535                 if(AskTransferErrorDisplay() > 0)\r
3536                         pTaskbarList3->lpVtbl->SetProgressState(pTaskbarList3, GetMainHwnd(), TBPF_ERROR);\r
3537                 else\r
3538                         pTaskbarList3->lpVtbl->SetProgressState(pTaskbarList3, GetMainHwnd(), TBPF_NORMAL);\r
3539                 pTaskbarList3->lpVtbl->SetProgressValue(pTaskbarList3, GetMainHwnd(), (ULONGLONG)(AskTransferSizeTotal() - AskTransferSizeLeft()), (ULONGLONG)AskTransferSizeTotal());\r
3540         }\r
3541         else\r
3542                 pTaskbarList3->lpVtbl->SetProgressState(pTaskbarList3, GetMainHwnd(), TBPF_NOPROGRESS);\r
3543 }\r
3544 \r
3545 // 高DPI対応\r
3546 int AskToolWinHeight(void)\r
3547 {\r
3548         return(ToolWinHeight);\r
3549 }\r
3550 \r