1 /*=============================================================================
\r
5 ===============================================================================
\r
6 / Copyright (C) 1997-2007 Sota. All rights reserved.
\r
8 / Redistribution and use in source and binary forms, with or without
\r
9 / modification, are permitted provided that the following conditions
\r
12 / 1. Redistributions of source code must retain the above copyright
\r
13 / notice, this list of conditions and the following disclaimer.
\r
14 / 2. Redistributions in binary form must reproduce the above copyright
\r
15 / notice, this list of conditions and the following disclaimer in the
\r
16 / documentation and/or other materials provided with the distribution.
\r
18 / THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
\r
19 / IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
\r
20 / OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
\r
21 / IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
\r
22 / INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
\r
23 / BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
\r
24 / USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
\r
25 / ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
\r
26 / (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
\r
27 / THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
\r
28 /============================================================================*/
\r
31 //#define WINVER 0x400
\r
35 #include <winsock2.h>
\r
36 #include <windows.h>
\r
40 #include <mbstring.h>
\r
42 #include <windowsx.h>
\r
43 #include <commctrl.h>
\r
46 #include "resource.h"
\r
48 #include <htmlhelp.h>
\r
52 #undef __MBSWRAPPER_H__
\r
53 #include "mbswrapper.h"
\r
56 /*===== プロトタイプ =====*/
\r
58 static int AddBookMark(char *Path);
\r
59 static int GetBothPath(char *Str, char **Path1, char **Path2);
\r
60 static BOOL CALLBACK EditBookMarkProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
\r
61 static BOOL CALLBACK BookMarkEditCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);
\r
63 /*===== 外部参照 =====*/
\r
65 extern HWND hHelpWin;
\r
68 extern HFONT ListFont; /* リストボックスのフォント */
\r
69 extern SIZE BmarkDlgSize;
\r
73 /*----- ブックマークをクリアする ----------------------------------------------
\r
80 *----------------------------------------------------------------------------*/
\r
82 void ClearBookMark(void)
\r
86 hMenu = GetSubMenu(GetMenu(GetMainHwnd()), BMARK_SUB_MENU);
\r
87 while(GetMenuItemCount(hMenu) > DEFAULT_BMARK_ITEM)
\r
88 DeleteMenu(hMenu, DEFAULT_BMARK_ITEM, MF_BYPOSITION);
\r
93 /*----- カレントディレクトリをブックマークに追加 ------------------------------
\r
96 * int Win : ウインドウ番号 (WIN_xxx)
\r
100 *----------------------------------------------------------------------------*/
\r
102 void AddCurDirToBookMark(int Win)
\r
104 char Buf[BMARK_MARK_LEN + FMAX_PATH * 2 + BMARK_SEP_LEN + 1];
\r
106 if(Win == WIN_LOCAL)
\r
108 strcpy(Buf, BMARK_MARK_LOCAL);
\r
109 AskLocalCurDir(Buf + BMARK_MARK_LEN, FMAX_PATH);
\r
111 else if(Win == WIN_REMOTE)
\r
113 strcpy(Buf, BMARK_MARK_REMOTE);
\r
114 AskRemoteCurDir(Buf + BMARK_MARK_LEN, FMAX_PATH);
\r
118 strcpy(Buf, BMARK_MARK_BOTH);
\r
119 AskLocalCurDir(Buf + BMARK_MARK_LEN, FMAX_PATH);
\r
120 strcat(Buf, BMARK_SEP);
\r
121 AskRemoteCurDir(Buf + strlen(Buf), FMAX_PATH);
\r
128 /*----- ブックマークにパスを登録する ------------------------------------------
\r
135 * FFFTP_SUCCESS/FFFTP_FAIL
\r
136 *----------------------------------------------------------------------------*/
\r
138 static int AddBookMark(char *Path)
\r
145 hMenu = GetSubMenu(GetMenu(GetMainHwnd()), BMARK_SUB_MENU);
\r
146 MarkID = (GetMenuItemCount(hMenu) - DEFAULT_BMARK_ITEM) + MENU_BMARK_TOP;
\r
147 if(AppendMenu(hMenu, MF_STRING, MarkID, Path) == TRUE)
\r
148 Sts = FFFTP_SUCCESS;
\r
153 /*----- 指定のIDを持つブックマークのパスを返す --------------------------------
\r
157 * char *Local : ローカル側のパスを返すバッファ
\r
158 * char *Remote : リモート側のパスを返すバッファ
\r
159 * int Max : バッファのサイズ
\r
162 * int ステータス (BMARK_TYPE_xxx)
\r
163 *----------------------------------------------------------------------------*/
\r
165 int AskBookMarkText(int MarkID, char *Local, char *Remote, int Max)
\r
168 MENUITEMINFO mInfo;
\r
170 char Tmp[BMARK_MARK_LEN + FMAX_PATH * 2 + BMARK_SEP_LEN + 1];
\r
175 memset(Local, NUL, Max);
\r
176 memset(Remote, NUL, Max);
\r
178 Sts = BMARK_TYPE_NONE;
\r
179 hMenu = GetSubMenu(GetMenu(GetMainHwnd()), BMARK_SUB_MENU);
\r
181 mInfo.cbSize = sizeof(MENUITEMINFO);
\r
182 mInfo.fMask = MIIM_TYPE;
\r
183 mInfo.dwTypeData = Tmp;
\r
184 mInfo.cch = BMARK_MARK_LEN + FMAX_PATH * 2 + BMARK_SEP_LEN;
\r
185 if(GetMenuItemInfo(hMenu, MarkID, FALSE, &mInfo) == TRUE)
\r
187 Num = GetBothPath(Tmp, &Path1, &Path2);
\r
188 if(strncmp(Tmp, BMARK_MARK_LOCAL, BMARK_MARK_LEN) == 0)
\r
190 Sts = BMARK_TYPE_LOCAL;
\r
191 strncpy(Local, Path1, Max-1);
\r
193 else if(strncmp(Tmp, BMARK_MARK_REMOTE, BMARK_MARK_LEN) == 0)
\r
195 Sts = BMARK_TYPE_REMOTE;
\r
196 strncpy(Remote, Path1, Max-1);
\r
198 else if(strncmp(Tmp, BMARK_MARK_BOTH, BMARK_MARK_LEN) == 0)
\r
202 strncpy(Local, Path1, Max-1);
\r
203 strncpy(Remote, Path2, Max-1);
\r
204 Sts = BMARK_TYPE_BOTH;
\r
212 /*----- ブックマークの文字列から2つのパスを取り出す --------------------------
\r
216 * char **Local : ローカル側のパスの先頭を返すワーク
\r
217 * char **Remote : リモート側のパスの先頭を返すワーク
\r
220 * int パスの個数 (1 or 2)
\r
224 *----------------------------------------------------------------------------*/
\r
226 static int GetBothPath(char *Str, char **Path1, char **Path2)
\r
232 *Path1 = Str + BMARK_MARK_LEN;
\r
234 Pos = _mbsstr(Str, BMARK_SEP);
\r
239 *Path2 = Pos + BMARK_SEP_LEN;
\r
245 /*----- ブックマークを接続中のホストリストに保存する --------------------------
\r
252 *----------------------------------------------------------------------------*/
\r
254 void SaveBookMark(void)
\r
257 MENUITEMINFO mInfo;
\r
263 char Tmp[BMARK_MARK_LEN + FMAX_PATH * 2 + BMARK_SEP_LEN + 1];
\r
266 if(AskConnecting() == YES)
\r
268 if((CurHost = AskCurrentHost()) != HOSTNUM_NOENTRY)
\r
270 if((Buf = malloc(BOOKMARK_SIZE)) != NULL)
\r
272 hMenu = GetSubMenu(GetMenu(GetMainHwnd()), BMARK_SUB_MENU);
\r
276 Cnt = GetMenuItemCount(hMenu);
\r
277 for(i = DEFAULT_BMARK_ITEM; i < Cnt; i++)
\r
279 mInfo.cbSize = sizeof(MENUITEMINFO);
\r
280 mInfo.fMask = MIIM_TYPE;
\r
281 mInfo.dwTypeData = Tmp;
\r
282 mInfo.cch = FMAX_PATH;
\r
283 if(GetMenuItemInfo(hMenu, i, TRUE, &mInfo) == TRUE)
\r
285 if(Len + strlen(Tmp) + 2 <= BOOKMARK_SIZE)
\r
288 Pos += strlen(Tmp) + 1;
\r
289 Len += strlen(Tmp) + 1;
\r
296 memset(Buf, NUL, 2);
\r
305 SetHostBookMark(CurHost, Buf, Len);
\r
315 /*----- ホストリストからブックマークを読み込む --------------------------------
\r
322 *----------------------------------------------------------------------------*/
\r
324 void LoadBookMark(void)
\r
329 char Tmp[FMAX_PATH + BMARK_MARK_LEN + 1];
\r
331 if(AskConnecting() == YES)
\r
333 if((CurHost = AskCurrentHost()) != HOSTNUM_NOENTRY)
\r
335 if((Buf = AskHostBookMark(CurHost)) != NULL)
\r
341 /* 旧フォーマットのための処理 */
\r
342 /* (パスに"L"や"H"がついてない物) */
\r
343 if((strncmp(Pos, BMARK_MARK_LOCAL, BMARK_MARK_LEN) != 0) &&
\r
344 (strncmp(Pos, BMARK_MARK_REMOTE, BMARK_MARK_LEN) != 0) &&
\r
345 (strncmp(Pos, BMARK_MARK_BOTH, BMARK_MARK_LEN) != 0))
\r
347 strcpy(Tmp, BMARK_MARK_REMOTE);
\r
354 Pos += strlen(Pos) + 1;
\r
363 /*----- ブックマーク編集ウインドウ --------------------------------------------
\r
369 * ステータス (YES=実行/NO=取消)
\r
370 *----------------------------------------------------------------------------*/
\r
372 int EditBookMark(void)
\r
376 Sts = DialogBox(GetFtpInst(), MAKEINTRESOURCE(bmark_dlg), GetMainHwnd(), EditBookMarkProc);
\r
381 /*----- ブックマーク編集ウインドウのコールバック ------------------------------
\r
384 * HWND hDlg : ウインドウハンドル
\r
385 * UINT message : メッセージ番号
\r
386 * WPARAM wParam : メッセージの WPARAM 引数
\r
387 * LPARAM lParam : メッセージの LPARAM 引数
\r
391 *----------------------------------------------------------------------------*/
\r
393 static BOOL CALLBACK EditBookMarkProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
\r
396 MENUITEMINFO mInfo;
\r
399 char Tmp[BMARK_MARK_LEN + FMAX_PATH * 2 + BMARK_SEP_LEN + 1];
\r
401 static DIALOGSIZE DlgSize = {
\r
402 { BMARK_NEW, BMARK_SET, BMARK_DEL, BMARK_DOWN, BMARK_UP, IDHELP, BMARK_SIZEGRIP, -1 },
\r
403 { IDOK, BMARK_JUMP, BMARK_SIZEGRIP, -1 },
\r
404 { BMARK_LIST, -1 },
\r
411 case WM_INITDIALOG :
\r
412 if(ListFont != NULL)
\r
413 SendDlgItemMessage(hDlg, BMARK_LIST, WM_SETFONT, (WPARAM)ListFont, MAKELPARAM(TRUE, 0));
\r
415 hMenu = GetSubMenu(GetMenu(GetMainHwnd()), BMARK_SUB_MENU);
\r
416 Max = GetMenuItemCount(hMenu);
\r
417 for(Cur = DEFAULT_BMARK_ITEM; Cur < Max; Cur++)
\r
419 mInfo.cbSize = sizeof(MENUITEMINFO);
\r
420 mInfo.fMask = MIIM_TYPE;
\r
421 mInfo.dwTypeData = Tmp;
\r
422 mInfo.cch = FMAX_PATH;
\r
423 if(GetMenuItemInfo(hMenu, Cur, TRUE, &mInfo) == TRUE)
\r
424 SendDlgItemMessage(hDlg, BMARK_LIST, LB_ADDSTRING, 0, (LPARAM)Tmp);
\r
426 DlgSizeInit(hDlg, &DlgSize, &BmarkDlgSize);
\r
430 switch(GET_WM_COMMAND_ID(wParam, lParam))
\r
433 if((Cur = SendDlgItemMessage(hDlg, BMARK_LIST, LB_GETCURSEL, 0, 0)) != LB_ERR)
\r
434 PostMessage(GetMainHwnd(), WM_COMMAND, MAKEWPARAM(Cur+MENU_BMARK_TOP, 0), 0);
\r
435 /* ここに break はない */
\r
440 Max = SendDlgItemMessage(hDlg, BMARK_LIST, LB_GETCOUNT, 0, 0);
\r
441 for(Cur = 0; Cur < Max; Cur++)
\r
443 SendDlgItemMessage(hDlg, BMARK_LIST, LB_GETTEXT, Cur, (LPARAM)Tmp);
\r
446 AskDlgSize(hDlg, &DlgSize, &BmarkDlgSize);
\r
447 EndDialog(hDlg, YES);
\r
451 if((Cur = SendDlgItemMessage(hDlg, BMARK_LIST, LB_GETCURSEL, 0, 0)) != LB_ERR)
\r
453 SendDlgItemMessage(hDlg, BMARK_LIST, LB_GETTEXT, Cur, (LPARAM)Tmp);
\r
454 if(DialogBoxParam(GetFtpInst(), MAKEINTRESOURCE(bmark_edit_dlg), hDlg, BookMarkEditCallBack, (LPARAM)Tmp) == YES)
\r
456 SendDlgItemMessage(hDlg, BMARK_LIST, LB_DELETESTRING, Cur, 0);
\r
457 SendDlgItemMessage(hDlg, BMARK_LIST, LB_INSERTSTRING, Cur, (LPARAM)Tmp);
\r
458 SendDlgItemMessage(hDlg, BMARK_LIST, LB_SETCURSEL, Cur, 0);
\r
465 if(DialogBoxParam(GetFtpInst(), MAKEINTRESOURCE(bmark_edit_dlg), hDlg, BookMarkEditCallBack, (LPARAM)Tmp) == YES)
\r
467 SendDlgItemMessage(hDlg, BMARK_LIST, LB_ADDSTRING, 0, (LPARAM)Tmp);
\r
468 Cur = SendDlgItemMessage(hDlg, BMARK_LIST, LB_GETCOUNT, 0, 0) - 1;
\r
469 SendDlgItemMessage(hDlg, BMARK_LIST, LB_SETCURSEL, Cur, 0);
\r
474 if((Cur = SendDlgItemMessage(hDlg, BMARK_LIST, LB_GETCURSEL, 0, 0)) != LB_ERR)
\r
476 SendDlgItemMessage(hDlg, BMARK_LIST, LB_DELETESTRING, Cur, 0);
\r
477 if(Cur >= SendDlgItemMessage(hDlg, BMARK_LIST, LB_GETCOUNT, 0, 0))
\r
478 Cur = max1(0, SendDlgItemMessage(hDlg, BMARK_LIST, LB_GETCOUNT, 0, 0)-1);
\r
479 if(SendDlgItemMessage(hDlg, BMARK_LIST, LB_GETCOUNT, 0, 0) > 0)
\r
480 SendDlgItemMessage(hDlg, BMARK_LIST, LB_SETCURSEL, Cur, 0);
\r
485 if((Cur = SendDlgItemMessage(hDlg, BMARK_LIST, LB_GETCURSEL, 0, 0)) != LB_ERR)
\r
489 SendDlgItemMessage(hDlg, BMARK_LIST, LB_GETTEXT, Cur, (LPARAM)Tmp);
\r
490 SendDlgItemMessage(hDlg, BMARK_LIST, LB_DELETESTRING, Cur, 0);
\r
491 SendDlgItemMessage(hDlg, BMARK_LIST, LB_INSERTSTRING, --Cur, (LPARAM)Tmp);
\r
492 SendDlgItemMessage(hDlg, BMARK_LIST, LB_SETCURSEL, Cur, 0);
\r
498 if((Cur = SendDlgItemMessage(hDlg, BMARK_LIST, LB_GETCURSEL, 0, 0)) != LB_ERR)
\r
500 if(Cur < SendDlgItemMessage(hDlg, BMARK_LIST, LB_GETCOUNT, 0, 0)-1)
\r
502 SendDlgItemMessage(hDlg, BMARK_LIST, LB_GETTEXT, Cur, (LPARAM)Tmp);
\r
503 SendDlgItemMessage(hDlg, BMARK_LIST, LB_DELETESTRING, Cur, 0);
\r
504 SendDlgItemMessage(hDlg, BMARK_LIST, LB_INSERTSTRING, ++Cur, (LPARAM)Tmp);
\r
505 SendDlgItemMessage(hDlg, BMARK_LIST, LB_SETCURSEL, Cur, 0);
\r
511 hHelpWin = HtmlHelp(NULL, AskHelpFilePath(), HH_HELP_CONTEXT, IDH_HELP_TOPIC_0000019);
\r
517 DlgSizeChange(hDlg, &DlgSize, (RECT *)lParam, (int)wParam);
\r
525 /*----- ブックマーク入力ダイアログのコールバック ------------------------------
\r
528 * HWND hDlg : ウインドウハンドル
\r
529 * UINT message : メッセージ番号
\r
530 * WPARAM wParam : メッセージの WPARAM 引数
\r
531 * LPARAM lParam : メッセージの LPARAM 引数
\r
535 *----------------------------------------------------------------------------*/
\r
537 static BOOL CALLBACK BookMarkEditCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam)
\r
542 char Local[FMAX_PATH+1];
\r
543 char Remote[FMAX_PATH+1];
\r
548 case WM_INITDIALOG :
\r
549 Str = (char *)lParam;
\r
550 SendDlgItemMessage(hDlg, BEDIT_LOCAL, EM_LIMITTEXT, FMAX_PATH-1, 0);
\r
551 SendDlgItemMessage(hDlg, BEDIT_REMOTE, EM_LIMITTEXT, FMAX_PATH-1, 0);
\r
552 if(strlen(Str) > BMARK_MARK_LEN)
\r
554 Num = GetBothPath(Str, &Path1, &Path2);
\r
555 if(strncmp(Str, BMARK_MARK_LOCAL, BMARK_MARK_LEN) == 0)
\r
556 SendDlgItemMessage(hDlg, BEDIT_LOCAL, WM_SETTEXT, 0, (LPARAM)Path1);
\r
557 else if(strncmp(Str, BMARK_MARK_REMOTE, BMARK_MARK_LEN) == 0)
\r
559 SendDlgItemMessage(hDlg, BEDIT_REMOTE, WM_SETTEXT, 0, (LPARAM)Path1);
\r
560 /* ホスト側にカーソルを移動しておく */
\r
561 SetFocus(GetDlgItem(hDlg, BEDIT_REMOTE));
\r
562 SendDlgItemMessage(hDlg, BEDIT_REMOTE, EM_SETSEL, 0, -1);
\r
565 else if((strncmp(Str, BMARK_MARK_BOTH, BMARK_MARK_LEN) == 0) && (Num == 2))
\r
567 SendDlgItemMessage(hDlg, BEDIT_LOCAL, WM_SETTEXT, 0, (LPARAM)Path1);
\r
568 SendDlgItemMessage(hDlg, BEDIT_REMOTE, WM_SETTEXT, 0, (LPARAM)Path2);
\r
574 switch(GET_WM_COMMAND_ID(wParam, lParam))
\r
577 SendDlgItemMessage(hDlg, BEDIT_LOCAL, WM_GETTEXT, FMAX_PATH+1, (LPARAM)Local);
\r
578 SendDlgItemMessage(hDlg, BEDIT_REMOTE, WM_GETTEXT, FMAX_PATH+1, (LPARAM)Remote);
\r
579 if(strlen(Local) > 0)
\r
581 if(strlen(Remote) > 0)
\r
584 strcpy(Str, BMARK_MARK_BOTH);
\r
585 strcat(Str, Local);
\r
586 strcat(Str, BMARK_SEP);
\r
587 strcat(Str, Remote);
\r
592 strcpy(Str, BMARK_MARK_LOCAL);
\r
593 strcat(Str, Local);
\r
595 EndDialog(hDlg, YES);
\r
597 else if(strlen(Remote) > 0)
\r
600 strcpy(Str, BMARK_MARK_REMOTE);
\r
601 strcat(Str, Remote);
\r
602 EndDialog(hDlg, YES);
\r
605 EndDialog(hDlg, NO);
\r
609 EndDialog(hDlg, NO);
\r