OSDN Git Service

Automate the creation of installers.
[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                                 // FileZilla XML形式エクスポート対応\r
1686                                 case MENU_EXPORT_FILEZILLA_XML :\r
1687                                         // 平文で出力するためマスターパスワードを再確認\r
1688                                         if(GetMasterPasswordStatus() == PASSWORD_OK)\r
1689                                         {\r
1690                                                 char Password[MAX_PASSWORD_LEN + 1];\r
1691                                                 GetMasterPassword(Password);\r
1692                                                 SetMasterPassword(NULL);\r
1693                                                 while(ValidateMasterPassword() == YES && GetMasterPasswordStatus() == PASSWORD_UNMATCH)\r
1694                                                 {\r
1695                                                         if(EnterMasterPasswordAndSet(masterpasswd_dlg, NULL) == 0)\r
1696                                                                 break;\r
1697                                                 }\r
1698                                                 if(GetMasterPasswordStatus() == PASSWORD_OK)\r
1699                                                         SaveSettingsToFileZillaXml();\r
1700                                                 else\r
1701                                                 {\r
1702                                                         SetMasterPassword(Password);\r
1703                                                         ValidateMasterPassword();\r
1704                                                 }\r
1705                                         }\r
1706                                         break;\r
1707 \r
1708                                 default :\r
1709                                         if((LOWORD(wParam) >= MENU_BMARK_TOP) &&\r
1710                                            (LOWORD(wParam) < MENU_BMARK_TOP+100))\r
1711                                         {\r
1712                                                 ChangeDirBmarkProc(LOWORD(wParam));\r
1713                                         }\r
1714                                         break;\r
1715                         }\r
1716 // 常にホストかローカルへフォーカスを移動\r
1717 //                      SetFocus(hWndCurFocus);\r
1718                         MakeButtonsFocus();\r
1719                         break;\r
1720 \r
1721                 case WM_NOTIFY :\r
1722                         switch(((LPNMHDR)lParam)->code)\r
1723                         {\r
1724                                 /* ツールチップコントロールメッセージの処理 */\r
1725                                 // UTF-8対応\r
1726 //                              case TTN_NEEDTEXT:\r
1727                                 case TTN_NEEDTEXTW:\r
1728                                         lpttt = (LPTOOLTIPTEXT)lParam;\r
1729                                         // UTF-8対応\r
1730                                         // lptttは単なる警告回避用\r
1731                                         wlpttt = (LPTOOLTIPTEXTW)lParam;\r
1732                                         lpttt->hinst = hInstFtp;\r
1733                                         switch(lpttt->hdr.idFrom)\r
1734                                         {\r
1735                                                 case MENU_CONNECT :\r
1736                                                         lpttt->lpszText = MSGJPN154;\r
1737                                                         break;\r
1738 \r
1739                                                 case MENU_QUICK :\r
1740                                                         lpttt->lpszText = MSGJPN155;\r
1741                                                         break;\r
1742 \r
1743                                                 case MENU_DISCONNECT :\r
1744                                                         lpttt->lpszText = MSGJPN156;\r
1745                                                         break;\r
1746 \r
1747                                                 case MENU_DOWNLOAD :\r
1748                                                         lpttt->lpszText = MSGJPN157;\r
1749                                                         break;\r
1750 #if defined(HAVE_TANDEM)\r
1751                                                 case MENU_DOWNLOAD_AS :\r
1752                                                         lpttt->lpszText = MSGJPN065;\r
1753                                                         break;\r
1754 \r
1755                                                 case MENU_UPLOAD_AS :\r
1756                                                         lpttt->lpszText = MSGJPN064;\r
1757                                                         break;\r
1758 #endif\r
1759                                                 case MENU_UPLOAD :\r
1760                                                         lpttt->lpszText = MSGJPN158;\r
1761                                                         break;\r
1762 \r
1763                                                 case MENU_MIRROR_UPLOAD :\r
1764                                                         lpttt->lpszText = MSGJPN159;\r
1765                                                         break;\r
1766 \r
1767                                                 case MENU_DELETE :\r
1768                                                         lpttt->lpszText = MSGJPN160;\r
1769                                                         break;\r
1770 \r
1771                                                 case MENU_RENAME :\r
1772                                                         lpttt->lpszText = MSGJPN161;\r
1773                                                         break;\r
1774 \r
1775                                                 case MENU_MKDIR :\r
1776                                                         lpttt->lpszText = MSGJPN162;\r
1777                                                         break;\r
1778 \r
1779                                                 case MENU_LOCAL_UPDIR :\r
1780                                                 case MENU_REMOTE_UPDIR :\r
1781                                                         lpttt->lpszText = MSGJPN163;\r
1782                                                         break;\r
1783 \r
1784                                                 case MENU_LOCAL_CHDIR :\r
1785                                                 case MENU_REMOTE_CHDIR :\r
1786                                                         lpttt->lpszText = MSGJPN164;\r
1787                                                         break;\r
1788 \r
1789                                                 case MENU_TEXT :\r
1790                                                         lpttt->lpszText = MSGJPN165;\r
1791                                                         break;\r
1792 \r
1793                                                 case MENU_BINARY :\r
1794                                                         lpttt->lpszText = MSGJPN166;\r
1795                                                         break;\r
1796 \r
1797                                                 case MENU_AUTO :\r
1798                                                         lpttt->lpszText = MSGJPN167;\r
1799                                                         break;\r
1800 \r
1801                                                 case MENU_REFRESH :\r
1802                                                         lpttt->lpszText = MSGJPN168;\r
1803                                                         break;\r
1804 \r
1805                                                 case MENU_LIST :\r
1806                                                         lpttt->lpszText = MSGJPN169;\r
1807                                                         break;\r
1808 \r
1809                                                 case MENU_REPORT :\r
1810                                                         lpttt->lpszText = MSGJPN170;\r
1811                                                         break;\r
1812 \r
1813                                                 case MENU_KNJ_SJIS :\r
1814                                                         lpttt->lpszText = MSGJPN307;\r
1815                                                         break;\r
1816 \r
1817                                                 case MENU_KNJ_EUC :\r
1818                                                         lpttt->lpszText = MSGJPN171;\r
1819                                                         break;\r
1820 \r
1821                                                 case MENU_KNJ_JIS :\r
1822                                                         lpttt->lpszText = MSGJPN172;\r
1823                                                         break;\r
1824 \r
1825                                                 case MENU_KNJ_UTF8N :\r
1826                                                         lpttt->lpszText = MSGJPN308;\r
1827                                                         break;\r
1828 \r
1829                                                 case MENU_KNJ_UTF8BOM :\r
1830                                                         lpttt->lpszText = MSGJPN330;\r
1831                                                         break;\r
1832 \r
1833                                                 case MENU_KNJ_NONE :\r
1834                                                         lpttt->lpszText = MSGJPN173;\r
1835                                                         break;\r
1836 \r
1837                                                 case MENU_L_KNJ_SJIS :\r
1838                                                         lpttt->lpszText = MSGJPN309;\r
1839                                                         break;\r
1840 \r
1841                                                 case MENU_L_KNJ_EUC :\r
1842                                                         lpttt->lpszText = MSGJPN310;\r
1843                                                         break;\r
1844 \r
1845                                                 case MENU_L_KNJ_JIS :\r
1846                                                         lpttt->lpszText = MSGJPN311;\r
1847                                                         break;\r
1848 \r
1849                                                 case MENU_L_KNJ_UTF8N :\r
1850                                                         lpttt->lpszText = MSGJPN312;\r
1851                                                         break;\r
1852 \r
1853                                                 case MENU_L_KNJ_UTF8BOM :\r
1854                                                         lpttt->lpszText = MSGJPN331;\r
1855                                                         break;\r
1856 \r
1857                                                 case MENU_KANACNV :\r
1858                                                         lpttt->lpszText = MSGJPN174;\r
1859                                                         break;\r
1860 \r
1861                                                 case MENU_SYNC :\r
1862                                                         lpttt->lpszText = MSGJPN175;\r
1863                                                         break;\r
1864 \r
1865                                                 case MENU_ABORT :\r
1866                                                         lpttt->lpszText = MSGJPN176;\r
1867                                                         break;\r
1868                                         }\r
1869                                         // UTF-8対応\r
1870                                         // UTF-8からUTF-16 LEへ変換\r
1871                                         {\r
1872                                                 static wchar_t StringBufferUTF16[1024];\r
1873                                                 if(lpttt->lpszText)\r
1874                                                 {\r
1875                                                         MtoW(StringBufferUTF16, sizeof(StringBufferUTF16)/ sizeof(wchar_t), lpttt->lpszText, -1);\r
1876                                                         wlpttt->lpszText = StringBufferUTF16;\r
1877                                                 }\r
1878                                         }\r
1879                                         break;\r
1880 \r
1881                                 case LVN_COLUMNCLICK :\r
1882                                         if(((NMHDR *)lParam)->hwndFrom == GetLocalHwnd())\r
1883                                         {\r
1884                                                 // 同時接続対応\r
1885                                                 CancelFlg = NO;\r
1886                                                 SetSortTypeByColumn(WIN_LOCAL, ((NM_LISTVIEW *)lParam)->iSubItem);\r
1887                                                 ReSortDispList(WIN_LOCAL, &CancelFlg);\r
1888                                         }\r
1889                                         else if(((NMHDR *)lParam)->hwndFrom == GetRemoteHwnd())\r
1890                                         {\r
1891                                                 if(((NM_LISTVIEW *)lParam)->iSubItem != 4)\r
1892                                                 {\r
1893                                                         // 同時接続対応\r
1894                                                         CancelFlg = NO;\r
1895                                                         SetSortTypeByColumn(WIN_REMOTE, ((NM_LISTVIEW *)lParam)->iSubItem);\r
1896                                                         ReSortDispList(WIN_REMOTE, &CancelFlg);\r
1897                                                 }\r
1898                                         }\r
1899                                         SetFocus(hWndCurFocus);\r
1900                                         break;\r
1901 \r
1902                                 case LVN_ITEMCHANGED :\r
1903                                         DispSelectedSpace();\r
1904                                         MakeButtonsFocus();\r
1905                                         break;\r
1906                         }\r
1907                         break;\r
1908 \r
1909                 case WM_SIZE :\r
1910                         Sizing = SW_RESTORE;\r
1911                         if(wParam == SIZE_RESTORED)\r
1912                         {\r
1913                                 ResizeWindowProc();\r
1914                                 GetWindowRect(hWnd, &Rect);\r
1915                                 WinPosX = Rect.left;\r
1916                                 WinPosY = Rect.top;\r
1917                         }\r
1918                         else if(wParam == SIZE_MAXIMIZED)\r
1919                         {\r
1920                                 Sizing = SW_MAXIMIZE;\r
1921                                 ResizeWindowProc();\r
1922                         }\r
1923                         else\r
1924                                 return(DefWindowProc(hWnd, message, wParam, lParam));\r
1925                         break;\r
1926 \r
1927                 case WM_MOVING :\r
1928                         WinPosX = ((RECT *)lParam)->left;\r
1929                         WinPosY = ((RECT *)lParam)->top;\r
1930                         return(DefWindowProc(hWnd, message, wParam, lParam));\r
1931 \r
1932                 case WM_SETFOCUS :\r
1933                         SetFocus(hWndCurFocus);\r
1934                         break;\r
1935 \r
1936                 case WM_LBUTTONDOWN :\r
1937                 case WM_LBUTTONUP :\r
1938                 case WM_MOUSEMOVE :\r
1939                         CheckResizeFrame(wParam, LOWORD(lParam), HIWORD(lParam));\r
1940                         break;\r
1941 \r
1942                 case WM_CHANGE_COND :\r
1943                         DispTransferFiles();\r
1944                         break;\r
1945 \r
1946                 case WM_REFRESH_LOCAL_FLG :\r
1947                         // 外部アプリケーションへドロップ後にローカル側のファイル一覧に作業フォルダが表示されるバグ対策\r
1948 //                      PostMessage(hWnd,  WM_COMMAND, MAKEWPARAM(REFRESH_LOCAL, 0), 0);\r
1949                         if(SuppressRefresh == 0)\r
1950                                 PostMessage(hWnd,  WM_COMMAND, MAKEWPARAM(REFRESH_LOCAL, 0), 0);\r
1951                         break;\r
1952 \r
1953                 case WM_REFRESH_REMOTE_FLG :\r
1954                         if(SuppressRefresh == 0)\r
1955                                 PostMessage(hWnd,  WM_COMMAND, MAKEWPARAM(REFRESH_REMOTE, 0), 0);\r
1956                         break;\r
1957 \r
1958                 case WM_PAINT :\r
1959                     BeginPaint(hWnd, (LPPAINTSTRUCT) &ps);\r
1960                     EndPaint(hWnd, (LPPAINTSTRUCT) &ps);\r
1961                         break;\r
1962 \r
1963                 case WM_DESTROY :\r
1964                         // ローカル側自動更新\r
1965                         KillTimer(hWnd, 1);\r
1966                         if(ChangeNotification != INVALID_HANDLE_VALUE)\r
1967                                 FindCloseChangeNotification(ChangeNotification);\r
1968                         // タスクバー進捗表示\r
1969                         KillTimer(hWnd, 2);\r
1970 //                      WSACleanup();\r
1971 //                      DestroyWindow(hWndFtp);\r
1972                         PostQuitMessage(0);\r
1973                         break;\r
1974 \r
1975                 case WM_QUERYENDSESSION :\r
1976                         ExitProc(hWnd);\r
1977                         return(TRUE);\r
1978 \r
1979                 case WM_CLOSE :\r
1980                         if((AskTransferNow() == NO) ||\r
1981                            (DialogBox(hInstFtp, MAKEINTRESOURCE(exit_dlg), hWnd, ExeEscDialogProc) == YES))\r
1982                         {\r
1983                                 ExitProc(hWnd);\r
1984                                 return(DefWindowProc(hWnd, message, wParam, lParam));\r
1985                         }\r
1986                         break;\r
1987 \r
1988                 default :\r
1989                         return(DefWindowProc(hWnd, message, wParam, lParam));\r
1990         }\r
1991     return(0L);\r
1992 }\r
1993 \r
1994 \r
1995 /*----- プログラム開始時の処理 ------------------------------------------------\r
1996 *\r
1997 *       Parameter\r
1998 *               char *Cmd : コマンドライン文字列\r
1999 *\r
2000 *       Return Value\r
2001 *               なし\r
2002 *----------------------------------------------------------------------------*/\r
2003 \r
2004 static void StartupProc(char *Cmd)\r
2005 {\r
2006         int Sts;\r
2007         int AutoConnect;\r
2008         int CmdOption;\r
2009         int Kanji;\r
2010         int Kana;\r
2011         int FnameKanji;\r
2012         int TrMode;\r
2013         char unc[FMAX_PATH+1];\r
2014 \r
2015         Sts = AnalyzeComLine(Cmd, &AutoConnect, &CmdOption, unc, FMAX_PATH);\r
2016 \r
2017         TrMode = TYPE_DEFAULT;\r
2018         Kanji = KANJI_NOCNV;\r
2019         FnameKanji = KANJI_NOCNV;\r
2020         Kana = YES;\r
2021         if(CmdOption & OPT_ASCII)\r
2022                 TrMode = TYPE_A;\r
2023         if(CmdOption & OPT_BINARY)\r
2024                 TrMode = TYPE_I;\r
2025         if(CmdOption & OPT_EUC)\r
2026                 Kanji = KANJI_EUC;\r
2027         if(CmdOption & OPT_JIS)\r
2028                 Kanji = KANJI_JIS;\r
2029         if(CmdOption & OPT_EUC_NAME)\r
2030                 FnameKanji = KANJI_EUC;\r
2031         if(CmdOption & OPT_JIS_NAME)\r
2032                 FnameKanji = KANJI_JIS;\r
2033         if(CmdOption & OPT_KANA)\r
2034                 Kana = NO;\r
2035 \r
2036         if(CmdOption & OPT_QUIT)\r
2037                 AutoExit = YES;\r
2038 \r
2039         if(CmdOption & OPT_SAVEOFF)\r
2040                 SuppressSave = YES;\r
2041         if(CmdOption & OPT_SAVEON)\r
2042                 SuppressSave = NO;\r
2043 \r
2044         // UTF-8対応\r
2045         if(CmdOption & OPT_SJIS)\r
2046                 Kanji = KANJI_SJIS;\r
2047         if(CmdOption & OPT_UTF8N)\r
2048                 Kanji = KANJI_UTF8N;\r
2049         if(CmdOption & OPT_UTF8BOM)\r
2050                 Kanji = KANJI_UTF8BOM;\r
2051         if(CmdOption & OPT_SJIS_NAME)\r
2052                 FnameKanji = KANJI_SJIS;\r
2053         if(CmdOption & OPT_UTF8N_NAME)\r
2054                 FnameKanji = KANJI_UTF8N;\r
2055 \r
2056         if(Sts == 0)\r
2057         {\r
2058                 if(ConnectOnStart == YES)\r
2059                         PostMessage(hWndFtp, WM_COMMAND, MAKEWPARAM(MENU_CONNECT, 0), 0);\r
2060         }\r
2061         else if(Sts == 1)\r
2062         {\r
2063                 DirectConnectProc(unc, Kanji, Kana, FnameKanji, TrMode);\r
2064         }\r
2065         else if(Sts == 2)\r
2066         {\r
2067                 PostMessage(hWndFtp, WM_COMMAND, MAKEWPARAM(MENU_CONNECT_NUM, CmdOption), (LPARAM)AutoConnect);\r
2068         }\r
2069         return;\r
2070 }\r
2071 \r
2072 \r
2073 /*----- コマンドラインを解析 --------------------------------------------------\r
2074 *\r
2075 *       Parameter\r
2076 *               char *Str : コマンドライン文字列\r
2077 *               int *AutoConnect : 接続ホスト番号を返すワーク\r
2078 *               int *CmdOption : オプションを返すワーク\r
2079 *               char *unc : uncを返すワーク\r
2080 *               int Max : uncの最大長\r
2081 *\r
2082 *       Return Value\r
2083 *               int ステータス\r
2084 *                       0=指定なし、1=URL指定、2=設定名指定、-1=エラー\r
2085 *\r
2086 *       Note\r
2087 *               -m      --mirror\r
2088 *               -d      --mirrordown\r
2089 *               -f      --force\r
2090 *               -q      --quit\r
2091 *               -s      --set\r
2092 *               -h      --help\r
2093 *               -e      --euc\r
2094 *               -j      --jis\r
2095 *               -a      --ascii\r
2096 *               -b      --binary\r
2097 *               -x      --auto\r
2098 *               -k      --kana\r
2099 *               -u      --eucname\r
2100 *               -i      --jisname\r
2101 *               -n  --ini               (CheckIniFileNameで検索)\r
2102 *                       --saveoff\r
2103 *                       --saveon\r
2104 *               -z      --mpasswd       (CheckMasterPasswordで検索)  2010.01.30 genta 追加\r
2105 *----------------------------------------------------------------------------*/\r
2106 \r
2107 static int AnalyzeComLine(char *Str, int *AutoConnect, int *CmdOption, char *unc, int Max)\r
2108 {\r
2109         int Ret;\r
2110         char Tmp[FMAX_PATH+1];\r
2111 \r
2112         *AutoConnect = -1;\r
2113         *CmdOption = 0;\r
2114 \r
2115         Ret = 0;\r
2116         memset(unc, NUL, Max+1);\r
2117 \r
2118         while((Ret != -1) && ((Str = GetToken(Str, Tmp)) != NULL))\r
2119         {\r
2120                 if(Tmp[0] == '-')\r
2121                 {\r
2122                         _strlwr(Tmp);\r
2123                         if((strcmp(&Tmp[1], "m") == 0) || (strcmp(&Tmp[1], "-mirror") == 0))\r
2124                                 *CmdOption |= OPT_MIRROR;\r
2125                         else if((strcmp(&Tmp[1], "d") == 0) || (strcmp(&Tmp[1], "-mirrordown") == 0))\r
2126                                 *CmdOption |= OPT_MIRRORDOWN;\r
2127                         // 廃止予定\r
2128 //                      else if((strcmp(&Tmp[1], "e") == 0) || (strcmp(&Tmp[1], "-euc") == 0))\r
2129 //                              *CmdOption |= OPT_EUC;\r
2130 //                      else if((strcmp(&Tmp[1], "j") == 0) || (strcmp(&Tmp[1], "-jis") == 0))\r
2131 //                              *CmdOption |= OPT_JIS;\r
2132                         else if((strcmp(&Tmp[1], "eu") == 0) || (strcmp(&Tmp[1], "e") == 0) || (strcmp(&Tmp[1], "-euc") == 0))\r
2133                                 *CmdOption |= OPT_EUC;\r
2134                         else if((strcmp(&Tmp[1], "ji") == 0) || (strcmp(&Tmp[1], "j") == 0) || (strcmp(&Tmp[1], "-jis") == 0))\r
2135                                 *CmdOption |= OPT_JIS;\r
2136                         else if((strcmp(&Tmp[1], "a") == 0) || (strcmp(&Tmp[1], "-ascii") == 0))\r
2137                                 *CmdOption |= OPT_ASCII;\r
2138                         else if((strcmp(&Tmp[1], "b") == 0) || (strcmp(&Tmp[1], "-binary") == 0))\r
2139                                 *CmdOption |= OPT_BINARY;\r
2140                         else if((strcmp(&Tmp[1], "x") == 0) || (strcmp(&Tmp[1], "-auto") == 0))\r
2141                                 *CmdOption |= OPT_AUTO;\r
2142                         else if((strcmp(&Tmp[1], "f") == 0) || (strcmp(&Tmp[1], "-force") == 0))\r
2143                                 *CmdOption |= OPT_FORCE;\r
2144                         else if((strcmp(&Tmp[1], "q") == 0) || (strcmp(&Tmp[1], "-quit") == 0))\r
2145                                 *CmdOption |= OPT_QUIT;\r
2146                         else if((strcmp(&Tmp[1], "k") == 0) || (strcmp(&Tmp[1], "-kana") == 0))\r
2147                                 *CmdOption |= OPT_KANA;\r
2148                         // 廃止予定\r
2149 //                      else if((strcmp(&Tmp[1], "u") == 0) || (strcmp(&Tmp[1], "-eucname") == 0))\r
2150 //                              *CmdOption |= OPT_EUC_NAME;\r
2151 //                      else if((strcmp(&Tmp[1], "i") == 0) || (strcmp(&Tmp[1], "-jisname") == 0))\r
2152 //                              *CmdOption |= OPT_JIS_NAME;\r
2153                         else if((strcmp(&Tmp[1], "eun") == 0) || (strcmp(&Tmp[1], "u") == 0) || (strcmp(&Tmp[1], "-eucname") == 0))\r
2154                                 *CmdOption |= OPT_EUC_NAME;\r
2155                         else if((strcmp(&Tmp[1], "jin") == 0) || (strcmp(&Tmp[1], "i") == 0) || (strcmp(&Tmp[1], "-jisname") == 0))\r
2156                                 *CmdOption |= OPT_JIS_NAME;\r
2157                         else if((strcmp(&Tmp[1], "n") == 0) || (strcmp(&Tmp[1], "-ini") == 0))\r
2158                         {\r
2159                                 if((Str = GetToken(Str, Tmp)) == NULL)\r
2160                                 {\r
2161                                         SetTaskMsg(MSGJPN282);\r
2162                                         Ret = -1;\r
2163                                 }\r
2164                         }\r
2165                         else if(strcmp(&Tmp[1], "-saveoff") == 0)\r
2166                                 *CmdOption |= OPT_SAVEOFF;\r
2167                         else if(strcmp(&Tmp[1], "-saveon") == 0)\r
2168                                 *CmdOption |= OPT_SAVEON;\r
2169                         else if((strcmp(&Tmp[1], "z") == 0) || (strcmp(&Tmp[1], "-mpasswd") == 0))\r
2170                         {       /* 2010.01.30 genta : Add master password option */\r
2171                                 if((Str = GetToken(Str, Tmp)) == NULL)\r
2172                                 {\r
2173                                         SetTaskMsg(MSGJPN299);\r
2174                                         Ret = -1;\r
2175                                 }\r
2176                         }\r
2177                         else if((strcmp(&Tmp[1], "s") == 0) || (strcmp(&Tmp[1], "-set") == 0))\r
2178                         {\r
2179                                 if(Ret == 0)\r
2180                                 {\r
2181                                         if((Str = GetToken(Str, Tmp)) != NULL)\r
2182                                         {\r
2183                                                 if((*AutoConnect = SearchHostName(Tmp)) != -1)\r
2184                                                         Ret = 2;\r
2185                                                 else\r
2186                                                 {\r
2187                                                         SetTaskMsg(MSGJPN177, Tmp);\r
2188                                                         Ret = -1;\r
2189                                                 }\r
2190                                         }\r
2191                                         else\r
2192                                         {\r
2193                                                 SetTaskMsg(MSGJPN178);\r
2194                                                 Ret = -1;\r
2195                                         }\r
2196                                 }\r
2197                                 else\r
2198                                 {\r
2199                                         SetTaskMsg(MSGJPN179);\r
2200                                         Ret = -1;\r
2201                                 }\r
2202                         }\r
2203                         else if((strcmp(&Tmp[1], "h") == 0) || (strcmp(&Tmp[1], "-help") == 0))\r
2204                         {\r
2205                                 hHelpWin = HtmlHelp(NULL, AskHelpFilePath(), HH_HELP_CONTEXT, IDH_HELP_TOPIC_0000024);\r
2206                         }\r
2207                         // プロセス保護\r
2208 #ifdef ENABLE_PROCESS_PROTECTION\r
2209                         else if(strcmp(Tmp, "--restart") == 0)\r
2210                         {\r
2211                         }\r
2212                         else if(strcmp(Tmp, "--protect") == 0)\r
2213                         {\r
2214                         }\r
2215                         else if(strcmp(Tmp, "--protect-high") == 0)\r
2216                         {\r
2217                         }\r
2218                         else if(strcmp(Tmp, "--protect-medium") == 0)\r
2219                         {\r
2220                         }\r
2221                         else if(strcmp(Tmp, "--protect-low") == 0)\r
2222                         {\r
2223                         }\r
2224 #endif\r
2225                         // UTF-8対応\r
2226                         else if((strcmp(&Tmp[1], "sj") == 0) || (strcmp(&Tmp[1], "-sjis") == 0))\r
2227                                 *CmdOption |= OPT_SJIS;\r
2228                         else if((strcmp(&Tmp[1], "u8") == 0) || (strcmp(&Tmp[1], "-utf8") == 0))\r
2229                                 *CmdOption |= OPT_UTF8N;\r
2230                         else if((strcmp(&Tmp[1], "8b") == 0) || (strcmp(&Tmp[1], "-utf8bom") == 0))\r
2231                                 *CmdOption |= OPT_UTF8BOM;\r
2232                         else if((strcmp(&Tmp[1], "sjn") == 0) || (strcmp(&Tmp[1], "-sjisname") == 0))\r
2233                                 *CmdOption |= OPT_SJIS_NAME;\r
2234                         else if((strcmp(&Tmp[1], "u8n") == 0) || (strcmp(&Tmp[1], "-utf8name") == 0))\r
2235                                 *CmdOption |= OPT_UTF8N_NAME;\r
2236                         // ソフトウェア自動更新\r
2237                         else if(strcmp(Tmp, "--software-update") == 0)\r
2238                         {\r
2239                                 if((Str = GetToken(Str, Tmp)) == NULL)\r
2240                                 {\r
2241                                         Ret = -1;\r
2242                                 }\r
2243                         }\r
2244                         else if(strcmp(Tmp, "--software-cleanup") == 0)\r
2245                         {\r
2246                                 if((Str = GetToken(Str, Tmp)) == NULL)\r
2247                                 {\r
2248                                         Ret = -1;\r
2249                                 }\r
2250                         }\r
2251                         else\r
2252                         {\r
2253                                 SetTaskMsg(MSGJPN180, Tmp);\r
2254                                 Ret = -1;\r
2255                         }\r
2256                 }\r
2257                 else\r
2258                 {\r
2259                         if(Ret == 0)\r
2260                         {\r
2261                                 strncpy(unc, Tmp, Max);\r
2262                                 Ret = 1;\r
2263                         }\r
2264                         else\r
2265                         {\r
2266                                 SetTaskMsg(MSGJPN181);\r
2267                                 Ret = -1;\r
2268                         }\r
2269                 }\r
2270         }\r
2271         return(Ret);\r
2272 }\r
2273 \r
2274 \r
2275 /*----- INIファイルのパス名の指定をチェック ------------------------------------\r
2276 *\r
2277 *       Parameter\r
2278 *               char *Str : コマンドライン文字列\r
2279 *               char *Ini : iniファイル名を返すワーク\r
2280 *\r
2281 *       Return Value\r
2282 *               int ステータス\r
2283 *                       0=指定なし、1=あり\r
2284 *\r
2285 *       Note\r
2286 *               -n  --ini\r
2287 *----------------------------------------------------------------------------*/\r
2288 \r
2289 static int CheckIniFileName(char *Str, char *Ini)\r
2290 {\r
2291         return GetTokenAfterOption( Str, Ini, "n", "-ini" );\r
2292 }\r
2293 \r
2294 /* マスターパスワードの指定をチェック */\r
2295 static int CheckMasterPassword(char *Str, char *Ini)\r
2296 {\r
2297         return GetTokenAfterOption( Str, Ini, "z", "-mpasswd" );\r
2298 }\r
2299 \r
2300 /*----- オプションの後ろのトークンを取り出す ------------------------------------\r
2301 *\r
2302 *       Parameter\r
2303 *               char *Str : コマンドライン文字列\r
2304 *               char *Result : 取り出した文字列を格納するワーク\r
2305 *               const char* Opt1, *Opt2: オプション文字列(2つ)\r
2306 *\r
2307 *       Return Value\r
2308 *               int ステータス\r
2309 *                       0=指定なし、1=あり\r
2310 *\r
2311 *       Note\r
2312 *               2010.01.30 genta マスターパスワード取り出しのため共通化\r
2313 *----------------------------------------------------------------------------*/\r
2314 static int GetTokenAfterOption(char *Str, char *Result, const char* Opt1, const char* Opt2 )\r
2315 {\r
2316         int Ret = 0;\r
2317         char Tmp[FMAX_PATH+1];\r
2318 \r
2319         Result[0] = NUL;\r
2320         while((Str = GetToken(Str, Tmp)) != NULL)\r
2321         {\r
2322                 if(Tmp[0] == '-')\r
2323                 {\r
2324                         _strlwr(Tmp);\r
2325                         if((strcmp(&Tmp[1], Opt1) == 0) || (strcmp(&Tmp[1], Opt2) == 0))\r
2326                         {\r
2327                                 if((Str = GetToken(Str, Result)) != NULL)\r
2328                                         Ret = 1;\r
2329                                 break;\r
2330                         }\r
2331                 }\r
2332         }\r
2333         return(Ret);\r
2334 }\r
2335 \r
2336 /*----- トークンを返す --------------------------------------------------------\r
2337 *\r
2338 *       Parameter\r
2339 *               char *Str : 文字列\r
2340 *               char *Buf : 文字列を返すバッファ\r
2341 *\r
2342 *       Return Value\r
2343 *               char *返したトークンの末尾\r
2344 *                       NULL=終わり\r
2345 *----------------------------------------------------------------------------*/\r
2346 \r
2347 static char *GetToken(char *Str, char *Buf)\r
2348 {\r
2349         int InQuote;\r
2350 \r
2351         while(*Str != NUL)\r
2352         {\r
2353                 if((*Str != ' ') && (*Str != '\t'))\r
2354                         break;\r
2355                 Str++;\r
2356         }\r
2357 \r
2358         if(*Str != NUL)\r
2359         {\r
2360                 InQuote = 0;\r
2361                 while(*Str != NUL)\r
2362                 {\r
2363                         if(*Str == 0x22)\r
2364                                 InQuote = !InQuote;\r
2365                         else\r
2366                         {\r
2367                                 if(((*Str == ' ') || (*Str == '\t')) &&\r
2368                                    (InQuote == 0))\r
2369                                 {\r
2370                                         break;\r
2371                                 }\r
2372                                 *Buf++ = *Str;\r
2373                         }\r
2374                         Str++;\r
2375                 }\r
2376         }\r
2377         else\r
2378                 Str = NULL;\r
2379 \r
2380         *Buf = NUL;\r
2381 \r
2382         return(Str);\r
2383 }\r
2384 \r
2385 \r
2386 /*----- プログラム終了時の処理 ------------------------------------------------\r
2387 *\r
2388 *       Parameter\r
2389 *               HWND hWnd : ウインドウハンドル\r
2390 *\r
2391 *       Return Value\r
2392 *               なし\r
2393 *----------------------------------------------------------------------------*/\r
2394 \r
2395 static void ExitProc(HWND hWnd)\r
2396 {\r
2397         // 環境依存の不具合対策\r
2398         char Tmp[FMAX_PATH+1];\r
2399 \r
2400         CancelFlg = YES;\r
2401 \r
2402         CloseTransferThread();\r
2403 \r
2404         if(SaveExit == YES)\r
2405         {\r
2406                 SaveBookMark();\r
2407                 SaveCurrentSetToHost();\r
2408         }\r
2409         DeleteAlltempFile();\r
2410 \r
2411 //      WSACancelBlockingCall();\r
2412         DisconnectProc();\r
2413 //      CloseTransferThread();\r
2414 \r
2415         if(SaveExit == YES)\r
2416         {\r
2417                 GetListTabWidth();\r
2418                 SaveRegistry();\r
2419                 // ポータブル版判定\r
2420                 if(RegType == REGTYPE_REG)\r
2421                         ClearIni();\r
2422 \r
2423                 if((CacheEntry > 0) && (CacheSave == YES))\r
2424                         SaveCache();\r
2425                 else\r
2426                         DeleteCache();\r
2427         }\r
2428         else\r
2429                 DeleteCache();\r
2430 \r
2431         // 環境依存の不具合対策\r
2432         GetAppTempPath(Tmp);\r
2433         SetYenTail(Tmp);\r
2434         strcat(Tmp, "file");\r
2435         _rmdir(Tmp);\r
2436         GetAppTempPath(Tmp);\r
2437         _rmdir(Tmp);\r
2438 \r
2439         if(RasClose == YES)\r
2440         {\r
2441                 DisconnectRas(RasCloseNotify);\r
2442         }\r
2443         DeleteAllObject();\r
2444         HtmlHelp(NULL, NULL, HH_UNINITIALIZE, dwCookie); \r
2445         return;\r
2446 }\r
2447 \r
2448 \r
2449 /*----- ファイル名をダブルクリックしたときの処理 ------------------------------\r
2450 *\r
2451 *       Parameter\r
2452 *               int Win : ウインドウ番号 (WIN_xxx)\r
2453 *               int Mode : 常に「開く」動作をするかどうか (YES/NO)\r
2454 *               int App : アプリケーション番号(-1=関連づけ優先)\r
2455 *\r
2456 *       Return Value\r
2457 *               なし\r
2458 *----------------------------------------------------------------------------*/\r
2459 \r
2460 void DoubleClickProc(int Win, int Mode, int App)\r
2461 {\r
2462         int Pos;\r
2463         int Type;\r
2464         char Local[FMAX_PATH+1];\r
2465         char Remote[FMAX_PATH+1];\r
2466         char Tmp[FMAX_PATH+1];\r
2467         int Sts;\r
2468         int UseDiffViewer;\r
2469 \r
2470         if(AskUserOpeDisabled() == NO)\r
2471         {\r
2472                 SetCurrentDirAsDirHist();\r
2473                 if(GetSelectedCount(Win) == 1)\r
2474                 {\r
2475                         if((Pos = GetFirstSelected(Win, NO)) != -1)\r
2476                         {\r
2477                                 GetNodeName(Win, Pos, Tmp, FMAX_PATH);\r
2478                                 Type = GetNodeType(Win, Pos);\r
2479 \r
2480                                 if(Win == WIN_LOCAL)\r
2481                                 {\r
2482                                         // ローカルフォルダを開く\r
2483 //                                      if((App != -1) || (Type == NODE_FILE))\r
2484                                         if((App != -1) || (Type == NODE_FILE) || (Mode == YES))\r
2485                                         {\r
2486                                                 if((DclickOpen == YES) || (Mode == YES))\r
2487                                                 {\r
2488                                                         AskLocalCurDir(Local, FMAX_PATH);\r
2489                                                         ReplaceAll(Local, '/', '\\');\r
2490                                                         SetYenTail(Local);\r
2491                                                         strcat(Local, Tmp);\r
2492                                                         ExecViewer(Local, App);\r
2493                                                 }\r
2494                                                 else\r
2495                                                         PostMessage(hWndFtp, WM_COMMAND, MAKEWPARAM(MENU_UPLOAD, 0), 0);\r
2496                                         }\r
2497                                         else\r
2498                                                 ChangeDir(WIN_LOCAL, Tmp);\r
2499                                 }\r
2500                                 else if(CheckClosedAndReconnect() == FFFTP_SUCCESS)\r
2501                                 {\r
2502                                         if((App != -1) || (Type == NODE_FILE))\r
2503                                         {\r
2504                                                 if((DclickOpen == YES) || (Mode == YES))\r
2505                                                 {\r
2506                                                         // ビューワ2、3のパスが "d " で始まっていたら差分ビューア使用\r
2507                                                         if ((App == 1 || App == 2) && strncmp(ViewerName[App], "d ", 2) == 0)\r
2508                                                                 UseDiffViewer = YES;\r
2509                                                         else\r
2510                                                                 UseDiffViewer = NO;\r
2511 \r
2512                                                         strcpy(Remote, TmpPath);\r
2513                                                         SetYenTail(Remote);\r
2514                                                         // 環境依存の不具合対策\r
2515                                                         strcat(Remote, "file");\r
2516                                                         _mkdir(Remote);\r
2517                                                         SetYenTail(Remote);\r
2518                                                         if (UseDiffViewer == YES) {\r
2519                                                                 strcat(Remote, "remote.");\r
2520                                                         }\r
2521                                                         strcat(Remote, Tmp);\r
2522 \r
2523                                                         if(AskTransferNow() == YES)\r
2524                                                                 SktShareProh();\r
2525 \r
2526         //                                              MainTransPkt.ctrl_skt = AskCmdCtrlSkt();\r
2527                                                         strcpy(MainTransPkt.Cmd, "RETR ");\r
2528                                                         if(AskHostType() == HTYPE_ACOS)\r
2529                                                         {\r
2530                                                                 strcpy(MainTransPkt.RemoteFile, "'");\r
2531                                                                 strcat(MainTransPkt.RemoteFile, AskHostLsName());\r
2532                                                                 strcat(MainTransPkt.RemoteFile, "(");\r
2533                                                                 strcat(MainTransPkt.RemoteFile, Tmp);\r
2534                                                                 strcat(MainTransPkt.RemoteFile, ")");\r
2535                                                                 strcat(MainTransPkt.RemoteFile, "'");\r
2536                                                         }\r
2537                                                         else if(AskHostType() == HTYPE_ACOS_4)\r
2538                                                         {\r
2539                                                                 strcpy(MainTransPkt.RemoteFile, Tmp);\r
2540                                                         }\r
2541                                                         else\r
2542                                                         {\r
2543                                                                 strcpy(MainTransPkt.RemoteFile, Tmp);\r
2544                                                         }\r
2545                                                         strcpy(MainTransPkt.LocalFile, Remote);\r
2546                                                         MainTransPkt.Type = AskTransferTypeAssoc(MainTransPkt.RemoteFile, AskTransferType());\r
2547                                                         MainTransPkt.Size = 1;\r
2548                                                         MainTransPkt.KanjiCode = AskHostKanjiCode();\r
2549                                                         MainTransPkt.KanjiCodeDesired = AskLocalKanjiCode();\r
2550                                                         MainTransPkt.KanaCnv = AskHostKanaCnv();\r
2551                                                         MainTransPkt.Mode = EXIST_OVW;\r
2552                                                         MainTransPkt.ExistSize = 0;\r
2553                                                         MainTransPkt.hWndTrans = NULL;\r
2554                                                         MainTransPkt.Next = NULL;\r
2555 \r
2556                                                         DisableUserOpe();\r
2557 \r
2558                                                         /* 不正なパスを検出 */\r
2559                                                         if(CheckPathViolation(&MainTransPkt) == NO)\r
2560                                                         {\r
2561 //                                                              if((Sts = DoDownload(AskCmdCtrlSkt(), &MainTransPkt, NO)) == 429)\r
2562 //                                                              {\r
2563 //                                                                      ReConnectCmdSkt();\r
2564                                                                         // 同時接続対応\r
2565                                                                         CancelFlg = NO;\r
2566                                                                         Sts = DoDownload(AskCmdCtrlSkt(), &MainTransPkt, NO, &CancelFlg);\r
2567 //                                                              }\r
2568                                                         }\r
2569 \r
2570                                                         EnableUserOpe();\r
2571 \r
2572                                                         AddTempFileList(Remote);\r
2573                                                         if(Sts/100 == FTP_COMPLETE) {\r
2574                                                                 if (UseDiffViewer == YES) {\r
2575                                                                         AskLocalCurDir(Local, FMAX_PATH);\r
2576                                                                         ReplaceAll(Local, '/', '\\');\r
2577                                                                         SetYenTail(Local);\r
2578                                                                         strcat(Local, Tmp);\r
2579                                                                         ExecViewer2(Local, Remote, App);\r
2580                                                                 } else {\r
2581                                                                         ExecViewer(Remote, App);\r
2582                                                                 }\r
2583                                                         }\r
2584                                                 }\r
2585                                                 else\r
2586                                                         PostMessage(hWndFtp, WM_COMMAND, MAKEWPARAM(MENU_DOWNLOAD, 0), 0);\r
2587                                         }\r
2588                                         else\r
2589                                                 ChangeDir(WIN_REMOTE, Tmp);\r
2590                                 }\r
2591                         }\r
2592                 }\r
2593                 MakeButtonsFocus();\r
2594         }\r
2595         return;\r
2596 }\r
2597 \r
2598 \r
2599 /*----- フォルダの移動 --------------------------------------------------------\r
2600 *\r
2601 *       Parameter\r
2602 *               int Win : ウインドウ番号 (WIN_xxx)\r
2603 *               char *Path : 移動先のパス名\r
2604 *\r
2605 *       Return Value\r
2606 *               なし\r
2607 *\r
2608 *       Note\r
2609 *               フォルダ同時移動の処理も行う\r
2610 *----------------------------------------------------------------------------*/\r
2611 \r
2612 static void ChangeDir(int Win, char *Path)\r
2613 {\r
2614         int Sync;\r
2615         char Local[FMAX_PATH+1];\r
2616         char Remote[FMAX_PATH+1];\r
2617 \r
2618         // 同時接続対応\r
2619         CancelFlg = NO;\r
2620 \r
2621         // デッドロック対策\r
2622         DisableUserOpe();\r
2623         Sync = AskSyncMoveMode();\r
2624         if(Sync == YES)\r
2625         {\r
2626                 if(strcmp(Path, "..") == 0)\r
2627                 {\r
2628                         AskLocalCurDir(Local, FMAX_PATH);\r
2629                         AskRemoteCurDir(Remote, FMAX_PATH);\r
2630                         if(strcmp(GetFileName(Local), GetFileName(Remote)) != 0)\r
2631                                 Sync = NO;\r
2632                 }\r
2633         }\r
2634 \r
2635         if((Win == WIN_LOCAL) || (Sync == YES))\r
2636         {\r
2637                 if(DoLocalCWD(Path) == FFFTP_SUCCESS)\r
2638                         GetLocalDirForWnd();\r
2639         }\r
2640 \r
2641         if((Win == WIN_REMOTE) || (Sync == YES))\r
2642         {\r
2643                 if(CheckClosedAndReconnect() == FFFTP_SUCCESS)\r
2644                 {\r
2645 #if defined(HAVE_OPENVMS)\r
2646                         /* OpenVMSの場合、".DIR;?"を取る */\r
2647                         if (AskHostType() == HTYPE_VMS)\r
2648                                 ReformVMSDirName(Path, TRUE);\r
2649 #endif\r
2650                         if(DoCWD(Path, YES, NO, YES) < FTP_RETRY)\r
2651                                 GetRemoteDirForWnd(CACHE_NORMAL, &CancelFlg);\r
2652                 }\r
2653         }\r
2654         // デッドロック対策\r
2655         EnableUserOpe();\r
2656         return;\r
2657 }\r
2658 \r
2659 \r
2660 /*----- ウインドウのサイズ変更の処理 ------------------------------------------\r
2661 *\r
2662 *       Parameter\r
2663 *               なし\r
2664 *\r
2665 *       Return Value\r
2666 *               なし\r
2667 *----------------------------------------------------------------------------*/\r
2668 \r
2669 static void ResizeWindowProc(void)\r
2670 {\r
2671 #if 0\r
2672         RECT Rect;\r
2673         int RemotePosX;\r
2674 \r
2675         GetClientRect(hWndFtp, &Rect);\r
2676         SendMessage(GetSbarWnd(), WM_SIZE, SIZE_RESTORED, MAKELPARAM(Rect.right, Rect.bottom));\r
2677 \r
2678         CalcWinSize();\r
2679         SetWindowPos(GetMainTbarWnd(), 0, 0, 0, WinWidth, TOOLWIN_HEIGHT, SWP_NOACTIVATE | SWP_NOZORDER);\r
2680 \r
2681         SetWindowPos(GetLocalTbarWnd(), 0, 0, TOOLWIN_HEIGHT, LocalWidth, TOOLWIN_HEIGHT, SWP_NOACTIVATE | SWP_NOZORDER);\r
2682         SendMessage(GetLocalTbarWnd(), TB_GETITEMRECT, 3, (LPARAM)&Rect);\r
2683         SetWindowPos(GetLocalHistHwnd(), 0, Rect.right, Rect.top, LocalWidth - Rect.right, 200, SWP_NOACTIVATE | SWP_NOZORDER);\r
2684         SetWindowPos(GetLocalHwnd(), 0, 0, TOOLWIN_HEIGHT*2, LocalWidth, ListHeight, SWP_NOACTIVATE | SWP_NOZORDER);\r
2685 \r
2686         RemotePosX = LocalWidth + SepaWidth;\r
2687         if(SplitVertical == YES)\r
2688                 RemotePosX = 0;\r
2689 \r
2690         SetWindowPos(GetRemoteTbarWnd(), 0, RemotePosX, TOOLWIN_HEIGHT, RemoteWidth, TOOLWIN_HEIGHT, SWP_NOACTIVATE | SWP_NOZORDER);\r
2691         SendMessage(GetRemoteTbarWnd(), TB_GETITEMRECT, 3, (LPARAM)&Rect);\r
2692         SetWindowPos(GetRemoteHistHwnd(), 0, Rect.right, Rect.top, RemoteWidth - Rect.right, 200, SWP_NOACTIVATE | SWP_NOZORDER);\r
2693         SetWindowPos(GetRemoteHwnd(), 0, RemotePosX, TOOLWIN_HEIGHT*2, RemoteWidth, ListHeight, SWP_NOACTIVATE | SWP_NOZORDER);\r
2694 \r
2695         SetWindowPos(GetTaskWnd(), 0, 0, TOOLWIN_HEIGHT*2+ListHeight+SepaWidth, ClientWidth, TaskHeight, SWP_NOACTIVATE | SWP_NOZORDER);\r
2696 #else\r
2697         RECT Rect;\r
2698 \r
2699         GetClientRect(hWndFtp, &Rect);\r
2700         SendMessage(GetSbarWnd(), WM_SIZE, SIZE_RESTORED, MAKELPARAM(Rect.right, Rect.bottom));\r
2701 \r
2702         CalcWinSize();\r
2703         // 高DPI対応\r
2704 //      SetWindowPos(GetMainTbarWnd(), 0, 0, 0, Rect.right, TOOLWIN_HEIGHT, SWP_NOACTIVATE | SWP_NOZORDER);\r
2705 //      SetWindowPos(GetLocalTbarWnd(), 0, 0, TOOLWIN_HEIGHT, LocalWidth, TOOLWIN_HEIGHT, SWP_NOACTIVATE | SWP_NOZORDER);\r
2706 //      SetWindowPos(GetRemoteTbarWnd(), 0, LocalWidth + SepaWidth, TOOLWIN_HEIGHT, RemoteWidth, TOOLWIN_HEIGHT, SWP_NOACTIVATE | SWP_NOZORDER);\r
2707         SetWindowPos(GetMainTbarWnd(), 0, 0, 0, Rect.right, AskToolWinHeight(), SWP_NOACTIVATE | SWP_NOZORDER);\r
2708         SetWindowPos(GetLocalTbarWnd(), 0, 0, AskToolWinHeight(), LocalWidth, AskToolWinHeight(), SWP_NOACTIVATE | SWP_NOZORDER);\r
2709         SetWindowPos(GetRemoteTbarWnd(), 0, LocalWidth + SepaWidth, AskToolWinHeight(), RemoteWidth, AskToolWinHeight(), SWP_NOACTIVATE | SWP_NOZORDER);\r
2710         SendMessage(GetLocalTbarWnd(), TB_GETITEMRECT, 3, (LPARAM)&Rect);\r
2711         SetWindowPos(GetLocalHistHwnd(), 0, Rect.right, Rect.top, LocalWidth - Rect.right, 200, SWP_NOACTIVATE | SWP_NOZORDER);\r
2712         SendMessage(GetRemoteTbarWnd(), TB_GETITEMRECT, 3, (LPARAM)&Rect);\r
2713         SetWindowPos(GetRemoteHistHwnd(), 0, Rect.right, Rect.top, RemoteWidth - Rect.right, 200, SWP_NOACTIVATE | SWP_NOZORDER);\r
2714         // 高DPI対応\r
2715 //      SetWindowPos(GetLocalHwnd(), 0, 0, TOOLWIN_HEIGHT*2, LocalWidth, ListHeight, SWP_NOACTIVATE | SWP_NOZORDER);\r
2716 //      SetWindowPos(GetRemoteHwnd(), 0, LocalWidth + SepaWidth, TOOLWIN_HEIGHT*2, RemoteWidth, ListHeight, SWP_NOACTIVATE | SWP_NOZORDER);\r
2717 //      SetWindowPos(GetTaskWnd(), 0, 0, TOOLWIN_HEIGHT*2+ListHeight+SepaWidth, ClientWidth, TaskHeight, SWP_NOACTIVATE | SWP_NOZORDER);\r
2718         SetWindowPos(GetLocalHwnd(), 0, 0, AskToolWinHeight()*2, LocalWidth, ListHeight, SWP_NOACTIVATE | SWP_NOZORDER);\r
2719         SetWindowPos(GetRemoteHwnd(), 0, LocalWidth + SepaWidth, AskToolWinHeight()*2, RemoteWidth, ListHeight, SWP_NOACTIVATE | SWP_NOZORDER);\r
2720         SetWindowPos(GetTaskWnd(), 0, 0, AskToolWinHeight()*2+ListHeight+SepaWidth, ClientWidth, TaskHeight, SWP_NOACTIVATE | SWP_NOZORDER);\r
2721 #endif\r
2722 \r
2723         return;\r
2724 }\r
2725 \r
2726 \r
2727 /*----- ウインドウの各部分のサイズを計算する ----------------------------------\r
2728 *\r
2729 *       Parameter\r
2730 *               なし\r
2731 *\r
2732 *       Return Value\r
2733 *               なし\r
2734 *----------------------------------------------------------------------------*/\r
2735 \r
2736 static void CalcWinSize(void)\r
2737 {\r
2738         RECT Rect;\r
2739 \r
2740         GetWindowRect(hWndFtp, &Rect);\r
2741 \r
2742         if(Sizing != SW_MAXIMIZE)\r
2743         {\r
2744                 WinWidth = Rect.right - Rect.left;\r
2745                 WinHeight = Rect.bottom - Rect.top;\r
2746         }\r
2747 \r
2748         GetClientRect(hWndFtp, &Rect);\r
2749 \r
2750         ClientWidth = Rect.right;\r
2751         ClientHeight = Rect.bottom;\r
2752 \r
2753         SepaWidth = 4;\r
2754         LocalWidth = max1(0, min1(LocalWidth, ClientWidth - SepaWidth));\r
2755         RemoteWidth = max1(0, ClientWidth - LocalWidth - SepaWidth);\r
2756 //      TaskHeight = min1(TaskHeight, max1(0, ClientHeight - TOOLWIN_HEIGHT * 2 - SepaWidth));\r
2757 \r
2758         GetClientRect(GetSbarWnd(), &Rect);\r
2759 \r
2760         // 高DPI対応\r
2761 //      ListHeight = max1(0, ClientHeight - TOOLWIN_HEIGHT * 2 - TaskHeight - SepaWidth - Rect.bottom);\r
2762         ListHeight = max1(0, ClientHeight - AskToolWinHeight() * 2 - TaskHeight - SepaWidth - Rect.bottom);\r
2763 \r
2764         return;\r
2765 }\r
2766 \r
2767 \r
2768 #if 0\r
2769 /*----- ウインドウの表示位置を取得する ----------------------------------------\r
2770 *\r
2771 *       Parameter\r
2772 *               HWND hWnd : ウインドウハンドル\r
2773 *\r
2774 *       Return Value\r
2775 *               なし\r
2776 *----------------------------------------------------------------------------*/\r
2777 \r
2778 static void AskWindowPos(HWND hWnd)\r
2779 {\r
2780         WINDOWPLACEMENT WinPlace;\r
2781 \r
2782         WinPlace.length = sizeof(WINDOWPLACEMENT);\r
2783         GetWindowPlacement(hWnd, &WinPlace);\r
2784         WinPosX = WinPlace.rcNormalPosition.left;\r
2785         WinPosY = WinPlace.rcNormalPosition.top;\r
2786 \r
2787         return;\r
2788 }\r
2789 #endif\r
2790 \r
2791 \r
2792 /*----- ディレクトリリストとファイルリストの境界変更処理 ----------------------\r
2793 *\r
2794 *       Parameter\r
2795 *               WPARAM Keys : WM_MOUSEMOVEなどのWPARAMの値\r
2796 *               int x : マウスカーソルのX座標\r
2797 *               int y : マウスカーソルのY座標\r
2798 *\r
2799 *       Return Value\r
2800 *               なし\r
2801 *----------------------------------------------------------------------------*/\r
2802 \r
2803 static void CheckResizeFrame(WPARAM Keys, int x, int y)\r
2804 {\r
2805         RECT Rect;\r
2806         RECT Rect1;\r
2807 \r
2808         if((Resizing == RESIZE_OFF) && (Keys == 0))\r
2809         {\r
2810                 // 高DPI対応\r
2811 //              if((x >= LocalWidth) && (x <= LocalWidth + SepaWidth) &&\r
2812 //                 (y > TOOLWIN_HEIGHT) && (y < (TOOLWIN_HEIGHT * 2 + ListHeight)))\r
2813                 if((x >= LocalWidth) && (x <= LocalWidth + SepaWidth) &&\r
2814                    (y > AskToolWinHeight()) && (y < (AskToolWinHeight() * 2 + ListHeight)))\r
2815                 {\r
2816                         /* 境界位置変更用カーソルに変更 */\r
2817                         SetCapture(hWndFtp);\r
2818                         hCursor = LoadCursor(hInstFtp, MAKEINTRESOURCE(resize_lr_csr));\r
2819                         SetCursor(hCursor);\r
2820                         Resizing = RESIZE_PREPARE;\r
2821                         ResizePos = RESIZE_HPOS;\r
2822                 }\r
2823                 // 高DPI対応\r
2824 //              else if((y >= TOOLWIN_HEIGHT*2+ListHeight) && (y <= TOOLWIN_HEIGHT*2+ListHeight+SepaWidth))\r
2825                 else if((y >= AskToolWinHeight()*2+ListHeight) && (y <= AskToolWinHeight()*2+ListHeight+SepaWidth))\r
2826                 {\r
2827                         /* 境界位置変更用カーソルに変更 */\r
2828                         SetCapture(hWndFtp);\r
2829                         hCursor = LoadCursor(hInstFtp, MAKEINTRESOURCE(resize_ud_csr));\r
2830                         SetCursor(hCursor);\r
2831                         Resizing = RESIZE_PREPARE;\r
2832                         ResizePos = RESIZE_VPOS;\r
2833                 }\r
2834         }\r
2835         else if(Resizing == RESIZE_PREPARE)\r
2836         {\r
2837                 if(Keys & MK_LBUTTON)\r
2838                 {\r
2839                         /* 境界位置変更開始 */\r
2840                         Resizing = RESIZE_ON;\r
2841                         GetWindowRect(hWndFtp, &Rect);\r
2842                         GetClientRect(GetSbarWnd(), &Rect1);\r
2843                         Rect.left += GetSystemMetrics(SM_CXFRAME);\r
2844                         Rect.right -= GetSystemMetrics(SM_CXFRAME);\r
2845                         // 高DPI対応\r
2846 //                      Rect.top += TOOLWIN_HEIGHT*2 + GetSystemMetrics(SM_CYMENU) + GetSystemMetrics(SM_CYCAPTION) + GetSystemMetrics(SM_CYFRAME);\r
2847                         Rect.top += AskToolWinHeight()*2 + GetSystemMetrics(SM_CYMENU) + GetSystemMetrics(SM_CYCAPTION) + GetSystemMetrics(SM_CYFRAME);\r
2848                         Rect.bottom -= GetSystemMetrics(SM_CYFRAME) + Rect1.bottom;\r
2849                         ClipCursor(&Rect);\r
2850                 }\r
2851                 else\r
2852                 {\r
2853                         // 高DPI対応\r
2854 //                      if(((ResizePos == RESIZE_HPOS) &&\r
2855 //                              ((x < LocalWidth) || (x > LocalWidth + SepaWidth) ||\r
2856 //                               (y <= TOOLWIN_HEIGHT) || (y >= (TOOLWIN_HEIGHT * 2 + ListHeight)))) ||\r
2857 //                         ((ResizePos == RESIZE_VPOS) &&\r
2858 //                              ((y < TOOLWIN_HEIGHT*2+ListHeight) || (y > TOOLWIN_HEIGHT*2+ListHeight+SepaWidth))))\r
2859                         if(((ResizePos == RESIZE_HPOS) &&\r
2860                                 ((x < LocalWidth) || (x > LocalWidth + SepaWidth) ||\r
2861                                  (y <= AskToolWinHeight()) || (y >= (AskToolWinHeight() * 2 + ListHeight)))) ||\r
2862                            ((ResizePos == RESIZE_VPOS) &&\r
2863                                 ((y < AskToolWinHeight()*2+ListHeight) || (y > AskToolWinHeight()*2+ListHeight+SepaWidth))))\r
2864                         {\r
2865                                 /* 元のカーソルに戻す */\r
2866                                 ReleaseCapture();\r
2867                                 hCursor = LoadCursor(NULL, IDC_ARROW);\r
2868                                 SetCursor(hCursor);\r
2869                                 Resizing = RESIZE_OFF;\r
2870                         }\r
2871                 }\r
2872         }\r
2873         else if(Resizing == RESIZE_ON)\r
2874         {\r
2875                 if(ResizePos == RESIZE_HPOS)\r
2876                         LocalWidth = x;\r
2877                 else\r
2878                 {\r
2879                         GetClientRect(hWndFtp, &Rect);\r
2880                         GetClientRect(GetSbarWnd(), &Rect1);\r
2881                         TaskHeight = max1(0, Rect.bottom - y - Rect1.bottom);\r
2882                 }\r
2883                 ResizeWindowProc();\r
2884 \r
2885                 if((Keys & MK_LBUTTON) == 0)\r
2886                 {\r
2887                         /* 境界位置変更終了 */\r
2888                         ReleaseCapture();\r
2889                         ClipCursor(NULL);\r
2890                         hCursor = LoadCursor(NULL, IDC_ARROW);\r
2891                         SetCursor(hCursor);\r
2892                         Resizing = RESIZE_OFF;\r
2893                 }\r
2894         }\r
2895         return;\r
2896 }\r
2897 \r
2898 \r
2899 /*----- ファイル一覧情報をビューワで表示 --------------------------------------\r
2900 *\r
2901 *       Parameter\r
2902 *               なし\r
2903 *\r
2904 *       Return Value\r
2905 *               なし\r
2906 *----------------------------------------------------------------------------*/\r
2907 \r
2908 static void DispDirInfo(void)\r
2909 {\r
2910         char Buf[FMAX_PATH+1];\r
2911 \r
2912         MakeCacheFileName(AskCurrentFileListNum(), Buf);\r
2913         ExecViewer(Buf, 0);\r
2914         return;\r
2915 }\r
2916 \r
2917 \r
2918 \r
2919 /*----- ビューワを起動 --------------------------------------------------------\r
2920 *\r
2921 *       Parameter\r
2922 *               char Fname : ファイル名\r
2923 *               int App : アプリケーション番号(-1=関連づけ優先)\r
2924 *\r
2925 *       Return Value\r
2926 *               なし\r
2927 *----------------------------------------------------------------------------*/\r
2928 \r
2929 void ExecViewer(char *Fname, int App)\r
2930 {\r
2931         PROCESS_INFORMATION Info;\r
2932         STARTUPINFO Startup;\r
2933         char AssocProg[FMAX_PATH+1];\r
2934         char ComLine[FMAX_PATH*2+3+1];\r
2935         char CurDir[FMAX_PATH+1];\r
2936         // 任意のコードが実行されるバグ修正\r
2937         char SysDir[FMAX_PATH+1];\r
2938 \r
2939         /* FindExecutable()は関連付けられたプログラムのパス名にスペースが        */\r
2940         /* 含まれている時、間違ったパス名を返す事がある。                                        */\r
2941         /* そこで、関連付けられたプログラムの起動はShellExecute()を使う。       */\r
2942 \r
2943         AskLocalCurDir(CurDir, FMAX_PATH);\r
2944 \r
2945         // 任意のコードが実行されるバグ修正\r
2946         // 拡張子が無いと補完されるため\r
2947 //      if((App == -1) && (FindExecutable(Fname, NULL, AssocProg) > (HINSTANCE)32))\r
2948         if((App == -1) && (strlen(GetFileExt(GetFileName(Fname))) > 0) && (FindExecutable(Fname, NULL, AssocProg) > (HINSTANCE)32))\r
2949         {\r
2950                 DoPrintf("ShellExecute - %s", Fname);\r
2951                 ShellExecute(NULL, "open", Fname, NULL, CurDir, SW_SHOW);\r
2952         }\r
2953         // ローカルフォルダを開く\r
2954         else if((App == -1) && (GetFileAttributes(Fname) & FILE_ATTRIBUTE_DIRECTORY))\r
2955         {\r
2956                 MakeDistinguishableFileName(ComLine, Fname);\r
2957                 DoPrintf("ShellExecute - %s", Fname);\r
2958                 ShellExecute(NULL, "open", ComLine, NULL, Fname, SW_SHOW);\r
2959         }\r
2960         else\r
2961         {\r
2962                 App = max1(0, App);\r
2963                 strcpy(AssocProg, ViewerName[App]);\r
2964 \r
2965                 if(strchr(Fname, ' ') == NULL)\r
2966                         sprintf(ComLine, "%s %s", AssocProg, Fname);\r
2967                 else\r
2968                         sprintf(ComLine, "%s \"%s\"", AssocProg, Fname);\r
2969 \r
2970                 DoPrintf("FindExecutable - %s", ComLine);\r
2971 \r
2972                 memset(&Startup, NUL, sizeof(STARTUPINFO));\r
2973                 Startup.cb = sizeof(STARTUPINFO);\r
2974                 Startup.wShowWindow = SW_SHOW;\r
2975                 // 任意のコードが実行されるバグ修正\r
2976 //              if(CreateProcess(NULL, ComLine, NULL, NULL, FALSE, 0, NULL, NULL, &Startup, &Info) == FALSE)\r
2977 //              {\r
2978 //                      SetTaskMsg(MSGJPN182, GetLastError());\r
2979 //                      SetTaskMsg(">>%s", ComLine);\r
2980 //              }\r
2981                 if(GetCurrentDirectory(FMAX_PATH, CurDir) > 0)\r
2982                 {\r
2983                         if(GetSystemDirectory(SysDir, FMAX_PATH) > 0)\r
2984                         {\r
2985                                 if(SetCurrentDirectory(SysDir))\r
2986                                 {\r
2987                                         if(CreateProcess(NULL, ComLine, NULL, NULL, FALSE, 0, NULL, NULL, &Startup, &Info) == FALSE)\r
2988                                         {\r
2989                                                 SetTaskMsg(MSGJPN182, GetLastError());\r
2990                                                 SetTaskMsg(">>%s", ComLine);\r
2991                                         }\r
2992                                         SetCurrentDirectory(CurDir);\r
2993                                 }\r
2994                         }\r
2995                 }\r
2996         }\r
2997         return;\r
2998 }\r
2999 \r
3000 \r
3001 /*----- 差分表示ビューワを起動 ------------------------------------------------\r
3002 *\r
3003 *       Parameter\r
3004 *               char Fname1 : ファイル名\r
3005 *               char Fname2 : ファイル名2\r
3006 *               int App : アプリケーション番号(2 or 3)\r
3007 *\r
3008 *       Return Value\r
3009 *               なし\r
3010 *----------------------------------------------------------------------------*/\r
3011 \r
3012 void ExecViewer2(char *Fname1, char *Fname2, int App)\r
3013 {\r
3014         PROCESS_INFORMATION Info;\r
3015         STARTUPINFO Startup;\r
3016         char AssocProg[FMAX_PATH+1];\r
3017         char ComLine[FMAX_PATH*2+3+1];\r
3018         char CurDir[FMAX_PATH+1];\r
3019         // 任意のコードが実行されるバグ修正\r
3020         char SysDir[FMAX_PATH+1];\r
3021 \r
3022         /* FindExecutable()は関連付けられたプログラムのパス名にスペースが        */\r
3023         /* 含まれている時、間違ったパス名を返す事がある。                                        */\r
3024         /* そこで、関連付けられたプログラムの起動はShellExecute()を使う。       */\r
3025 \r
3026         AskLocalCurDir(CurDir, FMAX_PATH);\r
3027 \r
3028         strcpy(AssocProg, ViewerName[App] + 2); /* 先頭の "d " は読み飛ばす */\r
3029 \r
3030         if(strchr(Fname1, ' ') == NULL && strchr(Fname2, ' ') == NULL)\r
3031                 sprintf(ComLine, "%s %s %s", AssocProg, Fname1, Fname2);\r
3032         else\r
3033                 sprintf(ComLine, "%s \"%s\" \"%s\"", AssocProg, Fname1, Fname2);\r
3034 \r
3035         DoPrintf("FindExecutable - %s", ComLine);\r
3036 \r
3037         memset(&Startup, NUL, sizeof(STARTUPINFO));\r
3038         Startup.cb = sizeof(STARTUPINFO);\r
3039         Startup.wShowWindow = SW_SHOW;\r
3040         // 任意のコードが実行されるバグ修正\r
3041 //      if(CreateProcess(NULL, ComLine, NULL, NULL, FALSE, 0, NULL, NULL, &Startup, &Info) == FALSE)\r
3042 //      {\r
3043 //              SetTaskMsg(MSGJPN182, GetLastError());\r
3044 //              SetTaskMsg(">>%s", ComLine);\r
3045 //      }\r
3046         if(GetCurrentDirectory(FMAX_PATH, CurDir) > 0)\r
3047         {\r
3048                 if(GetSystemDirectory(SysDir, FMAX_PATH) > 0)\r
3049                 {\r
3050                         if(SetCurrentDirectory(SysDir))\r
3051                         {\r
3052                                 if(CreateProcess(NULL, ComLine, NULL, NULL, FALSE, 0, NULL, NULL, &Startup, &Info) == FALSE)\r
3053                                 {\r
3054                                         SetTaskMsg(MSGJPN182, GetLastError());\r
3055                                         SetTaskMsg(">>%s", ComLine);\r
3056                                 }\r
3057                                 SetCurrentDirectory(CurDir);\r
3058                         }\r
3059                 }\r
3060         }\r
3061 \r
3062         return;\r
3063 }\r
3064 \r
3065 \r
3066 /*----- テンポラリファイル名をテンポラリファイルリストに追加 ------------------\r
3067 *\r
3068 *       Parameter\r
3069 *               char *Fname : テンポラリファイル名\r
3070 *\r
3071 *       Return Value\r
3072 *               なし\r
3073 *----------------------------------------------------------------------------*/\r
3074 \r
3075 void AddTempFileList(char *Fname)\r
3076 {\r
3077         TEMPFILELIST *New;\r
3078 \r
3079         if((New = malloc(sizeof(TEMPFILELIST))) != NULL)\r
3080         {\r
3081                 if((New->Fname = malloc(strlen(Fname)+1)) != NULL)\r
3082                 {\r
3083                         strcpy(New->Fname, Fname);\r
3084                         if(TempFiles == NULL)\r
3085                                 New->Next = NULL;\r
3086                         else\r
3087                                 New->Next = TempFiles;\r
3088                         TempFiles = New;\r
3089                 }\r
3090                 else\r
3091                         free(New);\r
3092         }\r
3093         return;\r
3094 }\r
3095 \r
3096 \r
3097 /*----- テンポラリファイルリストに登録されているファイルを全て削除 ------------\r
3098 *\r
3099 *       Parameter\r
3100 *               なし\r
3101 *\r
3102 *       Return Value\r
3103 *               なし\r
3104 *----------------------------------------------------------------------------*/\r
3105 \r
3106 static void DeleteAlltempFile(void)\r
3107 {\r
3108         TEMPFILELIST *Pos;\r
3109         TEMPFILELIST *Next;\r
3110 \r
3111         Pos = TempFiles;\r
3112         while(Pos != NULL)\r
3113         {\r
3114                 DeleteFile(Pos->Fname);\r
3115 \r
3116                 Next = Pos->Next;\r
3117                 free(Pos->Fname);\r
3118                 free(Pos);\r
3119                 Pos = Next;\r
3120         }\r
3121 \r
3122         // OLE D&Dのテンポラリを削除する (2007.9.11 yutaka)\r
3123         doDeleteRemoteFile();\r
3124 \r
3125         return;\r
3126 }\r
3127 \r
3128 \r
3129 /*----- Aboutダイアログボックスのコールバック関数 ------------------------\r
3130 *\r
3131 *       Parameter\r
3132 *               HWND hDlg : ウインドウハンドル\r
3133 *               UINT message : メッセージ番号\r
3134 *               WPARAM wParam : メッセージの WPARAM 引数\r
3135 *               LPARAM lParam : メッセージの LPARAM 引数\r
3136 *\r
3137 *       Return Value\r
3138 *               BOOL TRUE/FALSE\r
3139 *----------------------------------------------------------------------------*/\r
3140 \r
3141 // 64ビット対応\r
3142 //static BOOL CALLBACK AboutDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)\r
3143 static INT_PTR CALLBACK AboutDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)\r
3144 {\r
3145         static char Tmp[80];\r
3146         int Ver;\r
3147 \r
3148         switch (message)\r
3149         {\r
3150                 case WM_INITDIALOG :\r
3151                         Ver = GetJreVersion();\r
3152                         if(Ver == -1)\r
3153                                 sprintf(Tmp, MSGJPN183);\r
3154                         else\r
3155                                 sprintf(Tmp, MSGJPN184, Ver / 0x100, Ver % 0x100);\r
3156                         SendDlgItemMessage(hDlg, ABOUT_JRE, WM_SETTEXT, 0, (LPARAM)Tmp);\r
3157                         SendDlgItemMessage(hDlg, ABOUT_URL, EM_LIMITTEXT, 256, 0);\r
3158                         SendDlgItemMessage(hDlg, ABOUT_URL, WM_SETTEXT, 0, (LPARAM)MSGJPN284);\r
3159                         return(TRUE);\r
3160 \r
3161                 case WM_COMMAND :\r
3162                         switch(GET_WM_COMMAND_ID(wParam, lParam))\r
3163                         {\r
3164                                 case IDOK :\r
3165                                 case IDCANCEL :\r
3166                                         EndDialog(hDlg, YES);\r
3167                                         break;\r
3168                         }\r
3169                         return(TRUE);\r
3170         }\r
3171     return(FALSE);\r
3172 }\r
3173 \r
3174 \r
3175 /*----- サウンドを鳴らす ------------------------------------------------------\r
3176 *\r
3177 *       Parameter\r
3178 *               Int num : サウンドの種類 (SND_xxx)\r
3179 *\r
3180 *       Return Value\r
3181 *               なし\r
3182 *----------------------------------------------------------------------------*/\r
3183 \r
3184 void SoundPlay(int Num)\r
3185 {\r
3186         if(Sound[Num].On == YES)\r
3187                 sndPlaySound(Sound[Num].Fname, SND_ASYNC | SND_NODEFAULT);\r
3188 \r
3189         return;\r
3190 }\r
3191 \r
3192 \r
3193 /*----- ヘルプファイルのパス名を返す ------------------------------------------\r
3194 *\r
3195 *       Parameter\r
3196 *               なし\r
3197 *\r
3198 *       Return Value\r
3199 *               char *パス名\r
3200 *----------------------------------------------------------------------------*/\r
3201 \r
3202 char *AskHelpFilePath(void)\r
3203 {\r
3204         return(HelpPath);\r
3205 }\r
3206 \r
3207 \r
3208 /*----- テンポラリファイルのパス名を返す --------------------------------------\r
3209 *\r
3210 *       Parameter\r
3211 *               なし\r
3212 *\r
3213 *       Return Value\r
3214 *               char *パス名\r
3215 *----------------------------------------------------------------------------*/\r
3216 \r
3217 char *AskTmpFilePath(void)\r
3218 {\r
3219         return(TmpPath);\r
3220 }\r
3221 \r
3222 \r
3223 /*----- INIファイルのパス名を返す ---------------------------------------------\r
3224 *\r
3225 *       Parameter\r
3226 *               なし\r
3227 *\r
3228 *       Return Value\r
3229 *               char *パス名\r
3230 *----------------------------------------------------------------------------*/\r
3231 \r
3232 char *AskIniFilePath(void)\r
3233 {\r
3234         return(IniPath);\r
3235 }\r
3236 \r
3237 /*----- INIファイルのみを使うかどうかを返す -----------------------------------\r
3238 *\r
3239 *       Parameter\r
3240 *               なし\r
3241 *\r
3242 *       Return Value\r
3243 *               int ステータス : YES/NO\r
3244 *----------------------------------------------------------------------------*/\r
3245 \r
3246 int AskForceIni(void)\r
3247 {\r
3248         return(ForceIni);\r
3249 }\r
3250 \r
3251 \r
3252 \r
3253 \r
3254 /*----- メッセージ処理 --------------------------------------------------------\r
3255 *\r
3256 *       Parameter\r
3257 *               なし\r
3258 *\r
3259 *       Return Value\r
3260 *               int 終了フラグ (YES=WM_CLOSEが来た/NO)\r
3261 *----------------------------------------------------------------------------*/\r
3262 \r
3263 int BackgrndMessageProc(void)\r
3264 {\r
3265     MSG Msg;\r
3266         int Ret;\r
3267 \r
3268         Ret = NO;\r
3269         while(PeekMessage(&Msg, NULL, 0, 0, PM_REMOVE))\r
3270         {\r
3271                 // マルチコアCPUの特定環境下でファイル通信中にクラッシュするバグ対策\r
3272 //              if(!HtmlHelp(NULL, NULL, HH_PRETRANSLATEMESSAGE, (DWORD)&Msg))\r
3273                 // 64ビット対応\r
3274 //              if(!IsMainThread() || !HtmlHelp(NULL, NULL, HH_PRETRANSLATEMESSAGE, (DWORD)&Msg))\r
3275                 if(!IsMainThread() || !HtmlHelp(NULL, NULL, HH_PRETRANSLATEMESSAGE, (DWORD_PTR)&Msg))\r
3276                 {\r
3277                         /* ディレクトリ名の表示コンボボックスでBSやRETが効くように */\r
3278                         /* コンボボックス内ではアクセラレータを無効にする */\r
3279                         if((Msg.hwnd == GetLocalHistEditHwnd()) ||\r
3280                            (Msg.hwnd == GetRemoteHistEditHwnd()) ||\r
3281                            ((hHelpWin != NULL) && (Msg.hwnd == hHelpWin)) ||\r
3282                            GetHideUI() == YES ||\r
3283                            (TranslateAccelerator(GetMainHwnd(), Accel, &Msg) == 0))\r
3284                         {\r
3285                                 if(Msg.message == WM_QUIT)\r
3286                                 {\r
3287                                         Ret = YES;\r
3288                                         PostQuitMessage(0);\r
3289                                         break;\r
3290                                 }\r
3291                                 TranslateMessage(&Msg);\r
3292                                 DispatchMessage(&Msg);\r
3293                         }\r
3294                 }\r
3295         }\r
3296         return(Ret);\r
3297 }\r
3298 \r
3299 \r
3300 /*----- 自動終了フラグをクリアする --------------------------------------------\r
3301 *\r
3302 *       Parameter\r
3303 *               なし\r
3304 *\r
3305 *       Return Value\r
3306 *               なし\r
3307 *----------------------------------------------------------------------------*/\r
3308 \r
3309 void ResetAutoExitFlg(void)\r
3310 {\r
3311         AutoExit = NO;\r
3312         return;\r
3313 }\r
3314 \r
3315 \r
3316 /*----- 自動終了フラグを返す --------------------------------------------------\r
3317 *\r
3318 *       Parameter\r
3319 *               なし\r
3320 *\r
3321 *       Return Value\r
3322 *               int フラグ (YES/NO)\r
3323 *----------------------------------------------------------------------------*/\r
3324 \r
3325 int AskAutoExit(void)\r
3326 {\r
3327         return(AutoExit);\r
3328 }\r
3329 \r
3330 /*----- ユーザにパスワードを入力させ,それを設定する -----------------------\r
3331 *\r
3332 *       Parameter\r
3333 *               なし\r
3334 *\r
3335 *       Return Value\r
3336 *               int : 0/ユーザキャンセル, 1/設定した, 2/デフォルト設定\r
3337 *----------------------------------------------------------------------------*/\r
3338 int EnterMasterPasswordAndSet( int Res, HWND hWnd )\r
3339 {\r
3340         char buf[MAX_PASSWORD_LEN + 1];\r
3341         // パスワードの入力欄を非表示\r
3342         // 非表示にしたため新しいパスワードを2回入力させる\r
3343         char buf1[MAX_PASSWORD_LEN + 1];\r
3344         char *p;\r
3345         int Flag;\r
3346 \r
3347         buf[0] = NUL;\r
3348         if( InputDialogBox(Res, hWnd, NULL, buf, MAX_PASSWORD_LEN + 1,\r
3349                 &Flag, IDH_HELP_TOPIC_0000064) == YES){\r
3350                 // パスワードの入力欄を非表示\r
3351                 if(Res == newmasterpasswd_dlg)\r
3352                 {\r
3353                         buf1[0] = NUL;\r
3354                         if( InputDialogBox(Res, hWnd, NULL, buf1, MAX_PASSWORD_LEN + 1,\r
3355                                 &Flag, IDH_HELP_TOPIC_0000064) != YES){\r
3356                                 return 0;\r
3357                         }\r
3358                         if(strcmp(buf, buf1) != 0)\r
3359                         {\r
3360                                 MessageBox(hWnd, MSGJPN325, "FFFTP", MB_OK | MB_ICONERROR);\r
3361                                 return 0;\r
3362                         }\r
3363                 }\r
3364                 /* 末尾の空白を削除 */\r
3365                 RemoveTailingSpaces(buf);\r
3366                 /* 先頭の空白を削除 */\r
3367                 for( p = buf; *p == ' '; p++ )\r
3368                         ;\r
3369                 \r
3370                 if( p[0] != NUL ){\r
3371                         SetMasterPassword( p );\r
3372                         return 1;\r
3373                 }\r
3374                 else {\r
3375                         /* 空の場合はデフォルト値を設定 */\r
3376                         SetMasterPassword( NULL );\r
3377                         return 2;\r
3378                 }\r
3379         }\r
3380         return 0;\r
3381 }\r
3382 \r
3383 // 暗号化通信対応\r
3384 BOOL __stdcall SSLTimeoutCallback(BOOL* pbAborted)\r
3385 {\r
3386         Sleep(1);\r
3387         if(BackgrndMessageProc() == YES)\r
3388                 return TRUE;\r
3389         if(*pbAborted == YES)\r
3390                 return TRUE;\r
3391         return FALSE;\r
3392 }\r
3393 \r
3394 BOOL __stdcall SSLConfirmCallback(BOOL* pbAborted, BOOL bVerified, LPCSTR Certificate, LPCSTR CommonName)\r
3395 {\r
3396         BOOL bResult;\r
3397         uint32 Hash[5];\r
3398         int i;\r
3399         char* pm0;\r
3400         bResult = FALSE;\r
3401         sha_memory((char*)Certificate, (uint32)(strlen(Certificate) * sizeof(char)), (uint32*)&Hash);\r
3402         // sha.cはビッグエンディアンのため\r
3403         for(i = 0; i < 5; i++)\r
3404                 Hash[i] = _byteswap_ulong(Hash[i]);\r
3405         i = 0;\r
3406         while(i < MAX_CERT_CACHE_HASH)\r
3407         {\r
3408                 if(memcmp(&CertificateCacheHash[i], &Hash, 20) == 0)\r
3409                 {\r
3410                         bResult = TRUE;\r
3411                         break;\r
3412                 }\r
3413                 i++;\r
3414         }\r
3415         if(!bResult)\r
3416         {\r
3417                 if(pm0 = AllocateStringM(strlen(Certificate) + 1024))\r
3418                 {\r
3419                         sprintf(pm0, MSGJPN326, IsHostNameMatched(AskHostAdrs(), CommonName) ? MSGJPN327 : MSGJPN328, bVerified ? MSGJPN327 : MSGJPN328, Certificate);\r
3420                         if(MessageBox(GetMainHwnd(), pm0, "FFFTP", MB_YESNO) == IDYES)\r
3421                         {\r
3422                                 for(i = MAX_CERT_CACHE_HASH - 1; i >= 1; i--)\r
3423                                         memcpy(&CertificateCacheHash[i], &CertificateCacheHash[i - 1], 20);\r
3424                                 memcpy(&CertificateCacheHash[0], &Hash, 20);\r
3425                                 bResult = TRUE;\r
3426                         }\r
3427                         FreeDuplicatedString(pm0);\r
3428                 }\r
3429         }\r
3430         if(!bResult)\r
3431                 *pbAborted = YES;\r
3432         return bResult;\r
3433 }\r
3434 \r
3435 BOOL LoadSSLRootCAFile()\r
3436 {\r
3437         BOOL bResult;\r
3438         HANDLE hFile;\r
3439         DWORD Size;\r
3440         BYTE* pBuffer;\r
3441         uint32 Hash[5];\r
3442         int i;\r
3443         bResult = FALSE;\r
3444         if((hFile = CreateFile(SSLRootCAFilePath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL)) != INVALID_HANDLE_VALUE)\r
3445         {\r
3446                 Size = GetFileSize(hFile, NULL);\r
3447                 if(pBuffer = (BYTE*)malloc(Size))\r
3448                 {\r
3449                         if(ReadFile(hFile, pBuffer, Size, &Size, NULL))\r
3450                         {\r
3451                                 sha_memory((char*)pBuffer, (uint32)Size, (uint32*)&Hash);\r
3452                                 // sha.cはビッグエンディアンのため\r
3453                                 for(i = 0; i < 5; i++)\r
3454                                         Hash[i] = _byteswap_ulong(Hash[i]);\r
3455                                 // 同梱する"ssl.pem"に合わせてSHA1ハッシュ値を変更すること\r
3456                                 if(memcmp(&Hash, &SSLRootCAFileHash, 20) == 0 || memcmp(&Hash, "\xC8\xF6\x0B\x07\x10\x42\x55\xE7\x57\x7F\xE9\x52\xE0\x3F\xA8\xE4\x08\x2B\xB0\xE2", 20) == 0\r
3457                                         || DialogBox(GetFtpInst(), MAKEINTRESOURCE(updatesslroot_dlg), GetMainHwnd(), ExeEscDialogProc) == YES)\r
3458                                 {\r
3459                                         memcpy(&SSLRootCAFileHash, &Hash, 20);\r
3460                                         if(SetSSLRootCertificate(pBuffer, Size))\r
3461                                                 bResult = TRUE;\r
3462                                 }\r
3463                         }\r
3464                         free(pBuffer);\r
3465                 }\r
3466                 CloseHandle(hFile);\r
3467         }\r
3468         return bResult;\r
3469 }\r
3470 \r
3471 // マルチコアCPUの特定環境下でファイル通信中にクラッシュするバグ対策\r
3472 BOOL IsMainThread()\r
3473 {\r
3474         if(GetCurrentThreadId() != MainThreadId)\r
3475                 return FALSE;\r
3476         return TRUE;\r
3477 }\r
3478 \r
3479 // ポータブル版判定\r
3480 void CheckPortableVersion()\r
3481 {\r
3482         HANDLE hFile;\r
3483         if((hFile = CreateFile(PortableFilePath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL)) != INVALID_HANDLE_VALUE)\r
3484         {\r
3485                 PortableVersion = YES;\r
3486                 CloseHandle(hFile);\r
3487         }\r
3488         else\r
3489                 PortableVersion = NO;\r
3490 }\r
3491 \r
3492 int AskPortableVersion(void)\r
3493 {\r
3494         return(PortableVersion);\r
3495 }\r
3496 \r
3497 // 全設定暗号化対応\r
3498 int Restart()\r
3499 {\r
3500         int Sts;\r
3501         char* CommandLine;\r
3502         STARTUPINFO si;\r
3503         PROCESS_INFORMATION pi;\r
3504         Sts = FFFTP_FAIL;\r
3505         if(CommandLine = (char*)malloc(sizeof(char) * (strlen(GetCommandLine())  + 1)))\r
3506         {\r
3507                 strcpy(CommandLine, GetCommandLine());\r
3508                 GetStartupInfo(&si);\r
3509                 if(CreateProcess(NULL, CommandLine, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))\r
3510                 {\r
3511                         CloseHandle(pi.hThread);\r
3512                         CloseHandle(pi.hProcess);\r
3513                         Sts = FFFTP_SUCCESS;\r
3514                 }\r
3515                 free(CommandLine);\r
3516         }\r
3517         return Sts;\r
3518 }\r
3519 \r
3520 void RestartAndTerminate()\r
3521 {\r
3522         Restart();\r
3523         exit(1);\r
3524 }\r
3525 \r
3526 // タスクバー進捗表示\r
3527 int LoadTaskbarList3()\r
3528 {\r
3529         int Sts;\r
3530         Sts = FFFTP_FAIL;\r
3531         if(CoCreateInstance(&CLSID_TaskbarList, NULL, CLSCTX_ALL, &IID_ITaskbarList3, (void**)&pTaskbarList3) == S_OK)\r
3532         {\r
3533                 Sts = FFFTP_SUCCESS;\r
3534         }\r
3535         return Sts;\r
3536 }\r
3537 \r
3538 void FreeTaskbarList3()\r
3539 {\r
3540         if(pTaskbarList3 != NULL)\r
3541                 pTaskbarList3->lpVtbl->Release(pTaskbarList3);\r
3542         pTaskbarList3 = NULL;\r
3543 }\r
3544 \r
3545 int IsTaskbarList3Loaded()\r
3546 {\r
3547         int Sts;\r
3548         Sts = NO;\r
3549         if(pTaskbarList3 != NULL)\r
3550                 Sts = YES;\r
3551         return Sts;\r
3552 }\r
3553 \r
3554 void UpdateTaskbarProgress()\r
3555 {\r
3556         if(AskTransferSizeTotal() > 0)\r
3557         {\r
3558                 if(AskTransferErrorDisplay() > 0)\r
3559                         pTaskbarList3->lpVtbl->SetProgressState(pTaskbarList3, GetMainHwnd(), TBPF_ERROR);\r
3560                 else\r
3561                         pTaskbarList3->lpVtbl->SetProgressState(pTaskbarList3, GetMainHwnd(), TBPF_NORMAL);\r
3562                 pTaskbarList3->lpVtbl->SetProgressValue(pTaskbarList3, GetMainHwnd(), (ULONGLONG)(AskTransferSizeTotal() - AskTransferSizeLeft()), (ULONGLONG)AskTransferSizeTotal());\r
3563         }\r
3564         else\r
3565                 pTaskbarList3->lpVtbl->SetProgressState(pTaskbarList3, GetMainHwnd(), TBPF_NOPROGRESS);\r
3566 }\r
3567 \r
3568 // 高DPI対応\r
3569 int AskToolWinHeight(void)\r
3570 {\r
3571         return(ToolWinHeight);\r
3572 }\r
3573 \r