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
61 //static BOOL CALLBACK EditBookMarkProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
\r
62 //static BOOL CALLBACK BookMarkEditCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);
\r
63 static INT_PTR CALLBACK EditBookMarkProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
\r
64 static INT_PTR CALLBACK BookMarkEditCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);
\r
66 /*===== 外部参照 =====*/
\r
68 extern HWND hHelpWin;
\r
71 extern HFONT ListFont; /* リストボックスのフォント */
\r
72 extern SIZE BmarkDlgSize;
\r
76 /*----- ブックマークをクリアする ----------------------------------------------
\r
83 *----------------------------------------------------------------------------*/
\r
85 void ClearBookMark(void)
\r
89 hMenu = GetSubMenu(GetMenu(GetMainHwnd()), BMARK_SUB_MENU);
\r
90 while(GetMenuItemCount(hMenu) > DEFAULT_BMARK_ITEM)
\r
91 DeleteMenu(hMenu, DEFAULT_BMARK_ITEM, MF_BYPOSITION);
\r
96 /*----- カレントディレクトリをブックマークに追加 ------------------------------
\r
99 * int Win : ウインドウ番号 (WIN_xxx)
\r
103 *----------------------------------------------------------------------------*/
\r
105 void AddCurDirToBookMark(int Win)
\r
107 char Buf[BMARK_MARK_LEN + FMAX_PATH * 2 + BMARK_SEP_LEN + 1];
\r
109 if(Win == WIN_LOCAL)
\r
111 strcpy(Buf, BMARK_MARK_LOCAL);
\r
112 AskLocalCurDir(Buf + BMARK_MARK_LEN, FMAX_PATH);
\r
114 else if(Win == WIN_REMOTE)
\r
116 strcpy(Buf, BMARK_MARK_REMOTE);
\r
117 AskRemoteCurDir(Buf + BMARK_MARK_LEN, FMAX_PATH);
\r
121 strcpy(Buf, BMARK_MARK_BOTH);
\r
122 AskLocalCurDir(Buf + BMARK_MARK_LEN, FMAX_PATH);
\r
123 strcat(Buf, BMARK_SEP);
\r
124 AskRemoteCurDir(Buf + strlen(Buf), FMAX_PATH);
\r
131 /*----- ブックマークにパスを登録する ------------------------------------------
\r
138 * FFFTP_SUCCESS/FFFTP_FAIL
\r
139 *----------------------------------------------------------------------------*/
\r
141 static int AddBookMark(char *Path)
\r
148 hMenu = GetSubMenu(GetMenu(GetMainHwnd()), BMARK_SUB_MENU);
\r
149 MarkID = (GetMenuItemCount(hMenu) - DEFAULT_BMARK_ITEM) + MENU_BMARK_TOP;
\r
150 if(AppendMenu(hMenu, MF_STRING, MarkID, Path) == TRUE)
\r
151 Sts = FFFTP_SUCCESS;
\r
156 /*----- 指定のIDを持つブックマークのパスを返す --------------------------------
\r
160 * char *Local : ローカル側のパスを返すバッファ
\r
161 * char *Remote : リモート側のパスを返すバッファ
\r
162 * int Max : バッファのサイズ
\r
165 * int ステータス (BMARK_TYPE_xxx)
\r
166 *----------------------------------------------------------------------------*/
\r
168 int AskBookMarkText(int MarkID, char *Local, char *Remote, int Max)
\r
171 MENUITEMINFO mInfo;
\r
173 char Tmp[BMARK_MARK_LEN + FMAX_PATH * 2 + BMARK_SEP_LEN + 1];
\r
178 memset(Local, NUL, Max);
\r
179 memset(Remote, NUL, Max);
\r
181 Sts = BMARK_TYPE_NONE;
\r
182 hMenu = GetSubMenu(GetMenu(GetMainHwnd()), BMARK_SUB_MENU);
\r
184 mInfo.cbSize = sizeof(MENUITEMINFO);
\r
185 mInfo.fMask = MIIM_TYPE;
\r
186 mInfo.dwTypeData = Tmp;
\r
187 mInfo.cch = BMARK_MARK_LEN + FMAX_PATH * 2 + BMARK_SEP_LEN;
\r
188 if(GetMenuItemInfo(hMenu, MarkID, FALSE, &mInfo) == TRUE)
\r
190 Num = GetBothPath(Tmp, &Path1, &Path2);
\r
191 if(strncmp(Tmp, BMARK_MARK_LOCAL, BMARK_MARK_LEN) == 0)
\r
193 Sts = BMARK_TYPE_LOCAL;
\r
194 strncpy(Local, Path1, Max-1);
\r
196 else if(strncmp(Tmp, BMARK_MARK_REMOTE, BMARK_MARK_LEN) == 0)
\r
198 Sts = BMARK_TYPE_REMOTE;
\r
199 strncpy(Remote, Path1, Max-1);
\r
201 else if(strncmp(Tmp, BMARK_MARK_BOTH, BMARK_MARK_LEN) == 0)
\r
205 strncpy(Local, Path1, Max-1);
\r
206 strncpy(Remote, Path2, Max-1);
\r
207 Sts = BMARK_TYPE_BOTH;
\r
215 /*----- ブックマークの文字列から2つのパスを取り出す --------------------------
\r
219 * char **Local : ローカル側のパスの先頭を返すワーク
\r
220 * char **Remote : リモート側のパスの先頭を返すワーク
\r
223 * int パスの個数 (1 or 2)
\r
227 *----------------------------------------------------------------------------*/
\r
229 static int GetBothPath(char *Str, char **Path1, char **Path2)
\r
235 *Path1 = Str + BMARK_MARK_LEN;
\r
237 Pos = _mbsstr(Str, BMARK_SEP);
\r
242 *Path2 = Pos + BMARK_SEP_LEN;
\r
248 /*----- ブックマークを接続中のホストリストに保存する --------------------------
\r
255 *----------------------------------------------------------------------------*/
\r
257 void SaveBookMark(void)
\r
260 MENUITEMINFO mInfo;
\r
266 char Tmp[BMARK_MARK_LEN + FMAX_PATH * 2 + BMARK_SEP_LEN + 1];
\r
269 if(AskConnecting() == YES)
\r
271 if((CurHost = AskCurrentHost()) != HOSTNUM_NOENTRY)
\r
273 if((Buf = malloc(BOOKMARK_SIZE)) != NULL)
\r
275 hMenu = GetSubMenu(GetMenu(GetMainHwnd()), BMARK_SUB_MENU);
\r
279 Cnt = GetMenuItemCount(hMenu);
\r
280 for(i = DEFAULT_BMARK_ITEM; i < Cnt; i++)
\r
282 mInfo.cbSize = sizeof(MENUITEMINFO);
\r
283 mInfo.fMask = MIIM_TYPE;
\r
284 mInfo.dwTypeData = Tmp;
\r
285 mInfo.cch = FMAX_PATH;
\r
286 if(GetMenuItemInfo(hMenu, i, TRUE, &mInfo) == TRUE)
\r
288 if(Len + strlen(Tmp) + 2 <= BOOKMARK_SIZE)
\r
291 Pos += strlen(Tmp) + 1;
\r
292 Len += strlen(Tmp) + 1;
\r
299 memset(Buf, NUL, 2);
\r
308 SetHostBookMark(CurHost, Buf, Len);
\r
318 /*----- ホストリストからブックマークを読み込む --------------------------------
\r
325 *----------------------------------------------------------------------------*/
\r
327 void LoadBookMark(void)
\r
332 char Tmp[FMAX_PATH + BMARK_MARK_LEN + 1];
\r
334 if(AskConnecting() == YES)
\r
336 if((CurHost = AskCurrentHost()) != HOSTNUM_NOENTRY)
\r
338 if((Buf = AskHostBookMark(CurHost)) != NULL)
\r
344 /* 旧フォーマットのための処理 */
\r
345 /* (パスに"L"や"H"がついてない物) */
\r
346 if((strncmp(Pos, BMARK_MARK_LOCAL, BMARK_MARK_LEN) != 0) &&
\r
347 (strncmp(Pos, BMARK_MARK_REMOTE, BMARK_MARK_LEN) != 0) &&
\r
348 (strncmp(Pos, BMARK_MARK_BOTH, BMARK_MARK_LEN) != 0))
\r
350 strcpy(Tmp, BMARK_MARK_REMOTE);
\r
357 Pos += strlen(Pos) + 1;
\r
366 /*----- ブックマーク編集ウインドウ --------------------------------------------
\r
372 * ステータス (YES=実行/NO=取消)
\r
373 *----------------------------------------------------------------------------*/
\r
375 int EditBookMark(void)
\r
379 Sts = DialogBox(GetFtpInst(), MAKEINTRESOURCE(bmark_dlg), GetMainHwnd(), EditBookMarkProc);
\r
384 /*----- ブックマーク編集ウインドウのコールバック ------------------------------
\r
387 * HWND hDlg : ウインドウハンドル
\r
388 * UINT message : メッセージ番号
\r
389 * WPARAM wParam : メッセージの WPARAM 引数
\r
390 * LPARAM lParam : メッセージの LPARAM 引数
\r
394 *----------------------------------------------------------------------------*/
\r
397 //static BOOL CALLBACK EditBookMarkProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
\r
398 static INT_PTR CALLBACK EditBookMarkProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
\r
401 MENUITEMINFO mInfo;
\r
404 char Tmp[BMARK_MARK_LEN + FMAX_PATH * 2 + BMARK_SEP_LEN + 1];
\r
406 static DIALOGSIZE DlgSize = {
\r
407 { BMARK_NEW, BMARK_SET, BMARK_DEL, BMARK_DOWN, BMARK_UP, IDHELP, BMARK_SIZEGRIP, -1 },
\r
408 { IDOK, BMARK_JUMP, BMARK_SIZEGRIP, -1 },
\r
409 { BMARK_LIST, -1 },
\r
416 case WM_INITDIALOG :
\r
417 if(ListFont != NULL)
\r
418 SendDlgItemMessage(hDlg, BMARK_LIST, WM_SETFONT, (WPARAM)ListFont, MAKELPARAM(TRUE, 0));
\r
420 hMenu = GetSubMenu(GetMenu(GetMainHwnd()), BMARK_SUB_MENU);
\r
421 Max = GetMenuItemCount(hMenu);
\r
422 for(Cur = DEFAULT_BMARK_ITEM; Cur < Max; Cur++)
\r
424 mInfo.cbSize = sizeof(MENUITEMINFO);
\r
425 mInfo.fMask = MIIM_TYPE;
\r
426 mInfo.dwTypeData = Tmp;
\r
427 mInfo.cch = FMAX_PATH;
\r
428 if(GetMenuItemInfo(hMenu, Cur, TRUE, &mInfo) == TRUE)
\r
429 SendDlgItemMessage(hDlg, BMARK_LIST, LB_ADDSTRING, 0, (LPARAM)Tmp);
\r
431 DlgSizeInit(hDlg, &DlgSize, &BmarkDlgSize);
\r
435 switch(GET_WM_COMMAND_ID(wParam, lParam))
\r
438 if((Cur = SendDlgItemMessage(hDlg, BMARK_LIST, LB_GETCURSEL, 0, 0)) != LB_ERR)
\r
439 PostMessage(GetMainHwnd(), WM_COMMAND, MAKEWPARAM(Cur+MENU_BMARK_TOP, 0), 0);
\r
440 /* ここに break はない */
\r
445 Max = SendDlgItemMessage(hDlg, BMARK_LIST, LB_GETCOUNT, 0, 0);
\r
446 for(Cur = 0; Cur < Max; Cur++)
\r
448 SendDlgItemMessage(hDlg, BMARK_LIST, LB_GETTEXT, Cur, (LPARAM)Tmp);
\r
451 AskDlgSize(hDlg, &DlgSize, &BmarkDlgSize);
\r
452 EndDialog(hDlg, YES);
\r
456 if((Cur = SendDlgItemMessage(hDlg, BMARK_LIST, LB_GETCURSEL, 0, 0)) != LB_ERR)
\r
458 SendDlgItemMessage(hDlg, BMARK_LIST, LB_GETTEXT, Cur, (LPARAM)Tmp);
\r
459 if(DialogBoxParam(GetFtpInst(), MAKEINTRESOURCE(bmark_edit_dlg), hDlg, BookMarkEditCallBack, (LPARAM)Tmp) == YES)
\r
461 SendDlgItemMessage(hDlg, BMARK_LIST, LB_DELETESTRING, Cur, 0);
\r
462 SendDlgItemMessage(hDlg, BMARK_LIST, LB_INSERTSTRING, Cur, (LPARAM)Tmp);
\r
463 SendDlgItemMessage(hDlg, BMARK_LIST, LB_SETCURSEL, Cur, 0);
\r
470 if(DialogBoxParam(GetFtpInst(), MAKEINTRESOURCE(bmark_edit_dlg), hDlg, BookMarkEditCallBack, (LPARAM)Tmp) == YES)
\r
472 SendDlgItemMessage(hDlg, BMARK_LIST, LB_ADDSTRING, 0, (LPARAM)Tmp);
\r
473 Cur = SendDlgItemMessage(hDlg, BMARK_LIST, LB_GETCOUNT, 0, 0) - 1;
\r
474 SendDlgItemMessage(hDlg, BMARK_LIST, LB_SETCURSEL, Cur, 0);
\r
479 if((Cur = SendDlgItemMessage(hDlg, BMARK_LIST, LB_GETCURSEL, 0, 0)) != LB_ERR)
\r
481 SendDlgItemMessage(hDlg, BMARK_LIST, LB_DELETESTRING, Cur, 0);
\r
482 if(Cur >= SendDlgItemMessage(hDlg, BMARK_LIST, LB_GETCOUNT, 0, 0))
\r
483 Cur = max1(0, SendDlgItemMessage(hDlg, BMARK_LIST, LB_GETCOUNT, 0, 0)-1);
\r
484 if(SendDlgItemMessage(hDlg, BMARK_LIST, LB_GETCOUNT, 0, 0) > 0)
\r
485 SendDlgItemMessage(hDlg, BMARK_LIST, LB_SETCURSEL, Cur, 0);
\r
490 if((Cur = SendDlgItemMessage(hDlg, BMARK_LIST, LB_GETCURSEL, 0, 0)) != LB_ERR)
\r
494 SendDlgItemMessage(hDlg, BMARK_LIST, LB_GETTEXT, Cur, (LPARAM)Tmp);
\r
495 SendDlgItemMessage(hDlg, BMARK_LIST, LB_DELETESTRING, Cur, 0);
\r
496 SendDlgItemMessage(hDlg, BMARK_LIST, LB_INSERTSTRING, --Cur, (LPARAM)Tmp);
\r
497 SendDlgItemMessage(hDlg, BMARK_LIST, LB_SETCURSEL, Cur, 0);
\r
503 if((Cur = SendDlgItemMessage(hDlg, BMARK_LIST, LB_GETCURSEL, 0, 0)) != LB_ERR)
\r
505 if(Cur < SendDlgItemMessage(hDlg, BMARK_LIST, LB_GETCOUNT, 0, 0)-1)
\r
507 SendDlgItemMessage(hDlg, BMARK_LIST, LB_GETTEXT, Cur, (LPARAM)Tmp);
\r
508 SendDlgItemMessage(hDlg, BMARK_LIST, LB_DELETESTRING, Cur, 0);
\r
509 SendDlgItemMessage(hDlg, BMARK_LIST, LB_INSERTSTRING, ++Cur, (LPARAM)Tmp);
\r
510 SendDlgItemMessage(hDlg, BMARK_LIST, LB_SETCURSEL, Cur, 0);
\r
516 hHelpWin = HtmlHelp(NULL, AskHelpFilePath(), HH_HELP_CONTEXT, IDH_HELP_TOPIC_0000019);
\r
522 DlgSizeChange(hDlg, &DlgSize, (RECT *)lParam, (int)wParam);
\r
530 /*----- ブックマーク入力ダイアログのコールバック ------------------------------
\r
533 * HWND hDlg : ウインドウハンドル
\r
534 * UINT message : メッセージ番号
\r
535 * WPARAM wParam : メッセージの WPARAM 引数
\r
536 * LPARAM lParam : メッセージの LPARAM 引数
\r
540 *----------------------------------------------------------------------------*/
\r
543 //static BOOL CALLBACK BookMarkEditCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam)
\r
544 static INT_PTR CALLBACK BookMarkEditCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam)
\r
549 char Local[FMAX_PATH+1];
\r
550 char Remote[FMAX_PATH+1];
\r
555 case WM_INITDIALOG :
\r
556 Str = (char *)lParam;
\r
557 SendDlgItemMessage(hDlg, BEDIT_LOCAL, EM_LIMITTEXT, FMAX_PATH-1, 0);
\r
558 SendDlgItemMessage(hDlg, BEDIT_REMOTE, EM_LIMITTEXT, FMAX_PATH-1, 0);
\r
559 if(strlen(Str) > BMARK_MARK_LEN)
\r
561 Num = GetBothPath(Str, &Path1, &Path2);
\r
562 if(strncmp(Str, BMARK_MARK_LOCAL, BMARK_MARK_LEN) == 0)
\r
563 SendDlgItemMessage(hDlg, BEDIT_LOCAL, WM_SETTEXT, 0, (LPARAM)Path1);
\r
564 else if(strncmp(Str, BMARK_MARK_REMOTE, BMARK_MARK_LEN) == 0)
\r
566 SendDlgItemMessage(hDlg, BEDIT_REMOTE, WM_SETTEXT, 0, (LPARAM)Path1);
\r
567 /* ホスト側にカーソルを移動しておく */
\r
568 SetFocus(GetDlgItem(hDlg, BEDIT_REMOTE));
\r
569 SendDlgItemMessage(hDlg, BEDIT_REMOTE, EM_SETSEL, 0, -1);
\r
572 else if((strncmp(Str, BMARK_MARK_BOTH, BMARK_MARK_LEN) == 0) && (Num == 2))
\r
574 SendDlgItemMessage(hDlg, BEDIT_LOCAL, WM_SETTEXT, 0, (LPARAM)Path1);
\r
575 SendDlgItemMessage(hDlg, BEDIT_REMOTE, WM_SETTEXT, 0, (LPARAM)Path2);
\r
581 switch(GET_WM_COMMAND_ID(wParam, lParam))
\r
584 SendDlgItemMessage(hDlg, BEDIT_LOCAL, WM_GETTEXT, FMAX_PATH+1, (LPARAM)Local);
\r
585 SendDlgItemMessage(hDlg, BEDIT_REMOTE, WM_GETTEXT, FMAX_PATH+1, (LPARAM)Remote);
\r
586 if(strlen(Local) > 0)
\r
588 if(strlen(Remote) > 0)
\r
591 strcpy(Str, BMARK_MARK_BOTH);
\r
592 strcat(Str, Local);
\r
593 strcat(Str, BMARK_SEP);
\r
594 strcat(Str, Remote);
\r
599 strcpy(Str, BMARK_MARK_LOCAL);
\r
600 strcat(Str, Local);
\r
602 EndDialog(hDlg, YES);
\r
604 else if(strlen(Remote) > 0)
\r
607 strcpy(Str, BMARK_MARK_REMOTE);
\r
608 strcat(Str, Remote);
\r
609 EndDialog(hDlg, YES);
\r
612 EndDialog(hDlg, NO);
\r
616 EndDialog(hDlg, NO);
\r